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.
... | ... |
@@ -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: |