Skip to content

Commit bf1f4e2

Browse files
committed
patch kubeconfig if token cannot be deleted via api
remove token from config on error / success from api req log server error to prevent failure on sa logout
1 parent 19aa349 commit bf1f4e2

File tree

2 files changed

+27
-12
lines changed

2 files changed

+27
-12
lines changed

pkg/cmd/cli/cmd/login/logout.go

+18-12
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"io"
77

8+
"github.com/golang/glog"
89
"github.com/spf13/cobra"
910

1011
"k8s.io/kubernetes/pkg/client/restclient"
@@ -124,24 +125,29 @@ func (o LogoutOptions) RunLogout() error {
124125
}
125126

126127
if err := client.OAuthAccessTokens().Delete(token); err != nil {
127-
return err
128+
glog.V(1).Infof("%v\n", err)
128129
}
129130

130-
newConfig := *o.StartingKubeConfig
131+
configErr := deleteTokenFromConfig(*o.StartingKubeConfig, o.PathOptions, token)
132+
if configErr == nil {
133+
glog.V(1).Infof("Removed token from your local configuration.\n\n")
134+
135+
// only return error instead of successful message if removing token from client
136+
// config fails. Any error that occurs deleting token using api is logged above.
137+
fmt.Fprintf(o.Out, "Logged %q out on %q\n", userInfo.Name, o.Config.Host)
138+
}
139+
140+
return configErr
141+
}
131142

132-
for key, value := range newConfig.AuthInfos {
133-
if value.Token == token {
143+
func deleteTokenFromConfig(config kclientcmdapi.Config, pathOptions *kclientcmd.PathOptions, bearerToken string) error {
144+
for key, value := range config.AuthInfos {
145+
if value.Token == bearerToken {
134146
value.Token = ""
135-
newConfig.AuthInfos[key] = value
147+
config.AuthInfos[key] = value
136148
// don't break, its possible that more than one user stanza has the same token.
137149
}
138150
}
139151

140-
if err := kclientcmd.ModifyConfig(o.PathOptions, newConfig, true); err != nil {
141-
return err
142-
}
143-
144-
fmt.Fprintf(o.Out, "Logged %q out on %q\n", userInfo.Name, o.Config.Host)
145-
146-
return nil
152+
return kclientcmd.ModifyConfig(pathOptions, config, true)
147153
}

test/cmd/login.sh

+9
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,15 @@ os::cmd::expect_failure_and_text 'oc get pods' '"system:anonymous" cannot list p
8787
# os::cmd::expect_failure_and_text "oc login '${KUBERNETES_MASTER}' -u test -p test '--config=${templocation}/file' --insecure-skip-tls-verify" 'KUBECONFIG is set to a file that cannot be created or modified'
8888
echo "login warnings: ok"
8989

90+
# login and create serviceaccount and test login and logout with a service account token
91+
os::cmd::expect_success "oc login ${KUBERNETES_MASTER} --certificate-authority='${MASTER_CONFIG_DIR}/ca.crt' -u test-user -p anything --api-version=v1"
92+
os::cmd::expect_success_and_text "oc create sa testserviceaccount" "serviceaccount \"testserviceaccount\" created"
93+
os::cmd::expect_success_and_text "oc login --token=$(oc sa get-token testserviceaccount)" "system:serviceaccount:project-foo:testserviceaccount"
94+
# attempt to logout successfully
95+
os::cmd::expect_success_and_text "oc logout" "Logged \"system:serviceaccount:project-foo:testserviceaccount\" out"
96+
# verify that the token is no longer present in our local config
97+
os::cmd::expect_failure_and_text "oc whoami" "User \"system:anonymous\" cannot get users"
98+
9099
# log in and set project to use from now on
91100
os::cmd::expect_success "oc login --server=${KUBERNETES_MASTER} --certificate-authority='${MASTER_CONFIG_DIR}/ca.crt' -u test-user -p anything"
92101
os::cmd::expect_success 'oc get projects'

0 commit comments

Comments
 (0)