@@ -31,7 +31,12 @@ import (
31
31
)
32
32
33
33
// Environment variable that for setting PS1
34
- const EnvPs1 = "KUBE_PS1_CLUSTER_FUNCTION"
34
+ const (
35
+ EnvPs1 = "KUBE_PS1_CLUSTER_FUNCTION"
36
+ LoginTypeClusterID = "cluster-id"
37
+ LoginTypeExistingKubeConfig = "kube-config"
38
+ LoginTypePagerduty = "pagerduty"
39
+ )
35
40
36
41
var (
37
42
args struct {
41
46
defaultNamespace string
42
47
}
43
48
49
+ // loginType derive the login type based on flags and args
50
+ // set default login type as cluster-id
51
+ loginType = LoginTypeClusterID
52
+
44
53
globalOpts = & globalflags.GlobalOptions {}
45
54
46
55
// LoginCmd represents the login command
64
73
}
65
74
return nil
66
75
},
76
+ PreRunE : preLogin ,
67
77
RunE : runLogin ,
68
78
SilenceUsage : true ,
69
79
}
@@ -93,7 +103,7 @@ func init() {
93
103
& args .pd ,
94
104
"pd" ,
95
105
"" ,
96
- "Login using PagerDuty incident id or html_url ." ,
106
+ "Login using PagerDuty incident id or pagerduty url ." ,
97
107
)
98
108
flags .StringVarP (
99
109
& args .defaultNamespace ,
@@ -107,6 +117,7 @@ func init() {
107
117
108
118
func runLogin (cmd * cobra.Command , argv []string ) (err error ) {
109
119
var clusterKey string
120
+ var elevateReason string
110
121
logger .Debugf ("Running Login Command ..." )
111
122
logger .Debugf ("Checking Backplane Version" )
112
123
utils .CheckBackplaneVersion (cmd )
@@ -119,47 +130,29 @@ func runLogin(cmd *cobra.Command, argv []string) (err error) {
119
130
}
120
131
logger .Debugf ("Backplane Config File Contains: %v \n " , bpConfig )
121
132
133
+ // login to the cluster based on login type
122
134
logger .Debugf ("Extracting Backplane Cluster ID" )
123
- // Currently go-pagerduty pkg does not include incident id validation.
124
- if args .pd != "" {
125
- if bpConfig .PagerDutyAPIKey == "" {
126
- return fmt .Errorf ("please make sure the PD API Key is configured correctly in the config file" )
127
- }
128
- pdClient , err := pagerduty .NewWithToken (bpConfig .PagerDutyAPIKey )
135
+ switch loginType {
136
+ case LoginTypePagerduty :
137
+ info , err := getClusterInfoFromPagerduty (bpConfig )
129
138
if err != nil {
130
- return fmt .Errorf ("could not initialize the client: %w" , err )
131
- }
132
- if strings .Contains (args .pd , "/incidents/" ) {
133
- incidentID := args .pd [strings .LastIndex (args .pd , "/" )+ 1 :]
134
- clusterKey , err = pdClient .GetClusterIDFromIncident (incidentID )
135
- if err != nil {
136
- return err
137
- }
138
- } else {
139
- clusterKey , err = pdClient .GetClusterIDFromIncident (args .pd )
140
- if err != nil {
141
- return err
142
- }
139
+ return err
143
140
}
144
- }
141
+ clusterKey = info .ClusterID
142
+ elevateReason = info .WebURL
145
143
146
- // Get the cluster ID only if it hasn't been populated by PagerDuty.
147
- if len (argv ) == 1 {
148
- // if explicitly one cluster key given, use it to log in.
144
+ case LoginTypeClusterID :
149
145
logger .Debugf ("Cluster Key is given in argument" )
150
146
clusterKey = argv [0 ]
151
- logger .WithField ("Search Key" , clusterKey ).Debugln ("Finding target cluster" )
152
-
153
- } else if len (argv ) == 0 && args .pd == "" {
154
- // if no args given, try to log into the cluster that the user is logged into
155
- logger .Debugf ("Finding Clustrer Key from current cluster" )
156
- clusterInfo , err := utils .DefaultClusterUtils .GetBackplaneClusterFromConfig ()
147
+ case LoginTypeExistingKubeConfig :
148
+ clusterKey , err = getClusterIDFromExistingKubeConfig ()
157
149
if err != nil {
158
150
return err
159
151
}
160
- clusterKey = clusterInfo . ClusterID
161
- logger . Debugf ( "Backplane Cluster Infromation data extracted: %+v \n " , clusterInfo )
152
+ default :
153
+ return fmt . Errorf ( "login type cannot be detected" )
162
154
}
155
+
163
156
logger .Debugf ("Backplane Cluster Key is: %v \n " , clusterKey )
164
157
165
158
logger .Debugln ("Setting Proxy URL from global options" )
@@ -353,11 +346,22 @@ func runLogin(cmd *cobra.Command, argv []string) (err error) {
353
346
rc .Contexts [targetContextNickName ] = targetContext
354
347
rc .CurrentContext = targetContextNickName
355
348
349
+ // Add elevate reason to kubeconfig context
350
+ if elevateReason != "" {
351
+ elevationReasons , err := login .SaveElevateContextReasons (rc , elevateReason )
352
+ if err != nil {
353
+ return err
354
+ }
355
+ logger .Infof ("save elevate reason: %s\n " , elevationReasons )
356
+ }
357
+
356
358
logger .Debugln ("Saving new API config" )
357
359
// Save the config
358
- err = login .SaveKubeConfig (clusterID , rc , args .multiCluster , args .kubeConfigPath )
360
+ if err = login .SaveKubeConfig (clusterID , rc , args .multiCluster , args .kubeConfigPath ); err != nil {
361
+ return err
362
+ }
359
363
360
- return err
364
+ return nil
361
365
}
362
366
363
367
// GetRestConfig returns a client-go *rest.Config which can be used to programmatically interact with the
@@ -558,3 +562,59 @@ func isValidKubernetesNamespace(namespace string) bool {
558
562
pattern := `^[a-z0-9]([-a-z0-9]*[a-z0-9])?$`
559
563
return regexp .MustCompile (pattern ).MatchString (namespace )
560
564
}
565
+
566
+ // preLogin will execute before the command
567
+ func preLogin (cmd * cobra.Command , argv []string ) (err error ) {
568
+
569
+ switch len (argv ) {
570
+ case 1 :
571
+ loginType = LoginTypeClusterID
572
+
573
+ case 0 :
574
+ if args .pd == "" {
575
+ loginType = LoginTypeExistingKubeConfig
576
+ } else {
577
+ loginType = LoginTypePagerduty
578
+ }
579
+ }
580
+
581
+ return nil
582
+ }
583
+
584
+ // getClusterInfoFromPagerduty returns a pagerduty.Alert from Pagerduty incident,
585
+ // which contains alert info including the cluster id.
586
+ func getClusterInfoFromPagerduty (bpConfig config.BackplaneConfiguration ) (alert pagerduty.Alert , err error ) {
587
+ if bpConfig .PagerDutyAPIKey == "" {
588
+ return alert , fmt .Errorf ("please make sure the PD API Key is configured correctly in the config file" )
589
+ }
590
+ pdClient , err := pagerduty .NewWithToken (bpConfig .PagerDutyAPIKey )
591
+ if err != nil {
592
+ return alert , fmt .Errorf ("could not initialize the client: %w" , err )
593
+ }
594
+ if strings .Contains (args .pd , "/incidents/" ) {
595
+ incidentID := args .pd [strings .LastIndex (args .pd , "/" )+ 1 :]
596
+ alert , err = pdClient .GetClusterInfoFromIncident (incidentID )
597
+ if err != nil {
598
+ return alert , err
599
+ }
600
+ } else {
601
+ alert , err = pdClient .GetClusterInfoFromIncident (args .pd )
602
+ if err != nil {
603
+ return alert , err
604
+ }
605
+ }
606
+ return alert , nil
607
+ }
608
+
609
+ // getClusterIDFromExistingKubeConfig returns clusterId from kubeconfig
610
+ func getClusterIDFromExistingKubeConfig () (string , error ) {
611
+ var clusterKey string
612
+ logger .Debugf ("Finding Clustrer Key from current cluster" )
613
+ clusterInfo , err := utils .DefaultClusterUtils .GetBackplaneClusterFromConfig ()
614
+ if err != nil {
615
+ return "" , err
616
+ }
617
+ clusterKey = clusterInfo .ClusterID
618
+ logger .Debugf ("Backplane Cluster Infromation data extracted: %+v\n " , clusterInfo )
619
+ return clusterKey , nil
620
+ }
0 commit comments