9
9
kapi "k8s.io/kubernetes/pkg/api"
10
10
kapierrors "k8s.io/kubernetes/pkg/api/errors"
11
11
"k8s.io/kubernetes/pkg/client/restclient"
12
+ kclient "k8s.io/kubernetes/pkg/client/unversioned"
12
13
kclientcmd "k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
13
14
clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api"
14
15
kcmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
@@ -17,14 +18,15 @@ import (
17
18
cliconfig "github.com/openshift/origin/pkg/cmd/cli/config"
18
19
"github.com/openshift/origin/pkg/cmd/util/clientcmd"
19
20
"github.com/openshift/origin/pkg/project/api"
21
+ projectutil "github.com/openshift/origin/pkg/project/util"
20
22
21
23
"github.com/spf13/cobra"
22
24
)
23
25
24
26
type ProjectOptions struct {
25
27
Config clientcmdapi.Config
26
28
ClientConfig * restclient.Config
27
- ClientFn func () (* client.Client , error )
29
+ ClientFn func () (* client.Client , kclient. Interface , error )
28
30
Out io.Writer
29
31
PathOptions * kclientcmd.PathOptions
30
32
@@ -103,9 +105,8 @@ func (o *ProjectOptions) Complete(f *clientcmd.Factory, args []string, out io.Wr
103
105
return err
104
106
}
105
107
106
- o .ClientFn = func () (* client.Client , error ) {
107
- client , _ , err := f .Clients ()
108
- return client , err
108
+ o .ClientFn = func () (* client.Client , kclient.Interface , error ) {
109
+ return f .Clients ()
109
110
}
110
111
111
112
o .Out = out
@@ -136,18 +137,17 @@ func (o ProjectOptions) RunProject() error {
136
137
return nil
137
138
}
138
139
139
- client , err := o .ClientFn ()
140
+ client , kubeclient , err := o .ClientFn ()
140
141
if err != nil {
141
142
return err
142
143
}
143
144
144
- if _ , err := client .Projects ().Get (currentProject ); err != nil {
145
- if kapierrors .IsNotFound (err ) {
146
- return fmt .Errorf ("the project %q specified in your config does not exist." , currentProject )
147
- }
148
- if clientcmd .IsForbidden (err ) {
149
- return fmt .Errorf ("you do not have rights to view project %q." , currentProject )
150
- }
145
+ switch err := confirmProjectAccess (currentProject , client , kubeclient ); {
146
+ case clientcmd .IsForbidden (err ):
147
+ return fmt .Errorf ("you do not have rights to view project %q." , currentProject )
148
+ case kapierrors .IsNotFound (err ):
149
+ return fmt .Errorf ("the project %q specified in your config does not exist." , currentProject )
150
+ case err != nil :
151
151
return err
152
152
}
153
153
@@ -187,12 +187,12 @@ func (o ProjectOptions) RunProject() error {
187
187
188
188
} else {
189
189
if ! o .SkipAccessValidation {
190
- client , err := o .ClientFn ()
190
+ client , kubeclient , err := o .ClientFn ()
191
191
if err != nil {
192
192
return err
193
193
}
194
194
195
- if _ , err := client . Projects (). Get ( argument ); err != nil {
195
+ if err := confirmProjectAccess ( argument , client , kubeclient ); err != nil {
196
196
if isNotFound , isForbidden := kapierrors .IsNotFound (err ), clientcmd .IsForbidden (err ); isNotFound || isForbidden {
197
197
var msg string
198
198
if isForbidden {
@@ -201,7 +201,7 @@ func (o ProjectOptions) RunProject() error {
201
201
msg = fmt .Sprintf ("A project named %q does not exist on %q." , argument , clientCfg .Host )
202
202
}
203
203
204
- projects , err := getProjects (client )
204
+ projects , err := getProjects (client , kubeclient )
205
205
if err == nil {
206
206
switch len (projects ) {
207
207
case 0 :
@@ -277,11 +277,35 @@ func (o ProjectOptions) RunProject() error {
277
277
return nil
278
278
}
279
279
280
- func getProjects (oClient * client.Client ) ([]api.Project , error ) {
280
+ func confirmProjectAccess (currentProject string , oClient * client.Client , kClient kclient.Interface ) error {
281
+ _ , projectErr := oClient .Projects ().Get (currentProject )
282
+ if ! kapierrors .IsNotFound (projectErr ) {
283
+ return projectErr
284
+ }
285
+
286
+ // at this point we know the error is a not found, but we'll test namespaces just in case we're running on kube
287
+ if _ , err := kClient .Namespaces ().Get (currentProject ); err == nil {
288
+ return nil
289
+ }
290
+
291
+ // otherwise return the openshift error default
292
+ return projectErr
293
+ }
294
+
295
+ func getProjects (oClient * client.Client , kClient kclient.Interface ) ([]api.Project , error ) {
281
296
projects , err := oClient .Projects ().List (kapi.ListOptions {})
297
+ if err == nil {
298
+ return projects .Items , nil
299
+ }
300
+ if err != nil && ! kapierrors .IsNotFound (err ) {
301
+ return nil , err
302
+ }
303
+
304
+ namespaces , err := kClient .Namespaces ().List (kapi.ListOptions {})
282
305
if err != nil {
283
306
return nil , err
284
307
}
308
+ projects = projectutil .ConvertNamespaceList (namespaces )
285
309
return projects .Items , nil
286
310
}
287
311
0 commit comments