Browse code

Merge pull request #1986 from smarterclayton/make_v1beta3_default

Merged by openshift-bot

OpenShift Bot authored on 2015/05/13 07:53:01
Showing 44 changed files
... ...
@@ -2,6 +2,7 @@
2 2
 /openshift.local.*
3 3
 /.project
4 4
 /.vagrant
5
+/cpu.pprof
5 6
 /assets/nbproject
6 7
 /examples/sample-app/openshift.local.*
7 8
 /examples/sample-app/logs/openshift.log
... ...
@@ -316,8 +316,10 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
316 316
 			actions = appendIf(actions, action{"CONNECT", itemPath + "/{path:*}", nameParams, namer}, isConnecter && connectSubpath)
317 317
 
318 318
 			// list across namespace.
319
+			// TODO: more strongly type whether a resource allows these actions on "all namespaces" (bulk delete)
319 320
 			namer = scopeNaming{scope, a.group.Linker, gpath.Join(a.prefix, itemPath), true}
320 321
 			actions = appendIf(actions, action{"LIST", resource, params, namer}, isLister)
322
+			actions = appendIf(actions, action{"POST", resource, params, namer}, isCreater)
321 323
 			actions = appendIf(actions, action{"WATCHLIST", "watch/" + resource, params, namer}, allowWatchList)
322 324
 
323 325
 		} else {
... ...
@@ -685,7 +685,7 @@ func (m *Master) api_v1beta3() *apiserver.APIGroupVersion {
685 685
 func (m *Master) api_v1() *apiserver.APIGroupVersion {
686 686
 	storage := make(map[string]rest.Storage)
687 687
 	for k, v := range m.storage {
688
-		if k == "minions" {
688
+		if k == "minions" || k == "minions/status" {
689 689
 			continue
690 690
 		}
691 691
 		storage[strings.ToLower(k)] = v
... ...
@@ -227,7 +227,7 @@
227 227
                         "value": "${MYSQL_DATABASE}"
228 228
                       }
229 229
                     ],
230
-                    "image": "openshift/mysql-55-centos7",
230
+                    "image": "openshift/mysql-55-centos7:latest",
231 231
                     "name": "ruby-helloworld-database",
232 232
                     "ports": [
233 233
                       {
... ...
@@ -311,63 +311,18 @@ osc create -f examples/image-streams/image-streams-centos7.json
311 311
 [ -n "$(osc get imageStreams mongodb -t "{{.status.dockerImageRepository}}")" ]
312 312
 osc delete imageStreams ruby
313 313
 osc delete imageStreams nodejs
314
-osc delete imageStreams wildfly
315
-osc delete imageStreams mysql
314
+#osc delete imageStreams wildfly
315
+#osc delete imageStreams mysql
316 316
 osc delete imageStreams postgresql
317 317
 osc delete imageStreams mongodb
318 318
 [ -z "$(osc get imageStreams ruby -t "{{.status.dockerImageRepository}}")" ]
319 319
 [ -z "$(osc get imageStreams nodejs -t "{{.status.dockerImageRepository}}")" ]
320
-[ -z "$(osc get imageStreams wildfly -t "{{.status.dockerImageRepository}}")" ]
321
-[ -z "$(osc get imageStreams mysql -t "{{.status.dockerImageRepository}}")" ]
322 320
 [ -z "$(osc get imageStreams postgresql -t "{{.status.dockerImageRepository}}")" ]
323 321
 [ -z "$(osc get imageStreams mongodb -t "{{.status.dockerImageRepository}}")" ]
322
+wait_for_command 'osc get imagestreamTags mysql:latest' "${TIME_MIN}"
323
+[ -n "$(osc get imagestreams mysql -t "{{ index .metadata.annotations \"openshift.io/image.dockerRepositoryCheck\"}}")" ]
324 324
 echo "imageStreams: ok"
325 325
 
326
-osc create -f test/integration/fixtures/test-image-stream.json
327
-osc create -f test/integration/fixtures/test-image-stream-mapping.json
328
-osc get images
329
-osc get imageStreams
330
-osc get imageStreamTag test:sometag
331
-osc get imageStreamImage test@sha256:4986bf8c15363d1c5d15512d5266f8777bfba4974ac56e3270e7760f6f0a8125
332
-osc delete imageStreams test
333
-echo "imageStreamMappings: ok"
334
-
335
-osc get imageRepositories
336
-osc create -f test/integration/fixtures/test-image-repository.json
337
-[ -n "$(osc get imageRepositories test -t "{{.status.dockerImageRepository}}")" ]
338
-osc delete imageRepositories test
339
-osc create -f examples/image-repositories/image-repositories.json
340
-[ -n "$(osc get imageRepositories ruby-20-centos7 -t "{{.status.dockerImageRepository}}")" ]
341
-[ -n "$(osc get imageRepositories nodejs-010-centos7 -t "{{.status.dockerImageRepository}}")" ]
342
-[ -n "$(osc get imageRepositories wildfly-8-centos -t "{{.status.dockerImageRepository}}")" ]
343
-[ -n "$(osc get imageRepositories mysql-55-centos7 -t "{{.status.dockerImageRepository}}")" ]
344
-[ -n "$(osc get imageRepositories postgresql-92-centos7 -t "{{.status.dockerImageRepository}}")" ]
345
-[ -n "$(osc get imageRepositories mongodb-24-centos7 -t "{{.status.dockerImageRepository}}")" ]
346
-osc delete imageRepositories ruby-20-centos7
347
-osc delete imageRepositories nodejs-010-centos7
348
-osc delete imageRepositories mysql-55-centos7
349
-osc delete imageRepositories postgresql-92-centos7
350
-osc delete imageRepositories mongodb-24-centos7
351
-[ -z "$(osc get imageRepositories ruby-20-centos7 -t "{{.status.dockerImageRepository}}")" ]
352
-[ -z "$(osc get imageRepositories nodejs-010-centos7 -t "{{.status.dockerImageRepository}}")" ]
353
-[ -z "$(osc get imageRepositories mysql-55-centos7 -t "{{.status.dockerImageRepository}}")" ]
354
-[ -z "$(osc get imageRepositories postgresql-92-centos7 -t "{{.status.dockerImageRepository}}")" ]
355
-[ -z "$(osc get imageRepositories mongodb-24-centos7 -t "{{.status.dockerImageRepository}}")" ]
356
-# don't delete wildfly-8-centos
357
-osc create -f - << EOF
358
-{"apiVersion": "v1beta1","dockerImageRepository": "openshift/mysql-55-centos7","kind": "ImageRepository","metadata": {"name": "mysql"}}
359
-EOF
360
-echo "imageRepositories: ok"
361
-
362
-osc create -f test/integration/fixtures/test-image-repository.json
363
-osc create -f test/integration/fixtures/test-image-repository-mapping.json
364
-osc get images
365
-osc get imageRepositories
366
-osc get imageRepositoryTag test:sometag
367
-osc delete imageRepositories test
368
-echo "imageRepositoryMappings: ok"
369
-
370
-[ -n "$(osc get imageRepositories mysql -t "{{ index .metadata.annotations \"openshift.io/image.dockerRepositoryCheck\"}}")" ]
371 326
 [ "$(osc new-app library/php mysql -o yaml | grep 3306)" ]
372 327
 # verify we can generate a Docker image based component "mongodb" directly
373 328
 [ ! "$(osc new-app unknownhubimage -o yaml)" ]
... ...
@@ -436,8 +391,8 @@ osc get buildConfigs
436 436
 osc get bc
437 437
 osc get builds
438 438
 
439
-[[ $(osc describe buildConfigs ruby-sample-build | grep --text "Webhook Github"  | grep -F "${API_SCHEME}://${API_HOST}:${API_PORT}/osapi/v1beta1/buildConfigHooks/ruby-sample-build/secret101/github") ]]
440
-[[ $(osc describe buildConfigs ruby-sample-build | grep --text "Webhook Generic" | grep -F "${API_SCHEME}://${API_HOST}:${API_PORT}/osapi/v1beta1/buildConfigHooks/ruby-sample-build/secret101/generic") ]]
439
+[[ $(osc describe buildConfigs ruby-sample-build --api-version=v1beta1 | grep --text "Webhook Github"  | grep -F "${API_SCHEME}://${API_HOST}:${API_PORT}/osapi/v1beta1/buildConfigHooks/ruby-sample-build/secret101/github") ]]
440
+[[ $(osc describe buildConfigs ruby-sample-build --api-version=v1beta1 | grep --text "Webhook Generic" | grep -F "${API_SCHEME}://${API_HOST}:${API_PORT}/osapi/v1beta1/buildConfigHooks/ruby-sample-build/secret101/generic") ]]
441 441
 osc start-build --list-webhooks='all' ruby-sample-build
442 442
 [[ $(osc start-build --list-webhooks='all' ruby-sample-build | grep --text "generic") ]]
443 443
 [[ $(osc start-build --list-webhooks='all' ruby-sample-build | grep --text "github") ]]
... ...
@@ -507,8 +462,8 @@ osadm registry --create --credentials="${OPENSHIFTCONFIG}"
507 507
 echo "ex registry: ok"
508 508
 
509 509
 # verify the image repository had its tags populated
510
-[ -n "$(osc get imageStreams wildfly-8-centos -t "{{.status.tags.latest}}")" ]
511
-[ -n "$(osc get imageStreams wildfly-8-centos -t "{{ index .metadata.annotations \"openshift.io/image.dockerRepositoryCheck\"}}")" ]
510
+[ -n "$(osc get imageStreams wildfly -t "{{.status.tags.latest}}")" ]
511
+[ -n "$(osc get imageStreams wildfly -t "{{ index .metadata.annotations \"openshift.io/image.dockerRepositoryCheck\"}}")" ]
512 512
 
513 513
 # Test building a dependency tree
514 514
 [ "$(openshift ex build-chain --all -o dot | grep 'graph')" ]
... ...
@@ -224,6 +224,9 @@ func ImageStreamTag(g MutableUniqueGraph, namespace, name, tag string) graph.Nod
224 224
 	if len(tag) == 0 {
225 225
 		tag = image.DefaultImageTag
226 226
 	}
227
+	if strings.Contains(name, ":") {
228
+		panic(name)
229
+	}
227 230
 	uname := UniqueName(fmt.Sprintf("%d|%s/%s:%s", ImageStreamGraphKind, namespace, name, tag))
228 231
 	return EnsureUnique(g,
229 232
 		uname,
... ...
@@ -272,17 +275,6 @@ func BuildConfig(g MutableUniqueGraph, config *build.BuildConfig) graph.Node {
272 272
 
273 273
 	from := buildutil.GetImageStreamForStrategy(config)
274 274
 	if from != nil {
275
-		for _, trigger := range config.Triggers {
276
-			if trigger.ImageChange != nil {
277
-				if len(from.Name) == 0 || from.Kind != "ImageStreamTag" {
278
-					continue
279
-				}
280
-				tag := strings.Split(from.Name, ":")[1]
281
-				in := ImageStreamTag(g, defaultNamespace(from.Namespace, config.Namespace), from.Name, tag)
282
-				g.AddEdge(in, node, BuildInputImageGraphEdgeKind)
283
-			}
284
-		}
285
-
286 275
 		switch from.Kind {
287 276
 		case "DockerImage":
288 277
 			if ref, err := image.ParseDockerImageReference(from.Name); err == nil {
... ...
@@ -291,10 +283,14 @@ func BuildConfig(g MutableUniqueGraph, config *build.BuildConfig) graph.Node {
291 291
 				in := DockerRepository(g, ref.String(), tag)
292 292
 				g.AddEdge(in, node, BuildInputImageGraphEdgeKind)
293 293
 			}
294
-		case "ImageStreamTag":
295
-			tag := strings.Split(from.Name, ":")[1]
294
+		case "ImageStream":
295
+			tag := image.DefaultImageTag
296 296
 			in := ImageStreamTag(g, defaultNamespace(from.Namespace, config.Namespace), from.Name, tag)
297 297
 			g.AddEdge(in, node, BuildInputImageGraphEdgeKind)
298
+		case "ImageStreamTag":
299
+			name, tag, _ := image.SplitImageStreamTag(from.Name)
300
+			in := ImageStreamTag(g, defaultNamespace(from.Namespace, config.Namespace), name, tag)
301
+			g.AddEdge(in, node, BuildInputImageGraphEdgeKind)
298 302
 		case "ImageStreamImage":
299 303
 			glog.V(4).Infof("Ignoring ImageStreamImage reference in buildconfig %s/%s", config.Namespace, config.Name)
300 304
 		}
... ...
@@ -19,7 +19,7 @@ import (
19 19
 )
20 20
 
21 21
 // Version is the string that represents the current external default version.
22
-const Version = "v1beta1"
22
+const Version = "v1beta3"
23 23
 
24 24
 // OldestVersion is the string that represents the oldest server version supported,
25 25
 // for client code that wants to hardcode the lowest common denominator.
... ...
@@ -107,8 +107,8 @@ func init() {
107 107
 		},
108 108
 	)
109 109
 
110
-	// list of versions we support on the server
111
-	versions := Versions
110
+	// list of versions we support on the server, in preferred order
111
+	versions := []string{"v1beta3", "v1beta1"}
112 112
 
113 113
 	// versions that used mixed case URL formats
114 114
 	versionMixedCase := map[string]bool{
... ...
@@ -129,6 +129,8 @@ func init() {
129 129
 		"Project":        true,
130 130
 		"ProjectRequest": true,
131 131
 
132
+		"Image": true,
133
+
132 134
 		"User":                true,
133 135
 		"Identity":            true,
134 136
 		"UserIdentityMapping": true,
... ...
@@ -101,6 +101,12 @@ func fuzzInternalObject(t *testing.T, forVersion string, item runtime.Object, se
101 101
 			j.DockerImageReference = specs[c.Intn(len(specs))]
102 102
 			if forVersion == "v1beta3" {
103 103
 				j.Tag, j.DockerImageReference = "", ""
104
+				if j.To != nil && (len(j.To.Kind) == 0 || j.To.Kind == "ImageStream") {
105
+					j.To.Kind = "ImageStream"
106
+					if len(j.Tag) == 0 {
107
+						j.To.Kind = "latest"
108
+					}
109
+				}
104 110
 			}
105 111
 		},
106 112
 		func(j *deploy.DeploymentStrategy, c fuzz.Continue) {
... ...
@@ -58,7 +58,7 @@ var (
58 58
 		OAuthGroupName:              {"oauthauthorizetokens", "oauthaccesstokens", "oauthclients", "oauthclientauthorizations"},
59 59
 		PolicyOwnerGroupName:        {"policies", "policybindings"},
60 60
 		PermissionGrantingGroupName: {"roles", "rolebindings", "resourceaccessreviews", "subjectaccessreviews"},
61
-		OpenshiftExposedGroupName:   {BuildGroupName, ImageGroupName, DeploymentGroupName, "templates", "templateconfigs", "routes"},
61
+		OpenshiftExposedGroupName:   {BuildGroupName, ImageGroupName, DeploymentGroupName, "templates", "templateconfigs", "processedtemplates", "routes"},
62 62
 		OpenshiftAllGroupName:       {OpenshiftExposedGroupName, UserGroupName, OAuthGroupName, PolicyOwnerGroupName, PermissionGrantingGroupName, OpenshiftStatusGroupName, "projects"},
63 63
 		OpenshiftStatusGroupName:    {"imagerepositories/status"},
64 64
 
... ...
@@ -2,13 +2,13 @@ package v1beta1
2 2
 
3 3
 import (
4 4
 	"fmt"
5
-	"strings"
6 5
 
7 6
 	"github.com/GoogleCloudPlatform/kubernetes/pkg/api"
8 7
 	kapi "github.com/GoogleCloudPlatform/kubernetes/pkg/api/v1beta3"
9 8
 	"github.com/GoogleCloudPlatform/kubernetes/pkg/conversion"
9
+
10 10
 	newer "github.com/openshift/origin/pkg/build/api"
11
-	image "github.com/openshift/origin/pkg/image/api"
11
+	imageapi "github.com/openshift/origin/pkg/image/api"
12 12
 )
13 13
 
14 14
 func init() {
... ...
@@ -70,15 +70,16 @@ func init() {
70 70
 						Kind:      in.From.Kind,
71 71
 					}
72 72
 				case "ImageStreamTag":
73
-					bits := strings.Split(in.From.Name, ":")
73
+					name, tag, ok := imageapi.SplitImageStreamTag(in.From.Name)
74
+					if !ok {
75
+						return fmt.Errorf("ImageStreamTag object references must be in the form <name>:<tag>: %s", in.From.Name)
76
+					}
74 77
 					out.From = &kapi.ObjectReference{
75
-						Name:      bits[0],
76
-						Namespace: in.From.Namespace,
77 78
 						Kind:      "ImageStream",
79
+						Namespace: in.From.Namespace,
80
+						Name:      name,
78 81
 					}
79
-					if len(bits) > 1 {
80
-						out.Tag = bits[1]
81
-					}
82
+					out.Tag = tag
82 83
 				case "DockerImage":
83 84
 					out.Image = in.From.Name
84 85
 					out.BuilderImage = in.From.Name
... ...
@@ -99,11 +100,7 @@ func init() {
99 99
 				}
100 100
 				if len(in.From.Kind) == 0 || in.From.Kind == "ImageStream" || in.From.Kind == "ImageRepository" {
101 101
 					out.From.Kind = "ImageStreamTag"
102
-					if len(in.Tag) > 0 {
103
-						out.From.Name = out.From.Name + ":" + in.Tag
104
-					} else {
105
-						out.From.Name = out.From.Name + ":latest"
106
-					}
102
+					out.From.Name = imageapi.JoinImageStreamTag(in.From.Name, in.Tag)
107 103
 				}
108 104
 			}
109 105
 			if in.Image != "" {
... ...
@@ -133,15 +130,16 @@ func init() {
133 133
 						Kind:      in.From.Kind,
134 134
 					}
135 135
 				case "ImageStreamTag":
136
-					bits := strings.Split(in.From.Name, ":")
136
+					name, tag, ok := imageapi.SplitImageStreamTag(in.From.Name)
137
+					if !ok {
138
+						return fmt.Errorf("ImageStreamTag object references must be in the form <name>:<tag>: %s", in.From.Name)
139
+					}
137 140
 					out.From = &kapi.ObjectReference{
138
-						Name:      bits[0],
139
-						Namespace: in.From.Namespace,
140 141
 						Kind:      "ImageStream",
142
+						Namespace: in.From.Namespace,
143
+						Name:      name,
141 144
 					}
142
-					if len(bits) > 1 {
143
-						out.Tag = bits[1]
144
-					}
145
+					out.Tag = tag
145 146
 				case "DockerImage":
146 147
 					out.Image = in.From.Name
147 148
 					out.BaseImage = in.From.Name
... ...
@@ -159,11 +157,7 @@ func init() {
159 159
 				}
160 160
 				if len(in.From.Kind) == 0 || in.From.Kind == "ImageStream" || in.From.Kind == "ImageRepository" {
161 161
 					out.From.Kind = "ImageStreamTag"
162
-					if len(in.Tag) > 0 {
163
-						out.From.Name = out.From.Name + ":" + in.Tag
164
-					} else {
165
-						out.From.Name = out.From.Name + ":latest"
166
-					}
162
+					out.From.Name = imageapi.JoinImageStreamTag(in.From.Name, in.Tag)
167 163
 				}
168 164
 			}
169 165
 			if in.Image != "" {
... ...
@@ -191,15 +185,16 @@ func init() {
191 191
 						Kind:      in.From.Kind,
192 192
 					}
193 193
 				case "ImageStreamTag":
194
-					bits := strings.Split(in.From.Name, ":")
194
+					name, tag, ok := imageapi.SplitImageStreamTag(in.From.Name)
195
+					if !ok {
196
+						return fmt.Errorf("ImageStreamTag object references must be in the form <name>:<tag>: %s", in.From.Name)
197
+					}
195 198
 					out.From = &kapi.ObjectReference{
196
-						Name:      bits[0],
197
-						Namespace: in.From.Namespace,
198 199
 						Kind:      "ImageStream",
200
+						Namespace: in.From.Namespace,
201
+						Name:      name,
199 202
 					}
200
-					if len(bits) > 1 {
201
-						out.Tag = bits[1]
202
-					}
203
+					out.Tag = tag
203 204
 				case "DockerImage":
204 205
 					out.Image = in.From.Name
205 206
 				}
... ...
@@ -217,11 +212,7 @@ func init() {
217 217
 				}
218 218
 				if len(in.From.Kind) == 0 || in.From.Kind == "ImageStream" || in.From.Kind == "ImageRepository" {
219 219
 					out.From.Kind = "ImageStreamTag"
220
-					if len(in.Tag) > 0 {
221
-						out.From.Name = out.From.Name + ":" + in.Tag
222
-					} else {
223
-						out.From.Name = out.From.Name + ":latest"
224
-					}
220
+					out.From.Name = imageapi.JoinImageStreamTag(in.From.Name, in.Tag)
225 221
 				}
226 222
 			}
227 223
 			if len(in.Image) != 0 {
... ...
@@ -241,7 +232,7 @@ func init() {
241 241
 			out.PushSecretName = in.PushSecretName
242 242
 			if len(in.DockerImageReference) > 0 {
243 243
 				out.DockerImageReference = in.DockerImageReference
244
-				ref, err := image.ParseDockerImageReference(in.DockerImageReference)
244
+				ref, err := imageapi.ParseDockerImageReference(in.DockerImageReference)
245 245
 				if err != nil {
246 246
 					return err
247 247
 				}
... ...
@@ -262,7 +253,7 @@ func init() {
262 262
 				return nil
263 263
 			}
264 264
 			if len(in.ImageTag) != 0 {
265
-				ref, err := image.ParseDockerImageReference(in.ImageTag)
265
+				ref, err := imageapi.ParseDockerImageReference(in.ImageTag)
266 266
 				if err != nil {
267 267
 					return err
268 268
 				}
... ...
@@ -3,14 +3,15 @@ package v1beta3
3 3
 import (
4 4
 	"fmt"
5 5
 
6
-	"github.com/GoogleCloudPlatform/kubernetes/pkg/api"
6
+	kapi "github.com/GoogleCloudPlatform/kubernetes/pkg/api"
7 7
 	"github.com/GoogleCloudPlatform/kubernetes/pkg/conversion"
8 8
 
9 9
 	newer "github.com/openshift/origin/pkg/build/api"
10
+	imageapi "github.com/openshift/origin/pkg/image/api"
10 11
 )
11 12
 
12 13
 func init() {
13
-	api.Scheme.AddConversionFuncs(
14
+	kapi.Scheme.AddConversionFuncs(
14 15
 		func(in *newer.Build, out *Build, s conversion.Scope) error {
15 16
 			if err := s.Convert(&in.ObjectMeta, &out.ObjectMeta, 0); err != nil {
16 17
 				return err
... ...
@@ -194,10 +195,29 @@ func init() {
194 194
 			return s.DefaultConvert(in, out, conversion.IgnoreMissingFields)
195 195
 		},
196 196
 		func(in *newer.BuildOutput, out *BuildOutput, s conversion.Scope) error {
197
-			return s.DefaultConvert(in, out, conversion.IgnoreMissingFields)
197
+			if err := s.DefaultConvert(in, out, conversion.IgnoreMissingFields); err != nil {
198
+				return err
199
+			}
200
+			if in.To != nil && (len(in.To.Kind) == 0 || in.To.Kind == "ImageStream") {
201
+				out.To.Kind = "ImageStreamTag"
202
+				out.To.Name = imageapi.JoinImageStreamTag(in.To.Name, in.Tag)
203
+			}
204
+			return nil
198 205
 		},
199 206
 		func(in *BuildOutput, out *newer.BuildOutput, s conversion.Scope) error {
200
-			return s.DefaultConvert(in, out, conversion.IgnoreMissingFields)
207
+			if err := s.DefaultConvert(in, out, conversion.IgnoreMissingFields); err != nil {
208
+				return err
209
+			}
210
+			if in.To != nil && in.To.Kind == "ImageStreamTag" {
211
+				name, tag, ok := imageapi.SplitImageStreamTag(in.To.Name)
212
+				if !ok {
213
+					return fmt.Errorf("ImageStreamTag object references must be in the form <name>:<tag>: %s", in.To.Name)
214
+				}
215
+				out.To.Kind = "ImageStream"
216
+				out.To.Name = name
217
+				out.Tag = tag
218
+			}
219
+			return nil
201 220
 		},
202 221
 		func(in *newer.ImageChangeTrigger, out *ImageChangeTrigger, s conversion.Scope) error {
203 222
 			out.LastTriggeredImageID = in.LastTriggeredImageID
... ...
@@ -209,7 +229,7 @@ func init() {
209 209
 		})
210 210
 
211 211
 	// Add field conversion funcs.
212
-	err := api.Scheme.AddFieldLabelConversionFunc("v1beta3", "Build",
212
+	err := kapi.Scheme.AddFieldLabelConversionFunc("v1beta3", "Build",
213 213
 		func(label, value string) (string, string, error) {
214 214
 			switch label {
215 215
 			case "name":
... ...
@@ -226,7 +246,7 @@ func init() {
226 226
 		// If one of the conversion functions is malformed, detect it immediately.
227 227
 		panic(err)
228 228
 	}
229
-	err = api.Scheme.AddFieldLabelConversionFunc("v1beta3", "BuildConfig",
229
+	err = kapi.Scheme.AddFieldLabelConversionFunc("v1beta3", "BuildConfig",
230 230
 		func(label, value string) (string, string, error) {
231 231
 			switch label {
232 232
 			case "name":
... ...
@@ -19,14 +19,10 @@ type Interface interface {
19 19
 	BuildConfigsNamespacer
20 20
 	BuildLogsNamespacer
21 21
 	ImagesInterfacer
22
-	ImageRepositoriesNamespacer
23
-	ImageRepositoryMappingsNamespacer
24
-	ImageRepositoryTagsNamespacer
25 22
 	ImageStreamsNamespacer
26 23
 	ImageStreamMappingsNamespacer
27 24
 	ImageStreamTagsNamespacer
28 25
 	ImageStreamImagesNamespacer
29
-	DeploymentsNamespacer
30 26
 	DeploymentConfigsNamespacer
31 27
 	RoutesNamespacer
32 28
 	IdentitiesInterface
... ...
@@ -71,21 +67,6 @@ func (c *Client) Images() ImageInterface {
71 71
 	return newImages(c)
72 72
 }
73 73
 
74
-// ImageRepositories provides a REST client for ImageRepository
75
-func (c *Client) ImageRepositories(namespace string) ImageRepositoryInterface {
76
-	return newImageRepositories(c, namespace)
77
-}
78
-
79
-// ImageRepositoryMappings provides a REST client for ImageRepositoryMapping
80
-func (c *Client) ImageRepositoryMappings(namespace string) ImageRepositoryMappingInterface {
81
-	return newImageRepositoryMappings(c, namespace)
82
-}
83
-
84
-// ImageRepositoryTags provides a REST client for ImageRepositoryTag
85
-func (c *Client) ImageRepositoryTags(namespace string) ImageRepositoryTagInterface {
86
-	return newImageRepositoryTags(c, namespace)
87
-}
88
-
89 74
 // ImageStreams provides a REST client for ImageStream
90 75
 func (c *Client) ImageStreams(namespace string) ImageStreamInterface {
91 76
 	return newImageStreams(c, namespace)
... ...
@@ -106,11 +87,6 @@ func (c *Client) ImageStreamImages(namespace string) ImageStreamImageInterface {
106 106
 	return newImageStreamImages(c, namespace)
107 107
 }
108 108
 
109
-// Deployments provides a REST client for Deployment
110
-func (c *Client) Deployments(namespace string) DeploymentInterface {
111
-	return newDeployments(c, namespace)
112
-}
113
-
114 109
 // DeploymentConfigs provides a REST client for DeploymentConfig
115 110
 func (c *Client) DeploymentConfigs(namespace string) DeploymentConfigInterface {
116 111
 	return newDeploymentConfigs(c, namespace)
117 112
deleted file mode 100644
... ...
@@ -1,89 +0,0 @@
1
-package client
2
-
3
-import (
4
-	"github.com/GoogleCloudPlatform/kubernetes/pkg/fields"
5
-	"github.com/GoogleCloudPlatform/kubernetes/pkg/labels"
6
-	"github.com/GoogleCloudPlatform/kubernetes/pkg/watch"
7
-
8
-	deployapi "github.com/openshift/origin/pkg/deploy/api"
9
-)
10
-
11
-// DeploymentsNamespacer has methods to work with Deployment resources in a namespace
12
-type DeploymentsNamespacer interface {
13
-	Deployments(namespace string) DeploymentInterface
14
-}
15
-
16
-// DeploymentInterface contains methods for working with Deployments
17
-type DeploymentInterface interface {
18
-	List(label labels.Selector, field fields.Selector) (*deployapi.DeploymentList, error)
19
-	Get(name string) (*deployapi.Deployment, error)
20
-	Create(deployment *deployapi.Deployment) (*deployapi.Deployment, error)
21
-	Update(deployment *deployapi.Deployment) (*deployapi.Deployment, error)
22
-	Delete(name string) error
23
-	Watch(label labels.Selector, field fields.Selector, resourceVersion string) (watch.Interface, error)
24
-}
25
-
26
-// deployments implements DeploymentsNamespacer interface
27
-type deployments struct {
28
-	r  *Client
29
-	ns string
30
-}
31
-
32
-// newDeployments returns a deployments
33
-func newDeployments(c *Client, namespace string) *deployments {
34
-	return &deployments{
35
-		r:  c,
36
-		ns: namespace,
37
-	}
38
-}
39
-
40
-// List takes a label and field selector, and returns the list of deployments that match that selectors
41
-func (c *deployments) List(label labels.Selector, field fields.Selector) (result *deployapi.DeploymentList, err error) {
42
-	result = &deployapi.DeploymentList{}
43
-	err = c.r.Get().
44
-		Namespace(c.ns).
45
-		Resource("deployments").
46
-		LabelsSelectorParam(label).
47
-		FieldsSelectorParam(field).
48
-		Do().
49
-		Into(result)
50
-	return
51
-}
52
-
53
-// Get returns information about a particular deployment
54
-func (c *deployments) Get(name string) (result *deployapi.Deployment, err error) {
55
-	result = &deployapi.Deployment{}
56
-	err = c.r.Get().Namespace(c.ns).Resource("deployments").Name(name).Do().Into(result)
57
-	return
58
-}
59
-
60
-// Create creates a new deployment
61
-func (c *deployments) Create(deployment *deployapi.Deployment) (result *deployapi.Deployment, err error) {
62
-	result = &deployapi.Deployment{}
63
-	err = c.r.Post().Namespace(c.ns).Resource("deployments").Body(deployment).Do().Into(result)
64
-	return
65
-}
66
-
67
-// Update updates an existing deployment
68
-func (c *deployments) Update(deployment *deployapi.Deployment) (result *deployapi.Deployment, err error) {
69
-	result = &deployapi.Deployment{}
70
-	err = c.r.Put().Namespace(c.ns).Resource("deployments").Name(deployment.Name).Body(deployment).Do().Into(result)
71
-	return
72
-}
73
-
74
-// Delete deletes an existing replication deployment.
75
-func (c *deployments) Delete(name string) error {
76
-	return c.r.Delete().Namespace(c.ns).Resource("deployments").Name(name).Do().Error()
77
-}
78
-
79
-// Watch returns a watch.Interface that watches the requested deployments.
80
-func (c *deployments) Watch(label labels.Selector, field fields.Selector, resourceVersion string) (watch.Interface, error) {
81
-	return c.r.Get().
82
-		Prefix("watch").
83
-		Namespace(c.ns).
84
-		Resource("deployments").
85
-		Param("resourceVersion", resourceVersion).
86
-		LabelsSelectorParam(label).
87
-		FieldsSelectorParam(field).
88
-		Watch()
89
-}
... ...
@@ -44,18 +44,6 @@ func (c *Fake) Images() ImageInterface {
44 44
 	return &FakeImages{Fake: c}
45 45
 }
46 46
 
47
-func (c *Fake) ImageRepositories(namespace string) ImageRepositoryInterface {
48
-	return &FakeImageRepositories{Fake: c, Namespace: namespace}
49
-}
50
-
51
-func (c *Fake) ImageRepositoryMappings(namespace string) ImageRepositoryMappingInterface {
52
-	return &FakeImageRepositoryMappings{Fake: c, Namespace: namespace}
53
-}
54
-
55
-func (c *Fake) ImageRepositoryTags(namespace string) ImageRepositoryTagInterface {
56
-	return &FakeImageRepositoryTags{Fake: c, Namespace: namespace}
57
-}
58
-
59 47
 func (c *Fake) ImageStreams(namespace string) ImageStreamInterface {
60 48
 	return &FakeImageStreams{Fake: c, Namespace: namespace}
61 49
 }
... ...
@@ -72,10 +60,6 @@ func (c *Fake) ImageStreamImages(namespace string) ImageStreamImageInterface {
72 72
 	return &FakeImageStreamImages{Fake: c, Namespace: namespace}
73 73
 }
74 74
 
75
-func (c *Fake) Deployments(namespace string) DeploymentInterface {
76
-	return &FakeDeployments{Fake: c, Namespace: namespace}
77
-}
78
-
79 75
 func (c *Fake) DeploymentConfigs(namespace string) DeploymentConfigInterface {
80 76
 	return &FakeDeploymentConfigs{Fake: c, Namespace: namespace}
81 77
 }
82 78
deleted file mode 100644
... ...
@@ -1,46 +0,0 @@
1
-package client
2
-
3
-import (
4
-	"github.com/GoogleCloudPlatform/kubernetes/pkg/fields"
5
-	"github.com/GoogleCloudPlatform/kubernetes/pkg/labels"
6
-	"github.com/GoogleCloudPlatform/kubernetes/pkg/watch"
7
-
8
-	deployapi "github.com/openshift/origin/pkg/deploy/api"
9
-)
10
-
11
-// FakeDeployments implements BuildInterface. Meant to be embedded into a struct to get a default
12
-// implementation. This makes faking out just the methods you want to test easier.
13
-type FakeDeployments struct {
14
-	Fake      *Fake
15
-	Namespace string
16
-}
17
-
18
-func (c *FakeDeployments) List(label labels.Selector, field fields.Selector) (*deployapi.DeploymentList, error) {
19
-	obj, err := c.Fake.Invokes(FakeAction{Action: "list-deployment"}, &deployapi.DeploymentList{})
20
-	return obj.(*deployapi.DeploymentList), err
21
-}
22
-
23
-func (c *FakeDeployments) Get(name string) (*deployapi.Deployment, error) {
24
-	obj, err := c.Fake.Invokes(FakeAction{Action: "get-deployment"}, &deployapi.Deployment{})
25
-	return obj.(*deployapi.Deployment), err
26
-}
27
-
28
-func (c *FakeDeployments) Create(deployment *deployapi.Deployment) (*deployapi.Deployment, error) {
29
-	obj, err := c.Fake.Invokes(FakeAction{Action: "create-deployment"}, &deployapi.Deployment{})
30
-	return obj.(*deployapi.Deployment), err
31
-}
32
-
33
-func (c *FakeDeployments) Update(deployment *deployapi.Deployment) (*deployapi.Deployment, error) {
34
-	obj, err := c.Fake.Invokes(FakeAction{Action: "update-deployment", Value: deployment}, &deployapi.Deployment{})
35
-	return obj.(*deployapi.Deployment), err
36
-}
37
-
38
-func (c *FakeDeployments) Delete(name string) error {
39
-	c.Fake.Actions = append(c.Fake.Actions, FakeAction{Action: "delete-deployment"})
40
-	return nil
41
-}
42
-
43
-func (c *FakeDeployments) Watch(label labels.Selector, field fields.Selector, resourceVersion string) (watch.Interface, error) {
44
-	c.Fake.Actions = append(c.Fake.Actions, FakeAction{Action: "watch-deployments"})
45
-	return nil, nil
46
-}
47 1
deleted file mode 100644
... ...
@@ -1,49 +0,0 @@
1
-package client
2
-
3
-import (
4
-	"github.com/GoogleCloudPlatform/kubernetes/pkg/fields"
5
-	"github.com/GoogleCloudPlatform/kubernetes/pkg/labels"
6
-	"github.com/GoogleCloudPlatform/kubernetes/pkg/watch"
7
-
8
-	imageapi "github.com/openshift/origin/pkg/image/api"
9
-)
10
-
11
-// FakeImageRepositories implements ImageRepositoryInterface. Meant to be
12
-// embedded into a struct to get a default implementation. This makes faking
13
-// out just the methods you want to test easier.
14
-type FakeImageRepositories struct {
15
-	Fake      *Fake
16
-	Namespace string
17
-}
18
-
19
-var _ ImageRepositoryInterface = &FakeImageRepositories{}
20
-
21
-func (c *FakeImageRepositories) List(label labels.Selector, field fields.Selector) (*imageapi.ImageRepositoryList, error) {
22
-	obj, err := c.Fake.Invokes(FakeAction{Action: "list-imagerepositories"}, &imageapi.ImageRepositoryList{})
23
-	return obj.(*imageapi.ImageRepositoryList), err
24
-}
25
-
26
-func (c *FakeImageRepositories) Get(name string) (*imageapi.ImageRepository, error) {
27
-	obj, err := c.Fake.Invokes(FakeAction{Action: "get-imagerepository", Value: name}, &imageapi.ImageRepository{})
28
-	return obj.(*imageapi.ImageRepository), err
29
-}
30
-
31
-func (c *FakeImageRepositories) Create(repo *imageapi.ImageRepository) (*imageapi.ImageRepository, error) {
32
-	obj, err := c.Fake.Invokes(FakeAction{Action: "create-imagerepository"}, &imageapi.ImageRepository{})
33
-	return obj.(*imageapi.ImageRepository), err
34
-}
35
-
36
-func (c *FakeImageRepositories) Update(repo *imageapi.ImageRepository) (*imageapi.ImageRepository, error) {
37
-	obj, err := c.Fake.Invokes(FakeAction{Action: "update-imagerepository"}, &imageapi.ImageRepository{})
38
-	return obj.(*imageapi.ImageRepository), err
39
-}
40
-
41
-func (c *FakeImageRepositories) Delete(name string) error {
42
-	_, err := c.Fake.Invokes(FakeAction{Action: "delete-imagerepository", Value: name}, &imageapi.ImageRepository{})
43
-	return err
44
-}
45
-
46
-func (c *FakeImageRepositories) Watch(label labels.Selector, field fields.Selector, resourceVersion string) (watch.Interface, error) {
47
-	c.Fake.Actions = append(c.Fake.Actions, FakeAction{Action: "watch-imagerepositories"})
48
-	return nil, nil
49
-}
50 1
deleted file mode 100644
... ...
@@ -1,20 +0,0 @@
1
-package client
2
-
3
-import (
4
-	imageapi "github.com/openshift/origin/pkg/image/api"
5
-)
6
-
7
-// FakeImageRepositories implements ImageRepositoryMappingInterface. Meant to
8
-// be embedded into a struct to get a default implementation. This makes faking
9
-// out just the methods you want to test easier.
10
-type FakeImageRepositoryMappings struct {
11
-	Fake      *Fake
12
-	Namespace string
13
-}
14
-
15
-var _ ImageRepositoryMappingInterface = &FakeImageRepositoryMappings{}
16
-
17
-func (c *FakeImageRepositoryMappings) Create(mapping *imageapi.ImageRepositoryMapping) error {
18
-	c.Fake.Actions = append(c.Fake.Actions, FakeAction{Action: "create-imagerepository-mapping"})
19
-	return nil
20
-}
21 1
deleted file mode 100644
... ...
@@ -1,27 +0,0 @@
1
-package client
2
-
3
-import (
4
-	"fmt"
5
-
6
-	imageapi "github.com/openshift/origin/pkg/image/api"
7
-)
8
-
9
-// FakeImageRepositoryTags implements ImageRepositoryTagInterface. Meant to be
10
-// embedded into a struct to get a default implementation. This makes faking
11
-// out just the methods you want to test easier.
12
-type FakeImageRepositoryTags struct {
13
-	Fake      *Fake
14
-	Namespace string
15
-}
16
-
17
-var _ ImageRepositoryTagInterface = &FakeImageRepositoryTags{}
18
-
19
-func (c *FakeImageRepositoryTags) Get(name, tag string) (result *imageapi.ImageRepositoryTag, err error) {
20
-	c.Fake.Actions = append(c.Fake.Actions, FakeAction{Action: "get-imagerepository-tag", Value: fmt.Sprintf("%s:%s", name, tag)})
21
-	return &imageapi.ImageRepositoryTag{}, nil
22
-}
23
-
24
-func (c *FakeImageRepositoryTags) Delete(name, tag string) error {
25
-	c.Fake.Actions = append(c.Fake.Actions, FakeAction{Action: "delete-imagerepository-tag", Value: fmt.Sprintf("%s:%s", name, tag)})
26
-	return nil
27
-}
... ...
@@ -335,32 +335,3 @@ func (d *LatestDeploymentDescriber) describeDeploymentStatus(deploy *kapi.Replic
335 335
 		return fmt.Sprintf("#%s deployment %s %s ago", deploy.Annotations[deployapi.DeploymentVersionAnnotation], strings.ToLower(s), timeAt)
336 336
 	}
337 337
 }
338
-
339
-// DeploymentDescriber generates information about a deployment
340
-// DEPRECATED.
341
-type DeploymentDescriber struct {
342
-	client.Interface
343
-}
344
-
345
-// Describe returns a description of a DeploymentDescriber
346
-func (d *DeploymentDescriber) Describe(namespace, name string) (string, error) {
347
-	c := d.Deployments(namespace)
348
-	deployment, err := c.Get(name)
349
-	if err != nil {
350
-		return "", err
351
-	}
352
-
353
-	return tabbedString(func(out *tabwriter.Writer) error {
354
-		formatMeta(out, deployment.ObjectMeta)
355
-		formatString(out, "Status", bold(deployment.Status))
356
-		formatString(out, "Strategy", deployment.Strategy.Type)
357
-		causes := []string{}
358
-		if deployment.Details != nil {
359
-			for _, c := range deployment.Details.Causes {
360
-				causes = append(causes, string(c.Type))
361
-			}
362
-		}
363
-		formatString(out, "Causes", strings.Join(causes, ","))
364
-		return nil
365
-	})
366
-}
... ...
@@ -37,8 +37,6 @@ func DescriberFor(kind string, c *client.Client, kclient kclient.Interface, host
37 37
 		return &BuildConfigDescriber{c, host}, true
38 38
 	case "BuildLog":
39 39
 		return &BuildLogDescriber{c}, true
40
-	case "Deployment":
41
-		return &DeploymentDescriber{c}, true
42 40
 	case "DeploymentConfig":
43 41
 		return NewDeploymentConfigDescriber(c, kclient), true
44 42
 	case "Identity":
... ...
@@ -28,7 +28,7 @@ type describeClient struct {
28 28
 func TestDescribeFor(t *testing.T) {
29 29
 	c := &client.Client{}
30 30
 	testTypesList := []string{
31
-		"Build", "BuildConfig", "BuildLog", "Deployment", "DeploymentConfig",
31
+		"Build", "BuildConfig", "BuildLog", "DeploymentConfig",
32 32
 		"Image", "ImageStream", "ImageStreamTag", "ImageStreamImage",
33 33
 		"Route", "Project",
34 34
 	}
... ...
@@ -49,7 +49,6 @@ func TestDescribers(t *testing.T) {
49 49
 		&BuildDescriber{c, fakeKube},
50 50
 		&BuildConfigDescriber{c, ""},
51 51
 		&BuildLogDescriber{c},
52
-		&DeploymentDescriber{c},
53 52
 		&ImageDescriber{c},
54 53
 		&ImageStreamDescriber{c},
55 54
 		&ImageStreamTagDescriber{c},
... ...
@@ -285,6 +285,8 @@ func describeBuildStatus(build *buildapi.Build, t *util.Time, parentName string)
285 285
 		return fmt.Sprintf("build %s succeeded %s ago%s", name, time, revision)
286 286
 	case buildapi.BuildStatusError:
287 287
 		return fmt.Sprintf("build %s stopped with an error %s ago%s", name, time, revision)
288
+	case buildapi.BuildStatusFailed:
289
+		return fmt.Sprintf("build %s failed %s ago%s", name, time, revision)
288 290
 	default:
289 291
 		status := strings.ToLower(string(build.Status))
290 292
 		return fmt.Sprintf("build %s %s for %s%s", name, status, time, revision)
... ...
@@ -33,6 +33,7 @@ const (
33 33
 	KubeAPIPrefixV1Beta1 = "/api/v1beta1"
34 34
 	KubeAPIPrefixV1Beta2 = "/api/v1beta2"
35 35
 	KubeAPIPrefixV1Beta3 = "/api/v1beta3"
36
+	KubeAPIPrefixV1      = "/api/v1"
36 37
 )
37 38
 
38 39
 // TODO: Longer term we should read this from some config store, rather than a flag.
... ...
@@ -69,6 +70,8 @@ func (c *MasterConfig) InstallAPI(container *restful.Container) []string {
69 69
 		KubeletClient:    kubeletClient,
70 70
 		APIPrefix:        KubeAPIPrefix,
71 71
 
72
+		EnableV1: true,
73
+
72 74
 		Authorizer:       c.Authorizer,
73 75
 		AdmissionControl: c.AdmissionControl,
74 76
 	}
... ...
@@ -78,6 +81,7 @@ func (c *MasterConfig) InstallAPI(container *restful.Container) []string {
78 78
 		fmt.Sprintf("Started Kubernetes API at %%s%s", KubeAPIPrefixV1Beta1),
79 79
 		fmt.Sprintf("Started Kubernetes API at %%s%s", KubeAPIPrefixV1Beta3),
80 80
 		fmt.Sprintf("Started Kubernetes API at %%s%s", KubeAPIPrefixV1Beta3),
81
+		fmt.Sprintf("Started Kubernetes API at %%s%s (experimental)", KubeAPIPrefixV1),
81 82
 	}
82 83
 }
83 84
 
... ...
@@ -121,7 +121,10 @@ const (
121 121
 	swaggerAPIPrefix          = "/swaggerapi/"
122 122
 )
123 123
 
124
-var excludedV1Beta3Types = util.NewStringSet("templateConfigs", "deployments", "buildLogs")
124
+var excludedV1Beta3Types = util.NewStringSet(
125
+	"templateConfigs", "deployments", "buildLogs",
126
+	"imageRepositories", "imageRepositories/status", "imageRepositoryMappings", "imageRepositoryTags",
127
+)
125 128
 
126 129
 // APIInstaller installs additional API components into this server
127 130
 type APIInstaller interface {
... ...
@@ -302,61 +305,11 @@ func (c *MasterConfig) InstallProtectedAPI(container *restful.Container) []strin
302 302
 		"clusterRoles":          clusterRoleStorage,
303 303
 	}
304 304
 
305
-	// for v1beta1, we dual register camelCase and camelcase names
306
-	v1beta1Storage := map[string]rest.Storage{}
307
-	for k, v := range storage {
308
-		v1beta1Storage[k] = v
309
-		v1beta1Storage[strings.ToLower(k)] = v
310
-	}
311
-	v1beta3Storage := map[string]rest.Storage{}
312
-	for k, v := range storage {
313
-		if excludedV1Beta3Types.Has(k) {
314
-			continue
315
-		}
316
-		v1beta3Storage[strings.ToLower(k)] = v
317
-	}
318
-
319
-	version := &apiserver.APIGroupVersion{
320
-		Root:    OpenShiftAPIPrefix,
321
-		Version: OpenShiftAPIV1Beta1,
322
-
323
-		Storage: v1beta1Storage,
324
-		Codec:   v1beta1.Codec,
325
-
326
-		Mapper: latest.RESTMapper,
327
-
328
-		Creater:   kapi.Scheme,
329
-		Typer:     kapi.Scheme,
330
-		Convertor: kapi.Scheme,
331
-		Linker:    latest.SelfLinker,
332
-
333
-		Admit:   c.AdmissionControl,
334
-		Context: c.getRequestContextMapper(),
335
-	}
336
-
337
-	if err := version.InstallREST(container); err != nil {
305
+	if err := c.api_v1beta1(storage).InstallREST(container); err != nil {
338 306
 		glog.Fatalf("Unable to initialize v1beta1 API: %v", err)
339 307
 	}
340 308
 
341
-	version3 := &apiserver.APIGroupVersion{
342
-		Root:    OpenShiftAPIPrefix,
343
-		Version: OpenShiftAPIV1Beta3,
344
-
345
-		Storage: v1beta3Storage,
346
-		Codec:   v1beta3.Codec,
347
-
348
-		Mapper: latest.RESTMapper,
349
-
350
-		Creater:   kapi.Scheme,
351
-		Typer:     kapi.Scheme,
352
-		Convertor: kapi.Scheme,
353
-		Linker:    latest.SelfLinker,
354
-
355
-		Admit:   c.AdmissionControl,
356
-		Context: c.getRequestContextMapper(),
357
-	}
358
-
359
-	if err := version3.InstallREST(container); err != nil {
309
+	if err := c.api_v1beta3(storage).InstallREST(container); err != nil {
360 310
 		/*// TODO: remove this check once v1beta3 is complete
361 311
 		if utilerrs.FilterOut(err, func(err error) bool {
362 312
 			return strings.Contains(err.Error(), "is registered for version")
... ...
@@ -565,6 +518,52 @@ func (c *MasterConfig) Run(protected []APIInstaller, unprotected []APIInstaller)
565 565
 	c.checkProjectRequestTemplate()
566 566
 }
567 567
 
568
+func (c *MasterConfig) defaultAPIGroupVersion() *apiserver.APIGroupVersion {
569
+	return &apiserver.APIGroupVersion{
570
+		Root: OpenShiftAPIPrefix,
571
+
572
+		Mapper: latest.RESTMapper,
573
+
574
+		Creater:   kapi.Scheme,
575
+		Typer:     kapi.Scheme,
576
+		Convertor: kapi.Scheme,
577
+		Linker:    latest.SelfLinker,
578
+
579
+		Admit:   c.AdmissionControl,
580
+		Context: c.getRequestContextMapper(),
581
+	}
582
+}
583
+
584
+// api_v1beta1 returns the resources and codec for API version v1beta1.
585
+func (c *MasterConfig) api_v1beta1(all map[string]rest.Storage) *apiserver.APIGroupVersion {
586
+	storage := make(map[string]rest.Storage)
587
+	for k, v := range all {
588
+		storage[strings.ToLower(k)] = v
589
+		storage[k] = v
590
+	}
591
+	version := c.defaultAPIGroupVersion()
592
+	version.Storage = storage
593
+	version.Version = OpenShiftAPIV1Beta1
594
+	version.Codec = v1beta1.Codec
595
+	return version
596
+}
597
+
598
+// api_v1beta3 returns the resources and codec for API version v1beta3.
599
+func (c *MasterConfig) api_v1beta3(all map[string]rest.Storage) *apiserver.APIGroupVersion {
600
+	storage := make(map[string]rest.Storage)
601
+	for k, v := range all {
602
+		if excludedV1Beta3Types.Has(k) {
603
+			continue
604
+		}
605
+		storage[strings.ToLower(k)] = v
606
+	}
607
+	version := c.defaultAPIGroupVersion()
608
+	version.Storage = storage
609
+	version.Version = OpenShiftAPIV1Beta3
610
+	version.Codec = v1beta3.Codec
611
+	return version
612
+}
613
+
568 614
 // getRequestContextMapper returns a mapper from requests to contexts, initializing it if needed
569 615
 func (c *MasterConfig) getRequestContextMapper() kapi.RequestContextMapper {
570 616
 	if c.RequestContextMapper == nil {
... ...
@@ -1,6 +1,8 @@
1 1
 package v1beta3
2 2
 
3 3
 import (
4
+	"fmt"
5
+
4 6
 	"github.com/GoogleCloudPlatform/kubernetes/pkg/api"
5 7
 	"github.com/GoogleCloudPlatform/kubernetes/pkg/conversion"
6 8
 	"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
... ...
@@ -160,6 +162,14 @@ func init() {
160 160
 				out.Tag = ref.Tag
161 161
 				ref.Tag, ref.ID = "", ""
162 162
 				out.RepositoryName = ref.String()
163
+			case "ImageStreamTag":
164
+				name, tag, ok := imageapi.SplitImageStreamTag(in.From.Name)
165
+				if !ok {
166
+					return fmt.Errorf("ImageStreamTag object references must be in the form <name>:<tag>: %s", in.From.Name)
167
+				}
168
+				out.From.Kind = "ImageStream"
169
+				out.From.Name = name
170
+				out.Tag = tag
163 171
 			}
164 172
 			return nil
165 173
 		},
... ...
@@ -171,6 +181,15 @@ func init() {
171 171
 			if err := s.Convert(&in.From, &out.From, 0); err != nil {
172 172
 				return err
173 173
 			}
174
+			switch in.From.Kind {
175
+			case "ImageStream":
176
+				out.From.Kind = "ImageStreamTag"
177
+				tag := in.Tag
178
+				if len(tag) == 0 {
179
+					tag = imageapi.DefaultImageTag
180
+				}
181
+				out.From.Name = fmt.Sprintf("%s:%s", in.From.Name, tag)
182
+			}
174 183
 			return nil
175 184
 		},
176 185
 
... ...
@@ -183,7 +202,7 @@ func init() {
183 183
 				}
184 184
 				out.Tag = ref.Tag
185 185
 				ref.Tag, ref.ID = "", ""
186
-				out.RepositoryName = ref.String()
186
+				out.RepositoryName = ref.Minimal().String()
187 187
 			}
188 188
 			return nil
189 189
 		},
... ...
@@ -195,7 +214,7 @@ func init() {
195 195
 				}
196 196
 				ref.Tag = in.Tag
197 197
 				out.From.Kind = "DockerImage"
198
-				out.From.Name = ref.Minimal().String()
198
+				out.From.Name = ref.String()
199 199
 			}
200 200
 			return nil
201 201
 		},
... ...
@@ -2,6 +2,7 @@ package generator
2 2
 
3 3
 import (
4 4
 	"fmt"
5
+	"log"
5 6
 
6 7
 	kapi "github.com/GoogleCloudPlatform/kubernetes/pkg/api"
7 8
 	"github.com/GoogleCloudPlatform/kubernetes/pkg/api/errors"
... ...
@@ -61,6 +62,7 @@ func (g *DeploymentConfigGenerator) Generate(ctx kapi.Context, name string) (*de
61 61
 			errs = append(errs, fielderrors.NewFieldInvalid(f, params.Tag, fmt.Sprintf("no image recorded for %s/%s:%s", imageStream.Namespace, imageStream.Name, params.Tag)))
62 62
 			continue
63 63
 		}
64
+		log.Printf("generating %s from image stream %s with latest %s", name, imageStream.Name, latestEvent.DockerImageReference)
64 65
 
65 66
 		// Update containers
66 67
 		template := config.Template.ControllerTemplate.Template
... ...
@@ -128,6 +128,29 @@ func (r DockerImageReference) String() string {
128 128
 	return fmt.Sprintf("%s%s%s%s", registry, r.Namespace, r.Name, ref)
129 129
 }
130 130
 
131
+// SplitImageStreamTag turns the name of an ImageStreamTag into Name and Tag.
132
+// It returns false if the tag was not properly specified in the name.
133
+func SplitImageStreamTag(nameAndTag string) (name string, tag string, ok bool) {
134
+	parts := strings.SplitN(nameAndTag, ":", 2)
135
+	name = parts[0]
136
+	if len(parts) > 1 {
137
+		tag = parts[1]
138
+	}
139
+	if len(tag) == 0 {
140
+		tag = DefaultImageTag
141
+	}
142
+	return name, tag, len(parts) == 2
143
+}
144
+
145
+// SplitImageStreamTag turns the name of an ImageStreamTag into Name and Tag.
146
+// It returns false if the tag was not properly specified in the name.
147
+func JoinImageStreamTag(name, tag string) string {
148
+	if len(tag) == 0 {
149
+		tag = DefaultImageTag
150
+	}
151
+	return fmt.Sprintf("%s:%s", name, tag)
152
+}
153
+
131 154
 // ImageWithMetadata returns a copy of image with the DockerImageMetadata filled in
132 155
 // from the raw DockerImageManifest data stored in the image.
133 156
 func ImageWithMetadata(image Image) (*Image, error) {
... ...
@@ -44,6 +44,9 @@ type lifecycle struct {
44 44
 // Admit enforces that a namespace must exist in order to associate content with it.
45 45
 // Admit enforces that a namespace that is terminating cannot accept new content being associated with it.
46 46
 func (e *lifecycle) Admit(a admission.Attributes) (err error) {
47
+	if len(a.GetNamespace()) == 0 {
48
+		return nil
49
+	}
47 50
 	defaultVersion, kind, err := latest.RESTMapper.VersionAndKindForResource(a.GetResource())
48 51
 	if err != nil {
49 52
 		return err
... ...
@@ -63,7 +63,7 @@ func TestAdmissionLifecycle(t *testing.T) {
63 63
 	projectcache.FakeProjectCache(mockClient, store, "")
64 64
 	handler := &lifecycle{}
65 65
 	build := &buildapi.Build{
66
-		ObjectMeta: kapi.ObjectMeta{Name: "buildid"},
66
+		ObjectMeta: kapi.ObjectMeta{Name: "buildid", Namespace: "other"},
67 67
 		Parameters: buildapi.BuildParameters{
68 68
 			Source: buildapi.BuildSource{
69 69
 				Type: buildapi.BuildSourceGit,
... ...
@@ -82,7 +82,7 @@ func TestAdmissionLifecycle(t *testing.T) {
82 82
 		},
83 83
 		Status: buildapi.BuildStatusNew,
84 84
 	}
85
-	err := handler.Admit(admission.NewAttributesRecord(build, "Build", namespaceObj.Namespace, "builds", "CREATE"))
85
+	err := handler.Admit(admission.NewAttributesRecord(build, "Build", build.Namespace, "builds", "CREATE"))
86 86
 	if err != nil {
87 87
 		t.Errorf("Unexpected error returned from admission handler: %v", err)
88 88
 	}
... ...
@@ -92,19 +92,19 @@ func TestAdmissionLifecycle(t *testing.T) {
92 92
 	store.Add(namespaceObj)
93 93
 
94 94
 	// verify create operations in the namespace cause an error
95
-	err = handler.Admit(admission.NewAttributesRecord(build, "Build", namespaceObj.Namespace, "builds", "CREATE"))
95
+	err = handler.Admit(admission.NewAttributesRecord(build, "Build", build.Namespace, "builds", "CREATE"))
96 96
 	if err == nil {
97 97
 		t.Errorf("Expected error rejecting creates in a namespace when it is terminating")
98 98
 	}
99 99
 
100 100
 	// verify update operations in the namespace can proceed
101
-	err = handler.Admit(admission.NewAttributesRecord(build, "Build", namespaceObj.Namespace, "builds", "UPDATE"))
101
+	err = handler.Admit(admission.NewAttributesRecord(build, "Build", build.Namespace, "builds", "UPDATE"))
102 102
 	if err != nil {
103 103
 		t.Errorf("Unexpected error returned from admission handler: %v", err)
104 104
 	}
105 105
 
106 106
 	// verify delete operations in the namespace can proceed
107
-	err = handler.Admit(admission.NewAttributesRecord(nil, "Build", namespaceObj.Namespace, "builds", "DELETE"))
107
+	err = handler.Admit(admission.NewAttributesRecord(nil, "Build", build.Namespace, "builds", "DELETE"))
108 108
 	if err != nil {
109 109
 		t.Errorf("Unexpected error returned from admission handler: %v", err)
110 110
 	}
... ...
@@ -95,10 +95,6 @@ func deleteAllContent(client osclient.Interface, namespace string) (err error) {
95 95
 	if err != nil {
96 96
 		return err
97 97
 	}
98
-	err = deleteDeployments(client, namespace)
99
-	if err != nil {
100
-		return err
101
-	}
102 98
 	err = deleteImageStreams(client, namespace)
103 99
 	if err != nil {
104 100
 		return err
... ...
@@ -210,20 +206,6 @@ func deleteImageStreams(client osclient.Interface, ns string) error {
210 210
 	return nil
211 211
 }
212 212
 
213
-func deleteDeployments(client osclient.Interface, ns string) error {
214
-	items, err := client.Deployments(ns).List(labels.Everything(), fields.Everything())
215
-	if err != nil {
216
-		return err
217
-	}
218
-	for i := range items.Items {
219
-		err := client.Deployments(ns).Delete(items.Items[i].Name)
220
-		if err != nil {
221
-			return err
222
-		}
223
-	}
224
-	return nil
225
-}
226
-
227 213
 func deleteDeploymentConfigs(client osclient.Interface, ns string) error {
228 214
 	items, err := client.DeploymentConfigs(ns).List(labels.Everything(), fields.Everything())
229 215
 	if err != nil {
... ...
@@ -46,8 +46,9 @@ func TestSyncNamespaceThatIsTerminating(t *testing.T) {
46 46
 		"list-role",
47 47
 		"list-routes",
48 48
 		"list-builds",
49
+		"finalize-namespace",
49 50
 		"list-deploymentconfig",
50
-		"list-deployment")
51
+	)
51 52
 	actionSet := util.NewStringSet()
52 53
 	for i := range mockKubeClient.Actions {
53 54
 		actionSet.Insert(mockKubeClient.Actions[i].Action)
... ...
@@ -50,7 +50,7 @@ var (
50 50
 	}
51 51
 )
52 52
 
53
-func TestFrontProxyOnAuthorize(t *testing.T) {
53
+func TestAuthProxyOnAuthorize(t *testing.T) {
54 54
 	testutil.DeleteAllEtcdKeys()
55 55
 
56 56
 	// setup
... ...
@@ -21,7 +21,7 @@ import (
21 21
 	"github.com/openshift/origin/pkg/cmd/server/bootstrappolicy"
22 22
 )
23 23
 
24
-func TestRestrictedAccessForProjectAdmins(t *testing.T) {
24
+func TestAuthorizationRestrictedAccessForProjectAdmins(t *testing.T) {
25 25
 	_, clusterAdminKubeConfig, err := testutil.StartTestMaster()
26 26
 	if err != nil {
27 27
 		t.Fatalf("unexpected error: %v", err)
... ...
@@ -47,12 +47,12 @@ func TestRestrictedAccessForProjectAdmins(t *testing.T) {
47 47
 		t.Fatalf("unexpected error: %v", err)
48 48
 	}
49 49
 
50
-	_, err = haroldClient.Deployments("hammer-project").List(labels.Everything(), fields.Everything())
50
+	_, err = haroldClient.DeploymentConfigs("hammer-project").List(labels.Everything(), fields.Everything())
51 51
 	if err != nil {
52 52
 		t.Fatalf("unexpected error: %v", err)
53 53
 	}
54 54
 
55
-	_, err = markClient.Deployments("hammer-project").List(labels.Everything(), fields.Everything())
55
+	_, err = markClient.DeploymentConfigs("hammer-project").List(labels.Everything(), fields.Everything())
56 56
 	if (err == nil) || !kapierror.IsForbidden(err) {
57 57
 		t.Fatalf("unexpected error: %v", err)
58 58
 	}
... ...
@@ -91,7 +91,7 @@ func waitForProject(t *testing.T, client client.Interface, projectName string, d
91 91
 	t.Errorf("expected project %v not found", projectName)
92 92
 }
93 93
 
94
-func TestOnlyResolveRolesForBindingsThatMatter(t *testing.T) {
94
+func TestAuthorizationOnlyResolveRolesForBindingsThatMatter(t *testing.T) {
95 95
 	_, clusterAdminKubeConfig, err := testutil.StartTestMaster()
96 96
 	if err != nil {
97 97
 		t.Fatalf("unexpected error: %v", err)
... ...
@@ -164,7 +164,7 @@ func (test resourceAccessReviewTest) run(t *testing.T) {
164 164
 	}
165 165
 }
166 166
 
167
-func TestResourceAccessReview(t *testing.T) {
167
+func TestAuthorizationResourceAccessReview(t *testing.T) {
168 168
 	_, clusterAdminKubeConfig, err := testutil.StartTestMaster()
169 169
 	if err != nil {
170 170
 		t.Fatalf("unexpected error: %v", err)
... ...
@@ -290,7 +290,7 @@ func (test subjectAccessReviewTest) run(t *testing.T) {
290 290
 	}
291 291
 }
292 292
 
293
-func TestSubjectAccessReview(t *testing.T) {
293
+func TestAuthorizationSubjectAccessReview(t *testing.T) {
294 294
 	_, clusterAdminKubeConfig, err := testutil.StartTestMaster()
295 295
 	if err != nil {
296 296
 		t.Fatalf("unexpected error: %v", err)
... ...
@@ -21,7 +21,7 @@ import (
21 21
 	testutil "github.com/openshift/origin/test/util"
22 22
 )
23 23
 
24
-func TestAuthenticatedUsersAgainstOpenshiftNamespace(t *testing.T) {
24
+func TestBootstrapPolicyAuthenticatedUsersAgainstOpenshiftNamespace(t *testing.T) {
25 25
 	_, clusterAdminKubeConfig, err := testutil.StartTestMaster()
26 26
 	if err != nil {
27 27
 		t.Fatalf("unexpected error: %v", err)
... ...
@@ -61,22 +61,22 @@ func TestAuthenticatedUsersAgainstOpenshiftNamespace(t *testing.T) {
61 61
 		t.Errorf("unexpected error: %v", err)
62 62
 	}
63 63
 
64
-	if _, err := valerieOpenshiftClient.ImageRepositories(openshiftSharedResourcesNamespace).List(labels.Everything(), fields.Everything()); err != nil {
64
+	if _, err := valerieOpenshiftClient.ImageStreams(openshiftSharedResourcesNamespace).List(labels.Everything(), fields.Everything()); err != nil {
65 65
 		t.Errorf("unexpected error: %v", err)
66 66
 	}
67
-	if _, err := valerieOpenshiftClient.ImageRepositories(kapi.NamespaceDefault).List(labels.Everything(), fields.Everything()); err == nil || !kapierror.IsForbidden(err) {
67
+	if _, err := valerieOpenshiftClient.ImageStreams(kapi.NamespaceDefault).List(labels.Everything(), fields.Everything()); err == nil || !kapierror.IsForbidden(err) {
68 68
 		t.Errorf("unexpected error: %v", err)
69 69
 	}
70 70
 
71
-	if _, err := valerieOpenshiftClient.ImageRepositoryTags(openshiftSharedResourcesNamespace).Get("name", "tag"); !kapierror.IsNotFound(err) {
71
+	if _, err := valerieOpenshiftClient.ImageStreamTags(openshiftSharedResourcesNamespace).Get("name", "tag"); !kapierror.IsNotFound(err) {
72 72
 		t.Errorf("unexpected error: %v", err)
73 73
 	}
74
-	if _, err := valerieOpenshiftClient.ImageRepositoryTags(kapi.NamespaceDefault).Get("name", "tag"); err == nil || !kapierror.IsForbidden(err) {
74
+	if _, err := valerieOpenshiftClient.ImageStreamTags(kapi.NamespaceDefault).Get("name", "tag"); err == nil || !kapierror.IsForbidden(err) {
75 75
 		t.Errorf("unexpected error: %v", err)
76 76
 	}
77 77
 }
78 78
 
79
-func TestOverwritePolicyCommand(t *testing.T) {
79
+func TestBootstrapPolicyOverwritePolicyCommand(t *testing.T) {
80 80
 	masterConfig, clusterAdminKubeConfig, err := testutil.StartTestMaster()
81 81
 	if err != nil {
82 82
 		t.Fatalf("unexpected error: %v", err)
... ...
@@ -114,7 +114,7 @@ func TestOverwritePolicyCommand(t *testing.T) {
114 114
 	}
115 115
 }
116 116
 
117
-func TestSelfSubjectAccessReviews(t *testing.T) {
117
+func TestBootstrapPolicySelfSubjectAccessReviews(t *testing.T) {
118 118
 	_, clusterAdminKubeConfig, err := testutil.StartTestMaster()
119 119
 	if err != nil {
120 120
 		t.Fatalf("unexpected error: %v", err)
... ...
@@ -5,6 +5,7 @@ package integration
5 5
 import (
6 6
 	"net/http"
7 7
 	"net/http/httptest"
8
+	"strings"
8 9
 	"sync"
9 10
 	"testing"
10 11
 
... ...
@@ -261,10 +262,13 @@ func NewTestBuildOpenshift(t *testing.T) *testBuildOpenshift {
261 261
 		"imageStreamTags":          imageStreamTagStorage,
262 262
 		"imageStreamImages":        imageStreamImageStorage,
263 263
 	}
264
+	for k, v := range storage {
265
+		storage[strings.ToLower(k)] = v
266
+	}
264 267
 
265 268
 	version := &apiserver.APIGroupVersion{
266 269
 		Root:    "/osapi",
267
-		Version: "v1beta1",
270
+		Version: "v1beta3",
268 271
 
269 272
 		Storage: storage,
270 273
 		Codec:   latest.Codec,
... ...
@@ -48,7 +48,7 @@ func init() {
48 48
 	testutil.RequireEtcd()
49 49
 }
50 50
 
51
-func TestGetToken(t *testing.T) {
51
+func TestCLIGetToken(t *testing.T) {
52 52
 	testutil.DeleteAllEtcdKeys()
53 53
 
54 54
 	// setup
... ...
@@ -6,6 +6,7 @@ import (
6 6
 	"fmt"
7 7
 	"net/http"
8 8
 	"net/http/httptest"
9
+	"strings"
9 10
 	"sync"
10 11
 	"testing"
11 12
 
... ...
@@ -25,7 +26,6 @@ import (
25 25
 	"github.com/GoogleCloudPlatform/kubernetes/plugin/pkg/admission/admit"
26 26
 
27 27
 	"github.com/openshift/origin/pkg/api/latest"
28
-	"github.com/openshift/origin/pkg/api/v1beta1"
29 28
 	osclient "github.com/openshift/origin/pkg/client"
30 29
 	deployapi "github.com/openshift/origin/pkg/deploy/api"
31 30
 	deploytest "github.com/openshift/origin/pkg/deploy/api/test"
... ...
@@ -33,7 +33,6 @@ import (
33 33
 	deployconfigcontroller "github.com/openshift/origin/pkg/deploy/controller/deploymentconfig"
34 34
 	imagechangecontroller "github.com/openshift/origin/pkg/deploy/controller/imagechange"
35 35
 	deployconfiggenerator "github.com/openshift/origin/pkg/deploy/generator"
36
-	deployregistry "github.com/openshift/origin/pkg/deploy/registry/deploy"
37 36
 	deployconfigregistry "github.com/openshift/origin/pkg/deploy/registry/deployconfig"
38 37
 	deployetcd "github.com/openshift/origin/pkg/deploy/registry/etcd"
39 38
 	imageapi "github.com/openshift/origin/pkg/image/api"
... ...
@@ -425,14 +424,16 @@ func NewTestDeployOpenshift(t *testing.T) *testDeployOpenshift {
425 425
 		"imageStreamImages":         imageStreamImageStorage,
426 426
 		"imageStreamMappings":       imageStreamMappingStorage,
427 427
 		"imageStreamTags":           imageStreamTagStorage,
428
-		"deployments":               deployregistry.NewREST(deployEtcd),
429 428
 		"deploymentConfigs":         deployconfigregistry.NewREST(deployEtcd),
430
-		"generateDeploymentConfigs": deployconfiggenerator.NewREST(deployConfigGenerator, v1beta1.Codec),
429
+		"generateDeploymentConfigs": deployconfiggenerator.NewREST(deployConfigGenerator, latest.Codec),
430
+	}
431
+	for k, v := range storage {
432
+		storage[strings.ToLower(k)] = v
431 433
 	}
432 434
 
433 435
 	version := &apiserver.APIGroupVersion{
434 436
 		Root:    "/osapi",
435
-		Version: "v1beta1",
437
+		Version: "v1beta3",
436 438
 
437 439
 		Storage: storage,
438 440
 		Codec:   latest.Codec,
... ...
@@ -155,12 +155,12 @@ func setup(t *testing.T) *client.Client {
155 155
 
156 156
 	clusterAdminClient, err := testutil.GetClusterAdminClient(clusterAdminKubeConfig)
157 157
 	if err != nil {
158
-		t.Errorf("unexpected error: %v", err)
158
+		t.Fatalf("unexpected error: %v", err)
159 159
 	}
160 160
 
161 161
 	clusterAdminKubeClient, err := testutil.GetClusterAdminKubeClient(clusterAdminKubeConfig)
162 162
 	if err != nil {
163
-		t.Errorf("unexpected error: %v", err)
163
+		t.Fatalf("unexpected error: %v", err)
164 164
 	}
165 165
 	clusterAdminKubeClient.Namespaces().Create(&kapi.Namespace{
166 166
 		ObjectMeta: kapi.ObjectMeta{Name: testutil.Namespace()},
... ...
@@ -228,8 +228,8 @@ func runTest(t *testing.T, testname string, clusterAdminClient *client.Client, i
228 228
 		t.Fatalf("expected watch event type %s, got %s", e, a)
229 229
 	}
230 230
 	newBuild = event.Object.(*buildapi.Build)
231
-	if newBuild.Parameters.Output.DockerImageReference != "registry:8080/openshift/test-image-trigger:outputtag" {
232
-		t.Fatalf("Expected build with output image %s, got %s", "registry:8080/openshift/test-image-trigger:outputtag", newBuild.Parameters.Output.DockerImageReference)
231
+	if newBuild.Parameters.Output.To.Name != "test-image-trigger-repo" || newBuild.Parameters.Output.Tag != "outputtag" {
232
+		t.Fatalf("unexpected build output: %#v %#v", newBuild.Parameters.Output.To, newBuild.Parameters.Output)
233 233
 	}
234 234
 	if newBuild.Labels["testlabel"] != "testvalue" {
235 235
 		t.Fatalf("Expected build with label %s=%s from build config got %s=%s", "testlabel", "testvalue", "testlabel", newBuild.Labels["testlabel"])
... ...
@@ -293,8 +293,8 @@ func runTest(t *testing.T, testname string, clusterAdminClient *client.Client, i
293 293
 		t.Fatalf("expected watch event type %s, got %s", e, a)
294 294
 	}
295 295
 	newBuild = event.Object.(*buildapi.Build)
296
-	if newBuild.Parameters.Output.DockerImageReference != "registry:8080/openshift/test-image-trigger:outputtag" {
297
-		t.Fatalf("Expected build with output image %s, got %s", "registry:8080/openshift/test-image-trigger:outputtag", newBuild.Parameters.Output.DockerImageReference)
296
+	if newBuild.Parameters.Output.To.Name != "test-image-trigger-repo" || newBuild.Parameters.Output.Tag != "outputtag" {
297
+		t.Fatalf("unexpected build output: %#v %#v", newBuild.Parameters.Output.To, newBuild.Parameters.Output)
298 298
 	}
299 299
 	if newBuild.Labels["testlabel"] != "testvalue" {
300 300
 		t.Fatalf("Expected build with label %s=%s from build config got %s=%s", "testlabel", "testvalue", "testlabel", newBuild.Labels["testlabel"])
301 301
deleted file mode 100644
... ...
@@ -1,280 +0,0 @@
1
-// +build integration,!no-etcd
2
-
3
-package integration
4
-
5
-import (
6
-	"reflect"
7
-	"testing"
8
-
9
-	kapi "github.com/GoogleCloudPlatform/kubernetes/pkg/api"
10
-	"github.com/GoogleCloudPlatform/kubernetes/pkg/api/errors"
11
-	"github.com/GoogleCloudPlatform/kubernetes/pkg/fields"
12
-	"github.com/GoogleCloudPlatform/kubernetes/pkg/labels"
13
-	"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
14
-
15
-	imageapi "github.com/openshift/origin/pkg/image/api"
16
-	testutil "github.com/openshift/origin/test/util"
17
-)
18
-
19
-func init() {
20
-	testutil.RequireEtcd()
21
-}
22
-
23
-func TestImageRepositoryList(t *testing.T) {
24
-	_, clusterAdminKubeConfig, err := testutil.StartTestMaster()
25
-	if err != nil {
26
-		t.Fatalf("unexpected error: %v", err)
27
-	}
28
-
29
-	clusterAdminClient, err := testutil.GetClusterAdminClient(clusterAdminKubeConfig)
30
-	if err != nil {
31
-		t.Errorf("unexpected error: %v", err)
32
-	}
33
-
34
-	err = testutil.CreateNamespace(clusterAdminKubeConfig, testutil.Namespace())
35
-	if err != nil {
36
-		t.Errorf("unexpected error: %v", err)
37
-	}
38
-
39
-	builds, err := clusterAdminClient.ImageRepositories(testutil.Namespace()).List(labels.Everything(), fields.Everything())
40
-	if err != nil {
41
-		t.Fatalf("Unexpected error %v", err)
42
-	}
43
-	if len(builds.Items) != 0 {
44
-		t.Errorf("Expected no builds, got %#v", builds.Items)
45
-	}
46
-}
47
-
48
-func mockImageRepository() *imageapi.ImageRepository {
49
-	return &imageapi.ImageRepository{ObjectMeta: kapi.ObjectMeta{Name: "test"}}
50
-}
51
-
52
-func TestImageRepositoryCreate(t *testing.T) {
53
-	_, clusterAdminKubeConfig, err := testutil.StartTestMaster()
54
-	if err != nil {
55
-		t.Fatalf("unexpected error: %v", err)
56
-	}
57
-
58
-	clusterAdminClient, err := testutil.GetClusterAdminClient(clusterAdminKubeConfig)
59
-	if err != nil {
60
-		t.Errorf("unexpected error: %v", err)
61
-	}
62
-
63
-	err = testutil.CreateNamespace(clusterAdminKubeConfig, testutil.Namespace())
64
-	if err != nil {
65
-		t.Errorf("unexpected error: %v", err)
66
-	}
67
-
68
-	repo := mockImageRepository()
69
-
70
-	if _, err := clusterAdminClient.ImageRepositories(testutil.Namespace()).Create(&imageapi.ImageRepository{}); err == nil || !errors.IsInvalid(err) {
71
-		t.Fatalf("Unexpected error: %v", err)
72
-	}
73
-
74
-	expected, err := clusterAdminClient.ImageRepositories(testutil.Namespace()).Create(repo)
75
-	if err != nil {
76
-		t.Fatalf("Unexpected error: %v", err)
77
-	}
78
-	if expected.Name == "" {
79
-		t.Errorf("Unexpected empty image Name %v", expected)
80
-	}
81
-
82
-	actual, err := clusterAdminClient.ImageRepositories(testutil.Namespace()).Get(repo.Name)
83
-	if err != nil {
84
-		t.Fatalf("Unexpected error: %v", err)
85
-	}
86
-	if !reflect.DeepEqual(expected, actual) {
87
-		t.Errorf("unexpected object: %s", util.ObjectDiff(expected, actual))
88
-	}
89
-
90
-	repos, err := clusterAdminClient.ImageRepositories(testutil.Namespace()).List(labels.Everything(), fields.Everything())
91
-	if err != nil {
92
-		t.Fatalf("Unexpected error %v", err)
93
-	}
94
-	if len(repos.Items) != 1 {
95
-		t.Errorf("Expected one image, got %#v", repos.Items)
96
-	}
97
-}
98
-
99
-func TestImageRepositoryMappingCreate(t *testing.T) {
100
-	_, clusterAdminKubeConfig, err := testutil.StartTestMaster()
101
-	if err != nil {
102
-		t.Fatalf("unexpected error: %v", err)
103
-	}
104
-
105
-	clusterAdminClient, err := testutil.GetClusterAdminClient(clusterAdminKubeConfig)
106
-	if err != nil {
107
-		t.Errorf("unexpected error: %v", err)
108
-	}
109
-
110
-	err = testutil.CreateNamespace(clusterAdminKubeConfig, testutil.Namespace())
111
-	if err != nil {
112
-		t.Errorf("unexpected error: %v", err)
113
-	}
114
-
115
-	repo := mockImageRepository()
116
-
117
-	expected, err := clusterAdminClient.ImageRepositories(testutil.Namespace()).Create(repo)
118
-	if err != nil {
119
-		t.Fatalf("Unexpected error: %v", err)
120
-	}
121
-	if expected.Name == "" {
122
-		t.Errorf("Unexpected empty image Name %v", expected)
123
-	}
124
-
125
-	// create a mapping to an image that doesn't exist
126
-	mapping := &imageapi.ImageRepositoryMapping{
127
-		ObjectMeta: kapi.ObjectMeta{Name: repo.Name},
128
-		Tag:        "newer",
129
-		Image: imageapi.Image{
130
-			ObjectMeta: kapi.ObjectMeta{
131
-				Name: "image1",
132
-			},
133
-			DockerImageReference: "some/other/name",
134
-		},
135
-	}
136
-	if err := clusterAdminClient.ImageRepositoryMappings(testutil.Namespace()).Create(mapping); err != nil {
137
-		t.Fatalf("unexpected error: %v", err)
138
-	}
139
-
140
-	// verify we can tag a second time with the same data, and nothing changes
141
-	if err := clusterAdminClient.ImageRepositoryMappings(testutil.Namespace()).Create(mapping); err != nil {
142
-		t.Fatalf("unexpected non-error or type: %v", err)
143
-	}
144
-
145
-	// create an image directly
146
-	image := &imageapi.Image{
147
-		ObjectMeta: kapi.ObjectMeta{Name: "image2"},
148
-		DockerImageMetadata: imageapi.DockerImage{
149
-			Config: imageapi.DockerConfig{
150
-				Env: []string{"A=B"},
151
-			},
152
-		},
153
-	}
154
-	if _, err := clusterAdminClient.Images().Create(image); err == nil {
155
-		t.Error("unexpected non-error")
156
-	}
157
-	image.DockerImageReference = "some/other/name" // can reuse references across multiple images
158
-	actual, err := clusterAdminClient.Images().Create(image)
159
-	if err != nil {
160
-		t.Fatalf("unexpected error: %v", err)
161
-	}
162
-	if actual == nil || actual.Name != image.Name {
163
-		t.Errorf("unexpected object: %#v", actual)
164
-	}
165
-
166
-	// verify that image repository mappings cannot mutate / overwrite the image (images are immutable)
167
-	mapping = &imageapi.ImageRepositoryMapping{
168
-		ObjectMeta: kapi.ObjectMeta{Name: repo.Name},
169
-		Tag:        "newest",
170
-		Image:      *image,
171
-	}
172
-	mapping.Image.DockerImageReference = "different"
173
-	if err := clusterAdminClient.ImageRepositoryMappings(testutil.Namespace()).Create(mapping); err != nil {
174
-		t.Fatalf("unexpected error: %v", err)
175
-	}
176
-	image, err = clusterAdminClient.Images().Get(image.Name)
177
-	if err != nil {
178
-		t.Fatalf("unexpected error: %v", err)
179
-	}
180
-	if image.DockerImageReference != "some/other/name" {
181
-		t.Fatalf("image was unexpectedly mutated: %#v", image)
182
-	}
183
-
184
-	// ensure the correct tags are set
185
-	updated, err := clusterAdminClient.ImageRepositories(testutil.Namespace()).Get(repo.Name)
186
-	if err != nil {
187
-		t.Fatalf("Unexpected error: %v", err)
188
-	}
189
-	if updated.Tags != nil {
190
-		t.Errorf("unexpected object: %#v", updated.Tags)
191
-	}
192
-
193
-	fromTag, err := clusterAdminClient.ImageRepositoryTags(testutil.Namespace()).Get(repo.Name, "newer")
194
-	if err != nil {
195
-		t.Fatalf("Unexpected error: %v", err)
196
-	}
197
-	if fromTag.Name != "test:newer" || fromTag.UID == "" || fromTag.DockerImageReference != "some/other/name" {
198
-		t.Errorf("unexpected object: %#v", fromTag)
199
-	}
200
-
201
-	fromTag, err = clusterAdminClient.ImageRepositoryTags(testutil.Namespace()).Get(repo.Name, "newest")
202
-	if err != nil {
203
-		t.Fatalf("Unexpected error: %v", err)
204
-	}
205
-	if fromTag.Name != "test:newest" || fromTag.UID == "" || fromTag.DockerImageReference != "some/other/name" {
206
-		t.Errorf("unexpected object: %#v", fromTag)
207
-	}
208
-
209
-	// verify that image repository mappings can use the same image for different tags
210
-	image.ResourceVersion = ""
211
-	mapping = &imageapi.ImageRepositoryMapping{
212
-		ObjectMeta: kapi.ObjectMeta{Name: repo.Name},
213
-		Tag:        "anothertag",
214
-		Image:      *image,
215
-	}
216
-	if err := clusterAdminClient.ImageRepositoryMappings(testutil.Namespace()).Create(mapping); err != nil {
217
-		t.Fatalf("unexpected error: %v", err)
218
-	}
219
-	// ensure the correct tags are set
220
-	updated, err = clusterAdminClient.ImageRepositories(testutil.Namespace()).Get(repo.Name)
221
-	if err != nil {
222
-		t.Fatalf("Unexpected error: %v", err)
223
-	}
224
-	if updated.Tags != nil {
225
-		t.Errorf("unexpected object: %#v", updated.Tags)
226
-	}
227
-
228
-	fromTag, err = clusterAdminClient.ImageRepositoryTags(testutil.Namespace()).Get(repo.Name, "newer")
229
-	if err != nil {
230
-		t.Fatalf("Unexpected error: %v", err)
231
-	}
232
-	if fromTag.Name != "test:newer" || fromTag.UID == "" || fromTag.DockerImageReference != "some/other/name" {
233
-		t.Errorf("unexpected object: %#v", fromTag)
234
-	}
235
-
236
-	fromTag, err = clusterAdminClient.ImageRepositoryTags(testutil.Namespace()).Get(repo.Name, "newest")
237
-	if err != nil {
238
-		t.Fatalf("Unexpected error: %v", err)
239
-	}
240
-	if fromTag.Name != "test:newest" || fromTag.UID == "" || fromTag.DockerImageReference != "some/other/name" {
241
-		t.Errorf("unexpected object: %#v", fromTag)
242
-	}
243
-	fromTag, err = clusterAdminClient.ImageRepositoryTags(testutil.Namespace()).Get(repo.Name, "anothertag")
244
-	if err != nil {
245
-		t.Fatalf("Unexpected error: %v", err)
246
-	}
247
-	if fromTag.Name != "test:anothertag" || fromTag.UID == "" || fromTag.DockerImageReference != "some/other/name" {
248
-		t.Errorf("unexpected object: %#v", fromTag)
249
-	}
250
-
251
-}
252
-
253
-func TestImageRepositoryDelete(t *testing.T) {
254
-	_, clusterAdminKubeConfig, err := testutil.StartTestMaster()
255
-	if err != nil {
256
-		t.Fatalf("unexpected error: %v", err)
257
-	}
258
-
259
-	clusterAdminClient, err := testutil.GetClusterAdminClient(clusterAdminKubeConfig)
260
-	if err != nil {
261
-		t.Errorf("unexpected error: %v", err)
262
-	}
263
-	err = testutil.CreateNamespace(clusterAdminKubeConfig, testutil.Namespace())
264
-	if err != nil {
265
-		t.Errorf("unexpected error: %v", err)
266
-	}
267
-
268
-	repo := mockImageRepository()
269
-
270
-	if err := clusterAdminClient.ImageRepositories(testutil.Namespace()).Delete(repo.Name); err == nil || !errors.IsNotFound(err) {
271
-		t.Fatalf("Unxpected non-error or type: %v", err)
272
-	}
273
-	actual, err := clusterAdminClient.ImageRepositories(testutil.Namespace()).Create(repo)
274
-	if err != nil {
275
-		t.Fatalf("Unexpected error: %v", err)
276
-	}
277
-	if err := clusterAdminClient.ImageRepositories(testutil.Namespace()).Delete(actual.Name); err != nil {
278
-		t.Fatalf("Unxpected error: %v", err)
279
-	}
280
-}
... ...
@@ -10,7 +10,7 @@ import (
10 10
 	kapi "github.com/GoogleCloudPlatform/kubernetes/pkg/api"
11 11
 	klatest "github.com/GoogleCloudPlatform/kubernetes/pkg/api/latest"
12 12
 	"github.com/GoogleCloudPlatform/kubernetes/pkg/api/rest"
13
-	kv1beta1 "github.com/GoogleCloudPlatform/kubernetes/pkg/api/v1beta1"
13
+	kv1beta3 "github.com/GoogleCloudPlatform/kubernetes/pkg/api/v1beta3"
14 14
 	"github.com/GoogleCloudPlatform/kubernetes/pkg/apiserver"
15 15
 	kclient "github.com/GoogleCloudPlatform/kubernetes/pkg/client"
16 16
 	"github.com/GoogleCloudPlatform/kubernetes/pkg/master"
... ...
@@ -19,7 +19,6 @@ import (
19 19
 	"github.com/GoogleCloudPlatform/kubernetes/plugin/pkg/admission/admit"
20 20
 
21 21
 	"github.com/openshift/origin/pkg/api/latest"
22
-	"github.com/openshift/origin/pkg/api/v1beta1"
23 22
 	buildapi "github.com/openshift/origin/pkg/build/api"
24 23
 	"github.com/openshift/origin/pkg/client"
25 24
 	projectapi "github.com/openshift/origin/pkg/project/api"
... ...
@@ -54,10 +53,10 @@ func TestProjectIsNamespace(t *testing.T) {
54 54
 
55 55
 	version := &apiserver.APIGroupVersion{
56 56
 		Root:    "/api",
57
-		Version: "v1beta1",
57
+		Version: "v1beta3",
58 58
 
59 59
 		Storage: kubeStorage,
60
-		Codec:   kv1beta1.Codec,
60
+		Codec:   kv1beta3.Codec,
61 61
 
62 62
 		Mapper: klatest.RESTMapper,
63 63
 
... ...
@@ -73,7 +72,7 @@ func TestProjectIsNamespace(t *testing.T) {
73 73
 		t.Fatalf("unable to install REST: %v", err)
74 74
 	}
75 75
 
76
-	kubeClient, err := kclient.New(&kclient.Config{Host: server.URL, Version: "v1beta1"})
76
+	kubeClient, err := kclient.New(&kclient.Config{Host: server.URL, Version: "v1beta3"})
77 77
 	if err != nil {
78 78
 		t.Fatalf("Unexpected error: %v", err)
79 79
 	}
... ...
@@ -85,10 +84,10 @@ func TestProjectIsNamespace(t *testing.T) {
85 85
 	}
86 86
 	osVersion := &apiserver.APIGroupVersion{
87 87
 		Root:    "/osapi",
88
-		Version: "v1beta1",
88
+		Version: "v1beta3",
89 89
 
90 90
 		Storage: originStorage,
91
-		Codec:   v1beta1.Codec,
91
+		Codec:   latest.Codec,
92 92
 
93 93
 		Mapper: latest.RESTMapper,
94 94
 
... ...
@@ -29,11 +29,11 @@ func TestUnprivilegedNewProject(t *testing.T) {
29 29
 
30 30
 	clusterAdminClientConfig, err := testutil.GetClusterAdminClientConfig(clusterAdminKubeConfig)
31 31
 	if err != nil {
32
-		t.Errorf("unexpected error: %v", err)
32
+		t.Fatalf("unexpected error: %v", err)
33 33
 	}
34 34
 	clusterAdminClient, err := testutil.GetClusterAdminClient(clusterAdminKubeConfig)
35 35
 	if err != nil {
36
-		t.Errorf("unexpected error: %v", err)
36
+		t.Fatalf("unexpected error: %v", err)
37 37
 	}
38 38
 
39 39
 	valerieClientConfig := *clusterAdminClientConfig
... ...
@@ -59,10 +59,10 @@ func TestUnprivilegedNewProject(t *testing.T) {
59 59
 	// confirm that we have access to request the project
60 60
 	allowed, err := valerieOpenshiftClient.ProjectRequests().List(labels.Everything(), fields.Everything())
61 61
 	if err != nil {
62
-		t.Errorf("unexpected error: %v", err)
62
+		t.Fatalf("unexpected error: %v", err)
63 63
 	}
64 64
 	if allowed.Status != kapi.StatusSuccess {
65
-		t.Errorf("expected %v, got %v", kapi.StatusSuccess, allowed.Status)
65
+		t.Fatalf("expected %v, got %v", kapi.StatusSuccess, allowed.Status)
66 66
 	}
67 67
 
68 68
 	requestProject := osc.NewProjectOptions{
... ...
@@ -75,30 +75,30 @@ func TestUnprivilegedNewProject(t *testing.T) {
75 75
 	}
76 76
 
77 77
 	if err := requestProject.Run(); err != nil {
78
-		t.Errorf("unexpected error: %v", err)
78
+		t.Fatalf("unexpected error: %v", err)
79 79
 	}
80 80
 
81 81
 	waitForProject(t, valerieOpenshiftClient, "new-project", 5*time.Second, 10)
82 82
 
83 83
 	// request the same one again.  This should fail during the bulk creation step
84 84
 	if err := requestProject.Run(); err == nil || !strings.Contains(err.Error(), "already exists") {
85
-		t.Errorf("expected an already exists error, but got %v", err)
85
+		t.Fatalf("expected an already exists error, but got %v", err)
86 86
 	}
87 87
 
88 88
 	tokens := strings.Split(masterConfig.ProjectRequestConfig.ProjectRequestTemplate, "/")
89 89
 	if err := clusterAdminClient.Templates(tokens[0]).Delete(tokens[1]); err != nil {
90
-		t.Errorf("unexpected error: %v", err)
90
+		t.Fatalf("unexpected error: %v", err)
91 91
 	}
92 92
 
93 93
 	requestProject.ProjectName = "different"
94 94
 	// This should fail during the template retrieve
95 95
 	if err := requestProject.Run(); !kapierrors.IsNotFound(err) {
96
-		t.Errorf("expected a not found error, but got %v", err)
96
+		t.Fatalf("expected a not found error, but got %v", err)
97 97
 	}
98 98
 
99 99
 }
100 100
 
101
-func TestDeniedUnprivilegedNewProject(t *testing.T) {
101
+func TestUnprivilegedNewProjectDenied(t *testing.T) {
102 102
 	_, clusterAdminKubeConfig, err := testutil.StartTestMaster()
103 103
 	if err != nil {
104 104
 		t.Fatalf("unexpected error: %v", err)
... ...
@@ -106,20 +106,20 @@ func TestDeniedUnprivilegedNewProject(t *testing.T) {
106 106
 
107 107
 	clusterAdminClient, err := testutil.GetClusterAdminClient(clusterAdminKubeConfig)
108 108
 	if err != nil {
109
-		t.Errorf("unexpected error: %v", err)
109
+		t.Fatalf("unexpected error: %v", err)
110 110
 	}
111 111
 	role, err := clusterAdminClient.ClusterRoles().Get(bootstrappolicy.SelfProvisionerRoleName)
112 112
 	if err != nil {
113
-		t.Errorf("unexpected error: %v", err)
113
+		t.Fatalf("unexpected error: %v", err)
114 114
 	}
115 115
 	role.Rules = []authorizationapi.PolicyRule{}
116 116
 	if _, err := clusterAdminClient.ClusterRoles().Update(role); err != nil {
117
-		t.Errorf("unexpected error: %v", err)
117
+		t.Fatalf("unexpected error: %v", err)
118 118
 	}
119 119
 
120 120
 	clusterAdminClientConfig, err := testutil.GetClusterAdminClientConfig(clusterAdminKubeConfig)
121 121
 	if err != nil {
122
-		t.Errorf("unexpected error: %v", err)
122
+		t.Fatalf("unexpected error: %v", err)
123 123
 	}
124 124
 
125 125
 	valerieClientConfig := *clusterAdminClientConfig
... ...
@@ -145,11 +145,11 @@ func TestDeniedUnprivilegedNewProject(t *testing.T) {
145 145
 	// confirm that we have access to request the project
146 146
 	allowed, err := valerieOpenshiftClient.ProjectRequests().List(labels.Everything(), fields.Everything())
147 147
 	if err == nil {
148
-		t.Errorf("expected error: %v", err)
148
+		t.Fatalf("expected error: %v", err)
149 149
 	}
150 150
 	expectedError := `ProjectRequest "" is forbidden: You may not request a new project via this API.`
151 151
 	if (err != nil) && (err.Error() != expectedError) {
152
-		t.Errorf("expected %v, got %v", expectedError, allowed.Status)
152
+		t.Fatalf("expected %v, got %v", expectedError, allowed.Status)
153 153
 	}
154 154
 
155 155
 }
... ...
@@ -218,7 +218,7 @@ func TestWebhookGithubPing(t *testing.T) {
218 218
 
219 219
 	for _, s := range []string{
220 220
 		openshift.whPrefix + "pushbuild/secret101/github?namespace=" + testutil.Namespace(),
221
-		"/osapi/v1beta1/buildConfigs/pushbuild/webhooks/secret101/github?namespace=" + testutil.Namespace(),
221
+		"/osapi/v1beta3/namespaces/" + testutil.Namespace() + "/buildconfigs/pushbuild/webhooks/secret101/github",
222 222
 	} {
223 223
 		// trigger build event sending push notification
224 224
 		postFile(&http.Client{}, "ping", "pingevent.json", openshift.server.URL+s, http.StatusOK, t)
... ...
@@ -6,6 +6,7 @@ import (
6 6
 	"net/http/httptest"
7 7
 	"os"
8 8
 	"path/filepath"
9
+	"strings"
9 10
 	"testing"
10 11
 
11 12
 	kapi "github.com/GoogleCloudPlatform/kubernetes/pkg/api"
... ...
@@ -17,7 +18,8 @@ import (
17 17
 
18 18
 	"github.com/openshift/origin/pkg/api/latest"
19 19
 	osclient "github.com/openshift/origin/pkg/client"
20
-	config "github.com/openshift/origin/pkg/config/api"
20
+	//config "github.com/openshift/origin/pkg/config/api"
21
+	templateapi "github.com/openshift/origin/pkg/template/api"
21 22
 	templateregistry "github.com/openshift/origin/pkg/template/registry"
22 23
 )
23 24
 
... ...
@@ -52,18 +54,24 @@ func TestTemplateTransformationFromConfig(t *testing.T) {
52 52
 	server := httptest.NewServer(osMux)
53 53
 	defer server.Close()
54 54
 
55
-	osClient := osclient.NewOrDie(&kclient.Config{Host: server.URL})
55
+	osClient := osclient.NewOrDie(&kclient.Config{Host: server.URL, Version: latest.Version})
56 56
 
57 57
 	storage := map[string]rest.Storage{
58 58
 		"templateConfigs":    templateregistry.NewREST(true),
59 59
 		"processedTemplates": templateregistry.NewREST(false),
60 60
 	}
61
+	if !kapi.PreV1Beta3(latest.Version) {
62
+		for k, v := range storage {
63
+			delete(storage, k)
64
+			storage[strings.ToLower(k)] = v
65
+		}
66
+	}
61 67
 
62 68
 	interfaces, _ := latest.InterfacesFor(latest.Version)
63 69
 	handlerContainer := master.NewHandlerContainer(osMux)
64 70
 	version := apiserver.APIGroupVersion{
65 71
 		Root:    "/osapi",
66
-		Version: "v1beta1",
72
+		Version: latest.Version,
67 73
 
68 74
 		Mapper: latest.RESTMapper,
69 75
 
... ...
@@ -82,14 +90,18 @@ func TestTemplateTransformationFromConfig(t *testing.T) {
82 82
 		t.Fatalf("unexpected error: %v", err)
83 83
 	}
84 84
 
85
-	walkJSONFiles("fixtures", func(name, path string, _ []byte) {
86
-		config := &config.Config{}
87
-		err := osClient.RESTClient.Post().Resource("templateConfigs").Body(path).Do().Into(config)
85
+	walkJSONFiles("fixtures", func(name, path string, data []byte) {
86
+		template, err := interfaces.Codec.Decode(data)
87
+		if err != nil {
88
+			t.Errorf("%q: unexpected error: %v", path, err)
89
+			return
90
+		}
91
+		config, err := osClient.TemplateConfigs("default").Create(template.(*templateapi.Template))
88 92
 		if err != nil {
89 93
 			t.Errorf("%q: unexpected error: %v", path, err)
90 94
 			return
91 95
 		}
92
-		if len(config.Items) == 0 {
96
+		if len(config.Objects) == 0 {
93 97
 			t.Errorf("%q: no items in config object", path)
94 98
 			return
95 99
 		}
... ...
@@ -33,7 +33,7 @@ func CreateSampleImageStream(namespace string) *imageapi.ImageStream {
33 33
 // namespace
34 34
 func DeleteSampleImageStream(stream *imageapi.ImageStream, namespace string) {
35 35
 	client, _ := GetClusterAdminClient(KubeConfigPath())
36
-	client.ImageRepositories(namespace).Delete(stream.Name)
36
+	client.ImageStreams(namespace).Delete(stream.Name)
37 37
 }
38 38
 
39 39
 // GetBuildFixture reads the Build JSON and returns and Build object