Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
113 commits
Select commit Hold shift + click to select a range
c1fd4f8
Api created
ShashwatDadhich Mar 16, 2023
9284b67
Started with ValidateKubeconfig function
ShashwatDadhich Mar 16, 2023
2f7f513
Started with ValidateKubeconfig function
ShashwatDadhich Mar 17, 2023
c3730ed
completed the apis
ShashwatDadhich Mar 21, 2023
62b6c48
validatiion api updated
ShashwatDadhich Mar 21, 2023
e53b947
validatiion errors updated
ShashwatDadhich Mar 21, 2023
ba09282
removed the commented lines
ShashwatDadhich Mar 21, 2023
2332f94
validation message updated
ShashwatDadhich Mar 21, 2023
54c40be
validation message updated
ShashwatDadhich Mar 21, 2023
6d36f1c
save clusters updated
ShashwatDadhich Mar 21, 2023
707821a
validation of cluster already exists added.
ShashwatDadhich Mar 22, 2023
206efca
InsecureSkipTLSVerify logic corrected
ShashwatDadhich Mar 22, 2023
17d4534
Save clusters api updated
ShashwatDadhich Mar 22, 2023
eb43ace
Save cluster api updated
ShashwatDadhich Mar 22, 2023
1159b4f
Save cluster api updated
ShashwatDadhich Mar 22, 2023
71efb96
validate kubeconfig api updated
ShashwatDadhich Mar 22, 2023
c4bdac4
save clusters api updated
ShashwatDadhich Mar 22, 2023
9bbf115
save clusters api updated
ShashwatDadhich Mar 22, 2023
c6d5bd4
updated the RBAC check
ShashwatDadhich Mar 23, 2023
5b0a2e1
added cose to fetch all cluster names
ShashwatDadhich Mar 23, 2023
32911c4
validate and save connection added and checked
ShashwatDadhich Mar 24, 2023
6fb814c
validateClusters updated
ShashwatDadhich Mar 24, 2023
206b446
validateClusters optimized
ShashwatDadhich Mar 24, 2023
8f50553
Merge branch 'main' into kubeconfig
ShashwatDadhich Mar 24, 2023
dff9392
TLS verify added
ShashwatDadhich Mar 26, 2023
eb540a7
TLS verify added
ShashwatDadhich Mar 27, 2023
b256600
TLS verify added
ShashwatDadhich Mar 27, 2023
086bf50
TLS verify added
ShashwatDadhich Mar 27, 2023
903f6b2
TLS verify added
ShashwatDadhich Mar 27, 2023
ab5b45c
TLS verify added
ShashwatDadhich Mar 27, 2023
1b4746d
TLS verify added
ShashwatDadhich Mar 27, 2023
7a7cf0e
TLS verify added
ShashwatDadhich Mar 27, 2023
52a67da
TLS verify added
ShashwatDadhich Mar 27, 2023
55717a6
TLS verify added
ShashwatDadhich Mar 27, 2023
7a8c4a9
TLS verify added
ShashwatDadhich Mar 27, 2023
878a9e4
TLS verify added
ShashwatDadhich Mar 27, 2023
936c5c8
Import Cycle Removed
ShashwatDadhich Mar 27, 2023
50c356a
Api specs updated
ShashwatDadhich Mar 27, 2023
9380529
Code refactoring done
ShashwatDadhich Mar 27, 2023
c9b48b6
Code refactoring done
ShashwatDadhich Mar 27, 2023
c29c2c0
Code refactoring done
ShashwatDadhich Mar 27, 2023
66daf3d
Code refactoring done
ShashwatDadhich Mar 27, 2023
c288f48
Code refactoring done
ShashwatDadhich Mar 27, 2023
d844a40
Code refactoring done
ShashwatDadhich Mar 28, 2023
0a2eefe
Code refactoring done
ShashwatDadhich Mar 28, 2023
599746c
Validation api completed
ShashwatDadhich Mar 28, 2023
1e2113d
Api specs updated
ShashwatDadhich Apr 24, 2023
dcbb692
Api specs updated
ShashwatDadhich Apr 24, 2023
59a741b
merged with main
ShashwatDadhich Apr 26, 2023
df3f96d
removed cluster fields
ShashwatDadhich Apr 26, 2023
8a28acc
error handling done in save multiple clusters
ShashwatDadhich Apr 26, 2023
f528e8a
error handling done in save multiple clusters
ShashwatDadhich Apr 26, 2023
3baf65f
bug fixes
ShashwatDadhich Apr 27, 2023
0d7b028
changes reverted
ShashwatDadhich Apr 27, 2023
a7a4091
checks added
ShashwatDadhich Apr 27, 2023
fc417bc
wire gen file added
ShashwatDadhich Apr 27, 2023
03c2b1d
omitempty removed
ShashwatDadhich May 9, 2023
86b3c80
legacy bug removed
ShashwatDadhich May 9, 2023
c6bca07
merged with main
ShashwatDadhich May 10, 2023
5de60a5
sql script updated
ShashwatDadhich May 10, 2023
792f3c4
Update cluster added
ShashwatDadhich May 11, 2023
23669e5
Merge branch 'main' into kubeconfig
ShashwatDadhich May 11, 2023
052a9ef
solved the PR comments
ShashwatDadhich May 12, 2023
6494fb3
solved the PR comments
ShashwatDadhich May 12, 2023
63b51e5
solved the PR comments
ShashwatDadhich May 12, 2023
be9414c
solved the PR comments
ShashwatDadhich May 12, 2023
d718171
solved the PR comments
ShashwatDadhich May 12, 2023
d726948
bug fix
ShashwatDadhich May 12, 2023
bff7635
review comments incorporated
ShashwatDadhich May 15, 2023
8b2cc67
review comments incorporated
ShashwatDadhich May 15, 2023
cb5e93f
review comments incorporated and wire file changed
ShashwatDadhich May 15, 2023
a81dfcd
review comments incorporated
ShashwatDadhich May 15, 2023
dfeed6f
review comments incorporated
ShashwatDadhich May 15, 2023
d663db2
Merge branch 'main' into kubeconfig
ShashwatDadhich May 15, 2023
04a6dac
sql number changed
ShashwatDadhich May 16, 2023
dd21641
Merge branch 'main' into kubeconfig
ShashwatDadhich May 16, 2023
68705bc
sql number changed
ShashwatDadhich May 16, 2023
4baf68d
sql number changed
ShashwatDadhich May 16, 2023
4f173e9
minor big fix
ShashwatDadhich May 17, 2023
53a46c4
changes reverted
ShashwatDadhich May 17, 2023
0be13f0
changes added
ShashwatDadhich May 17, 2023
0a1918e
minor bug fix
ShashwatDadhich May 18, 2023
bdd73c0
Merge branch 'main' into kubeconfig
ShashwatDadhich May 23, 2023
9e7c958
sql number updated
ShashwatDadhich May 23, 2023
658d668
minor bug fix
ShashwatDadhich May 23, 2023
cea3fe6
minor bug fix
ShashwatDadhich May 23, 2023
229c375
error message changes
ShashwatDadhich May 23, 2023
033be91
insecureSkipTlsVerify stored in database
ShashwatDadhich May 23, 2023
b151e43
bug fix
ShashwatDadhich May 24, 2023
dcb9b8b
bug fix
ShashwatDadhich May 24, 2023
2147fde
go routines bug fix
ShashwatDadhich May 26, 2023
f020f31
bug fix
ShashwatDadhich May 26, 2023
67a1606
bug fix
ShashwatDadhich May 29, 2023
09e4a68
bug fix
ShashwatDadhich May 30, 2023
b9007e3
error message added for edit cluster in case of default clusters.
ShashwatDadhich May 31, 2023
335c720
error message added for edit cluster in case of default clusters.
ShashwatDadhich May 31, 2023
2f4adb1
Merge branch 'main' into kubeconfig
ShashwatDadhich May 31, 2023
31719be
sql number update
ShashwatDadhich May 31, 2023
31128f5
bug fix
ShashwatDadhich May 31, 2023
95ff96c
bug fix
ShashwatDadhich May 31, 2023
b63cc44
bug fix
ShashwatDadhich May 31, 2023
c2e686a
bug fix
ShashwatDadhich May 31, 2023
5116009
code review comments incorporated
ShashwatDadhich Jun 1, 2023
f3e17f1
code review comments incorporated
ShashwatDadhich Jun 1, 2023
d05dfa8
code review comments incorporated
ShashwatDadhich Jun 1, 2023
1ab4135
code review comments incorporated
ShashwatDadhich Jun 1, 2023
3310189
refactor
ShashwatDadhich Jun 1, 2023
77ebed3
merge main
ShashwatDadhich Jun 1, 2023
e6665de
merge main
ShashwatDadhich Jun 1, 2023
92c0583
not passing certificate data in case of insecure false
ShashwatDadhich Jun 2, 2023
35d59f3
constants added
ShashwatDadhich Jun 2, 2023
af465a6
import cycle fix
ShashwatDadhich Jun 2, 2023
a02d121
minor bug fix
ShashwatDadhich Jun 2, 2023
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
12 changes: 8 additions & 4 deletions api/bean/ClusterInfo.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package bean

type ClusterInfo struct {
ClusterId int `json:"clusterId"`
ClusterName string `json:"clusterName"`
BearerToken string `json:"bearerToken"`
ServerUrl string `json:"serverUrl"`
ClusterId int `json:"clusterId"`
ClusterName string `json:"clusterName"`
BearerToken string `json:"bearerToken"`
ServerUrl string `json:"serverUrl"`
InsecureSkipTLSVerify bool `json:"insecureSkipTLSVerify"`
KeyData string `json:"keyData"`
CertData string `json:"certData"`
CAData string `json:"CAData"`
}
137 changes: 137 additions & 0 deletions api/cluster/ClusterRestHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ const CLUSTER_DELETE_SUCCESS_RESP = "Cluster deleted successfully."

type ClusterRestHandler interface {
Save(w http.ResponseWriter, r *http.Request)
SaveClusters(w http.ResponseWriter, r *http.Request)
ValidateKubeconfig(w http.ResponseWriter, r *http.Request)
FindAll(w http.ResponseWriter, r *http.Request)
FindById(w http.ResponseWriter, r *http.Request)
FindNoteByClusterId(w http.ResponseWriter, r *http.Request)
Expand Down Expand Up @@ -92,6 +94,81 @@ func NewClusterRestHandlerImpl(clusterService cluster.ClusterService,
}
}

func (impl ClusterRestHandlerImpl) SaveClusters(w http.ResponseWriter, r *http.Request) {
token := r.Header.Get("token")
decoder := json.NewDecoder(r.Body)
userId, err := impl.userService.GetLoggedInUser(r)
if userId == 0 || err != nil {
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
return
}
beans := []*cluster.ClusterBean{}
err = decoder.Decode(&beans)
if err != nil {
impl.logger.Errorw("request err, Save", "error", err, "payload", beans)
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
return
}
// not logging bean object as it contains sensitive data
impl.logger.Infow("request payload received for save clusters")

// RBAC enforcer applying
isSuperAdmin, err := impl.userService.IsSuperAdmin(int(userId))
if !isSuperAdmin || err != nil {
if err != nil {
impl.logger.Errorw("request err, CheckSuperAdmin", "err", err, "isSuperAdmin", isSuperAdmin)
}
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden)
return
}
//RBAC enforcer Ends
ctx, cancel := context.WithCancel(r.Context())
if cn, ok := w.(http.CloseNotifier); ok {
go func(done <-chan struct{}, closed <-chan bool) {
select {
case <-done:
case <-closed:
cancel()
}
}(ctx.Done(), cn.CloseNotify())
}
if util2.IsBaseStack() {
ctx = context.WithValue(ctx, "token", token)
} else {
acdToken, err := impl.argoUserService.GetLatestDevtronArgoCdUserToken()
if err != nil {
impl.logger.Errorw("error in getting acd token", "err", err)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}
ctx = context.WithValue(ctx, "token", acdToken)
}

for _, bean := range beans {
l := len(bean.ServerUrl)
if l > 1 && bean.ServerUrl[l-1:] == "/" {
bean.ServerUrl = bean.ServerUrl[0 : l-1]
}
if bean.Id != 0 {
_, err1 := impl.clusterService.Update(ctx, bean, userId)
if err1 != nil {
bean.ErrorInConnecting = err1.Error()
} else {
bean.ClusterUpdated = true
}
} else {
_, err1 := impl.clusterService.Save(ctx, bean, userId)
if err1 != nil {
bean.ErrorInConnecting = err1.Error()
}
}
}

res := beans

common.WriteJsonResp(w, err, res, http.StatusOK)
}

func (impl ClusterRestHandlerImpl) Save(w http.ResponseWriter, r *http.Request) {
token := r.Header.Get("token")
decoder := json.NewDecoder(r.Body)
Expand Down Expand Up @@ -161,6 +238,66 @@ func (impl ClusterRestHandlerImpl) Save(w http.ResponseWriter, r *http.Request)
common.WriteJsonResp(w, err, bean, http.StatusOK)
}

func (impl ClusterRestHandlerImpl) ValidateKubeconfig(w http.ResponseWriter, r *http.Request) {
token := r.Header.Get("token")
decoder := json.NewDecoder(r.Body)
userId, err := impl.userService.GetLoggedInUser(r)
if userId == 0 || err != nil {
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
return
}
bean := &cluster.Kubeconfig{}
err = decoder.Decode(bean)
if err != nil {
impl.logger.Errorw("request err, Validate", "error", err, "payload", bean)
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
return
}

err = impl.validator.Struct(bean)
if err != nil {
impl.logger.Errorw("validation err, Validate", "err", err, "payload", bean)
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
return
}

// RBAC enforcer applying
if ok := impl.enforcer.Enforce(token, casbin.ResourceCluster, casbin.ActionCreate, "*"); !ok {
common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden)
return
}
//RBAC enforcer Ends
ctx, cancel := context.WithCancel(r.Context())
if cn, ok := w.(http.CloseNotifier); ok {
go func(done <-chan struct{}, closed <-chan bool) {
select {
case <-done:
case <-closed:
cancel()
}
}(ctx.Done(), cn.CloseNotify())
}
if util2.IsBaseStack() {
ctx = context.WithValue(ctx, "token", token)
} else {
acdToken, err := impl.argoUserService.GetLatestDevtronArgoCdUserToken()
if err != nil {
impl.logger.Errorw("error in getting acd token", "err", err)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}
ctx = context.WithValue(ctx, "token", acdToken)
}
res, err := impl.clusterService.ValidateKubeconfig(bean.Config)
if err != nil {
impl.logger.Errorw("error in validating kubeconfig")
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}

common.WriteJsonResp(w, err, res, http.StatusOK)
}

func (impl ClusterRestHandlerImpl) FindAll(w http.ResponseWriter, r *http.Request) {
token := r.Header.Get("token")
clusterList, err := impl.clusterService.FindAllWithoutConfig()
Expand Down
8 changes: 8 additions & 0 deletions api/cluster/ClusterRouter.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,14 @@ func (impl ClusterRouterImpl) InitClusterRouter(clusterRouter *mux.Router) {
Methods("POST").
HandlerFunc(impl.clusterRestHandler.Save)

clusterRouter.Path("/saveClusters").
Methods("POST").
HandlerFunc(impl.clusterRestHandler.SaveClusters)

clusterRouter.Path("/validate").
Methods("POST").
HandlerFunc(impl.clusterRestHandler.ValidateKubeconfig)

clusterRouter.Path("").
Methods("GET").
Queries("id", "{id}").
Expand Down
4 changes: 2 additions & 2 deletions api/helm-app/HelmAppService.go
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ func (impl *HelmAppServiceImpl) listApplications(ctx context.Context, clusterIds
for _, clusterDetail := range clusters {
config := &ClusterConfig{
ApiServerUrl: clusterDetail.ServerUrl,
Token: clusterDetail.Config["bearer_token"],
Token: clusterDetail.Config[util.BearerToken],
ClusterId: int32(clusterDetail.Id),
ClusterName: clusterDetail.ClusterName,
}
Expand Down Expand Up @@ -265,7 +265,7 @@ func (impl *HelmAppServiceImpl) GetClusterConf(clusterId int) (*ClusterConfig, e
}
config := &ClusterConfig{
ApiServerUrl: cluster.ServerUrl,
Token: cluster.Config["bearer_token"],
Token: cluster.Config[util.BearerToken],
ClusterId: int32(cluster.Id),
ClusterName: cluster.ClusterName,
}
Expand Down
11 changes: 8 additions & 3 deletions client/k8s/informer/K8sInformerFactory.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,14 @@ func (impl *K8sInformerFactoryImpl) BuildInformer(clusterInfo []*bean.ClusterInf
impl.buildInformerAndNamespaceList(info.ClusterName, restConfig, &impl.mutex)
} else {
c := &rest.Config{
Host: info.ServerUrl,
BearerToken: info.BearerToken,
TLSClientConfig: rest.TLSClientConfig{Insecure: true},
Host: info.ServerUrl,
BearerToken: info.BearerToken,
TLSClientConfig: rest.TLSClientConfig{
Insecure: info.InsecureSkipTLSVerify,
KeyData: []byte(info.KeyData),
CertData: []byte(info.CertData),
CAData: []byte(info.CAData),
},
}
impl.buildInformerAndNamespaceList(info.ClusterName, c, &impl.mutex)
}
Expand Down
2 changes: 1 addition & 1 deletion client/telemetry/TelemetryEventClient.go
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ func (impl *TelemetryEventClientImpl) SummaryDetailsForTelemetry() (cluster []cl
req := &client.AppListRequest{}
config := &client.ClusterConfig{
ApiServerUrl: clusterDetail.ServerUrl,
Token: clusterDetail.Config["bearer_token"],
Token: clusterDetail.Config[util2.BearerToken],
ClusterId: int32(clusterDetail.Id),
ClusterName: clusterDetail.ClusterName,
}
Expand Down
2 changes: 1 addition & 1 deletion cmd/external-app/wire_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

66 changes: 51 additions & 15 deletions internal/util/K8sUtil.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,21 @@ type K8sUtil struct {
}

type ClusterConfig struct {
Host string
BearerToken string
ClusterName string
Host string
BearerToken string
InsecureSkipTLSVerify bool
KeyData string
CertData string
CAData string
}

const DEFAULT_CLUSTER = "default_cluster"
const BearerToken = "bearer_token"
const CertificateAuthorityData = "cert_auth_data"
const CertData = "cert_data"
const TlsKey = "tls_key"

func NewK8sUtil(logger *zap.SugaredLogger, runTimeConfig *client.RuntimeConfig) *K8sUtil {
usr, err := user.Current()
if err != nil {
Expand All @@ -74,11 +85,34 @@ func NewK8sUtil(logger *zap.SugaredLogger, runTimeConfig *client.RuntimeConfig)
return &K8sUtil{logger: logger, runTimeConfig: runTimeConfig, kubeconfig: kubeconfig}
}

func (impl K8sUtil) GetRestConfigByCluster(configMap *ClusterConfig) (*rest.Config, error) {
bearerToken := configMap.BearerToken
var restConfig *rest.Config
var err error
if configMap.ClusterName == DEFAULT_CLUSTER && len(bearerToken) == 0 {
restConfig, err = impl.GetK8sClusterRestConfig()
if err != nil {
impl.logger.Errorw("error in getting rest config for default cluster", "err", err)
return nil, err
}
} else {
restConfig = &rest.Config{Host: configMap.Host, BearerToken: bearerToken, TLSClientConfig: rest.TLSClientConfig{Insecure: configMap.InsecureSkipTLSVerify}}
if configMap.InsecureSkipTLSVerify == false {
restConfig.TLSClientConfig.ServerName = restConfig.ServerName
restConfig.TLSClientConfig.KeyData = []byte(configMap.KeyData)
restConfig.TLSClientConfig.CertData = []byte(configMap.CertData)
restConfig.TLSClientConfig.CAData = []byte(configMap.CAData)
}
}
return restConfig, nil
}

func (impl K8sUtil) GetClient(clusterConfig *ClusterConfig) (*v12.CoreV1Client, error) {
cfg := &rest.Config{}
cfg.Host = clusterConfig.Host
cfg.BearerToken = clusterConfig.BearerToken
cfg.Insecure = true
cfg, err := impl.GetRestConfigByCluster(clusterConfig)
if err != nil {
impl.logger.Errorw("error in getting rest config for default cluster", "err", err)
return nil, err
}
httpClient, err := OverrideK8sHttpClientWithTracer(cfg)
if err != nil {
return nil, err
Expand All @@ -88,10 +122,11 @@ func (impl K8sUtil) GetClient(clusterConfig *ClusterConfig) (*v12.CoreV1Client,
}

func (impl K8sUtil) GetClientSet(clusterConfig *ClusterConfig) (*kubernetes.Clientset, error) {
cfg := &rest.Config{}
cfg.Host = clusterConfig.Host
cfg.BearerToken = clusterConfig.BearerToken
cfg.Insecure = true
cfg, err := impl.GetRestConfigByCluster(clusterConfig)
if err != nil {
impl.logger.Errorw("error in getting rest config for default cluster", "err", err)
return nil, err
}
httpClient, err := OverrideK8sHttpClientWithTracer(cfg)
if err != nil {
return nil, err
Expand Down Expand Up @@ -157,10 +192,11 @@ func (impl K8sUtil) GetK8sClient() (*v12.CoreV1Client, error) {
}

func (impl K8sUtil) GetK8sDiscoveryClient(clusterConfig *ClusterConfig) (*discovery.DiscoveryClient, error) {
cfg := &rest.Config{}
cfg.Host = clusterConfig.Host
cfg.BearerToken = clusterConfig.BearerToken
cfg.Insecure = true
cfg, err := impl.GetRestConfigByCluster(clusterConfig)
if err != nil {
impl.logger.Errorw("error in getting rest config for default cluster", "err", err)
return nil, err
}
httpClient, err := OverrideK8sHttpClientWithTracer(cfg)
if err != nil {
return nil, err
Expand Down Expand Up @@ -504,7 +540,7 @@ func (impl K8sUtil) ListNamespaces(client *v12.CoreV1Client) (*v1.NamespaceList,
}

func (impl K8sUtil) GetClientByToken(serverUrl string, token map[string]string) (*v12.CoreV1Client, error) {
bearerToken := token["bearer_token"]
bearerToken := token[BearerToken]
clusterCfg := &ClusterConfig{Host: serverUrl, BearerToken: bearerToken}
client, err := impl.GetClient(clusterCfg)
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion pkg/app/AppService.go
Original file line number Diff line number Diff line change
Expand Up @@ -3469,7 +3469,7 @@ func (impl *AppServiceImpl) createHelmAppForCdPipeline(overrideRequest *bean.Val
}

releaseName := pipeline.DeploymentAppName
bearerToken := envOverride.Environment.Cluster.Config["bearer_token"]
bearerToken := envOverride.Environment.Cluster.Config[BearerToken]

releaseIdentifier := &client2.ReleaseIdentifier{
ReleaseName: releaseName,
Expand Down
Loading