Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
0af4e63
Add cluster overview module with caching, insights, and enhanced cons…
prakash100198 Dec 1, 2025
173b7ee
Add methods for querying environments and teams by time range
prakash100198 Dec 2, 2025
4b94d56
Add `ci_pipeline_type` filter to active CI pipeline count query
prakash100198 Dec 3, 2025
502ebf2
Add `VulnerabilitySummary` and `VulnerabilityListing` APIs to ImageSc…
prakash100198 Dec 12, 2025
1a86ef0
Add migrations and code updates for cost module, Velero integration, …
prakash100198 Dec 12, 2025
f010451
Update module references for authenticator and common-lib dependencies
prakash100198 Dec 12, 2025
f1b31ba
Merge pull request #6891 from devtron-labs/overview-oss-develop-sync
prakash100198 Dec 12, 2025
da9b575
feat: add helm_take_ownership and helm_redeployment_request columns t…
SATYAsasini Dec 12, 2025
f733a1d
feat: Added support for tcp in virtual service and changed the apiVer…
kiranyadv Dec 15, 2025
e47f6b5
cluster overview code
iamayushm Dec 16, 2025
a14238b
fix: update UserDeploymentRequestWithAdditionalFields struct to inclu…
Ash-exp Dec 16, 2025
f428231
feat: Rollout 5.2.0 (#6889)
akshatsinha007 Dec 16, 2025
7bc59db
Merge pull request #6895 from devtron-labs/feat-infra-overview-router
iamayushm Dec 16, 2025
e96e929
Merge branch 'main' into fix/async-helm-deploy
Ash-exp Dec 16, 2025
8bfeec8
Merge pull request #6896 from devtron-labs/fix/async-helm-deploy
Ash-exp Dec 16, 2025
880110d
Merge remote-tracking branch 'origin/main' into chore/main-sync-17-dec
Ash-exp Dec 17, 2025
a7bd0b6
fix: rename SQL migration files for consistency
Ash-exp Dec 17, 2025
d92a857
fix: update dependencies for authenticator and common-lib to latest v…
Ash-exp Dec 17, 2025
4b8eb26
Merge pull request #6897 from devtron-labs/chore/main-sync-17-dec
Ash-exp Dec 17, 2025
1000af5
Merge pull request #6898 from devtron-labs/release-candidate-v0.44.0
Ash-exp Dec 18, 2025
49d6110
fix: migrate proxy chart dependencies and refactor related functions
Ash-exp Dec 23, 2025
f0c18f2
Merge pull request #6899 from devtron-labs/fix/migrate-helm-dependecies
Ash-exp Dec 23, 2025
2b05b0d
release: Devtron 2.0 Release (#6904)
kamal-devtron Dec 31, 2025
ad5e69b
Use `Update` instead of `Save` for upserting `userAudit` entries to p…
prakash100198 Jan 2, 2026
17c5b99
Merge pull request #6906 from devtron-labs/update-user-audit-for-api-…
prakash100198 Jan 2, 2026
f4b0b7f
Refactor vulnerability query implementation and cleanup unused code
prakash100198 Jan 5, 2026
4f35537
Optimize vulnerability summary API by replacing multi-step filtering …
prakash100198 Jan 5, 2026
27f3a75
Merge pull request #6907 from devtron-labs/optimize-vul-summary-oss
prakash100198 Jan 5, 2026
87ba4c2
Replace `Update` with `Save` in `userAudit` handling to avoid upsert …
prakash100198 Jan 7, 2026
ea97e8a
Use `Update` instead of `Save` for `userAudit` and log `ClientIP` in …
prakash100198 Jan 7, 2026
674c535
Refactor `userAudit` handling: replace `saveUserAudit` with `updateUs…
prakash100198 Jan 7, 2026
588ea30
Merge pull request #6908 from devtron-labs/revert-update-api-token
prakash100198 Jan 7, 2026
30fb21f
fix: Handle cluster capacity fetch errors by returning detailed conne…
Ash-exp Jan 19, 2026
20f5fc8
Merge pull request #6912 from devtron-labs/fix/cluster-list-cache
Ash-exp Jan 20, 2026
a0960de
fix: enhance cluster overview response with raw cluster capacity deta…
Ash-exp Jan 21, 2026
1a59006
fix: integrate cluster cache service into K8s capacity handler
Ash-exp Jan 21, 2026
9a8e857
Merge branch 'main' into fix/cluster-cache-list
Ash-exp Jan 21, 2026
29e9b57
Merge pull request #6914 from devtron-labs/fix/cluster-cache-list
Ash-exp Jan 21, 2026
90dfff0
fix: append filtered cluster details to the cluster detail list in ca…
Ash-exp Jan 22, 2026
fcd9b5a
Merge pull request #6915 from devtron-labs/fix/cluster-cache-list
Ash-exp Jan 22, 2026
d2b0d26
fix: prevent exposure of internal-only attributes in API responses an…
Ash-exp Feb 3, 2026
ef5bf60
Merge pull request #6917 from devtron-labs/fix/attributes-exposed
Ash-exp Feb 4, 2026
a118cda
chore: Adds scarf pixel
abhibhaw Feb 6, 2026
59238e8
Merge pull request #6918 from devtron-labs/scarf
abhibhaw Feb 8, 2026
51e82ae
chore: Update README with new platform description and links (#6921)
uxarya-d Feb 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions CHANGELOG/release-notes-v2.0.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
## v2.0.0

## Enhancements
- feat: Rollout 5.2.0 (#6889)
- feat: Added support for tcp in virtual service and changed the apiVersion for externalSecrets (#6892)
- feat: add helm_take_ownership and helm_redeployment_request columns to user_deployment_request table (#6888)
- feat: Revamped Devtron UI with multiple dashboards (#6884)
- feat: Added support to override container name (#6880)
- feat: Increase max length for TeamRequest name field (#6876)
- feat: Added namespace support for virtualService and destinationRule (#6868)
- feat: feature flag for encryption (#6856)
- feat: encryption for db credentials (#6852)
## Bugs
- fix: migrate proxy chart dependencies and refactor related functions (#6899)
- fix: enhance validation and error handling in cluster update process (#6887)
- fix: Invalid type casting error for custom charts (#6883)
- fix: validation on team name (#6872)
- fix: sql injection (#6861)
- fix: user manager fix (#6854)
## Others
- misc: Add support for migrating plugin metadata to parent metadata (#6902)
- misc: update UserDeploymentRequestWithAdditionalFields struct to include tableName for PostgreSQL compatibility (#6896)
- chore: rename SQL migration files for consistency (#6885)
- misc: Vc empty ns fix (#6871)
- misc: added validation on create environment (#6859)
- misc: migration unique constraint on mpc (#6851)
- misc: helm app details API spec (#6850)
- misc: api Spec Added for draft (#6849)
- misc: api Specs added for lock config (#6847)


15 changes: 8 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,27 +1,28 @@
Note: We have restructured the readme. If you are looking for Devtron's CI/CD capabilities, please [click here](#devtron-platform)
#

<img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=40318be7-e780-4186-8959-0078e057dddc" />
<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="./assets/devtron-darkmode-logo.png">
<source media="(prefers-color-scheme: light)" srcset="./assets/devtron-lightmode-logo.png">
<img width="333.333" height="260" src="./assets/devtron-logo-dark-light.png">
</picture>
<h1 align= "center">The Kubernetes Platform That Eliminates Operational Chaos</h1>
<h1 align= "center">AI-Native Kubernetes Management Platform</h1>
<p align= "center">Kubernetes is powerful but complex. Devtron unifies app and infrastructure management with an AI teammate to simplify operations and accelerate delivery.</p>
</p>

<p align="center">
<br>
<a href="https://docs.devtron.ai/" rel="nofollow"><strong>«Explore Documentation»</strong></a> <strong>||</strong>
<a href="https://preview.devtron.ai/dashboard/" rel="nofollow"><strong>«Try Devtron Demo»</strong></a>
<a href="https://docs.devtron.ai/" rel="nofollow"><strong>Explore Documentation</strong></a>
·
<a href="https://license.devtron.ai/dashboard" rel="nofollow"><strong>Try Devtron SaaS</strong></a>
<br>
<br>
<a href="https://devtron.ai/">Website</a>
·
<a href="https://devtron.ai/blog/">Blogs</a>
·
<a href="https://discord.gg/jsRG5qx2gp">Join Discord channel</a>
·
<a href="https://twitter.com/DevtronL">Twitter</a>
.
<a href="https://www.youtube.com/channel/UCAHRp9qp0z1y9MMtQlcFtcw">YouTube</a>

Expand Down Expand Up @@ -123,7 +124,7 @@ The Devtron Platform provides a complete solution for all DevOps requirements, h

With Devtron Platform, you can accelerate your application delivery lifecycle by leveraging advanced features like canary deployments, A/B testing, and automated rollbacks. Devtron Platform helps you achieve faster time-to-market and improved application reliability by simplifying Kubernetes operations and streamlining development workflows.

<p align="center"><img src="./assets/devtron-feat-glance.png"></p>
<p align="center"><img src="./assets/devtron-hero-image.webp"></p>

Devtron deeply integrates with products across the lifecycle of microservices,i.e., CI, CD, security, cost, debugging, and observability via an intuitive web interface and helps you deploy, observe, manage & debug applications across all your Kubernetes clusters.

Expand Down
15 changes: 15 additions & 0 deletions Wire.go
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ import (
"github.com/devtron-labs/devtron/pkg/kubernetesResourceAuditLogs"
repository7 "github.com/devtron-labs/devtron/pkg/kubernetesResourceAuditLogs/repository"
"github.com/devtron-labs/devtron/pkg/notifier"
"github.com/devtron-labs/devtron/pkg/overview"
"github.com/devtron-labs/devtron/pkg/pipeline"
"github.com/devtron-labs/devtron/pkg/pipeline/draftAwareConfigService"
"github.com/devtron-labs/devtron/pkg/pipeline/executors"
Expand Down Expand Up @@ -984,6 +985,20 @@ func InitializeApp() (*App, error) {

acdConfig.NewArgoCDConfigGetter,
wire.Bind(new(acdConfig.ArgoCDConfigGetter), new(*acdConfig.ArgoCDConfigGetterImpl)),

// overview starts
overview.OverviewWireSet,
restHandler.NewOverviewRestHandlerImpl,
wire.Bind(new(restHandler.OverviewRestHandler), new(*restHandler.OverviewRestHandlerImpl)),

router.NewOverviewRouterImpl,
wire.Bind(new(router.OverviewRouter), new(*router.OverviewRouterImpl)),

restHandler.NewInfraOverviewRestHandlerImpl,
wire.Bind(new(restHandler.InfraOverviewRestHandler), new(*restHandler.InfraOverviewRestHandlerImpl)),

router.NewInfraOverviewRouterImpl,
wire.Bind(new(router.InfraOverviewRouter), new(*router.InfraOverviewRouterImpl)),
)
return &App{}, nil
}
106 changes: 79 additions & 27 deletions api/k8s/capacity/k8sCapacityRestHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,13 @@ import (
"errors"
"fmt"
"github.com/devtron-labs/common-lib/utils"
bean2 "github.com/devtron-labs/devtron/pkg/cluster/bean"
clusterBean "github.com/devtron-labs/devtron/pkg/cluster/bean"
"github.com/devtron-labs/devtron/pkg/cluster/environment"
"github.com/devtron-labs/devtron/pkg/cluster/rbac"
"github.com/devtron-labs/devtron/pkg/cluster/read"
bean3 "github.com/devtron-labs/devtron/pkg/k8s/bean"
overviewBean "github.com/devtron-labs/devtron/pkg/overview/bean"
overviewCache "github.com/devtron-labs/devtron/pkg/overview/cache"
"gopkg.in/go-playground/validator.v9"
"net/http"
"strconv"
Expand Down Expand Up @@ -53,15 +55,16 @@ type K8sCapacityRestHandler interface {
EditNodeTaints(w http.ResponseWriter, r *http.Request)
}
type K8sCapacityRestHandlerImpl struct {
logger *zap.SugaredLogger
k8sCapacityService capacity.K8sCapacityService
userService user.UserService
enforcer casbin.Enforcer
clusterService cluster.ClusterService
environmentService environment.EnvironmentService
clusterRbacService rbac.ClusterRbacService
clusterReadService read.ClusterReadService
validator *validator.Validate
logger *zap.SugaredLogger
k8sCapacityService capacity.K8sCapacityService
userService user.UserService
enforcer casbin.Enforcer
clusterService cluster.ClusterService
environmentService environment.EnvironmentService
clusterRbacService rbac.ClusterRbacService
clusterReadService read.ClusterReadService
validator *validator.Validate
clusterCacheService overviewCache.ClusterCacheService
}

func NewK8sCapacityRestHandlerImpl(logger *zap.SugaredLogger,
Expand All @@ -70,17 +73,21 @@ func NewK8sCapacityRestHandlerImpl(logger *zap.SugaredLogger,
clusterService cluster.ClusterService,
environmentService environment.EnvironmentService,
clusterRbacService rbac.ClusterRbacService,
clusterReadService read.ClusterReadService, validator *validator.Validate) *K8sCapacityRestHandlerImpl {
clusterReadService read.ClusterReadService,
validator *validator.Validate,
clusterCacheService overviewCache.ClusterCacheService,
) *K8sCapacityRestHandlerImpl {
return &K8sCapacityRestHandlerImpl{
logger: logger,
k8sCapacityService: k8sCapacityService,
userService: userService,
enforcer: enforcer,
clusterService: clusterService,
environmentService: environmentService,
clusterRbacService: clusterRbacService,
clusterReadService: clusterReadService,
validator: validator,
logger: logger,
k8sCapacityService: k8sCapacityService,
userService: userService,
enforcer: enforcer,
clusterService: clusterService,
environmentService: environmentService,
clusterRbacService: clusterRbacService,
clusterReadService: clusterReadService,
validator: validator,
clusterCacheService: clusterCacheService,
}
}

Expand All @@ -98,7 +105,7 @@ func (handler *K8sCapacityRestHandlerImpl) GetClusterListRaw(w http.ResponseWrit
return
}
// RBAC enforcer applying
var authenticatedClusters []*bean2.ClusterBean
var authenticatedClusters []*clusterBean.ClusterBean
var clusterDetailList []*bean.ClusterCapacityDetail
for _, cluster := range clusters {
authenticated, err := handler.clusterRbacService.CheckAuthorization(cluster.ClusterName, cluster.Id, token, userId, true)
Expand Down Expand Up @@ -140,7 +147,7 @@ func (handler *K8sCapacityRestHandlerImpl) GetClusterListWithDetail(w http.Respo
return
}
// RBAC enforcer applying
var authenticatedClusters []*bean2.ClusterBean
var authenticatedClusters []*clusterBean.ClusterBean
for _, cluster := range clusters {
authenticated, err := handler.clusterRbacService.CheckAuthorization(cluster.ClusterName, cluster.Id, token, userId, true)
if err != nil {
Expand All @@ -156,11 +163,21 @@ func (handler *K8sCapacityRestHandlerImpl) GetClusterListWithDetail(w http.Respo
common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden)
return
}
clusterDetailList, err := handler.k8sCapacityService.GetClusterCapacityDetailList(r.Context(), authenticatedClusters)
if err != nil {
handler.logger.Errorw("error in getting cluster capacity detail list", "err", err)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
// Try to get data from cache if available
var clusterDetailList []*bean.ClusterCapacityDetail
cachedOverview, cacheFound := handler.clusterCacheService.GetClusterOverview()
if cacheFound {
handler.logger.Infow("serving cluster capacity details from cache", "totalClusters", cachedOverview.TotalClusters)
// Convert ClusterOverviewResponse to RawClusterCapacityDetails list and filter by RBAC
clusterDetailList = handler.filterAuthorizedClusterDetails(cachedOverview, authenticatedClusters)
} else {
handler.logger.Infow("cache not available, fetching cluster capacity details from k8s API")
clusterDetailList, err = handler.k8sCapacityService.GetClusterCapacityDetailList(r.Context(), authenticatedClusters)
if err != nil {
handler.logger.Errorw("error in getting cluster capacity detail list", "err", err)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}
}
common.WriteJsonResp(w, nil, clusterDetailList, http.StatusOK)
}
Expand Down Expand Up @@ -473,3 +490,38 @@ func (handler *K8sCapacityRestHandlerImpl) EditNodeTaints(w http.ResponseWriter,
}
common.WriteJsonResp(w, nil, resp, http.StatusOK)
}

// filterAuthorizedClusterDetails converts ClusterOverviewResponse to RawClusterCapacityDetails list
// and filters based on authenticated clusters. It includes:
// 1. Clusters from cache (healthy clusters with capacity data)
// 2. Virtual clusters (from database, not in cache)
// 3. Clusters with connection errors (from database, not in cache)
func (handler *K8sCapacityRestHandlerImpl) filterAuthorizedClusterDetails(
cachedOverview *overviewBean.ClusterOverviewResponse,
authenticatedClusters []*clusterBean.ClusterBean,
) []*bean.ClusterCapacityDetail {
// Create maps for quick lookup
authenticatedClusterIds := make(map[int]bool)
for _, authenticatedCluster := range authenticatedClusters {
authenticatedClusterIds[authenticatedCluster.Id] = true
}

// Authenticated cluster details
clusterDetailList := make([]*bean.ClusterCapacityDetail, 0, len(authenticatedClusters))

// Add clusters from cache
for _, capacityDetail := range cachedOverview.RawClusterCapacityDetails {
// Only include authenticated clusters
if !authenticatedClusterIds[capacityDetail.Id] {
continue
}
clusterDetailList = append(clusterDetailList, capacityDetail)
}

handler.logger.Debugw("converted and filtered cluster details from cache",
"totalCached", len(cachedOverview.RawClusterCapacityDetails),
"authenticated", len(authenticatedClusters),
"converted", len(clusterDetailList))

return clusterDetailList
}
Loading
Loading