Skip to content

Commit 6832a9c

Browse files
author
Jan Wozniak
committed
new-app: verify if API has required resources enabled
1 parent d4e8f05 commit 6832a9c

File tree

2 files changed

+61
-4
lines changed

2 files changed

+61
-4
lines changed

Diff for: pkg/oc/cli/cmd/newapp.go

+55
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@ import (
2020
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2121
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2222
"k8s.io/apimachinery/pkg/runtime"
23+
"k8s.io/apimachinery/pkg/runtime/schema"
2324
"k8s.io/apimachinery/pkg/util/errors"
2425
"k8s.io/apimachinery/pkg/util/sets"
2526
"k8s.io/apimachinery/pkg/util/wait"
27+
"k8s.io/client-go/discovery"
2628
"k8s.io/client-go/dynamic"
2729
restclient "k8s.io/client-go/rest"
2830
"k8s.io/kubernetes/pkg/api/legacyscheme"
@@ -154,6 +156,50 @@ type NewAppOptions struct {
154156
*ObjectGeneratorOptions
155157
}
156158

159+
func nonEmpty(str string, def string) string {
160+
if str == "" {
161+
return def
162+
}
163+
return str
164+
}
165+
166+
func checkResources(discoveryClient discovery.DiscoveryInterface, items []runtime.Object) error {
167+
resources, err := discoveryClient.ServerResources()
168+
if err != nil {
169+
return fmt.Errorf("Unable to to get list of available resources: %v", err)
170+
}
171+
172+
resourceMap := make(map[schema.GroupVersionKind]bool)
173+
for _, resourceList := range resources {
174+
for _, resource := range resourceList.APIResources {
175+
listGv, _ := schema.ParseGroupVersion(resourceList.GroupVersion)
176+
gvk := schema.GroupVersionKind{
177+
Group: nonEmpty(resource.Group, listGv.Group),
178+
Version: nonEmpty(resource.Version, listGv.Version),
179+
Kind: resource.Kind,
180+
}
181+
resourceMap[gvk] = true
182+
}
183+
}
184+
185+
declaredResources := make(map[schema.GroupVersionKind]bool)
186+
for _, item := range items {
187+
versioned := kcmdutil.AsDefaultVersionedOrOriginal(item, nil)
188+
declaredResources[versioned.GetObjectKind().GroupVersionKind()] = true
189+
}
190+
missingResources := make([]string, 0)
191+
for r := range declaredResources {
192+
if present := resourceMap[r]; !present {
193+
missingResources = append(missingResources, r.String())
194+
}
195+
}
196+
197+
if len(missingResources) > 0 {
198+
return fmt.Errorf("Missing declared resources: %v", strings.Join(missingResources, `, `))
199+
}
200+
return nil
201+
}
202+
157203
//Complete sets all common default options for commands (new-app and new-build)
158204
func (o *ObjectGeneratorOptions) Complete(baseName, commandName string, f kcmdutil.Factory, c *cobra.Command, args []string, in io.Reader, out, errout io.Writer) error {
159205
cmdutil.WarnAboutCommaSeparation(errout, o.Config.Environment, "--env")
@@ -184,6 +230,12 @@ func (o *ObjectGeneratorOptions) Complete(baseName, commandName string, f kcmdut
184230
return err
185231
}
186232

233+
discoveryClient, err := discovery.NewDiscoveryClientForConfig(clientConfig)
234+
if err != nil {
235+
return fmt.Errorf("Unable to validate if required resources are available: %v", err)
236+
}
237+
o.Config.DiscoveryClient = discoveryClient
238+
187239
o.Action.Out, o.Action.ErrOut = out, o.ErrOut
188240
o.Action.Bulk.Scheme = legacyscheme.Scheme
189241
o.Action.Bulk.Op = bulk.Creator{Client: dynamicClient, RESTMapper: mapper}.Create
@@ -307,6 +359,9 @@ func (o *NewAppOptions) RunNewApp() error {
307359
if err := handleError(err, o.BaseName, o.CommandName, o.CommandPath, config, transformRunError); err != nil {
308360
return err
309361
}
362+
if err := checkResources(config.DiscoveryClient, result.List.Items); err != nil {
363+
return err
364+
}
310365

311366
// set labels explicitly supplied by the user on the command line
312367
if err := setLabels(config.Labels, result); err != nil {

Diff for: pkg/oc/generate/cmd/newapp.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"k8s.io/apimachinery/pkg/runtime"
1919
kutilerrors "k8s.io/apimachinery/pkg/util/errors"
2020
"k8s.io/apimachinery/pkg/util/sets"
21+
"k8s.io/client-go/discovery"
2122
kapi "k8s.io/kubernetes/pkg/apis/core"
2223
"k8s.io/kubernetes/pkg/apis/core/validation"
2324
kclientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
@@ -114,10 +115,11 @@ type AppConfig struct {
114115
Out io.Writer
115116
ErrOut io.Writer
116117

117-
KubeClient kclientset.Interface
118-
ImageClient imageclient.ImageInterface
119-
RouteClient routeclient.RouteInterface
120-
TemplateClient templateclient.TemplateInterface
118+
KubeClient kclientset.Interface
119+
ImageClient imageclient.ImageInterface
120+
RouteClient routeclient.RouteInterface
121+
TemplateClient templateclient.TemplateInterface
122+
DiscoveryClient discovery.DiscoveryInterface
121123

122124
Resolvers
123125

0 commit comments

Comments
 (0)