Browse code

Make authorization conversions efficient

Clayton Coleman authored on 2016/07/14 05:41:28
Showing 4 changed files
... ...
@@ -105,6 +105,8 @@ type RoleBinding struct {
105 105
 	RoleRef kapi.ObjectReference
106 106
 }
107 107
 
108
+type RolesByName map[string]*Role
109
+
108 110
 // +genclient=true
109 111
 
110 112
 // Policy is a object that holds all the Roles for a particular namespace.  There is at most
... ...
@@ -117,9 +119,11 @@ type Policy struct {
117 117
 	LastModified unversioned.Time
118 118
 
119 119
 	// Roles holds all the Roles held by this Policy, mapped by Role.Name
120
-	Roles map[string]*Role
120
+	Roles RolesByName
121 121
 }
122 122
 
123
+type RoleBindingsByName map[string]*RoleBinding
124
+
123 125
 // PolicyBinding is a object that holds all the RoleBindings for a particular namespace.  There is
124 126
 // one PolicyBinding document per referenced Policy namespace
125 127
 type PolicyBinding struct {
... ...
@@ -133,7 +137,7 @@ type PolicyBinding struct {
133 133
 	// PolicyRef is a reference to the Policy that contains all the Roles that this PolicyBinding's RoleBindings may reference
134 134
 	PolicyRef kapi.ObjectReference
135 135
 	// RoleBindings holds all the RoleBindings held by this PolicyBinding, mapped by RoleBinding.Name
136
-	RoleBindings map[string]*RoleBinding
136
+	RoleBindings RoleBindingsByName
137 137
 }
138 138
 
139 139
 // SelfSubjectRulesReview is a resource you can create to determine which actions you can perform in a namespace
... ...
@@ -331,6 +335,8 @@ type ClusterRoleBinding struct {
331 331
 	RoleRef kapi.ObjectReference
332 332
 }
333 333
 
334
+type ClusterRolesByName map[string]*ClusterRole
335
+
334 336
 // ClusterPolicy is a object that holds all the ClusterRoles for a particular namespace.  There is at most
335 337
 // one ClusterPolicy document per namespace.
336 338
 type ClusterPolicy struct {
... ...
@@ -342,9 +348,11 @@ type ClusterPolicy struct {
342 342
 	LastModified unversioned.Time
343 343
 
344 344
 	// Roles holds all the ClusterRoles held by this ClusterPolicy, mapped by Role.Name
345
-	Roles map[string]*ClusterRole
345
+	Roles ClusterRolesByName
346 346
 }
347 347
 
348
+type ClusterRoleBindingsByName map[string]*ClusterRoleBinding
349
+
348 350
 // ClusterPolicyBinding is a object that holds all the ClusterRoleBindings for a particular namespace.  There is
349 351
 // one ClusterPolicyBinding document per referenced ClusterPolicy namespace
350 352
 type ClusterPolicyBinding struct {
... ...
@@ -358,7 +366,7 @@ type ClusterPolicyBinding struct {
358 358
 	// ClusterPolicyRef is a reference to the ClusterPolicy that contains all the ClusterRoles that this ClusterPolicyBinding's RoleBindings may reference
359 359
 	PolicyRef kapi.ObjectReference
360 360
 	// RoleBindings holds all the RoleBindings held by this ClusterPolicyBinding, mapped by RoleBinding.Name
361
-	RoleBindings map[string]*ClusterRoleBinding
361
+	RoleBindings ClusterRoleBindingsByName
362 362
 }
363 363
 
364 364
 // ClusterPolicyList is a collection of ClusterPolicies
... ...
@@ -66,7 +66,6 @@ func Convert_api_ResourceAccessReviewResponse_To_v1_ResourceAccessReviewResponse
66 66
 
67 67
 	out.UsersSlice = in.Users.List()
68 68
 	out.GroupsSlice = in.Groups.List()
69
-
70 69
 	return nil
71 70
 }
72 71
 
... ...
@@ -112,19 +111,17 @@ func Convert_api_PolicyRule_To_v1_PolicyRule(in *newer.PolicyRule, out *PolicyRu
112 112
 }
113 113
 
114 114
 func Convert_v1_Policy_To_api_Policy(in *Policy, out *newer.Policy, s conversion.Scope) error {
115
-	out.LastModified = in.LastModified
116
-	out.Roles = make(map[string]*newer.Role)
117
-	return s.DefaultConvert(in, out, conversion.IgnoreMissingFields)
118
-}
119
-
120
-func Convert_api_Policy_To_v1_Policy(in *newer.Policy, out *Policy, s conversion.Scope) error {
121
-	out.LastModified = in.LastModified
122
-	out.Roles = make([]NamedRole, 0, 0)
123
-	return s.DefaultConvert(in, out, conversion.IgnoreMissingFields)
115
+	if err := autoConvert_v1_Policy_To_api_Policy(in, out, s); err != nil {
116
+		return err
117
+	}
118
+	if out.Roles == nil {
119
+		out.Roles = make(map[string]*newer.Role)
120
+	}
121
+	return nil
124 122
 }
125 123
 
126 124
 func Convert_v1_RoleBinding_To_api_RoleBinding(in *RoleBinding, out *newer.RoleBinding, s conversion.Scope) error {
127
-	if err := s.DefaultConvert(in, out, conversion.IgnoreMissingFields|conversion.AllowDifferentFieldTypeNames); err != nil {
125
+	if err := autoConvert_v1_RoleBinding_To_api_RoleBinding(in, out, s); err != nil {
128 126
 		return err
129 127
 	}
130 128
 
... ...
@@ -139,7 +136,7 @@ func Convert_v1_RoleBinding_To_api_RoleBinding(in *RoleBinding, out *newer.RoleB
139 139
 }
140 140
 
141 141
 func Convert_api_RoleBinding_To_v1_RoleBinding(in *newer.RoleBinding, out *RoleBinding, s conversion.Scope) error {
142
-	if err := s.DefaultConvert(in, out, conversion.IgnoreMissingFields|conversion.AllowDifferentFieldTypeNames); err != nil {
142
+	if err := autoConvert_api_RoleBinding_To_v1_RoleBinding(in, out, s); err != nil {
143 143
 		return err
144 144
 	}
145 145
 
... ...
@@ -149,32 +146,28 @@ func Convert_api_RoleBinding_To_v1_RoleBinding(in *newer.RoleBinding, out *RoleB
149 149
 }
150 150
 
151 151
 func Convert_v1_PolicyBinding_To_api_PolicyBinding(in *PolicyBinding, out *newer.PolicyBinding, s conversion.Scope) error {
152
-	out.LastModified = in.LastModified
153
-	out.RoleBindings = make(map[string]*newer.RoleBinding)
154
-	return s.DefaultConvert(in, out, conversion.IgnoreMissingFields)
155
-}
156
-
157
-func Convert_api_PolicyBinding_To_v1_PolicyBinding(in *newer.PolicyBinding, out *PolicyBinding, s conversion.Scope) error {
158
-	out.LastModified = in.LastModified
159
-	out.RoleBindings = make([]NamedRoleBinding, 0, 0)
160
-	return s.DefaultConvert(in, out, conversion.IgnoreMissingFields)
152
+	if err := autoConvert_v1_PolicyBinding_To_api_PolicyBinding(in, out, s); err != nil {
153
+		return err
154
+	}
155
+	if out.RoleBindings == nil {
156
+		out.RoleBindings = make(map[string]*newer.RoleBinding)
157
+	}
158
+	return nil
161 159
 }
162 160
 
163 161
 // and now the globals
164 162
 func Convert_v1_ClusterPolicy_To_api_ClusterPolicy(in *ClusterPolicy, out *newer.ClusterPolicy, s conversion.Scope) error {
165
-	out.LastModified = in.LastModified
166
-	out.Roles = make(map[string]*newer.ClusterRole)
167
-	return s.DefaultConvert(in, out, conversion.IgnoreMissingFields)
168
-}
169
-
170
-func Convert_api_ClusterPolicy_To_v1_ClusterPolicy(in *newer.ClusterPolicy, out *ClusterPolicy, s conversion.Scope) error {
171
-	out.LastModified = in.LastModified
172
-	out.Roles = make([]NamedClusterRole, 0, 0)
173
-	return s.DefaultConvert(in, out, conversion.IgnoreMissingFields)
163
+	if err := autoConvert_v1_ClusterPolicy_To_api_ClusterPolicy(in, out, s); err != nil {
164
+		return err
165
+	}
166
+	if out.Roles == nil {
167
+		out.Roles = make(map[string]*newer.ClusterRole)
168
+	}
169
+	return nil
174 170
 }
175 171
 
176 172
 func Convert_v1_ClusterRoleBinding_To_api_ClusterRoleBinding(in *ClusterRoleBinding, out *newer.ClusterRoleBinding, s conversion.Scope) error {
177
-	if err := s.DefaultConvert(in, out, conversion.IgnoreMissingFields|conversion.AllowDifferentFieldTypeNames); err != nil {
173
+	if err := autoConvert_v1_ClusterRoleBinding_To_api_ClusterRoleBinding(in, out, s); err != nil {
178 174
 		return err
179 175
 	}
180 176
 
... ...
@@ -189,7 +182,7 @@ func Convert_v1_ClusterRoleBinding_To_api_ClusterRoleBinding(in *ClusterRoleBind
189 189
 }
190 190
 
191 191
 func Convert_api_ClusterRoleBinding_To_v1_ClusterRoleBinding(in *newer.ClusterRoleBinding, out *ClusterRoleBinding, s conversion.Scope) error {
192
-	if err := s.DefaultConvert(in, out, conversion.IgnoreMissingFields|conversion.AllowDifferentFieldTypeNames); err != nil {
192
+	if err := autoConvert_api_ClusterRoleBinding_To_v1_ClusterRoleBinding(in, out, s); err != nil {
193 193
 		return err
194 194
 	}
195 195
 
... ...
@@ -199,21 +192,23 @@ func Convert_api_ClusterRoleBinding_To_v1_ClusterRoleBinding(in *newer.ClusterRo
199 199
 }
200 200
 
201 201
 func Convert_v1_ClusterPolicyBinding_To_api_ClusterPolicyBinding(in *ClusterPolicyBinding, out *newer.ClusterPolicyBinding, s conversion.Scope) error {
202
-	out.LastModified = in.LastModified
203
-	out.RoleBindings = make(map[string]*newer.ClusterRoleBinding)
204
-	return s.DefaultConvert(in, out, conversion.IgnoreMissingFields)
202
+	if err := autoConvert_v1_ClusterPolicyBinding_To_api_ClusterPolicyBinding(in, out, s); err != nil {
203
+		return err
204
+	}
205
+	if out.RoleBindings == nil {
206
+		out.RoleBindings = make(map[string]*newer.ClusterRoleBinding)
207
+	}
208
+	return nil
205 209
 }
206 210
 
207
-func Convert_api_ClusterPolicyBinding_To_v1_ClusterPolicyBinding(in *newer.ClusterPolicyBinding, out *ClusterPolicyBinding, s conversion.Scope) error {
208
-	out.LastModified = in.LastModified
209
-	out.RoleBindings = make([]NamedClusterRoleBinding, 0, 0)
210
-	return s.DefaultConvert(in, out, conversion.IgnoreMissingFields)
211
-}
211
+func Convert_v1_NamedRoles_To_api_RolesByName(in *NamedRoles, out *newer.RolesByName, s conversion.Scope) error {
212
+	if *out == nil {
213
+		*out = make(newer.RolesByName)
214
+	}
212 215
 
213
-func Convert_v1_NamedRoleArray_to_api_RoleArray(in *[]NamedRole, out *map[string]*newer.Role, s conversion.Scope) error {
214 216
 	for _, curr := range *in {
215 217
 		newRole := &newer.Role{}
216
-		if err := s.Convert(&curr.Role, newRole, 0); err != nil {
218
+		if err := Convert_v1_Role_To_api_Role(&curr.Role, newRole, s); err != nil {
217 219
 			return err
218 220
 		}
219 221
 		(*out)[curr.Name] = newRole
... ...
@@ -221,7 +216,7 @@ func Convert_v1_NamedRoleArray_to_api_RoleArray(in *[]NamedRole, out *map[string
221 221
 
222 222
 	return nil
223 223
 }
224
-func Convert_api_NamedRoleArray_to_v1_RoleArray(in *map[string]*newer.Role, out *[]NamedRole, s conversion.Scope) error {
224
+func Convert_api_RolesByName_To_v1_NamedRoles(in *newer.RolesByName, out *NamedRoles, s conversion.Scope) error {
225 225
 	allKeys := make([]string, 0, len(*in))
226 226
 	for key := range *in {
227 227
 		allKeys = append(allKeys, key)
... ...
@@ -231,7 +226,7 @@ func Convert_api_NamedRoleArray_to_v1_RoleArray(in *map[string]*newer.Role, out
231 231
 	for _, key := range allKeys {
232 232
 		newRole := (*in)[key]
233 233
 		oldRole := &Role{}
234
-		if err := s.Convert(newRole, oldRole, 0); err != nil {
234
+		if err := Convert_api_Role_To_v1_Role(newRole, oldRole, s); err != nil {
235 235
 			return err
236 236
 		}
237 237
 
... ...
@@ -242,10 +237,13 @@ func Convert_api_NamedRoleArray_to_v1_RoleArray(in *map[string]*newer.Role, out
242 242
 	return nil
243 243
 }
244 244
 
245
-func Convert_v1_NamedRoleBindingArray_to_api_RoleBindingArray(in *[]NamedRoleBinding, out *map[string]*newer.RoleBinding, s conversion.Scope) error {
245
+func Convert_v1_NamedRoleBindings_To_api_RoleBindingsByName(in *NamedRoleBindings, out *newer.RoleBindingsByName, s conversion.Scope) error {
246
+	if *out == nil {
247
+		*out = make(newer.RoleBindingsByName)
248
+	}
246 249
 	for _, curr := range *in {
247 250
 		newRoleBinding := &newer.RoleBinding{}
248
-		if err := s.Convert(&curr.RoleBinding, newRoleBinding, 0); err != nil {
251
+		if err := Convert_v1_RoleBinding_To_api_RoleBinding(&curr.RoleBinding, newRoleBinding, s); err != nil {
249 252
 			return err
250 253
 		}
251 254
 		(*out)[curr.Name] = newRoleBinding
... ...
@@ -253,7 +251,7 @@ func Convert_v1_NamedRoleBindingArray_to_api_RoleBindingArray(in *[]NamedRoleBin
253 253
 
254 254
 	return nil
255 255
 }
256
-func Convert_api_RoleBindingArray_to_v1_NamedRoleBindingArray(in *map[string]*newer.RoleBinding, out *[]NamedRoleBinding, s conversion.Scope) error {
256
+func Convert_api_RoleBindingsByName_To_v1_NamedRoleBindings(in *newer.RoleBindingsByName, out *NamedRoleBindings, s conversion.Scope) error {
257 257
 	allKeys := make([]string, 0, len(*in))
258 258
 	for key := range *in {
259 259
 		allKeys = append(allKeys, key)
... ...
@@ -263,7 +261,7 @@ func Convert_api_RoleBindingArray_to_v1_NamedRoleBindingArray(in *map[string]*ne
263 263
 	for _, key := range allKeys {
264 264
 		newRoleBinding := (*in)[key]
265 265
 		oldRoleBinding := &RoleBinding{}
266
-		if err := s.Convert(newRoleBinding, oldRoleBinding, 0); err != nil {
266
+		if err := Convert_api_RoleBinding_To_v1_RoleBinding(newRoleBinding, oldRoleBinding, s); err != nil {
267 267
 			return err
268 268
 		}
269 269
 
... ...
@@ -274,10 +272,13 @@ func Convert_api_RoleBindingArray_to_v1_NamedRoleBindingArray(in *map[string]*ne
274 274
 	return nil
275 275
 }
276 276
 
277
-func Convert_v1_NamedClusterRoleArray_to_api_ClusterRoleArray(in *[]NamedClusterRole, out *map[string]*newer.ClusterRole, s conversion.Scope) error {
277
+func Convert_v1_NamedClusterRoles_To_api_ClusterRolesByName(in *NamedClusterRoles, out *newer.ClusterRolesByName, s conversion.Scope) error {
278
+	if *out == nil {
279
+		*out = make(newer.ClusterRolesByName)
280
+	}
278 281
 	for _, curr := range *in {
279 282
 		newRole := &newer.ClusterRole{}
280
-		if err := s.Convert(&curr.Role, newRole, 0); err != nil {
283
+		if err := Convert_v1_ClusterRole_To_api_ClusterRole(&curr.Role, newRole, s); err != nil {
281 284
 			return err
282 285
 		}
283 286
 		(*out)[curr.Name] = newRole
... ...
@@ -285,7 +286,7 @@ func Convert_v1_NamedClusterRoleArray_to_api_ClusterRoleArray(in *[]NamedCluster
285 285
 
286 286
 	return nil
287 287
 }
288
-func Convert_api_ClusterRoleArray_to_v1_NamedClusterRoleArray(in *map[string]*newer.ClusterRole, out *[]NamedClusterRole, s conversion.Scope) error {
288
+func Convert_api_ClusterRolesByName_To_v1_NamedClusterRoles(in *newer.ClusterRolesByName, out *NamedClusterRoles, s conversion.Scope) error {
289 289
 	allKeys := make([]string, 0, len(*in))
290 290
 	for key := range *in {
291 291
 		allKeys = append(allKeys, key)
... ...
@@ -295,7 +296,7 @@ func Convert_api_ClusterRoleArray_to_v1_NamedClusterRoleArray(in *map[string]*ne
295 295
 	for _, key := range allKeys {
296 296
 		newRole := (*in)[key]
297 297
 		oldRole := &ClusterRole{}
298
-		if err := s.Convert(newRole, oldRole, 0); err != nil {
298
+		if err := Convert_api_ClusterRole_To_v1_ClusterRole(newRole, oldRole, s); err != nil {
299 299
 			return err
300 300
 		}
301 301
 
... ...
@@ -305,18 +306,20 @@ func Convert_api_ClusterRoleArray_to_v1_NamedClusterRoleArray(in *map[string]*ne
305 305
 
306 306
 	return nil
307 307
 }
308
-func Convert_v1_NamedClusterRoleBindingArray_to_ClusterRoleBindingArray(in *[]NamedClusterRoleBinding, out *map[string]*newer.ClusterRoleBinding, s conversion.Scope) error {
308
+func Convert_v1_NamedClusterRoleBindings_To_api_ClusterRoleBindingsByName(in *NamedClusterRoleBindings, out *newer.ClusterRoleBindingsByName, s conversion.Scope) error {
309
+	if *out == nil {
310
+		*out = make(newer.ClusterRoleBindingsByName)
311
+	}
309 312
 	for _, curr := range *in {
310 313
 		newRoleBinding := &newer.ClusterRoleBinding{}
311
-		if err := s.Convert(&curr.RoleBinding, newRoleBinding, 0); err != nil {
314
+		if err := Convert_v1_ClusterRoleBinding_To_api_ClusterRoleBinding(&curr.RoleBinding, newRoleBinding, s); err != nil {
312 315
 			return err
313 316
 		}
314 317
 		(*out)[curr.Name] = newRoleBinding
315 318
 	}
316
-
317 319
 	return nil
318 320
 }
319
-func Convert_api_ClusterRoleBindingArray_to_v1_NamedClusterRoleBindingArray(in *map[string]*newer.ClusterRoleBinding, out *[]NamedClusterRoleBinding, s conversion.Scope) error {
321
+func Convert_api_ClusterRoleBindingsByName_To_v1_NamedClusterRoleBindings(in *newer.ClusterRoleBindingsByName, out *NamedClusterRoleBindings, s conversion.Scope) error {
320 322
 	allKeys := make([]string, 0, len(*in))
321 323
 	for key := range *in {
322 324
 		allKeys = append(allKeys, key)
... ...
@@ -326,7 +329,7 @@ func Convert_api_ClusterRoleBindingArray_to_v1_NamedClusterRoleBindingArray(in *
326 326
 	for _, key := range allKeys {
327 327
 		newRoleBinding := (*in)[key]
328 328
 		oldRoleBinding := &ClusterRoleBinding{}
329
-		if err := s.Convert(newRoleBinding, oldRoleBinding, 0); err != nil {
329
+		if err := Convert_api_ClusterRoleBinding_To_v1_ClusterRoleBinding(newRoleBinding, oldRoleBinding, s); err != nil {
330 330
 			return err
331 331
 		}
332 332
 
... ...
@@ -339,15 +342,6 @@ func Convert_api_ClusterRoleBindingArray_to_v1_NamedClusterRoleBindingArray(in *
339 339
 
340 340
 func addConversionFuncs(scheme *runtime.Scheme) {
341 341
 	err := scheme.AddConversionFuncs(
342
-		Convert_v1_NamedRoleArray_to_api_RoleArray,
343
-		Convert_api_NamedRoleArray_to_v1_RoleArray,
344
-		Convert_v1_NamedRoleBindingArray_to_api_RoleBindingArray,
345
-		Convert_api_RoleBindingArray_to_v1_NamedRoleBindingArray,
346
-		Convert_v1_NamedClusterRoleArray_to_api_ClusterRoleArray,
347
-		Convert_api_ClusterRoleArray_to_v1_NamedClusterRoleArray,
348
-		Convert_v1_NamedClusterRoleBindingArray_to_ClusterRoleBindingArray,
349
-		Convert_api_ClusterRoleBindingArray_to_v1_NamedClusterRoleBindingArray,
350
-
351 342
 		Convert_v1_SubjectAccessReview_To_api_SubjectAccessReview,
352 343
 		Convert_api_SubjectAccessReview_To_v1_SubjectAccessReview,
353 344
 		Convert_v1_LocalSubjectAccessReview_To_api_LocalSubjectAccessReview,
... ...
@@ -62,8 +62,10 @@ type RoleBinding struct {
62 62
 	kapi.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
63 63
 
64 64
 	// UserNames holds all the usernames directly bound to the role
65
+	// +genconversion=false
65 66
 	UserNames OptionalNames `json:"userNames" protobuf:"bytes,2,rep,name=userNames"`
66 67
 	// GroupNames holds all the groups directly bound to the role
68
+	// +genconversion=false
67 69
 	GroupNames OptionalNames `json:"groupNames" protobuf:"bytes,3,rep,name=groupNames"`
68 70
 	// Subjects hold object references to authorize with this rule
69 71
 	Subjects []kapi.ObjectReference `json:"subjects" protobuf:"bytes,4,rep,name=subjects"`
... ...
@@ -74,6 +76,8 @@ type RoleBinding struct {
74 74
 	RoleRef kapi.ObjectReference `json:"roleRef" protobuf:"bytes,5,opt,name=roleRef"`
75 75
 }
76 76
 
77
+type NamedRoles []NamedRole
78
+
77 79
 // +genclient=true
78 80
 
79 81
 // Policy is a object that holds all the Roles for a particular namespace.  There is at most
... ...
@@ -87,9 +91,11 @@ type Policy struct {
87 87
 	LastModified unversioned.Time `json:"lastModified" protobuf:"bytes,2,opt,name=lastModified"`
88 88
 
89 89
 	// Roles holds all the Roles held by this Policy, mapped by Role.Name
90
-	Roles []NamedRole `json:"roles" protobuf:"bytes,3,rep,name=roles"`
90
+	Roles NamedRoles `json:"roles" protobuf:"bytes,3,rep,name=roles"`
91 91
 }
92 92
 
93
+type NamedRoleBindings []NamedRoleBinding
94
+
93 95
 // PolicyBinding is a object that holds all the RoleBindings for a particular namespace.  There is
94 96
 // one PolicyBinding document per referenced Policy namespace
95 97
 type PolicyBinding struct {
... ...
@@ -103,7 +109,7 @@ type PolicyBinding struct {
103 103
 	// PolicyRef is a reference to the Policy that contains all the Roles that this PolicyBinding's RoleBindings may reference
104 104
 	PolicyRef kapi.ObjectReference `json:"policyRef" protobuf:"bytes,3,opt,name=policyRef"`
105 105
 	// RoleBindings holds all the RoleBindings held by this PolicyBinding, mapped by RoleBinding.Name
106
-	RoleBindings []NamedRoleBinding `json:"roleBindings" protobuf:"bytes,4,rep,name=roleBindings"`
106
+	RoleBindings NamedRoleBindings `json:"roleBindings" protobuf:"bytes,4,rep,name=roleBindings"`
107 107
 }
108 108
 
109 109
 // NamedRole relates a Role with a name
... ...
@@ -314,8 +320,10 @@ type ClusterRoleBinding struct {
314 314
 	kapi.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
315 315
 
316 316
 	// UserNames holds all the usernames directly bound to the role
317
+	// +genconversion=false
317 318
 	UserNames OptionalNames `json:"userNames" protobuf:"bytes,2,rep,name=userNames"`
318 319
 	// GroupNames holds all the groups directly bound to the role
320
+	// +genconversion=false
319 321
 	GroupNames OptionalNames `json:"groupNames" protobuf:"bytes,3,rep,name=groupNames"`
320 322
 	// Subjects hold object references to authorize with this rule
321 323
 	Subjects []kapi.ObjectReference `json:"subjects" protobuf:"bytes,4,rep,name=subjects"`
... ...
@@ -326,6 +334,8 @@ type ClusterRoleBinding struct {
326 326
 	RoleRef kapi.ObjectReference `json:"roleRef" protobuf:"bytes,5,opt,name=roleRef"`
327 327
 }
328 328
 
329
+type NamedClusterRoles []NamedClusterRole
330
+
329 331
 // ClusterPolicy is a object that holds all the ClusterRoles for a particular namespace.  There is at most
330 332
 // one ClusterPolicy document per namespace.
331 333
 type ClusterPolicy struct {
... ...
@@ -337,9 +347,11 @@ type ClusterPolicy struct {
337 337
 	LastModified unversioned.Time `json:"lastModified" protobuf:"bytes,2,opt,name=lastModified"`
338 338
 
339 339
 	// Roles holds all the ClusterRoles held by this ClusterPolicy, mapped by ClusterRole.Name
340
-	Roles []NamedClusterRole `json:"roles" protobuf:"bytes,3,rep,name=roles"`
340
+	Roles NamedClusterRoles `json:"roles" protobuf:"bytes,3,rep,name=roles"`
341 341
 }
342 342
 
343
+type NamedClusterRoleBindings []NamedClusterRoleBinding
344
+
343 345
 // ClusterPolicyBinding is a object that holds all the ClusterRoleBindings for a particular namespace.  There is
344 346
 // one ClusterPolicyBinding document per referenced ClusterPolicy namespace
345 347
 type ClusterPolicyBinding struct {
... ...
@@ -353,7 +365,7 @@ type ClusterPolicyBinding struct {
353 353
 	// PolicyRef is a reference to the ClusterPolicy that contains all the ClusterRoles that this ClusterPolicyBinding's RoleBindings may reference
354 354
 	PolicyRef kapi.ObjectReference `json:"policyRef" protobuf:"bytes,3,opt,name=policyRef"`
355 355
 	// RoleBindings holds all the ClusterRoleBindings held by this ClusterPolicyBinding, mapped by ClusterRoleBinding.Name
356
-	RoleBindings []NamedClusterRoleBinding `json:"roleBindings" protobuf:"bytes,4,rep,name=roleBindings"`
356
+	RoleBindings NamedClusterRoleBindings `json:"roleBindings" protobuf:"bytes,4,rep,name=roleBindings"`
357 357
 }
358 358
 
359 359
 // NamedClusterRole relates a name with a cluster role
... ...
@@ -46,6 +46,7 @@ func TestClientConfigForVersion(t *testing.T) {
46 46
 			return
47 47
 		}
48 48
 		called++
49
+		w.Header().Set("Content-Type", "application/json")
49 50
 		w.Write([]byte(`{"versions":["v1"]}`))
50 51
 	}))
51 52
 	defer server.Close()