Skip to content

Commit b275a2c

Browse files
committed
create cm in case of cluster event instead of secret
1 parent 65e1424 commit b275a2c

File tree

12 files changed

+114
-71
lines changed

12 files changed

+114
-71
lines changed

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -307,8 +307,8 @@ require (
307307

308308
replace (
309309
github.com/argoproj/argo-workflows/v3 v3.5.13 => github.com/devtron-labs/argo-workflows/v3 v3.5.13
310-
github.com/devtron-labs/authenticator => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250519113737-b060cea3a495
311-
github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250519113737-b060cea3a495
310+
github.com/devtron-labs/authenticator => github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250521095739-1196aa26acd3
311+
github.com/devtron-labs/common-lib => github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250522104515-18ca4a361f46
312312
github.com/go-check/check => github.com/go-check/check v0.0.0-20180628173108-788fd7840127
313313
github.com/googleapis/gnostic => github.com/googleapis/gnostic v0.5.5
314314
k8s.io/api => k8s.io/api v0.29.7

go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -829,10 +829,10 @@ github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc h1:VRRKCwnzq
829829
github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
830830
github.com/devtron-labs/argo-workflows/v3 v3.5.13 h1:3pINq0gXOSeTw2z/vYe+j80lRpSN5Rp/8mfQORh8SmU=
831831
github.com/devtron-labs/argo-workflows/v3 v3.5.13/go.mod h1:/vqxcovDPT4zqr4DjR5v7CF8ggpY1l3TSa2CIG3jmjA=
832-
github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250519113737-b060cea3a495 h1:GBe/yfpn5uU3Myv0TV4KBvSLfuwRRjTN7uXAupeUhbk=
833-
github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250519113737-b060cea3a495/go.mod h1:FfaLDXN1ZXxyRpnskBqVIYkpkWDCzBmDgIO9xqLnxdQ=
834-
github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250519113737-b060cea3a495 h1:aEJw3HPicUqpwBIZos5lsiNIuL1c4w5bqadkHyj+dAA=
835-
github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250519113737-b060cea3a495/go.mod h1:CXQGEo+kZc7JPX5hn4jJf1msal9q/ExSdAYGkHNPnQw=
832+
github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250521095739-1196aa26acd3 h1:qf6dFMEGaE8gWkNu7IZx0A2rjycNtW+n7Q96pWA4IxM=
833+
github.com/devtron-labs/devtron-services/authenticator v0.0.0-20250521095739-1196aa26acd3/go.mod h1:FfaLDXN1ZXxyRpnskBqVIYkpkWDCzBmDgIO9xqLnxdQ=
834+
github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250522104515-18ca4a361f46 h1:vVQeIaO2OT0xXTklcXJeQFhDGhs2TimBHYnlBr7/GNY=
835+
github.com/devtron-labs/devtron-services/common-lib v0.0.0-20250522104515-18ca4a361f46/go.mod h1:CXQGEo+kZc7JPX5hn4jJf1msal9q/ExSdAYGkHNPnQw=
836836
github.com/devtron-labs/go-bitbucket v0.9.60-beta h1:VEx1jvDgdtDPS6A1uUFoaEi0l1/oLhbr+90xOwr6sDU=
837837
github.com/devtron-labs/go-bitbucket v0.9.60-beta/go.mod h1:GnuiCesvh8xyHeMCb+twm8lBR/kQzJYSKL28ZfObp1Y=
838838
github.com/devtron-labs/protos v0.0.3-0.20250323220609-ecf8a0f7305e h1:U6UdYbW8a7xn5IzFPd8cywjVVPfutGJCudjePAfL/Hs=

pkg/cluster/ClusterService.go

Lines changed: 18 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@ import (
2222
"fmt"
2323
informerBean "github.com/devtron-labs/common-lib/informer"
2424
"github.com/devtron-labs/common-lib/utils/k8s/commonBean"
25+
bean3 "github.com/devtron-labs/devtron/pkg/argoApplication/bean"
2526
"github.com/devtron-labs/devtron/pkg/cluster/adapter"
2627
"github.com/devtron-labs/devtron/pkg/cluster/bean"
2728
repository2 "github.com/devtron-labs/devtron/pkg/cluster/environment/repository"
29+
"github.com/devtron-labs/devtron/pkg/cluster/helper"
2830
"github.com/devtron-labs/devtron/pkg/cluster/read"
2931
cronUtil "github.com/devtron-labs/devtron/util/cron"
3032
"github.com/robfig/cron/v3"
@@ -227,22 +229,9 @@ func (impl *ClusterServiceImpl) Save(parent context.Context, bean *bean.ClusterB
227229
impl.SyncNsInformer(bean)
228230
}
229231
impl.logger.Info("saving secret for cluster informer")
230-
k8sClient, err := impl.K8sUtil.GetCoreV1ClientInCluster()
231-
if err != nil {
232-
impl.logger.Errorw("error in getting k8s Client in cluster", "err", err, "clusterName", bean.ClusterName)
233-
return bean, nil
234-
}
235-
//creating cluster secret, this secret will be read informer in kubelink to know that a new cluster has been added
236-
secretName := ParseSecretNameForKubelinkInformer(bean.Id)
237-
238-
data := make(map[string][]byte)
239-
data[informerBean.SecretFieldClusterId] = []byte(fmt.Sprintf("%v", bean.Id))
240-
data[informerBean.SecretFieldAction] = []byte(informerBean.ClusterActionAdd)
241-
data[clusterBean.SecretFieldUpdatedOn] = []byte(time.Now().String()) // this field will ensure that informer detects change as other fields can be constant even if cluster config changes
242-
// TODO Asutosh: Why not UPSERT ??
243-
_, err = impl.K8sUtil.CreateSecret(clusterBean.DefaultNamespace, data, secretName, informerBean.ClusterModifyEventSecretType, k8sClient, nil, nil)
244-
if err != nil {
245-
impl.logger.Errorw("error in creating secret for informers", "secretName", secretName, "err", err)
232+
cmData, labels := helper.CreateClusterModifyEventData(bean.Id, informerBean.ClusterActionAdd)
233+
if err = impl.upsertClusterConfigMap(bean, cmData, labels); err != nil {
234+
impl.logger.Errorw("error upserting cluster secret", "cmData", cmData, "err", err)
246235
return bean, nil
247236
}
248237
return bean, nil
@@ -469,42 +458,39 @@ func (impl *ClusterServiceImpl) Update(ctx context.Context, bean *bean.ClusterBe
469458
}
470459
impl.logger.Infow("saving secret for cluster informer")
471460
if bean.HasConfigOrUrlChanged {
472-
data := make(map[string][]byte)
473-
data[informerBean.SecretFieldClusterId] = []byte(fmt.Sprintf("%v", bean.Id))
474-
data[informerBean.SecretFieldAction] = []byte(informerBean.ClusterActionUpdate)
475-
data[clusterBean.SecretFieldUpdatedOn] = []byte(time.Now().String()) // this field will ensure that informer detects change as other fields can be constant even if cluster config changes
476-
if err = impl.upsertClusterSecret(bean, data); err != nil {
477-
impl.logger.Errorw("error upserting cluster secret", "data", data, "err", err)
461+
cmData, labels := helper.CreateClusterModifyEventData(bean.Id, informerBean.ClusterActionUpdate)
462+
if err = impl.upsertClusterConfigMap(bean, cmData, labels); err != nil {
463+
impl.logger.Errorw("error upserting cluster secret", "cmData", cmData, "err", err)
478464
// TODO Asutosh: why error is not propagated ??
479465
return bean, nil
480466
}
481467
}
482468
return bean, nil
483469
}
484470

485-
func (impl *ClusterServiceImpl) upsertClusterSecret(bean *bean.ClusterBean, data map[string][]byte) error {
471+
func (impl *ClusterServiceImpl) upsertClusterConfigMap(bean *bean.ClusterBean, data, labels map[string]string) error {
486472
k8sClient, err := impl.K8sUtil.GetCoreV1ClientInCluster()
487473
if err != nil {
488474
impl.logger.Errorw("error in getting k8s client", "err", err)
489475
return err
490476
}
491-
// below secret will act as an event for informer running on a secret object in kubelink and kubewatch
492-
secretName := ParseSecretNameForKubelinkInformer(bean.Id)
493-
secret, err := impl.K8sUtil.GetSecret(clusterBean.DefaultNamespace, secretName, k8sClient)
477+
// below cm will act as an event for informer running on a secret object in kubelink and kubewatch
478+
cmName := ParseCmNameForK8sInformerOnClusterEvent(bean.Id)
479+
configMap, err := impl.K8sUtil.GetConfigMap(bean3.DevtronCDNamespae, cmName, k8sClient)
494480
if err != nil && !k8sError.IsNotFound(err) {
495-
impl.logger.Errorw("error in getting cluster secret", "secretName", secretName, "err", err)
481+
impl.logger.Errorw("error in getting cluster config map", "cmName", cmName, "err", err)
496482
return err
497483
} else if k8sError.IsNotFound(err) {
498-
_, err = impl.K8sUtil.CreateSecret(clusterBean.DefaultNamespace, data, secretName, informerBean.ClusterModifyEventSecretType, k8sClient, nil, nil)
484+
_, err = impl.K8sUtil.CreateConfigMapObject(bean3.DevtronCDNamespae, data, cmName, k8sClient, labels, nil)
499485
if err != nil {
500-
impl.logger.Errorw("error in creating secret for informers", "secretName", secretName, "err", err)
486+
impl.logger.Errorw("error in creating cm object for informer", "cmName", cmName, "err", err)
501487
return err
502488
}
503489
} else {
504-
secret.Data = data
505-
secret, err = impl.K8sUtil.UpdateSecret(clusterBean.DefaultNamespace, secret, k8sClient)
490+
configMap.Data = data
491+
configMap, err = impl.K8sUtil.UpdateConfigMap(bean3.DevtronCDNamespae, configMap, k8sClient)
506492
if err != nil {
507-
impl.logger.Errorw("error in updating secret for informers", "secretName", secretName, "err", err)
493+
impl.logger.Errorw("error in updating cm for informers", "cmName", cmName, "err", err)
508494
return err
509495
}
510496
}
@@ -602,15 +588,6 @@ func (impl *ClusterServiceImpl) DeleteFromDb(bean *bean.ClusterBean, userId int3
602588
impl.logger.Errorw("error in deleting cluster", "id", bean.Id, "err", err)
603589
return "", err
604590
}
605-
k8sClient, err := impl.K8sUtil.GetCoreV1ClientInCluster()
606-
if err != nil {
607-
impl.logger.Errorw("error in getting in cluster k8s client", "err", err, "clusterName", bean.ClusterName)
608-
return "", nil
609-
}
610-
// TODO Asutosh: why we maintain this duplicate code ??
611-
secretName := ParseSecretNameForKubelinkInformer(bean.Id)
612-
err = impl.K8sUtil.DeleteSecret(clusterBean.DefaultNamespace, secretName, k8sClient)
613-
impl.logger.Errorw("error in deleting secret", "error", err)
614591
return existingCluster.ClusterName, nil
615592
}
616593

pkg/cluster/bean/bean.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,6 @@ type DefaultClusterComponent struct {
8383
}
8484

8585
const (
86-
DefaultNamespace = "default"
87-
SecretFieldUpdatedOn = "updated_on"
86+
DefaultNamespace = "default"
87+
CmFieldUpdatedOn = "updated_on"
8888
)

pkg/cluster/clusterUtil.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ package cluster
33
import "fmt"
44

55
const (
6-
SecretName = "cluster-event"
6+
CmName = "cluster-event"
77
)
88

9-
func ParseSecretNameForKubelinkInformer(clusterId int) string {
10-
return fmt.Sprintf("%s-%d", SecretName, clusterId)
9+
func ParseCmNameForK8sInformerOnClusterEvent(clusterId int) string {
10+
return fmt.Sprintf("%s-%d", CmName, clusterId)
1111
}

pkg/cluster/helper/helper.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package helper
2+
3+
import (
4+
"fmt"
5+
informerBean "github.com/devtron-labs/common-lib/informer"
6+
clusterBean "github.com/devtron-labs/devtron/pkg/cluster/bean"
7+
"time"
8+
)
9+
10+
func CreateClusterModifyEventData(clusterId int, action string) (map[string]string, map[string]string) {
11+
data := make(map[string]string)
12+
data[informerBean.CmFieldClusterId] = fmt.Sprintf("%v", clusterId)
13+
data[informerBean.CmFieldAction] = action
14+
data[clusterBean.CmFieldUpdatedOn] = time.Now().String()
15+
16+
labels := make(map[string]string)
17+
labels[informerBean.ClusterModifyEventSecretTypeKey] = informerBean.ClusterModifyEventSecretType
18+
19+
return data, labels
20+
}

pkg/delete/DeleteService.go

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
dockerRegistryRepository "github.com/devtron-labs/devtron/internal/sql/repository/dockerRegistry"
2323
"github.com/devtron-labs/devtron/internal/util"
2424
"github.com/devtron-labs/devtron/pkg/appStore/installedApp/repository"
25+
bean4 "github.com/devtron-labs/devtron/pkg/argoApplication/bean"
2526
"github.com/devtron-labs/devtron/pkg/chartRepo"
2627
"github.com/devtron-labs/devtron/pkg/cluster"
2728
bean2 "github.com/devtron-labs/devtron/pkg/cluster/bean"
@@ -34,6 +35,7 @@ import (
3435
bean3 "github.com/devtron-labs/devtron/pkg/team/bean"
3536
"github.com/go-pg/pg"
3637
"go.uber.org/zap"
38+
k8sError "k8s.io/apimachinery/pkg/api/errors"
3739
http2 "net/http"
3840
)
3941

@@ -44,7 +46,7 @@ type DeleteService interface {
4446
DeleteChartRepo(deleteRequest *chartRepo.ChartRepoDto) error
4547
DeleteDockerRegistryConfig(deleteRequest *types.DockerArtifactStoreBean) error
4648
CanDeleteChartRegistryPullConfig(storeId string) bool
47-
DeleteClusterSecret(deleteRequest *bean2.ClusterBean, err error) error
49+
DeleteClusterConfigMap(deleteRequest *bean2.ClusterBean, err error) error
4850
}
4951

5052
type DeleteServiceImpl struct {
@@ -91,25 +93,37 @@ func (impl DeleteServiceImpl) DeleteCluster(deleteRequest *bean2.ClusterBean, us
9193
impl.logger.Errorw("error im deleting cluster", "err", err, "deleteRequest", deleteRequest)
9294
return err
9395
}
94-
err = impl.DeleteClusterSecret(deleteRequest, err)
96+
// deleting a cluster config map created at time of cluster creation/updation so that informer in kubelink and kubewatch can delete the cluster from cache
97+
err = impl.DeleteClusterConfigMap(deleteRequest, err)
9598
if err != nil {
96-
impl.logger.Errorw("error in deleting cluster secret", "clusterId", deleteRequest.Id, "error", err)
99+
impl.logger.Errorw("error in deleting cluster cm", "clusterId", deleteRequest.Id, "error", err)
97100
return err
98101
}
99102
impl.k8sInformerFactory.DeleteClusterFromCache(clusterName)
100103
return nil
101104
}
102105

103-
func (impl DeleteServiceImpl) DeleteClusterSecret(deleteRequest *bean2.ClusterBean, err error) error {
106+
func (impl DeleteServiceImpl) DeleteClusterConfigMap(deleteRequest *bean2.ClusterBean, err error) error {
104107
// kubelink informers are listening this secret, deleting this secret will inform kubelink that this cluster is deleted
105108
k8sClient, err := impl.K8sUtil.GetCoreV1ClientInCluster()
106109
if err != nil {
107110
impl.logger.Errorw("error in getting in cluster k8s client", "err", err, "clusterName", deleteRequest.ClusterName)
108111
return nil
109112
}
110-
secretName := cluster.ParseSecretNameForKubelinkInformer(deleteRequest.Id)
111-
err = impl.K8sUtil.DeleteSecret(bean2.DefaultNamespace, secretName, k8sClient)
112-
return err
113+
cmName := cluster.ParseCmNameForK8sInformerOnClusterEvent(deleteRequest.Id)
114+
err = impl.K8sUtil.DeleteConfigMap(bean4.DevtronCDNamespae, cmName, k8sClient)
115+
if k8sError.IsNotFound(err) {
116+
// when cm not found in devtroncd ns then delete the secret in default ns(secret name would be the same as cm name)
117+
err1 := impl.K8sUtil.DeleteSecret(bean2.DefaultNamespace, cmName, k8sClient)
118+
if err1 != nil {
119+
impl.logger.Errorw("error in deleting cluster secret in default ns ", "secretName", cmName, "err", err1)
120+
return err1
121+
}
122+
} else if err != nil {
123+
impl.logger.Errorw("error in deleting cluster config map in devtroncd ns ", "cmName", cmName, "err", err)
124+
return err
125+
}
126+
return nil
113127
}
114128

115129
func (impl DeleteServiceImpl) DeleteEnvironment(deleteRequest *bean.EnvironmentBean, userId int32) error {

pkg/delete/DeleteServiceExtended.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func (impl DeleteServiceExtendedImpl) DeleteCluster(deleteRequest *bean2.Cluster
9696
impl.logger.Errorw("error im deleting cluster", "err", err, "deleteRequest", deleteRequest)
9797
return err
9898
}
99-
err = impl.DeleteClusterSecret(deleteRequest, err)
99+
err = impl.DeleteClusterConfigMap(deleteRequest, err)
100100
if err != nil {
101101
impl.logger.Errorw("error in deleting cluster secret", "clusterId", deleteRequest.Id, "error", err)
102102
return err

vendor/github.com/devtron-labs/common-lib/informer/bean.go

Lines changed: 7 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/devtron-labs/common-lib/utils/k8s/K8sUtil.go

Lines changed: 31 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)