Showing preview only (2,957K chars total). Download the full file or copy to clipboard to get everything.
Repository: longhorn/longhorn
Branch: master
Commit: a2502a52c86f
Files: 310
Total size: 2.8 MB
Directory structure:
gitextract_q7gmdmv5/
├── .codespellignore
├── .github/
│ ├── CODEOWNERS
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug.yaml
│ │ ├── ci.md
│ │ ├── config.yml
│ │ ├── doc.md
│ │ ├── epic.yaml
│ │ ├── feature.yaml
│ │ ├── fix-cve-issues-for-release.md
│ │ ├── hotfix.md
│ │ ├── improvement.yaml
│ │ ├── infra.md
│ │ ├── performance-benchmark.md
│ │ ├── refactor.md
│ │ ├── regular-tasks-for-feature-release.md
│ │ ├── release.md
│ │ ├── task.md
│ │ └── test.md
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── mergify.yml
│ └── workflows/
│ ├── add-issue-to-projects.yml
│ ├── auto-author-assign.yml
│ ├── backport-pr.yml
│ ├── check-sprint-last-day.py
│ ├── close-issue.yml
│ ├── codespell.yml
│ ├── conventional-commits.yml
│ ├── create-issue.yml
│ ├── create-release-task-issues.yml
│ ├── periodic-issue-sprint-update.yml
│ ├── pr-review-reminder.py
│ ├── pr-review-reminder.yml
│ ├── scan-and-notify-testing-items.py
│ ├── scan-and-notify-testing-items.yml
│ ├── scorecards.yml
│ ├── stale.yaml
│ ├── update-branch-image-tags.yaml
│ ├── update-community-issue.yml
│ ├── update-longhorn-issue.yml
│ ├── validate-yamls.yaml
│ └── wont-fix.yml
├── .gitignore
├── ADOPTERS.md
├── CHANGELOG/
│ ├── CHANGELOG-1.10.0.md
│ ├── CHANGELOG-1.10.1.md
│ ├── CHANGELOG-1.10.2.md
│ ├── CHANGELOG-1.11.0.md
│ ├── CHANGELOG-1.11.1.md
│ ├── CHANGELOG-1.4.0.md
│ ├── CHANGELOG-1.4.1.md
│ ├── CHANGELOG-1.4.2.md
│ ├── CHANGELOG-1.4.3.md
│ ├── CHANGELOG-1.5.0.md
│ ├── CHANGELOG-1.5.1.md
│ ├── CHANGELOG-1.5.2.md
│ ├── CHANGELOG-1.5.3.md
│ ├── CHANGELOG-1.5.4.md
│ ├── CHANGELOG-1.5.5.md
│ ├── CHANGELOG-1.6.0.md
│ ├── CHANGELOG-1.6.1.md
│ ├── CHANGELOG-1.6.2.md
│ ├── CHANGELOG-1.6.3.md
│ ├── CHANGELOG-1.6.4.md
│ ├── CHANGELOG-1.7.0.md
│ ├── CHANGELOG-1.7.1.md
│ ├── CHANGELOG-1.7.2.md
│ ├── CHANGELOG-1.7.3.md
│ ├── CHANGELOG-1.8.0.md
│ ├── CHANGELOG-1.8.1.md
│ ├── CHANGELOG-1.8.2.md
│ ├── CHANGELOG-1.9.0.md
│ ├── CHANGELOG-1.9.1.md
│ └── CHANGELOG-1.9.2.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── MAINTAINERS
├── README.md
├── SECURITY.md
├── chart/
│ ├── .helmignore
│ ├── Chart.yaml
│ ├── README.md
│ ├── README.md.gotmpl
│ ├── app-readme.md
│ ├── ocp-readme.md
│ ├── questions.yaml
│ ├── templates/
│ │ ├── NOTES.txt
│ │ ├── _helpers.tpl
│ │ ├── clusterrole.yaml
│ │ ├── clusterrolebinding.yaml
│ │ ├── crds.yaml
│ │ ├── daemonset-sa.yaml
│ │ ├── default-resource.yaml
│ │ ├── default-setting.yaml
│ │ ├── deployment-driver.yaml
│ │ ├── deployment-ui.yaml
│ │ ├── extra-objects.yaml
│ │ ├── httproute.yaml
│ │ ├── ingress.yaml
│ │ ├── network-policies/
│ │ │ ├── backing-image-data-source-network-policy.yaml
│ │ │ ├── backing-image-manager-network-policy.yaml
│ │ │ ├── instance-manager-networking.yaml
│ │ │ ├── manager-network-policy.yaml
│ │ │ ├── recovery-backend-network-policy.yaml
│ │ │ ├── ui-frontend-network-policy.yaml
│ │ │ └── webhook-network-policy.yaml
│ │ ├── postupgrade-job.yaml
│ │ ├── preupgrade-job.yaml
│ │ ├── priorityclass.yaml
│ │ ├── psp.yaml
│ │ ├── registry-secret.yaml
│ │ ├── role.yaml
│ │ ├── rolebinding.yaml
│ │ ├── serviceaccount.yaml
│ │ ├── servicemonitor.yaml
│ │ ├── services.yaml
│ │ ├── storageclass.yaml
│ │ ├── tls-secrets.yaml
│ │ ├── uninstall-job.yaml
│ │ └── validate-psp-install.yaml
│ └── values.yaml
├── deploy/
│ ├── backupstores/
│ │ ├── README.md
│ │ └── base/
│ │ ├── azurite/
│ │ │ ├── azurite-backupstore.yaml
│ │ │ └── kustomization.yaml
│ │ ├── cifs/
│ │ │ ├── cifs-backupstore.yaml
│ │ │ └── kustomization.yaml
│ │ ├── minio/
│ │ │ ├── kustomization.yaml
│ │ │ └── minio-backupstore.yaml
│ │ └── nfs/
│ │ ├── kustomization.yaml
│ │ └── nfs-backupstore.yaml
│ ├── longhorn-images.txt
│ ├── longhorn-okd.yaml
│ ├── longhorn.yaml
│ ├── podsecuritypolicy.yaml
│ ├── prerequisite/
│ │ ├── longhorn-cifs-installation.yaml
│ │ ├── longhorn-gke-cos-node-agent.yaml
│ │ └── longhorn-iscsi-selinux-workaround.yaml
│ └── upgrade_responder_server/
│ ├── README.md
│ ├── chart-values.yaml
│ └── chart.yaml
├── dev/
│ ├── scale-test/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── sample.sh
│ │ ├── scale-test.py
│ │ └── statefulset.yaml
│ ├── scripts/
│ │ ├── lm-update.sh
│ │ └── update-image-pull-policy.sh
│ └── upgrade-responder/
│ ├── README.md
│ ├── install.sh
│ └── manifests/
│ ├── grafana.yaml
│ └── influxdb.yaml
├── enhancements/
│ ├── 20200319-default-disks-and-node-configuration.md
│ ├── 20200331-replace-filesystem-id-key-in-disk-map.md
│ ├── 20200625-volume-deletion-flows.md
│ ├── 20200701-backupstore-file-locks.md
│ ├── 20200721-refactor-restore-for-rebuild-enabling.md
│ ├── 20200727-add-replica-eviction-support-for-disks-and-nodes.md
│ ├── 20200817-improve-node-failure-handling.md
│ ├── 20200819-keep-a-local-replica-to-engine.md
│ ├── 20200821-add-revision-counter-disable-support.md
│ ├── 20200821-rebuild-replica-with-existing-data.md
│ ├── 20200904-csi-snapshot-support.md
│ ├── 20200909-prometheus-support.md
│ ├── 20201002-allow-recurring-backup-detached-volumes.md
│ ├── 20201020-recover-from-volume-failure-by-delete-and-recreate-the-workload-pod.md
│ ├── 20201106-disk-reconnection.md
│ ├── 20201220-rwx-volume-support.md
│ ├── 20210111-upgrade-engine-automatically.md
│ ├── 20210125-enhanced-cpu-reservation.md
│ ├── 20210216-volume-live-migration.md
│ ├── 20210510-automatic-rebalance-replica.md
│ ├── 20210525-async-pull-backups.md
│ ├── 20210624-label-driven-recurring-job.md
│ ├── 20210701-backing-image.md
│ ├── 20210810-volume-clone.md
│ ├── 20220110-extend-csi-snapshot-to-support-longhorn-snapshot.md
│ ├── 20220317-snapshot-prune.md
│ ├── 20220324-orphaned-data-cleanup.md
│ ├── 20220408-support-kubernetes-ca.md
│ ├── 20220420-longhorn-snapshot-crd.md
│ ├── 20220428-storage-network-through-grpc-proxy.md
│ ├── 20220727-dedicated-recovery-backend-for-rwx-volume-nfs-server.md
│ ├── 20220801-failed-backups-cleanup.md
│ ├── 20220913-longhorn-system-backup-restore.md
│ ├── 20220922-snapshot-checksum-and-bit-rot-detection.md
│ ├── 20221018-record-recurring-jobs-in-the-backup-volume.md
│ ├── 20221024-longhorn-volumeattachment.md
│ ├── 20221024-pv-encryption.md
│ ├── 20221103-filesystem-trim.md
│ ├── 20221109-support-bundle-enhancement.md
│ ├── 20221123-local-volume.md
│ ├── 20221205-concurrent-backup-restore-limit.md
│ ├── 20221213-reimplement-longhorn-engine-with-SPDK.md
│ ├── 20230103-recurring-snapshot-cleanup.md
│ ├── 20230108-improve-backup-and-restore-efficiency-using-multiple-threads-and-compression-methods.md
│ ├── 20230116-smb-cifs-backup-store-support.md
│ ├── 20230303-consolidate-instance-managers.md
│ ├── 20230307-pdb-for-longhon-csi-and-webhook.md
│ ├── 20230309-recurring-filesystem-trim.md
│ ├── 20230315-upgrade-path-enforcement.md
│ ├── 20230417-extend-csi-snapshot-to-support-backingimage.md
│ ├── 20230418-azure-blob-storage-backup-store-support.md
│ ├── 20230420-engine-identity-validation.md
│ ├── 20230420-upgrade-checker-info-collection.md
│ ├── 20230517-set-recurring-job-to-pvc.md
│ ├── 20230523-support-spdk-volumes.md
│ ├── 20230526-volume-backup-policy-for-longhorn-system-backup.md
│ ├── 20230601-forcibly-activate-a-restoring-dr-volume.md
│ ├── 20230616-automatic-offline-replica-rebuild.md
│ ├── 20230619-spdk-engine.md
│ ├── 20230718-disk-anti-affinity.md
│ ├── 20230807-backingimage-backup-support.md
│ ├── 20230809-support-backup-and-restore-for-volumes-with-v2-data-engine.md
│ ├── 20230814-talos-linux-support.md
│ ├── 20230815-engine-upgrade-enforcement.md
│ ├── 20230821-customize-maximum-recurring-job-retain-number.md
│ ├── 20230905-automatically-evict-replicas-while-draining.md
│ ├── 20230905-snapshot-space-management.md
│ ├── 20231204-default-priority-class.md
│ ├── 20231226-support-non-disruptive-volume-related-setting-updates.md
│ ├── 20240108-replica-auto-balance-pressured-disks.md
│ ├── 20240314-recurring-and-manual-full-backup-support.md
│ ├── 20240325-nfs-server-ha.md
│ ├── 20240402-share-manager-scheduling.md
│ ├── 20240423-longhorn-commandline-interface.md
│ ├── 20240426-backing-image-enhancement.md
│ ├── 20240516-pre-pull-images.md
│ ├── 20240522-storage-network-for-rwx-volumes.md
│ ├── 20240612-backing-image-encryption-and-clone-support.md
│ ├── 20240801-delete-backup-in-the-backupstore-asynchronously.md
│ ├── 20240926-multiple-backup-targets-support.md
│ ├── 20241003-improve-pulling-backups-from-the-backup-target.md
│ ├── 20241028-auto-salvage-support-for-v2-volumes.md
│ ├── 20241111-rwx-resize.md
│ ├── 20241203-v2-backing-image-support.md
│ ├── 20241206-v2-volume-live-migration.md
│ ├── 20250107-v2-volume-encryption.md
│ ├── 20250313-ublk-frontend-for-v2-engine.md
│ ├── 20250331-orphaned-runtime-cleanup.md
│ ├── 20250407-volume-offline-rebuilding.md
│ ├── 20250508-v2-volume-cloning.md
│ ├── 20250701-configurable-backup-block-size.md
│ ├── 20250721-v2-engine-interrupt-mode.md
│ ├── 20250721-v2-volume-expansion.md
│ ├── 20250721-volume-offline-rebuilding-with-resource-awareness.md
│ ├── 20251001-replica-balance-scheduling.md
│ ├── 20251017-rwx-volume-endpoint-network.md
│ ├── 20251119-snapshot-heavy-task-concurrency-control.md
│ └── YYYYMMDD-template.md
├── examples/
│ ├── block/
│ │ ├── block_volume.yaml
│ │ └── crypto/
│ │ ├── deployment_with_pvc.yaml
│ │ ├── secret-crypto-global.yaml
│ │ └── storageclass-crypto-global.yaml
│ ├── crypto/
│ │ ├── secret-crypto-customized-rhel-FIPS-enabled.yaml
│ │ ├── secret-crypto-customized.yaml
│ │ ├── secret-crypto-global.yaml
│ │ ├── storageclass-crypto-global.yaml
│ │ ├── storageclass-crypto-per-volume-dedicated-namespace.yaml
│ │ └── storageclass-crypto-per-volume.yaml
│ ├── csi/
│ │ └── example_pv.yaml
│ ├── data_migration.yaml
│ ├── deployment.yaml
│ ├── network-policy/
│ │ ├── backing-image-data-source-network-policy.yaml
│ │ ├── backing-image-manager-network-policy.yaml
│ │ ├── instance-manager-networking.yaml
│ │ ├── manager-network-policy.yaml
│ │ ├── recovery-backend-network-policy.yaml
│ │ ├── ui-network-policy.yaml
│ │ └── webhook-network-policy.yaml
│ ├── pod_with_gev.yaml
│ ├── pod_with_pvc.yaml
│ ├── restore_to_file.yaml.template
│ ├── rwx/
│ │ ├── rwx-nginx-deployment.yaml
│ │ └── storageclass-migratable.yaml
│ ├── simple_pod.yaml
│ ├── simple_pvc.yaml
│ ├── snapshot/
│ │ ├── existing_backup.yaml
│ │ ├── restore_existing_backup.yaml
│ │ ├── restore_pvc_snapshot.yaml
│ │ ├── snapshot_existing.yaml
│ │ ├── snapshot_pvc.yaml
│ │ └── snapshotclass.yaml
│ ├── statefulset.yaml
│ ├── storageclass.yaml
│ └── v2/
│ ├── pod_with_pvc.yaml
│ └── storageclass.yaml
├── renovate.json
├── scalability/
│ ├── dev/
│ │ ├── control_plane_grafana_dashboard.json
│ │ └── data-plane-grafana_dashboard.json
│ └── reference-setup-performance-scalability-and-sizing-guidelines/
│ ├── README.md
│ ├── on-prem/
│ │ ├── big-node-spec.md
│ │ └── medium-node-spec.md
│ └── public-cloud/
│ ├── big-node-spec.md
│ └── medium-node-spec.md
├── scripts/
│ ├── generate-backupstore-credentials.sh
│ ├── generate-longhorn-yaml.sh
│ ├── helm-docs.sh
│ ├── lhexec
│ ├── load-images.sh
│ ├── longhorn_rancher_chart_migration.sh
│ ├── migrate-for-pre-070-volumes.sh
│ ├── restore-backup-to-file.sh
│ ├── save-images.sh
│ ├── update-chart-questions.sh
│ ├── update-chart-readme.sh
│ ├── update-chart-values.sh
│ ├── update-manifests-dev-version.sh
│ └── update-uninstall-manifest.py
├── support-versions.txt
└── uninstall/
└── uninstall.yaml
================================================
FILE CONTENTS
================================================
================================================
FILE: .codespellignore
================================================
aks
ec2
eks
gce
gcp
================================================
FILE: .github/CODEOWNERS
================================================
* @longhorn/dev
================================================
FILE: .github/ISSUE_TEMPLATE/bug.yaml
================================================
name: Bug report
description: Create a bug report
title: "[BUG] "
type: "Bug"
labels: ["kind/bug", "require/qa-review-coverage", "require/backport"]
assignees:
-
body:
- type: markdown
attributes:
value: |
Thanks for stopping by to let us know something could be better!
For general questions or discussions, please use the [Discussions](https://github.com/longhorn/longhorn/discussions) tab.
- type: textarea
attributes:
label: Describe the Bug
description: A clear and concise description of the bug.
validations:
required: true
- type: textarea
attributes:
label: To Reproduce
description: Please provide the steps to reproduce the case.
validations:
required: false
- type: textarea
attributes:
label: Expected Behavior
description: A clear and concise description of what you expected to happen.
validations:
required: true
- type: textarea
attributes:
label: Support Bundle for Troubleshooting
description: Please provide a support bundle when the issue happens. You can generate a support bundle using the link at the footer of the Longhorn UI. Check [here](https://longhorn.io/docs/latest/troubleshoot/support-bundle/). Then, attach to the issue or send to longhorn-support-bundle@suse.com.
validations:
required: true
- type: textarea
attributes:
label: Environment
description: "Suggest checking the doc of the best practices of using Longhorn. [here](https://longhorn.io/docs/latest/best-practices)"
value: |
- Longhorn version:
- Impacted volume (PV): <!-- PLEASE specify the volume name to better identify the cause -->
- Installation method (e.g. Rancher Catalog App/Helm/Kubectl):
- Kubernetes distro (e.g. RKE/K3s/EKS/OpenShift) and version:
- Number of control plane nodes in the cluster:
- Number of worker nodes in the cluster:
- Node config
- OS type and version:
- Kernel version:
- CPU per node:
- Memory per node:
- Disk type (e.g. SSD/NVMe/HDD):
- Network bandwidth between the nodes (Gbps):
- Underlying Infrastructure (e.g. on AWS/GCE, EKS/GKE, VMWare/KVM, Baremetal):
- Number of Longhorn volumes in the cluster:
validations:
required: true
- type: textarea
attributes:
label: Additional context
description: Please add any other context about the problem here.
validations:
required: false
- type: textarea
attributes:
label: Workaround and Mitigation
description: Please add any workaround or mitigation to the problem here.
validations:
required: false
================================================
FILE: .github/ISSUE_TEMPLATE/ci.md
================================================
---
name: CI task
about: Create a CI task
title: "[CI] "
type: "Task"
labels: ["kind/task", "area/ci"]
assignees: ''
---
## What's the CI task to develop? Please describe
<!--A clear and concise description of what CI task you want to develop.-->
## Describe the items of the task development (DoD, definition of done) you'd like
<!--
Please use a task list for items on a separate line with a clickable checkbox https://docs.github.com/en/issues/tracking-your-work-with-issues/about-task-lists
- [ ] `item 1`
-->
## Additional context
<!--Add any other context or screenshots about the request here.-->
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: GitHub Discussions
url: https://github.com/longhorn/longhorn/discussions
about: For getting answers to usage on GitHub, Discussions is even better than this bug tracker :)
================================================
FILE: .github/ISSUE_TEMPLATE/doc.md
================================================
---
name: Document
about: Create or update document
title: "[DOC] "
type: "Doc"
labels: kind/doc
assignees: ''
---
## What's the document you plan to update? Why? Please describe
<!--A clear and concise description of what the document is.-->
## Additional context
<!--Add any other context or screenshots about the document request here.-->
================================================
FILE: .github/ISSUE_TEMPLATE/epic.yaml
================================================
name: Epic request
description: Suggest an Epic for grouped features, enhancements or tasks
title: "[EPIC] "
type: "Epic"
labels: [ "Epic" ]
assignees:
-
body:
- type: textarea
attributes:
label: Is your Epic request related to a problem? Please describe (👍 if you like this request)
description: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...].
validations:
required: true
- type: textarea
attributes:
label: Describe the tasks for this Epic
description: A clear and concise description of what you want to happen. For each sub-task, please create the corresponding issues and connect them to this Epic.
validations:
required: true
- type: textarea
attributes:
label: Additional context
placeholder: Add any other context or screenshots about the feature request here.
validations:
required: false
================================================
FILE: .github/ISSUE_TEMPLATE/feature.yaml
================================================
name: Feature request
description: Suggest an idea/feature
title: "[FEATURE] "
type: "Feature"
labels: ["kind/feature", "require/lep", "require/doc", "require/auto-e2e-test", "require/manual-test-plan"]
assignees:
-
body:
- type: markdown
attributes:
value: |
Thanks for stopping by to let us know something could be better!
For general questions or discussions, please use the [Discussions](https://github.com/longhorn/longhorn/discussions) tab.
- type: textarea
attributes:
label: Is your feature request related to a problem? Please describe (👍 if you like this request)
description: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...].
validations:
required: true
- type: textarea
attributes:
label: Describe the solution you'd like
description: A clear and concise description of what you want to happen.
validations:
required: false
- type: textarea
attributes:
label: Describe alternatives you've considered
description: A clear and concise description of any alternative solutions or features you've considered.
validations:
required: false
- type: textarea
attributes:
label: Additional context
placeholder: Add any other context or screenshots about the feature request here.
validations:
required: false
================================================
FILE: .github/ISSUE_TEMPLATE/fix-cve-issues-for-release.md
================================================
---
name: Fix CVE Issues for Release
about: Security issue fix task for a release
title: "[RELEASE] Fix CVE Issues for {{ env.RELEASE_VERSION }}"
type: "Task"
labels: ["release/task", "area/security", "area/install-uninstall-upgrade"]
assignees: ''
---
## What's the task? Please describe
Identify and resolve CVE issues of Longhorn components:
- https://github.com/longhorn/longhorn/blob/{{ env.BRANCH_NAME }}/deploy/longhorn-images.txt
## Describe the sub-tasks
- [ ] Identify CVE issues in Longhorn components for {{ env.RELEASE_VERSION }}.
- [ ] Resolve the identified CVE issues.
- [ ] Perform CVE scans and possible fixes for each stage: Pre-RCs, RC1, RC2, etc.
## Additional context
Keep this issue open until the version is released to consolidate all CVE-related fixes. This way, we can avoid creating additional CVE-related issues if new ones are identified later.
================================================
FILE: .github/ISSUE_TEMPLATE/hotfix.md
================================================
---
name: Hotfix
about: Create a hotfix task
title: "[HOTFIX] "
type: "Task"
labels: ["kind/hotfix", "require/important-note"]
assignees: ''
---
## What's the task? Please describe
<!--A clear and concise description of what the task is.-->
## Describe the sub-tasks
- [ ] Create temporary branch for hotfixed component repo and push the fix to this branch
- [ ] Validate the fix using hotfixed image
- [ ] Create a tag for the hotfixed component repo. The naming convention is `vX.Y.Z-hotfix-<number>`, e.g. `v1.4.0-hotfix-1`, `v1.4.0-hotfix-2`, etc.
- [ ] Validate the fix using hotfixed image <longhorn-component>:`vX.Y.Z-hotfix-<number>`
- [ ] Remove the temporary branch
- [ ] Update the important note in the official document vX.Y.Z
## Additional context
<!--Add any other context or screenshots about the task request here.-->
================================================
FILE: .github/ISSUE_TEMPLATE/improvement.yaml
================================================
name: Improvement request
description: Suggest an improvement of an existing feature
title: "[IMPROVEMENT] "
type: "Improvement"
labels: ["kind/improvement", "require/doc", "require/manual-test-plan", "require/backport"]
assignees:
-
body:
- type: markdown
attributes:
value: |
Thanks for stopping by to let us know something could be better!
For general questions or discussions, please use the [Discussions](https://github.com/longhorn/longhorn/discussions) tab.
- type: textarea
attributes:
label: Is your improvement request related to a feature? Please describe (👍 if you like this request)
description: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...].
validations:
required: true
- type: textarea
attributes:
label: Describe the solution you'd like
description: A clear and concise description of what you want to happen.
validations:
required: false
- type: textarea
attributes:
label: Describe alternatives you've considered
placeholder: A clear and concise description of any alternative solutions or features you've considered.
validations:
required: false
- type: textarea
attributes:
label: Additional context
description: Add any other context or screenshots about the feature request here.
validations:
required: false
================================================
FILE: .github/ISSUE_TEMPLATE/infra.md
================================================
---
name: Infra
about: Create a test/dev infra task
title: "[INFRA] "
type: "Task"
labels: ["kind/task", "area/infra"]
assignees: ''
---
## What's the infra task? Please describe
<!--A clear and concise description of what infra task you want to develop.-->
## Describe the items of the infra task (DoD, definition of done) you'd like
<!--
Please use a task list for items on a separate line with a clickable checkbox https://docs.github.com/en/issues/tracking-your-work-with-issues/about-task-lists
- [ ] `item 1`
-->
## Additional context
<!--Add any other context or screenshots about the test infra request here.-->
================================================
FILE: .github/ISSUE_TEMPLATE/performance-benchmark.md
================================================
---
name: Performance Benchmark
about: Performance benchmark task for feature release
title: "[Benchmark] Performance Benchmark for {{ env.RELEASE_VERSION }}"
type: "Task"
labels: ["release/task", "area/benchmark"]
assignees: ''
---
## What's the task? Please describe
Execute performance benchmark for v1 and v2 volume
## Describe the sub-tasks
- [ ] baseline based on local-path-provisioner
- v1
- [ ] 1-replica volume (co-located replica and engine)
- [ ] 3-replica volume
- v2
- Single CPU core
- [ ] 1-replica volume (co-located replica and engine)
- [ ] 3-replica volume
- Multiple CPU cores
- [ ] 1-replica volume (co-located replica and engine)
- [ ] 3-replica volume
## Additional context
Update the results to https://github.com/longhorn/longhorn/wiki/Performance-Benchmark
================================================
FILE: .github/ISSUE_TEMPLATE/refactor.md
================================================
---
name: Refactor task
about: Suggest a refactoring request for an existing implementation
title: "[REFACTOR] "
type: "Task"
labels: kind/refactoring
assignees: ''
---
## Is your improvement request related to a feature? Please describe
<!--A clear and concise description of what the problem is.-->
## Describe the solution you'd like
<!--A clear and concise description of what you want to happen.-->
## Describe alternatives you've considered
<!--A clear and concise description of any alternative solutions or features you've considered.-->
## Additional context
<!--Add any other context or screenshots about the request here.-->
================================================
FILE: .github/ISSUE_TEMPLATE/regular-tasks-for-feature-release.md
================================================
---
name: Regular Tasks for Feature Release
about: Regular tasks for a feature release
title: "[RELEASE] Regular Tasks for Feature Release {{ env.RELEASE_VERSION }}"
type: "Task"
labels: ["release/task", "area/install-uninstall-upgrade"]
assignees: ''
---
## What's the task? Please describe
Regular tasks for feature release {{ env.RELEASE_VERSION }} must be completed well before the release, during the development phase.
For OS distro updates for SLES and SLE Micro, need to update for each patch release as well.
## Describe the sub-tasks
- [ ] OS Distro Version Update (QA captain)
- [ ] Verify by ci.longhorn.io/job/public/job
- [ ] Update `Best Practices>Operating System` in the official document and testing pipelines
- [ ] K8s Distro Version Update (QA captain)
- [ ] Update the testing pipelines to use the latest supported K8s version (RKE2, K3s)
- [ ] BCI Image Update for Component Container Base Image
- [ ] Golang Version Update
- [ ] BCI golang image update
- [ ] go.mod update
- [ ] Kubernetes Version Update
- [ ] Update the official document with all versions we support
- [ ] Update the minimum version in official document and chart if needed
- [ ] Kubernetes Dependent Library Version Update
- [ ] CSI Sidecar Version Update
- [ ] Support Bundle Kit Version Update
- [ ] NFS-Ganesha Version Update
- [ ] SPDK Version Update
## Additional context
https://github.com/longhorn/longhorn/wiki/Version-Update-Policy
================================================
FILE: .github/ISSUE_TEMPLATE/release.md
================================================
---
name: Release Task
about: Create a release task
title: "[RELEASE] Release {{ env.RELEASE_VERSION }}"
type: "Task"
labels: ["release/task", "area/install-uninstall-upgrade"]
assignees: ''
---
## What's the task? Please describe
Action items for releasing {{ env.RELEASE_VERSION }}
## Roles
- Release captain: {{ env.RELEASE_CAPTAIN }} <!--responsible for RD efforts of release development and coordinating with QA captain-->
- QA captain: {{ env.QA_CAPTAIN }} <!--responsible for coordinating QA efforts of release testing tasks-->
## Describe the sub-tasks
### Pre-Release
#### Release Captain Tasks
> [!IMPORTANT]
> The Release Captain needs to finish the following items
- [ ] This tasks are only needed when doing a feature release such as {{ env.MAJOR_MINOR_VERSION }}.
- [ ] Before creating RC1, create a new release branch for the following component repositories by triggering [▶️ Create Longhorn Repository Branches Action](https://github.com/longhorn/release/actions/workflows/create-repo-branches.yml), and then create RC1 from the new branch. Leave the master branch for the next feature release development.
- [ ] Add the new branch {{ env.BRANCH_NAME }} to [renovate configuration](https://github.com/longhorn/release/blob/main/renovate-default.json).
- [ ] PR: <!--URL of the pull request-->
- [ ] After creating the new release branch, update the version file in each repo by [▶️ Update Longhorn Repository Version File in Default Branch Action](https://github.com/longhorn/release/actions/workflows/update-repo-version-file.yml).
- longhorn-manager
- longhorn-ui
- longhorn-tests
- longhorn-engine
- longhorn-instance-manager
- longhorn-share-manager
- backing-image-manager
- longhorn-spdk-engine (needed after GA)
- cli
- [ ] Update `jobs.release.strategy.matrix` in [sprint release](https://github.com/longhorn/release/blob/main/.github/workflows/release-sprint.yml).
- [ ] PR: <!--URL of the pull request-->
- [ ] Trigger the RC release build by [▶️ Release-Preview Action](https://github.com/longhorn/release/actions/workflows/release-preview.yml).
#### QA Captain Tasks
> [!IMPORTANT]
> The QA captain needs to coordinate the following items before the GA release.
- [ ] Regression test plan (manual)
- [ ] Update Longhorn official document
- [ ] Update `Best Practices>Operating System` and `Best Practices>Kubernetes>Kubernetes Version`
- [ ] PR: <!--URL of the pull request-->
- [ ] Run e2e regression for pre-GA milestones (`install`, `upgrade`)
- [ ] Run security testing of container images for pre-GA milestones.
- [ ] Investigate and fix the security issues. The issues are tracked by the sub-issue `Fix CVE issues for {{ env.RELEASE_VERSION }}` - @c3y1huang
- [ ] Create security issues at upstream for unresolved CVEs in CSI sidecar images - @c3y1huang
---
### Release
#### Release Captain Tasks for the GA Build
> [!IMPORTANT]
> The Release Captain needs to finish the following items
- [ ] This tasks are only needed when doing a feature release such as {{ env.MAJOR_MINOR_VERSION }}.
- [ ] Ensure the sub-issue `Regular Tasks for Feature Release for {{ env.MAJOR_MINOR_VERSION }}` is completed.
- [ ] Ensure the sub-issue `Fix CVE issues for {{ env.RELEASE_VERSION }}` is completed.
- [ ] Update image versions in [chart/README.md](https://github.com/longhorn/longhorn/tree/{{ env.RELEASE_VERSION }}/chart/README.md).
- PR: <!--URL of the pull request-->
- [ ] Trigger the GA release build by [▶️ Release Action](https://github.com/longhorn/release/actions/workflows/release.yml).
#### QA Captain Tasks for the GA Build
> [!IMPORTANT]
> The QA captain needs to coordinate the following items before the GA release.
- [ ] Run security testing of container images for GA build
- [ ] Verify longhorn chart PR to ensure all artifacts are ready for GA build (`install`, `upgrade`)
- [ ] Run core testing (install, upgrade) for the GA build
- Upgrade from the previous patch of the same feature release.
- Upgrade from the last patch of the previous feature release.
#### Release Captain Tasks after Completing the GA Build Validation
- [ ] Create a release note ([CHANGELOG](https://github.com/longhorn/longhorn/tree/{{ env.RELEASE_VERSION }}/CHANGELOG)).
- [ ] Deprecation note.
- PR: <!--URL of the pull request-->
- [ ] Update notes including highlighted notes, deprecation, compatible changes, and others impacting the current users.
- PR: <!--URL of the pull request-->
- [ ] Update [Longhorn official documentation](https://github.com/longhorn/website).
- [ ] Update [config.toml](https://github.com/longhorn/website/blob/master/config.toml) and publish the new version of doc and add a next patch version of dev doc.
- [ ] Update image versions in `References > Helm Values` and `Snapshot and Backups > CSI Snapshot Support > Enable CSI Snapshot Support on a Cluster`.
- PR: <!--URL of the pull request-->
- [ ] Update `Important Notes`.
- PR: <!--URL of the pull request-->
- [ ] Publish the GA release in [longhorn/longhorn](https://github.com/longhorn/longhorn) and [longhorn/cli](https://github.com/longhorn/cli).
- [ ] Release longhorn/chart from the release branch to publish to [ArtifactHub](https://artifacthub.io/packages/helm/longhorn/longhorn) by [▶️ Release Charts on Demand Action](https://github.com/longhorn/charts/actions/workflows/release-ondemand.yml).
<!-- Set "Use workflow from" to "master" and "Release branch" to "v<x.y>.x" -->
- [ ] Mark the release as `latest` release in longhorn/longhorn [README.md](https://github.com/longhorn/longhorn).
- PR: <!--URL of the pull request-->
- [ ] Update `jobs.release.strategy.matrix` in [sprint release](https://github.com/longhorn/release/blob/main/.github/workflows/release-sprint.yml).
- PR: <!--URL of the pull request-->
- [ ] Update Longhorn image tags in longhorn/longhorn/chart/values.yaml in the development branch by triggering [▶️ Update Longhorn Repository Branch Image Tags](https://github.com/longhorn/longhorn/actions/workflows/update-branch-image-tags.yaml).
---
### Post-Release
- [ ] Mark the release as `stable` release and update stable versions in https://github.com/longhorn/longhorn/blob/master/support-versions.txt
- For the first stable release, we need to consider several factors and reach a consensus by maintainers before claiming it stable.
- For any patch release after a stable release, we need to wait 1-2 weeks for user feedback.
- PR: <!--URL of the pull request-->
**After marking the release as a `stable` release, Release Captain needs to coordinate the following items**
- [ ] Update https://github.com/longhorn/longhorn/blob/master/deploy/upgrade_responder_server/chart-values.yaml - @PhanLe1010
- PR: <!--URL of the pull request-->
- [ ] Add another request for the rancher charts for the next patch release - @rebeccazzzz
- [ ] Update the [support matrix](https://www.suse.com/suse-longhorn/support-matrix/all-supported-versions/) - @asettle @rebeccazzzz
- [ ] Update the [lifecycle page](https://www.suse.com/lifecycle/#suse-storage) - @asettle @rebeccazzzz
### Rancher Charts
**The Release Captain needs to coordinate the following items.**
- [ ] Verify the chart can be installed & upgraded - {{ env.QA_CAPTAIN }}
- [ ] rancher/image-mirrors update - @mantissahz @PhanLe1010
- [ ] rancher/charts active branches for Rancher App Marketplace - @mantissahz @PhanLe1010
cc @longhorn/qa @longhorn/dev
================================================
FILE: .github/ISSUE_TEMPLATE/task.md
================================================
---
name: Task
about: Create a general task
title: "[TASK] "
type: "Task"
labels: kind/task
assignees: ''
---
## What's the task? Please describe
<!--A clear and concise description of what the task is.-->
## Describe the sub-tasks
<!--
Please use a task list for items on a separate line with a clickable checkbox https://docs.github.com/en/issues/tracking-your-work-with-issues/about-task-lists
- [ ] `item 1`
-->
## Additional context
<!--Add any other context or screenshots about the task request here.-->
================================================
FILE: .github/ISSUE_TEMPLATE/test.md
================================================
---
name: Test
about: Create or update test
title: "[TEST] "
type: "Test"
labels: kind/test
assignees: ''
---
## What's the test to develop? Please describe
<!--A clear and concise description of what test you want to develop.-->
## Describe the tasks for the test
<!--
Please use a task list for items on a separate line with a clickable checkbox https://docs.github.com/en/issues/tracking-your-work-with-issues/about-task-lists
- [ ] `item 1`
-->
## Additional context
<!--Add any other context or screenshots about the test request here.-->
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
#### Which issue(s) this PR fixes:
<!--
Use `Issue #<issue number>` or `Issue longhorn/longhorn#<issue number>` or `Issue (paste link of issue)`. DON'T use `Fixes #<issue number>` or `Fixes (paste link of issue)`, as it will automatically close the linked issue when the PR is merged.
-->
Issue #
#### What this PR does / why we need it:
#### Special notes for your reviewer:
#### Additional documentation or context
================================================
FILE: .github/mergify.yml
================================================
pull_request_rules:
- name: Automatically merge PRs
conditions:
- check-success=continuous-integration/drone/pr
- "#approved-reviews-by>=2"
- approved-reviews-by=@longhorn/maintainer
actions:
merge:
method: rebase
- name: Automatically merge bot's PRs
conditions:
- check-success=continuous-integration/drone/pr
- or:
- author = renovate[bot]
- author = mergify[bot]
actions:
merge:
method: rebase
- name: Automatically approve bot's PRs
conditions:
- or:
- author = renovate[bot]
actions:
review:
type: APPROVE
- name: Ask to resolve conflict
conditions:
- conflict
actions:
comment:
message: This pull request is now in conflict. Could you fix it @{{author}}? 🙏
================================================
FILE: .github/workflows/add-issue-to-projects.yml
================================================
name: "[Issue Management] Add Issue To Projects"
on:
issues:
types: [opened, reopened, milestoned]
jobs:
longhorn:
runs-on: ubuntu-latest
steps:
- id: app-token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ secrets.LONGHORN_GITHUB_BOT_APP_ID }}
private-key: ${{ secrets.LONGHORN_GITHUB_BOT_PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
permission-contents: write
permission-pull-requests: write
permission-members: read
permission-issues: write
permission-organization-projects: write
- name: Check Longhorn Membership (including bot)
id: check-membership
run: |
if [[ "${{ github.event.issue.user.login }}" == "github-actions[bot]" ]]; then
echo "is_longhorn_member=true" >> $GITHUB_ENV
else
echo "is_longhorn_member=false" >> $GITHUB_ENV
fi
- name: Real Membership Check (non-bot only)
if: env.is_longhorn_member == 'false'
id: is-longhorn-member
continue-on-error: true
uses: tspascoal/get-user-teams-membership@v3
with:
username: ${{ github.event.issue.user.login }}
organization: longhorn
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
- name: Set Final Membership Flag
if: env.is_longhorn_member == 'false' && fromJSON(steps.is-longhorn-member.outputs.teams)[0] != null
run: echo "is_longhorn_member=true" >> $GITHUB_ENV
- name: Debug Membership Status
run: |
echo "is_longhorn_member: ${{ env.is_longhorn_member }}"
echo "teams: ${{ steps.is-longhorn-member.outputs.teams || 'bot or N/A' }}"
echo "check outcome: ${{ steps.is-longhorn-member.outcome || 'bot or N/A' }}"
- name: Add Issue to Longhorn Sprint Project
if: env.is_longhorn_member == 'true'
uses: actions/add-to-project@v1.0.2
with:
project-url: https://github.com/orgs/longhorn/projects/8
github-token: ${{ steps.app-token.outputs.token }}
labeled: kind/test
label-operator: NOT
community:
runs-on: ubuntu-latest
steps:
- id: app-token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ secrets.LONGHORN_GITHUB_BOT_APP_ID }}
private-key: ${{ secrets.LONGHORN_GITHUB_BOT_PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
permission-contents: write
permission-pull-requests: write
permission-members: read
permission-issues: write
permission-organization-projects: write
- name: Is Longhorn Member
id: is-longhorn-member
continue-on-error: true
uses: tspascoal/get-user-teams-membership@v3
with:
username: ${{ github.event.issue.user.login }}
organization: longhorn
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
- name: Get Issue
if: steps.is-longhorn-member.outcome == 'success'
uses: octokit/request-action@v2.x
id: issue
with:
route: GET /repos/${{ github.repository }}/issues/${{ github.event.issue.number }}
env:
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
- name: Add Issue to Community Sprint Project
id: add-project
if: |
steps.is-longhorn-member.outcome == 'success' &&
fromJSON(steps.is-longhorn-member.outputs.teams)[0] == null
uses: actions/add-to-project@v1.0.2
with:
project-url: https://github.com/orgs/longhorn/projects/5
github-token: ${{ steps.app-token.outputs.token }}
- name: Update Item To New
if: |
steps.is-longhorn-member.outcome == 'success' &&
fromJSON(steps.is-longhorn-member.outputs.teams)[0] == null &&
steps.add-project.outputs.itemId != ''
uses: titoportas/update-project-fields@v0.1.0
with:
project-url: https://github.com/orgs/longhorn/projects/5
github-token: ${{ steps.app-token.outputs.token }}
item-id: ${{ steps.add-project.outputs.itemId }}
field-keys: Status,Sprint
field-values: "New,[0]"
qa:
runs-on: ubuntu-latest
steps:
- id: app-token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ secrets.LONGHORN_GITHUB_BOT_APP_ID }}
private-key: ${{ secrets.LONGHORN_GITHUB_BOT_PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
permission-contents: write
permission-pull-requests: write
permission-members: read
permission-issues: write
permission-organization-projects: write
- name: Is Longhorn Member
id: is-longhorn-member
uses: tspascoal/get-user-teams-membership@v3
with:
username: ${{ github.event.issue.user.login }}
organization: longhorn
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
- name: Add Issue to QA Sprint Project
if: fromJSON(steps.is-longhorn-member.outputs.teams)[0] != null
uses: actions/add-to-project@v1.0.2
with:
project-url: https://github.com/orgs/longhorn/projects/4
github-token: ${{ steps.app-token.outputs.token }}
labeled: kind/test, area/infra
label-operator: OR
================================================
FILE: .github/workflows/auto-author-assign.yml
================================================
name: "[PR Management] Auto Author Assign"
on:
workflow_call:
pull_request_target:
types: [ opened, reopened ]
jobs:
assign-author:
runs-on: ubuntu-latest
steps:
- uses: toshimaru/auto-author-assign@v2.1.1
================================================
FILE: .github/workflows/backport-pr.yml
================================================
name: "[Issue Management] Link Backport PR Issue"
on:
pull_request:
types: [ opened ]
branches:
- master
- "v*"
jobs:
check-backport:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Check if PR is a backport
run: |
if [[ "${{ contains(github.event.pull_request.title, 'backport #') }}" == "true" ]]; then
echo "BACKPORT=true" >> "$GITHUB_ENV"
else
echo "BACKPORT=false" >> "$GITHUB_ENV"
fi
- name: Extract backport branch and issue number
if: env.BACKPORT == 'true'
run: |
# Extract branch from the target branch of the PR
BRANCH=$(echo "${{ github.event.pull_request.base.ref }}")
BRANCH=${BRANCH%.x} # Remove the '.x' suffix
BRANCH=$(echo "${BRANCH}" | sed 's/\./\\./g') # Escape periods
echo "BRANCH=$BRANCH" >> $GITHUB_ENV
PR_BODY="${{ github.event.pull_request.body }}"
ORIGINAL_ISSUE_NUMBER=$(printf '%s\n' "$PR_BODY" \
| grep -oE 'longhorn/longhorn#[0-9]+' \
| head -1 \
| cut -d'#' -f2)
if [[ "$ORIGINAL_ISSUE_NUMBER" =~ ^[0-9]+$ ]]; then
echo "ORIGINAL_ISSUE_NUMBER=$ORIGINAL_ISSUE_NUMBER" >> $GITHUB_ENV
else
echo "ORIGINAL_ISSUE_NUMBER=" >> $GITHUB_ENV
fi
- name: Check if PR is from a fork
run: |
if [[ "${{ github.event.pull_request.head.repo.full_name }}" != "${{ github.repository }}" ]]; then
echo "IS_FORK=true" >> $GITHUB_ENV
else
echo "IS_FORK=false" >> $GITHUB_ENV
fi
- id: app-token
if: ${{ env.BACKPORT == 'true' && env.IS_FORK == 'true' }}
uses: actions/create-github-app-token@v2
with:
app-id: ${{ secrets.LONGHORN_GITHUB_BOT_APP_ID }}
private-key: ${{ secrets.LONGHORN_GITHUB_BOT_PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
permission-contents: write
permission-issues: write
permission-pull-requests: write
- name: Link the PR with the backport issue
if: ${{ env.BACKPORT == 'true' && env.IS_FORK == 'true' && env.ORIGINAL_ISSUE_NUMBER != '' }}
env:
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
run: |
for issue_number in "${{ env.ORIGINAL_ISSUE_NUMBER }}"; do
echo "Found source issue longhorn/longhorn#${issue_number}"
issue_title=$(gh issue view "$issue_number" --repo longhorn/longhorn --json 'title' -q '.title')
if [[ $? -eq 0 && -n "$issue_number" ]]; then
backport_issue_number=$(
curl -s "https://api.github.com/search/issues?q=repo:longhorn/longhorn+is:open+is:issue+in:title+${{ env.BRANCH }}+\"${issue_title}\"" \
| jq .items[0].number
)
if [[ -n "$backport_issue_number" ]]; then
echo "Found backport issue longhorn/longhorn#${backport_issue_number}"
echo "Linking backport issue longhorn/longhorn#${backport_issue_number}"
gh issue comment --repo longhorn/longhorn "${backport_issue_number}" --body "Backport PR: ${{ github.event.pull_request.html_url }}"
continue
fi
fi
echo "No issue title found"
done
================================================
FILE: .github/workflows/check-sprint-last-day.py
================================================
import requests
import os
import sys
from datetime import datetime, timedelta
GITHUB_GRAPHQL_URL = "https://api.github.com/graphql"
def get_github_project_info(github_token, github_org, github_project):
headers = {
"Authorization": f"Bearer {github_token}",
"Content-Type": "application/json"
}
query = '''
{
organization(login: "%s") {
projectsV2(first: 20) {
nodes {
id
title
number
}
}
}
}
''' % (github_org)
payload = {
"query": query
}
response = requests.post(GITHUB_GRAPHQL_URL, headers=headers, json=payload)
if response.status_code == 200:
# fine project by title
nodes = response.json().get("data").get("organization").get("projectsV2").get("nodes")
for node in nodes:
if node.get("title") == github_project:
return node
else:
response.raise_for_status()
def get_current_sprint(github_token, project_id):
headers = {
"Authorization": f"Bearer {github_token}",
"Content-Type": "application/json"
}
query = '''
query {
node(id: "%s") {
... on ProjectV2 {
fields(first: 20) {
nodes {
... on ProjectV2IterationField {
configuration {
iterations {
startDate
id
}
}
}
}
}
}
}
}
''' % (project_id)
payload = {
"query": query
}
response = requests.post(GITHUB_GRAPHQL_URL, headers=headers, json=payload)
if response.status_code == 200:
# fine project by title
result = response.json().get("data").get("node").get("fields").get("nodes")
filtered_result = [node for node in result if 'configuration' in node]
iterations = filtered_result[0].get("configuration").get("iterations")
# Find current iteration
current_date = datetime.now().date()
current_iteration = None
for iteration in iterations:
start_date = datetime.strptime(iteration['startDate'], "%Y-%m-%d").date()
end_date = start_date + timedelta(days=13)
if start_date <= current_date <= end_date:
current_iteration = iteration
break
return current_iteration
else:
response.raise_for_status()
def is_today_is_in_last_day_of_current_sprint(github_token, project_id):
current_iteration = get_current_sprint(github_token, project_id)
if current_iteration is None:
print("Current sprint not found")
return False
current_date = datetime.now().date()
end_date = datetime.strptime(current_iteration['startDate'], "%Y-%m-%d").date() + timedelta(days=13)
print("Current date: %s, end date: %s" % (current_date, end_date))
return current_date == end_date
if __name__ == "__main__":
if len(sys.argv) < 4:
print('Usage: python check-sprint-last-day.py github_org github_repo github_project')
sys.exit()
github_token = os.getenv("GITHUB_TOKEN")
github_org = sys.argv[1]
github_repo = sys.argv[2]
github_project = sys.argv[3]
project = get_github_project_info(github_token, github_org, github_project)
print(f"GitHub Project Details: {project}")
last_day = is_today_is_in_last_day_of_current_sprint(github_token, project.get("id"))
if not last_day:
print("Today %s is not in last day of current sprint" % datetime.now().date())
sys.exit(1)
else:
sys.exit(0)
================================================
FILE: .github/workflows/close-issue.yml
================================================
name: "[Issue Management] Close Issue"
on:
issues:
types: [ unlabeled ]
jobs:
backport:
runs-on: ubuntu-latest
if: contains(github.event.label.name, 'backport/')
steps:
- name: Get Backport Version
uses: xom9ikk/split@v1
id: split
with:
string: ${{ github.event.label.name }}
separator: /
- name: Check if Backport Issue Exists
uses: actions-cool/issues-helper@v3
id: if-backport-issue-exists
with:
actions: 'find-issues'
token: ${{ github.token }}
title-includes: |
[BACKPORT][v${{ steps.split.outputs._1 }}]${{ github.event.issue.title }}
- name: Close Backport Issue
if: fromJSON(steps.if-backport-issue-exists.outputs.issues)[0] != null
uses: actions-cool/issues-helper@v3
with:
actions: 'close-issue'
token: ${{ github.token }}
issue-number: ${{ fromJSON(steps.if-backport-issue-exists.outputs.issues)[0].number }}
automation:
runs-on: ubuntu-latest
if: contains(github.event.label.name, 'require/automation-e2e')
steps:
- name: Check if Automation Issue Exists
uses: actions-cool/issues-helper@v3
id: if-automation-issue-exists
with:
actions: 'find-issues'
token: ${{ github.token }}
title-includes: |
[TEST]${{ github.event.issue.title }}
- name: Close Automation Test Issue
if: fromJSON(steps.if-automation-issue-exists.outputs.issues)[0] != null
uses: actions-cool/issues-helper@v3
with:
actions: 'close-issue'
token: ${{ github.token }}
issue-number: ${{ fromJSON(steps.if-automation-issue-exists.outputs.issues)[0].number }}
================================================
FILE: .github/workflows/codespell.yml
================================================
name: "[PR Management] Codespell"
on:
pull_request:
branches:
- master
- "v*.*.*"
jobs:
codespell:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Check code spell
uses: codespell-project/actions-codespell@v2
with:
check_filenames: true
skip: "*/**.yaml,*/**.yml,./scripts,./vendor,MAINTAINERS,LICENSE,go.mod,go.sum"
================================================
FILE: .github/workflows/conventional-commits.yml
================================================
name: "[PR Management] Conventional PR and Commits"
on:
pull_request:
types:
- opened
- edited
- synchronize
- reopened
permissions:
contents: read
pull-requests: read
jobs:
commit-lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Lint Commits
uses: wagoid/commitlint-github-action@v6
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Lint Pull Request
uses: amannn/action-semantic-pull-request@v5.5.3
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
types: |
feat
fix
docs
style
refactor
perf
test
chore
vendor
build
ci
revert
BREAKING
================================================
FILE: .github/workflows/create-issue.yml
================================================
name: "[Issue Management] Create Backport/Automation/UI Issue"
on:
issues:
types: [ labeled ]
env:
LONGHORN_SPRINT_PROJECT_URL: https://github.com/orgs/longhorn/projects/8
QA_SPRINT_PROJECT_URL: https://github.com/orgs/longhorn/projects/4
jobs:
backport:
runs-on: ubuntu-latest
if: contains(github.event.label.name, 'backport/')
steps:
- id: app-token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ secrets.LONGHORN_GITHUB_BOT_APP_ID }}
private-key: ${{ secrets.LONGHORN_GITHUB_BOT_PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
permission-contents: write
permission-pull-requests: write
permission-members: read
permission-organization-projects: write
permission-issues: write
- name: Is Longhorn Member
uses: tspascoal/get-user-teams-membership@v3
id: is-longhorn-member
with:
username: ${{ github.actor }}
organization: longhorn
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
- name: Get Backport Version
if: fromJSON(steps.is-longhorn-member.outputs.teams)[0] != null
uses: xom9ikk/split@v1
id: split
with:
string: ${{ github.event.label.name }}
separator: /
- name: Check if Backport Issue Exists
if: fromJSON(steps.is-longhorn-member.outputs.teams)[0] != null
uses: actions-cool/issues-helper@v3
id: if-backport-issue-exists
with:
actions: 'find-issues'
token: ${{ github.token }}
issue-state: 'all'
labels: 'kind/backport'
issue-creator: 'github-actions[bot]'
title-includes: |
[BACKPORT][v${{ steps.split.outputs._1 }}]${{ github.event.issue.title }}
- name: Get Milestone Object
if: fromJSON(steps.is-longhorn-member.outputs.teams)[0] != null && fromJSON(steps.if-backport-issue-exists.outputs.issues)[0] == null
uses: longhorn/bot/milestone-action@master
id: milestone
with:
token: ${{ github.token }}
repository: ${{ github.repository }}
milestone_name: v${{ steps.split.outputs._1 }}
- name: Get Labels
if: fromJSON(steps.is-longhorn-member.outputs.teams)[0] != null && fromJSON(steps.if-backport-issue-exists.outputs.issues)[0] == null
id: labels
run: |
RAW_LABELS="${{ join(github.event.issue.labels.*.name, ' ') }}"
RAW_LABELS="${RAW_LABELS} kind/backport"
echo "RAW LABELS: $RAW_LABELS"
LABELS=$(echo "$RAW_LABELS" | sed -r 's/\s*backport\S+//g' | sed -r 's/\s*require\/auto-e2e-test//g' | xargs | sed 's/ /, /g')
echo "LABELS: $LABELS"
echo "labels=$LABELS" >> $GITHUB_OUTPUT
- name: Get Longhorn Members
uses: longhorn/bot/filter-org-members-action@master
id: longhorn-members
with:
token: ${{ steps.app-token.outputs.token }}
organization: longhorn
usernames: ${{ join(github.event.issue.assignees.*.login, ', ') }}
- name: Create Backport Issue
if: fromJSON(steps.is-longhorn-member.outputs.teams)[0] != null && fromJSON(steps.if-backport-issue-exists.outputs.issues)[0] == null
uses: dacbd/create-issue-action@main
id: create-backport-issue
with:
token: ${{ github.token }}
title: |
[BACKPORT][v${{ steps.split.outputs._1 }}]${{ github.event.issue.title }}
body: |
backport ${{ github.event.issue.html_url }}
labels: ${{ steps.labels.outputs.labels }}
milestone: ${{ fromJSON(steps.milestone.outputs.data).number }}
assignees: ${{ join(fromJSON(steps.longhorn-members.outputs.members), ', ') }}
- name: Reopen Backport Issue
if: fromJSON(steps.is-longhorn-member.outputs.teams)[0] != null && fromJSON(steps.if-backport-issue-exists.outputs.issues)[0] != null && fromJSON(steps.if-backport-issue-exists.outputs.issues)[0].state == 'closed'
uses: actions-cool/issues-helper@v3
with:
actions: 'update-issue'
token: ${{ steps.app-token.outputs.token }}
issue-number: ${{ fromJSON(steps.if-backport-issue-exists.outputs.issues)[0].number }}
state: 'open'
- name: Add Issue to Longhorn Sprint Project
if: steps.create-backport-issue.outcome == 'success'
uses: longhorn/bot/add-to-project-action@master
with:
project-url: ${{ env.LONGHORN_SPRINT_PROJECT_URL }}
issue-node-id: ${{ fromJSON(steps.create-backport-issue.outputs.json).node_id }}
github-token: ${{ steps.app-token.outputs.token }}
automation:
runs-on: ubuntu-latest
if: contains(github.event.label.name, 'require/auto-e2e-test')
steps:
- id: app-token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ secrets.LONGHORN_GITHUB_BOT_APP_ID }}
private-key: ${{ secrets.LONGHORN_GITHUB_BOT_PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
permission-contents: write
permission-pull-requests: write
permission-members: read
permission-organization-projects: write
permission-issues: write
- name: Is Longhorn Member
uses: tspascoal/get-user-teams-membership@v3
id: is-longhorn-member
with:
username: ${{ github.actor }}
organization: longhorn
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
- name: Check if Automation Issue Exists
if: fromJSON(steps.is-longhorn-member.outputs.teams)[0] != null
uses: actions-cool/issues-helper@v3
id: if-automation-issue-exists
with:
actions: 'find-issues'
token: ${{ github.token }}
issue-state: 'all'
labels: 'kind/test'
issue-creator: 'github-actions[bot]'
title-includes: |
[TEST]${{ github.event.issue.title }}
- name: Create Automation Test Issue
if: fromJSON(steps.is-longhorn-member.outputs.teams)[0] != null && fromJSON(steps.if-automation-issue-exists.outputs.issues)[0] == null
uses: dacbd/create-issue-action@main
id: create-automation-test-issue
with:
token: ${{ github.token }}
title: |
[TEST]${{ github.event.issue.title }}
body: |
adding/updating auto e2e test cases for ${{ github.event.issue.html_url }} if they can be automated
cc @longhorn/qa
labels: kind/test
- name: Add Issue to QA & Devops Project
if: steps.create-automation-test-issue.outcome == 'success'
uses: longhorn/bot/add-to-project-action@master
with:
project-url: ${{ env.QA_SPRINT_PROJECT_URL }}
issue-node-id: ${{ fromJSON(steps.create-automation-test-issue.outputs.json).node_id }}
github-token: ${{ steps.app-token.outputs.token }}
ui:
runs-on: ubuntu-latest
if: contains(github.event.label.name, 'require/ui')
steps:
- id: app-token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ secrets.LONGHORN_GITHUB_BOT_APP_ID }}
private-key: ${{ secrets.LONGHORN_GITHUB_BOT_PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
permission-contents: write
permission-pull-requests: write
permission-members: read
permission-organization-projects: write
permission-issues: write
- name: Is Longhorn Member
uses: tspascoal/get-user-teams-membership@v3
id: is-longhorn-member
with:
username: ${{ github.actor }}
organization: longhorn
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
- name: Check if UI Issue Exists
if: fromJSON(steps.is-longhorn-member.outputs.teams)[0] != null
uses: actions-cool/issues-helper@v3
id: if-ui-issue-exists
with:
actions: 'find-issues'
token: ${{ steps.app-token.outputs.token }}
issue-state: 'all'
labels: 'area/ui'
issue-creator: 'github-actions[bot]'
title-includes: |
[UI]${{ github.event.issue.title }}
- name: Get Labels
if: fromJSON(steps.is-longhorn-member.outputs.teams)[0] != null && fromJSON(steps.if-ui-issue-exists.outputs.issues)[0] == null
id: labels
run: |
RAW_LABELS="${{ join(github.event.issue.labels.*.name, ' ') }}"
echo "RAW LABELS: $RAW_LABELS"
LABELS=$(echo "$RAW_LABELS" | sed -r 's/\s*backport\S+//g' | sed -r 's/\s*require\/ui//g' | xargs | sed 's/ /, /g')
echo "LABELS: $LABELS"
echo "labels=$LABELS" >> $GITHUB_OUTPUT
- name: Create UI Issue
if: fromJSON(steps.is-longhorn-member.outputs.teams)[0] != null && fromJSON(steps.if-ui-issue-exists.outputs.issues)[0] == null
uses: dacbd/create-issue-action@main
id: create-ui-issue
with:
token: ${{ github.token }}
title: |
[UI]${{ github.event.issue.title }}
body: |
make corresponding UI changes for ${{ github.event.issue.html_url }}
cc @longhorn/dev-ui
labels: ${{ steps.labels.outputs.labels }}, area/ui
milestone: ${{ github.event.issue.milestone.number }}
- name: Add Issue to Longhorn Sprint Project
if: steps.create-ui-issue.outcome == 'success'
uses: longhorn/bot/add-to-project-action@master
with:
project-url: ${{ env.LONGHORN_SPRINT_PROJECT_URL }}
issue-node-id: ${{ fromJSON(steps.create-ui-issue.outputs.json).node_id }}
github-token: ${{ steps.app-token.outputs.token }}
================================================
FILE: .github/workflows/create-release-task-issues.yml
================================================
name: "[Release] Create Release Task Issues"
on:
workflow_dispatch:
inputs:
release_version:
description: "Release Version, e.g. v1.8.1"
required: true
release_captain:
description: "GitHub Username of the Release Captain, formatted as @<github-username>"
required: true
qa_captain:
description: "GitHub Username of the QA Captain, formatted as @<github-username>"
required: true
jobs:
create-release-task:
runs-on: ubuntu-latest
steps:
- id: app-token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ secrets.LONGHORN_GITHUB_BOT_APP_ID }}
private-key: ${{ secrets.LONGHORN_GITHUB_BOT_PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
permission-contents: write
permission-issues: write
- name: Checkout code
uses: actions/checkout@v3
- name: Parse version information
id: parse_version
run: |
set -e
RELEASE_VERSION="${{ github.event.inputs.release_version }}"
# Validate version format
if ! echo "$RELEASE_VERSION" | grep -Eq '^v[0-9]+\.[0-9]+\.[0-9]+$'; then
echo "Error: Invalid release version format. Expected format: v<major>.<minor>.<patch> (e.g., v1.8.1)." >&2
exit 1
fi
MAJOR_MINOR_VERSION=$(echo "$RELEASE_VERSION" | sed -E 's/(v[0-9]+\.[0-9]+)\.[0-9]+/\1.0/')
BRANCH_NAME=$(echo "$RELEASE_VERSION" | sed -E 's/(v[0-9]+\.[0-9]+)\.[0-9]+/\1.x/')
FEATURE_RELEASE="false"
if echo "$RELEASE_VERSION" | grep -Eq '^v[0-9]+\.[0-9]+\.0$'; then
FEATURE_RELEASE="true"
fi
echo "RELEASE_VERSION=$RELEASE_VERSION" >> $GITHUB_ENV
echo "MAJOR_MINOR_VERSION=$MAJOR_MINOR_VERSION" >> $GITHUB_ENV
echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV
echo "FEATURE_RELEASE=$FEATURE_RELEASE" >> $GITHUB_ENV
- name: Create an issue - release task
uses: rancher/gh-issue-mgr/create-an-issue@main
with:
filename: .github/ISSUE_TEMPLATE/release.md
env:
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
RELEASE_VERSION: ${{ env.RELEASE_VERSION }}
MAJOR_MINOR_VERSION: ${{ env.MAJOR_MINOR_VERSION }}
BRANCH_NAME: ${{ env.BRANCH_NAME }}
FEATURE_RELEASE: ${{ env.FEATURE_RELEASE }}
RELEASE_CAPTAIN: ${{ github.event.inputs.release_captain }}
QA_CAPTAIN: ${{ github.event.inputs.qa_captain }}
- name: Create an issue - fix security issue for release
uses: rancher/gh-issue-mgr/create-an-issue@main
with:
filename: .github/ISSUE_TEMPLATE/fix-cve-issues-for-release.md
env:
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
RELEASE_VERSION: ${{ env.RELEASE_VERSION }}
- name: Create an issue - regular tasks for feature release
if: ${{ env.FEATURE_RELEASE == 'true' }}
uses: rancher/gh-issue-mgr/create-an-issue@main
with:
filename: .github/ISSUE_TEMPLATE/regular-tasks-for-feature-release.md
env:
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
RELEASE_VERSION: ${{ env.RELEASE_VERSION }}
FEATURE_RELEASE: ${{ env.FEATURE_RELEASE }}
BRANCH_NAME: ${{ env.BRANCH_NAME }}
- name: Create an issue - performance benchmark task for feature release
if: ${{ env.FEATURE_RELEASE == 'true' }}
uses: rancher/gh-issue-mgr/create-an-issue@main
with:
filename: .github/ISSUE_TEMPLATE/performance-benchmark.md
env:
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
RELEASE_VERSION: ${{ env.RELEASE_VERSION }}
FEATURE_RELEASE: ${{ env.FEATURE_RELEASE }}
================================================
FILE: .github/workflows/periodic-issue-sprint-update.yml
================================================
name: "[Issue Management] Periodic Issue Sprint Update"
on:
schedule:
# Trigger every Sunday at 20:00
- cron: '0 20 * * 0'
workflow_dispatch:
permissions:
contents: read
repository-projects: write
issues: write
jobs:
move-to-next-iteration:
name: Move to next iteration
runs-on: ubuntu-latest
steps:
- id: app-token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ secrets.LONGHORN_GITHUB_BOT_APP_ID }}
private-key: ${{ secrets.LONGHORN_GITHUB_BOT_PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
permission-contents: write
permission-pull-requests: write
permission-issues: write
permission-organization-projects: write
- name: Checkout repository
uses: actions/checkout@v4
- name: Check sprint build is required
id: check_sprint_build_required
continue-on-error: true
run: |
python ./.github/workflows/check-sprint-last-day.py "longhorn" "longhorn" "Longhorn Sprint"
- name: Longhorn Sprint Issues - Clear Sprint
uses: rancher/gh-issue-mgr/move-to-next-iteration@main
if: steps.check_sprint_build_required.outcome == 'success'
with:
owner: longhorn
number: 8
token: ${{ steps.app-token.outputs.token }}
iteration-field: Sprint
iteration: current
new-iteration: none
excluded-statuses: "Review,Ready For Testing,Testing,Closed"
- name: Longhorn Sprint Issues - Move to Next Sprint
uses: rancher/gh-issue-mgr/move-to-next-iteration@main
if: steps.check_sprint_build_required.outcome == 'success'
with:
owner: longhorn
number: 8
token: ${{ steps.app-token.outputs.token }}
iteration-field: Sprint
iteration: current
new-iteration: next
statuses: "Review"
- name: Longhorn Sprint Issues - Update None to Current Sprint
if: steps.check_sprint_build_required.outcome == 'success'
uses: rancher/gh-issue-mgr/move-to-next-iteration@main
with:
owner: longhorn
number: 8
token: ${{ steps.app-token.outputs.token }}
iteration-field: Sprint
iteration: none
new-iteration: current
statuses: "Ready For Testing"
- name: QA Sprint - Clear Sprint
uses: rancher/gh-issue-mgr/move-to-next-iteration@main
if: steps.check_sprint_build_required.outcome == 'success'
with:
owner: longhorn
number: 4
token: ${{ steps.app-token.outputs.token }}
iteration-field: Sprint
iteration: current
new-iteration: none
excluded-statuses: "Review,Testing,Closed"
- name: QA Sprint - Move to Next Sprint
uses: rancher/gh-issue-mgr/move-to-next-iteration@main
if: steps.check_sprint_build_required.outcome == 'success'
with:
owner: longhorn
number: 4
token: ${{ steps.app-token.outputs.token }}
iteration-field: Sprint
iteration: current
new-iteration: next
statuses: "Review"
- name: Longhorn Community Sprint issues - Move to Next Sprint
uses: rancher/gh-issue-mgr/move-to-next-iteration@main
if: steps.check_sprint_build_required.outcome == 'success'
with:
owner: longhorn
number: 5
token: ${{ steps.app-token.outputs.token }}
iteration-field: Sprint
iteration: current
new-iteration: next
statuses: 'New'
================================================
FILE: .github/workflows/pr-review-reminder.py
================================================
import subprocess
import json
import os
import requests
REPOS = ["longhorn/longhorn-manager",
"longhorn/longhorn-engine",
"longhorn/longhorn-instance-manager",
"longhorn/longhorn-share-manager",
"longhorn/backing-image-manager",
"longhorn/longhorn-ui",
"longhorn/longhorn-spdk-engine",
"longhorn/go-iscsi-helper",
"longhorn/go-spdk-helper",
"longhorn/backupstore",
"longhorn/go-common-libs",
"longhorn/types"]
def flatten_issues(repo, blocks, issues, user_mapping):
# Append the title and divider only if there are issues to display
print(issues)
if issues:
blocks.append(
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": f"*{repo}* - {len(issues)} prs"
}
}
)
blocks.append({"type": "divider"})
# Combine issues into chunks of 5
issue_texts = []
for i, issue in enumerate(issues):
number = issue["number"]
title = issue["title"]
issue_url = f"https://github.com/{repo}/pull/{number}"
reviewers = []
for reviewer in issue["reviewers"]:
slack_id = user_mapping.get(reviewer)
if not slack_id:
reviewers.append(reviewer)
else:
reviewers.append(f"<@{slack_id}>")
issue_texts.append(f"- *<{issue_url}|{number}>* - {title} - {', '.join(reviewers)}")
# Add a block for every 5 issues for avoiding bad request error
if (i + 1) % 5 == 0 or (i + 1) == len(issues):
blocks.append({
"type": "section",
"text": {
"type": "mrkdwn",
"text": "\n".join(issue_texts) # Combine all issue texts
}
})
issue_texts = [] # Reset for the next chunk
return blocks
def send_slack_notification(issues):
github_token = os.getenv("GITHUB_TOKEN")
webhook_url = os.getenv("SLACK_WEBHOOK_URL")
value = os.getenv("USER_MAPPING")
user_mapping = {}
if value is not None:
user_mapping = json.loads(value)
print("Sending Slack notification...")
# Initialize blocks as an empty list
blocks = []
blocks.append({
"type": "section",
"text": {
"type": "mrkdwn",
"text": "Hello, this is a Pull Request Review reminder. \n\n" +
"Please help review the following Pull Requests. Thanks for your efforts!"
}
})
for repo in REPOS:
print(f"Processing prs in {repo}...")
blocks = flatten_issues(repo, blocks, issues[repo], user_mapping)
payload = {
"blocks": blocks
}
headers = {
'Content-Type': 'application/json'
}
print(f"Payload: {json.dumps(payload, indent=2)}")
response = requests.post(webhook_url, json=payload, headers=headers)
response.raise_for_status()
def pr_review_reminder():
"""
Fetches and prints details of open Pull Requests for a given repository.
"""
issues = {repo: [] for repo in REPOS}
for repo in REPOS:
print(f"Checking PRs in {repo}...")
# Construct the gh command
command = [
"gh", "pr", "list",
"--repo", repo,
"--state", "open",
"--json", "number,title,author,reviewRequests,labels"
]
try:
# Run the command
result = subprocess.run(command, capture_output=True, text=True, check=False)
# Check if the command was successful
if result.returncode != 0:
print(f" Error running gh command for {repo}:")
if result.stdout:
print(f" Stdout: {result.stdout.strip()}")
if result.stderr:
print(f" Stderr: {result.stderr.strip()}")
continue
# Check if there's any output to parse
if not result.stdout.strip():
print(f" No open PRs found or no output from gh for {repo}.")
continue
# Parse the JSON output
prs_data = json.loads(result.stdout)
if not prs_data:
print(f" No open PRs found in {repo}.")
continue
# Iterate through each PR
for pr in prs_data:
pr_number = pr.get("number", "N/A")
pr_title = pr.get("title", "N/A")
pr_reviewers = pr.get("reviewRequests", [])
labels = pr.get("labels", [])
# Skip PR if its author is a bot
if pr.get("author", {}).get("is_bot", False):
print(f" Skipping PR #{pr_number} by bot author: {pr.get('author', {}).get('login', 'Unknown')}")
continue
# Skip PR if it has "pending" label
if any(label.get("name") == "pending" for label in labels):
print(f" Skipping PR #{pr_number} due to 'pending' label.")
continue
# Get author login
author_info = pr.get("author")
pr_author = "Unknown Author"
if isinstance(author_info, dict):
pr_author = author_info.get("login", "Unknown Author")
# Add PR details to issues list and classify using repos
issues[repo].append({
"number": pr_number,
"title": pr_title,
"author": pr_author,
"reviewers": [reviewer.get("login", "Unknown") for reviewer in pr_reviewers],
})
except Exception as e:
print(f" An unexpected error occurred while processing {repo}: {e}")
finally:
print()
send_slack_notification(issues)
if __name__ == "__main__":
pr_review_reminder()
================================================
FILE: .github/workflows/pr-review-reminder.yml
================================================
name: "[Issue Management] Pull Request Review Reminder"
on:
workflow_dispatch:
schedule:
# Trigger every Monday at 10:00 GMT+8
- cron: '0 2 * * 1'
jobs:
pull-request-review-reminder:
runs-on: ubuntu-latest
name: "Pull Request Review Reminder"
steps:
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install dependencies
run: |
python -m pip install requests
- id: app-token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ secrets.LONGHORN_GITHUB_BOT_APP_ID }}
private-key: ${{ secrets.LONGHORN_GITHUB_BOT_PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
permission-contents: read
permission-issues: read
permission-pull-requests: read
permission-organization-projects: read
- name: Authenticate GitHub CLI
run: echo "${{ steps.app-token.outputs.token }}" | gh auth login --with-token
- uses: actions/checkout@v4
- name: Pull Request Review Reminder
env:
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_LONGHORN_QA_WEBHOOK_URL }}
USER_MAPPING: ${{ secrets.USER_MAPPING_FOR_GITHUB_SLACK }}
run: python .github/workflows/pr-review-reminder.py
================================================
FILE: .github/workflows/scan-and-notify-testing-items.py
================================================
import requests
import os
import sys
import time
import json
from datetime import datetime, timedelta
GITHUB_GRAPHQL_URL = "https://api.github.com/graphql"
def get_github_project_info(github_token, github_org, github_project):
headers = {
"Authorization": f"Bearer {github_token}",
"Content-Type": "application/json"
}
query = '''
{
organization(login: "%s") {
projectsV2(first: 20) {
nodes {
id
title
number
}
}
}
}
''' % (github_org)
payload = {
"query": query
}
response = requests.post(GITHUB_GRAPHQL_URL, headers=headers, json=payload)
if response.status_code == 200:
# Find project by title
print("Response: %s" % response.json())
nodes = response.json().get("data").get("organization").get("projectsV2").get("nodes")
for node in nodes:
if node.get("title") == github_project:
return node
else:
response.raise_for_status()
def get_current_sprint(github_token, project_id):
headers = {
"Authorization": f"Bearer {github_token}",
"Content-Type": "application/json"
}
query = '''
query {
node(id: "%s") {
... on ProjectV2 {
fields(first: 20) {
nodes {
... on ProjectV2IterationField {
configuration {
iterations {
startDate
id
}
}
}
}
}
}
}
}
''' % (project_id)
payload = {
"query": query
}
response = requests.post(GITHUB_GRAPHQL_URL, headers=headers, json=payload)
if response.status_code == 200:
# Find project by title
result = response.json().get("data").get("node").get("fields").get("nodes")
filtered_result = [node for node in result if 'configuration' in node]
iterations = filtered_result[0].get("configuration").get("iterations")
# Find current iteration
current_date = datetime.now().date()
current_iteration = None
for iteration in iterations:
start_date = datetime.strptime(iteration['startDate'], "%Y-%m-%d").date()
end_date = start_date + timedelta(days=13)
if start_date <= current_date <= end_date:
current_iteration = iteration
break
return current_iteration
else:
response.raise_for_status()
def is_today_is_in_last_day_of_current_sprint(github_token, project_id):
current_iteration = get_current_sprint(github_token, project_id)
if current_iteration is None:
print("Current sprint not found")
return False
current_date = datetime.now().date()
end_date = datetime.strptime(current_iteration['startDate'], "%Y-%m-%d").date() + timedelta(days=13)
return current_date == end_date
def list_issues_in_project(github_token, project_id, desired_status=None):
headers = {
"Authorization": f"bearer {github_token}",
"Content-Type": "application/json"
}
query = """
query($project: ID!, $cursor: String) {
node(id: $project) {
... on ProjectV2 {
items(first: 100, after: $cursor) {
nodes {
content {
... on Issue {
number
title
assignees(first: 10) {
nodes {
login
}
}
}
}
status: fieldValueByName(name: "Status") {
... on ProjectV2ItemFieldSingleSelectValue {
name
}
}
sprint: fieldValueByName(name: "Sprint") {
... on ProjectV2ItemFieldIterationValue {
title
startDate
}
}
}
pageInfo {
endCursor
hasNextPage
}
}
}
}
}
"""
cursor = None
current_issues = []
non_current_issues = []
current_sprint = get_current_sprint(github_token, project_id)
print(f"Current sprint: {current_sprint}")
while True:
variables = {"project": project_id, "cursor": cursor}
response = requests.post(GITHUB_GRAPHQL_URL,
headers=headers,
json={"query": query, "variables": variables})
if response.status_code == 200:
data = response.json()
items = data['data']['node']['items']['nodes']
for item in items:
status = item['status']['name']
if desired_status and status not in desired_status:
continue
sprint = item['sprint']
if not sprint or not sprint.get('startDate') or not current_sprint or sprint['startDate'] != current_sprint['startDate']:
non_current_issues.append(item)
else:
current_issues.append(item)
page_info = data['data']['node']['items']['pageInfo']
if page_info['hasNextPage']:
cursor = page_info['endCursor']
else:
break
else:
raise Exception(f"Query failed to run by returning code of {response.status_code}. {response.text}")
return current_issues, non_current_issues
def flatten_issues(title, blocks, issues, user_mapping):
# Append the title and divider only if there are issues to display
if issues:
blocks.append(
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": f"*{title}* - {len(issues)} issues"
}
}
)
blocks.append({"type": "divider"})
# Combine issues into chunks of 5
issue_texts = []
for i, issue in enumerate(issues):
number = issue["content"]["number"]
title = issue["content"]["title"]
issue_url = f"https://github.com/longhorn/longhorn/issues/{number}"
assignees = []
for assignee in issue["content"]["assignees"]["nodes"]:
slack_id = user_mapping.get(assignee["login"])
if not slack_id:
assignees.append(assignee["login"])
else:
assignees.append(f"<@{slack_id}>")
issue_texts.append(f"- *<{issue_url}|{number}>* - {title} - {', '.join(assignees)}")
# Add a block for every 5 issues for avoiding bad request error
if (i + 1) % 5 == 0 or (i + 1) == len(issues):
blocks.append({
"type": "section",
"text": {
"type": "mrkdwn",
"text": "\n".join(issue_texts) # Combine all issue texts
}
})
issue_texts = [] # Reset for the next chunk
return blocks
def send_slack_notification(webhook_url, user_mapping,
current_issues, non_current_issues):
if len(current_issues) == 0 and len(non_current_issues) == 0:
print("Nothing to notify")
return
# Initialize blocks as an empty list
blocks = []
blocks.append({
"type": "section",
"text": {
"type": "mrkdwn",
"text": "Hello <!subteam^S033SUXF2Q7|longhorn-qa>, this is a reminder. \n\n" +
"There are 'Ready for Testing' or 'Testing' issues. Please finish verifying them using the corresponding sprint release soon. \n\n" +
" - If passed, move them to 'Closed' and DO NOT change the sprint. \n" +
" - If not passed, move them to 'Implementation' and update the sprint to the current one. \n\n" +
"Thanks for your efforts!"
}
})
blocks = flatten_issues("Ready for Testing Issues from the Previous Sprint",
blocks, current_issues, user_mapping)
blocks = flatten_issues("Ready for Testing Issues from older Sprints",
blocks, non_current_issues, user_mapping)
payload = {
"blocks": blocks
}
headers = {
'Content-Type': 'application/json'
}
response = requests.post(webhook_url, json=payload, headers=headers)
response.raise_for_status()
def scan_and_notify(github_org, github_repo, github_project):
github_token = os.getenv("GITHUB_TOKEN")
webhook_url = os.getenv("SLACK_WEBHOOK_URL")
value = os.getenv("USER_MAPPING")
user_mapping = {}
if value is not None:
user_mapping = json.loads(value)
project = get_github_project_info(github_token, github_org, github_project)
print(f"GitHub Project Details: {project}")
# last_day = is_today_is_in_last_day_of_current_sprint(github_token, project.get("id"))
# if not last_day:
# print("Today %s is not in last day of current sprint" % datetime.now().date())
# return
project_id = project.get("id")
current_issues, non_current_issues = list_issues_in_project(github_token,
project_id,
["Ready For Testing", "Testing"])
print("Number of \"Ready For Testing\" and \"Testing\" issues for current sprint:", len(current_issues))
print("Number of \"Ready For Testing\" and \"Testing\" issues for non-current sprint:", len(non_current_issues))
send_slack_notification(webhook_url,
user_mapping, current_issues, non_current_issues)
if __name__ == "__main__":
if len(sys.argv) < 4:
print('Usage: python scan-and-notify-testing-items.py <github_org> <github_repo> <github_project>')
scan_and_notify(sys.argv[1], sys.argv[2], sys.argv[3])
================================================
FILE: .github/workflows/scan-and-notify-testing-items.yml
================================================
name: "[Notification] Scan and Notify Testing Items"
on:
schedule:
# Trigger every Sunday at 12:00
- cron: '0 12 * * 0'
workflow_dispatch:
inputs:
github_org:
description: "GitHub organization"
default: "longhorn"
required: true
github_repo:
description: "GitHub repository"
default: "longhorn"
required: true
github_project:
description: "GitHub project"
default: "Longhorn Sprint"
required: true
env:
GITHUB_ORG: longhorn
GITHUB_REPO: longhorn
GITHUB_PROJECT: Longhorn Sprint
jobs:
scan_and_notify_testing_items:
runs-on: ubuntu-latest
steps:
- id: app-token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ secrets.LONGHORN_GITHUB_BOT_APP_ID }}
private-key: ${{ secrets.LONGHORN_GITHUB_BOT_PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
permission-contents: read
permission-issues: read
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install dependencies
run: |
python -m pip install requests
- name: Scan and Notify Testing Items
env:
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_LONGHORN_QA_WEBHOOK_URL }}
USER_MAPPING: ${{ secrets.USER_MAPPING_FOR_GITHUB_SLACK }}
run: |
github_org="${GITHUB_ORG}"
github_repo="${GITHUB_REPO}"
github_project="${GITHUB_PROJECT}"
if [ -n "${{ github.event.inputs.github_org }}" ]; then
github_org="${{ github.event.inputs.github_org }}"
fi
if [ -n "${{ github.event.inputs.github_repo }}" ]; then
github_repo="${{ github.event.inputs.github_repo }}"
fi
if [ -n "${{ github.event.inputs.github_project }}" ]; then
github_project="${{ github.event.inputs.github_project }}"
fi
python ./.github/workflows/scan-and-notify-testing-items.py "${github_org}" "${github_repo}" "${github_project}"
================================================
FILE: .github/workflows/scorecards.yml
================================================
name: "[Security] Scorecard Supply-Chain Security"
on:
# For Branch-Protection check. Only the default branch is supported. See
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection
branch_protection_rule:
# To guarantee Maintained check is occasionally updated. See
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained
schedule:
- cron: '30 3 * * 4'
push:
branches: [ "master" ]
# Declare default permissions as read only.
permissions: read-all
jobs:
analysis:
name: Scorecard analysis
runs-on: ubuntu-latest
permissions:
# Needed to upload the results to code-scanning dashboard.
security-events: write
# Needed to publish results and get a badge (see publish_results below).
id-token: write
# Uncomment the permissions below if installing in a private repository.
# contents: read
# actions: read
steps:
- name: "Checkout code"
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
persist-credentials: false
- name: "Run analysis"
uses: ossf/scorecard-action@0864cf19026789058feabb7e87baa5f140aac736 # v2.3.1
with:
results_file: results.sarif
results_format: sarif
# (Optional) "write" PAT token. Uncomment the `repo_token` line below if:
# - you want to enable the Branch-Protection check on a *public* repository, or
# - you are installing Scorecard on a *private* repository
# To create the PAT, follow the steps in https://github.com/ossf/scorecard-action?tab=readme-ov-file#authentication-with-fine-grained-pat-optional.
# repo_token: ${{ secrets.SCORECARD_TOKEN }}
# Public repositories:
# - Publish results to OpenSSF REST API for easy access by consumers
# - Allows the repository to include the Scorecard badge.
# - See https://github.com/ossf/scorecard-action#publishing-results.
# For private repositories:
# - `publish_results` will always be set to `false`, regardless
# of the value entered here.
publish_results: true
# Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
# format to the repository Actions tab.
- name: "Upload artifact"
uses: actions/upload-artifact@v4
with:
name: SARIF file
path: results.sarif
retention-days: 5
# Upload the results to GitHub's code scanning dashboard (optional).
# Commenting out will disable upload of results to your repo's Code Scanning dashboard
- name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: results.sarif
================================================
FILE: .github/workflows/stale.yaml
================================================
name: "[Issue Management] Close Stale Issues and PRs"
on:
workflow_call:
workflow_dispatch:
schedule:
- cron: '30 1 * * *'
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v9
with:
stale-issue-message: 'This issue is stale because it has been open for 30 days with no activity. Remove stale label or comment or this will be closed in 5 days.'
stale-pr-message: 'This PR is stale because it has been open for 30 days with no activity. Remove stale label or comment or this will be closed in 10 days.'
close-issue-message: 'This issue was closed because it has been stalled for 5 days with no activity.'
close-pr-message: 'This PR was closed because it has been stalled for 5 days with no activity.'
close-issue-label: 'wontfix'
days-before-stale: 30
days-before-pr-stale: 30
days-before-close: 5
days-before-pr-close: 5
stale-issue-label: 'stale'
stale-pr-label: 'stale'
exempt-all-assignees: true
exempt-issue-labels: 'kind/improvement,kind/feature,kind/test,investigation-needed'
exempt-draft-pr: true
exempt-all-milestones: true
================================================
FILE: .github/workflows/update-branch-image-tags.yaml
================================================
name: "[Release] Update Longhorn Repository Branch Image Tags"
on:
workflow_dispatch:
inputs:
branch:
description: "Branch, ex: v1.7.x"
required: true
defaults:
run:
shell: bash
jobs:
update-repo-branch-image-tags:
runs-on: ubuntu-latest
steps:
- id: app-token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ secrets.LONGHORN_GITHUB_BOT_APP_ID }}
private-key: ${{ secrets.LONGHORN_GITHUB_BOT_PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
permission-contents: write
permission-pull-requests: write
- uses: actions/checkout@v4
with:
ref: ${{ inputs.branch }}
- name: Prepare Packages
run: sudo apt update -y ; sudo apt install -y snapd; sudo snap install yq
- name: Update Repo Branch Image Tags in deploy/longhorn-images.txt
run: |
set -o errexit
set -o xtrace
tag=${{ inputs.branch }}-head
repos_dir=.repos
images=(
longhornio/backing-image-manager
longhornio/longhorn-engine
longhornio/longhorn-instance-manager
longhornio/longhorn-manager
longhornio/longhorn-share-manager
longhornio/longhorn-ui
longhornio/longhorn-cli
)
function replace_images_tags() {
local input_file="$1"
local tag="$2"
local output_file="${input_file}.new"
if [ -z "$input_file" ] || [ -z "$tag" ]; then
echo "Usage: replace_longhorn_images <input_file> <tag>"
return 1
fi
while IFS= read -r line; do
modified=false
for img in "${images[@]}"; do
if [[ "$line" == *"$img"* ]]; then
if [[ "$line" =~ $img(:[^ ]*)? ]]; then
line=$(echo "$line" | sed -E "s|$img(:[^ ]*)?|$img:$tag|")
modified=true
break
fi
fi
done
echo "$line" >> "$output_file"
done < "$input_file"
if [ $? -eq 0 ]; then
mv "$output_file" "$input_file"
echo "Successfully replaced Longhorn image tags in '$input_file'."
else
rm -f "$output_file"
echo "Error: Failed to replace Longhorn image tags."
return 1
fi
}
replace_images_tags "deploy/longhorn-images.txt" "$tag"
- name: Update Repo Branch Image Tags in chart/values.yaml
run: |
yq eval '.image.longhorn.engine.tag = "${{ inputs.branch }}-head"' -i chart/values.yaml
yq eval '.image.longhorn.manager.tag = "${{ inputs.branch }}-head"' -i chart/values.yaml
yq eval '.image.longhorn.ui.tag = "${{ inputs.branch }}-head"' -i chart/values.yaml
yq eval '.image.longhorn.instanceManager.tag = "${{ inputs.branch }}-head"' -i chart/values.yaml
yq eval '.image.longhorn.shareManager.tag = "${{ inputs.branch }}-head"' -i chart/values.yaml
yq eval '.image.longhorn.backingImageManager.tag = "${{ inputs.branch }}-head"' -i chart/values.yaml
- name: Regenerate Manifests
run: bash ./scripts/generate-longhorn-yaml.sh
- name: Create Pull Request
id: cpr
uses: peter-evans/create-pull-request@v7
with:
token: ${{ steps.app-token.outputs.token }}
branch: "update-image-tags-${{ inputs.branch }}"
delete-branch: true
sign-commits: true
signoff: true
author: Longhorn GitHub Bot <67932897+longhorn-io-github-bot@users.noreply.github.com>
committer: Longhorn GitHub Bot <67932897+longhorn-io-github-bot@users.noreply.github.com>
commit-message: "chore: update image tags for branch ${{ inputs.branch }}"
title: "chore: update image tags for branch ${{ inputs.branch }}"
body: |
This PR updates the image tags for branch ${{ inputs.branch }} to ${{ inputs.branch }}-head.
- name: Enable Pull Request Automerge
if: steps.cpr.outputs.pull-request-operation == 'created'
uses: peter-evans/enable-pull-request-automerge@v3
with:
token: ${{ steps.app-token.outputs.token }}
pull-request-number: ${{ steps.cpr.outputs.pull-request-number }}
merge-method: rebase
================================================
FILE: .github/workflows/update-community-issue.yml
================================================
name: "[Issue Management] Update Community Issue Status, Sprint and Milestone"
on:
issues:
types: [labeled, milestoned, reopened, closed]
issue_comment:
types: [created, edited]
concurrency:
group: ${{ github.workflow }}-${{ github.event.issue.number }}
cancel-in-progress: true
jobs:
community:
runs-on: ubuntu-latest
steps:
- id: app-token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ secrets.LONGHORN_GITHUB_BOT_APP_ID }}
private-key: ${{ secrets.LONGHORN_GITHUB_BOT_PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
permission-contents: write
permission-pull-requests: write
permission-members: read
permission-issues: write
permission-organization-projects: write
- name: Checkout Repository
uses: actions/checkout@v4
- name: Is Longhorn Member
id: is-longhorn-member
continue-on-error: true
uses: tspascoal/get-user-teams-membership@v3
with:
username: ${{ github.event.issue.user.login }}
organization: longhorn
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
- run: |
echo "is-longhorn-member teams: ${{ steps.is-longhorn-member.outputs.teams }}"
echo "is-longhorn-member outcome: ${{ steps.is-longhorn-member.outcome }}"
- name: Get Issue
uses: octokit/request-action@v2.x
id: issue
if: steps.is-longhorn-member.outcome == 'success'
with:
route: GET /repos/${{ github.repository }}/issues/${{ github.event.issue.number }}
env:
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
- uses: EndBug/project-fields@v2
id: fields
continue-on-error: true
if: steps.is-longhorn-member.outcome == 'success'
with:
operation: get
fields: Status
github_token: ${{ steps.app-token.outputs.token }}
project_url: https://github.com/orgs/longhorn/projects/5
resource_url: https://github.com/longhorn/longhorn/issues/${{ github.event.issue.number }}
- run: echo ${{ steps.fields.outputs.values }}
- name: Add Issue to Community Sprint Project
id: add-project
uses: actions/add-to-project@v1.0.2
if: ${{
steps.is-longhorn-member.outcome == 'success' &&
steps.fields.outcome == 'success'
}}
with:
project-url: https://github.com/orgs/longhorn/projects/5
github-token: ${{ steps.app-token.outputs.token }}
- name: Update Project Item
if: ${{
steps.is-longhorn-member.outcome == 'success' &&
steps.fields.outcome == 'success' &&
steps.add-project.outputs.itemId != ''
}}
run: |
teams=${{ steps.is-longhorn-member.outputs.teams }}
teams=${teams:1:-1}
IFS=',' read -r -a team_array <<< "$teams"
team_count=${#team_array[@]}
echo "team_count: $team_count"
# If the issue is milestoned by longhorn member, update to Resolved
if [[ $team_count -gt 0 &&
"${{ github.event_name }}" == "issues" &&
"${{ github.event.action }}" == "milestoned" ]]; then
echo "Updating to Resolved since it's milestoned by longhorn member"
echo "field-values=Resolved,[0]" >> $GITHUB_ENV
# If the issue is closed, update to Closed
elif [[ "${{ github.event_name }}" == "issues" &&
"${{ github.event.action }}" == "closed" &&
"${{ steps.fields.outputs.values }}" != "Resolved" ]]; then
echo "Updating to Closed since it's closed"
echo "field-values=Closed" >> $GITHUB_ENV
# If the issue is reopened with status Closed, update to In Progress
elif [[ "${{ github.event_name }}" == "issues" &&
"${{ github.event.action }}" == "reopened" &&
"${{ steps.fields.outputs.values }}" == "Closed" ]]; then
echo "Updating to In Progress"
echo "field-values=In Progress,[0]" >> $GITHUB_ENV
# If a comment is added or edited and the status is not Resolved or Closed by non-longhorn member, update to In Progress
elif [[ $team_count -eq 0 &&
"${{ github.event_name }}" == "issue_comment" &&
( "${{ github.event.action }}" == "created" || "${{ github.event.action }}" == "edited" ) &&
( "${{ steps.fields.outputs.values }}" != "Resolved" && "${{ steps.fields.outputs.values }}" != "Closed" ) ]]; then
echo "Updating to In Progress"
echo "field-values=In Progress,[0]" >> $GITHUB_ENV
# If the issue is labeled as invalid, wontfix or duplicated, update to Closed
elif [[ "${{ github.event_name }}" == "issues" &&
"${{ github.event.action }}" == "labeled" &&
( "${{ github.event.label.name }}" == "invalid" ||
"${{ github.event.label.name }}" == "wontfix" ||
"${{ github.event.label.name }}" == "duplicated" ) ]]; then
echo "Updating to Closed"
echo "field-values=Closed" >> $GITHUB_ENV
else
echo "No matching conditions, skipping update."
exit 0
fi
env:
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
- name: Apply Project Update
if: ${{
steps.is-longhorn-member.outcome == 'success' &&
steps.fields.outcome == 'success' &&
env.field-values != ''
}}
uses: titoportas/update-project-fields@v0.1.0
with:
project-url: https://github.com/orgs/longhorn/projects/5
github-token: ${{ steps.app-token.outputs.token }}
item-id: ${{ steps.add-project.outputs.itemId }}
field-keys: Status,Sprint
field-values: ${{ env.field-values }}
- name: Add Resolved Issue to Longhorn Sprint Project
if: ${{
steps.is-longhorn-member.outcome == 'success' &&
steps.fields.outcome == 'success' &&
env.field-values != '' &&
startsWith(env.field-values, 'Resolved')
}}
uses: actions/add-to-project@v1.0.2
with:
project-url: https://github.com/orgs/longhorn/projects/8
github-token: ${{ steps.app-token.outputs.token }}
- name: Set Milestone to Backlog
if: ${{
steps.is-longhorn-member.outcome == 'success' &&
steps.fields.outcome == 'success' &&
env.field-values != '' &&
startsWith(env.field-values, 'Resolved') &&
github.event.issue.milestone == null
}}
run: |
echo "Setting milestone $MILESTONE to Backlog"
gh issue edit "${{ github.event.issue.number }}" --milestone "Backlog"
env:
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
================================================
FILE: .github/workflows/update-longhorn-issue.yml
================================================
name: "[Issue Management] Update Issue Status in Longhorn Sprint Project"
on:
issues:
types: [labeled, milestoned, assigned, unassigned]
env:
LONGHORN_SPRINT_PROJECT_URL: https://github.com/orgs/longhorn/projects/8
concurrency:
group: ${{ github.workflow }}-${{ github.event.issue.number }}
cancel-in-progress: true
jobs:
longhorn:
runs-on: ubuntu-latest
steps:
- id: app-token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ secrets.LONGHORN_GITHUB_BOT_APP_ID }}
private-key: ${{ secrets.LONGHORN_GITHUB_BOT_PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
permission-contents: write
permission-pull-requests: write
permission-members: read
permission-issues: write
permission-organization-projects: write
- name: Checkout Repository
uses: actions/checkout@v4
- name: Check Longhorn Membership (including bot)
id: check-membership
run: |
if [[ "${{ github.event.issue.user.login }}" == "github-actions[bot]" ]]; then
echo "is_longhorn_member=true" >> $GITHUB_ENV
else
echo "is_longhorn_member=false" >> $GITHUB_ENV
fi
- name: Real Membership Check (non-bot only)
if: env.is_longhorn_member == 'false'
id: is-longhorn-member
continue-on-error: true
uses: tspascoal/get-user-teams-membership@v3
with:
username: ${{ github.event.issue.user.login }}
organization: longhorn
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
- name: Set Final Membership Flag
if: env.is_longhorn_member == 'false'
run: |
if [[ "${{ steps.is-longhorn-member.outcome }}" == "success" ]]; then
echo "is_longhorn_member=true" >> $GITHUB_ENV
fi
- name: Debug Membership Status
run: |
echo "is_longhorn_member: ${{ env.is_longhorn_member }}"
echo "teams: ${{ steps.is-longhorn-member.outputs.teams || 'bot or N/A' }}"
echo "check outcome: ${{ steps.is-longhorn-member.outcome || 'bot or N/A' }}"
- name: Get Issue
uses: octokit/request-action@v2.x
id: issue
if: env.is_longhorn_member == 'true'
with:
route: GET /repos/${{ github.repository }}/issues/${{ github.event.issue.number }}
env:
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
- uses: rancher/gh-issue-mgr/project-fields@main
id: get-status-field
continue-on-error: true
if: env.is_longhorn_member == 'true'
with:
operation: get
fields: Status
github_token: ${{ steps.app-token.outputs.token }}
project_url: ${{ env.LONGHORN_SPRINT_PROJECT_URL }}
resource_url: https://github.com/longhorn/longhorn/issues/${{ github.event.issue.number }}
- name: Add Issue to Longhorn Sprint Project
id: add-project
uses: actions/add-to-project@v1.0.2
if: ${{
env.is_longhorn_member == 'true' &&
steps.get-status-field.outcome == 'success'
}}
with:
project-url: ${{ env.LONGHORN_SPRINT_PROJECT_URL }}
github-token: ${{ steps.app-token.outputs.token }}
- name: Update Item To New
if: |
env.is_longhorn_member == 'true' &&
steps.add-project.outputs.itemId != ''
uses: titoportas/update-project-fields@v0.1.0
with:
project-url: ${{ env.LONGHORN_SPRINT_PROJECT_URL }}
github-token: ${{ steps.app-token.outputs.token }}
item-id: ${{ steps.add-project.outputs.itemId }}
field-keys: Status
field-values: "New"
- name: Set Milestone Backlog to Issue
if: ${{
env.is_longhorn_member == 'true' &&
fromJSON(steps.is-longhorn-member.outputs.teams || '[]')[0] != null &&
github.event.issue.milestone == null &&
steps.get-status-field.outcome == 'success'
}}
env:
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
run: |
ISSUE_NUMBER="${{ github.event.issue.number }}"
# Reduce the chance that milestone is modified by users and actions at the same time.
MILESTONE_TITLE=$(gh issue view "$ISSUE_NUMBER" --json milestone --jq '.milestone.title')
if [ -z "$MILESTONE_TITLE" ]; then
gh issue edit "$ISSUE_NUMBER" --milestone "Backlog"
fi
- name: Update Project Item
if: ${{
env.is_longhorn_member == 'true' &&
steps.get-status-field.outcome == 'success' &&
steps.add-project.outputs.itemId != ''
}}
run: |
ASSIGNEES='${{ toJSON(github.event.issue.assignees) }}'
# Skip if status is already Closed
if [[ "${{ steps.get-status-field.outputs.values }}" == "Closed" ]]; then
echo "Status is Closed, skipping update"
exit 0
fi
if [[ ( "${{ steps.get-status-field.outputs.values }}" == "New Issues" || "${{ steps.get-status-field.outputs.values }}" == "" ) &&
$ASSIGNEES != "[]" ]]; then
echo "Updating to New Issues since it's assigned and status is New Issues or empty"
echo "field-values=New Issues" >> $GITHUB_ENV
elif [[ $ASSIGNEES == "[]" ]]; then
echo "Updating to New Issues since it's unassigned"
echo "field-values=New Issues" >> $GITHUB_ENV
fi
- name: Apply Project Update
if: ${{
env.is_longhorn_member == 'true' &&
steps.get-status-field.outcome == 'success' &&
env.field-values != ''
}}
uses: rancher/gh-issue-mgr/update-project-fields@main
with:
project-url: ${{ env.LONGHORN_SPRINT_PROJECT_URL }}
github-token: ${{ steps.app-token.outputs.token }}
item-id: ${{ steps.add-project.outputs.itemId }}
field-keys: Status
field-values: ${{ env.field-values }}
================================================
FILE: .github/workflows/validate-yamls.yaml
================================================
name: "[PR Management] Validate Longhorn YAMLs"
on:
pull_request:
types:
- opened
- edited
- synchronize
- reopened
permissions:
contents: read
jobs:
validate-yamls:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Install yamllint
run: |
sudo apt-get update
sudo apt-get install -y yamllint
- name: Create yamllint config
run: |
cat > .yamllint <<EOF
extends: default
rules:
line-length: disable
trailing-spaces: disable
document-start: disable
empty-lines: disable
EOF
- name: Validate YAML file
run: yamllint -c .yamllint chart/questions.yaml
================================================
FILE: .github/workflows/wont-fix.yml
================================================
name: "[Issue Management] Add Wontfix Label To Not-Planned Issue"
on:
issues:
types: [closed]
jobs:
add-wontfix-label:
runs-on: ubuntu-latest
steps:
- name: Check if the issue was closed with reason "not planned"
id: check-closed-reason
uses: actions/github-script@v6
with:
script: |
if (context.payload.issue.state_reason === "not_planned") {
return true;
}
return false;
- name: Add wontfix label
if: steps.check-closed-reason.outputs.result == 'true'
uses: actions-ecosystem/action-add-labels@v1
with:
labels: wontfix
github_token: ${{ secrets.GITHUB_TOKEN }}
- name: Clear milestone
if: steps.check-closed-reason.outputs.result == 'true'
uses: actions/github-script@v6
with:
script: |
const issue_number = context.payload.issue.number;
await github.rest.issues.update({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue_number,
milestone: null
});
github_token: ${{ secrets.GITHUB_TOKEN }}
================================================
FILE: .gitignore
================================================
# ignores all goland project folders and files
.idea
*.iml
*.ipr
# python venv for dev scripts
.venv
/deploy/backupstores/overlays/generated-credentials/
================================================
FILE: ADOPTERS.md
================================================
> [!NOTE]
>
> To encourage adoption of Longhorn and share your experience with the community, please add your information below.
### Adopter Types
- End-User: An organization that runs Longhorn in a production environment.
- Integration: An organization offering a product that integrates with Longhorn by providing additional services or functionality.
- Vendor: An organization that includes Longhorn as part of its packaged product.
- Hosted-Service: An organization that operates Longhorn within its hosted service, offered as a product to customers.
### Longhorn Adopters
| Type | Name | Website | Use-Case |
|:-|:-|:-|:-|
| End-User | Nemlig | https://www.nemlig.com/ | A comprehensive, persistent storage solution on Kubernetes. Part of “Kubernemlig,” Nemlig’s internal, developer- and operations-friendly Platform-as-a-Service (PaaS). |
| End-User | Child Rescue Coalition | https://childrescuecoalition.org/ | Kubernetes persistent replicated storage with automated backups. |
================================================
FILE: CHANGELOG/CHANGELOG-1.10.0.md
================================================
# Longhorn v1.10.0 Release Notes
Longhorn v1.10.0 is a major release focused on improving stability, performance, and the overall user experience. This version introduces significant enhancements to our core features, including the V2 Data Engine, and streamlines configuration for easier management.
The key highlights include improvements to the V2 Data Engine, enhanced resilience, simplified configuration, and better observability.
We welcome feedback and contributions to help continuously improve Longhorn.
For terminology and context on Longhorn releases, see [Releases](https://github.com/longhorn/longhorn#releases).
## Removal
### `longhorn.io/v1beta1` API
The `v1beta1` Longhorn API version has been removed.
See [GitHub Issue #10249](https://github.com/longhorn/longhorn/issues/10249) for details.
### `replica.status.evictionRequested` Field
The deprecated `replica.status.evictionRequested` field has been removed.
See [GitHub Issue #7022](https://github.com/longhorn/longhorn/issues/7022) for details.
## Primary Highlights
### New V2 Data Engine Features
#### Interrupt Mode Support
Interrupt mode has been added to the V2 Data Engine to help reduce CPU usage. This feature is especially beneficial for clusters with idle or low I/O workloads, where conserving CPU resources is more important than minimizing latency.
While interrupt mode lowers CPU consumption, it may introduce slightly higher I/O latency compared to polling mode. In addition, the current implementation uses a hybrid approach, which still incurs a minimal, constant CPU load even when interrupts are enabled.
> [!NOTE]
> **Limitation:** Supports **AIO disks only**.
See [Interrupt Mode](https://longhorn.io/docs/1.10.0/v2-data-engine/features/interrupt-mode) and [GitHub Issue#9834](https://github.com/longhorn/longhorn/issues/9834) for details.
#### Volume and Snapshot Cloning
V2 volumes now support two types of cloning:
- **Full-Copy Clone**: Creates a new PVC with a complete, independent copy of the source data, providing full isolation.
- **Linked-Clone (Fast/Smart Clone)**: Creates a PVC that shares data blocks with the source volume for near-instant creation. Ideal for temporary workloads, backups, or testing. Linked-clones are lightweight, fast, and reduce storage overhead.
See [Volume Clone Support](https://longhorn.io/docs/1.10.0/v2-data-engine/features/volume-clone) and [GitHub Issue#7794](https://github.com/longhorn/longhorn/issues/7794) for details.
#### Replica Rebuild QoS
Provides Quality of Service (QoS) control for V2 volume replica rebuilds. You can configure bandwidth limits globally or per volume to prevent storage throughput overload on source and destination nodes.
See [Replica Rebuild QoS](https://longhorn.io/docs/1.10.0/v2-data-engine/features/replica-rebuild-qos) and [GitHub Issue#10770](https://github.com/longhorn/longhorn/issues/10770) for details.
#### Volume Expansion
Longhorn now supports volume expansion for V2 Data Engine volumes. You can expand the volume through the UI or by modifying the PVC manifest.
See [V2 Volume Expansion](https://longhorn.io/docs/1.10.0/v2-data-engine/features/volume-expansion) and [GitHub Issue#8022](https://github.com/longhorn/longhorn/issues/8022) for details.
#### Support for Running Without Hugepages
This reduces memory pressure on low-spec nodes and increases deployment flexibility. Performance may be lower compared to running with Hugepages.
See [GitHub Issue#7066](https://github.com/longhorn/longhorn/issues/7066) for details.
### New V1 Data Engine Features
#### IPv6 Support
V1 volumes now support single-stack IPv6 Kubernetes clusters.
> **Warning:** Dual-stack Kubernetes clusters and V2 volumes are **not supported** in this release.
See [GitHub Issue #2259](https://github.com/longhorn/longhorn/issues/2259) for details.
### Consolidated Global Settings
To simplify management, Longhorn settings are now unified across V1 and V2 Data Engines, using a new, more flexible JSON format.
- **Single value (applies to all Data Engines)**: Non-JSON string (e.g., `1024`).
- **Data-engine-specific**: JSON object (e.g., `{"v1": "value1", "v2": "value2"}`)
- **V1-only**: JSON object with v1 key (e.g., `{"v1":"value1"}`).
- **V2-only**: JSON object with v2 key (e.g., `{"v2":"value1"}`).
See [Longhorn Settings](https://longhorn.io/docs/1.10.0/references/settings) and [GitHub Issue#10926](https://github.com/longhorn/longhorn/issues/10926) for details.
### Pod Scheduling with CSIStorageCapacity
Longhorn now supports **CSIStorageCapacity**, allowing Kubernetes to verify node storage before scheduling pods using StorageClasses with **WaitForFirstConsumer**. This reduces scheduling errors and improves reliability.
See [GitHub Issue #10685](https://github.com/longhorn/longhorn/issues/10685) for details.
### Configurable Backup Block Size
Backup block size can now be configured when creating a volume to optimize performance and efficiency.
See [Create Longhorn Volumes](https://longhorn.io/docs/1.10.0/nodes-and-volumes/volumes/create-volumes) and [GitHub Issue#5215](https://github.com/longhorn/longhorn/issues/5215) for details.
### Volume Attachment Summary
The UI now shows a summary of attachment tickets on each volume page for improved visibility.
See [GitHub Issue #11400](https://github.com/longhorn/longhorn/issues/11400) for details.
## Installation
> [!IMPORTANT]
**Ensure that your cluster is running Kubernetes v1.25 or later before installing Longhorn v1.10.0.**
You can install Longhorn using a variety of tools, including Rancher, Kubectl, and Helm. For more information about installation methods and requirements, see [Quick Installation](https://longhorn.io/docs/1.10.0/deploy/install/) in the Longhorn documentation.
## Upgrade
> [!IMPORTANT]
**Ensure that your cluster is running Kubernetes v1.25 or later before upgrading from Longhorn v1.9.x to v1.10.0.**
Longhorn only allows upgrades from supported versions. For more information about upgrade paths and procedures, see [Upgrade](https://longhorn.io/docs/1.10.0/deploy/upgrade/) in the Longhorn documentation.
## Post-Release Known Issues
For information about issues identified after this release, see [Release-Known-Issues](https://github.com/longhorn/longhorn/wiki/Release-Known-Issues).
### Highlight
- [FEATURE] V2 Volume Supports Cloning [7794](https://github.com/longhorn/longhorn/issues/7794) - @yangchiu @PhanLe1010
- [FEATURE] v2 supports volume expansion [8022](https://github.com/longhorn/longhorn/issues/8022) - @davidcheng0922 @chriscchien
- [UI][FEATURE] V2 Volume Supports Cloning [11736](https://github.com/longhorn/longhorn/issues/11736) - @yangchiu @houhoucoop
- [FEATURE] V2 volumes support interrupt mode [9834](https://github.com/longhorn/longhorn/issues/9834) - @yangchiu @c3y1huang
- [FEATURE] Support v2 volume without hugepage [7066](https://github.com/longhorn/longhorn/issues/7066) - @derekbit @chriscchien
- [FEATURE] Configurable Backup Block Size [5215](https://github.com/longhorn/longhorn/issues/5215) - @COLDTURNIP @yangchiu
- [UI][FEATURE] Configurable Backup Block Size [11586](https://github.com/longhorn/longhorn/issues/11586) -
- [FEATURE] Add QoS support to limit replica rebuilding load [10770](https://github.com/longhorn/longhorn/issues/10770) - @hookak @roger-ryao
- [FEATURE] Volume granular setting parity for V2 to match V1 data engine [10926](https://github.com/longhorn/longhorn/issues/10926) - @derekbit @chriscchien
- [IMPROVEMENT] Support CSIStorageCapacity in Longhorn CSI driver to enable capacity-aware pod scheduling [10685](https://github.com/longhorn/longhorn/issues/10685) - @bachmanity1 @roger-ryao
- [FEATURE] IPV6 for V1 Data Engine [2259](https://github.com/longhorn/longhorn/issues/2259) - @yangchiu @c3y1huang
- [FEATURE] Delta Replica Rebuilding using Delta Snapshot: Control and Data Planes [10037](https://github.com/longhorn/longhorn/issues/10037) - @shuo-wu @roger-ryao
- [FEATURE] Remove v1beta1 API CRD in Longhorn v1.10 [10249](https://github.com/longhorn/longhorn/issues/10249) - @derekbit @roger-ryao
### Feature
- [FEATURE] Add option to restart kubelet through `longhornctl` after huge page update [11241](https://github.com/longhorn/longhorn/issues/11241) - @chriscchien @bachmanity1
- [UI][FEATURE] Configurable Backup Block Size [11351](https://github.com/longhorn/longhorn/issues/11351) - @yangchiu @houhoucoop
- [UI][FEATURE] Display a summary of the attachment tickets in an individual volume's overview page [11401](https://github.com/longhorn/longhorn/issues/11401) - @yangchiu @houhoucoop
- [UI][FEATURE] Add QoS support to limit replica rebuilding load [11306](https://github.com/longhorn/longhorn/issues/11306) - @davidcheng0922 @houhoucoop @roger-ryao
- [UI][FEATURE] Volume granular setting parity for V2 to match V1 data engine [11354](https://github.com/longhorn/longhorn/issues/11354) - @chriscchien @houhoucoop
- [FEATURE] Display a summary of the attachment tickets in an individual volume's overview page [11400](https://github.com/longhorn/longhorn/issues/11400) - @yangchiu @davidcheng0922
- [FEATURE] Allow longhorn to restart pods with custom controllers, while the `Automatically Delete Workload Pod when The Volume Is Detached Unexpectedly` feature is enabled [8353](https://github.com/longhorn/longhorn/issues/8353) - @derekbit @roger-ryao
- [FEATURE] Standardized way to override container image registry [11064](https://github.com/longhorn/longhorn/issues/11064) - @marcosbc @yangchiu @roger-ryao
- [FEATURE] Standardized way to specify image pull secrets [11062](https://github.com/longhorn/longhorn/issues/11062) - @marcosbc @chriscchien
### Improvement
- [IMPROVEMENT] Add usage metrics for Longhorn installation variant [11792](https://github.com/longhorn/longhorn/issues/11792) - @derekbit
- [IMPROVEMENT] Allow applying different values of snapshot checksum related settings for v1 and v2 data engine [11537](https://github.com/longhorn/longhorn/issues/11537) - @chriscchien @nzhan126
- [IMPROVEMENT] Make `longhornctl` usable in air-gapped environments [11291](https://github.com/longhorn/longhorn/issues/11291) - @chriscchien @bachmanity1
- [IMPROVEMENT] SAST Potential dereference of the null pointer in controller/volume_controller.go in longhorn-manager [11780](https://github.com/longhorn/longhorn/issues/11780) - @c3y1huang
- [IMPROVEMENT] Collect Logs from the Host Directory Defined by the Setting `log-path` [11522](https://github.com/longhorn/longhorn/issues/11522) - @c3y1huang @roger-ryao
- [IMPROVEMENT] Enhance Offline Rebuilding with Resource Awareness and Retry Backoff [11270](https://github.com/longhorn/longhorn/issues/11270) - @mantissahz @chriscchien
- [IMPROVEMENT] Collect mount table, process status and process table in support bundle [8397](https://github.com/longhorn/longhorn/issues/8397) - @mantissahz @chriscchien
- [IMPROVEMENT] Volume attachment should automatically exclude nodes with `disable-v2-data-engine="true"` [11695](https://github.com/longhorn/longhorn/issues/11695) - @derekbit @chriscchien
- [IMPROVEMENT] Introduce `System Info` Category for Settings [11656](https://github.com/longhorn/longhorn/issues/11656) - @derekbit @roger-ryao
- [IMPROVEMENT] RBAC permissions [11345](https://github.com/longhorn/longhorn/issues/11345) - @davidcheng0922 @chriscchien
- [IMPROVEMENT] Improve Longhorn Pods Logging Precision to Nanoseconds [11596](https://github.com/longhorn/longhorn/issues/11596) - @derekbit @roger-ryao
- [IMPROVEMENT] Update validation logics for v2 data engine [11600](https://github.com/longhorn/longhorn/issues/11600) - @derekbit @chriscchien
- [IMPROVEMENT] Improve log messages of longhorn-engine, tgt and liblonghorn for troubleshooting [11545](https://github.com/longhorn/longhorn/issues/11545) - @yangchiu @derekbit
- [IMPROVEMENT] rename the backing image manager to reduce the probability of CR name collision [11455](https://github.com/longhorn/longhorn/issues/11455) - @COLDTURNIP @chriscchien
- [IMPROVEMENT] Remove outdated prerequisite installation scripts in longhorn/longhorn [11430](https://github.com/longhorn/longhorn/issues/11430) - @yangchiu @roger-ryao @sushant-suse
- [UI][IMPROVEMENT] Add UI Warning for Force-Detach Actions to Prevent Out-of-Sync Kubernetes and Longhorn VolumeAttachments [9944](https://github.com/longhorn/longhorn/issues/9944) - @yangchiu @houhoucoop
- [IMPROVEMENT] Add `node-selector` option to `longhornctl` to select nodes on which to run DaemonSet [11213](https://github.com/longhorn/longhorn/issues/11213) - @yangchiu @bachmanity1
- [IMPROVEMENT] Improve volume `Scheduled` condition message [11460](https://github.com/longhorn/longhorn/issues/11460) - @yangchiu @derekbit @chriscchien
- [IMPROVEMENT] Launching a new mechanism to collect instance manager logs [5948](https://github.com/longhorn/longhorn/issues/5948) - @yangchiu @derekbit
- [IMPROVEMENT] adjust the hardcoded timeout limitation for backing image downloading [11309](https://github.com/longhorn/longhorn/issues/11309) - @COLDTURNIP @roger-ryao
- [IMPROVEMENT] Make liveness probe parameters of instance-manager pod configurable [10788](https://github.com/longhorn/longhorn/issues/10788) - @yangchiu @derekbit
- [IMPROVEMENT] Enhance menu descriptions for Longhorn CLI [8998](https://github.com/longhorn/longhorn/issues/8998) - @roger-ryao @sushant-suse
- [IMPROVEMENT] Improve longhorn-engine controller log messages [11507](https://github.com/longhorn/longhorn/issues/11507) - @derekbit @chriscchien
- [IMPROVEMENT] Add a comment to explain what `isSettingDataEngineSynced` does in the instance manager controller. [11321](https://github.com/longhorn/longhorn/issues/11321) - @mantissahz
- [IMPROVEMENT] Flooding and misleading log message `Deleting orphans on evicted node ...` [11500](https://github.com/longhorn/longhorn/issues/11500) - @yangchiu @derekbit
- [IMPROVEMENT] Reject `volume.spec.replicaRebuildingBandwidthLimit` update for V1 Data Engine [11497](https://github.com/longhorn/longhorn/issues/11497) - @derekbit @roger-ryao
- [IMPROVEMENT] Detach an offline rebuilding volume if rebuilding can not start [11274](https://github.com/longhorn/longhorn/issues/11274) - @mantissahz
- [IMPROVEMENT] backing image handle node disk deleting events [10983](https://github.com/longhorn/longhorn/issues/10983) - @COLDTURNIP @chriscchien
- [IMPROVEMENT] Rename `RebuildingMbytesPerSecond` to `ReplicaRebuildBandwidthLimit` [11403](https://github.com/longhorn/longhorn/issues/11403) - @derekbit @roger-ryao
- [IMPROVEMENT] Make the sync agent profilable [11386](https://github.com/longhorn/longhorn/issues/11386) - @COLDTURNIP @yangchiu
- [IMPROVEMENT] Add performance metrics for Longhorn disk I/O [11223](https://github.com/longhorn/longhorn/issues/11223) - @hookak @DamiaSan
- [IMPROVEMENT] Make CLI preflight check non-blocking for subsequent checkups [9877](https://github.com/longhorn/longhorn/issues/9877) - @davidcheng0922 @DamiaSan
- [IMPROVEMENT] Add namespace argument/parameter to cli pre-flight check [9749](https://github.com/longhorn/longhorn/issues/9749) - @davidcheng0922 @DamiaSan
- [IMPROVEMENT] `Orphaned Data` should not be placed under Settings [10383](https://github.com/longhorn/longhorn/issues/10383) - @houhoucoop @DamiaSan @sushant-suse
- [IMPROVEMENT] Upgrade Node v20 in longhorn-ui [11315](https://github.com/longhorn/longhorn/issues/11315) - @chriscchien @houhoucoop
- [IMPROVEMENT] useful error message from /v1/backuptargets is not displayed in UI [10428](https://github.com/longhorn/longhorn/issues/10428) - @houhoucoop @DamiaSan
- [IMPROVEMENT] Check if the backup target is available before creating a backup, backup backing image, and system backup [10085](https://github.com/longhorn/longhorn/issues/10085) - @yangchiu @nzhan126
- [IMPROVEMENT] Backoff Retry Interval for Instance Manager Pod Re-creation in Resource Constraint Scenarios [10263](https://github.com/longhorn/longhorn/issues/10263) - @yangchiu @bachmanity1
- [IMPROVEMENT] record the detail while webhook rejecting migration attachment tickets [11150](https://github.com/longhorn/longhorn/issues/11150) - @COLDTURNIP @roger-ryao
- [IMPROVEMENT] Handle credential secret containing mixed invalid conditions [8537](https://github.com/longhorn/longhorn/issues/8537) - @yangchiu @nzhan126
- [IMPROVEMENT] Add the possibility of setting floating point values for `guaranteed-instance-manager-cpu` and `node.spec.instanceManagerCPURequest` [11179](https://github.com/longhorn/longhorn/issues/11179) - @yangchiu @gigabyte132
- [IMPROVEMENT] Remove the Patch `preserveUnknownFields: false` for CRDs [11263](https://github.com/longhorn/longhorn/issues/11263) - @derekbit @chriscchien
- [IMPROVEMENT] Schedule at least one replica locally when locality is `best-effort` [11007](https://github.com/longhorn/longhorn/issues/11007) - @chriscchien @bachmanity1
- [IMPROVEMENT] Improve the disk space un-schedulable condition message [10436](https://github.com/longhorn/longhorn/issues/10436) - @yangchiu @davidcheng0922
- [IMPROVEMENT] Improve the condition message of engine image check [9845](https://github.com/longhorn/longhorn/issues/9845) - @derekbit @chriscchien
- [IMPROVEMENT] Improve the logging when detecting multiple backup volumes of the same volume on the same backup target [11152](https://github.com/longhorn/longhorn/issues/11152) - @PhanLe1010 @chriscchien
- [IMPROVEMENT] Implement Documentation Validation for `longhorn/cli` [11229](https://github.com/longhorn/longhorn/issues/11229) - @derekbit
- [IMPROVEMENT] Move validation from each resource deletion to validation webhook [5156](https://github.com/longhorn/longhorn/issues/5156) - @derekbit @roger-ryao
- [IMPROVEMENT] Validate node.longhorn.io resource spec fields [11079](https://github.com/longhorn/longhorn/issues/11079) - @Felipalds @chriscchien
- [IMPROVEMENT] add support for custom annotations in the UI service on Longhorn Helm Chart [11031](https://github.com/longhorn/longhorn/issues/11031) - @josimar-silva @roger-ryao
- [IMPROVEMENT] Adding retry logic for longhorn-csi-plugin when it trying to contact the longhorn-manager pods [9482](https://github.com/longhorn/longhorn/issues/9482) - @PhanLe1010 @roger-ryao
### Bug
- [BUG] failed to load DataEngineSpecific boolean setting from configmap [11810](https://github.com/longhorn/longhorn/issues/11810) - @COLDTURNIP @roger-ryao
- [BUG] V2 stop working - connectNVMfBdev() -> "code": -95,"message": "Operation not supported" (1.10.0-rc2) [11761](https://github.com/longhorn/longhorn/issues/11761) - @yangchiu @c3y1huang
- [BUG] [UI] Inconsistent Default Value for Data Engine in Clone Volume [11802](https://github.com/longhorn/longhorn/issues/11802) - @houhoucoop @roger-ryao
- [BUG] System backup could get stuck in `CreatingVolumeBackups` if some nodes are labeled with `disable-v2-data-engine=true` [11774](https://github.com/longhorn/longhorn/issues/11774) - @mantissahz @roger-ryao
- [BUG] Potential Data Corruption During Volume Resizing When Created from Snapshot [11484](https://github.com/longhorn/longhorn/issues/11484) - @yangchiu @PhanLe1010
- [BUG] Block disk may never become `Schedulable` after re-adding [11760](https://github.com/longhorn/longhorn/issues/11760) - @derekbit @chriscchien
- [BUG] v2 volume could get stuck in `Detaching/Faulted` state after nodes reboot [10112](https://github.com/longhorn/longhorn/issues/10112) - @yangchiu @shuo-wu
- [BUG] Fail to dynamically provision a v2 volume with a backing image if the backing image doesn't exist before PVC creation [11762](https://github.com/longhorn/longhorn/issues/11762) - @COLDTURNIP @yangchiu
- [BUG] v2 DR volume faulted after origin volume expand and backuped [11767](https://github.com/longhorn/longhorn/issues/11767) - @davidcheng0922 @roger-ryao
- [BUG] longhorn manager crash in installation [11743](https://github.com/longhorn/longhorn/issues/11743) - @derekbit @chriscchien
- [BUG] Unable to sync existing backups from a remote backup store [11758](https://github.com/longhorn/longhorn/issues/11758) - @yangchiu @mantissahz
- [BUG] Longhorn pvcs are in pending state. [11654](https://github.com/longhorn/longhorn/issues/11654) - @yangchiu @derekbit
- [BUG] Volume becomes faulted when its replica node disks run out of space during a write operation [10718](https://github.com/longhorn/longhorn/issues/10718) - @yangchiu @mantissahz
- [BUG] [v1.10.0-rc1] `longhornctl trim volume` command hangs [11704](https://github.com/longhorn/longhorn/issues/11704) - @davidcheng0922 @chriscchien
- [BUG] longhornctl preflight install should load and check iscsi_tcp kernel module. [11706](https://github.com/longhorn/longhorn/issues/11706) - @mantissahz @chriscchien
- [BUG] spdk_tgt crash after replica rebuilding due to bdev_channel_destroy_resource() assert failure [11109](https://github.com/longhorn/longhorn/issues/11109) - @hookak @chriscchien
- [BUG] Unable to set replica affinity when creating a v2 volume (`test_soft_anti_affinity_scheduling_volume_enable`) [11642](https://github.com/longhorn/longhorn/issues/11642) - @yangchiu @derekbit
- [BUG] BackupBackingImage may be created from an unready BackingImageManager [11675](https://github.com/longhorn/longhorn/issues/11675) - @WebberHuang1118 @roger-ryao
- [BUG] Creating a 2 Gi volume with a 200 Mi backing image is rejected with “volume size should be larger than the backing image size” [11362](https://github.com/longhorn/longhorn/issues/11362) - @COLDTURNIP @yangchiu
- [BUG] Replica auto balance disk in pressure fails on v2 volumes [10551](https://github.com/longhorn/longhorn/issues/10551) - @yangchiu @hookak
- [BUG] Backup stuck when ownerID is assigned to a node with node.longhorn.io/disable-v2-data-engine: "true" [11619](https://github.com/longhorn/longhorn/issues/11619) - @davidcheng0922 @roger-ryao
- [BUG] Engine process continues running after rapid volume detachment [11605](https://github.com/longhorn/longhorn/issues/11605) - @COLDTURNIP @yangchiu
- [BUG] remaining unknown OS condition in node CR [11612](https://github.com/longhorn/longhorn/issues/11612) - @COLDTURNIP @roger-ryao
- [BUG] Longhorn Manager continues to send replica deletion requests to the Instance Manager for the v2 volume indefinitely [11553](https://github.com/longhorn/longhorn/issues/11553) - @yangchiu @shuo-wu
- [BUG] Unable to disable v2-data-engine even though there is no v2 volumes, backing images or orphaned data [11330](https://github.com/longhorn/longhorn/issues/11330) - @shuo-wu @roger-ryao
- [BUG] longhorn-manager repeatedly emits `No instance manager for node xxx for update instance state of orphan instance orphan-xxx..` [11597](https://github.com/longhorn/longhorn/issues/11597) - @COLDTURNIP @chriscchien
- [BUG] Volumes fails to remount when they go read-only [8572](https://github.com/longhorn/longhorn/issues/8572) - @derekbit @chriscchien
- [BUG] Dangling Volume State When Live Migration Terminates Unexpectedly [11479](https://github.com/longhorn/longhorn/issues/11479) - @PhanLe1010 @chriscchien
- [BUG] S3 Backup target reverts randomly to previous value [9581](https://github.com/longhorn/longhorn/issues/9581) - @yangchiu @mantissahz
- [BUG] Longhornctl / CLI - no configuration has been provided, try setting KUBERNETES_MASTER environment variable [10094](https://github.com/longhorn/longhorn/issues/10094) - @davidcheng0922 @chriscchien
- [BUG] longhorn-images.txt specifies CSI component repo tags not found [11575](https://github.com/longhorn/longhorn/issues/11575) - @yangchiu @derekbit
- [BUG] DR volume's backup block size should be set from the latest backup [11580](https://github.com/longhorn/longhorn/issues/11580) - @COLDTURNIP @yangchiu
- [BUG] longhornctl --enable-spdk doesn't support arm64 [11551](https://github.com/longhorn/longhorn/issues/11551) - @yangchiu @davidcheng0922
- [BUG] extra invalid BackupVolumeCR may be created during cluster split-brain [11154](https://github.com/longhorn/longhorn/issues/11154) - @mantissahz @roger-ryao
- [BUG] system backup error [11232](https://github.com/longhorn/longhorn/issues/11232) - @c3y1huang @roger-ryao
- [BUG] Can not create backup using `Create Backup` icon in UI [11451](https://github.com/longhorn/longhorn/issues/11451) - @yangchiu @mantissahz @houhoucoop
- [BUG] Unable to create backup for old snapshots on v2 volumes: failed to find snapshot lvol range [11461](https://github.com/longhorn/longhorn/issues/11461) - @c3y1huang @chriscchien
- [BUG] Uninstall fail because find backuptargets remaining [11486](https://github.com/longhorn/longhorn/issues/11486) - @COLDTURNIP @yangchiu
- [BUG] Setting v2 data engine can be enabled without fulfilling the hugepage requirement, causing error v2 instance manager CR dangling in the system [11519](https://github.com/longhorn/longhorn/issues/11519) - @yangchiu @derekbit
- [BUG] Unable to setup backup target in storage network environment: cannot find a running instance manager for node [11478](https://github.com/longhorn/longhorn/issues/11478) - @yangchiu @derekbit
- [BUG] Volume migration negative test cases fail on v2 volumes [10800](https://github.com/longhorn/longhorn/issues/10800) - @shuo-wu @chriscchien
- [BUG] V2 volume fails to cleanup error replica and rebuild new one - test_data_locality_basic [10335](https://github.com/longhorn/longhorn/issues/10335) - @shuo-wu @chriscchien
- [BUG] Issue auto detecting nvme drive on talos cluster (vfio-pci driver instead of expected vfio_pci) [11127](https://github.com/longhorn/longhorn/issues/11127) - @Hugome @roger-ryao
- [BUG] Test case `test_running_volume_with_scheduling_failure` failed due to unexpected new replica created [11512](https://github.com/longhorn/longhorn/issues/11512) - @derekbit @chriscchien
- [BUG] Regression test cases failed due to unable to clean up dummy backups [11487](https://github.com/longhorn/longhorn/issues/11487) - @COLDTURNIP @yangchiu
- [BUG][v1.9.0-rc1] Unexpected orphaned data are created after v2 instance managers deleted [10829](https://github.com/longhorn/longhorn/issues/10829) - @yangchiu @derekbit
- [BUG] v2 Engine loops in detaching and attaching state after rebuilding [10396](https://github.com/longhorn/longhorn/issues/10396) - @shuo-wu @roger-ryao
- [BUG] `test_basic.py::test_backup_status_for_unavailable_replicas` is failed [11416](https://github.com/longhorn/longhorn/issues/11416) - @derekbit @roger-ryao
- [BUG] Build fails due to outdated SLES repo [11481](https://github.com/longhorn/longhorn/issues/11481) - @PhanLe1010
- [BUG] Unable to set up S3 backup target if backups already exist [11337](https://github.com/longhorn/longhorn/issues/11337) - @mantissahz @chriscchien
- [BUG][UI] `Snapshots and Backups` graph is stuck loading and console shows error messages [10529](https://github.com/longhorn/longhorn/issues/10529) - @yangchiu @davidcheng0922
- [BUG] The Backup YAML example in the Longhorn doc does not work [11216](https://github.com/longhorn/longhorn/issues/11216) - @roger-ryao @nzhan126
- [BUG] v2 volume workload IO could get `Bad message` error after network disconnect [10113](https://github.com/longhorn/longhorn/issues/10113) - @yangchiu @shuo-wu
- [BUG] Test case `Test Replica Auto Balance Node Least Effort` failed on v2 volume [10977](https://github.com/longhorn/longhorn/issues/10977) - @yangchiu @c3y1huang
- [BUG] IsJSONRPCRespErrorNoSuchDevice fails on wrapped errors for ublk client [11361](https://github.com/longhorn/longhorn/issues/11361) - @yangchiu @davidcheng0922
- [BUG] longhorn-manager is crashed due to `SIGSEGV: segmentation violation` [11420](https://github.com/longhorn/longhorn/issues/11420) - @derekbit @chriscchien
- [BUG] Test Case `test_replica_auto_balance_node_least_effort` Is Sometimes Failed [11388](https://github.com/longhorn/longhorn/issues/11388) - @derekbit @chriscchien
- [BUG] volume gets stuck at detaching/faulted state for spdk v2 engine intermittently [10724](https://github.com/longhorn/longhorn/issues/10724) - @DamiaSan
- [BUG] Typo in configuration parameter: "offlineRelicaRebuilding" should be "offlineReplicaRebuilding" [11380](https://github.com/longhorn/longhorn/issues/11380) - @yangchiu @in-jun
- [BUG][DOC] OpenShift documentation [11174](https://github.com/longhorn/longhorn/issues/11174) - @yangchiu @mlacko64
- [BUG] In single node Harvester, endless "unable to schedule replica" is logged in longhorn-manager [3708](https://github.com/longhorn/longhorn/issues/3708) - @derekbit @chriscchien
- [BUG] Uninstallation fail due to deleting the running Longhorn node is not allowed [11131](https://github.com/longhorn/longhorn/issues/11131) - @COLDTURNIP @roger-ryao
- [BUG] Engine v2 I/O Blocked Over 1-2 Minutes After Instance Manager Pod Deletion [10167](https://github.com/longhorn/longhorn/issues/10167) - @c3y1huang @chriscchien
- [BUG] Regression test cases failed: expecting volume to be detached but it's attached [11273](https://github.com/longhorn/longhorn/issues/11273) - @yangchiu @mantissahz
- [BUG] Volume expansion fails with "unsupported disk encryption format ext4" [11120](https://github.com/longhorn/longhorn/issues/11120) - @COLDTURNIP @mantissahz @roger-ryao
- [BUG] longhorn-spdk-engine rebuilding unit tests may get stuck for 2 minutes [11099](https://github.com/longhorn/longhorn/issues/11099) - @shuo-wu @roger-ryao
- [BUG] v2 volume could get stuck in `detaching/detached` loop when `Migration Confirmation After Migration Node Down` [10157](https://github.com/longhorn/longhorn/issues/10157) - @yangchiu @PhanLe1010
- [BUG] Longhorn will not reuse the failed v2 replicas when a race condition is triggered after the instance manager pod restart [11188](https://github.com/longhorn/longhorn/issues/11188) - @shuo-wu @roger-ryao
- [BUG] Auto-generated CLI document overwrite by make [11219](https://github.com/longhorn/longhorn/issues/11219) - @bachmanity1
- [BUG] Incorrect value of `remove-snapshots-during-filesystem-trim` in longhorn chart/values.yaml [11264](https://github.com/longhorn/longhorn/issues/11264) - @derekbit @chriscchien
- [BUG][v1.9.0-rc1] v2 volumes don't reuse failed replicas as expected after a node goes down [10828](https://github.com/longhorn/longhorn/issues/10828) - @yangchiu @shuo-wu
- [BUG] CSI Plugin restart triggers unintended restart of migratable RWX volume workloads [11158](https://github.com/longhorn/longhorn/issues/11158) - @c3y1huang @roger-ryao
- [BUG] in the browser UI: Volume -> Clone Volume results in the broken browser page [11165](https://github.com/longhorn/longhorn/issues/11165) - @houhoucoop @roger-ryao
- [BUG] "mkfsParams" in StorageClass are not passed to share-manager for filesystem formatting [11107](https://github.com/longhorn/longhorn/issues/11107) - @Florianisme @roger-ryao
- [BUG] Test case `test_engine_image_not_fully_deployed_perform_volume_operations` failed: unable to detach a volume [10874](https://github.com/longhorn/longhorn/issues/10874) - @mantissahz @chriscchien
- [BUG] Creating support-bundle panic NPE [11169](https://github.com/longhorn/longhorn/issues/11169) - @c3y1huang @roger-ryao
- [BUG] Unable to Build Longhorn-Share-Manager Image Due to CMAKE Compatibility [11159](https://github.com/longhorn/longhorn/issues/11159) - @derekbit @roger-ryao
- [BUG] Uninstallation fail due to deleting the default engine image is not allowed [11130](https://github.com/longhorn/longhorn/issues/11130) - @COLDTURNIP @chriscchien
- [BUG] v2 volume gets stuck in degraded state and continuously rebuilds/deletes replicas after a kubelet restart [10107](https://github.com/longhorn/longhorn/issues/10107) - @shuo-wu
- [BUG] SPDK API bdev_lvol_detach_parent does not work as expected [11046](https://github.com/longhorn/longhorn/issues/11046) - @DamiaSan @roger-ryao
- [BUG] Recurring jobs fail when assigned to default group [11016](https://github.com/longhorn/longhorn/issues/11016) - @c3y1huang @chriscchien
- [BUG] v2 volume data checksum mismatch after replica rebuilding [10118](https://github.com/longhorn/longhorn/issues/10118) - @yangchiu @shuo-wu
- [BUG] Most of regression test cases are failing due to unable to update settings [11042](https://github.com/longhorn/longhorn/issues/11042) - @yangchiu @mantissahz
- [BUG] unable to clean up the backing image volume replica after node eviction [11053](https://github.com/longhorn/longhorn/issues/11053) - @COLDTURNIP @roger-ryao
- [BUG] backing image volume replica NPE crash during evicting node [11034](https://github.com/longhorn/longhorn/issues/11034) - @COLDTURNIP @chriscchien
- [BUG] A degraded DR volume remains in standby and attached after activation. [2107](https://github.com/longhorn/longhorn/issues/2107) - @roger-ryao
- [BUG] DR volume gets stuck if there is only a rebuilding replica running [2753](https://github.com/longhorn/longhorn/issues/2753) - @c3y1huang @roger-ryao
### Stability
- [DOC] Document Volume Stability Risks Caused by I/O Latency on HDDs [11240](https://github.com/longhorn/longhorn/issues/11240) - @chriscchien @sushant-suse
### Misc
- [DOC] Add Information on Replica Failure Tolerance [11526](https://github.com/longhorn/longhorn/issues/11526) - @roger-ryao @sushant-suse
- [TASK] KB for backup store lock conflict error message [11293](https://github.com/longhorn/longhorn/issues/11293) - @yangchiu @pratikjagrut
- [DOC] Document Replica Rebuilding Mechanisms and Their Limitations [11119](https://github.com/longhorn/longhorn/issues/11119) - @mantissahz @chriscchien
- [DOC] V2 Engine usage contradiction [11409](https://github.com/longhorn/longhorn/issues/11409) - @shuo-wu @roger-ryao
- [DOC] Talos new volumes strategy [11015](https://github.com/longhorn/longhorn/issues/11015) - @yangchiu @DrummyFloyd
- [TASK] [pytest] automatically add -m v2_volume_test if RUN_V2_TEST enabled [11376](https://github.com/longhorn/longhorn/issues/11376) - @chriscchien
- Revise the document about node space [3021](https://github.com/longhorn/longhorn/issues/3021) - @derekbit @chriscchien
- [DOC] Troubleshooting KB for Mount Failure with XFS Filesystem [11214](https://github.com/longhorn/longhorn/issues/11214) - @derekbit @roger-ryao
- [DOC] Explain Longhorn VolumeAttachment operation and behavior [11142](https://github.com/longhorn/longhorn/issues/11142) - @derekbit @roger-ryao
- [DOC] Update Broken Links on Website [11288](https://github.com/longhorn/longhorn/issues/11288) - @yangchiu @sushant-suse
- [DOC] Clarify privateRegistry.createSecret and registrySecret usage in chart README [11251](https://github.com/longhorn/longhorn/issues/11251) - @chriscchien
- [DOC] KB: failed to complete volume migration during VM upgrade [11149](https://github.com/longhorn/longhorn/issues/11149) - @COLDTURNIP @chriscchien
- [DOC] Elaborate how to enable DR volume using kubectl [10958](https://github.com/longhorn/longhorn/issues/10958) - @derekbit @chriscchien
- [DOC] Remove `defaultSettings.registrySecret` reference from air gap installation guide [11237](https://github.com/longhorn/longhorn/issues/11237) - @chriscchien
- [TASK] Remove deprecated replica.status.evictionRequested field [7022](https://github.com/longhorn/longhorn/issues/7022) - @yangchiu @derekbit @roger-ryao
- [TASK] Create longhorn/spdk longhorn-v25.05 branch [11048](https://github.com/longhorn/longhorn/issues/11048) - @derekbit @chriscchien
- [TASK] Create a Dedicated Repository for libqcow to Improve Maintainability and Build Management [10988](https://github.com/longhorn/longhorn/issues/10988) - @derekbit @chriscchien
- [DOC] Update examples using deprecated crd version v1beta1 to v1beta2 on 1.9.0 [11019](https://github.com/longhorn/longhorn/issues/11019) - @falmar @roger-ryao
- [TASK] POC for ui-extension migration [10516](https://github.com/longhorn/longhorn/issues/10516) - @houhoucoop
- [TASK] Ensure support-bundle-kit builds use vendored dependencies [11106](https://github.com/longhorn/longhorn/issues/11106) - @yangchiu @c3y1huang
- [DOC] Fix the broken links present in documentation [11028](https://github.com/longhorn/longhorn/issues/11028) - @chriscchien @sushant-suse
- [DOC] Update website front page to include community meeting links [10890](https://github.com/longhorn/longhorn/issues/10890) - @yangchiu @divya-mohan0209 @sushant-suse
- [REFACTOR] Use go pkg for system operation instead of relying on external system call via shell command [5193](https://github.com/longhorn/longhorn/issues/5193) - @c3y1huang
## New Contributors
- @Felipalds
- @Florianisme
- @Hugome
- @divya-mohan0209
- @falmar
- @gigabyte132
- @in-jun
- @josimar-silva
- @mlacko64
- @pratikjagrut
## Contributors
- @COLDTURNIP
- @DamiaSan
- @DrummyFloyd
- @PhanLe1010
- @WebberHuang1118
- @bachmanity1
- @c3y1huang
- @chriscchien
- @davidcheng0922
- @derekbit
- @hookak
- @houhoucoop
- @innobead
- @mantissahz
- @marcosbc
- @nzhan126
- @roger-ryao
- @shuo-wu
- @sushant-suse
- @yangchiu
================================================
FILE: CHANGELOG/CHANGELOG-1.10.1.md
================================================
# Longhorn v1.10.1 Release Notes
Longhorn 1.10.1 introduces several improvements and bug fixes that are intended to improve system quality, resilience, stability and security.
We welcome feedback and contributions to help continuously improve Longhorn.
For terminology and context on Longhorn releases, see [Releases](https://github.com/longhorn/longhorn#releases).
## Important Fixes
This release includes several critical stability and performance improvements:
### Goroutine Leak in Instance Manager (V2 Data Engine)
Fixed a goroutine leak in the instance manager when using the V2 data engine. This issue could lead to increased memory usage and potential stability problems over time.
For more details, see [Issue #11962](https://github.com/longhorn/longhorn/issues/11962).
### V2 Volume Attachment Failure in Interrupt Mode
Fixed an issue where V2 volumes using interrupt mode with NVMe disks could fail to complete the attachment process, causing volumes to remain stuck in the attaching state indefinitely.
In Longhorn v1.10.0, interrupt mode supports only **AIO disks**. Interrupt mode for **NVMe disks** is supported starting in v1.10.1.
For more details, see [Issue #11816](https://github.com/longhorn/longhorn/issues/11816).
### UI Deployment Failure on IPv4-Only Nodes
Fixed a bug introduced in v1.10.0 where the Longhorn UI failed to deploy on nodes with only IPv4 enabled. The UI now correctly supports IPv4-only configurations without requiring IPv6.
For more details, see [Issue #11875](https://github.com/longhorn/longhorn/issues/11875).
### Share Manager Excessive Memory Usage
Fixed excessive memory consumption in the share manager for RWX (ReadWriteMany) volumes. The component now maintains stable memory usage under normal operation.
For more details, see [Issue #12043](https://github.com/longhorn/longhorn/issues/12043).
## Installation
> [!IMPORTANT]
**Ensure that your cluster is running Kubernetes v1.25 or later before installing Longhorn v1.10.1.**
You can install Longhorn using a variety of tools, including Rancher, Kubectl, and Helm. For more information about installation methods and requirements, see [Quick Installation](https://longhorn.io/docs/1.10.0/deploy/install/) in the Longhorn documentation.
## Upgrade
> [!IMPORTANT]
**Ensure that your cluster is running Kubernetes v1.25 or later before upgrading from Longhorn v1.9.x to v1.10.1.**
Longhorn only allows upgrades from supported versions. For more information about upgrade paths and procedures, see [Upgrade](https://longhorn.io/docs/1.10.0/deploy/upgrade/) in the Longhorn documentation.
## Post-Release Known Issues
For information about issues identified after this release, see [Release-Known-Issues](https://github.com/longhorn/longhorn/wiki/Release-Known-Issues).
## Resolved Issues
### Improvement
- [BACKPORT][v1.10.1][IMPROVEMENT] The `auto-delete-pod-when-volume-detached-unexpectedly` should only focus on the kubernetes builtin workload. [12125](https://github.com/longhorn/longhorn/issues/12125) - @derekbit @chriscchien
- [BACKPORT][v1.10.1][IMPROVEMENT] `CSIStorageCapacity` objects must show schedulable (allocatable) capacity [12036](https://github.com/longhorn/longhorn/issues/12036) - @chriscchien @bachmanity1
- [BACKPORT][v1.10.1][IMPROVEMENT] improve error logging for failed mounting during node publish volume [12033](https://github.com/longhorn/longhorn/issues/12033) - @COLDTURNIP @roger-ryao
- [BACKPORT][v1.10.1][IMPROVEMENT] Improve Helm Chart defaultSettings handling with automatic quoting and multi-type support [12020](https://github.com/longhorn/longhorn/issues/12020) - @derekbit @chriscchien
- [BACKPORT][v1.10.1][IMPROVEMENT] Avoid repeat engine restart when there are replica unavailable during migration [11945](https://github.com/longhorn/longhorn/issues/11945) - @yangchiu @shuo-wu
- [BACKPORT][v1.10.1][IMPROVEMENT] Adjust maximum of GuaranteedInstanceManagerCPU to a big value [11968](https://github.com/longhorn/longhorn/issues/11968) - @mantissahz
- [BACKPORT][v1.10.1][IMPROVEMENT] Add usage metrics for Longhorn installation variant [11795](https://github.com/longhorn/longhorn/issues/11795) - @derekbit
### Bug
- [BACKPORT][v1.10.1][BUG] Backup target metric is broken [12089](https://github.com/longhorn/longhorn/issues/12089) - @mantissahz @roger-ryao
- [BACKPORT][v1.10.1][BUG] Backing image download gets stuck after network disconnection [12094](https://github.com/longhorn/longhorn/issues/12094) - @COLDTURNIP @chriscchien
- [BACKPORT][v1.10.1][BUG] panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 at longhorn-engine/pkg/controller/control.go:218 +0x2de [12088](https://github.com/longhorn/longhorn/issues/12088) - @roger-ryao
- [BACKPORT][v1.10.1][BUG] Unable to complete uninstallation due to the remaining backuptarget [11964](https://github.com/longhorn/longhorn/issues/11964) - @mantissahz @roger-ryao
- [BACKPORT][v1.10.1][BUG] share-manager excessive memory usage [12043](https://github.com/longhorn/longhorn/issues/12043) - @derekbit @chriscchien
- [BACKPORT][v1.10.1][BUG] NVME disk not found in v2 data engine (failed to find device for BDF) [12029](https://github.com/longhorn/longhorn/issues/12029) - @derekbit @roger-ryao
- [BACKPORT][v1.10.1][BUG] NPE error during recurring job execution [11926](https://github.com/longhorn/longhorn/issues/11926) - @yangchiu @shuo-wu
- [BACKPORT][v1.10.1][BUG] v2 volume creation failed on talos nodes [12026](https://github.com/longhorn/longhorn/issues/12026) - @c3y1huang @chriscchien
- [BACKPORT][v1.10.1][BUG] mounting error is not properly hanedled during CSI node publish volume [12008](https://github.com/longhorn/longhorn/issues/12008) - @COLDTURNIP
- [BACKPORT][v1.10.1][BUG] Adding multiple disks to the same node concurrently may occasionally fail [12018](https://github.com/longhorn/longhorn/issues/12018) - @davidcheng0922 @roger-ryao
- [BUG] upgrading from 1.9.1 to 1.10.0 fails due to old resources still being in v1beta1 [11886](https://github.com/longhorn/longhorn/issues/11886) - @COLDTURNIP @roger-ryao
- [BACKPORT][v1.10.1][BUG] DR volume gets stuck in `unknown` state if engine image is deleted from the attached node [11998](https://github.com/longhorn/longhorn/issues/11998) - @yangchiu @shuo-wu
- [BACKPORT][v1.10.1][BUG] Volume gets stuck in `attaching` state if engine image image is not deployed on one of nodes [11996](https://github.com/longhorn/longhorn/issues/11996) - @yangchiu @shuo-wu
- [BACKPORT][v1.10.1][BUG] Unable to re-add block-type disks by BDF after re-enable v2 data engine [12000](https://github.com/longhorn/longhorn/issues/12000) - @yangchiu @davidcheng0922
- [BACKPORT][v1.10.1][BUG] `test_system_backup_and_restore` test case failed on master-head [12005](https://github.com/longhorn/longhorn/issues/12005) - @derekbit @chriscchien
- [BACKPORT][v1.10.1][BUG] Fix SPDK v25.05 CVE issue [11970](https://github.com/longhorn/longhorn/issues/11970) - @derekbit @roger-ryao
- [BACKPORT][v1.10.1][BUG] V2 volume stuck in volume attachment (V2 interrupt mode) [11976](https://github.com/longhorn/longhorn/issues/11976) - @c3y1huang @chriscchien
- [BACKPORT][v1.10.1][BUG] RWX volume causes process uninterruptible sleep [11958](https://github.com/longhorn/longhorn/issues/11958) - @COLDTURNIP @chriscchien
- [BACKPORT][v1.10.1][BUG] longhorn-manager fails to start after upgrading from 1.9.2 to 1.10.0 [11865](https://github.com/longhorn/longhorn/issues/11865) - @derekbit @roger-ryao
- [BACKPORT][v1.10.1][BUG] Block disk deletion fails without error message [11954](https://github.com/longhorn/longhorn/issues/11954) - @davidcheng0922 @roger-ryao
- [BACKPORT][v1.10.1][BUG] Goroutine leak in instance-manager when using v2 data engine [11962](https://github.com/longhorn/longhorn/issues/11962) - @PhanLe1010 @chriscchien
- [BACKPORT][v1.10.1][BUG] invalid memory address or nil pointer dereference [11942](https://github.com/longhorn/longhorn/issues/11942) - @bachmanity1 @roger-ryao
- [BACKPORT][v1.10.1][BUG] csi-provisioner silently fails to create CSIStorageCapacity if dataEngine parameter is missing [11918](https://github.com/longhorn/longhorn/issues/11918) - @yangchiu @bachmanity1
- [BACKPORT][v1.10.1][BUG] longhorn-engine's UI panics [11901](https://github.com/longhorn/longhorn/issues/11901) - @derekbit @chriscchien
- [BACKPORT][v1.10.1][BUG] Volume is unable to upgrade if the number of active replicas is larger than `volumme.spec.numberOfReplicas` [11895](https://github.com/longhorn/longhorn/issues/11895) - @yangchiu @derekbit
- [BACKPORT][v1.10.1][BUG] UI fails to deploy when only IPv4 is enabled on nodes with v1.10.0 version [11875](https://github.com/longhorn/longhorn/issues/11875) - @yangchiu @c3y1huang
- [BACKPORT][v1.10.1][BUG] Unable to detach a v2 volume after labeling `disable-v2-data-engine=true` [11801](https://github.com/longhorn/longhorn/issues/11801) - @mantissahz
### Misc
- [BACKPORT][v1.10.1][REFACTOR] SAST checks for UI component [11992](https://github.com/longhorn/longhorn/issues/11992) - @chriscchien
- [HOTFIX] Create hotfixed image for longhorn-manager:v1.10.0 [11951](https://github.com/longhorn/longhorn/issues/11951) - @c3y1huang @roger-ryao
## Contributors
- @COLDTURNIP
- @PhanLe1010
- @bachmanity1
- @c3y1huang
- @chriscchien
- @davidcheng0922
- @derekbit
- @forbesguthrie
- @innobea
- @mantissahz
- @rebeccazzzz
- @roger-ryao
- @sushant-suse
- @shuo-wu
- @yangchiu
================================================
FILE: CHANGELOG/CHANGELOG-1.10.2.md
================================================
# Longhorn v1.10.2 Release Notes
Longhorn 1.10.2 introduces several improvements and bug fixes that are intended to improve system quality, resilience, stability and security.
We welcome feedback and contributions to help continuously improve Longhorn.
For terminology and context on Longhorn releases, see [Releases](https://github.com/longhorn/longhorn#releases).
## Important Fixes
This release includes several critical stability fixes.
### RWX Volume Unavailable After Node Drain
Fixed a race condition where **ReadWriteMany (RWX) volumes** could remain in the *attaching* state after node drains, causing workloads to become unavailable.
For more details, see [Issue #12231](https://github.com/longhorn/longhorn/issues/12231).
### Encrypted Volume Cannot Be Expanded Online
Fixed an issue where online expansion of encrypted volumes did not propagate the new size to the dm-crypt device.
For more details, see [Issue #12368](https://github.com/longhorn/longhorn/issues/12368).
### Cloned Volume Cannot Be Attached to Workload
Fixed a bug where cloned volumes could fail to reach a healthy state, preventing attachment to workloads.
For more details, see [Issue #12208](https://github.com/longhorn/longhorn/issues/12208).
### Block Mode Volume Migration Stuck
Fixed a regression in block-mode volume migrations where newly created replicas could incorrectly inherit the `lastFailedAt` timestamp from source replicas, causing repeated deletion and blocking migration completion.
For more details, see [Issue #12312](https://github.com/longhorn/longhorn/issues/12312).
### Replica Auto Balance Disk Pressure Threshold Stalled
Fixed an issue where replica auto-balance under disk pressure could be blocked if stopped volumes were present on the disk.
For more details, see [Issue #12334](https://github.com/longhorn/longhorn/issues/12334).
### Replicas Accumulate During Engine Upgrade
Fixed a bug where temporary replicas could accumulate during engine upgrade. High etcd latency could cause new replicas to fail verification, leading to accumulation over multiple reconciliation cycles.
For more details, see [Issue #12115](https://github.com/longhorn/longhorn/issues/12115).
### Potential Client Connection and Context Leak
Fixed potential context leaks in the instance manager client and backing image manager client, improving stability and preventing resource exhaustion.
For more details, see [Issue #12200](https://github.com/longhorn/longhorn/issues/12200) and [Issue #12195](https://github.com/longhorn/longhorn/issues/12195).
### Replica Node Level Soft Anti-Affinity Ignored
Fixed a bug of replica scheduling loop where replicas could be scheduled onto nodes that already host a replica, even when *Replica Node-Level Soft Anti-Affinity* was disabled.
For more details, see [Issue #12251](https://github.com/longhorn/longhorn/issues/12251).
## Installation
> [!IMPORTANT]
**Ensure that your cluster is running Kubernetes v1.25 or later before installing Longhorn v1.10.2.**
You can install Longhorn using a variety of tools, including Rancher, Kubectl, and Helm. For more information about installation methods and requirements, see [Quick Installation](https://longhorn.io/docs/1.10.2/deploy/install/) in the Longhorn documentation.
## Upgrade
> [!IMPORTANT]
**Ensure that your cluster is running Kubernetes v1.25 or later before upgrading from Longhorn v1.9.x to v1.10.2.**
Longhorn only allows upgrades from supported versions. For more information about upgrade paths and procedures, see [Upgrade](https://longhorn.io/docs/1.10.2/deploy/upgrade/) in the Longhorn documentation.
## Post-Release Known Issues
For information about issues identified after this release, see [Release-Known-Issues](https://github.com/longhorn/longhorn/wiki/Release-Known-Issues).
## Resolved Issues
### Feature
- [BACKPORT][v1.10.2][FEATURE] Inherit namespace for longhorn-share-manager in FastFailover mode [12245](https://github.com/longhorn/longhorn/issues/12245) - @yangchiu
- [BACKPORT][v1.10.2][FEATURE] [Dependency] aws-sdk-go v1.55.7 is EOL as of 2025-07-31 — plan to migrate to v2? [12181](https://github.com/longhorn/longhorn/issues/12181) - @mantissahz @roger-ryao
### Improvement
- [BACKPORT][v1.10.2][IMPROVEMENT] Fix V2 Volume CSI Clone Slowness Caused by VolumeAttachment Webhook Blocking [12329](https://github.com/longhorn/longhorn/issues/12329) - @PhanLe1010 @roger-ryao
### Bug
- [BACKPORT][v1.10.2][BUG] `instance-manager` on nodes that don't have hard or solid state disk DDOSing cluster DNS server with TXT query `_grpc_config.localhost` [12536](https://github.com/longhorn/longhorn/issues/12536) - @COLDTURNIP @chriscchien
- [BACKPORT] Replica rebuild, clone and restore fail, traffic being sent to HTTP proxy [12518](https://github.com/longhorn/longhorn/issues/12518) - @yangchiu @derekbit
- [BACKPORT][v1.10.2][BUG] Healthy replica could be deleted unexpectedly after reducing volume's number of replicas [12512](https://github.com/longhorn/longhorn/issues/12512) - @yangchiu @shuo-wu
- [BACKPORT][v1.10.2][BUG] Data locality enabled volume fails to remove an existing running replica after numberOfReplicas reduced [12509](https://github.com/longhorn/longhorn/issues/12509) - @derekbit @chriscchien
- [BACKPORT][v1.10.2][BUG] System backup may fail to be created or deleted [12479](https://github.com/longhorn/longhorn/issues/12479) - @yangchiu @mantissahz
- [BACKPORT][v1.10.2][BUG] Some default settings in questions.yaml are placed incorrectly. [12222](https://github.com/longhorn/longhorn/issues/12222) - @derekbit @roger-ryao
- [BACKPORT][v1.10.2][BUG] Auto balance feature may lead to volumes falling into a replica deletion-recreation loop [12482](https://github.com/longhorn/longhorn/issues/12482) - @shuo-wu @roger-ryao
- [BACKPORT][v1.10.2][BUG] Single replica volume could get stuck in attaching/detaching loop after the replica node rebooted [12494](https://github.com/longhorn/longhorn/issues/12494) - @COLDTURNIP @yangchiu
- [BACKPORT][v1.10.2][BUG] Potential Instance Manager Client Context Leak [12200](https://github.com/longhorn/longhorn/issues/12200) - @derekbit @chriscchien
- [BACKPORT][v1.10.2][BUG] SnapshotBack proxy request might be sent to incorrect instance-manager pod [12476](https://github.com/longhorn/longhorn/issues/12476) - @derekbit @chriscchien
- [BACKPORT][v1.10.2][BUG] unknown OS condition in node CR is not properly removed during upgrade [12451](https://github.com/longhorn/longhorn/issues/12451) - @COLDTURNIP @roger-ryao
- [BACKPORT][v1.10.2][BUG] RWX volume becomes unavailable after drain node [12231](https://github.com/longhorn/longhorn/issues/12231) - @yangchiu @mantissahz
- [BACKPORT][v1.10.2][BUG] mounting error is not properly hanedled during CSI node publish volume [12382](https://github.com/longhorn/longhorn/issues/12382) - @COLDTURNIP @yangchiu
- [BACKPORT][v1.10.2][BUG] Encrypted Volume Cannot Be Expanded Online [12368](https://github.com/longhorn/longhorn/issues/12368) - @yangchiu @mantissahz
- [BACKPORT][v1.10.2][BUG] The auo generated backing image pod name is complained by kubelet [12357](https://github.com/longhorn/longhorn/issues/12357) - @COLDTURNIP @yangchiu
- [BACKPORT][v1.10.2][BUG] `tests.test_cloning.test_cloning_basic` fails at msater-head [12342](https://github.com/longhorn/longhorn/issues/12342) - @c3y1huang
- [BACKPORT][v1.10.2][Bug] A cloned volume cannot be attached to a workload [12208](https://github.com/longhorn/longhorn/issues/12208) - @yangchiu @PhanLe1010
- [BACKPORT][v1.10.2][BUG] Block Mode Volume Migration Stuck [12312](https://github.com/longhorn/longhorn/issues/12312) - @COLDTURNIP @yangchiu @shuo-wu
- [BACKPORT][v1.10.2][BUG] Replica auto balance disk pressure threshold stalled with stopped volumes [12334](https://github.com/longhorn/longhorn/issues/12334) - @c3y1huang @chriscchien
- [BACKPORT][v1.10.2][BUG] short name mode is enforcing, but image name longhornio/longhorn-manager:v1.10. │ │ 0 returns ambiguous list [12270](https://github.com/longhorn/longhorn/issues/12270) - @yangchiu
- [BACKPORT][v1.10.2][BUG] Replicas accumulate during engine upgrade [12115](https://github.com/longhorn/longhorn/issues/12115) - @c3y1huang @chriscchien
- [BACKPORT][v1.10.2][BUG] Potential BackingImageManagerClient Connection and Context Leak [12195](https://github.com/longhorn/longhorn/issues/12195) - @derekbit @chriscchien
- [BACKPORT][v1.10.2][BUG] Longhorn ignores `Replica Node Level Soft Anti-Affinity` when auto balance is set to `best-effort` [12251](https://github.com/longhorn/longhorn/issues/12251) - @c3y1huang @chriscchien
- [BACKPORT][v1.10.2][BUG] invalid memory address or nil pointer dereference (again) [12234](https://github.com/longhorn/longhorn/issues/12234) - @chriscchien @bachmanity1
- [BACKPORT][v1.10.2][BUG] Request Header Or Cookie Too Large in Web UI with OIDC auth [12213](https://github.com/longhorn/longhorn/issues/12213) - @chriscchien @houhoucoop
## Contributors
- @COLDTURNIP
- @PhanLe1010
- @bachmanity1
- @c3y1huang
- @chriscchien
- @derekbit
- @houhoucoop
- @innobead
- @mantissahz
- @rebeccazzzz
- @roger-ryao
- @shuo-wu
- @sushant-suse
- @yangchiu
================================================
FILE: CHANGELOG/CHANGELOG-1.11.0.md
================================================
# Longhorn v1.11.0 Release Notes
The Longhorn team is excited to announce the release of Longhorn v1.11.0. This release marks a major milestone, with the **V2 Data Engine** officially entering the **Technical Preview** stage following significant stability improvements.
Additionally, this version optimizes the stability of the whole system and introduces critical improvements in resource observability, scheduling, and utilization.
For terminology and background on Longhorn releases, see [Releases](https://github.com/longhorn/longhorn#releases).
> [!WARNING]
>
> ## Hotfix
>
> The `longhorn-instance-manager:v1.11.0` image is affected by a [regression issue](https://github.com/longhorn/longhorn/issues/12573) introduced by the new longhorn-instance-manager Proxy service APIs. The bug causes Proxy connection leaks in the longhorn-instance-manager pods, resulting in increased memory usage. To mitigate this issue, replace `longhornio/longhorn-instance-manager:v1.11.0` with the hotfixed image `longhornio/longhorn-instance-manager:v1.11.0-hotfix-1`.
>
> You can apply the update by following these steps:
>
> 1. **Update the `longhorn-instance-manager` image**
>
> - Change the longhorn-instance-manager image tag from `v1.11.0` to `v1.11.0-hotfix-1` in the appropriate file:
> - For Helm: Update `values.yaml`
> - For manifests: Update the deployment manifest directly.
>
> 2. **Proceed with the upgrade**
>
> - Apply the changes using your standard Helm upgrade command or reapply the updated manifest.
## Deprecation
### V2 Backing Image Deprecation
The Backing Image feature for the V2 Data Engine is now deprecated in v1.11.0 and is scheduled for removal in v1.12.0.
Users using V2 volumes for virtual machines are encouraged to adopt the [Containerized Data Importer (CDI)](https://kubevirt.io/user-guide/operations/containerized_data_importer/) for volume population instead.
[GitHub Issue #12237](https://github.com/longhorn/longhorn/issues/12237)
## Primary Highlights
### V2 Data Engine
#### Now in Technical Preview Stage
We are pleased to announce that the V2 Data Engine has officially graduated to the **Technical Preview** stage. This indicates increased stability and feature maturity as we move toward General Availability.
> **Limitation:** While the engine is in Technical Preview, live upgrade is not supported yet. V2 volumes must be detached (offline) before engine upgrade.
#### Support for `ublk` Frontend
Users can now configure `ublk` (Userspace Block Device) as the frontend for V2 Data Engine volumes. This provides a high-performance alternative to the NVMe-oF frontend for environments running Kernel v6.0+.
[GitHub Issue #11039](https://github.com/longhorn/longhorn/issues/11039)
### V1 Data Engine
#### Faster Replica Rebuilding from Multiple Sources
The V1 Data Engine now supports parallel rebuilding. When a replica needs to be rebuilt, the engine can now stream data from multiple healthy replicas simultaneously rather than a single source. This significantly reduces the time required to restore redundancy for volumes containing tons of scattered data chunks.
[GitHub Issue #11331](https://www.google.com/search?q=https://github.com/longhorn/longhorn/issues/11331)
### General
#### Balance-Aware Algorithm Disk Selection For Replica Scheduling
Longhorn improves the disk selection for the replica scheduling by introducing an intelligent `balance-aware` scheduling algorithm, reducing uneven storage usage across nodes and disks.
[GitHub Issue #10512](https://github.com/longhorn/longhorn/issues/10512)
#### Node Disk Health Monitoring
Longhorn now actively monitors the physical health of the underlying disks used for storage by using S.M.A.R.T. data. This allows administrators to identify issues and raise alerts when abnormal SMART metrics are detected, helping prevent failed volumes.
[GitHub Issue #12016](https://github.com/longhorn/longhorn/issues/12016)
#### Share Manager Networking
Users can now configure an extra network interface for the Share Manager to support complex network segmentation requirements.
[GitHub Issue #10269](https://github.com/longhorn/longhorn/issues/10269)
#### ReadWriteOncePod (RWOP) Support
Full support for the Kubernetes `ReadWriteOncePod` access mode has been added.
[GitHub Issue #9727](https://github.com/longhorn/longhorn/issues/9727)
#### StorageClass `allowedTopologies` Support
Administrators can now use the `allowedTopologies` field in Longhorn StorageClasses to restrict volume provisioning to specific zones, regions, or nodes within the cluster.
[GitHub Issue #12261](https://github.com/longhorn/longhorn/issues/12261)
## Installation
> [!IMPORTANT]
**Ensure that your cluster is running Kubernetes v1.25 or later before installing Longhorn v1.11.0.**
You can install Longhorn using a variety of tools, including Rancher, Kubectl, and Helm. For more information about installation methods and requirements, see [Quick Installation](https://longhorn.io/docs/1.11.0/deploy/install/) in the Longhorn documentation.
## Upgrade
> [!IMPORTANT]
**Ensure that your cluster is running Kubernetes v1.25 or later before upgrading from Longhorn v1.10.x to v1.11.0.**
Longhorn only allows upgrades from supported versions. For more information about upgrade paths and procedures, see [Upgrade](https://longhorn.io/docs/1.11.0/deploy/upgrade/) in the Longhorn documentation.
## Post-Release Known Issues
For information about issues identified after this release, see [Release-Known-Issues](https://github.com/longhorn/longhorn/wiki/Release-Known-Issues).
## Resolved Issues in this release
### Highlight
- [FEATURE] Add support for ReadWriteOncePod access mode [9727](https://github.com/longhorn/longhorn/issues/9727) - @derekbit @shikanime @chriscchien @Copilot
- [FEATURE] Scale replica rebuilding speed from multiple healthy replicas [11331](https://github.com/longhorn/longhorn/issues/11331) - @derekbit @shuo-wu @roger-ryao @Copilot
- [FEATURE] Support StorageClass allowedTopologies for Longhorn volumes [12261](https://github.com/longhorn/longhorn/issues/12261) - @yangchiu @derekbit @hookak @Copilot
- [FEATURE] Support extra network interface (not only storage network) on the share manager pod [10269](https://github.com/longhorn/longhorn/issues/10269) - @yangchiu @c3y1huang
- [FEATURE] Monitor Node Disk Health [12016](https://github.com/longhorn/longhorn/issues/12016) - @c3y1huang @roger-ryao
- [FEATURE] Replica Auto Balance Across Nodes based on Node Disk Space Consumption [10512](https://github.com/longhorn/longhorn/issues/10512) - @davidcheng0922 @chriscchien
### Feature
- [FEATURE] Guess Linux distro from the package manager [12153](https://github.com/longhorn/longhorn/issues/12153) - @yangchiu @derekbit @NamrathShetty @Copilot
- [FEATURE] Provide a helm chart setting to define the managerUrl [10583](https://github.com/longhorn/longhorn/issues/10583) - @lexfrei @yangchiu
- [FEATURE] Add metric for last backup of a volume [6049](https://github.com/longhorn/longhorn/issues/6049) - @c3y1huang @roger-ryao
- [FEATURE] Real-time volume performance monitoring [368](https://github.com/longhorn/longhorn/issues/368) - @derekbit @hookak
- [UI][FEATURE] Monitor Node Disk Health [12263](https://github.com/longhorn/longhorn/issues/12263) - @houhoucoop @roger-ryao
- [FEATURE] custom annotation/label of UI's k8s service on value.yaml of helm chart [11754](https://github.com/longhorn/longhorn/issues/11754) - @yangchiu @lucasl0st
- [FEATURE] Make `longhornctl` load `ublk_drv` module when kernel version is 6 or newer [11803](https://github.com/longhorn/longhorn/issues/11803) - @chriscchien @bachmanity1
- [BUG] Inherit namespace for longhorn-share-manager in FastFailover mode [12244](https://github.com/longhorn/longhorn/issues/12244) - @yangchiu @semenas
- [FEATURE] Enable CSI pod anti-affinity preset update [12100](https://github.com/longhorn/longhorn/issues/12100) - @yangchiu @yulken
- [FEATURE] [Dependency] aws-sdk-go v1.55.7 is EOL as of 2025-07-31 — plan to migrate to v2? [12098](https://github.com/longhorn/longhorn/issues/12098) - @mantissahz @roger-ryao
- [FEATURE] Change volume operation menu button behaviour from hover to click. [11408](https://github.com/longhorn/longhorn/issues/11408) - @yangchiu @houhoucoop
- [FEATURE] "hard" podAntiAffinity for csi-attacher/csi-provisioner/csi-resizer/csi-snapshotter [11617](https://github.com/longhorn/longhorn/issues/11617) - @yangchiu @yulken
- [FEATURE] node storage scheduled metrics [11949](https://github.com/longhorn/longhorn/issues/11949) - @yangchiu @AoRuiAC
### Improvement
- [IMPROVEMENT] Generalize the offline rebuilding setting for both data engines [12484](https://github.com/longhorn/longhorn/issues/12484) - @mantissahz @chriscchien
- [IMPROVEMENT] Introduce Concurrent Job Limit for Snapshot Operations [11635](https://github.com/longhorn/longhorn/issues/11635) - @yangchiu @derekbit @davidcheng0922 @Copilot
- [IMPROVEMENT] Improve disk error logging to retain errors from newDiskServiceClients() [12446](https://github.com/longhorn/longhorn/issues/12446) - @yangchiu @davidcheng0922
- [IMPROVEMENT] Propagate longhorn-manager's timezone to instance-manager and CSI pods [12448](https://github.com/longhorn/longhorn/issues/12448) - @hookak @roger-ryao
- [UI][FEATURE] Scale replica rebuilding speed from multiple healthy replicas [12461](https://github.com/longhorn/longhorn/issues/12461) - @houhoucoop @roger-ryao
- [IMPROVEMENT] Configure rolling update strategy for longhorn-manager and CSI deployments [12240](https://github.com/longhorn/longhorn/issues/12240) - @hookak @chriscchien
- [IMPROVEMENT] Improve log messages for `rebuildNewReplica()` in longhorn-manager [12426](https://github.com/longhorn/longhorn/issues/12426) - @derekbit @chriscchien
- [IMPROVEMENT] misleading message when instance manager tries to create the pod [11759](https://github.com/longhorn/longhorn/issues/11759) - @mantissahz @chriscchien
- [IMPROVEMENT] To improve the debugging process and UX, it would be nice that the error is recorded in the `instancemanager.status.conditions`. [6732](https://github.com/longhorn/longhorn/issues/6732) - @mantissahz @chriscchien
- [IMPROVEMENT] Add setting to disable node disk health monitoring [12300](https://github.com/longhorn/longhorn/issues/12300) - @derekbit @roger-ryao @Copilot
- [IMPROVEMENT] Avoid repeat engine restart when there are replica unavailable during migration [11397](https://github.com/longhorn/longhorn/issues/11397) - @yangchiu @shuo-wu
- [IMPROVEMENT] [Script] Minor script adjustments from PR #12177 [12187](https://github.com/longhorn/longhorn/issues/12187) - @rauldsl @yangchiu
- [IMPROVEMENT] Check toolchain versions before generate k8s codes [12164](https://github.com/longhorn/longhorn/issues/12164) - @derekbit @roger-ryao
- [IMPROVEMENT] Create Volume UI improvement, Automatically Filter `Data Source` Based on v1 or v2 Selection [11846](https://github.com/longhorn/longhorn/issues/11846) - @yangchiu @houhoucoop
- [IMPROVEMENT] Disable the snapshot of v1 volume hashing while it is being deleted [10294](https://github.com/longhorn/longhorn/issues/10294) - @davidcheng0922 @chriscchien
- [IMPROVEMENT] Expose SPDK UBLK Parameters [11039](https://github.com/longhorn/longhorn/issues/11039) - @derekbit @PhanLe1010 @roger-ryao @Copilot
- [IMPROVEMENT] Check that block device is not in use before creating disk [12078](https://github.com/longhorn/longhorn/issues/12078) - @chriscchien @bachmanity1
- [UI][IMPROVEMENT] Awareness of when an offline replica rebuilding is triggered for an individual volume [11247](https://github.com/longhorn/longhorn/issues/11247) - @houhoucoop @roger-ryao
- [IMPROVEMENT] Ensure synchronized upgrades between longhorn-manager and instance-manager [12309](https://github.com/longhorn/longhorn/issues/12309) - @hookak @chriscchien
- [IMPROVEMENT] Add Resource Limits Configuration for Longhorn manager/instance-manager [12225](https://github.com/longhorn/longhorn/issues/12225) - @hookak @chriscchien
- [IMPROVEMENT] Add Validation Webhook to Volume Expansion When Node Disk Is Full [12134](https://github.com/longhorn/longhorn/issues/12134) - @yangchiu @davidcheng0922
- [UI][IMPROVEMENT] Expose SPDK UBLK Parameters [12166](https://github.com/longhorn/longhorn/issues/12166) - @houhoucoop @roger-ryao
- [IMPROVEMENT] Fix V2 Volume CSI Clone Slowness Caused by VolumeAttachment Webhook Blocking [12328](https://github.com/longhorn/longhorn/issues/12328) - @PhanLe1010 @roger-ryao
- [IMPROVEMENT] Use label-based state in metrics instead of numeric values [10723](https://github.com/longhorn/longhorn/issues/10723) - @hookak @roger-ryao
- [IMPROVEMENT] Add Resource Limits Configuration for CSI Components [12224](https://github.com/longhorn/longhorn/issues/12224) - @yangchiu @hookak @Copilot
- [IMPROVEMENT] Awareness of when an offline replica rebuilding is triggered for an individual volume [11246](https://github.com/longhorn/longhorn/issues/11246) - @yangchiu @mantissahz
- [IMPROVEMENT] Add loadBalancerClass value inside a helm chart for ui service [12273](https://github.com/longhorn/longhorn/issues/12273) - @ehpc @chriscchien
- [IMPROVEMENT] Add DNS round-robin load balancing to the pool of S3 addresses [12296](https://github.com/longhorn/longhorn/issues/12296) - @yangchiu
- [UI][IMPROVEMENT] Should Not Hide the Deleted Snapshots on UI [11620](https://github.com/longhorn/longhorn/issues/11620) - @yangchiu @houhoucoop
- [IMPROVEMENT] Helm chart Multiple TLS FQDNs [12127](https://github.com/longhorn/longhorn/issues/12127) - @yangchiu @hrabalvojta
- [IMPROVEMENT] Removing executables from mirrored-longhornio-longhorn-engine image [11254](https://github.com/longhorn/longhorn/issues/11254) - @derekbit @chriscchien
- [IMPROVEMENT] [DOC] Clarify replica auto-balance behavior for unhealthy and detached volumes [12002](https://github.com/longhorn/longhorn/issues/12002) - @roger-ryao @sushant-suse
- [IMPROVEMENT] CRD enum values [9718](https://github.com/longhorn/longhorn/issues/9718) - @roger-ryao @nzhan126
- [DOC] Troubleshooting KB Articles Fix Typos [12199](https://github.com/longhorn/longhorn/issues/12199) - @jmeza-xyz
- [IMPROVEMENT] Remove backupstore related settings [11026](https://github.com/longhorn/longhorn/issues/11026) - @nzhan126
- [IMPROVEMENT] Reject Trim Operation on Block Volume [12048](https://github.com/longhorn/longhorn/issues/12048) - @yangchiu @derekbit
- [IMPROVEMENT] Replace `github.com/pkg/errors` with `github.com/cockroachdb/errors` [11413](https://github.com/longhorn/longhorn/issues/11413) - @derekbit @chriscchien
- [UI][IMPROVEMENT] UI shows the backing image virtual size [11674](https://github.com/longhorn/longhorn/issues/11674) - @chriscchien @houhoucoop
- [IMPROVEMENT] Simplify locking in unsub and stream methods [12057](https://github.com/longhorn/longhorn/issues/12057) - @derekbit @NamrathShetty
- [UI][IMPROVEMENT] Show Error Message for Unschedulable Disks [11449](https://github.com/longhorn/longhorn/issues/11449) - @yangchiu @houhoucoop
- [IMPROVEMENT] The `auto-delete-pod-when-volume-detached-unexpectedly` should only focus on the Kubernetes builtin workload. [12120](https://github.com/longhorn/longhorn/issues/12120) - @derekbit @chriscchien @sushant-suse
- [IMPROVEMENT] `CSIStorageCapacity` objects must show schedulable (allocatable) capacity [12014](https://github.com/longhorn/longhorn/issues/12014) - @chriscchien @bachmanity1
- [IMPROVEMENT] improve error logging for failed mounting during node publish volume [12025](https://github.com/longhorn/longhorn/issues/12025) - @COLDTURNIP @roger-ryao
- [IMPROVEMENT] Improve Helm Chart defaultSettings handling with automatic quoting and multi-type support [12019](https://github.com/longhorn/longhorn/issues/12019) - @derekbit @chriscchien
- [IMPROVEMENT] volume `spec.backingImage` and `spec.encrypted` shouldn't allow to update for both v1 and v2 data engines [11615](https://github.com/longhorn/longhorn/issues/11615) - @yulken @roger-ryao
### Bug
- [BUG] V2 DR volume failed if backupstore is temporarily unavailable after node reboot [12543](https://github.com/longhorn/longhorn/issues/12543) - @c3y1huang @roger-ryao
- [BUG] SnapshotBack proxy request might be sent to incorrect instance-manager pod [12475](https://github.com/longhorn/longhorn/issues/12475) - @derekbit @chriscchien
- [BUG] Replica rebuild, clone and restore fail, traffic being sent to HTTP proxy [12304](https://github.com/longhorn/longhorn/issues/12304) - @derekbit @chriscchien @roger-ryao
- [BUG] `instance-manager` on nodes that don't have hard or solid state disk DDOSing cluster DNS server with TXT query `_grpc_config.localhost` [12521](https://github.com/longhorn/longhorn/issues/12521) - @COLDTURNIP @chriscchien
- [BUG][v1.11.0-rc3] test_basic.py::test_snapshot fails on v2 data engine [12526](https://github.com/longhorn/longhorn/issues/12526) - @derekbit @chriscchien
- [BUG] RWX volume causes process uninterruptible sleep [11907](https://github.com/longhorn/longhorn/issues/11907) - @COLDTURNIP @chriscchien
- [BUG] Healthy replica could be deleted unexpectedly after reducing volume's number of replicas [12511](https://github.com/longhorn/longhorn/issues/12511) - @yangchiu @shuo-wu
- [BUG] Auto balance feature may lead to volumes falling into a replica deletion-recreation loop [11730](https://github.com/longhorn/longhorn/issues/11730) - @shuo-wu @roger-ryao
- [BUG] Data locality enabled volume fails to remove an existing running replica after numberOfReplicas reduced [12488](https://github.com/longhorn/longhorn/issues/12488) - @derekbit @chriscchien
- [BUG] Single replica volume could get stuck in attaching/detaching loop after the replica node rebooted [9141](https://github.com/longhorn/longhorn/issues/9141) - @COLDTURNIP @yangchiu
- [BUG] v2 volume rebuild performance doesn't improve after enabling snapshot integrity [12416](https://github.com/longhorn/longhorn/issues/12416) - @yangchiu @davidcheng0922
- [BUG] Request Header Or Cookie Too Large in Web UI with OIDC auth [12077](https://github.com/longhorn/longhorn/issues/12077) - @chriscchien @houhoucoop
- [BUG] v1.11.x upgrade test may fail because the default disk of a node is removed during a test case and cannot be re-added [12469](https://github.com/longhorn/longhorn/issues/12469) - @COLDTURNIP @yangchiu
- [BUG] Potential Instance Manager Client Context Leak [12198](https://github.com/longhorn/longhorn/issues/12198) - @derekbit @chriscchien
- [BUG] v2 DR volume becomes faulted during incremental restoration after source volume expansion [12465](https://github.com/longhorn/longhorn/issues/12465) - @yangchiu @davidcheng0922
- [BUG] `rebuildConcurrentSyncLimit` field is omitted from `volume.spec` when value is `0` [12471](https://github.com/longhorn/longhorn/issues/12471) - @derekbit @houhoucoop @roger-ryao
- [BUG] Adding multiple disks to the same node concurrently may occasionally fail [11971](https://github.com/longhorn/longhorn/issues/11971) - @davidcheng0922 @roger-ryao
- [BUG] unknown OS condition in node CR is not properly removed during upgrade [12450](https://github.com/longhorn/longhorn/issues/12450) - @COLDTURNIP @roger-ryao
- [BUG] Longhorn charts does not take care timezone [11965](https://github.com/longhorn/longhorn/issues/11965) - @hookak @roger-ryao
- [BUG] Pod failed to use an activated DR volume, got `UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY` error [12444](https://github.com/longhorn/longhorn/issues/12444) - @yangchiu
- [BUG] v2 volumes do not reuse failed replicas for rebuilding as expected [12413](https://github.com/longhorn/longhorn/issues/12413) - @yangchiu @shuo-wu
- [BUG] v2 volumes complete offline rebuilding with an extra failed replica if a node is rebooted during the rebuild [12407](https://github.com/longhorn/longhorn/issues/12407) - @yangchiu @mantissahz
- [BUG] Test case `test_rebuild_failure_with_intensive_data` is failing because replicas cannot be rebuilt after replica process crashed [12436](https://github.com/longhorn/longhorn/issues/12436) - @yangchiu @shuo-wu
- [BUG] Replica mode becomes empty and replica rebuilding cannot be triggered after upgrading from v1.10.1 to master-head or v1.11.0-rc1 [12431](https://github.com/longhorn/longhorn/issues/12431) - @yangchiu @derekbit
- [BUG] v2 volumes get stuck in `Attaching/Detaching` loop after node reboots [12406](https://github.com/longhorn/longhorn/issues/12406) - @yangchiu @c3y1huang
- [BUG] test_basic.py::test_expansion_basic is flaky on v2 data engine due to revert snapshot fail [12235](https://github.com/longhorn/longhorn/issues/12235) - @davidcheng0922 @chriscchien
- [BUG] Longhorn nodes may fail to recover after node reboots [12422](https://github.com/longhorn/longhorn/issues/12422) - @COLDTURNIP @yangchiu
- [BUG] Missing `Frontend` default value when creating v2 volumes via Longhorn UI [12152](https://github.com/longhorn/longhorn/issues/12152) - @houhoucoop @roger-ryao
- [BUG] setting values are not converted to strings in Longhorn UI [12192](https://github.com/longhorn/longhorn/issues/12192) - @chriscchien @houhoucoop
- [BUG] `disk health information` appears briefly [12415](https://github.com/longhorn/longhorn/issues/12415) - @c3y1huang @roger-ryao
- [BUG] encrypted v2 volume gets stuck in `Attaching/Detaching` loop after volume expansion [12359](https://github.com/longhorn/longhorn/issues/12359) - @yangchiu @davidcheng0922
- [BUG] Unexpected orphaned replica is created after node reboot, preventing new replica from being scheduled on that node, and blocking v2 volume from recovering to healthy state [11333](https://github.com/longhorn/longhorn/issues/11333) - @yangchiu @c3y1huang
- [BUG] RWX volume becomes unavailable after drain node [12226](https://github.com/longhorn/longhorn/issues/12226) - @yangchiu @mantissahz
- [BUG] invalid memory address or nil pointer dereference [11939](https://github.com/longhorn/longhorn/issues/11939) - @bachmanity1 @roger-ryao
- [BUG] share-manager excessive memory usage [11938](https://github.com/longhorn/longhorn/issues/11938) - @derekbit @chriscchien
- [BUG] Encrypted Volume Cannot Be Expanded Online [12366](https://github.com/longhorn/longhorn/issues/12366) - @yangchiu @chriscchien
- [BUG] Backing image download gets stuck after network disconnection [11622](https://github.com/longhorn/longhorn/issues/11622) - @COLDTURNIP @chriscchien
- [BUG] Can not delete the parent of volume head snapshot of a v2 volume [9064](https://github.com/longhorn/longhorn/issues/9064) - @yulken @chriscchien
- [BUG] changing of the volume controller owner caused: BUG: multiple engines detected when volume is detached [1755](https://github.com/longhorn/longhorn/issues/1755) - @PhanLe1010 @chriscchien
- [BUG] mounting error is not properly handled during CSI node publish volume [12006](https://github.com/longhorn/longhorn/issues/12006) - @COLDTURNIP @yangchiu
- [BUG] test_rebuild_after_replica_file_crash failed on master-head [12389](https://github.com/longhorn/longhorn/issues/12389) - @derekbit @chriscchien
- [BUG] `test_backing_image_auto_resync` is flaky due to recent commit [12387](https://github.com/longhorn/longhorn/issues/12387) - @derekbit @chriscchien
- [BUG] Flooding messages `Failed to resolve sysfs path for \"/sys/class/block/root\ ...` in longhorn-manager [12344](https://github.com/longhorn/longhorn/issues/12344) - @c3y1huang @roger-ryao
- [BUG] v2 volumes could fail to auto salvage after cluster restart [11336](https://github.com/longhorn/longhorn/issues/11336) - @yangchiu @c3y1huang
- [BUG] The auo generated backing image pod name is complained by kubelet [12356](https://github.com/longhorn/longhorn/issues/12356) - @COLDTURNIP @yangchiu
- [BUG] `test_restore_inc_with_offline_expansion` fails on v2 data engine [12313](https://github.com/longhorn/longhorn/issues/12313) - @davidcheng0922 @chriscchien
- [BUG] Block disks have a chance become Unschedulable in v2 regression test in test_rebuild_with_restoration [11446](https://github.com/longhorn/longhorn/issues/11446) - @shuo-wu @chriscchien
- [BUG] v2 volume workload FailedMount with message Staging target path `/var/lib/kubelet/plugins/kubernetes.io/csi/driver.longhorn.io/xxx/globalmount is no longer valid` [10476](https://github.com/longhorn/longhorn/issues/10476) - @yangchiu @shuo-wu
- [BUG] [v1.10.0-rc1] v2 DR volume stuck Unhealthy after incremental restore with replica deletion(`test_rebuild_with_inc_restoration`) [11684](https://github.com/longhorn/longhorn/issues/11684) - @c3y1huang @chriscchien
- [BUG] `test_data_locality_strict_local_node_affinity` fails at master-head [12343](https://github.com/longhorn/longhorn/issues/12343) - @derekbit @chriscchien
- [BUG] `tests.test_cloning.test_cloning_basic` fails at msater-head [12341](https://github.com/longhorn/longhorn/issues/12341) - @derekbit @chriscchien @Copilot
- [BUG] v2 volume could get stuck in `Detaching` indefinitely after node reboot [11332](https://github.com/longhorn/longhorn/issues/11332) - @yangchiu @c3y1huang
- [Bug] A cloned volume cannot be attached to a workload [12206](https://github.com/longhorn/longhorn/issues/12206) - @yangchiu @PhanLe1010
- [BUG] Block Mode Volume Migration Stuck [12311](https://github.com/longhorn/longhorn/issues/12311) - @COLDTURNIP @yangchiu @shuo-wu
- [BUG] Replica auto balance disk pressure threshold stalled with stopped volumes [10837](https://github.com/longhorn/longhorn/issues/10837) - @c3y1huang @chriscchien
- [BUG] short name mode is enforcing, but image name longhornio/longhorn-manager:v1.10. │ │ 0 returns ambiguous list [12268](https://github.com/longhorn/longhorn/issues/12268) - @yangchiu @Wqrld
- [BUG] invalid memory address or nil pointer dereference (again) [12233](https://github.com/longhorn/longhorn/issues/12233) - @chriscchien @bachmanity1
- [BUG] Restored v2 volume gets stuck in `RestoreInProgress` state if backup is deleted during restoration [11828](https://github.com/longhorn/longhorn/issues/11828) - @yangchiu @c3y1huang
- [BUG] spdk_tgt is crashed due to SIGSEGV [11698](https://github.com/longhorn/longhorn/issues/11698) - @c3y1huang
- [BUG] Longhorn ignores `Replica Node Level Soft Anti-Affinity` when auto balance is set to `best-effort` [11189](https://github.com/longhorn/longhorn/issues/11189) - @c3y1huang @chriscchien
- [BUG] SPDK NVMe synchronous calls [11096](https://github.com/longhorn/longhorn/issues/11096) -
- [BUG] Replicas accumulate during engine upgrade [12111](https://github.com/longhorn/longhorn/issues/12111) - @c3y1huang @chriscchien
- [BUG] Some default settings in questions.yaml are placed incorrectly. [12219](https://github.com/longhorn/longhorn/issues/12219) - @derekbit @roger-ryao
- [BUG] Chart does not handle defaultSettings.taintToleration with a trailing colon [12162](https://github.com/longhorn/longhorn/issues/12162) - @derekbit @chriscchien
- [BUG] Fix SPDK v25.05 CVE issue [11969](https://github.com/longhorn/longhorn/issues/11969) - @derekbit @roger-ryao
- [BUG] Potential BackingImageManagerClient Connection and Context Leak [12194](https://github.com/longhorn/longhorn/issues/12194) - @derekbit @chriscchien
- [BUG] Instance manager pod `awsIAMRoleArn` annotation disappearing [9923](https://github.com/longhorn/longhorn/issues/9923) - @yangchiu @mantissahz
- [BUG] Node block-type disk is unable to unbind after Longhorn uninstall [9127](https://github.com/longhorn/longhorn/issues/9127) - @yangchiu @davidcheng0922
- [BUG] longhorn-manager fails to start after upgrading from 1.9.2 to 1.10.0 [11864](https://github.com/longhorn/longhorn/issues/11864) - @derekbit @roger-ryao
- [BUG][UI] When creating volume/backing image, change `Data Engine` will reset `Number of Replicas` [11775](https://github.com/longhorn/longhorn/issues/11775) - @yangchiu @houhoucoop
- [BUG] Backup target metric is broken [12073](https://github.com/longhorn/longhorn/issues/12073) - @mantissahz @roger-ryao
- [BUG] panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 at longhorn-engine/pkg/controller/control.go:218 +0x2de [12081](https://github.com/longhorn/longhorn/issues/12081) - @liyimeng @roger-ryao
- [BUG] Unable to complete uninstallation due to the remaining backuptarget [11934](https://github.com/longhorn/longhorn/issues/11934) - @mantissahz @roger-ryao
- [BUG] NVME disk not found in v2 data engine (failed to find device for BDF) [11903](https://github.com/longhorn/longhorn/issues/11903) - @derekbit @roger-ryao
- [BUG] NPE error during recurring job execution [11925](https://github.com/longhorn/longhorn/issues/11925) - @yangchiu @shuo-wu
- [BUG] v2 volume creation failed on talos nodes [11910](https://github.com/longhorn/longhorn/issues/11910) - @c3y1huang @chriscchien
- [BUG] DR volume gets stuck in `unknown` state if engine image is deleted from the attached node [11995](https://github.com/longhorn/longhorn/issues/11995) - @yangchiu @shuo-wu
- [BUG] Volume gets stuck in `attaching` state if engine image image is not deployed on one of nodes [11994](https://github.com/longhorn/longhorn/issues/11994) - @yangchiu @shuo-wu
- [BUG] Rebooting the volume attached node during a v2 DR volume incremental restoration, the restoration is left incomplete and the activation has no effect [11778](https://github.com/longhorn/longhorn/issues/11778) - @yangchiu @c3y1huang
- [BUG] Unable to detach a v2 volume after labeling `disable-v2-data-engine=true` [11799](https://github.com/longhorn/longhorn/issues/11799) - @yangchiu @mantissahz
- [BUG] `test_system_backup_and_restore` test case failed on master-head [11933](https://github.com/longhorn/longhorn/issues/11933) - @derekbit @chriscchien
- [BUG] Shebang refactor in scripts may cause compatibility issues [11815](https://github.com/longhorn/longhorn/issues/11815) - @NamrathShetty @chriscchien
- [BUG] longhorn-spdk-engine CIs complain that the unit tests successfully hash system created snapshots [11822](https://github.com/longhorn/longhorn/issues/11822) - @yangchiu @shuo-wu
- [BUG] Unable to re-add block-type disks by BDF after re-enable v2 data engine [11860](https://github.com/longhorn/longhorn/issues/11860) - @yangchiu @davidcheng0922
- [BUG] V2 volume stuck in volume attachment (V2 interrupt mode) [11816](https://github.com/longhorn/longhorn/issues/11816) - @c3y1huang
- [BUG] Goroutine leak in instance-manager when using v2 data engine [11959](https://github.com/longhorn/longhorn/issues/11959) - @PhanLe1010 @chriscchien
- [BUG] csi-provisioner silently fails to create CSIStorageCapacity if dataEngine parameter is missing [11906](https://github.com/longhorn/longhorn/issues/11906) - @yangchiu @bachmanity1
- [BUG][v1.8.x] v2 volume stuck at attaching due to stopped replica [10486](https://github.com/longhorn/longhorn/issues/10486) - @chriscchien
- [BUG] longhorn-engine's UI panics [11867](https://github.com/longhorn/longhorn/issues/11867) - @derekbit @chriscchien @Copilot
- [BUG] v2 volume workload gets stuck in `ContainerCreating` or `Unknown` state with `FailedMount` error [10111](https://github.com/longhorn/longhorn/issues/10111) - @yangchiu @shuo-wu
- [BUG] Volume is unable to upgrade if the number of active replicas is larger than `volume.spec.numberOfReplicas` [11825](https://github.com/longhorn/longhorn/issues/11825) - @yangchiu @derekbit
- [BUG] UI fails to deploy when only IPv4 is enabled on nodes with v1.10.0 version [11869](https://github.com/longhorn/longhorn/issues/11869) - @yangchiu @c3y1huang
- [BUG] v2 DR volume fails to auto-reattach when engine image missing on current node [11772](https://github.com/longhorn/longhorn/issues/11772) - @chriscchien
- [BUG] inconsistent behavior of v2 volume after labeling disable-v2-data-engine to the volume attached node and deleting the instance manager [11578](https://github.com/longhorn/longhorn/issues/11578) - @yangchiu
### Misc
- [DOC] Fix Talos install documentation for current versions [12514](https://github.com/longhorn/longhorn/issues/12514) -
- [DOC] Add KB article for the failure of RWX volume detachment [12238](https://github.com/longhorn/longhorn/issues/12238) - @sushant-suse
- [TASK] Fix flaky regression test case `test_recurring_job.py::test_recurring_job_snapshot_cleanup` for v2 data engine [12464](https://github.com/longhorn/longhorn/issues/12464) - @derekbit @chriscchien
- [DOC] Review and Update Ingress Controller Examples for Longhorn UI [12252](https://github.com/longhorn/longhorn/issues/12252) - @yangchiu @sushant-suse
- [DOC] Incorrect longhornctl subcommand [12423](https://github.com/longhorn/longhorn/issues/12423) - @chriscchien @roger-ryao
- [TASK] Update nvme and libnvme to v2.16 and v1.16.1 [12391](https://github.com/longhorn/longhorn/issues/12391) - @derekbit @chriscchien
- [DOC] Disk Aggregation Options [12378](https://github.com/longhorn/longhorn/issues/12378) - @davidcheng0922 @roger-ryao
- [TASK] Deprecate V2 Backing Image Feature [12237](https://github.com/longhorn/longhorn/issues/12237) - @derekbit @chriscchien
- feat(chart): Add Gateway API HTTPRoute support for Longhorn UI [12299](https://github.com/longhorn/longhorn/issues/12299) - @lexfrei @derekbit @chriscchien @Copilot
- [DOC] V2 data engine: delete snapshot after volume-head behaves inconsistently vs v1 [12355](https://github.com/longhorn/longhorn/issues/12355) - @chriscchien @sushant-suse
- [TASK] Revert Base Image bci-base:16.0 to bci-base:15.7 [12354](https://github.com/longhorn/longhorn/issues/12354) - @derekbit @chriscchien
- [DOC] Clarify share-manager image update behavior after system upgrade with attached RWX volumes [12363](https://github.com/longhorn/longhorn/issues/12363) - @derekbit @chriscchien
- [DOC] Clarify expected behavior of old instance manager pods after live engine upgrade [12361](https://github.com/longhorn/longhorn/issues/12361) - @derekbit @chriscchien
- [TASK] Update Longhorn v1.11.0 SPDK to v25.09 [11975](https://github.com/longhorn/longhorn/issues/11975) - @derekbit @chriscchien
- [TASK] Bump Longhorn Component `registry.suse.com/bci/bci-base` to 16.0 [12145](https://github.com/longhorn/longhorn/issues/12145) - @derekbit @chriscchien
- [DOC] Add KB Article: Handling Persistent Replica Failures via Disk Isolation [12242](https://github.com/longhorn/longhorn/issues/12242) - @derekbit @roger-ryao
- [DOC] Document how to permanently enable hugepages [12167](https://github.com/longhorn/longhorn/issues/12167) - @roger-ryao @sushant-suse
- [DOC] Update existing terminologies and add new terminologies [12302](https://github.com/longhorn/longhorn/issues/12302) - @sushant-suse
- [DOC] Add a KB for restoring data from an orphan replica directory [9972](https://github.com/longhorn/longhorn/issues/9972) - @yangchiu @sushant-suse
- [DOC] [UI][IMPROVEMENT] Should Not Hide the Deleted Snapshots on UI #11620 [12214](https://github.com/longhorn/longhorn/issues/12214) - @chriscchien @sushant-suse
- [DOC] Add `Enterprise` Page in Longhorn Official Document [12110](https://github.com/longhorn/longhorn/issues/12110) - @sushant-suse
- [DOC] Update Talos Linux Support with Longhorn [12108](https://github.com/longhorn/longhorn/issues/12108) - @roger-ryao @egrosdou01
- [DOC] [FEATURE] Add support for ReadWriteOncePod access mode [12228](https://github.com/longhorn/longhorn/issues/12228) - @chriscchien
- [DOC] Workaround KB doc for backing image manager disk UUID collision issue [12114](https://github.com/longhorn/longhorn/issues/12114) - @COLDTURNIP @roger-ryao
- [TASK] Remove testing credentials from backup target manifest examples [11076](https://github.com/longhorn/longhorn/issues/11076) - @davidcheng0922 @roger-ryao
- [DOC] Document the Migratable RWX Volume in the Official Document [11277](https://github.com/longhorn/longhorn/issues/11277) - @derekbit @chriscchien @sushant-suse
- [DOC][UI][IMPROVEMENT] Show Error Message for Unschedulable Disks #11449 [12151](https://github.com/longhorn/longhorn/issues/12151) - @yangchiu @sushant-suse
- [TASK] Create a GitHub Action to Update Versions in longhorn/dev-versions [12062](https://github.com/longhorn/longhorn/issues/12062) - @derekbit
- [DOC] Update NFSv4 client installation docs to verify actual NFS version in use [11944](https://github.com/longhorn/longhorn/issues/11944) - @derekbit @chriscchien
- [REFACTOR] SAST checks for UI component [11540](https://github.com/longhorn/longhorn/issues/11540) - @sminux @chriscchien
- [DOC] Update Longhorn README file [10891](https://github.com/longhorn/longhorn/issues/10891) - @divya-mohan0209
- [BUG] Block disk deletion fails without error message [11952](https://github.com/longhorn/longhorn/issues/11952) - @davidcheng0922 @roger-ryao
- [REFACTOR] Remove redundant assignment [11705](https://github.com/longhorn/longhorn/issues/11705) - @jvanz
- [TASK] Remove deprecated instances field and instance type from instance manager CR [5844](https://github.com/longhorn/longhorn/issues/5844) - @derekbit @chriscchien
- [DOC] Update deployment links according to the document version [11847](https://github.com/longhorn/longhorn/issues/11847) - @yulken
## New Contributors
* @ADN182
* @AoRuiAC
* @Henllage-hqb
* @Mmx233
* @NamrathShetty
* @Wqrld
* @adegoodyer
* @ah8ad3
* @boomam
* @brandboat
* @bvankampen
* @danielskowronski
* @davepgreene
* @egrosdou01
* @ehpc
* @enterdv
* @fatihmete
* @hrabalvojta
* @inqode-lars
* @jmeza-xyz
* @jvanz
* @kocmoc1
* @koeberlue
* @lexfrei
* @lucasl0st
* @madeITBelgium
* @marnixbouhuis
* @mattn
* @maximemoreillon
* @mo124121
* @nachtschatt3n
* @rajeshkio
* @rauldsl
* @saimikiry
* @sdre15
* @semenas
* @shikanime
* @sminux
* @zijiren233
## Contributors
Thank you to the following contributors who made this release possible.
> **Note:** Starting from v1.11.0, as long as a GitHub issue is resolved in the current release, the corresponding authors will be listed in this contributor list as well. If there is still a missing, please contact Longhorn team for the update.
- @ADN182
- @AoRuiAC
- @COLDTURNIP
- @DamiaSan
- @Henllage-hqb
- @Mmx233
- @NRCan-LGariepy
- @NamrathShetty
- @PhanLe1010
- @Vicente-Cheng
- @WebberHuang1118
- @Wqrld
- @adegoodyer
- @ah8ad3
- @bachmanity1
- @boomam
- @brandboat
- @bvankampen
- @c3y1huang
- @chriscchien
- @danielskowronski
- @davepgreene
- @davidcheng0922
- @derekbit
- @dhedberg
- @divya-mohan0209
- @egrosdou01
- @ehpc
- @enterdv
- @fatihmete
- @fmunteanu
- @forbesguthrie
- @hoo29
- @hookak
- @houhoucoop
- @hrabalvojta
- @innobead
- @inqode-lars
- @james-munson
- @jmeza-xyz
- @jvanz
- @kocmoc1
- @koeberlue
- @lexfrei
- @liyimeng
- @lucasl0st
- @madeITBelgium
- @mantissahz
- @marnixbouhuis
- @mattn
- @maximemoreillon
- @mcerveny
- @mo124121
- @nachtschatt3n
- @nzhan126
- @rajeshkio
- @rauldsl
- @rebeccazzzz
- @roger-ryao
- @runningman84
- @saimikiry
- @sdre15
- @se
gitextract_q7gmdmv5/
├── .codespellignore
├── .github/
│ ├── CODEOWNERS
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug.yaml
│ │ ├── ci.md
│ │ ├── config.yml
│ │ ├── doc.md
│ │ ├── epic.yaml
│ │ ├── feature.yaml
│ │ ├── fix-cve-issues-for-release.md
│ │ ├── hotfix.md
│ │ ├── improvement.yaml
│ │ ├── infra.md
│ │ ├── performance-benchmark.md
│ │ ├── refactor.md
│ │ ├── regular-tasks-for-feature-release.md
│ │ ├── release.md
│ │ ├── task.md
│ │ └── test.md
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── mergify.yml
│ └── workflows/
│ ├── add-issue-to-projects.yml
│ ├── auto-author-assign.yml
│ ├── backport-pr.yml
│ ├── check-sprint-last-day.py
│ ├── close-issue.yml
│ ├── codespell.yml
│ ├── conventional-commits.yml
│ ├── create-issue.yml
│ ├── create-release-task-issues.yml
│ ├── periodic-issue-sprint-update.yml
│ ├── pr-review-reminder.py
│ ├── pr-review-reminder.yml
│ ├── scan-and-notify-testing-items.py
│ ├── scan-and-notify-testing-items.yml
│ ├── scorecards.yml
│ ├── stale.yaml
│ ├── update-branch-image-tags.yaml
│ ├── update-community-issue.yml
│ ├── update-longhorn-issue.yml
│ ├── validate-yamls.yaml
│ └── wont-fix.yml
├── .gitignore
├── ADOPTERS.md
├── CHANGELOG/
│ ├── CHANGELOG-1.10.0.md
│ ├── CHANGELOG-1.10.1.md
│ ├── CHANGELOG-1.10.2.md
│ ├── CHANGELOG-1.11.0.md
│ ├── CHANGELOG-1.11.1.md
│ ├── CHANGELOG-1.4.0.md
│ ├── CHANGELOG-1.4.1.md
│ ├── CHANGELOG-1.4.2.md
│ ├── CHANGELOG-1.4.3.md
│ ├── CHANGELOG-1.5.0.md
│ ├── CHANGELOG-1.5.1.md
│ ├── CHANGELOG-1.5.2.md
│ ├── CHANGELOG-1.5.3.md
│ ├── CHANGELOG-1.5.4.md
│ ├── CHANGELOG-1.5.5.md
│ ├── CHANGELOG-1.6.0.md
│ ├── CHANGELOG-1.6.1.md
│ ├── CHANGELOG-1.6.2.md
│ ├── CHANGELOG-1.6.3.md
│ ├── CHANGELOG-1.6.4.md
│ ├── CHANGELOG-1.7.0.md
│ ├── CHANGELOG-1.7.1.md
│ ├── CHANGELOG-1.7.2.md
│ ├── CHANGELOG-1.7.3.md
│ ├── CHANGELOG-1.8.0.md
│ ├── CHANGELOG-1.8.1.md
│ ├── CHANGELOG-1.8.2.md
│ ├── CHANGELOG-1.9.0.md
│ ├── CHANGELOG-1.9.1.md
│ └── CHANGELOG-1.9.2.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── MAINTAINERS
├── README.md
├── SECURITY.md
├── chart/
│ ├── .helmignore
│ ├── Chart.yaml
│ ├── README.md
│ ├── README.md.gotmpl
│ ├── app-readme.md
│ ├── ocp-readme.md
│ ├── questions.yaml
│ ├── templates/
│ │ ├── NOTES.txt
│ │ ├── _helpers.tpl
│ │ ├── clusterrole.yaml
│ │ ├── clusterrolebinding.yaml
│ │ ├── crds.yaml
│ │ ├── daemonset-sa.yaml
│ │ ├── default-resource.yaml
│ │ ├── default-setting.yaml
│ │ ├── deployment-driver.yaml
│ │ ├── deployment-ui.yaml
│ │ ├── extra-objects.yaml
│ │ ├── httproute.yaml
│ │ ├── ingress.yaml
│ │ ├── network-policies/
│ │ │ ├── backing-image-data-source-network-policy.yaml
│ │ │ ├── backing-image-manager-network-policy.yaml
│ │ │ ├── instance-manager-networking.yaml
│ │ │ ├── manager-network-policy.yaml
│ │ │ ├── recovery-backend-network-policy.yaml
│ │ │ ├── ui-frontend-network-policy.yaml
│ │ │ └── webhook-network-policy.yaml
│ │ ├── postupgrade-job.yaml
│ │ ├── preupgrade-job.yaml
│ │ ├── priorityclass.yaml
│ │ ├── psp.yaml
│ │ ├── registry-secret.yaml
│ │ ├── role.yaml
│ │ ├── rolebinding.yaml
│ │ ├── serviceaccount.yaml
│ │ ├── servicemonitor.yaml
│ │ ├── services.yaml
│ │ ├── storageclass.yaml
│ │ ├── tls-secrets.yaml
│ │ ├── uninstall-job.yaml
│ │ └── validate-psp-install.yaml
│ └── values.yaml
├── deploy/
│ ├── backupstores/
│ │ ├── README.md
│ │ └── base/
│ │ ├── azurite/
│ │ │ ├── azurite-backupstore.yaml
│ │ │ └── kustomization.yaml
│ │ ├── cifs/
│ │ │ ├── cifs-backupstore.yaml
│ │ │ └── kustomization.yaml
│ │ ├── minio/
│ │ │ ├── kustomization.yaml
│ │ │ └── minio-backupstore.yaml
│ │ └── nfs/
│ │ ├── kustomization.yaml
│ │ └── nfs-backupstore.yaml
│ ├── longhorn-images.txt
│ ├── longhorn-okd.yaml
│ ├── longhorn.yaml
│ ├── podsecuritypolicy.yaml
│ ├── prerequisite/
│ │ ├── longhorn-cifs-installation.yaml
│ │ ├── longhorn-gke-cos-node-agent.yaml
│ │ └── longhorn-iscsi-selinux-workaround.yaml
│ └── upgrade_responder_server/
│ ├── README.md
│ ├── chart-values.yaml
│ └── chart.yaml
├── dev/
│ ├── scale-test/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── sample.sh
│ │ ├── scale-test.py
│ │ └── statefulset.yaml
│ ├── scripts/
│ │ ├── lm-update.sh
│ │ └── update-image-pull-policy.sh
│ └── upgrade-responder/
│ ├── README.md
│ ├── install.sh
│ └── manifests/
│ ├── grafana.yaml
│ └── influxdb.yaml
├── enhancements/
│ ├── 20200319-default-disks-and-node-configuration.md
│ ├── 20200331-replace-filesystem-id-key-in-disk-map.md
│ ├── 20200625-volume-deletion-flows.md
│ ├── 20200701-backupstore-file-locks.md
│ ├── 20200721-refactor-restore-for-rebuild-enabling.md
│ ├── 20200727-add-replica-eviction-support-for-disks-and-nodes.md
│ ├── 20200817-improve-node-failure-handling.md
│ ├── 20200819-keep-a-local-replica-to-engine.md
│ ├── 20200821-add-revision-counter-disable-support.md
│ ├── 20200821-rebuild-replica-with-existing-data.md
│ ├── 20200904-csi-snapshot-support.md
│ ├── 20200909-prometheus-support.md
│ ├── 20201002-allow-recurring-backup-detached-volumes.md
│ ├── 20201020-recover-from-volume-failure-by-delete-and-recreate-the-workload-pod.md
│ ├── 20201106-disk-reconnection.md
│ ├── 20201220-rwx-volume-support.md
│ ├── 20210111-upgrade-engine-automatically.md
│ ├── 20210125-enhanced-cpu-reservation.md
│ ├── 20210216-volume-live-migration.md
│ ├── 20210510-automatic-rebalance-replica.md
│ ├── 20210525-async-pull-backups.md
│ ├── 20210624-label-driven-recurring-job.md
│ ├── 20210701-backing-image.md
│ ├── 20210810-volume-clone.md
│ ├── 20220110-extend-csi-snapshot-to-support-longhorn-snapshot.md
│ ├── 20220317-snapshot-prune.md
│ ├── 20220324-orphaned-data-cleanup.md
│ ├── 20220408-support-kubernetes-ca.md
│ ├── 20220420-longhorn-snapshot-crd.md
│ ├── 20220428-storage-network-through-grpc-proxy.md
│ ├── 20220727-dedicated-recovery-backend-for-rwx-volume-nfs-server.md
│ ├── 20220801-failed-backups-cleanup.md
│ ├── 20220913-longhorn-system-backup-restore.md
│ ├── 20220922-snapshot-checksum-and-bit-rot-detection.md
│ ├── 20221018-record-recurring-jobs-in-the-backup-volume.md
│ ├── 20221024-longhorn-volumeattachment.md
│ ├── 20221024-pv-encryption.md
│ ├── 20221103-filesystem-trim.md
│ ├── 20221109-support-bundle-enhancement.md
│ ├── 20221123-local-volume.md
│ ├── 20221205-concurrent-backup-restore-limit.md
│ ├── 20221213-reimplement-longhorn-engine-with-SPDK.md
│ ├── 20230103-recurring-snapshot-cleanup.md
│ ├── 20230108-improve-backup-and-restore-efficiency-using-multiple-threads-and-compression-methods.md
│ ├── 20230116-smb-cifs-backup-store-support.md
│ ├── 20230303-consolidate-instance-managers.md
│ ├── 20230307-pdb-for-longhon-csi-and-webhook.md
│ ├── 20230309-recurring-filesystem-trim.md
│ ├── 20230315-upgrade-path-enforcement.md
│ ├── 20230417-extend-csi-snapshot-to-support-backingimage.md
│ ├── 20230418-azure-blob-storage-backup-store-support.md
│ ├── 20230420-engine-identity-validation.md
│ ├── 20230420-upgrade-checker-info-collection.md
│ ├── 20230517-set-recurring-job-to-pvc.md
│ ├── 20230523-support-spdk-volumes.md
│ ├── 20230526-volume-backup-policy-for-longhorn-system-backup.md
│ ├── 20230601-forcibly-activate-a-restoring-dr-volume.md
│ ├── 20230616-automatic-offline-replica-rebuild.md
│ ├── 20230619-spdk-engine.md
│ ├── 20230718-disk-anti-affinity.md
│ ├── 20230807-backingimage-backup-support.md
│ ├── 20230809-support-backup-and-restore-for-volumes-with-v2-data-engine.md
│ ├── 20230814-talos-linux-support.md
│ ├── 20230815-engine-upgrade-enforcement.md
│ ├── 20230821-customize-maximum-recurring-job-retain-number.md
│ ├── 20230905-automatically-evict-replicas-while-draining.md
│ ├── 20230905-snapshot-space-management.md
│ ├── 20231204-default-priority-class.md
│ ├── 20231226-support-non-disruptive-volume-related-setting-updates.md
│ ├── 20240108-replica-auto-balance-pressured-disks.md
│ ├── 20240314-recurring-and-manual-full-backup-support.md
│ ├── 20240325-nfs-server-ha.md
│ ├── 20240402-share-manager-scheduling.md
│ ├── 20240423-longhorn-commandline-interface.md
│ ├── 20240426-backing-image-enhancement.md
│ ├── 20240516-pre-pull-images.md
│ ├── 20240522-storage-network-for-rwx-volumes.md
│ ├── 20240612-backing-image-encryption-and-clone-support.md
│ ├── 20240801-delete-backup-in-the-backupstore-asynchronously.md
│ ├── 20240926-multiple-backup-targets-support.md
│ ├── 20241003-improve-pulling-backups-from-the-backup-target.md
│ ├── 20241028-auto-salvage-support-for-v2-volumes.md
│ ├── 20241111-rwx-resize.md
│ ├── 20241203-v2-backing-image-support.md
│ ├── 20241206-v2-volume-live-migration.md
│ ├── 20250107-v2-volume-encryption.md
│ ├── 20250313-ublk-frontend-for-v2-engine.md
│ ├── 20250331-orphaned-runtime-cleanup.md
│ ├── 20250407-volume-offline-rebuilding.md
│ ├── 20250508-v2-volume-cloning.md
│ ├── 20250701-configurable-backup-block-size.md
│ ├── 20250721-v2-engine-interrupt-mode.md
│ ├── 20250721-v2-volume-expansion.md
│ ├── 20250721-volume-offline-rebuilding-with-resource-awareness.md
│ ├── 20251001-replica-balance-scheduling.md
│ ├── 20251017-rwx-volume-endpoint-network.md
│ ├── 20251119-snapshot-heavy-task-concurrency-control.md
│ └── YYYYMMDD-template.md
├── examples/
│ ├── block/
│ │ ├── block_volume.yaml
│ │ └── crypto/
│ │ ├── deployment_with_pvc.yaml
│ │ ├── secret-crypto-global.yaml
│ │ └── storageclass-crypto-global.yaml
│ ├── crypto/
│ │ ├── secret-crypto-customized-rhel-FIPS-enabled.yaml
│ │ ├── secret-crypto-customized.yaml
│ │ ├── secret-crypto-global.yaml
│ │ ├── storageclass-crypto-global.yaml
│ │ ├── storageclass-crypto-per-volume-dedicated-namespace.yaml
│ │ └── storageclass-crypto-per-volume.yaml
│ ├── csi/
│ │ └── example_pv.yaml
│ ├── data_migration.yaml
│ ├── deployment.yaml
│ ├── network-policy/
│ │ ├── backing-image-data-source-network-policy.yaml
│ │ ├── backing-image-manager-network-policy.yaml
│ │ ├── instance-manager-networking.yaml
│ │ ├── manager-network-policy.yaml
│ │ ├── recovery-backend-network-policy.yaml
│ │ ├── ui-network-policy.yaml
│ │ └── webhook-network-policy.yaml
│ ├── pod_with_gev.yaml
│ ├── pod_with_pvc.yaml
│ ├── restore_to_file.yaml.template
│ ├── rwx/
│ │ ├── rwx-nginx-deployment.yaml
│ │ └── storageclass-migratable.yaml
│ ├── simple_pod.yaml
│ ├── simple_pvc.yaml
│ ├── snapshot/
│ │ ├── existing_backup.yaml
│ │ ├── restore_existing_backup.yaml
│ │ ├── restore_pvc_snapshot.yaml
│ │ ├── snapshot_existing.yaml
│ │ ├── snapshot_pvc.yaml
│ │ └── snapshotclass.yaml
│ ├── statefulset.yaml
│ ├── storageclass.yaml
│ └── v2/
│ ├── pod_with_pvc.yaml
│ └── storageclass.yaml
├── renovate.json
├── scalability/
│ ├── dev/
│ │ ├── control_plane_grafana_dashboard.json
│ │ └── data-plane-grafana_dashboard.json
│ └── reference-setup-performance-scalability-and-sizing-guidelines/
│ ├── README.md
│ ├── on-prem/
│ │ ├── big-node-spec.md
│ │ └── medium-node-spec.md
│ └── public-cloud/
│ ├── big-node-spec.md
│ └── medium-node-spec.md
├── scripts/
│ ├── generate-backupstore-credentials.sh
│ ├── generate-longhorn-yaml.sh
│ ├── helm-docs.sh
│ ├── lhexec
│ ├── load-images.sh
│ ├── longhorn_rancher_chart_migration.sh
│ ├── migrate-for-pre-070-volumes.sh
│ ├── restore-backup-to-file.sh
│ ├── save-images.sh
│ ├── update-chart-questions.sh
│ ├── update-chart-readme.sh
│ ├── update-chart-values.sh
│ ├── update-manifests-dev-version.sh
│ └── update-uninstall-manifest.py
├── support-versions.txt
└── uninstall/
└── uninstall.yaml
SYMBOL INDEX (28 symbols across 5 files)
FILE: .github/workflows/check-sprint-last-day.py
function get_github_project_info (line 10) | def get_github_project_info(github_token, github_org, github_project):
function get_current_sprint (line 43) | def get_current_sprint(github_token, project_id):
function is_today_is_in_last_day_of_current_sprint (line 95) | def is_today_is_in_last_day_of_current_sprint(github_token, project_id):
FILE: .github/workflows/pr-review-reminder.py
function flatten_issues (line 20) | def flatten_issues(repo, blocks, issues, user_mapping):
function send_slack_notification (line 65) | def send_slack_notification(issues):
function pr_review_reminder (line 105) | def pr_review_reminder():
FILE: .github/workflows/scan-and-notify-testing-items.py
function get_github_project_info (line 12) | def get_github_project_info(github_token, github_org, github_project):
function get_current_sprint (line 46) | def get_current_sprint(github_token, project_id):
function is_today_is_in_last_day_of_current_sprint (line 98) | def is_today_is_in_last_day_of_current_sprint(github_token, project_id):
function list_issues_in_project (line 110) | def list_issues_in_project(github_token, project_id, desired_status=None):
function flatten_issues (line 193) | def flatten_issues(title, blocks, issues, user_mapping):
function send_slack_notification (line 237) | def send_slack_notification(webhook_url, user_mapping,
function scan_and_notify (line 275) | def scan_and_notify(github_org, github_repo, github_project):
FILE: dev/scale-test/scale-test.py
function create_sts_deployment (line 17) | def create_sts_deployment(count):
function create_sts_yaml (line 25) | def create_sts_yaml(index):
function watch_pods_async (line 34) | async def watch_pods_async():
function process_pod_event (line 44) | def process_pod_event(log, event):
function watch_pvc_async (line 54) | async def watch_pvc_async():
function process_pvc_event (line 64) | def process_pvc_event(log, event):
function watch_va_async (line 74) | async def watch_va_async():
function process_va_event (line 84) | def process_va_event(log, event):
FILE: scripts/update-uninstall-manifest.py
class YAMLResourceProcessor (line 6) | class YAMLResourceProcessor:
method __init__ (line 7) | def __init__(self, longhorn_manifest: str, uninstall_file: str):
method load_yaml_documents (line 12) | def load_yaml_documents(self, file_path: Path) -> Iterator[Dict]:
method extract_crd_resources (line 22) | def extract_crd_resources(self) -> List[str]:
method update_cluster_role (line 33) | def update_cluster_role(self, doc: Dict, resources: List[str]) -> Dict:
method process_files (line 41) | def process_files(self) -> None:
function main (line 54) | def main():
Condensed preview — 310 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,015K chars).
[
{
"path": ".codespellignore",
"chars": 20,
"preview": "aks\nec2\neks\ngce\ngcp\n"
},
{
"path": ".github/CODEOWNERS",
"chars": 16,
"preview": "* @longhorn/dev\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug.yaml",
"chars": 2747,
"preview": "name: Bug report\ndescription: Create a bug report\ntitle: \"[BUG] \"\ntype: \"Bug\"\nlabels: [\"kind/bug\", \"require/qa-review-co"
},
{
"path": ".github/ISSUE_TEMPLATE/ci.md",
"chars": 612,
"preview": "---\nname: CI task\nabout: Create a CI task\ntitle: \"[CI] \"\ntype: \"Task\"\nlabels: [\"kind/task\", \"area/ci\"]\nassignees: ''\n\n--"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 232,
"preview": "blank_issues_enabled: false\ncontact_links:\n - name: GitHub Discussions\n url: https://github.com/longhorn/longhorn/di"
},
{
"path": ".github/ISSUE_TEMPLATE/doc.md",
"chars": 347,
"preview": "---\nname: Document\nabout: Create or update document\ntitle: \"[DOC] \"\ntype: \"Doc\"\nlabels: kind/doc\nassignees: ''\n\n---\n\n## "
},
{
"path": ".github/ISSUE_TEMPLATE/epic.yaml",
"chars": 894,
"preview": "name: Epic request\ndescription: Suggest an Epic for grouped features, enhancements or tasks\ntitle: \"[EPIC] \"\ntype: \"Epic"
},
{
"path": ".github/ISSUE_TEMPLATE/feature.yaml",
"chars": 1404,
"preview": "name: Feature request\ndescription: Suggest an idea/feature\ntitle: \"[FEATURE] \"\ntype: \"Feature\"\nlabels: [\"kind/feature\", "
},
{
"path": ".github/ISSUE_TEMPLATE/fix-cve-issues-for-release.md",
"chars": 882,
"preview": "---\nname: Fix CVE Issues for Release\nabout: Security issue fix task for a release\ntitle: \"[RELEASE] Fix CVE Issues for {"
},
{
"path": ".github/ISSUE_TEMPLATE/hotfix.md",
"chars": 842,
"preview": "---\nname: Hotfix\nabout: Create a hotfix task\ntitle: \"[HOTFIX] \"\ntype: \"Task\"\nlabels: [\"kind/hotfix\", \"require/important-"
},
{
"path": ".github/ISSUE_TEMPLATE/improvement.yaml",
"chars": 1426,
"preview": "name: Improvement request\ndescription: Suggest an improvement of an existing feature\ntitle: \"[IMPROVEMENT] \"\ntype: \"Impr"
},
{
"path": ".github/ISSUE_TEMPLATE/infra.md",
"chars": 628,
"preview": "---\nname: Infra\nabout: Create a test/dev infra task\ntitle: \"[INFRA] \"\ntype: \"Task\"\nlabels: [\"kind/task\", \"area/infra\"]\na"
},
{
"path": ".github/ISSUE_TEMPLATE/performance-benchmark.md",
"chars": 846,
"preview": "---\nname: Performance Benchmark\nabout: Performance benchmark task for feature release\ntitle: \"[Benchmark] Performance Be"
},
{
"path": ".github/ISSUE_TEMPLATE/refactor.md",
"chars": 645,
"preview": "---\nname: Refactor task\nabout: Suggest a refactoring request for an existing implementation\ntitle: \"[REFACTOR] \"\ntype: \""
},
{
"path": ".github/ISSUE_TEMPLATE/regular-tasks-for-feature-release.md",
"chars": 1466,
"preview": "---\nname: Regular Tasks for Feature Release\nabout: Regular tasks for a feature release\ntitle: \"[RELEASE] Regular Tasks f"
},
{
"path": ".github/ISSUE_TEMPLATE/release.md",
"chars": 7493,
"preview": "---\nname: Release Task\nabout: Create a release task\ntitle: \"[RELEASE] Release {{ env.RELEASE_VERSION }}\"\ntype: \"Task\"\nla"
},
{
"path": ".github/ISSUE_TEMPLATE/task.md",
"chars": 519,
"preview": "---\nname: Task\nabout: Create a general task\ntitle: \"[TASK] \"\ntype: \"Task\"\nlabels: kind/task\nassignees: ''\n\n---\n\n## What'"
},
{
"path": ".github/ISSUE_TEMPLATE/test.md",
"chars": 552,
"preview": "---\nname: Test\nabout: Create or update test\ntitle: \"[TEST] \"\ntype: \"Test\"\nlabels: kind/test\nassignees: ''\n\n---\n\n## What'"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 420,
"preview": "#### Which issue(s) this PR fixes:\n<!--\nUse `Issue #<issue number>` or `Issue longhorn/longhorn#<issue number>` or `Issu"
},
{
"path": ".github/mergify.yml",
"chars": 749,
"preview": "pull_request_rules:\n- name: Automatically merge PRs\n conditions:\n - check-success=continuous-integration/drone/pr\n - "
},
{
"path": ".github/workflows/add-issue-to-projects.yml",
"chars": 5226,
"preview": "name: \"[Issue Management] Add Issue To Projects\"\n\non:\n issues:\n types: [opened, reopened, milestoned]\n\njobs:\n longh"
},
{
"path": ".github/workflows/auto-author-assign.yml",
"chars": 232,
"preview": "name: \"[PR Management] Auto Author Assign\"\n\non:\n workflow_call:\n pull_request_target:\n types: [ opened, reopened ]\n"
},
{
"path": ".github/workflows/backport-pr.yml",
"chars": 3333,
"preview": "name: \"[Issue Management] Link Backport PR Issue\"\n\non:\n pull_request:\n types: [ opened ]\n branches:\n - master\n"
},
{
"path": ".github/workflows/check-sprint-last-day.py",
"chars": 3681,
"preview": "import requests\nimport os\nimport sys\nfrom datetime import datetime, timedelta\n\n\nGITHUB_GRAPHQL_URL = \"https://api.github"
},
{
"path": ".github/workflows/close-issue.yml",
"chars": 1713,
"preview": "name: \"[Issue Management] Close Issue\"\non:\n issues:\n types: [ unlabeled ]\njobs:\n backport:\n runs-on: ubuntu-late"
},
{
"path": ".github/workflows/codespell.yml",
"chars": 453,
"preview": "name: \"[PR Management] Codespell\"\n\non:\n pull_request:\n branches:\n - master\n - \"v*.*.*\"\n\njobs:\n codespell:\n "
},
{
"path": ".github/workflows/conventional-commits.yml",
"chars": 900,
"preview": "name: \"[PR Management] Conventional PR and Commits\"\n\non:\n pull_request:\n types:\n - opened\n - edited\n "
},
{
"path": ".github/workflows/create-issue.yml",
"chars": 9497,
"preview": "name: \"[Issue Management] Create Backport/Automation/UI Issue\"\non:\n issues:\n types: [ labeled ]\n\nenv:\n LONGHORN_SPR"
},
{
"path": ".github/workflows/create-release-task-issues.yml",
"chars": 3849,
"preview": "name: \"[Release] Create Release Task Issues\"\n\non:\n workflow_dispatch:\n inputs:\n release_version:\n descri"
},
{
"path": ".github/workflows/periodic-issue-sprint-update.yml",
"chars": 3515,
"preview": "name: \"[Issue Management] Periodic Issue Sprint Update\"\n\non:\n schedule:\n # Trigger every Sunday at 20:00\n - cron:"
},
{
"path": ".github/workflows/pr-review-reminder.py",
"chars": 6117,
"preview": "import subprocess\nimport json\nimport os\nimport requests\n\nREPOS = [\"longhorn/longhorn-manager\",\n \"longhorn/longho"
},
{
"path": ".github/workflows/pr-review-reminder.yml",
"chars": 1337,
"preview": "name: \"[Issue Management] Pull Request Review Reminder\"\n\non:\n workflow_dispatch:\n\n schedule:\n # Trigger every Monda"
},
{
"path": ".github/workflows/scan-and-notify-testing-items.py",
"chars": 10137,
"preview": "import requests\nimport os\nimport sys\nimport time\nimport json\nfrom datetime import datetime, timedelta\n\n\nGITHUB_GRAPHQL_U"
},
{
"path": ".github/workflows/scan-and-notify-testing-items.yml",
"chars": 2170,
"preview": "name: \"[Notification] Scan and Notify Testing Items\"\n\non:\n schedule:\n # Trigger every Sunday at 12:00\n - cron: '0"
},
{
"path": ".github/workflows/scorecards.yml",
"chars": 2850,
"preview": "name: \"[Security] Scorecard Supply-Chain Security\"\non:\n # For Branch-Protection check. Only the default branch is suppo"
},
{
"path": ".github/workflows/stale.yaml",
"chars": 1197,
"preview": "name: \"[Issue Management] Close Stale Issues and PRs\"\n\non:\n workflow_call:\n workflow_dispatch:\n schedule:\n - cron: '"
},
{
"path": ".github/workflows/update-branch-image-tags.yaml",
"chars": 4323,
"preview": "name: \"[Release] Update Longhorn Repository Branch Image Tags\"\n\non:\n workflow_dispatch:\n inputs:\n branch:\n "
},
{
"path": ".github/workflows/update-community-issue.yml",
"chars": 6782,
"preview": "name: \"[Issue Management] Update Community Issue Status, Sprint and Milestone\"\non:\n issues:\n types: [labeled, milest"
},
{
"path": ".github/workflows/update-longhorn-issue.yml",
"chars": 5866,
"preview": "name: \"[Issue Management] Update Issue Status in Longhorn Sprint Project\"\n\non:\n issues:\n types: [labeled, milestoned"
},
{
"path": ".github/workflows/validate-yamls.yaml",
"chars": 848,
"preview": "name: \"[PR Management] Validate Longhorn YAMLs\"\n\non:\n pull_request:\n types:\n - opened\n - edited \n - s"
},
{
"path": ".github/workflows/wont-fix.yml",
"chars": 1218,
"preview": "name: \"[Issue Management] Add Wontfix Label To Not-Planned Issue\"\n\non:\n issues:\n types: [closed]\n\njobs:\n add-wontfi"
},
{
"path": ".gitignore",
"chars": 154,
"preview": "# ignores all goland project folders and files\n.idea\n*.iml\n*.ipr\n\n# python venv for dev scripts\n.venv\n/deploy/backupstor"
},
{
"path": "ADOPTERS.md",
"chars": 990,
"preview": "> [!NOTE]\n> \n> To encourage adoption of Longhorn and share your experience with the community, please add your informati"
},
{
"path": "CHANGELOG/CHANGELOG-1.10.0.md",
"chars": 36790,
"preview": "# Longhorn v1.10.0 Release Notes\n\nLonghorn v1.10.0 is a major release focused on improving stability, performance, and t"
},
{
"path": "CHANGELOG/CHANGELOG-1.10.1.md",
"chars": 9475,
"preview": "# Longhorn v1.10.1 Release Notes\n\nLonghorn 1.10.1 introduces several improvements and bug fixes that are intended to imp"
},
{
"path": "CHANGELOG/CHANGELOG-1.10.2.md",
"chars": 9162,
"preview": "# Longhorn v1.10.2 Release Notes\n\nLonghorn 1.10.2 introduces several improvements and bug fixes that are intended to imp"
},
{
"path": "CHANGELOG/CHANGELOG-1.11.0.md",
"chars": 38902,
"preview": "# Longhorn v1.11.0 Release Notes\n\nThe Longhorn team is excited to announce the release of Longhorn v1.11.0. This release"
},
{
"path": "CHANGELOG/CHANGELOG-1.11.1.md",
"chars": 7521,
"preview": "# Longhorn v1.11.1 Release Notes\n\nLonghorn v1.11.1 is a patch release that focuses on critical bug fixes, security harde"
},
{
"path": "CHANGELOG/CHANGELOG-1.4.0.md",
"chars": 36357,
"preview": "## Release Note\n**v1.4.0 released!** 🎆\n\nThis release introduces many enhancements, improvements, and bug fixes as descri"
},
{
"path": "CHANGELOG/CHANGELOG-1.4.1.md",
"chars": 6086,
"preview": "## Release Note\n**v1.4.1 released!** 🎆\n\nThis release introduces improvements and bug fixes as described below about stab"
},
{
"path": "CHANGELOG/CHANGELOG-1.4.2.md",
"chars": 7168,
"preview": "## Release Note\n### **v1.4.2 released!** 🎆\n\nLonghorn v1.4.2 is the latest stable version of Longhorn 1.4.\nIt introduces "
},
{
"path": "CHANGELOG/CHANGELOG-1.4.3.md",
"chars": 4934,
"preview": "## Release Note\n### **v1.4.3 released!** 🎆\n\nLonghorn v1.4.3 is the latest stable version of Longhorn 1.4.\nIt introduces "
},
{
"path": "CHANGELOG/CHANGELOG-1.5.0.md",
"chars": 36868,
"preview": "## Release Note\n### **v1.5.0 released!** 🎆\n\nLonghorn v1.5.0 is the latest version of Longhorn 1.5.\nIt introduces many en"
},
{
"path": "CHANGELOG/CHANGELOG-1.5.1.md",
"chars": 3647,
"preview": "## Release Note\n### **v1.5.1 released!** 🎆\n\nLonghorn v1.5.1 is the latest version of Longhorn 1.5.\nThis release introduc"
},
{
"path": "CHANGELOG/CHANGELOG-1.5.2.md",
"chars": 10321,
"preview": "## Release Note\n\n### **v1.5.2 released!** 🎆\n\nThis release introduces bug fixes and improvements, with the main focus on "
},
{
"path": "CHANGELOG/CHANGELOG-1.5.3.md",
"chars": 2519,
"preview": "## Release Note\n\n### **v1.5.3 released!** 🎆\n\nThis release focuses on resolving a regression issue from v1.5.2 related to"
},
{
"path": "CHANGELOG/CHANGELOG-1.5.4.md",
"chars": 15841,
"preview": "## Longhorn v1.5.4 Release Notes\n\nThis latest stable version of Longhorn 1.5 introduces several improvements and bug fix"
},
{
"path": "CHANGELOG/CHANGELOG-1.5.5.md",
"chars": 5940,
"preview": "## Longhorn v1.5.5 Release Notes\n\nThis latest stable version of Longhorn 1.5 introduces several improvements and bug fix"
},
{
"path": "CHANGELOG/CHANGELOG-1.6.0.md",
"chars": 52829,
"preview": "## Longhorn v1.6.0 Release Notes\n\nThis latest version of Longhorn introduces several features, enhancements, and bug fix"
},
{
"path": "CHANGELOG/CHANGELOG-1.6.1.md",
"chars": 8684,
"preview": "## Longhorn v1.6.1 Release Notes\n\nLonghorn 1.6.1 introduces several improvements and bug fixes that are intended to impr"
},
{
"path": "CHANGELOG/CHANGELOG-1.6.2.md",
"chars": 5732,
"preview": "## Longhorn v1.6.2 Release Notes\n\nLonghorn 1.6.2 introduces several improvements and bug fixes that are intended to impr"
},
{
"path": "CHANGELOG/CHANGELOG-1.6.3.md",
"chars": 11258,
"preview": "## Longhorn v1.6.3 Release Notes\n\nLonghorn 1.6.3 introduces several improvements and bug fixes that are intended to impr"
},
{
"path": "CHANGELOG/CHANGELOG-1.6.4.md",
"chars": 7329,
"preview": "## Longhorn v1.6.4 Release Notes\n\nLonghorn 1.6.4 introduces several improvements and bug fixes that are intended to impr"
},
{
"path": "CHANGELOG/CHANGELOG-1.7.0.md",
"chars": 47981,
"preview": "## Longhorn v1.7.0 Release Notes\n\nThis latest version of Longhorn introduces several features, enhancements, and bug fix"
},
{
"path": "CHANGELOG/CHANGELOG-1.7.1.md",
"chars": 4745,
"preview": "## Longhorn v1.7.1 Release Notes\n\nLonghorn 1.7.1 introduces several improvements and bug fixes that are intended to impr"
},
{
"path": "CHANGELOG/CHANGELOG-1.7.2.md",
"chars": 6293,
"preview": "## Longhorn v1.7.2 Release Notes\n\nLonghorn 1.7.2 introduces several improvements and bug fixes that are intended to impr"
},
{
"path": "CHANGELOG/CHANGELOG-1.7.3.md",
"chars": 10788,
"preview": "## Longhorn v1.7.3 Release Notes\n\nLonghorn 1.7.3 introduces several improvements and bug fixes that are intended to impr"
},
{
"path": "CHANGELOG/CHANGELOG-1.8.0.md",
"chars": 39065,
"preview": "## Longhorn v1.8.0 Release Notes\n\nThis latest version of Longhorn introduces several features, enhancements, and bug fix"
},
{
"path": "CHANGELOG/CHANGELOG-1.8.1.md",
"chars": 7852,
"preview": "## Longhorn v1.8.1 Release Notes\n\nLonghorn 1.8.1 introduces several improvements and bug fixes that are intended to impr"
},
{
"path": "CHANGELOG/CHANGELOG-1.8.2.md",
"chars": 6069,
"preview": "## Longhorn v1.8.2 Release Notes\n\nLonghorn 1.8.2 introduces several improvements and bug fixes that are intended to impr"
},
{
"path": "CHANGELOG/CHANGELOG-1.9.0.md",
"chars": 30322,
"preview": "## Longhorn v1.9.0 Release Notes\n\nLonghorn v1.9.0 introduces new features, enhancements, and bug fixes aimed at improvin"
},
{
"path": "CHANGELOG/CHANGELOG-1.9.1.md",
"chars": 6209,
"preview": "## Longhorn v1.9.1 Release Notes\n\nLonghorn 1.9.1 introduces several improvements and bug fixes that are intended to impr"
},
{
"path": "CHANGELOG/CHANGELOG-1.9.2.md",
"chars": 8436,
"preview": "## Longhorn v1.9.2 Release Notes\n\nLonghorn 1.9.2 introduces several improvements and bug fixes that are intended to impr"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 179,
"preview": "# Longhorn Community Code of Conduct\n\nLonghorn follows the [Cloud Native Computing Foundation Code of Conduct](https://g"
},
{
"path": "CONTRIBUTING.md",
"chars": 3283,
"preview": "# Contributing Guideline\n\nWelcome contributing to Longhorn!\n\nThis guideline applies to all the repositories under Longho"
},
{
"path": "LICENSE",
"chars": 11357,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "MAINTAINERS",
"chars": 432,
"preview": "The list of current Longhorn maintainers:\n\nName, <Email>, @GitHubHandle, Type\nSheng Yang, <sheng@yasker.org>, @yasker, D"
},
{
"path": "README.md",
"chars": 16363,
"preview": "<h1 align=\"center\" style=\"border-bottom: none\">\n <a href=\"https://longhorn.io/\" target=\"_blank\"><img alt=\"Longhorn\" w"
},
{
"path": "SECURITY.md",
"chars": 139,
"preview": "## Report Vulnerabilities\n\nIf any vulnerabilities are found, please report them to [longhorn-security](mailto:longhorn-s"
},
{
"path": "chart/.helmignore",
"chars": 333,
"preview": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation"
},
{
"path": "chart/Chart.yaml",
"chars": 870,
"preview": "apiVersion: v1\nname: longhorn\nversion: 1.9.0-dev\nappVersion: v1.9.0-dev\nkubeVersion: \">=1.25.0-0\"\ndescription: Longhorn "
},
{
"path": "chart/README.md",
"chars": 50694,
"preview": "# Longhorn Chart\n\n> **Important**: Please install the Longhorn chart in the `longhorn-system` namespace only.\n\n> **Warni"
},
{
"path": "chart/README.md.gotmpl",
"chars": 11259,
"preview": "# Longhorn Chart\n\n> **Important**: Please install the Longhorn chart in the `longhorn-system` namespace only.\n\n> **Warni"
},
{
"path": "chart/app-readme.md",
"chars": 793,
"preview": "# Longhorn\n\nLonghorn is a lightweight, reliable and easy to use distributed block storage system for Kubernetes. Once de"
},
{
"path": "chart/ocp-readme.md",
"chars": 6585,
"preview": "# OpenShift / OKD Extra Configuration Steps\n\n- [OpenShift / OKD Extra Configuration Steps](#openshift--okd-extra-configu"
},
{
"path": "chart/questions.yaml",
"chars": 67540,
"preview": "categories:\n - storage\nnamespace: longhorn-system\nquestions:\n - variable: image.defaultImage\n default: 'true'\n d"
},
{
"path": "chart/templates/NOTES.txt",
"chars": 234,
"preview": "Longhorn is now installed on the cluster!\n\nPlease wait a few minutes for other Longhorn components such as CSI deploymen"
},
{
"path": "chart/templates/_helpers.tpl",
"chars": 2567,
"preview": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"longhorn.name\" -}}\n{{- default"
},
{
"path": "chart/templates/clusterrole.yaml",
"chars": 3833,
"preview": "apiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n name: longhorn-role\n labels: {{- include \"longho"
},
{
"path": "chart/templates/clusterrolebinding.yaml",
"chars": 1421,
"preview": "apiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n name: longhorn-bind\n labels: {{- include "
},
{
"path": "chart/templates/crds.yaml",
"chars": 140039,
"preview": "# Generated crds.yaml from github.com/longhorn/longhorn-manager/k8s/pkg/apis and the crds.yaml will be copied to longhor"
},
{
"path": "chart/templates/daemonset-sa.yaml",
"chars": 8504,
"preview": "apiVersion: apps/v1\nkind: DaemonSet\nmetadata:\n labels: {{- include \"longhorn.labels\" . | nindent 4 }}\n app: longhorn"
},
{
"path": "chart/templates/default-resource.yaml",
"chars": 748,
"preview": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: longhorn-default-resource\n namespace: {{ include \"release_namespace\" ."
},
{
"path": "chart/templates/default-setting.yaml",
"chars": 20721,
"preview": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: longhorn-default-setting\n namespace: {{ include \"release_namespace\" . "
},
{
"path": "chart/templates/deployment-driver.yaml",
"chars": 8187,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: longhorn-driver-deployer\n namespace: {{ include \"release_namespa"
},
{
"path": "chart/templates/deployment-ui.yaml",
"chars": 7433,
"preview": "{{- if .Values.openshift.enabled }}\n{{- if .Values.openshift.ui.route }}\n# https://github.com/openshift/oauth-proxy/blob"
},
{
"path": "chart/templates/extra-objects.yaml",
"chars": 74,
"preview": "{{- range .Values.extraObjects }}\n---\n{{- tpl (toYaml . ) $ }}\n{{- end }}\n"
},
{
"path": "chart/templates/httproute.yaml",
"chars": 1116,
"preview": "{{- if .Values.httproute.enabled -}}\napiVersion: gateway.networking.k8s.io/v1\nkind: HTTPRoute\nmetadata:\n name: longhorn"
},
{
"path": "chart/templates/ingress.yaml",
"chars": 1522,
"preview": "{{- if .Values.ingress.enabled }}\napiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: longhorn-ingress\n na"
},
{
"path": "chart/templates/network-policies/backing-image-data-source-network-policy.yaml",
"chars": 696,
"preview": "{{- if .Values.networkPolicies.enabled }}\napiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n name: backing"
},
{
"path": "chart/templates/network-policies/backing-image-manager-network-policy.yaml",
"chars": 688,
"preview": "{{- if .Values.networkPolicies.enabled }}\napiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n name: backing"
},
{
"path": "chart/templates/network-policies/instance-manager-networking.yaml",
"chars": 678,
"preview": "{{- if .Values.networkPolicies.enabled }}\napiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n name: instanc"
},
{
"path": "chart/templates/network-policies/manager-network-policy.yaml",
"chars": 885,
"preview": "{{- if .Values.networkPolicies.enabled }}\napiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n name: longhor"
},
{
"path": "chart/templates/network-policies/recovery-backend-network-policy.yaml",
"chars": 385,
"preview": "{{- if .Values.networkPolicies.enabled }}\napiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n name: longhor"
},
{
"path": "chart/templates/network-policies/ui-frontend-network-policy.yaml",
"chars": 1412,
"preview": "{{- if and .Values.networkPolicies.enabled .Values.ingress.enabled (not (eq .Values.networkPolicies.type \"\")) }}\napiVers"
},
{
"path": "chart/templates/network-policies/webhook-network-policy.yaml",
"chars": 388,
"preview": "{{- if .Values.networkPolicies.enabled }}\napiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n name: longhor"
},
{
"path": "chart/templates/postupgrade-job.yaml",
"chars": 3139,
"preview": "apiVersion: batch/v1\nkind: Job\nmetadata:\n annotations:\n \"helm.sh/hook\": post-upgrade\n \"helm.sh/hook-delete-policy"
},
{
"path": "chart/templates/preupgrade-job.yaml",
"chars": 3308,
"preview": "{{- if and .Values.preUpgradeChecker.jobEnabled .Values.preUpgradeChecker.upgradeVersionCheck}}\napiVersion: batch/v1\nkin"
},
{
"path": "chart/templates/priorityclass.yaml",
"chars": 371,
"preview": "apiVersion: scheduling.k8s.io/v1\nkind: PriorityClass\nmetadata:\n name: \"longhorn-critical\"\n labels: {{- include \"longho"
},
{
"path": "chart/templates/psp.yaml",
"chars": 1406,
"preview": "{{- if .Values.enablePSP }}\napiVersion: policy/v1beta1\nkind: PodSecurityPolicy\nmetadata:\n name: longhorn-psp\n labels: "
},
{
"path": "chart/templates/registry-secret.yaml",
"chars": 559,
"preview": "{{- if .Values.privateRegistry.createSecret }}\n{{- if .Values.privateRegistry.registrySecret }}\n{{- if not (kindIs \"stri"
},
{
"path": "chart/templates/role.yaml",
"chars": 938,
"preview": "apiVersion: rbac.authorization.k8s.io/v1\nkind: Role\nmetadata:\n name: {{ include \"longhorn.name\" . }}\n namespace: {{ in"
},
{
"path": "chart/templates/rolebinding.yaml",
"chars": 373,
"preview": "apiVersion: rbac.authorization.k8s.io/v1\nkind: RoleBinding\nmetadata:\n name: {{ include \"longhorn.name\" . }}\n namespace"
},
{
"path": "chart/templates/serviceaccount.yaml",
"chars": 1243,
"preview": "apiVersion: v1\nkind: ServiceAccount\nmetadata:\n name: longhorn-service-account\n namespace: {{ include \"release_namespac"
},
{
"path": "chart/templates/servicemonitor.yaml",
"chars": 1188,
"preview": "{{- if .Values.metrics.serviceMonitor.enabled -}}\napiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n "
},
{
"path": "chart/templates/services.yaml",
"chars": 790,
"preview": "apiVersion: v1\nkind: Service\nmetadata:\n labels: {{- include \"longhorn.labels\" . | nindent 4 }}\n app: longhorn-admiss"
},
{
"path": "chart/templates/storageclass.yaml",
"chars": 2770,
"preview": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: longhorn-storageclass\n namespace: {{ include \"release_namespace\" . }}\n"
},
{
"path": "chart/templates/tls-secrets.yaml",
"chars": 379,
"preview": "{{- if .Values.ingress.enabled }}\n{{- range .Values.ingress.secrets }}\napiVersion: v1\nkind: Secret\nmetadata:\n name: {{ "
},
{
"path": "chart/templates/uninstall-job.yaml",
"chars": 3144,
"preview": "apiVersion: batch/v1\nkind: Job\nmetadata:\n annotations:\n \"helm.sh/hook\": pre-delete\n \"helm.sh/hook-delete-policy\":"
},
{
"path": "chart/templates/validate-psp-install.yaml",
"chars": 367,
"preview": "#{{- if gt (len (lookup \"rbac.authorization.k8s.io/v1\" \"ClusterRole\" \"\" \"\")) 0 -}}\n#{{- if .Values.enablePSP }}\n#{{- if "
},
{
"path": "chart/values.yaml",
"chars": 44651,
"preview": "# Default values for longhorn.\n# This is a YAML-formatted file.\n# Declare variables to be passed into your templates.\ngl"
},
{
"path": "deploy/backupstores/README.md",
"chars": 4110,
"preview": "# Longhorn Backupstores (Kustomize + Dynamic Credentials)\n\nThis directory provides manifest templates to deploy **test-r"
},
{
"path": "deploy/backupstores/base/azurite/azurite-backupstore.yaml",
"chars": 843,
"preview": "# same secret for longhorn-system namespace\napiVersion: v1\nkind: Secret\nmetadata:\n name: azblob-secret\n namespace: lon"
},
{
"path": "deploy/backupstores/base/azurite/kustomization.yaml",
"chars": 104,
"preview": "apiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\nresources:\n - azurite-backupstore.yaml\n"
},
{
"path": "deploy/backupstores/base/cifs/cifs-backupstore.yaml",
"chars": 1810,
"preview": "apiVersion: v1\nkind: Secret\nmetadata:\n name: cifs-secret\n namespace: longhorn-system\ntype: Opaque\ndata: {}\n---\napiVers"
},
{
"path": "deploy/backupstores/base/cifs/kustomization.yaml",
"chars": 101,
"preview": "apiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\nresources:\n - cifs-backupstore.yaml\n"
},
{
"path": "deploy/backupstores/base/minio/kustomization.yaml",
"chars": 102,
"preview": "apiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\nresources:\n - minio-backupstore.yaml\n"
},
{
"path": "deploy/backupstores/base/minio/minio-backupstore.yaml",
"chars": 1958,
"preview": "apiVersion: v1\nkind: Secret\nmetadata:\n name: minio-secret\n namespace: default\ntype: Opaque\ndata: {}\n---\n# same secret "
},
{
"path": "deploy/backupstores/base/nfs/kustomization.yaml",
"chars": 100,
"preview": "apiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\nresources:\n - nfs-backupstore.yaml\n"
},
{
"path": "deploy/backupstores/base/nfs/nfs-backupstore.yaml",
"chars": 1657,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: longhorn-test-nfs\n namespace: default\n labels:\n app: longhor"
},
{
"path": "deploy/longhorn-images.txt",
"chars": 590,
"preview": "longhornio/backing-image-manager:master-head\nlonghornio/longhorn-engine:master-head\nlonghornio/longhorn-instance-manager"
},
{
"path": "deploy/longhorn-okd.yaml",
"chars": 164522,
"preview": "---\n# Builtin: \"helm template\" does not respect --create-namespace\napiVersion: v1\nkind: Namespace\nmetadata:\n name: long"
},
{
"path": "deploy/longhorn.yaml",
"chars": 161262,
"preview": "---\n# Builtin: \"helm template\" does not respect --create-namespace\napiVersion: v1\nkind: Namespace\nmetadata:\n name: long"
},
{
"path": "deploy/podsecuritypolicy.yaml",
"chars": 1168,
"preview": "apiVersion: policy/v1beta1\nkind: PodSecurityPolicy\nmetadata:\n name: longhorn-psp\nspec:\n privileged: true\n allowPrivil"
},
{
"path": "deploy/prerequisite/longhorn-cifs-installation.yaml",
"chars": 1402,
"preview": "apiVersion: apps/v1\nkind: DaemonSet\nmetadata:\n name: longhorn-cifs-installation\n namespace: longhorn-system\n labels:\n"
},
{
"path": "deploy/prerequisite/longhorn-gke-cos-node-agent.yaml",
"chars": 5202,
"preview": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: longhorn-gke-cos-node-agent-entrypoint\n namespace: longhorn-system\n l"
},
{
"path": "deploy/prerequisite/longhorn-iscsi-selinux-workaround.yaml",
"chars": 1212,
"preview": "apiVersion: apps/v1\nkind: DaemonSet\nmetadata:\n name: longhorn-iscsi-selinux-workaround\n namespace: longhorn-system\n l"
},
{
"path": "deploy/upgrade_responder_server/README.md",
"chars": 434,
"preview": "# Upgrade Responder Helm Chart\n\nThis directory contains the helm values for the Longhorn upgrade responder server.\nThe v"
},
{
"path": "deploy/upgrade_responder_server/chart-values.yaml",
"chars": 14099,
"preview": "# Specify the name of the application that is using this Upgrade Responder server\n# This will be used to create a databa"
},
{
"path": "deploy/upgrade_responder_server/chart.yaml",
"chars": 183,
"preview": "url: https://github.com/longhorn/upgrade-responder.git\ncommit: e16207218faf9203c2bf1270896128781c605599\nreleaseName: lon"
},
{
"path": "dev/scale-test/.gitignore",
"chars": 136,
"preview": "# ignores all goland project folders and files\n.idea\n*.iml\n*.ipr\n\n# ignore output folder\nout\ntmp\nresults\n\n# ignore kubec"
},
{
"path": "dev/scale-test/README.md",
"chars": 1423,
"preview": "## Overview\nscale-test is a collection of developer scripts that are used for scaling a cluster to a certain amount of v"
},
{
"path": "dev/scale-test/sample.sh",
"chars": 705,
"preview": "#!/usr/bin/env bash\n\nrequested=${1:-0}\nnode_count=${2:-1}\nrequired_scale=$((requested / node_count))\n\nnow=$(date)\nready="
},
{
"path": "dev/scale-test/scale-test.py",
"chars": 3735,
"preview": "import sys\nimport asyncio\nimport logging\nfrom pathlib import Path\nfrom kubernetes import client, config, watch\n\nNAMESPAC"
},
{
"path": "dev/scale-test/statefulset.yaml",
"chars": 947,
"preview": "apiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n name: @STS_NAME@\nspec:\n replicas: 0\n serviceName: @STS_NAME@\n selec"
},
{
"path": "dev/scripts/lm-update.sh",
"chars": 1198,
"preview": "#!/usr/bin/env bash\n\n#set -x\nset -e\n\nusername=$1\n\nif [ \"$username\" == \"\" ]\nthen\n\techo DockerHub username is required\n\tex"
},
{
"path": "dev/scripts/update-image-pull-policy.sh",
"chars": 564,
"preview": "#!/usr/bin/env bash\n\nNS=longhorn-system\nKINDS=\"daemonset deployments\"\n\nfunction patch_kind {\n\tkind=$1\n\tlist=$(kubectl -n"
},
{
"path": "dev/upgrade-responder/README.md",
"chars": 1981,
"preview": "## Overview\n\n### Install\n\n1. Install Longhorn.\n1. Install Longhorn [upgrade-responder](https://github.com/longhorn/upgra"
},
{
"path": "dev/upgrade-responder/install.sh",
"chars": 15111,
"preview": "#!/usr/bin/env bash\n\nUPGRADE_RESPONDER_REPO=\"https://github.com/longhorn/upgrade-responder.git\"\nUPGRADE_RESPONDER_REPO_B"
},
{
"path": "dev/upgrade-responder/manifests/grafana.yaml",
"chars": 1869,
"preview": "---\napiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n name: grafana-pvc\nspec:\n accessModes:\n - ReadWriteOnce\n "
},
{
"path": "dev/upgrade-responder/manifests/influxdb.yaml",
"chars": 1824,
"preview": "apiVersion: v1\nkind: Secret\nmetadata:\n name: influxdb-creds\n namespace: default\ntype: Opaque\ndata:\n INFLUXDB_HOST: aW"
},
{
"path": "enhancements/20200319-default-disks-and-node-configuration.md",
"chars": 8244,
"preview": "# Default disks and node configuration\n\n## Summary\n\nThis enhancement allows the user to customize the default disks and "
},
{
"path": "enhancements/20200331-replace-filesystem-id-key-in-disk-map.md",
"chars": 5730,
"preview": "# Replace Filesystem ID key in Disk map\n\n## Summary\n\nThis enhancement will remove the dependency of filesystem ID in the"
},
{
"path": "enhancements/20200625-volume-deletion-flows.md",
"chars": 9883,
"preview": "# Volume Deletion Flows\n\n## Summary\nThis enhancement modifies the flow a user would follow for handling deletion of `Vol"
},
{
"path": "enhancements/20200701-backupstore-file-locks.md",
"chars": 6257,
"preview": "# Backupstore File Locks\n\n## Summary\n\nThis enhancement will address backup issues that are the result of concurrently ru"
},
{
"path": "enhancements/20200721-refactor-restore-for-rebuild-enabling.md",
"chars": 15636,
"preview": "# Refactor restore for rebuild enabling \n\n## Summary\nThis enhancement will refactor the restore implementation and enabl"
},
{
"path": "enhancements/20200727-add-replica-eviction-support-for-disks-and-nodes.md",
"chars": 8666,
"preview": "# Replica Eviction Support for Disks and Nodes\n\n## Summary\nThis enhancement is to simplify and automatically evict the r"
},
{
"path": "enhancements/20200817-improve-node-failure-handling.md",
"chars": 7486,
"preview": "# Improve Node Failure Handling By Automatically Force Delete Terminating Pods of StatefulSet/Deployment On Down Node\n\n"
},
{
"path": "enhancements/20200819-keep-a-local-replica-to-engine.md",
"chars": 14458,
"preview": "# Data Locality - Option To Keep A Local Replica On The Same Node As The Engine\n\n## Summary\n\nA Longhorn volume can be ba"
},
{
"path": "enhancements/20200821-add-revision-counter-disable-support.md",
"chars": 8263,
"preview": "# Add Revision Counter Disable Support\n\n## Summary\n\nThis enhancement adds revision counter disable support globally and "
},
{
"path": "enhancements/20200821-rebuild-replica-with-existing-data.md",
"chars": 8610,
"preview": "# Rebuild replica with existing data\n\n## Summary\nLonghorn could reuse the existing data of failed replicas to speed up r"
},
{
"path": "enhancements/20200904-csi-snapshot-support.md",
"chars": 10055,
"preview": "# CSI Snapshot Support\n\n## Summary\n\nTo allow users to create/restore/delete backups programmatically, \nwe want to add su"
},
{
"path": "enhancements/20200909-prometheus-support.md",
"chars": 16481,
"preview": "# Prometheus Support\n\n## Summary\n\n\nWe currently do not have a way for users to monitor and alert about events happen in "
},
{
"path": "enhancements/20201002-allow-recurring-backup-detached-volumes.md",
"chars": 6566,
"preview": "# Title\n\nAllow Recurring Backup Detached Volumes\n\n## Summary\n\nIn the current Longhorn implementation, users cannot do re"
},
{
"path": "enhancements/20201020-recover-from-volume-failure-by-delete-and-recreate-the-workload-pod.md",
"chars": 5834,
"preview": "# Recover From Volume Failure by Delete and Recreate The Workload Pod\n\n## Summary\n\n[The current implementation](https://"
},
{
"path": "enhancements/20201106-disk-reconnection.md",
"chars": 5805,
"preview": "# Disk Reconnection\n\n## Summary\nWhen disks are reconnected/migrated to other Longhorn nodes, Longhorn should be able to "
},
{
"path": "enhancements/20201220-rwx-volume-support.md",
"chars": 10840,
"preview": "# RWX volume support\n\n## Summary\n\nWe want to natively support RWX volumes, the creation and usage of these rwx volumes s"
},
{
"path": "enhancements/20210111-upgrade-engine-automatically.md",
"chars": 8081,
"preview": "# Upgrade Volume's Engine Image Automatically\n\n## Summary\n\nCurrently, users need to upgrade the engine image manually in"
},
{
"path": "enhancements/20210125-enhanced-cpu-reservation.md",
"chars": 7053,
"preview": "# Enhanced CPU Reservation\n\n## Summary\nTo make sure Longhorn system stable enough, we can apply the node specific CPU re"
},
{
"path": "enhancements/20210216-volume-live-migration.md",
"chars": 10048,
"preview": "# Volume live migration\n\n## Summary\n\nTo enable Harvester to utilize Kubevirts live migration support, we need to allow f"
},
{
"path": "enhancements/20210510-automatic-rebalance-replica.md",
"chars": 19416,
"preview": "# Automatic Replica Rebalance\n\nHave a setting for global and volume-specific settings to enable/disable automatic distri"
},
{
"path": "enhancements/20210525-async-pull-backups.md",
"chars": 29206,
"preview": "# Async Pull/Push Backups From/To The Remote Backup Target\n\n## Summary\n\nCurrently, Longhorn uses a blocking way for comm"
},
{
"path": "enhancements/20210624-label-driven-recurring-job.md",
"chars": 41706,
"preview": "# Label-driven Recurring Job\n\n## Summary\n\nReplace volume spec `recurringJobs` with the label-driven model. Abstract volu"
},
{
"path": "enhancements/20210701-backing-image.md",
"chars": 38639,
"preview": "# Backing Image v2\n\n## Summary\nLonghorn can set a backing image of a Longhorn volume, which is designed for VM usage.\n\n#"
},
{
"path": "enhancements/20210810-volume-clone.md",
"chars": 14169,
"preview": "# Support CSI Volume Cloning\n\n## Summary\n\nWe want to support CSI volume cloning so users can create a new PVC that has i"
},
{
"path": "enhancements/20220110-extend-csi-snapshot-to-support-longhorn-snapshot.md",
"chars": 12649,
"preview": "# Title\n\nExtend CSI snapshot to support Longhorn snapshot\n\n## Summary\n\nBefore this feature, if the user uses [the CSI Sn"
},
{
"path": "enhancements/20220317-snapshot-prune.md",
"chars": 6344,
"preview": "# Snapshot Prune\n\n## Summary\nSnapshot prune is a new snapshot-purge-related operation that helps **reclaim some space** "
},
{
"path": "enhancements/20220324-orphaned-data-cleanup.md",
"chars": 8587,
"preview": "# Orphaned Replica Directory Cleanup\n\n## Summary\n\nOrphaned replica directory cleanup identifies unmanaged replicas on th"
},
{
"path": "enhancements/20220408-support-kubernetes-ca.md",
"chars": 7807,
"preview": "# Support Kubernetes Cluster Autoscaler\n\nLonghorn should support Kubernetes Cluster Autoscaler.\n\n## Summary\n\nCurrently, "
},
{
"path": "enhancements/20220420-longhorn-snapshot-crd.md",
"chars": 10293,
"preview": "\n# Longhorn Snapshot CRD\n\n## Summary\n\nSupporting Longhorn snapshot CRD allows users to query/create/delete volume snapsh"
},
{
"path": "enhancements/20220428-storage-network-through-grpc-proxy.md",
"chars": 13132,
"preview": "# Storage Network Through gRPC Proxy\n\n## Summary\n\nCurrently, Longhorn uses the Kubernetes cluster CNI network and share "
},
{
"path": "enhancements/20220727-dedicated-recovery-backend-for-rwx-volume-nfs-server.md",
"chars": 12543,
"preview": "# Dedicated Recovery Backend for RWX Volume's NFS Server\n\n## Summary\n\nA NFS server located within the share-manager pod "
},
{
"path": "enhancements/20220801-failed-backups-cleanup.md",
"chars": 4766,
"preview": "# Failed Backup Clean Up\n\n## Summary\n\nLonghorn will leave the failed backups behind and will not delete the backups auto"
},
{
"path": "enhancements/20220913-longhorn-system-backup-restore.md",
"chars": 33434,
"preview": "# Longhorn System Backup/Restore\n\n## Summary\n\nThis feature is to support the Longhorn system backup and restore. And als"
},
{
"path": "enhancements/20220922-snapshot-checksum-and-bit-rot-detection.md",
"chars": 13366,
"preview": "# Snapshot Checksum Calculation and Bit Rot Detection\n\n## Summary\n\nLonghorn system supports volume snapshotting and stor"
},
{
"path": "enhancements/20221018-record-recurring-jobs-in-the-backup-volume.md",
"chars": 9737,
"preview": "# Record Recurring Jobs in the Backup Volume\n\n## Summary\n\nProvide a way that users can record recurring jobs/groups duri"
},
{
"path": "enhancements/20221024-longhorn-volumeattachment.md",
"chars": 15097,
"preview": "# Consolidate Volume Attach/Detach Implementation\n\n## Summary\n\nThere are several cases related to (auto) volume attach/d"
},
{
"path": "enhancements/20221024-pv-encryption.md",
"chars": 9531,
"preview": "# Add PV encryption support\n\n## Summary\n\nThis enhancement adds support for user configured (storage class, secrets) encr"
},
{
"path": "enhancements/20221103-filesystem-trim.md",
"chars": 6629,
"preview": "# Filesystem Trim\n\n## Summary\nLonghorn can reclaim disk space by allowing the filesystem to trim/unmap the unused blocks"
},
{
"path": "enhancements/20221109-support-bundle-enhancement.md",
"chars": 20887,
"preview": "# Support Bundle Enhancement\n\n## Summary\n\nThis feature replaces the support bundle mechanism with the general purpose [s"
},
{
"path": "enhancements/20221123-local-volume.md",
"chars": 4156,
"preview": "# Local Volume\n\n## Summary\nLonghorn can support local volume to provide better IO latencies and IOPS.\n\n### Related Issue"
},
{
"path": "enhancements/20221205-concurrent-backup-restore-limit.md",
"chars": 2691,
"preview": "# Concurrent Backup Restore Per Node Limit\n\n## Summary\nLonghorn has no boundary on the number of concurrent volume backu"
},
{
"path": "enhancements/20221213-reimplement-longhorn-engine-with-SPDK.md",
"chars": 17294,
"preview": "# Reimplement Longhorn Engine with SPDK\n\n\n## Summary\n\nThe Storage Performance Development Kit [SPDK](https://spdk.io) pr"
},
{
"path": "enhancements/20230103-recurring-snapshot-cleanup.md",
"chars": 4281,
"preview": "# Recurring Snapshot Cleanup\n## Summary\n\nCurrently, Longhorn's recurring job automatically cleans up older snapshots of "
},
{
"path": "enhancements/20230108-improve-backup-and-restore-efficiency-using-multiple-threads-and-compression-methods.md",
"chars": 8407,
"preview": "# Improve Backup and Restore Efficiency using Multiple Threads and Faster Compression Methods\n\n## Summary\n\nLonghorn is c"
},
{
"path": "enhancements/20230116-smb-cifs-backup-store-support.md",
"chars": 2307,
"preview": "# SMB/CIFS Backup Store Support\n\n## Summary\n\nLonghorn supports SMB/CIFS share as a backup storage.\n\n### Related Issues\n\n"
},
{
"path": "enhancements/20230303-consolidate-instance-managers.md",
"chars": 24548,
"preview": "# Consolidate Longhorn Instance Managers\n\n## Summary\n\nLonghorn architecture includes engine and replica instance manager"
},
{
"path": "enhancements/20230307-pdb-for-longhon-csi-and-webhook.md",
"chars": 4089,
"preview": "# Use PDB to protect Longhorn components from drains\n\n## Summary\n\nSome Longhorn components should be available to correc"
},
{
"path": "enhancements/20230309-recurring-filesystem-trim.md",
"chars": 2457,
"preview": "# Recurring Filesystem Trim\n## Summary\n\nLonghorn currently supports the [filesystem trim](./20221103-filesystem-trim.md)"
},
{
"path": "enhancements/20230315-upgrade-path-enforcement.md",
"chars": 13018,
"preview": "# Upgrade Path Enforcement\n\n## Summary\n\nCurrently, Longhorn does not enforce the upgrade path, even though we claim Long"
}
]
// ... and 110 more files (download for full content)
About this extraction
This page contains the full source code of the longhorn/longhorn GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 310 files (2.8 MB), approximately 740.8k tokens, and a symbol index with 28 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.