Best Testkube code snippet using client.APIVersion
exec_test.go
Source:exec_test.go  
...105			{Name: "3", Value: "4"},106			{Name: "5", Value: "6"},107			{Name: "7", Value: "8"},108		},109		APIVersion:         "client.authentication.k8s.io/v1alpha1",110		ProvideClusterInfo: true,111	}112	c1c := &clientauthentication.Cluster{113		Server:                   "foo",114		TLSServerName:            "bar",115		CertificateAuthorityData: []byte("baz"),116		Config: &runtime.Unknown{117			TypeMeta: runtime.TypeMeta{118				APIVersion: "",119				Kind:       "",120			},121			Raw:             []byte(`{"apiVersion":"group/v1","kind":"PluginConfig","spec":{"audience":"snorlax"}}`),122			ContentEncoding: "",123			ContentType:     "application/json",124		},125	}126	c2 := &api.ExecConfig{127		Command: "foo-bar",128		Args:    []string{"1", "2"},129		Env: []api.ExecEnvVar{130			{Name: "3", Value: "4"},131			{Name: "5", Value: "6"},132			{Name: "7", Value: "8"},133		},134		APIVersion:         "client.authentication.k8s.io/v1alpha1",135		ProvideClusterInfo: true,136	}137	c2c := &clientauthentication.Cluster{138		Server:                   "foo",139		TLSServerName:            "bar",140		CertificateAuthorityData: []byte("baz"),141		Config: &runtime.Unknown{142			TypeMeta: runtime.TypeMeta{143				APIVersion: "",144				Kind:       "",145			},146			Raw:             []byte(`{"apiVersion":"group/v1","kind":"PluginConfig","spec":{"audience":"snorlax"}}`),147			ContentEncoding: "",148			ContentType:     "application/json",149		},150	}151	c3 := &api.ExecConfig{152		Command: "foo-bar",153		Args:    []string{"1", "2"},154		Env: []api.ExecEnvVar{155			{Name: "3", Value: "4"},156			{Name: "5", Value: "6"},157		},158		APIVersion: "client.authentication.k8s.io/v1alpha1",159	}160	c3c := &clientauthentication.Cluster{161		Server:                   "foo",162		TLSServerName:            "bar",163		CertificateAuthorityData: []byte("baz"),164		Config: &runtime.Unknown{165			TypeMeta: runtime.TypeMeta{166				APIVersion: "",167				Kind:       "",168			},169			Raw:             []byte(`{"apiVersion":"group/v1","kind":"PluginConfig","spec":{"audience":"snorlax"}}`),170			ContentEncoding: "",171			ContentType:     "application/json",172		},173	}174	c4 := &api.ExecConfig{175		Command: "foo-bar",176		Args:    []string{"1", "2"},177		Env: []api.ExecEnvVar{178			{Name: "3", Value: "4"},179			{Name: "5", Value: "6"},180		},181		APIVersion: "client.authentication.k8s.io/v1alpha1",182	}183	c4c := &clientauthentication.Cluster{184		Server:                   "foo",185		TLSServerName:            "bar",186		CertificateAuthorityData: []byte("baz"),187		Config: &runtime.Unknown{188			TypeMeta: runtime.TypeMeta{189				APIVersion: "",190				Kind:       "",191			},192			Raw:             []byte(`{"apiVersion":"group/v1","kind":"PluginConfig","spec":{"audience":"panda"}}`),193			ContentEncoding: "",194			ContentType:     "application/json",195		},196	}197	// c5/c5c should be the same as c4/c4c, except c5 has ProvideClusterInfo set to true.198	c5 := &api.ExecConfig{199		Command: "foo-bar",200		Args:    []string{"1", "2"},201		Env: []api.ExecEnvVar{202			{Name: "3", Value: "4"},203			{Name: "5", Value: "6"},204		},205		APIVersion:         "client.authentication.k8s.io/v1alpha1",206		ProvideClusterInfo: true,207	}208	c5c := &clientauthentication.Cluster{209		Server:                   "foo",210		TLSServerName:            "bar",211		CertificateAuthorityData: []byte("baz"),212		Config: &runtime.Unknown{213			TypeMeta: runtime.TypeMeta{214				APIVersion: "",215				Kind:       "",216			},217			Raw:             []byte(`{"apiVersion":"group/v1","kind":"PluginConfig","spec":{"audience":"panda"}}`),218			ContentEncoding: "",219			ContentType:     "application/json",220		},221	}222	// c6 should be the same as c4, except c6 is passed with a nil cluster223	c6 := &api.ExecConfig{224		Command: "foo-bar",225		Args:    []string{"1", "2"},226		Env: []api.ExecEnvVar{227			{Name: "3", Value: "4"},228			{Name: "5", Value: "6"},229		},230		APIVersion: "client.authentication.k8s.io/v1alpha1",231	}232	// c7 should be the same as c6, except c7 has stdin marked as unavailable233	c7 := &api.ExecConfig{234		Command: "foo-bar",235		Args:    []string{"1", "2"},236		Env: []api.ExecEnvVar{237			{Name: "3", Value: "4"},238			{Name: "5", Value: "6"},239		},240		APIVersion:       "client.authentication.k8s.io/v1alpha1",241		StdinUnavailable: true,242	}243	key1 := cacheKey(c1, c1c)244	key2 := cacheKey(c2, c2c)245	key3 := cacheKey(c3, c3c)246	key4 := cacheKey(c4, c4c)247	key5 := cacheKey(c5, c5c)248	key6 := cacheKey(c6, nil)249	key7 := cacheKey(c7, nil)250	if key1 != key2 {251		t.Error("key1 and key2 didn't match")252	}253	if key1 == key3 {254		t.Error("key1 and key3 matched")255	}256	if key2 == key3 {257		t.Error("key2 and key3 matched")258	}259	if key3 == key4 {260		t.Error("key3 and key4 matched")261	}262	if key4 == key5 {263		t.Error("key3 and key4 matched")264	}265	if key6 == key4 {266		t.Error("key6 and key4 matched")267	}268	if key6 == key7 {269		t.Error("key6 and key7 matched")270	}271}272func compJSON(t *testing.T, got, want []byte) {273	t.Helper()274	gotJSON := &bytes.Buffer{}275	wantJSON := &bytes.Buffer{}276	if err := json.Indent(gotJSON, got, "", "  "); err != nil {277		t.Errorf("got invalid JSON: %v", err)278	}279	if err := json.Indent(wantJSON, want, "", "  "); err != nil {280		t.Errorf("want invalid JSON: %v", err)281	}282	g := strings.TrimSpace(gotJSON.String())283	w := strings.TrimSpace(wantJSON.String())284	if g != w {285		t.Errorf("wanted %q, got %q", w, g)286	}287}288func TestRefreshCreds(t *testing.T) {289	tests := []struct {290		name             string291		config           api.ExecConfig292		stdinUnavailable bool293		exitCode         int294		cluster          *clientauthentication.Cluster295		output           string296		isTerminal       bool297		response         *clientauthentication.Response298		wantInput        string299		wantCreds        credentials300		wantExpiry       time.Time301		wantErr          bool302		wantErrSubstr    string303	}{304		{305			name: "basic-request",306			config: api.ExecConfig{307				APIVersion:      "client.authentication.k8s.io/v1alpha1",308				InteractiveMode: api.IfAvailableExecInteractiveMode,309			},310			wantInput: `{311				"kind":"ExecCredential",312				"apiVersion":"client.authentication.k8s.io/v1alpha1",313				"spec": {}314			}`,315			output: `{316				"kind": "ExecCredential",317				"apiVersion": "client.authentication.k8s.io/v1alpha1",318				"status": {319					"token": "foo-bar"320				}321			}`,322			wantCreds: credentials{token: "foo-bar"},323		},324		{325			name: "interactive",326			config: api.ExecConfig{327				APIVersion:      "client.authentication.k8s.io/v1alpha1",328				InteractiveMode: api.IfAvailableExecInteractiveMode,329			},330			isTerminal: true,331			wantInput: `{332				"kind":"ExecCredential",333				"apiVersion":"client.authentication.k8s.io/v1alpha1",334				"spec": {335					"interactive": true336				}337			}`,338			output: `{339				"kind": "ExecCredential",340				"apiVersion": "client.authentication.k8s.io/v1alpha1",341				"status": {342					"token": "foo-bar"343				}344			}`,345			wantCreds: credentials{token: "foo-bar"},346		},347		{348			name: "response",349			config: api.ExecConfig{350				APIVersion:      "client.authentication.k8s.io/v1alpha1",351				InteractiveMode: api.IfAvailableExecInteractiveMode,352			},353			response: &clientauthentication.Response{354				Header: map[string][]string{355					"WWW-Authenticate": {`Basic realm="Access to the staging site", charset="UTF-8"`},356				},357				Code: 401,358			},359			wantInput: `{360				"kind":"ExecCredential",361				"apiVersion":"client.authentication.k8s.io/v1alpha1",362				"spec": {363					"response": {364						"header": {365							"WWW-Authenticate": [366								"Basic realm=\"Access to the staging site\", charset=\"UTF-8\""367							]368						},369						"code": 401370					}371				}372			}`,373			output: `{374				"kind": "ExecCredential",375				"apiVersion": "client.authentication.k8s.io/v1alpha1",376				"status": {377					"token": "foo-bar"378				}379			}`,380			wantCreds: credentials{token: "foo-bar"},381		},382		{383			name: "expiry",384			config: api.ExecConfig{385				APIVersion:      "client.authentication.k8s.io/v1alpha1",386				InteractiveMode: api.IfAvailableExecInteractiveMode,387			},388			wantInput: `{389				"kind":"ExecCredential",390				"apiVersion":"client.authentication.k8s.io/v1alpha1",391				"spec": {}392			}`,393			output: `{394				"kind": "ExecCredential",395				"apiVersion": "client.authentication.k8s.io/v1alpha1",396				"status": {397					"token": "foo-bar",398					"expirationTimestamp": "2006-01-02T15:04:05Z"399				}400			}`,401			wantExpiry: time.Date(2006, 01, 02, 15, 04, 05, 0, time.UTC),402			wantCreds:  credentials{token: "foo-bar"},403		},404		{405			name: "no-group-version",406			config: api.ExecConfig{407				APIVersion:      "client.authentication.k8s.io/v1alpha1",408				InteractiveMode: api.IfAvailableExecInteractiveMode,409			},410			wantInput: `{411				"kind":"ExecCredential",412				"apiVersion":"client.authentication.k8s.io/v1alpha1",413				"spec": {}414			}`,415			output: `{416				"kind": "ExecCredential",417				"status": {418					"token": "foo-bar"419				}420			}`,421			wantErr: true,422		},423		{424			name: "no-status",425			config: api.ExecConfig{426				APIVersion:      "client.authentication.k8s.io/v1alpha1",427				InteractiveMode: api.IfAvailableExecInteractiveMode,428			},429			wantInput: `{430				"kind":"ExecCredential",431				"apiVersion":"client.authentication.k8s.io/v1alpha1",432				"spec": {}433			}`,434			output: `{435				"kind": "ExecCredential",436				"apiVersion":"client.authentication.k8s.io/v1alpha1"437			}`,438			wantErr: true,439		},440		{441			name: "no-creds",442			config: api.ExecConfig{443				APIVersion:      "client.authentication.k8s.io/v1alpha1",444				InteractiveMode: api.IfAvailableExecInteractiveMode,445			},446			wantInput: `{447				"kind":"ExecCredential",448				"apiVersion":"client.authentication.k8s.io/v1alpha1",449				"spec": {}450			}`,451			output: `{452				"kind": "ExecCredential",453				"apiVersion":"client.authentication.k8s.io/v1alpha1",454				"status": {}455			}`,456			wantErr: true,457		},458		{459			name: "TLS credentials",460			config: api.ExecConfig{461				APIVersion:      "client.authentication.k8s.io/v1alpha1",462				InteractiveMode: api.IfAvailableExecInteractiveMode,463			},464			wantInput: `{465				"kind":"ExecCredential",466				"apiVersion":"client.authentication.k8s.io/v1alpha1",467				"spec": {}468			}`,469			output: fmt.Sprintf(`{470				"kind": "ExecCredential",471				"apiVersion": "client.authentication.k8s.io/v1alpha1",472				"status": {473					"clientKeyData": %q,474					"clientCertificateData": %q475				}476			}`, keyData, certData),477			wantCreds: credentials{cert: validCert},478		},479		{480			name: "bad TLS credentials",481			config: api.ExecConfig{482				APIVersion:      "client.authentication.k8s.io/v1alpha1",483				InteractiveMode: api.IfAvailableExecInteractiveMode,484			},485			wantInput: `{486				"kind":"ExecCredential",487				"apiVersion":"client.authentication.k8s.io/v1alpha1",488				"spec": {}489			}`,490			output: `{491				"kind": "ExecCredential",492				"apiVersion": "client.authentication.k8s.io/v1alpha1",493				"status": {494					"clientKeyData": "foo",495					"clientCertificateData": "bar"496				}497			}`,498			wantErr: true,499		},500		{501			name: "cert but no key",502			config: api.ExecConfig{503				APIVersion:      "client.authentication.k8s.io/v1alpha1",504				InteractiveMode: api.IfAvailableExecInteractiveMode,505			},506			wantInput: `{507				"kind":"ExecCredential",508				"apiVersion":"client.authentication.k8s.io/v1alpha1",509				"spec": {}510			}`,511			output: fmt.Sprintf(`{512				"kind": "ExecCredential",513				"apiVersion": "client.authentication.k8s.io/v1alpha1",514				"status": {515					"clientCertificateData": %q516				}517			}`, certData),518			wantErr: true,519		},520		{521			name: "beta-basic-request",522			config: api.ExecConfig{523				APIVersion:      "client.authentication.k8s.io/v1beta1",524				InteractiveMode: api.IfAvailableExecInteractiveMode,525			},526			wantInput: `{527				"kind": "ExecCredential",528				"apiVersion": "client.authentication.k8s.io/v1beta1",529				"spec": {530					"interactive": false531				}532			}`,533			output: `{534				"kind": "ExecCredential",535				"apiVersion": "client.authentication.k8s.io/v1beta1",536				"status": {537					"token": "foo-bar"538				}539			}`,540			wantCreds: credentials{token: "foo-bar"},541		},542		{543			name: "beta-basic-request-with-never-interactive-mode",544			config: api.ExecConfig{545				APIVersion:      "client.authentication.k8s.io/v1beta1",546				InteractiveMode: api.NeverExecInteractiveMode,547			},548			wantInput: `{549				"kind": "ExecCredential",550				"apiVersion": "client.authentication.k8s.io/v1beta1",551				"spec": {552					"interactive": false553				}554			}`,555			output: `{556				"kind": "ExecCredential",557				"apiVersion": "client.authentication.k8s.io/v1beta1",558				"status": {559					"token": "foo-bar"560				}561			}`,562			wantCreds: credentials{token: "foo-bar"},563		},564		{565			name: "beta-basic-request-with-never-interactive-mode-and-stdin-unavailable",566			config: api.ExecConfig{567				APIVersion:       "client.authentication.k8s.io/v1beta1",568				InteractiveMode:  api.NeverExecInteractiveMode,569				StdinUnavailable: true,570			},571			wantInput: `{572				"kind": "ExecCredential",573				"apiVersion": "client.authentication.k8s.io/v1beta1",574				"spec": {575					"interactive": false576				}577			}`,578			output: `{579				"kind": "ExecCredential",580				"apiVersion": "client.authentication.k8s.io/v1beta1",581				"status": {582					"token": "foo-bar"583				}584			}`,585			wantCreds: credentials{token: "foo-bar"},586		},587		{588			name: "beta-basic-request-with-if-available-interactive-mode",589			config: api.ExecConfig{590				APIVersion:      "client.authentication.k8s.io/v1beta1",591				InteractiveMode: api.IfAvailableExecInteractiveMode,592			},593			wantInput: `{594				"kind": "ExecCredential",595				"apiVersion": "client.authentication.k8s.io/v1beta1",596				"spec": {597					"interactive": false598				}599			}`,600			output: `{601				"kind": "ExecCredential",602				"apiVersion": "client.authentication.k8s.io/v1beta1",603				"status": {604					"token": "foo-bar"605				}606			}`,607			wantCreds: credentials{token: "foo-bar"},608		},609		{610			name: "beta-basic-request-with-if-available-interactive-mode-and-stdin-unavailable",611			config: api.ExecConfig{612				APIVersion:       "client.authentication.k8s.io/v1beta1",613				InteractiveMode:  api.IfAvailableExecInteractiveMode,614				StdinUnavailable: true,615			},616			wantInput: `{617				"kind": "ExecCredential",618				"apiVersion": "client.authentication.k8s.io/v1beta1",619				"spec": {620					"interactive": false621				}622			}`,623			output: `{624				"kind": "ExecCredential",625				"apiVersion": "client.authentication.k8s.io/v1beta1",626				"status": {627					"token": "foo-bar"628				}629			}`,630			wantCreds: credentials{token: "foo-bar"},631		},632		{633			name: "beta-basic-request-with-if-available-interactive-mode-and-terminal",634			config: api.ExecConfig{635				APIVersion:      "client.authentication.k8s.io/v1beta1",636				InteractiveMode: api.IfAvailableExecInteractiveMode,637			},638			isTerminal: true,639			wantInput: `{640				"kind": "ExecCredential",641				"apiVersion": "client.authentication.k8s.io/v1beta1",642				"spec": {643					"interactive": true644				}645			}`,646			output: `{647				"kind": "ExecCredential",648				"apiVersion": "client.authentication.k8s.io/v1beta1",649				"status": {650					"token": "foo-bar"651				}652			}`,653			wantCreds: credentials{token: "foo-bar"},654		},655		{656			name: "beta-basic-request-with-if-available-interactive-mode-and-terminal-and-stdin-unavailable",657			config: api.ExecConfig{658				APIVersion:       "client.authentication.k8s.io/v1beta1",659				InteractiveMode:  api.IfAvailableExecInteractiveMode,660				StdinUnavailable: true,661			},662			isTerminal: true,663			wantInput: `{664				"kind": "ExecCredential",665				"apiVersion": "client.authentication.k8s.io/v1beta1",666				"spec": {667					"interactive": false668				}669			}`,670			output: `{671				"kind": "ExecCredential",672				"apiVersion": "client.authentication.k8s.io/v1beta1",673				"status": {674					"token": "foo-bar"675				}676			}`,677			wantCreds: credentials{token: "foo-bar"},678		},679		{680			name: "beta-basic-request-with-always-interactive-mode",681			config: api.ExecConfig{682				APIVersion:      "client.authentication.k8s.io/v1beta1",683				InteractiveMode: api.AlwaysExecInteractiveMode,684			},685			wantErr:       true,686			wantErrSubstr: "exec plugin cannot support interactive mode: standard input is not a terminal",687		},688		{689			name: "beta-basic-request-with-always-interactive-mode-and-terminal-and-stdin-unavailable",690			config: api.ExecConfig{691				APIVersion:       "client.authentication.k8s.io/v1beta1",692				InteractiveMode:  api.AlwaysExecInteractiveMode,693				StdinUnavailable: true,694			},695			isTerminal:    true,696			wantErr:       true,697			wantErrSubstr: "exec plugin cannot support interactive mode: standard input is unavailable",698		},699		{700			name: "beta-basic-request-with-always-interactive-mode-and-terminal-and-stdin-unavailable-with-message",701			config: api.ExecConfig{702				APIVersion:              "client.authentication.k8s.io/v1beta1",703				InteractiveMode:         api.AlwaysExecInteractiveMode,704				StdinUnavailable:        true,705				StdinUnavailableMessage: "some message",706			},707			isTerminal:    true,708			wantErr:       true,709			wantErrSubstr: "exec plugin cannot support interactive mode: standard input is unavailable: some message",710		},711		{712			name: "beta-basic-request-with-always-interactive-mode-and-terminal",713			config: api.ExecConfig{714				APIVersion:      "client.authentication.k8s.io/v1beta1",715				InteractiveMode: api.AlwaysExecInteractiveMode,716			},717			isTerminal: true,718			wantInput: `{719				"kind": "ExecCredential",720				"apiVersion": "client.authentication.k8s.io/v1beta1",721				"spec": {722					"interactive": true723				}724			}`,725			output: `{726				"kind": "ExecCredential",727				"apiVersion": "client.authentication.k8s.io/v1beta1",728				"status": {729					"token": "foo-bar"730				}731			}`,732			wantCreds: credentials{token: "foo-bar"},733		},734		{735			name: "beta-expiry",736			config: api.ExecConfig{737				APIVersion:      "client.authentication.k8s.io/v1beta1",738				InteractiveMode: api.IfAvailableExecInteractiveMode,739			},740			wantInput: `{741				"kind": "ExecCredential",742				"apiVersion": "client.authentication.k8s.io/v1beta1",743				"spec": {744					"interactive": false745				}746			}`,747			output: `{748				"kind": "ExecCredential",749				"apiVersion": "client.authentication.k8s.io/v1beta1",750				"status": {751					"token": "foo-bar",752					"expirationTimestamp": "2006-01-02T15:04:05Z"753				}754			}`,755			wantExpiry: time.Date(2006, 01, 02, 15, 04, 05, 0, time.UTC),756			wantCreds:  credentials{token: "foo-bar"},757		},758		{759			name: "beta-no-group-version",760			config: api.ExecConfig{761				APIVersion:      "client.authentication.k8s.io/v1beta1",762				InteractiveMode: api.IfAvailableExecInteractiveMode,763			},764			output: `{765				"kind": "ExecCredential",766				"status": {767					"token": "foo-bar"768				}769			}`,770			wantErr: true,771		},772		{773			name: "beta-no-status",774			config: api.ExecConfig{775				APIVersion:      "client.authentication.k8s.io/v1beta1",776				InteractiveMode: api.IfAvailableExecInteractiveMode,777			},778			output: `{779				"kind": "ExecCredential",780				"apiVersion":"client.authentication.k8s.io/v1beta1"781			}`,782			wantErr: true,783		},784		{785			name: "beta-no-token",786			config: api.ExecConfig{787				APIVersion:      "client.authentication.k8s.io/v1beta1",788				InteractiveMode: api.IfAvailableExecInteractiveMode,789			},790			output: `{791				"kind": "ExecCredential",792				"apiVersion":"client.authentication.k8s.io/v1beta1",793				"status": {}794			}`,795			wantErr: true,796		},797		{798			name: "unknown-binary",799			config: api.ExecConfig{800				APIVersion:      "client.authentication.k8s.io/v1beta1",801				Command:         "does not exist",802				InstallHint:     "some install hint",803				InteractiveMode: api.IfAvailableExecInteractiveMode,804			},805			wantErr:       true,806			wantErrSubstr: "some install hint",807		},808		{809			name: "binary-fails",810			config: api.ExecConfig{811				APIVersion:      "client.authentication.k8s.io/v1beta1",812				InteractiveMode: api.IfAvailableExecInteractiveMode,813			},814			exitCode:      73,815			wantErr:       true,816			wantErrSubstr: "73",817		},818		{819			name: "alpha-with-cluster-is-ignored",820			config: api.ExecConfig{821				APIVersion:      "client.authentication.k8s.io/v1alpha1",822				InteractiveMode: api.IfAvailableExecInteractiveMode,823			},824			cluster: &clientauthentication.Cluster{825				Server:                   "foo",826				TLSServerName:            "bar",827				CertificateAuthorityData: []byte("baz"),828				Config: &runtime.Unknown{829					TypeMeta: runtime.TypeMeta{830						APIVersion: "",831						Kind:       "",832					},833					Raw:             []byte(`{"apiVersion":"group/v1","kind":"PluginConfig","spec":{"audience":"panda"}}`),834					ContentEncoding: "",835					ContentType:     "application/json",836				},837			},838			response: &clientauthentication.Response{839				Header: map[string][]string{840					"WWW-Authenticate": {`Basic realm="Access to the staging site", charset="UTF-8"`},841				},842				Code: 401,843			},844			wantInput: `{845				"kind":"ExecCredential",846				"apiVersion":"client.authentication.k8s.io/v1alpha1",847				"spec": {848					"response": {849						"header": {850							"WWW-Authenticate": [851								"Basic realm=\"Access to the staging site\", charset=\"UTF-8\""852							]853						},854						"code": 401855					}856				}857			}`,858			output: `{859				"kind": "ExecCredential",860				"apiVersion": "client.authentication.k8s.io/v1alpha1",861				"status": {862					"token": "foo-bar"863				}864			}`,865			wantCreds: credentials{token: "foo-bar"},866		},867		{868			name: "beta-with-cluster-and-provide-cluster-info-is-serialized",869			config: api.ExecConfig{870				APIVersion:         "client.authentication.k8s.io/v1beta1",871				ProvideClusterInfo: true,872				InteractiveMode:    api.IfAvailableExecInteractiveMode,873			},874			cluster: &clientauthentication.Cluster{875				Server:                   "foo",876				TLSServerName:            "bar",877				CertificateAuthorityData: []byte("baz"),878				Config: &runtime.Unknown{879					TypeMeta: runtime.TypeMeta{880						APIVersion: "",881						Kind:       "",882					},883					Raw:             []byte(`{"apiVersion":"group/v1","kind":"PluginConfig","spec":{"audience":"snorlax"}}`),884					ContentEncoding: "",885					ContentType:     "application/json",886				},887			},888			response: &clientauthentication.Response{889				Header: map[string][]string{890					"WWW-Authenticate": {`Basic realm="Access to the staging site", charset="UTF-8"`},891				},892				Code: 401,893			},894			wantInput: `{895				"kind":"ExecCredential",896				"apiVersion":"client.authentication.k8s.io/v1beta1",897				"spec": {898					"cluster": {899						"server": "foo",900						"tls-server-name": "bar",901						"certificate-authority-data": "YmF6",902						"config": {903							"apiVersion": "group/v1",904							"kind": "PluginConfig",905							"spec": {906								"audience": "snorlax"907							}908						}909					},910					"interactive": false911				}912			}`,913			output: `{914				"kind": "ExecCredential",915				"apiVersion": "client.authentication.k8s.io/v1beta1",916				"status": {917					"token": "foo-bar"918				}919			}`,920			wantCreds: credentials{token: "foo-bar"},921		},922		{923			name: "beta-with-cluster-and-without-provide-cluster-info-is-not-serialized",924			config: api.ExecConfig{925				APIVersion:      "client.authentication.k8s.io/v1beta1",926				InteractiveMode: api.IfAvailableExecInteractiveMode,927			},928			cluster: &clientauthentication.Cluster{929				Server:                   "foo",930				TLSServerName:            "bar",931				CertificateAuthorityData: []byte("baz"),932				Config: &runtime.Unknown{933					TypeMeta: runtime.TypeMeta{934						APIVersion: "",935						Kind:       "",936					},937					Raw:             []byte(`{"apiVersion":"group/v1","kind":"PluginConfig","spec":{"audience":"snorlax"}}`),938					ContentEncoding: "",939					ContentType:     "application/json",940				},941			},942			response: &clientauthentication.Response{943				Header: map[string][]string{944					"WWW-Authenticate": {`Basic realm="Access to the staging site", charset="UTF-8"`},945				},946				Code: 401,947			},948			wantInput: `{949				"kind":"ExecCredential",950				"apiVersion":"client.authentication.k8s.io/v1beta1",951				"spec": {952					"interactive": false953				}954			}`,955			output: `{956				"kind": "ExecCredential",957				"apiVersion": "client.authentication.k8s.io/v1beta1",958				"status": {959					"token": "foo-bar"960				}961			}`,962			wantCreds: credentials{token: "foo-bar"},963		},964		{965			name: "v1-basic-request",966			config: api.ExecConfig{967				APIVersion:      "client.authentication.k8s.io/v1",968				InteractiveMode: api.IfAvailableExecInteractiveMode,969			},970			wantInput: `{971				"kind": "ExecCredential",972				"apiVersion": "client.authentication.k8s.io/v1",973				"spec": {974					"interactive": false975				}976			}`,977			output: `{978				"kind": "ExecCredential",979				"apiVersion": "client.authentication.k8s.io/v1",980				"status": {981					"token": "foo-bar"982				}983			}`,984			wantCreds: credentials{token: "foo-bar"},985		},986		{987			name: "v1-with-missing-interactive-mode",988			config: api.ExecConfig{989				APIVersion: "client.authentication.k8s.io/v1",990			},991			wantErr:       true,992			wantErrSubstr: `exec plugin cannot support interactive mode: unknown interactiveMode: ""`,993		},994	}995	for _, test := range tests {996		t.Run(test.name, func(t *testing.T) {997			c := test.config998			if c.Command == "" {999				c.Command = "./testdata/test-plugin.sh"1000				c.Env = append(c.Env, api.ExecEnvVar{1001					Name:  "TEST_OUTPUT",1002					Value: test.output,1003				})1004				c.Env = append(c.Env, api.ExecEnvVar{1005					Name:  "TEST_EXIT_CODE",1006					Value: strconv.Itoa(test.exitCode),1007				})1008			}1009			a, err := newAuthenticator(newCache(), func(_ int) bool { return test.isTerminal }, &c, test.cluster)1010			if err != nil {1011				t.Fatal(err)1012			}1013			stderr := &bytes.Buffer{}1014			a.stderr = stderr1015			a.environ = func() []string { return nil }1016			if err := a.refreshCredsLocked(test.response); err != nil {1017				if !test.wantErr {1018					t.Errorf("get token %v", err)1019				} else if !strings.Contains(err.Error(), test.wantErrSubstr) {1020					t.Errorf("expected error with substring '%v' got '%v'", test.wantErrSubstr, err.Error())1021				}1022				return1023			}1024			if test.wantErr {1025				t.Fatal("expected error getting token")1026			}1027			if !reflect.DeepEqual(a.cachedCreds, &test.wantCreds) {1028				t.Errorf("expected credentials %+v got %+v", &test.wantCreds, a.cachedCreds)1029			}1030			if !a.exp.Equal(test.wantExpiry) {1031				t.Errorf("expected expiry %v got %v", test.wantExpiry, a.exp)1032			}1033			if test.wantInput == "" {1034				if got := strings.TrimSpace(stderr.String()); got != "" {1035					t.Errorf("expected no input parameters, got %q", got)1036				}1037				return1038			}1039			compJSON(t, stderr.Bytes(), []byte(test.wantInput))1040		})1041	}1042}1043func TestRoundTripper(t *testing.T) {1044	wantToken := ""1045	n := time.Now()1046	now := func() time.Time { return n }1047	env := []string{""}1048	environ := func() []string {1049		s := make([]string, len(env))1050		copy(s, env)1051		return s1052	}1053	setOutput := func(s string) {1054		env[0] = "TEST_OUTPUT=" + s1055	}1056	handler := func(w http.ResponseWriter, r *http.Request) {1057		gotToken := ""1058		parts := strings.Split(r.Header.Get("Authorization"), " ")1059		if len(parts) > 1 && strings.EqualFold(parts[0], "bearer") {1060			gotToken = parts[1]1061		}1062		if wantToken != gotToken {1063			http.Error(w, "Unauthorized", http.StatusUnauthorized)1064			return1065		}1066		fmt.Fprintln(w, "ok")1067	}1068	server := httptest.NewServer(http.HandlerFunc(handler))1069	c := api.ExecConfig{1070		Command:         "./testdata/test-plugin.sh",1071		APIVersion:      "client.authentication.k8s.io/v1alpha1",1072		InteractiveMode: api.IfAvailableExecInteractiveMode,1073	}1074	a, err := newAuthenticator(newCache(), func(_ int) bool { return false }, &c, nil)1075	if err != nil {1076		t.Fatal(err)1077	}1078	a.environ = environ1079	a.now = now1080	a.stderr = ioutil.Discard1081	tc := &transport.Config{}1082	if err := a.UpdateTransportConfig(tc); err != nil {1083		t.Fatal(err)1084	}1085	client := http.Client{1086		Transport: tc.WrapTransport(http.DefaultTransport),1087	}1088	get := func(t *testing.T, statusCode int) {1089		t.Helper()1090		resp, err := client.Get(server.URL)1091		if err != nil {1092			t.Fatal(err)1093		}1094		defer resp.Body.Close()1095		if resp.StatusCode != statusCode {1096			t.Errorf("wanted status %d got %d", statusCode, resp.StatusCode)1097		}1098	}1099	setOutput(`{1100		"kind": "ExecCredential",1101		"apiVersion": "client.authentication.k8s.io/v1alpha1",1102		"status": {1103			"token": "token1"1104		}1105	}`)1106	wantToken = "token1"1107	get(t, http.StatusOK)1108	setOutput(`{1109		"kind": "ExecCredential",1110		"apiVersion": "client.authentication.k8s.io/v1alpha1",1111		"status": {1112			"token": "token2"1113		}1114	}`)1115	// Previous token should be cached1116	get(t, http.StatusOK)1117	wantToken = "token2"1118	// Token is still cached, hits unauthorized but causes token to rotate.1119	get(t, http.StatusUnauthorized)1120	// Follow up request uses the rotated token.1121	get(t, http.StatusOK)1122	setOutput(`{1123		"kind": "ExecCredential",1124		"apiVersion": "client.authentication.k8s.io/v1alpha1",1125		"status": {1126			"token": "token3",1127			"expirationTimestamp": "` + now().Add(time.Hour).Format(time.RFC3339Nano) + `"1128		}1129	}`)1130	wantToken = "token3"1131	// Token is still cached, hit's unauthorized but causes rotation to token with an expiry.1132	get(t, http.StatusUnauthorized)1133	get(t, http.StatusOK)1134	// Move time forward 2 hours, "token3" is now expired.1135	n = n.Add(time.Hour * 2)1136	setOutput(`{1137		"kind": "ExecCredential",1138		"apiVersion": "client.authentication.k8s.io/v1alpha1",1139		"status": {1140			"token": "token4",1141			"expirationTimestamp": "` + now().Add(time.Hour).Format(time.RFC3339Nano) + `"1142		}1143	}`)1144	wantToken = "token4"1145	// Old token is expired, should refresh automatically without hitting a 401.1146	get(t, http.StatusOK)1147}1148func TestAuthorizationHeaderPresentCancelsExecAction(t *testing.T) {1149	tests := []struct {1150		name               string1151		setTransportConfig func(*transport.Config)1152	}{1153		{1154			name: "bearer token",1155			setTransportConfig: func(config *transport.Config) {1156				config.BearerToken = "token1f"1157			},1158		},1159		{1160			name: "basic auth",1161			setTransportConfig: func(config *transport.Config) {1162				config.Username = "marshmallow"1163				config.Password = "zelda"1164			},1165		},1166	}1167	for _, test := range tests {1168		t.Run(test.name, func(t *testing.T) {1169			a, err := newAuthenticator(newCache(), func(_ int) bool { return false }, &api.ExecConfig{1170				Command:    "./testdata/test-plugin.sh",1171				APIVersion: "client.authentication.k8s.io/v1alpha1",1172			}, nil)1173			if err != nil {1174				t.Fatal(err)1175			}1176			// UpdateTransportConfig returns error on existing TLS certificate callback, unless a bearer token is present in the1177			// transport config, in which case it takes precedence1178			cert := func() (*tls.Certificate, error) {1179				return nil, nil1180			}1181			tc := &transport.Config{TLS: transport.TLSConfig{Insecure: true, GetCert: cert}}1182			test.setTransportConfig(tc)1183			if err := a.UpdateTransportConfig(tc); err != nil {1184				t.Error("Expected presence of bearer token in config to cancel exec action")1185			}1186		})1187	}1188}1189func TestTLSCredentials(t *testing.T) {1190	now := time.Now()1191	certPool := x509.NewCertPool()1192	cert, key := genClientCert(t)1193	if !certPool.AppendCertsFromPEM(cert) {1194		t.Fatal("failed to add client cert to CertPool")1195	}1196	server := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {1197		fmt.Fprintln(w, "ok")1198	}))1199	server.TLS = &tls.Config{1200		ClientAuth: tls.RequireAndVerifyClientCert,1201		ClientCAs:  certPool,1202	}1203	server.StartTLS()1204	defer server.Close()1205	a, err := newAuthenticator(newCache(), func(_ int) bool { return false }, &api.ExecConfig{1206		Command:         "./testdata/test-plugin.sh",1207		APIVersion:      "client.authentication.k8s.io/v1alpha1",1208		InteractiveMode: api.IfAvailableExecInteractiveMode,1209	}, nil)1210	if err != nil {1211		t.Fatal(err)1212	}1213	var output *clientauthentication.ExecCredential1214	a.environ = func() []string {1215		data, err := runtime.Encode(codecs.LegacyCodec(a.group), output)1216		if err != nil {1217			t.Fatal(err)1218		}1219		return []string{"TEST_OUTPUT=" + string(data)}1220	}1221	a.now = func() time.Time { return now }1222	a.stderr = ioutil.Discard1223	// We're not interested in server's cert, this test is about client cert.1224	tc := &transport.Config{TLS: transport.TLSConfig{Insecure: true}}1225	if err := a.UpdateTransportConfig(tc); err != nil {1226		t.Fatal(err)1227	}1228	get := func(t *testing.T, desc string, wantErr bool) {1229		t.Run(desc, func(t *testing.T) {1230			tlsCfg, err := transport.TLSConfigFor(tc)1231			if err != nil {1232				t.Fatal("TLSConfigFor:", err)1233			}1234			client := http.Client{1235				Transport: &http.Transport{TLSClientConfig: tlsCfg},1236			}1237			resp, err := client.Get(server.URL)1238			switch {1239			case err != nil && !wantErr:1240				t.Errorf("got client.Get error: %q, want nil", err)1241			case err == nil && wantErr:1242				t.Error("got nil client.Get error, want non-nil")1243			}1244			if err == nil {1245				resp.Body.Close()1246			}1247		})1248	}1249	output = &clientauthentication.ExecCredential{1250		Status: &clientauthentication.ExecCredentialStatus{1251			ClientCertificateData: string(cert),1252			ClientKeyData:         string(key),1253			ExpirationTimestamp:   &v1.Time{now.Add(time.Hour)},1254		},1255	}1256	get(t, "valid TLS cert", false)1257	// Advance time to force re-exec.1258	nCert, nKey := genClientCert(t)1259	now = now.Add(time.Hour * 2)1260	output = &clientauthentication.ExecCredential{1261		Status: &clientauthentication.ExecCredentialStatus{1262			ClientCertificateData: string(nCert),1263			ClientKeyData:         string(nKey),1264			ExpirationTimestamp:   &v1.Time{now.Add(time.Hour)},1265		},1266	}1267	get(t, "untrusted TLS cert", true)1268	now = now.Add(time.Hour * 2)1269	output = &clientauthentication.ExecCredential{1270		Status: &clientauthentication.ExecCredentialStatus{1271			ClientCertificateData: string(cert),1272			ClientKeyData:         string(key),1273			ExpirationTimestamp:   &v1.Time{now.Add(time.Hour)},1274		},1275	}1276	get(t, "valid TLS cert again", false)1277}1278func TestConcurrentUpdateTransportConfig(t *testing.T) {1279	n := time.Now()1280	now := func() time.Time { return n }1281	env := []string{""}1282	environ := func() []string {1283		s := make([]string, len(env))1284		copy(s, env)1285		return s1286	}1287	c := api.ExecConfig{1288		Command:    "./testdata/test-plugin.sh",1289		APIVersion: "client.authentication.k8s.io/v1alpha1",1290	}1291	a, err := newAuthenticator(newCache(), func(_ int) bool { return false }, &c, nil)1292	if err != nil {1293		t.Fatal(err)1294	}1295	a.environ = environ1296	a.now = now1297	a.stderr = ioutil.Discard1298	stopCh := make(chan struct{})1299	defer close(stopCh)1300	numConcurrent := 21301	for i := 0; i < numConcurrent; i++ {1302		go func() {1303			for {1304				tc := &transport.Config{}1305				a.UpdateTransportConfig(tc)1306				select {1307				case <-stopCh:1308					return1309				default:1310					continue1311				}1312			}1313		}()1314	}1315	time.Sleep(2 * time.Second)1316}1317func TestInstallHintRateLimit(t *testing.T) {1318	tests := []struct {1319		name string1320		threshold int1321		interval  time.Duration1322		calls          int1323		perCallAdvance time.Duration1324		wantInstallHint int1325	}{1326		{1327			name:            "print-up-to-threshold",1328			threshold:       2,1329			interval:        time.Second,1330			calls:           10,1331			wantInstallHint: 2,1332		},1333		{1334			name:            "after-interval-threshold-resets",1335			threshold:       2,1336			interval:        time.Second * 5,1337			calls:           10,1338			perCallAdvance:  time.Second,1339			wantInstallHint: 4,1340		},1341	}1342	for _, test := range tests {1343		t.Run(test.name, func(t *testing.T) {1344			c := api.ExecConfig{1345				Command:         "does not exist",1346				APIVersion:      "client.authentication.k8s.io/v1alpha1",1347				InstallHint:     "some install hint",1348				InteractiveMode: api.IfAvailableExecInteractiveMode,1349			}1350			a, err := newAuthenticator(newCache(), func(_ int) bool { return false }, &c, nil)1351			if err != nil {1352				t.Fatal(err)1353			}1354			a.sometimes.threshold = test.threshold1355			a.sometimes.interval = test.interval1356			clock := testingclock.NewFakeClock(time.Now())1357			a.sometimes.clock = clock1358			count := 01359			for i := 0; i < test.calls; i++ {1360				err := a.refreshCredsLocked(&clientauthentication.Response{})...APIVersion
Using AI Code Generation
1import (2func main() {3    cli, err := client.NewEnvClient()4    if err != nil {5        panic(err)6    }7    version, err := cli.ServerVersion(context.Background())8    if err != nil {9        panic(err)10    }11    fmt.Println(version.APIVersion)12}13import (14func main() {15    cli, err := client.NewEnvClient()16    if err != nil {17        panic(err)18    }19    ctx := context.Background()20    container, err := cli.ContainerCreate(ctx, &container.Config{21        Cmd:   []string{"sh", "-c", "while true; do echo hello world; sleep 1; done"},22    }, nil, nil, "")23    if err != nil {24        panic(err)25    }26    fmt.Println(container.ID)27    containers, err := cli.ContainerList(ctx, types.ContainerListOptions{})28    if err != nil {29        panic(err)30    }31    for _, container := range containers {32        fmt.Println(container.ID)33    }34    if err := cli.ContainerStart(ctx, container.ID, types.ContainerStartOptions{}); err != nil {35        panic(err)36    }37    if err := cli.ContainerStop(ctx, container.ID, nil); err != nil {38        panic(err)39    }40    inspect, err := cli.ContainerInspect(ctx, container.ID)41    if err != nil {42        panic(err)43    }44    fmt.Println(inspect.State.Pid)45    if err := cli.ContainerPause(ctx, container.ID); err != nil {46        panic(err)47    }48    if err := cli.ContainerUnpause(ctx, container.ID);APIVersion
Using AI Code Generation
1import (2type HelloPlugin struct {3}4func main() {5	plugin.Start(new(HelloPlugin))6}7func (h *HelloPlugin) Run(context plugin.PluginContext, args []string) {8	h.terminal = terminal.NewStdUI()9	h.terminal.Say("Hello IBM Cloud")10	h.terminal.Say("APIVersion: %s", context.APIVersion())11}12func (h *HelloPlugin) GetMetadata() plugin.PluginMetadata {13	return plugin.PluginMetadata{14		Commands: []plugin.Command{15			{16				HelpText: i18n.T("hello command"),17				UsageDetails: plugin.Usage{18					Usage: i18n.T("{{.CommandName}}"),19				},20			},21		},22	}23}APIVersion
Using AI Code Generation
1import (2func main() {3	sess, err := session.New()4	if err != nil {5		fmt.Println(err)6	}7	clusterAPI := containerv1.New(sess)8	version, err := clusterAPI.APIVersion()9	if err != nil {10		fmt.Println(err)11	}12	fmt.Println(version)13}14import (15func main() {16	sess, err := session.New()17	if err != nil {18		fmt.Println(err)19	}20	clusterAPI := containerv1.New(sess)21	cluster, err := clusterAPI.Clusters().Get("test", "test")22	if err != nil {APIVersion
Using AI Code Generation
1import (2func main() {3    config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)4    if err != nil {5        panic(err.Error())6    }7    clientset, err := kubernetes.NewForConfig(config)8    if err != nil {9        panic(err.Error())10    }11    fmt.Println(clientset.Discovery().RESTClient().APIVersion())12}13&APIVersions{types.APIVersions{Versions:[]string{"v1"}, ServerAddressByClientCIDRs:[]types.ServerAddressByClientCIDR(nil)}}APIVersion
Using AI Code Generation
1import (2func main() {3   client, _ := elasticsearch.NewDefaultClient()4   info, _ := client.Info()5   fmt.Println(info.Version.Number)6}APIVersion
Using AI Code Generation
1import (2func main() {3	v, err := metadata.APIVersion()4	if err != nil {5		fmt.Println("Error:", err)6	}7	fmt.Println("API version:", v)8}9import (10func main() {11	if err != nil {12		fmt.Println("Error:", err)13	}14	v, err := client.APIVersion()15	if err != nil {16		fmt.Println("Error:", err)17	}18	fmt.Println("API version:", v)19}20import (21func main() {22	projectID, err := metadata.ProjectID()23	if err != nil {24		fmt.Println("Error:", err)25	}26	fmt.Println("Project ID:", projectID)27}APIVersion
Using AI Code Generation
1import (2type IBMCloudPlugin struct {3}4func main() {5	plugin.Start(new(IBMCloudPlugin))6}7func (p *IBMCloudPlugin) Run(context plugin.PluginContext, args []string) {8	ui := terminal.NewStdUI()9	ui.Say("Hello World")10}11func (p *IBMCloudPlugin) GetMetadata() plugin.PluginMetadata {12	return plugin.PluginMetadata{13		Version: plugin.VersionType{14		},15		Commands: []plugin.Command{16			{17				UsageDetails: plugin.Usage{18				},19			},20		},21	}22}APIVersion
Using AI Code Generation
1import (2func main() {3	fmt.Println("APIVersion is", metadata.APIVersion())4}5import (6func main() {7	fmt.Println("ProjectID is", metadata.ProjectID())8}9import (10func main() {11	fmt.Println("Zone is", metadata.Zone())12}13import (14func main() {15	fmt.Println("InstanceID is", metadata.InstanceID())16}17import (18func main() {19	fmt.Println("InstanceName is", metadata.InstanceName())20}21import (22func main() {23	fmt.Println("Hostname is", metadata.Hostname())24}25import (26func main() {27	attributes, err := metadata.Attributes()28	if err != nil {Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
