Browse code

Project should not fetch client immediately

oc project can be used to switch config contexts, but loads its client
in the Complete() method which does API negotiation. Since a user may
not be logged in or the server they are talking to may be down, changing
projects then doesn't work.

Use a lazy client loader just for project until we can sort out lazy api
negotiation and/or something better on client.

Clayton Coleman authored on 2016/05/07 04:51:33
Showing 1 changed files
... ...
@@ -23,8 +23,8 @@ import (
23 23
 
24 24
 type ProjectOptions struct {
25 25
 	Config       clientcmdapi.Config
26
-	Client       *client.Client
27 26
 	ClientConfig *restclient.Config
27
+	ClientFn     func() (*client.Client, error)
28 28
 	Out          io.Writer
29 29
 	PathOptions  *kubecmdconfig.PathOptions
30 30
 
... ...
@@ -104,9 +104,9 @@ func (o *ProjectOptions) Complete(f *clientcmd.Factory, args []string, out io.Wr
104 104
 		return err
105 105
 	}
106 106
 
107
-	o.Client, _, err = f.Clients()
108
-	if err != nil {
109
-		return err
107
+	o.ClientFn = func() (*client.Client, error) {
108
+		client, _, err := f.Clients()
109
+		return client, err
110 110
 	}
111 111
 
112 112
 	o.Out = out
... ...
@@ -134,8 +134,12 @@ func (o ProjectOptions) RunProject() error {
134 134
 				return nil
135 135
 			}
136 136
 
137
-			_, err := o.Client.Projects().Get(currentProject)
137
+			client, err := o.ClientFn()
138 138
 			if err != nil {
139
+				return err
140
+			}
141
+
142
+			if _, err := client.Projects().Get(currentProject); err != nil {
139 143
 				if kapierrors.IsNotFound(err) {
140 144
 					return fmt.Errorf("the project %q specified in your config does not exist.", currentProject)
141 145
 				}
... ...
@@ -181,8 +185,12 @@ func (o ProjectOptions) RunProject() error {
181 181
 
182 182
 	} else {
183 183
 		if !o.SkipAccessValidation {
184
-			_, err := o.Client.Projects().Get(argument)
184
+			client, err := o.ClientFn()
185 185
 			if err != nil {
186
+				return err
187
+			}
188
+
189
+			if _, err := client.Projects().Get(argument); err != nil {
186 190
 				if isNotFound, isForbidden := kapierrors.IsNotFound(err), clientcmd.IsForbidden(err); isNotFound || isForbidden {
187 191
 					var msg string
188 192
 					if isForbidden {
... ...
@@ -191,7 +199,7 @@ func (o ProjectOptions) RunProject() error {
191 191
 						msg = fmt.Sprintf("A project named %q does not exist on %q.", argument, clientCfg.Host)
192 192
 					}
193 193
 
194
-					projects, err := getProjects(o.Client)
194
+					projects, err := getProjects(client)
195 195
 					if err == nil {
196 196
 						switch len(projects) {
197 197
 						case 0: