15
15
package framework
16
16
17
17
import (
18
- "errors"
18
+ "bytes"
19
+ goctx "context"
19
20
"strings"
20
21
21
22
y2j "github.com/ghodss/yaml"
22
23
yaml "gopkg.in/yaml.v2"
23
- apps "k8s.io/api/apps/v1"
24
24
core "k8s.io/api/core/v1"
25
- "k8s.io/api/rbac/v1beta1"
26
- crd "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
27
- extensions_scheme "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme"
28
- apierrors "k8s.io/apimachinery/pkg/api/errors"
29
25
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
30
26
"k8s.io/apimachinery/pkg/runtime/schema"
31
27
"k8s.io/apimachinery/pkg/runtime/serializer"
@@ -77,7 +73,7 @@ func (ctx *TestCtx) GetCRClient(yamlCR []byte) (*rest.RESTClient, error) {
77
73
return ctx .CRClient , nil
78
74
}
79
75
80
- func (ctx * TestCtx ) createCRFromYAML (yamlFile []byte , resourceName string ) error {
76
+ func (ctx * TestCtx ) createCRFromYAML (yamlFile []byte ) error {
81
77
client , err := ctx .GetCRClient (yamlFile )
82
78
if err != nil {
83
79
return err
@@ -86,6 +82,13 @@ func (ctx *TestCtx) createCRFromYAML(yamlFile []byte, resourceName string) error
86
82
if err != nil {
87
83
return err
88
84
}
85
+ yamlMap := make (map [interface {}]interface {})
86
+ err = yaml .Unmarshal (yamlFile , & yamlMap )
87
+ if err != nil {
88
+ return err
89
+ }
90
+ kind := yamlMap ["kind" ].(string )
91
+ resourceName := kind + "s"
89
92
jsonDat , err := y2j .YAMLToJSON (yamlFile )
90
93
err = client .Post ().
91
94
Namespace (namespace ).
@@ -104,80 +107,41 @@ func (ctx *TestCtx) createCRFromYAML(yamlFile []byte, resourceName string) error
104
107
return err
105
108
}
106
109
107
- func ( ctx * TestCtx ) createCRDFromYAML ( yamlFile []byte ) error {
108
- decode := extensions_scheme . Codecs . UniversalDeserializer (). Decode
109
- obj , _ , err := decode (yamlFile , nil , nil )
110
+ func setNamespaceYAML ( yamlFile [] byte , namespace string ) ( []byte , error ) {
111
+ yamlMap := make ( map [ interface {}] interface {})
112
+ err := yaml . Unmarshal (yamlFile , & yamlMap )
110
113
if err != nil {
111
- return err
112
- }
113
- switch o := obj .(type ) {
114
- case * crd.CustomResourceDefinition :
115
- _ , err = Global .ExtensionsClient .ApiextensionsV1beta1 ().CustomResourceDefinitions ().Create (o )
116
- ctx .AddFinalizerFn (func () error {
117
- err = Global .ExtensionsClient .ApiextensionsV1beta1 ().CustomResourceDefinitions ().Delete (o .Name , metav1 .NewDeleteOptions (0 ))
118
- if err != nil && ! apierrors .IsNotFound (err ) {
119
- return err
120
- }
121
- return nil
122
- })
123
- if apierrors .IsAlreadyExists (err ) {
124
- return nil
125
- }
126
- return err
127
- default :
128
- return errors .New ("non-CRD resource in createCRDFromYAML function" )
114
+ return nil , err
129
115
}
116
+ yamlMap ["metadata" ].(map [interface {}]interface {})["namespace" ] = namespace
117
+ return yaml .Marshal (yamlMap )
130
118
}
131
119
132
120
func (ctx * TestCtx ) CreateFromYAML (yamlFile []byte ) error {
133
- yamlMap := make (map [interface {}]interface {})
134
- err := yaml .Unmarshal (yamlFile , & yamlMap )
121
+ namespace , err := ctx .GetNamespace ()
135
122
if err != nil {
136
123
return err
137
124
}
138
- kind := yamlMap ["kind" ].(string )
139
- switch kind {
140
- case "Role" :
141
- case "RoleBinding" :
142
- case "Deployment" :
143
- case "CustomResourceDefinition" :
144
- return ctx .createCRDFromYAML (yamlFile )
145
- // we assume that all custom resources are from operator-sdk and thus follow
146
- // a common naming convention
147
- default :
148
- return ctx .createCRFromYAML (yamlFile , strings .ToLower (kind )+ "s" )
149
- }
125
+ yamlSplit := bytes .Split (yamlFile , []byte ("\n ---\n " ))
126
+ for _ , yamlSpec := range yamlSplit {
127
+ yamlSpec , err = setNamespaceYAML (yamlSpec , namespace )
128
+ if err != nil {
129
+ return err
130
+ }
150
131
151
- decode := scheme .Codecs .UniversalDeserializer ().Decode
152
- obj , _ , err := decode (yamlFile , nil , nil )
153
- if err != nil {
154
- return err
155
- }
132
+ obj , _ , err := Global .DynamicDecoder .Decode (yamlSpec , nil , nil )
133
+ if err != nil {
134
+ // DynamicClient/DynamicDecoder can only handle standard and extensions kubernetes resources.
135
+ // If a resource is not recognized by the decoder, assume it's a custom resource and fall back
136
+ // to createCRFromYAML.
137
+ return ctx .createCRFromYAML (yamlFile )
138
+ }
156
139
157
- namespace , err := ctx .GetNamespace ()
158
- if err != nil {
159
- return err
160
- }
161
- switch o := obj .(type ) {
162
- case * v1beta1.Role :
163
- _ , err = Global .KubeClient .RbacV1beta1 ().Roles (namespace ).Create (o )
164
- ctx .AddFinalizerFn (func () error {
165
- return Global .KubeClient .RbacV1beta1 ().Roles (namespace ).Delete (o .Name , metav1 .NewDeleteOptions (0 ))
166
- })
167
- return err
168
- case * v1beta1.RoleBinding :
169
- _ , err = Global .KubeClient .RbacV1beta1 ().RoleBindings (namespace ).Create (o )
170
- ctx .AddFinalizerFn (func () error {
171
- return Global .KubeClient .RbacV1beta1 ().RoleBindings (namespace ).Delete (o .Name , metav1 .NewDeleteOptions (0 ))
172
- })
173
- return err
174
- case * apps.Deployment :
175
- _ , err = Global .KubeClient .AppsV1 ().Deployments (namespace ).Create (o )
176
- ctx .AddFinalizerFn (func () error {
177
- return Global .KubeClient .AppsV1 ().Deployments (namespace ).Delete (o .Name , metav1 .NewDeleteOptions (0 ))
178
- })
179
- return err
180
- default :
181
- return errors .New ("unhandled resource type" )
140
+ err = Global .DynamicClient .Create (goctx .TODO (), obj )
141
+ if err != nil {
142
+ return err
143
+ }
144
+ ctx .AddFinalizerFn (func () error { return Global .DynamicClient .Delete (goctx .TODO (), obj ) })
182
145
}
146
+ return nil
183
147
}
0 commit comments