Browse code

Interesting changes

Michal Fojtik authored on 2016/06/10 06:16:49
Showing 56 changed files
... ...
@@ -65,6 +65,9 @@ os::log::start_system_logger
65 65
 function exectest() {
66 66
 	echo "Running $1..."
67 67
 
68
+	export TEST_ETCD_DIR="${TMPDIR:-/tmp}/etcd-${1}"
69
+	rm -fr "${TEST_ETCD_DIR}"
70
+	mkdir -p "${TEST_ETCD_DIR}"
68 71
 	result=1
69 72
 	if [ -n "${DEBUG-}" ]; then
70 73
 		dlv exec "${testexec}" -- -test.run="^$1$" "${@:2}"
... ...
@@ -82,6 +85,8 @@ function exectest() {
82 82
 
83 83
 	if [[ ${result} -eq 0 ]]; then
84 84
 		os::text::print_green "ok      $1"
85
+		# Remove the etcd directory to cleanup the space.
86
+		rm -rf "${TEST_ETCD_DIR}"
85 87
 		exit 0
86 88
 	else
87 89
 		os::text::print_red "failed  $1"
... ...
@@ -2,18 +2,20 @@ package dockerhelper
2 2
 
3 3
 import (
4 4
 	"bytes"
5
-	"encoding/json"
6 5
 	"errors"
7 6
 	"fmt"
8 7
 	"io"
9 8
 	"net"
10 9
 	"net/url"
11 10
 	"strconv"
12
-	"strings"
11
+	"time"
13 12
 
14 13
 	"github.com/blang/semver"
14
+	dockerclient "github.com/docker/engine-api/client"
15
+	"github.com/docker/engine-api/types/registry"
15 16
 	docker "github.com/fsouza/go-dockerclient"
16 17
 	"github.com/golang/glog"
18
+	"golang.org/x/net/context"
17 19
 
18 20
 	starterrors "github.com/openshift/origin/pkg/bootstrap/docker/errors"
19 21
 	"github.com/openshift/origin/pkg/util/docker/dockerfile/builder/imageprogress"
... ...
@@ -23,13 +25,15 @@ const openShiftInsecureCIDR = "172.30.0.0/16"
23 23
 
24 24
 // Helper provides utility functions to help with Docker
25 25
 type Helper struct {
26
-	client *docker.Client
26
+	client          *docker.Client
27
+	engineAPIClient *dockerclient.Client
27 28
 }
28 29
 
29 30
 // NewHelper creates a new Helper
30
-func NewHelper(client *docker.Client) *Helper {
31
+func NewHelper(client *docker.Client, engineAPIClient *dockerclient.Client) *Helper {
31 32
 	return &Helper{
32
-		client: client,
33
+		client:          client,
34
+		engineAPIClient: engineAPIClient,
33 35
 	}
34 36
 }
35 37
 
... ...
@@ -37,29 +41,11 @@ type RegistryConfig struct {
37 37
 	InsecureRegistryCIDRs []string
38 38
 }
39 39
 
40
-func getRegistryConfig(env *docker.Env) (*RegistryConfig, error) {
41
-	for _, entry := range *env {
42
-		if !strings.HasPrefix(entry, "RegistryConfig=") {
43
-			continue
44
-		}
45
-		glog.V(5).Infof("Found RegistryConfig entry: %s", entry)
46
-		value := strings.TrimPrefix(entry, "RegistryConfig=")
47
-		config := &RegistryConfig{}
48
-		err := json.Unmarshal([]byte(value), config)
49
-		if err != nil {
50
-			glog.V(2).Infof("Error unmarshalling RegistryConfig: %v", err)
51
-			return nil, err
52
-		}
53
-		glog.V(5).Infof("Unmarshalled registry config to %#v", config)
54
-		return config, nil
55
-	}
56
-	return nil, nil
57
-}
58
-
59
-func hasCIDR(cidr string, listOfCIDRs []string) bool {
40
+func hasCIDR(cidr string, listOfCIDRs []*registry.NetIPNet) bool {
60 41
 	glog.V(5).Infof("Looking for %q in %#v", cidr, listOfCIDRs)
61 42
 	for _, candidate := range listOfCIDRs {
62
-		if candidate == cidr {
43
+		candidateStr := (*net.IPNet)(candidate).String()
44
+		if candidateStr == cidr {
63 45
 			glog.V(5).Infof("Found %q", cidr)
64 46
 			return true
65 47
 		}
... ...
@@ -72,13 +58,18 @@ func hasCIDR(cidr string, listOfCIDRs []string) bool {
72 72
 // the appropriate insecure registry argument
73 73
 func (h *Helper) HasInsecureRegistryArg() (bool, error) {
74 74
 	glog.V(5).Infof("Retrieving Docker daemon info")
75
-	env, err := h.client.Info()
75
+	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
76
+	if h.engineAPIClient == nil {
77
+		return false, fmt.Errorf("the Docker engine API client is not initialized")
78
+	}
79
+	info, err := h.engineAPIClient.Info(ctx)
80
+	defer cancel()
76 81
 	if err != nil {
77 82
 		glog.V(2).Infof("Could not retrieve Docker info: %v", err)
78 83
 		return false, err
79 84
 	}
80
-	glog.V(5).Infof("Docker daemon info: %#v", env)
81
-	registryConfig, err := getRegistryConfig(env)
85
+	glog.V(5).Infof("Docker daemon info: %#v", info)
86
+	registryConfig := info.RegistryConfig
82 87
 	if err != nil {
83 88
 		return false, err
84 89
 	}
... ...
@@ -3,15 +3,19 @@ package dockermachine
3 3
 import (
4 4
 	"bufio"
5 5
 	"bytes"
6
+	"net/http"
6 7
 	"os/exec"
7 8
 	"path/filepath"
8 9
 	"runtime"
9 10
 	"strconv"
10 11
 	"strings"
11 12
 
13
+	dockerclient "github.com/docker/engine-api/client"
14
+	"github.com/docker/go-connections/tlsconfig"
12 15
 	docker "github.com/fsouza/go-dockerclient"
13 16
 	"github.com/openshift/origin/pkg/bootstrap/docker/errors"
14 17
 	"github.com/openshift/origin/pkg/bootstrap/docker/localcmd"
18
+	"k8s.io/kubernetes/pkg/util/net"
15 19
 )
16 20
 
17 21
 const (
... ...
@@ -105,10 +109,10 @@ func Start(name string) error {
105 105
 }
106 106
 
107 107
 // Client returns a Docker client for the given Docker machine
108
-func Client(name string) (*docker.Client, error) {
108
+func Client(name string) (*docker.Client, *dockerclient.Client, error) {
109 109
 	output, _, err := localcmd.New(dockerMachineBinary()).Args("env", name).Output()
110 110
 	if err != nil {
111
-		return nil, ErrDockerMachineExec("env", err)
111
+		return nil, nil, ErrDockerMachineExec("env", err)
112 112
 	}
113 113
 	scanner := bufio.NewScanner(bytes.NewBufferString(output))
114 114
 	var (
... ...
@@ -138,7 +142,7 @@ func Client(name string) (*docker.Client, error) {
138 138
 		}
139 139
 	}
140 140
 	var client *docker.Client
141
-	if tlsVerify {
141
+	if len(certPath) > 0 {
142 142
 		cert := filepath.Join(certPath, "cert.pem")
143 143
 		key := filepath.Join(certPath, "key.pem")
144 144
 		ca := filepath.Join(certPath, "ca.pem")
... ...
@@ -147,10 +151,35 @@ func Client(name string) (*docker.Client, error) {
147 147
 		client, err = docker.NewVersionedClient(dockerHost, "")
148 148
 	}
149 149
 	if err != nil {
150
-		return nil, errors.NewError("could not get Docker client for machine %s", name).WithCause(err)
150
+		return nil, nil, errors.NewError("could not get Docker client for machine %s", name).WithCause(err)
151 151
 	}
152 152
 	client.SkipServerVersionCheck = true
153
-	return client, nil
153
+
154
+	var httpClient *http.Client
155
+	if len(certPath) > 0 {
156
+		tlscOptions := tlsconfig.Options{
157
+			CAFile:             filepath.Join(certPath, "ca.pem"),
158
+			CertFile:           filepath.Join(certPath, "cert.pem"),
159
+			KeyFile:            filepath.Join(certPath, "key.pem"),
160
+			InsecureSkipVerify: !tlsVerify,
161
+		}
162
+		tlsc, tlsErr := tlsconfig.Client(tlscOptions)
163
+		if tlsErr != nil {
164
+			return nil, nil, errors.NewError("could not create TLS config client for machine %s", name).WithCause(tlsErr)
165
+		}
166
+		httpClient = &http.Client{
167
+			Transport: net.SetTransportDefaults(&http.Transport{
168
+				TLSClientConfig: tlsc,
169
+			}),
170
+		}
171
+	}
172
+
173
+	engineAPIClient, err := dockerclient.NewClient(dockerHost, "", httpClient, nil)
174
+	if err != nil {
175
+		return nil, nil, errors.NewError("cannot create Docker engine API client").WithCause(err)
176
+	}
177
+
178
+	return client, engineAPIClient, nil
154 179
 }
155 180
 
156 181
 // IsAvailable returns true if the docker-machine executable can be found in the PATH
... ...
@@ -63,7 +63,7 @@ func (c *ClientStopConfig) Stop(out io.Writer) error {
63 63
 	if err != nil {
64 64
 		return err
65 65
 	}
66
-	helper := dockerhelper.NewHelper(client)
66
+	helper := dockerhelper.NewHelper(client, nil)
67 67
 	glog.V(4).Infof("Stopping and removing origin container")
68 68
 	if err = helper.StopAndRemoveContainer("origin"); err != nil {
69 69
 		glog.V(1).Infof("Error stopping origin container: %v", err)
... ...
@@ -92,7 +92,8 @@ func (c *ClientStopConfig) Stop(out io.Writer) error {
92 92
 func (c *ClientStopConfig) getDockerClient(out io.Writer) (*docker.Client, error) {
93 93
 	// Get Docker client
94 94
 	if len(c.DockerMachine) > 0 {
95
-		return getDockerMachineClient(c.DockerMachine, out)
95
+		client, _, err := getDockerMachineClient(c.DockerMachine, out)
96
+		return client, err
96 97
 	}
97 98
 	client, _, err := dockerutil.NewHelper().GetClient()
98 99
 	if err != nil {
... ...
@@ -74,7 +74,7 @@ type StartOptions struct {
74 74
 // NewHelper creates a new OpenShift helper
75 75
 func NewHelper(client *docker.Client, hostHelper *host.HostHelper, image, containerName, publicHostname, routingSuffix string) *Helper {
76 76
 	return &Helper{
77
-		dockerHelper:  dockerhelper.NewHelper(client),
77
+		dockerHelper:  dockerhelper.NewHelper(client, nil),
78 78
 		execHelper:    exec.NewExecHelper(client, containerName),
79 79
 		hostHelper:    hostHelper,
80 80
 		runHelper:     run.NewRunHelper(client),
... ...
@@ -6,8 +6,10 @@ import (
6 6
 	"net"
7 7
 	"os"
8 8
 	"path/filepath"
9
+	"runtime"
9 10
 
10 11
 	"github.com/blang/semver"
12
+	dockerclient "github.com/docker/engine-api/client"
11 13
 	docker "github.com/fsouza/go-dockerclient"
12 14
 	"github.com/golang/glog"
13 15
 	"github.com/spf13/cobra"
... ...
@@ -168,6 +170,7 @@ type ClientStartConfig struct {
168 168
 	ServerLogLevel    int
169 169
 
170 170
 	dockerClient    *docker.Client
171
+	engineAPIClient *dockerclient.Client
171 172
 	dockerHelper    *dockerhelper.Helper
172 173
 	hostHelper      *host.HostHelper
173 174
 	openShiftHelper *openshift.Helper
... ...
@@ -307,7 +310,7 @@ func (c *ClientStartConfig) GetDockerClient(out io.Writer) error {
307 307
 
308 308
 	if len(c.DockerMachine) > 0 {
309 309
 		glog.V(2).Infof("Getting client for Docker machine %q", c.DockerMachine)
310
-		c.dockerClient, err = getDockerMachineClient(c.DockerMachine, out)
310
+		c.dockerClient, c.engineAPIClient, err = getDockerMachineClient(c.DockerMachine, out)
311 311
 		if err != nil {
312 312
 			return errors.ErrNoDockerMachineClient(c.DockerMachine, err)
313 313
 		}
... ...
@@ -337,7 +340,18 @@ func (c *ClientStartConfig) GetDockerClient(out io.Writer) error {
337 337
 	if err != nil {
338 338
 		return errors.ErrNoDockerClient(err)
339 339
 	}
340
-
340
+	// FIXME: Workaround for docker engine API client on OS X - sets the default to
341
+	// the wrong DOCKER_HOST string
342
+	if runtime.GOOS == "darwin" {
343
+		dockerHost := os.Getenv("DOCKER_HOST")
344
+		if len(dockerHost) == 0 {
345
+			os.Setenv("DOCKER_HOST", "unix:///var/run/docker.sock")
346
+		}
347
+	}
348
+	c.engineAPIClient, err = dockerclient.NewEnvClient()
349
+	if err != nil {
350
+		return errors.ErrNoDockerClient(err)
351
+	}
341 352
 	if err = c.dockerClient.Ping(); err != nil {
342 353
 		return errors.ErrCannotPingDocker(err)
343 354
 	}
... ...
@@ -615,7 +629,7 @@ func (c *ClientStartConfig) HostHelper() *host.HostHelper {
615 615
 // DockerHelper returns a helper object to work with the Docker client
616 616
 func (c *ClientStartConfig) DockerHelper() *dockerhelper.Helper {
617 617
 	if c.dockerHelper == nil {
618
-		c.dockerHelper = dockerhelper.NewHelper(c.dockerClient)
618
+		c.dockerHelper = dockerhelper.NewHelper(c.dockerClient, c.engineAPIClient)
619 619
 	}
620 620
 	return c.dockerHelper
621 621
 }
... ...
@@ -639,12 +653,12 @@ func (c *ClientStartConfig) openShiftImage() string {
639 639
 	return fmt.Sprintf("%s:%s", c.Image, c.ImageVersion)
640 640
 }
641 641
 
642
-func getDockerMachineClient(machine string, out io.Writer) (*docker.Client, error) {
642
+func getDockerMachineClient(machine string, out io.Writer) (*docker.Client, *dockerclient.Client, error) {
643 643
 	if !dockermachine.IsRunning(machine) {
644 644
 		fmt.Fprintf(out, "Starting Docker machine '%s'\n", machine)
645 645
 		err := dockermachine.Start(machine)
646 646
 		if err != nil {
647
-			return nil, errors.NewError("cannot start Docker machine %q", machine).WithCause(err)
647
+			return nil, nil, errors.NewError("cannot start Docker machine %q", machine).WithCause(err)
648 648
 		}
649 649
 		fmt.Fprintf(out, "Started Docker machine '%s'\n", machine)
650 650
 	}
... ...
@@ -94,7 +94,7 @@ func TestDefaults(t *testing.T) {
94 94
 			Ok: func(out runtime.Object) bool {
95 95
 				obj := out.(*api.BuildConfig)
96 96
 				// conversion drops this trigger because it has no type
97
-				return len(obj.Spec.Triggers) == 0
97
+				return (len(obj.Spec.Triggers) == 0) && (obj.Spec.RunPolicy == api.BuildRunPolicySerial)
98 98
 			},
99 99
 		},
100 100
 	}
... ...
@@ -81,7 +81,12 @@ func (h *Helper) GetDockerAuth(imageName, authType string) (docker.AuthConfigura
81 81
 		return docker.AuthConfiguration{}, false
82 82
 	}
83 83
 	glog.V(3).Infof("Using %s user for Docker authentication for image %s", authConfs[0].Username, imageName)
84
-	return authConfs[0], true
84
+	return docker.AuthConfiguration{
85
+		Username:      authConfs[0].Username,
86
+		Password:      authConfs[0].Password,
87
+		Email:         authConfs[0].Email,
88
+		ServerAddress: authConfs[0].ServerAddress,
89
+	}, true
85 90
 }
86 91
 
87 92
 // GetDockercfgFile returns the path to the dockercfg file
... ...
@@ -302,6 +302,9 @@ func SetOpenShiftDefaults(config *restclient.Config) error {
302 302
 	// if err != nil {
303 303
 	// 	return fmt.Errorf("API group %q is not recognized (valid values: %v)", config.GroupVersion.Group, latest.Versions)
304 304
 	// }
305
+	if config.NegotiatedSerializer == nil {
306
+		config.NegotiatedSerializer = kapi.Codecs
307
+	}
305 308
 
306 309
 	if config.Codec == nil {
307 310
 		config.Codec = kapi.Codecs.LegacyCodec(*config.GroupVersion)
... ...
@@ -137,7 +137,7 @@ func NewCommandCLI(name, fullName string, in io.Reader, out, errout io.Writer) *
137 137
 				cmd.NewCmdLogs(cmd.LogsRecommendedName, fullName, f, out),
138 138
 				cmd.NewCmdRsh(cmd.RshRecommendedName, fullName, f, in, out, errout),
139 139
 				rsync.NewCmdRsync(rsync.RsyncRecommendedName, fullName, f, out, errout),
140
-				cmd.NewCmdPortForward(fullName, f),
140
+				cmd.NewCmdPortForward(fullName, f, out, errout),
141 141
 				cmd.NewCmdDebug(fullName, f, in, out, errout),
142 142
 				cmd.NewCmdExec(fullName, f, in, out, errout),
143 143
 				cmd.NewCmdProxy(fullName, f, out),
... ...
@@ -1,6 +1,8 @@
1 1
 package rsync
2 2
 
3 3
 import (
4
+	"io"
5
+
4 6
 	"k8s.io/kubernetes/pkg/client/restclient"
5 7
 	kclient "k8s.io/kubernetes/pkg/client/unversioned"
6 8
 	"k8s.io/kubernetes/pkg/client/unversioned/portforward"
... ...
@@ -15,6 +17,8 @@ type portForwarder struct {
15 15
 	PodName   string
16 16
 	Client    *kclient.Client
17 17
 	Config    *restclient.Config
18
+	Out       io.Writer
19
+	ErrOut    io.Writer
18 20
 }
19 21
 
20 22
 // ensure that portForwarder implements the forwarder interface
... ...
@@ -33,7 +37,8 @@ func (f *portForwarder) ForwardPorts(ports []string, stopChan <-chan struct{}) e
33 33
 	if err != nil {
34 34
 		return err
35 35
 	}
36
-	fw, err := portforward.New(dialer, ports, stopChan)
36
+	// TODO: Make os.Stdout/Stderr configurable
37
+	fw, err := portforward.New(dialer, ports, stopChan, f.Out, f.ErrOut)
37 38
 	if err != nil {
38 39
 		return err
39 40
 	}
... ...
@@ -64,5 +69,7 @@ func newPortForwarder(f *clientcmd.Factory, o *RsyncOptions) (forwarder, error)
64 64
 		PodName:   o.PodName(),
65 65
 		Client:    client,
66 66
 		Config:    config,
67
+		Out:       o.Out,
68
+		ErrOut:    o.ErrOut,
67 69
 	}, nil
68 70
 }
... ...
@@ -213,8 +213,8 @@ const (
213 213
 )
214 214
 
215 215
 // NewCmdPortForward is a wrapper for the Kubernetes cli port-forward command
216
-func NewCmdPortForward(fullName string, f *clientcmd.Factory) *cobra.Command {
217
-	cmd := kcmd.NewCmdPortForward(f.Factory)
216
+func NewCmdPortForward(fullName string, f *clientcmd.Factory, out, errout io.Writer) *cobra.Command {
217
+	cmd := kcmd.NewCmdPortForward(f.Factory, out, errout)
218 218
 	cmd.Long = portForwardLong
219 219
 	cmd.Example = fmt.Sprintf(portForwardExample, fullName)
220 220
 	return cmd
... ...
@@ -43,6 +43,8 @@ var (
43 43
 	APIGroupExtensions  = "extensions"
44 44
 	APIGroupAutoscaling = "autoscaling"
45 45
 	APIGroupBatch       = "batch"
46
+	APIGroupPolicy      = "policy"
47
+	APIGroupApps        = "apps"
46 48
 
47 49
 	// Map of group names to allowed REST API versions
48 50
 	KubeAPIGroupsToAllowedVersions = map[string][]string{
... ...
@@ -50,6 +52,7 @@ var (
50 50
 		APIGroupExtensions:  {"v1beta1"},
51 51
 		APIGroupAutoscaling: {"v1"},
52 52
 		APIGroupBatch:       {"v1"},
53
+		APIGroupApps:        {"v1alpha1"},
53 54
 	}
54 55
 	// Map of group names to known, but disallowed REST API versions
55 56
 	KubeAPIGroupsToDeadVersions = map[string][]string{
... ...
@@ -57,6 +60,8 @@ var (
57 57
 		APIGroupExtensions:  {},
58 58
 		APIGroupAutoscaling: {},
59 59
 		APIGroupBatch:       {},
60
+		APIGroupPolicy:      {},
61
+		APIGroupApps:        {},
60 62
 	}
61 63
 	KnownKubeAPIGroups = sets.StringKeySet(KubeAPIGroupsToAllowedVersions)
62 64
 
... ...
@@ -10,7 +10,7 @@ import (
10 10
 )
11 11
 
12 12
 func TestKnownAPIGroups(t *testing.T) {
13
-	unexposedGroups := sets.NewString("authorization.k8s.io", "componentconfig", "metrics")
13
+	unexposedGroups := sets.NewString("authorization.k8s.io", "componentconfig", "metrics", "policy")
14 14
 
15 15
 	enabledGroups := sets.NewString()
16 16
 	for _, enabledVersion := range registered.EnabledVersions() {
... ...
@@ -14,7 +14,7 @@ import (
14 14
 	"github.com/golang/glog"
15 15
 
16 16
 	"github.com/coreos/etcd/etcdserver"
17
-	"github.com/coreos/etcd/etcdserver/etcdhttp"
17
+	etcdhttp "github.com/coreos/etcd/etcdserver/api/v2http"
18 18
 	"github.com/coreos/etcd/pkg/osutil"
19 19
 	"github.com/coreos/etcd/pkg/transport"
20 20
 	"github.com/coreos/etcd/pkg/types"
... ...
@@ -61,7 +61,11 @@ func startEtcd(cfg *config) (<-chan struct{}, error) {
61 61
 	plns := make([]net.Listener, 0)
62 62
 	for _, u := range cfg.lpurls {
63 63
 		var l net.Listener
64
-		l, err = transport.NewTimeoutListener(u.Host, u.Scheme, cfg.peerTLSInfo, rafthttp.ConnReadTimeout, rafthttp.ConnWriteTimeout)
64
+		peerTLSConfig, err := cfg.peerTLSInfo.ServerConfig()
65
+		if err != nil {
66
+			return nil, err
67
+		}
68
+		l, err = transport.NewTimeoutListener(u.Host, u.Scheme, peerTLSConfig, rafthttp.ConnReadTimeout, rafthttp.ConnWriteTimeout)
65 69
 		if err != nil {
66 70
 			return nil, err
67 71
 		}
... ...
@@ -86,7 +90,11 @@ func startEtcd(cfg *config) (<-chan struct{}, error) {
86 86
 		if err != nil {
87 87
 			return nil, err
88 88
 		}
89
-		l, err = transport.NewKeepAliveListener(l, u.Scheme, cfg.clientTLSInfo)
89
+		clientTLSConfig, err := cfg.clientTLSInfo.ServerConfig()
90
+		if err != nil {
91
+			return nil, err
92
+		}
93
+		l, err = transport.NewKeepAliveListener(l, u.Scheme, clientTLSConfig)
90 94
 		if err != nil {
91 95
 			return nil, err
92 96
 		}
... ...
@@ -13,6 +13,9 @@ import (
13 13
 	kapi "k8s.io/kubernetes/pkg/api"
14 14
 	"k8s.io/kubernetes/pkg/api/unversioned"
15 15
 	"k8s.io/kubernetes/pkg/api/v1"
16
+	appsv1alpha1 "k8s.io/kubernetes/pkg/apis/apps/v1alpha1"
17
+	autoscalingv1 "k8s.io/kubernetes/pkg/apis/autoscaling/v1"
18
+	batchv1 "k8s.io/kubernetes/pkg/apis/batch/v1"
16 19
 	extv1beta1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
17 20
 	"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
18 21
 	"k8s.io/kubernetes/pkg/client/record"
... ...
@@ -56,10 +59,8 @@ import (
56 56
 )
57 57
 
58 58
 const (
59
-	KubeAPIPrefix                  = "/api"
60
-	KubeAPIPrefixV1                = KubeAPIPrefix + "/v1"
61
-	KubeAPIGroupPrefix             = "/apis"
62
-	KubeAPIExtensionsPrefixV1beta1 = KubeAPIGroupPrefix + "/extensions/v1beta1"
59
+	KubeAPIPrefix      = "/api"
60
+	KubeAPIGroupPrefix = "/apis"
63 61
 )
64 62
 
65 63
 // InstallAPI starts a Kubernetes master and registers the supported REST APIs
... ...
@@ -74,12 +75,21 @@ func (c *MasterConfig) InstallAPI(container *restful.Container) ([]string, error
74 74
 	}
75 75
 
76 76
 	messages := []string{}
77
+	// v1 has to be printed separately since it's served from different endpoint than groups
77 78
 	if configapi.HasKubernetesAPIVersion(c.Options, v1.SchemeGroupVersion) {
78
-		messages = append(messages, fmt.Sprintf("Started Kubernetes API at %%s%s", KubeAPIPrefixV1))
79
+		messages = append(messages, fmt.Sprintf("Started Kubernetes API at %%s%s", KubeAPIPrefix))
79 80
 	}
80 81
 
81
-	if configapi.HasKubernetesAPIVersion(c.Options, extv1beta1.SchemeGroupVersion) {
82
-		messages = append(messages, fmt.Sprintf("Started Kubernetes API Extensions at %%s%s", KubeAPIExtensionsPrefixV1beta1))
82
+	versions := []unversioned.GroupVersion{
83
+		extv1beta1.SchemeGroupVersion,
84
+		batchv1.SchemeGroupVersion,
85
+		autoscalingv1.SchemeGroupVersion,
86
+		appsv1alpha1.SchemeGroupVersion,
87
+	}
88
+	for _, ver := range versions {
89
+		if configapi.HasKubernetesAPIVersion(c.Options, ver) {
90
+			messages = append(messages, fmt.Sprintf("Started Kubernetes API %s at %%s%s", ver.String(), KubeAPIGroupPrefix))
91
+		}
83 92
 	}
84 93
 
85 94
 	return messages, nil
... ...
@@ -93,7 +103,7 @@ func (c *MasterConfig) RunNamespaceController(kubeClient internalclientset.Inter
93 93
 		glog.Fatalf("Failed to get supported resources from server: %v", err)
94 94
 	}
95 95
 	namespaceController := namespacecontroller.NewNamespaceController(kubeClient, clientPool, groupVersionResources, c.ControllerManager.NamespaceSyncPeriod.Duration, kapi.FinalizerKubernetes)
96
-	go namespaceController.Run(c.ControllerManager.ConcurrentNamespaceSyncs, utilwait.NeverStop)
96
+	go namespaceController.Run(int(c.ControllerManager.ConcurrentNamespaceSyncs), utilwait.NeverStop)
97 97
 }
98 98
 
99 99
 // RunPersistentVolumeClaimBinder starts the Kubernetes Persistent Volume Claim Binder
... ...
@@ -143,8 +153,8 @@ func (c *MasterConfig) RunPersistentVolumeClaimRecycler(recyclerImageName string
143 143
 
144 144
 	volumeConfig := c.ControllerManager.VolumeConfiguration
145 145
 	hostPathConfig := volume.VolumeConfig{
146
-		RecyclerMinimumTimeout:   volumeConfig.PersistentVolumeRecyclerConfiguration.MinimumTimeoutHostPath,
147
-		RecyclerTimeoutIncrement: volumeConfig.PersistentVolumeRecyclerConfiguration.IncrementTimeoutHostPath,
146
+		RecyclerMinimumTimeout:   int(volumeConfig.PersistentVolumeRecyclerConfiguration.MinimumTimeoutHostPath),
147
+		RecyclerTimeoutIncrement: int(volumeConfig.PersistentVolumeRecyclerConfiguration.IncrementTimeoutHostPath),
148 148
 		RecyclerPodTemplate:      defaultScrubPod,
149 149
 	}
150 150
 
... ...
@@ -154,8 +164,8 @@ func (c *MasterConfig) RunPersistentVolumeClaimRecycler(recyclerImageName string
154 154
 		}
155 155
 	}
156 156
 	nfsConfig := volume.VolumeConfig{
157
-		RecyclerMinimumTimeout:   volumeConfig.PersistentVolumeRecyclerConfiguration.MinimumTimeoutNFS,
158
-		RecyclerTimeoutIncrement: volumeConfig.PersistentVolumeRecyclerConfiguration.IncrementTimeoutNFS,
157
+		RecyclerMinimumTimeout:   int(volumeConfig.PersistentVolumeRecyclerConfiguration.MinimumTimeoutNFS),
158
+		RecyclerTimeoutIncrement: int(volumeConfig.PersistentVolumeRecyclerConfiguration.IncrementTimeoutNFS),
159 159
 		RecyclerPodTemplate:      defaultScrubPod,
160 160
 	}
161 161
 
... ...
@@ -177,7 +187,7 @@ func (c *MasterConfig) RunPersistentVolumeClaimRecycler(recyclerImageName string
177 177
 	recycler, err := volumeclaimbinder.NewPersistentVolumeRecycler(
178 178
 		clientadapter.FromUnversionedClient(client),
179 179
 		c.ControllerManager.PVClaimBinderSyncPeriod.Duration,
180
-		volumeConfig.PersistentVolumeRecyclerConfiguration.MaximumRetry,
180
+		int(volumeConfig.PersistentVolumeRecyclerConfiguration.MaximumRetry),
181 181
 		allPlugins,
182 182
 		c.CloudProvider,
183 183
 	)
... ...
@@ -208,19 +218,19 @@ func attemptToLoadRecycler(path string, config *volume.VolumeConfig) error {
208 208
 
209 209
 // RunReplicationController starts the Kubernetes replication controller sync loop
210 210
 func (c *MasterConfig) RunReplicationController(client *client.Client) {
211
-	controllerManager := replicationcontroller.NewReplicationManager(
211
+	controllerManager := replicationcontroller.NewReplicationManagerFromClient(
212 212
 		clientadapter.FromUnversionedClient(client),
213 213
 		kctrlmgr.ResyncPeriod(c.ControllerManager),
214 214
 		replicationcontroller.BurstReplicas,
215
-		c.ControllerManager.LookupCacheSizeForRC,
215
+		int(c.ControllerManager.LookupCacheSizeForRC),
216 216
 	)
217
-	go controllerManager.Run(c.ControllerManager.ConcurrentRCSyncs, utilwait.NeverStop)
217
+	go controllerManager.Run(int(c.ControllerManager.ConcurrentRCSyncs), utilwait.NeverStop)
218 218
 }
219 219
 
220 220
 // RunJobController starts the Kubernetes job controller sync loop
221 221
 func (c *MasterConfig) RunJobController(client *client.Client) {
222
-	controller := jobcontroller.NewJobController(clientadapter.FromUnversionedClient(client), kctrlmgr.ResyncPeriod(c.ControllerManager))
223
-	go controller.Run(c.ControllerManager.ConcurrentJobSyncs, utilwait.NeverStop)
222
+	controller := jobcontroller.NewJobControllerFromClient(clientadapter.FromUnversionedClient(client), kctrlmgr.ResyncPeriod(c.ControllerManager))
223
+	go controller.Run(int(c.ControllerManager.ConcurrentJobSyncs), utilwait.NeverStop)
224 224
 }
225 225
 
226 226
 // RunHPAController starts the Kubernetes hpa controller sync loop
... ...
@@ -238,18 +248,18 @@ func (c *MasterConfig) RunHPAController(oc *osclient.Client, kc *client.Client,
238 238
 }
239 239
 
240 240
 func (c *MasterConfig) RunDaemonSetsController(client *client.Client) {
241
-	controller := daemon.NewDaemonSetsController(
241
+	controller := daemon.NewDaemonSetsControllerFromClient(
242 242
 		clientadapter.FromUnversionedClient(client),
243 243
 		kctrlmgr.ResyncPeriod(c.ControllerManager),
244
-		c.ControllerManager.LookupCacheSizeForDaemonSet,
244
+		int(c.ControllerManager.LookupCacheSizeForDaemonSet),
245 245
 	)
246
-	go controller.Run(c.ControllerManager.ConcurrentDaemonSetSyncs, utilwait.NeverStop)
246
+	go controller.Run(int(c.ControllerManager.ConcurrentDaemonSetSyncs), utilwait.NeverStop)
247 247
 }
248 248
 
249 249
 // RunEndpointController starts the Kubernetes replication controller sync loop
250 250
 func (c *MasterConfig) RunEndpointController() {
251
-	endpoints := endpointcontroller.NewEndpointController(clientadapter.FromUnversionedClient(c.KubeClient), kctrlmgr.ResyncPeriod(c.ControllerManager))
252
-	go endpoints.Run(c.ControllerManager.ConcurrentEndpointSyncs, utilwait.NeverStop)
251
+	endpoints := endpointcontroller.NewEndpointControllerFromClient(clientadapter.FromUnversionedClient(c.KubeClient), kctrlmgr.ResyncPeriod(c.ControllerManager))
252
+	go endpoints.Run(int(c.ControllerManager.ConcurrentEndpointSyncs), utilwait.NeverStop)
253 253
 
254 254
 }
255 255
 
... ...
@@ -284,15 +294,15 @@ func (c *MasterConfig) RunResourceQuotaManager() {
284 284
 		ResyncPeriod:              controller.StaticResyncPeriodFunc(c.ControllerManager.ResourceQuotaSyncPeriod.Duration),
285 285
 		Registry:                  resourceQuotaRegistry,
286 286
 		GroupKindsToReplenish:     groupKindsToReplenish,
287
-		ControllerFactory:         kresourcequota.NewReplenishmentControllerFactory(client),
287
+		ControllerFactory:         kresourcequota.NewReplenishmentControllerFactoryFromClient(client),
288 288
 		ReplenishmentResyncPeriod: kctrlmgr.ResyncPeriod(c.ControllerManager),
289 289
 	}
290
-	go kresourcequota.NewResourceQuotaController(resourceQuotaControllerOptions).Run(c.ControllerManager.ConcurrentResourceQuotaSyncs, utilwait.NeverStop)
290
+	go kresourcequota.NewResourceQuotaController(resourceQuotaControllerOptions).Run(int(c.ControllerManager.ConcurrentResourceQuotaSyncs), utilwait.NeverStop)
291 291
 }
292 292
 
293 293
 func (c *MasterConfig) RunGCController(client *client.Client) {
294 294
 	if c.ControllerManager.TerminatedPodGCThreshold > 0 {
295
-		gcController := gccontroller.New(clientadapter.FromUnversionedClient(client), kctrlmgr.ResyncPeriod(c.ControllerManager), c.ControllerManager.TerminatedPodGCThreshold)
295
+		gcController := gccontroller.New(clientadapter.FromUnversionedClient(client), kctrlmgr.ResyncPeriod(c.ControllerManager), int(c.ControllerManager.TerminatedPodGCThreshold))
296 296
 		go gcController.Run(utilwait.NeverStop)
297 297
 	}
298 298
 }
... ...
@@ -309,8 +319,8 @@ func (c *MasterConfig) RunNodeController() {
309 309
 		clientadapter.FromUnversionedClient(c.KubeClient),
310 310
 		s.PodEvictionTimeout.Duration,
311 311
 
312
-		flowcontrol.NewTokenBucketRateLimiter(s.DeletingPodsQps, s.DeletingPodsBurst),
313
-		flowcontrol.NewTokenBucketRateLimiter(s.DeletingPodsQps, s.DeletingPodsBurst), // upstream uses the same ones too
312
+		flowcontrol.NewTokenBucketRateLimiter(s.DeletingPodsQps, int(s.DeletingPodsBurst)),
313
+		flowcontrol.NewTokenBucketRateLimiter(s.DeletingPodsQps, int(s.DeletingPodsBurst)), // upstream uses the same ones too
314 314
 
315 315
 		s.NodeMonitorGracePeriod.Duration,
316 316
 		s.NodeStartupGracePeriod.Duration,
... ...
@@ -340,7 +350,7 @@ func (c *MasterConfig) createSchedulerConfig() (*scheduler.Config, error) {
340 340
 	var configData []byte
341 341
 
342 342
 	// TODO make the rate limiter configurable
343
-	configFactory := factory.NewConfigFactory(c.KubeClient, kapi.DefaultSchedulerName)
343
+	configFactory := factory.NewConfigFactory(c.KubeClient, kapi.DefaultSchedulerName, kapi.DefaultHardPodAffinitySymmetricWeight, kapi.DefaultFailureDomains)
344 344
 	if _, err := os.Stat(c.Options.SchedulerConfigFile); err == nil {
345 345
 		configData, err = ioutil.ReadFile(c.Options.SchedulerConfigFile)
346 346
 		if err != nil {
... ...
@@ -18,6 +18,8 @@ import (
18 18
 	"k8s.io/kubernetes/pkg/admission"
19 19
 	kapi "k8s.io/kubernetes/pkg/api"
20 20
 	"k8s.io/kubernetes/pkg/api/unversioned"
21
+	"k8s.io/kubernetes/pkg/apis/autoscaling"
22
+	"k8s.io/kubernetes/pkg/apis/batch"
21 23
 	"k8s.io/kubernetes/pkg/apis/extensions"
22 24
 	"k8s.io/kubernetes/pkg/apiserver"
23 25
 	kclient "k8s.io/kubernetes/pkg/client/unversioned"
... ...
@@ -29,6 +31,7 @@ import (
29 29
 	"k8s.io/kubernetes/pkg/registry/cachesize"
30 30
 	"k8s.io/kubernetes/pkg/storage"
31 31
 	etcdstorage "k8s.io/kubernetes/pkg/storage/etcd"
32
+	"k8s.io/kubernetes/pkg/storage/storagebackend"
32 33
 	kerrors "k8s.io/kubernetes/pkg/util/errors"
33 34
 	"k8s.io/kubernetes/pkg/util/intstr"
34 35
 	knet "k8s.io/kubernetes/pkg/util/net"
... ...
@@ -39,7 +42,6 @@ import (
39 39
 	"github.com/openshift/origin/pkg/cmd/flagtypes"
40 40
 	oadmission "github.com/openshift/origin/pkg/cmd/server/admission"
41 41
 	configapi "github.com/openshift/origin/pkg/cmd/server/api"
42
-	"github.com/openshift/origin/pkg/cmd/server/etcd"
43 42
 	cmdflags "github.com/openshift/origin/pkg/cmd/util/flags"
44 43
 	"github.com/openshift/origin/pkg/cmd/util/pluginconfig"
45 44
 	overrideapi "github.com/openshift/origin/pkg/quota/admission/clusterresourceoverride/api"
... ...
@@ -47,7 +49,23 @@ import (
47 47
 )
48 48
 
49 49
 // AdmissionPlugins is the full list of admission control plugins to enable in the order they must run
50
-var AdmissionPlugins = []string{"RunOnceDuration", lifecycle.PluginName, "PodNodeConstraints", "OriginPodNodeEnvironment", overrideapi.PluginName, serviceadmit.ExternalIPPluginName, "LimitRanger", "ServiceAccount", "SecurityContextConstraint", "BuildDefaults", "BuildOverrides", "AlwaysPullImages", "ResourceQuota", "SCCExecRestrictions"}
50
+var AdmissionPlugins = []string{
51
+	"RunOnceDuration",
52
+	lifecycle.PluginName,
53
+	"PodNodeConstraints",
54
+	"OriginPodNodeEnvironment",
55
+	overrideapi.PluginName,
56
+	serviceadmit.ExternalIPPluginName,
57
+	"LimitRanger",
58
+	"ServiceAccount",
59
+	"SecurityContextConstraint",
60
+	"BuildDefaults",
61
+	"BuildOverrides",
62
+	"AlwaysPullImages",
63
+	"LimitPodHardAntiAffinityTopology",
64
+	"ResourceQuota",
65
+	"SCCExecRestrictions",
66
+}
51 67
 
52 68
 // MasterConfig defines the required values to start a Kubernetes master
53 69
 type MasterConfig struct {
... ...
@@ -64,12 +82,6 @@ func BuildKubernetesMasterConfig(options configapi.MasterConfig, requestContextM
64 64
 		return nil, errors.New("insufficient information to build KubernetesMasterConfig")
65 65
 	}
66 66
 
67
-	// Connect and setup etcd interfaces
68
-	etcdClient, err := etcd.MakeNewEtcdClient(options.EtcdClientInfo)
69
-	if err != nil {
70
-		return nil, err
71
-	}
72
-
73 67
 	kubeletClientConfig := configapi.GetKubeletClientConfig(options)
74 68
 	kubeletClient, err := kubeletclient.NewStaticKubeletClient(kubeletClientConfig)
75 69
 	if err != nil {
... ...
@@ -205,39 +217,43 @@ func BuildKubernetesMasterConfig(options configapi.MasterConfig, requestContextM
205 205
 		proxyClientCerts = append(proxyClientCerts, clientCert)
206 206
 	}
207 207
 
208
-	// TODO you have to know every APIGroup you're enabling or upstream will panic.  Its alternative to panicing is Fataling
209
-	// It needs a refactor to return errors
210
-	storageDestinations := genericapiserver.NewStorageDestinations()
211
-	// storageVersions is a map from API group to allowed versions that must be a version exposed by the REST API or it breaks.
212
-	// We need to fix the upstream to stop using the storage version as a preferred api version.
213
-	storageVersions := map[string]string{}
214
-
215
-	enabledKubeVersions := configapi.GetEnabledAPIVersionsForGroup(*options.KubernetesMasterConfig, configapi.APIGroupKube)
216
-	if len(enabledKubeVersions) > 0 {
217
-		kubeStorageVersion := unversioned.GroupVersion{Group: configapi.APIGroupKube, Version: options.EtcdStorageConfig.KubernetesStorageVersion}
218
-		databaseStorage, err := NewEtcdStorage(etcdClient, kubeStorageVersion, options.EtcdStorageConfig.KubernetesStoragePrefix)
219
-		if err != nil {
220
-			return nil, fmt.Errorf("Error setting up Kubernetes server storage: %v", err)
221
-		}
222
-		storageDestinations.AddAPIGroup(configapi.APIGroupKube, databaseStorage)
223
-		storageVersions[configapi.APIGroupKube] = options.EtcdStorageConfig.KubernetesStorageVersion
224
-	}
225
-
226
-	// enable this if extensions API is enabled (or batch or autoscaling, since they persist to extensions/v1beta1 for now)
227
-	// TODO: replace this with a loop over configured storage versions
228
-	extensionsEnabled := len(configapi.GetEnabledAPIVersionsForGroup(*options.KubernetesMasterConfig, configapi.APIGroupExtensions)) > 0
229
-	batchEnabled := len(configapi.GetEnabledAPIVersionsForGroup(*options.KubernetesMasterConfig, configapi.APIGroupBatch)) > 0
230
-	autoscalingEnabled := len(configapi.GetEnabledAPIVersionsForGroup(*options.KubernetesMasterConfig, configapi.APIGroupAutoscaling)) > 0
231
-	if extensionsEnabled || autoscalingEnabled || batchEnabled {
232
-		// TODO: replace this with a configured storage version for extensions once configuration exposes this
233
-		extensionsStorageVersion := unversioned.GroupVersion{Group: extensions.GroupName, Version: "v1beta1"}
234
-		databaseStorage, err := NewEtcdStorage(etcdClient, extensionsStorageVersion, options.EtcdStorageConfig.KubernetesStoragePrefix)
235
-		if err != nil {
236
-			return nil, fmt.Errorf("Error setting up Kubernetes extensions server storage: %v", err)
237
-		}
238
-		storageDestinations.AddAPIGroup(configapi.APIGroupExtensions, databaseStorage)
239
-		storageVersions[configapi.APIGroupExtensions] = extensionsStorageVersion.String()
208
+	resourceEncodingConfig := genericapiserver.NewDefaultResourceEncodingConfig()
209
+	resourceEncodingConfig.SetVersionEncoding(
210
+		kapi.GroupName,
211
+		unversioned.GroupVersion{Group: kapi.GroupName, Version: options.EtcdStorageConfig.KubernetesStorageVersion},
212
+		kapi.SchemeGroupVersion,
213
+	)
214
+
215
+	resourceEncodingConfig.SetVersionEncoding(
216
+		extensions.GroupName,
217
+		unversioned.GroupVersion{Group: extensions.GroupName, Version: "v1beta1"},
218
+		extensions.SchemeGroupVersion,
219
+	)
220
+
221
+	resourceEncodingConfig.SetVersionEncoding(
222
+		batch.GroupName,
223
+		unversioned.GroupVersion{Group: batch.GroupName, Version: "v1"},
224
+		batch.SchemeGroupVersion,
225
+	)
226
+
227
+	resourceEncodingConfig.SetVersionEncoding(
228
+		autoscaling.GroupName,
229
+		unversioned.GroupVersion{Group: autoscaling.GroupName, Version: "v1"},
230
+		autoscaling.SchemeGroupVersion,
231
+	)
232
+
233
+	etcdConfig := storagebackend.Config{
234
+		Prefix:     options.EtcdStorageConfig.KubernetesStoragePrefix,
235
+		ServerList: options.EtcdClientInfo.URLs,
236
+		KeyFile:    options.EtcdClientInfo.ClientCert.KeyFile,
237
+		CertFile:   options.EtcdClientInfo.ClientCert.CertFile,
238
+		CAFile:     options.EtcdClientInfo.CA,
239
+		DeserializationCacheSize: genericapiserver.DefaultDeserializationCacheSize,
240 240
 	}
241
+	storageFactory := genericapiserver.NewDefaultStorageFactory(etcdConfig, "", kapi.Codecs, resourceEncodingConfig, master.DefaultAPIResourceConfigSource())
242
+	// the order here is important, it defines which version will be used for storage
243
+	storageFactory.AddCohabitatingResources(extensions.Resource("jobs"), batch.Resource("jobs"))
244
+	storageFactory.AddCohabitatingResources(extensions.Resource("horizontalpodautoscalers"), autoscaling.Resource("horizontalpodautoscalers"))
241 245
 
242 246
 	// Preserve previous behavior of using the first non-loopback address
243 247
 	// TODO: Deprecate this behavior and just require a valid value to be passed in
... ...
@@ -260,8 +276,7 @@ func BuildKubernetesMasterConfig(options configapi.MasterConfig, requestContextM
260 260
 			Authorizer:       apiserver.NewAlwaysAllowAuthorizer(),
261 261
 			AdmissionControl: admissionController,
262 262
 
263
-			StorageDestinations: storageDestinations,
264
-			StorageVersions:     storageVersions,
263
+			StorageFactory: storageFactory,
265 264
 
266 265
 			ServiceClusterIPRange: (*net.IPNet)(&server.ServiceClusterIPRange),
267 266
 			ServiceNodePortRange:  server.ServiceNodePortRange,
... ...
@@ -320,8 +335,8 @@ func BuildKubernetesMasterConfig(options configapi.MasterConfig, requestContextM
320 320
 			kapi.ServicePort{Name: "dns-tcp", Port: 53, Protocol: kapi.ProtocolTCP, TargetPort: intstr.FromInt(dnsPort)},
321 321
 		)
322 322
 		m.ExtraEndpointPorts = append(m.ExtraEndpointPorts,
323
-			kapi.EndpointPort{Name: "dns", Port: dnsPort, Protocol: kapi.ProtocolUDP},
324
-			kapi.EndpointPort{Name: "dns-tcp", Port: dnsPort, Protocol: kapi.ProtocolTCP},
323
+			kapi.EndpointPort{Name: "dns", Port: int32(dnsPort), Protocol: kapi.ProtocolUDP},
324
+			kapi.EndpointPort{Name: "dns-tcp", Port: int32(dnsPort), Protocol: kapi.ProtocolTCP},
325 325
 		)
326 326
 	}
327 327
 
... ...
@@ -360,5 +375,6 @@ func getAPIResourceConfig(options configapi.MasterConfig) genericapiserver.APIRe
360 360
 
361 361
 // NewEtcdStorage returns a storage interface for the provided storage version.
362 362
 func NewEtcdStorage(client newetcdclient.Client, version unversioned.GroupVersion, prefix string) (helper storage.Interface, err error) {
363
-	return etcdstorage.NewEtcdStorage(client, kapi.Codecs.LegacyCodec(version), prefix, false), nil
363
+	// TODO: Make the cacheSize(200) configurable
364
+	return etcdstorage.NewEtcdStorage(client, kapi.Codecs.LegacyCodec(version), prefix, false, 200), nil
364 365
 }
... ...
@@ -15,7 +15,7 @@ import (
15 15
 	extensionsapiv1beta1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
16 16
 	"k8s.io/kubernetes/pkg/genericapiserver"
17 17
 	kubeletclient "k8s.io/kubernetes/pkg/kubelet/client"
18
-	etcdstorage "k8s.io/kubernetes/pkg/storage/etcd"
18
+	"k8s.io/kubernetes/pkg/storage/storagebackend"
19 19
 	utilconfig "k8s.io/kubernetes/pkg/util/config"
20 20
 	"k8s.io/kubernetes/pkg/util/diff"
21 21
 
... ...
@@ -30,32 +30,34 @@ func TestAPIServerDefaults(t *testing.T) {
30 30
 	// Once we've reacted to the changes appropriately in BuildKubernetesMasterConfig(), update this expected default to match the new upstream defaults
31 31
 	expectedDefaults := &apiserveroptions.APIServer{
32 32
 		ServerRunOptions: &genericapiserver.ServerRunOptions{
33
-			BindAddress:          net.ParseIP("0.0.0.0"),
34
-			CertDirectory:        "/var/run/kubernetes",
35
-			InsecureBindAddress:  net.ParseIP("127.0.0.1"),
36
-			InsecurePort:         8080,
37
-			LongRunningRequestRE: "(/|^)((watch|proxy)(/|$)|(logs?|portforward|exec|attach)/?$)",
38
-			MaxRequestsInFlight:  400,
39
-			SecurePort:           6443,
33
+			BindAddress:            net.ParseIP("0.0.0.0"),
34
+			CertDirectory:          "/var/run/kubernetes",
35
+			InsecureBindAddress:    net.ParseIP("127.0.0.1"),
36
+			InsecurePort:           8080,
37
+			LongRunningRequestRE:   "(/|^)((watch|proxy)(/|$)|(logs?|portforward|exec|attach)/?$)",
38
+			MaxRequestsInFlight:    400,
39
+			SecurePort:             6443,
40
+			APIGroupPrefix:         "/apis",
41
+			APIPrefix:              "/api",
42
+			EnableLogsSupport:      true,
43
+			EnableProfiling:        true,
44
+			EnableWatchCache:       true,
45
+			MinRequestTimeout:      1800,
46
+			RuntimeConfig:          utilconfig.ConfigurationMap{},
47
+			StorageVersions:        registered.AllPreferredGroupVersions(),
48
+			MasterCount:            1,
49
+			DefaultStorageVersions: registered.AllPreferredGroupVersions(),
50
+			StorageConfig: storagebackend.Config{
51
+				Prefix: "/registry",
52
+				DeserializationCacheSize: genericapiserver.DefaultDeserializationCacheSize,
53
+			},
40 54
 		},
41
-		APIGroupPrefix:          "/apis",
42
-		APIPrefix:               "/api",
55
+		DefaultStorageMediaType: "application/json",
43 56
 		AdmissionControl:        "AlwaysAdmit",
44 57
 		AuthorizationMode:       "AlwaysAllow",
45 58
 		DeleteCollectionWorkers: 1,
46
-		EnableLogsSupport:       true,
47
-		EnableProfiling:         true,
48
-		EnableWatchCache:        true,
49
-		EtcdConfig: etcdstorage.EtcdConfig{
50
-			Prefix: "/registry",
51
-		},
52
-		EventTTL:               1 * time.Hour,
53
-		MasterCount:            1,
54
-		MasterServiceNamespace: "default",
55
-		MinRequestTimeout:      1800,
56
-		RuntimeConfig:          utilconfig.ConfigurationMap{},
57
-		StorageVersions:        registered.AllPreferredGroupVersions(),
58
-		DefaultStorageVersions: registered.AllPreferredGroupVersions(),
59
+		EventTTL:                1 * time.Hour,
60
+		MasterServiceNamespace:  "default",
59 61
 		KubeletConfig: kubeletclient.KubeletClientConfig{
60 62
 			Port:        10250,
61 63
 			EnableHttps: true,
... ...
@@ -116,6 +118,7 @@ func TestCMServerDefaults(t *testing.T) {
116 116
 					IncrementTimeoutHostPath: 30,
117 117
 				},
118 118
 			},
119
+			ContentType:  "",
119 120
 			KubeAPIQPS:   20.0,
120 121
 			KubeAPIBurst: 30,
121 122
 			LeaderElection: componentconfig.LeaderElectionConfiguration{
... ...
@@ -10,6 +10,7 @@ import (
10 10
 	"path/filepath"
11 11
 	"time"
12 12
 
13
+	dockertypes "github.com/docker/engine-api/types"
13 14
 	dockerclient "github.com/fsouza/go-dockerclient"
14 15
 	"github.com/golang/glog"
15 16
 
... ...
@@ -106,7 +107,7 @@ func sameFileStat(requireMode bool, src, dst string) bool {
106 106
 // EnsureDocker attempts to connect to the Docker daemon defined by the helper,
107 107
 // and if it is unable to it will print a warning.
108 108
 func (c *NodeConfig) EnsureDocker(docker *dockerutil.Helper) {
109
-	dockerClient, dockerAddr, err := docker.GetClient()
109
+	dockerClient, dockerAddr, err := docker.GetKubeClient()
110 110
 	if err != nil {
111 111
 		c.HandleDockerError(fmt.Sprintf("Unable to create a Docker client for %s - Docker must be installed and running to start containers.\n%v", dockerAddr, err))
112 112
 		return
... ...
@@ -132,16 +133,15 @@ func (c *NodeConfig) EnsureDocker(docker *dockerutil.Helper) {
132 132
 
133 133
 	glog.Infof("Connecting to Docker at %s", dockerAddr)
134 134
 
135
-	env, err := dockerClient.Version()
135
+	version, err := dockerClient.Version()
136 136
 	if err != nil {
137 137
 		c.HandleDockerError(fmt.Sprintf("Unable to check for Docker server version.\n%v", err))
138 138
 		return
139 139
 	}
140 140
 
141
-	serverVersionString := env.Get("ApiVersion")
142
-	serverVersion, err := dockerclient.NewAPIVersion(serverVersionString)
141
+	serverVersion, err := dockerclient.NewAPIVersion(version.APIVersion)
143 142
 	if err != nil {
144
-		c.HandleDockerError(fmt.Sprintf("Unable to determine Docker server version from %q.\n%v", serverVersionString, err))
143
+		c.HandleDockerError(fmt.Sprintf("Unable to determine Docker server version from %q.\n%v", version.APIVersion, err))
145 144
 		return
146 145
 	}
147 146
 
... ...
@@ -165,7 +165,7 @@ func (c *NodeConfig) HandleDockerError(message string) {
165 165
 		glog.Fatalf("error: %s", message)
166 166
 	}
167 167
 	glog.Errorf("WARNING: %s", message)
168
-	c.DockerClient = &dockertools.FakeDockerClient{VersionInfo: dockerclient.Env([]string{"ApiVersion=1.18"})}
168
+	c.DockerClient = &dockertools.FakeDockerClient{VersionInfo: dockertypes.Version{APIVersion: "1.18"}}
169 169
 }
170 170
 
171 171
 // EnsureVolumeDir attempts to convert the provided volume directory argument to
... ...
@@ -378,7 +378,7 @@ func (c *NodeConfig) RunProxy() {
378 378
 			// IPTablesMasqueradeBit must be specified or defaulted.
379 379
 			glog.Fatalf("Unable to read IPTablesMasqueradeBit from config")
380 380
 		}
381
-		proxierIptables, err := iptables.NewProxier(iptInterface, execer, c.ProxyConfig.IPTablesSyncPeriod.Duration, c.ProxyConfig.MasqueradeAll, *c.ProxyConfig.IPTablesMasqueradeBit)
381
+		proxierIptables, err := iptables.NewProxier(iptInterface, execer, c.ProxyConfig.IPTablesSyncPeriod.Duration, c.ProxyConfig.MasqueradeAll, int(*c.ProxyConfig.IPTablesMasqueradeBit), c.ProxyConfig.ClusterCIDR)
382 382
 		if err != nil {
383 383
 			if c.Containerized {
384 384
 				glog.Fatalf("error: Could not initialize Kubernetes Proxy: %v\n When running in a container, you must run the container in the host network namespace with --net=host and with --privileged", err)
... ...
@@ -117,6 +117,7 @@ func TestProxyConfig(t *testing.T) {
117 117
 	expectedDefaultConfig := &proxyoptions.ProxyServerConfig{
118 118
 		KubeProxyConfiguration: componentconfig.KubeProxyConfiguration{
119 119
 			BindAddress:        "0.0.0.0",
120
+			ClusterCIDR:        "",
120 121
 			HealthzPort:        10249,         // disabled
121 122
 			HealthzBindAddress: "127.0.0.1",   // disabled
122 123
 			OOMScoreAdj:        &oomScoreAdj,  // disabled
... ...
@@ -19,6 +19,7 @@ import (
19 19
 	kclient "k8s.io/kubernetes/pkg/client/unversioned"
20 20
 	clientadapter "k8s.io/kubernetes/pkg/client/unversioned/adapters/internalclientset"
21 21
 	sacontroller "k8s.io/kubernetes/pkg/controller/serviceaccount"
22
+	"k8s.io/kubernetes/pkg/genericapiserver"
22 23
 	kubeletclient "k8s.io/kubernetes/pkg/kubelet/client"
23 24
 	"k8s.io/kubernetes/pkg/serviceaccount"
24 25
 	"k8s.io/kubernetes/pkg/storage"
... ...
@@ -329,7 +330,7 @@ func newServiceAccountTokenGetter(options configapi.MasterConfig, client newetcd
329 329
 	} else {
330 330
 		// When we're running in-process, go straight to etcd (using the KubernetesStorageVersion/KubernetesStoragePrefix, since service accounts are kubernetes objects)
331 331
 		codec := kapi.Codecs.LegacyCodec(unversioned.GroupVersion{Group: kapi.GroupName, Version: options.EtcdStorageConfig.KubernetesStorageVersion})
332
-		ketcdHelper := etcdstorage.NewEtcdStorage(client, codec, options.EtcdStorageConfig.KubernetesStoragePrefix, false, restoptions.DefaultCacheSize)
332
+		ketcdHelper := etcdstorage.NewEtcdStorage(client, codec, options.EtcdStorageConfig.KubernetesStoragePrefix, false, genericapiserver.DefaultDeserializationCacheSize)
333 333
 		tokenGetter = sacontroller.NewGetterFromStorageInterface(ketcdHelper)
334 334
 	}
335 335
 	return tokenGetter, nil
... ...
@@ -642,7 +643,7 @@ func (c *MasterConfig) OriginNamespaceControllerClients() (*osclient.Client, *kc
642 642
 
643 643
 // NewEtcdStorage returns a storage interface for the provided storage version.
644 644
 func NewEtcdStorage(client newetcdclient.Client, version unversioned.GroupVersion, prefix string) (oshelper storage.Interface, err error) {
645
-	return etcdstorage.NewEtcdStorage(client, kapi.Codecs.LegacyCodec(version), prefix, false, restoptions.DefaultCacheSize), nil
645
+	return etcdstorage.NewEtcdStorage(client, kapi.Codecs.LegacyCodec(version), prefix, false, genericapiserver.DefaultDeserializationCacheSize), nil
646 646
 }
647 647
 
648 648
 // GetServiceAccountClients returns an OpenShift and Kubernetes client with the credentials of the
... ...
@@ -8,6 +8,7 @@ import (
8 8
 	"k8s.io/kubernetes/pkg/api"
9 9
 	"k8s.io/kubernetes/pkg/api/rest"
10 10
 	extapi "k8s.io/kubernetes/pkg/apis/extensions"
11
+	"k8s.io/kubernetes/pkg/genericapiserver"
11 12
 	kubeletclient "k8s.io/kubernetes/pkg/kubelet/client"
12 13
 	etcdstorage "k8s.io/kubernetes/pkg/storage/etcd"
13 14
 	"k8s.io/kubernetes/pkg/util/sets"
... ...
@@ -83,7 +84,7 @@ func TestAllOpenShiftResourceCoverage(t *testing.T) {
83 83
 
84 84
 // fakeMasterConfig creates a new fake master config with an empty kubelet config and dummy storage.
85 85
 func fakeMasterConfig() *MasterConfig {
86
-	etcdHelper := etcdstorage.NewEtcdStorage(nil, api.Codecs.LegacyCodec(), "", false, restoptions.DefaultCacheSize)
86
+	etcdHelper := etcdstorage.NewEtcdStorage(nil, api.Codecs.LegacyCodec(), "", false, genericapiserver.DefaultDeserializationCacheSize)
87 87
 
88 88
 	return &MasterConfig{
89 89
 		KubeletClientConfig: &kubeletclient.KubeletClientConfig{},
... ...
@@ -8,8 +8,10 @@ import (
8 8
 	fuzz "github.com/google/gofuzz"
9 9
 
10 10
 	"k8s.io/kubernetes/pkg/client/restclient"
11
+	"k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api"
11 12
 	"k8s.io/kubernetes/pkg/runtime"
12 13
 	"k8s.io/kubernetes/pkg/util/diff"
14
+	"k8s.io/kubernetes/pkg/util/flowcontrol"
13 15
 )
14 16
 
15 17
 func TestAnonymousConfig(t *testing.T) {
... ...
@@ -18,6 +20,12 @@ func TestAnonymousConfig(t *testing.T) {
18 18
 		func(r *runtime.Codec, f fuzz.Continue) {},
19 19
 		func(r *http.RoundTripper, f fuzz.Continue) {},
20 20
 		func(fn *func(http.RoundTripper) http.RoundTripper, f fuzz.Continue) {},
21
+		func(r *restclient.AuthProviderConfigPersister, f fuzz.Continue) {},
22
+		func(r *runtime.NegotiatedSerializer, f fuzz.Continue) {},
23
+		func(r *flowcontrol.RateLimiter, f fuzz.Continue) {},
24
+		func(r *api.AuthProviderConfig, f fuzz.Continue) {
25
+			r.Config = map[string]string{}
26
+		},
21 27
 	)
22 28
 	for i := 0; i < 20; i++ {
23 29
 		original := &restclient.Config{}
... ...
@@ -31,6 +39,8 @@ func TestAnonymousConfig(t *testing.T) {
31 31
 		expected.BearerToken = ""
32 32
 		expected.Username = ""
33 33
 		expected.Password = ""
34
+		expected.AuthProvider = nil
35
+		expected.AuthConfigPersister = nil
34 36
 		expected.TLSClientConfig.CertData = nil
35 37
 		expected.TLSClientConfig.CertFile = ""
36 38
 		expected.TLSClientConfig.KeyData = nil
... ...
@@ -564,7 +564,7 @@ func (w *Factory) ApproximatePodTemplateForObject(object runtime.Object) (*api.P
564 564
 			return &t.Spec.Template, err
565 565
 		case *extensions.DaemonSet:
566 566
 			return &t.Spec.Template, err
567
-		case *extensions.Job:
567
+		case *batch.Job:
568 568
 			return &t.Spec.Template, err
569 569
 		}
570 570
 		return nil, err
... ...
@@ -643,7 +643,7 @@ func (f *Factory) PodForResource(resource string, timeout time.Duration) (string
643 643
 	}
644 644
 }
645 645
 
646
-func podNameForJob(job *extensions.Job, kc *kclient.Client, timeout time.Duration, sortBy func(pods []*api.Pod) sort.Interface) (string, error) {
646
+func podNameForJob(job *batch.Job, kc *kclient.Client, timeout time.Duration, sortBy func(pods []*api.Pod) sort.Interface) (string, error) {
647 647
 	selector, err := unversioned.LabelSelectorAsSelector(job.Spec.Selector)
648 648
 	if err != nil {
649 649
 		return "", err
... ...
@@ -3,6 +3,8 @@ package docker
3 3
 import (
4 4
 	"os"
5 5
 
6
+	"k8s.io/kubernetes/pkg/kubelet/dockertools"
7
+
6 8
 	docker "github.com/fsouza/go-dockerclient"
7 9
 	"github.com/golang/glog"
8 10
 	"github.com/spf13/pflag"
... ...
@@ -36,6 +38,19 @@ func (_ *Helper) GetClient() (client *docker.Client, endpoint string, err error)
36 36
 	return
37 37
 }
38 38
 
39
+// GetKubeClient returns the Kubernetes Docker client.
40
+func (_ *Helper) GetKubeClient() (*KubeDocker, string, error) {
41
+	var endpoint string
42
+	if len(os.Getenv("DOCKER_HOST")) > 0 {
43
+		endpoint = os.Getenv("DOCKER_HOST")
44
+	} else {
45
+		endpoint = "unix:///var/run/docker.sock"
46
+	}
47
+	client := dockertools.ConnectToDockerOrDie(endpoint)
48
+	originClient := &KubeDocker{client}
49
+	return originClient, endpoint, nil
50
+}
51
+
39 52
 // GetClientOrExit returns a valid Docker client and the address of the client,
40 53
 // or prints an error and exits.
41 54
 func (h *Helper) GetClientOrExit() (*docker.Client, string) {
... ...
@@ -45,3 +60,18 @@ func (h *Helper) GetClientOrExit() (*docker.Client, string) {
45 45
 	}
46 46
 	return client, addr
47 47
 }
48
+
49
+// KubeDocker provides a wrapper to Kubernetes Docker interface
50
+// This wrapper is compatible with OpenShift Docker interface.
51
+type KubeDocker struct {
52
+	dockertools.DockerInterface
53
+}
54
+
55
+// Ping implements the DockerInterface Ping method.
56
+func (c *KubeDocker) Ping() error {
57
+	client, err := docker.NewClientFromEnv()
58
+	if err != nil {
59
+		return err
60
+	}
61
+	return client.Ping()
62
+}
... ...
@@ -143,7 +143,10 @@ func TestDefaults(t *testing.T) {
143 143
 								{
144 144
 									Name: "test",
145 145
 									TerminationMessagePath: "/dev/termination-log",
146
-									ImagePullPolicy:        kapiv1.PullAlways,
146
+									// The pull policy will be "PullAlways" only when the
147
+									// image tag is 'latest'. In other case it will be
148
+									// "PullIfNotPresent".
149
+									ImagePullPolicy: kapiv1.PullIfNotPresent,
147 150
 								},
148 151
 							},
149 152
 						},
... ...
@@ -3,7 +3,6 @@ package deploymentconfig
3 3
 import (
4 4
 	"sort"
5 5
 	"strconv"
6
-	"strings"
7 6
 	"testing"
8 7
 
9 8
 	kapi "k8s.io/kubernetes/pkg/api"
... ...
@@ -678,7 +677,8 @@ func TestHandleScenarios(t *testing.T) {
678 678
 
679 679
 		if e, a := test.expectedReplicas, config.Spec.Replicas; e != a {
680 680
 			t.Errorf("expected config replicas to be %d, got %d", e, a)
681
-			t.Fatalf("events:\n%s", strings.Join(recorder.Events, "\t\n"))
681
+			// TODO: Disable as the recorder.Events is now `chan string`
682
+			//t.Fatalf("events:\n%s", strings.Join(recorder.Events, "\t\n"))
682 683
 		}
683 684
 		anyDeploymentMismatches := false
684 685
 		for i := 0; i < len(expectedDeployments); i++ {
... ...
@@ -689,7 +689,9 @@ func TestHandleScenarios(t *testing.T) {
689 689
 			}
690 690
 		}
691 691
 		if anyDeploymentMismatches {
692
-			t.Fatalf("events:\n%s", strings.Join(recorder.Events, "\t\n"))
692
+			// TODO: Disable as the recorder.Events is now `chan string`
693
+			//t.Fatalf("events:\n%s", strings.Join(recorder.Events, "\t\n"))
694
+			t.Fatalf("deployment mismatches detected")
693 695
 		}
694 696
 	}
695 697
 }
... ...
@@ -6,9 +6,8 @@ import (
6 6
 	"reflect"
7 7
 	"testing"
8 8
 
9
-	docker "github.com/fsouza/go-dockerclient"
10
-
11 9
 	kapi "k8s.io/kubernetes/pkg/api"
10
+	"k8s.io/kubernetes/pkg/credentialprovider"
12 11
 	"k8s.io/kubernetes/pkg/runtime"
13 12
 
14 13
 	_ "github.com/openshift/origin/pkg/api/install"
... ...
@@ -34,7 +33,7 @@ type mockKeyring struct {
34 34
 	calls []string
35 35
 }
36 36
 
37
-func (k *mockKeyring) Lookup(image string) ([]docker.AuthConfiguration, bool) {
37
+func (k *mockKeyring) Lookup(image string) ([]credentialprovider.LazyAuthConfiguration, bool) {
38 38
 	k.calls = append(k.calls, image)
39 39
 	return nil, false
40 40
 }
... ...
@@ -11,6 +11,7 @@ import (
11 11
 	"k8s.io/kubernetes/pkg/client/cache"
12 12
 	clientsetfake "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
13 13
 	"k8s.io/kubernetes/pkg/client/unversioned/testclient"
14
+	"k8s.io/kubernetes/pkg/genericapiserver"
14 15
 	kubeletclient "k8s.io/kubernetes/pkg/kubelet/client"
15 16
 	"k8s.io/kubernetes/pkg/runtime"
16 17
 	etcdstorage "k8s.io/kubernetes/pkg/storage/etcd"
... ...
@@ -160,7 +161,7 @@ func TestAdmissionLifecycle(t *testing.T) {
160 160
 
161 161
 // TestCreatesAllowedDuringNamespaceDeletion checks to make sure that the resources in the whitelist are allowed
162 162
 func TestCreatesAllowedDuringNamespaceDeletion(t *testing.T) {
163
-	etcdHelper := etcdstorage.NewEtcdStorage(nil, kapi.Codecs.LegacyCodec(), "", false, restoptions.DefaultCacheSize)
163
+	etcdHelper := etcdstorage.NewEtcdStorage(nil, kapi.Codecs.LegacyCodec(), "", false, genericapiserver.DefaultDeserializationCacheSize)
164 164
 
165 165
 	config := &origin.MasterConfig{
166 166
 		KubeletClientConfig: &kubeletclient.KubeletClientConfig{},
... ...
@@ -5,6 +5,7 @@ import (
5 5
 
6 6
 	kapi "k8s.io/kubernetes/pkg/api"
7 7
 	"k8s.io/kubernetes/pkg/api/unversioned"
8
+	"k8s.io/kubernetes/pkg/client/testing/core"
8 9
 	ktestclient "k8s.io/kubernetes/pkg/client/unversioned/testclient"
9 10
 
10 11
 	"github.com/openshift/origin/pkg/client/testclient"
... ...
@@ -52,16 +53,17 @@ func TestSyncNamespaceThatIsTerminating(t *testing.T) {
52 52
 		ktestclient.NewListAction("namespace", "", kapi.ListOptions{}),
53 53
 		ktestclient.NewListAction("deploymentconfig", "", kapi.ListOptions{}),
54 54
 	}
55
-	actionSet := []ktestclient.Action{}
55
+	kubeActionSet := []core.Action{}
56
+	originActionSet := []ktestclient.Action{}
56 57
 	for i := range mockKubeClient.Actions() {
57
-		actionSet = append(actionSet, mockKubeClient.Actions()[i])
58
+		kubeActionSet = append(kubeActionSet, mockKubeClient.Actions()[i])
58 59
 	}
59 60
 	for i := range mockOriginClient.Actions() {
60
-		actionSet = append(actionSet, mockOriginClient.Actions()[i])
61
+		originActionSet = append(originActionSet, mockOriginClient.Actions()[i])
61 62
 	}
62 63
 
63
-	if len(actionSet) != len(expectedActionSet) {
64
-		t.Errorf("Expected actions: %v, but got: %v", expectedActionSet, actionSet)
64
+	if (len(kubeActionSet) + len(originActionSet)) != len(expectedActionSet) {
65
+		t.Errorf("Expected actions: %v, but got: %v and %v", expectedActionSet, originActionSet, kubeActionSet)
65 66
 	}
66 67
 }
67 68
 
... ...
@@ -88,15 +90,16 @@ func TestSyncNamespaceThatIsActive(t *testing.T) {
88 88
 	if err != nil {
89 89
 		t.Errorf("Unexpected error when handling namespace %v", err)
90 90
 	}
91
-	actionSet := []ktestclient.Action{}
91
+	kubeActionSet := []core.Action{}
92
+	originActionSet := []ktestclient.Action{}
92 93
 	for i := range mockKubeClient.Actions() {
93
-		actionSet = append(actionSet, mockKubeClient.Actions()[i])
94
+		kubeActionSet = append(kubeActionSet, mockKubeClient.Actions()[i])
94 95
 	}
95 96
 	for i := range mockOriginClient.Actions() {
96
-		actionSet = append(actionSet, mockOriginClient.Actions()[i])
97
+		originActionSet = append(originActionSet, mockOriginClient.Actions()[i])
97 98
 	}
98 99
 
99
-	if len(actionSet) != 0 {
100
-		t.Errorf("Expected no action from controller, but got: %v", actionSet)
100
+	if (len(kubeActionSet) + len(originActionSet)) != 0 {
101
+		t.Errorf("Expected no actions from contoller, but got: %#v and %#v", originActionSet, kubeActionSet)
101 102
 	}
102 103
 }
... ...
@@ -53,7 +53,8 @@ func (a *originQuotaAdmission) Admit(as admission.Attributes) error {
53 53
 }
54 54
 
55 55
 func (a *originQuotaAdmission) SetOriginQuotaRegistry(registry kquota.Registry) {
56
-	quotaAdmission, err := resourcequota.NewResourceQuota(a.kClient, registry)
56
+	// TODO: Make the number of evaluators configurable?
57
+	quotaAdmission, err := resourcequota.NewResourceQuota(a.kClient, registry, 5)
57 58
 	if err != nil {
58 59
 		glog.Fatalf("failed to initialize %s plugin: %v", PluginName, err)
59 60
 	}
... ...
@@ -30,7 +30,7 @@ func NewReplenishmentControllerFactory(osClient osclient.Interface) kresourcequo
30 30
 	}
31 31
 }
32 32
 
33
-func (r *replenishmentControllerFactory) NewController(options *kresourcequota.ReplenishmentControllerOptions) (*framework.Controller, error) {
33
+func (r *replenishmentControllerFactory) NewController(options *kresourcequota.ReplenishmentControllerOptions) (framework.ControllerInterface, error) {
34 34
 	switch options.GroupKind {
35 35
 	case imageapi.Kind("ImageStream"):
36 36
 		_, result := framework.NewInformer(
... ...
@@ -11,6 +11,7 @@ import (
11 11
 	kapi "k8s.io/kubernetes/pkg/api"
12 12
 	kapierrors "k8s.io/kubernetes/pkg/api/errors"
13 13
 	"k8s.io/kubernetes/pkg/api/unversioned"
14
+	"k8s.io/kubernetes/pkg/apis/apps"
14 15
 	"k8s.io/kubernetes/pkg/apis/batch"
15 16
 	"k8s.io/kubernetes/pkg/apis/extensions"
16 17
 	clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
... ...
@@ -71,6 +72,7 @@ var resourcesToCheck = map[unversioned.GroupResource]unversioned.GroupKind{
71 71
 	extensions.Resource("deployments"):                          extensions.Kind("Deployment"),
72 72
 	extensions.Resource("replicasets"):                          extensions.Kind("ReplicaSet"),
73 73
 	extensions.Resource("jobs"):                                 extensions.Kind("Job"),
74
+	apps.Resource("petsets"):                                    apps.Kind("PetSet"),
74 75
 	deployapi.Resource("deploymentconfigs"):                     deployapi.Kind("DeploymentConfig"),
75 76
 	securityapi.Resource("podsecuritypolicysubjectreviews"):     securityapi.Kind("PodSecurityPolicySubjectReview"),
76 77
 	securityapi.Resource("podsecuritypolicyselfsubjectreviews"): securityapi.Kind("PodSecurityPolicySelfSubjectReview"),
... ...
@@ -153,7 +155,7 @@ func (o *podNodeConstraints) getPodSpec(attr admission.Attributes) (kapi.PodSpec
153 153
 		return r.Spec.Template.Spec, nil
154 154
 	case *extensions.ReplicaSet:
155 155
 		return r.Spec.Template.Spec, nil
156
-	case *extensions.Job:
156
+	case *batch.Job:
157 157
 		return r.Spec.Template.Spec, nil
158 158
 	case *deployapi.DeploymentConfig:
159 159
 		return r.Spec.Template.Spec, nil
... ...
@@ -373,7 +373,7 @@ func replicaSet(setNodeSelector bool) runtime.Object {
373 373
 }
374 374
 
375 375
 func job(setNodeSelector bool) runtime.Object {
376
-	j := &extensions.Job{}
376
+	j := &batch.Job{}
377 377
 	j.Spec.Template = *podTemplateSpec(setNodeSelector)
378 378
 	return j
379 379
 }
380 380
new file mode 100644
... ...
@@ -0,0 +1,3 @@
0
+// Package v1 is the v1 version of the API.
1
+// +genconversion=true
2
+package v1
... ...
@@ -61,7 +61,8 @@ func (p *Processor) Process(template *api.Template) field.ErrorList {
61 61
 		//a different namespace.
62 62
 		stripNamespace(newItem)
63 63
 		if err := util.AddObjectLabels(newItem, template.ObjectLabels); err != nil {
64
-			templateErrors = append(templateErrors, field.Invalid(idxPath.Child("labels"), err, "label could not be applied"))
64
+			templateErrors = append(templateErrors, field.Invalid(idxPath.Child("labels"),
65
+				template.ObjectLabels, fmt.Sprintf("label could not be applied: %v", err)))
65 66
 		}
66 67
 		template.Objects[i] = newItem
67 68
 	}
... ...
@@ -71,7 +72,7 @@ func (p *Processor) Process(template *api.Template) field.ErrorList {
71 71
 
72 72
 func stripNamespace(obj runtime.Object) {
73 73
 	// Remove namespace from the item
74
-	if itemMeta, err := meta.Accessor(obj); err == nil {
74
+	if itemMeta, err := meta.Accessor(obj); err == nil && len(itemMeta.GetNamespace()) > 0 {
75 75
 		itemMeta.SetNamespace("")
76 76
 		return
77 77
 	}
... ...
@@ -270,31 +270,6 @@ func TestEvaluateLabels(t *testing.T) {
270 270
 			}`,
271 271
 			Labels: map[string]string{"key3": "v3"},
272 272
 		},
273
-		"when the root object has labels and no metadata": {
274
-			Input: `{
275
-				"kind":"Template", "apiVersion":"v1",
276
-				"objects": [
277
-					{
278
-						"kind": "Service", "apiVersion": "v1beta3",
279
-						"labels": {
280
-							"key1": "v1",
281
-							"key2": "v2"
282
-						}
283
-					}
284
-				]
285
-			}`,
286
-			Output: `{
287
-				"kind":"Template","apiVersion":"v1beta3","metadata":{"creationTimestamp":null},
288
-				"objects":[
289
-					{
290
-						"apiVersion":"v1beta3","kind":"Service",
291
-						"labels":{"key1":"v1","key2":"v2","key3":"v3"}
292
-					}
293
-				],
294
-				"labels":{"key3":"v3"}
295
-			}`,
296
-			Labels: map[string]string{"key3": "v3"},
297
-		},
298 273
 		"when the root object has labels and metadata": {
299 274
 			Input: `{
300 275
 				"kind":"Template", "apiVersion":"v1",
... ...
@@ -11,6 +11,8 @@ import (
11 11
 	"runtime"
12 12
 	"strings"
13 13
 
14
+	"k8s.io/kubernetes/pkg/credentialprovider"
15
+
14 16
 	"github.com/docker/docker/builder/parser"
15 17
 	docker "github.com/fsouza/go-dockerclient"
16 18
 	"github.com/fsouza/go-dockerclient/external/github.com/docker/docker/pkg/archive"
... ...
@@ -52,7 +54,7 @@ type ClientExecutor struct {
52 52
 
53 53
 	// AuthFn will handle authenticating any docker pulls if Image
54 54
 	// is set to nil.
55
-	AuthFn func(name string) ([]docker.AuthConfiguration, bool)
55
+	AuthFn func(name string) ([]credentialprovider.LazyAuthConfiguration, bool)
56 56
 	// HostConfig is used to start the container (if necessary).
57 57
 	HostConfig *docker.HostConfig
58 58
 	// LogFn is an optional command to log information to the end user
... ...
@@ -305,7 +307,7 @@ func (e *ClientExecutor) LoadImage(from string) (*docker.Image, error) {
305 305
 	// TODO: we may want to abstract looping over multiple credentials
306 306
 	auth, _ := e.AuthFn(repository)
307 307
 	if len(auth) == 0 {
308
-		auth = append(auth, docker.AuthConfiguration{})
308
+		auth = append(auth, credentialprovider.LazyAuthConfiguration{})
309 309
 	}
310 310
 
311 311
 	if e.LogFn != nil {
... ...
@@ -328,7 +330,8 @@ func (e *ClientExecutor) LoadImage(from string) (*docker.Image, error) {
328 328
 			pullImageOptions.OutputStream = os.Stderr
329 329
 			pullImageOptions.RawJSONStream = false
330 330
 		}
331
-		if err = e.Client.PullImage(pullImageOptions, config); err == nil {
331
+		authConfig := docker.AuthConfiguration{Username: config.Username, ServerAddress: config.ServerAddress, Password: config.Password}
332
+		if err = e.Client.PullImage(pullImageOptions, authConfig); err == nil {
332 333
 			break
333 334
 		}
334 335
 		lastErr = err
... ...
@@ -44,9 +44,10 @@ func AddObjectLabels(obj runtime.Object, labels labels.Set) error {
44 44
 			}
45 45
 		}
46 46
 
47
-		if err := MergeInto(metaLabels, labels, ErrorOnDifferentDstKeyValue); err != nil {
47
+		if err := MergeInto(metaLabels, labels, OverwriteExistingDstKey); err != nil {
48 48
 			return fmt.Errorf("unable to add labels to %s/%s: %v", obj.GetObjectKind().GroupVersionKind(), accessor.GetName(), err)
49 49
 		}
50
+
50 51
 		accessor.SetLabels(metaLabels)
51 52
 
52 53
 		return nil
... ...
@@ -119,7 +120,7 @@ func AddObjectAnnotations(obj runtime.Object, annotations map[string]string) err
119 119
 			}
120 120
 		}
121 121
 
122
-		MergeInto(metaAnnotations, annotations, ErrorOnDifferentDstKeyValue)
122
+		MergeInto(metaAnnotations, annotations, OverwriteExistingDstKey)
123 123
 		accessor.SetAnnotations(metaAnnotations)
124 124
 
125 125
 		return nil
... ...
@@ -83,8 +83,8 @@ func TestAddConfigLabels(t *testing.T) {
83 83
 				ObjectMeta: kapi.ObjectMeta{Labels: map[string]string{"foo": "first value"}},
84 84
 			},
85 85
 			addLabels:      map[string]string{"foo": "second value"},
86
-			err:            true,
87
-			expectedLabels: map[string]string{"foo": "first value"},
86
+			err:            false,
87
+			expectedLabels: map[string]string{"foo": "second value"},
88 88
 		},
89 89
 		{ // [8] Test conflicting keys with the same value in ReplicationController nested labels
90 90
 			obj: &kapi.ReplicationController{
... ...
@@ -118,6 +118,6 @@ func previousResourceVersion(v storage.Versioner, resourceVersion string) (strin
118 118
 	if err != nil {
119 119
 		return "", err
120 120
 	}
121
-	v.UpdateObject(e, nil, version-1)
121
+	v.UpdateObject(e, version-1)
122 122
 	return e.ResourceVersion, nil
123 123
 }
... ...
@@ -10,8 +10,9 @@ import (
10 10
 	kapi "k8s.io/kubernetes/pkg/api"
11 11
 	"k8s.io/kubernetes/pkg/api/rest"
12 12
 	"k8s.io/kubernetes/pkg/api/unversioned"
13
+	"k8s.io/kubernetes/pkg/genericapiserver"
13 14
 	genericrest "k8s.io/kubernetes/pkg/registry/generic"
14
-	genericetcd "k8s.io/kubernetes/pkg/registry/generic/etcd"
15
+	"k8s.io/kubernetes/pkg/registry/generic/registry"
15 16
 	"k8s.io/kubernetes/pkg/runtime"
16 17
 	"k8s.io/kubernetes/pkg/storage"
17 18
 	etcdstorage "k8s.io/kubernetes/pkg/storage/etcd"
... ...
@@ -105,8 +106,9 @@ func (g *configRESTOptionsGetter) GetRESTOptions(resource unversioned.GroupResou
105 105
 			return genericrest.RESTOptions{}, err
106 106
 		}
107 107
 		// TODO: choose destination group/version based on input group/resource
108
+		// TODO: Tune the cache size
108 109
 		groupVersion := unversioned.GroupVersion{Group: "", Version: g.masterOptions.EtcdStorageConfig.OpenShiftStorageVersion}
109
-		g.etcdHelper = etcdstorage.NewEtcdStorage(etcdClient, kapi.Codecs.LegacyCodec(groupVersion), g.masterOptions.EtcdStorageConfig.OpenShiftStoragePrefix, false)
110
+		g.etcdHelper = etcdstorage.NewEtcdStorage(etcdClient, kapi.Codecs.LegacyCodec(groupVersion), g.masterOptions.EtcdStorageConfig.OpenShiftStoragePrefix, false, genericapiserver.DefaultDeserializationCacheSize)
110 111
 	}
111 112
 
112 113
 	configuredCacheSize, specified := g.cacheSizes[resource]
... ...
@@ -125,7 +127,7 @@ func (g *configRESTOptionsGetter) GetRESTOptions(resource unversioned.GroupResou
125 125
 			return genericrest.UndecoratedStorage(s, capacity, objectType, resourcePrefix, scopeStrategy, newListFunc)
126 126
 		} else {
127 127
 			glog.V(5).Infof("using watch cache storage (capacity=%d) for %s", capacity, resource.String())
128
-			return genericetcd.StorageWithCacher(s, capacity, objectType, resourcePrefix, scopeStrategy, newListFunc)
128
+			return registry.StorageWithCacher(s, capacity, objectType, resourcePrefix, scopeStrategy, newListFunc)
129 129
 		}
130 130
 	}
131 131
 
... ...
@@ -67,7 +67,8 @@ os::cmd::expect_success_and_text 'oc new-app ruby-helloworld-sample --param MYSQ
67 67
 # verify we can create from a template when some objects in the template declare an app label
68 68
 # the app label should still be applied to the other objects in the template.
69 69
 os::cmd::expect_success_and_text 'oc new-app -f test/testdata/template-with-app-label.json -o yaml' 'app: ruby-sample-build'
70
-os::cmd::expect_success_and_text 'oc new-app -f test/testdata/template-with-app-label.json -o yaml' 'app: myapp'
70
+# verify the existing app label on an object is overridden by new-app
71
+os::cmd::expect_success_and_not_text 'oc new-app -f test/testdata/template-with-app-label.json -o yaml' 'app: myapp'
71 72
 
72 73
 # check search
73 74
 os::cmd::expect_success_and_text 'oc new-app --search mysql' "Tags:\s+5.5, 5.6, latest"
... ...
@@ -195,7 +196,7 @@ os::cmd::expect_success 'oc new-app https://github.com/openshift/ruby-hello-worl
195 195
 os::cmd::expect_success 'oc delete all -l app=ruby'
196 196
 # check for error when template JSON file has errors
197 197
 jsonfile="${OS_ROOT}/test/testdata/invalid.json"
198
-os::cmd::expect_failure_and_text "oc new-app '${jsonfile}'" "error: unable to load template file \"${jsonfile}\": at offset 8: invalid character '}' after object key"
198
+os::cmd::expect_failure_and_text "oc new-app '${jsonfile}'" "error: unable to load template file \"${jsonfile}\": json: line 0: invalid character '}' after object key"
199 199
 
200 200
 # a docker compose file should be transformed into an application by the import command
201 201
 os::cmd::expect_success_and_text 'oc import docker-compose -f test/testdata/app-scenarios/docker-compose/complex/docker-compose.yml --dry-run' 'warning: not all docker-compose fields were honored'
... ...
@@ -255,4 +256,4 @@ os::cmd::expect_success 'oc new-app https://github.com/openshift/ruby-hello-worl
255 255
 os::cmd::expect_success_and_not_text 'oc new-app https://github.com/openshift/ruby-hello-world --output-version=v1 -o=jsonpath="{.items[?(@.kind==\"BuildConfig\")].spec.source}"' 'dockerfile|binary'
256 256
 
257 257
 echo "new-app: ok"
258
-os::test::junit::declare_suite_end
259 258
\ No newline at end of file
259
+os::test::junit::declare_suite_end
... ...
@@ -340,7 +340,7 @@ os::cmd::expect_success "oc process -n node-selector -v NODE_NAME='${NODE_NAME}'
340 340
 # The pod without a node name should fail to schedule
341 341
 os::cmd::try_until_text 'oc get events -n node-selector' 'pod-without-node-name.+FailedScheduling' $((20*TIME_SEC))
342 342
 # The pod with a node name should be rejected by the kubelet
343
-os::cmd::try_until_text 'oc get events -n node-selector' 'pod-with-node-name.+NodeSelectorMismatching' $((20*TIME_SEC))
343
+os::cmd::try_until_text 'oc get events -n node-selector' 'pod-with-node-name.+MatchNodeSelector' $((20*TIME_SEC))
344 344
 
345 345
 
346 346
 # Image pruning
... ...
@@ -25,11 +25,6 @@ ps=$(join '|' "${parallel_exclude[@]}")
25 25
 sf=$(join '|' "${serial_only[@]}")
26 26
 ss=$(join '|' "${serial_exclude[@]}")
27 27
 
28
-echo "[INFO] Running the following tests:"
29
-TEST_REPORT_DIR= TEST_OUTPUT_QUIET=true ${EXTENDEDTEST} "--ginkgo.focus=${pf}" "--ginkgo.skip=${ps}" --ginkgo.dryRun --ginkgo.noColor | grep ok | grep -v skip | cut -c 20- | sort
30
-TEST_REPORT_DIR= TEST_OUTPUT_QUIET=true ${EXTENDEDTEST} "--ginkgo.focus=${sf}" "--ginkgo.skip=${ss}" --ginkgo.dryRun --ginkgo.noColor | grep ok | grep -v skip | cut -c 20- | sort
31
-echo
32
-
33 28
 exitstatus=0
34 29
 
35 30
 # run parallel tests
... ...
@@ -17,14 +17,9 @@ import (
17 17
 	"k8s.io/kubernetes/pkg/util"
18 18
 	"k8s.io/kubernetes/pkg/util/sets"
19 19
 	"k8s.io/kubernetes/pkg/util/wait"
20
-	"k8s.io/kubernetes/test/e2e"
20
+	e2e "k8s.io/kubernetes/test/e2e/framework"
21 21
 )
22 22
 
23
-func init() {
24
-	// Origin provides implicit cluster DNS
25
-	e2e.ClusterDNSVerifier = func(f *e2e.Framework) {}
26
-}
27
-
28 23
 func createDNSPod(namespace, probeCmd string) *api.Pod {
29 24
 	pod := &api.Pod{
30 25
 		TypeMeta: unversioned.TypeMeta{
... ...
@@ -227,8 +222,6 @@ var _ = Describe("DNS", func() {
227 227
 	f := e2e.NewDefaultFramework("dns")
228 228
 
229 229
 	It("should answer endpoint and wildcard queries for the cluster [Conformance]", func() {
230
-		e2e.ClusterDNSVerifier(f)
231
-
232 230
 		if _, err := f.Client.Services(f.Namespace.Name).Create(createServiceSpec("headless", true, nil)); err != nil {
233 231
 			e2e.Failf("unable to create headless service: %v", err)
234 232
 		}
... ...
@@ -9,7 +9,7 @@ import (
9 9
 	exeutil "github.com/openshift/origin/test/extended/util"
10 10
 
11 11
 	kapi "k8s.io/kubernetes/pkg/api"
12
-	kapiextensions "k8s.io/kubernetes/pkg/apis/extensions"
12
+	"k8s.io/kubernetes/pkg/apis/batch"
13 13
 )
14 14
 
15 15
 var _ = g.Describe("[job] openshift can execute jobs", func() {
... ...
@@ -44,7 +44,7 @@ var _ = g.Describe("[job] openshift can execute jobs", func() {
44 44
 				o.Expect(len(jobs.Items)).Should(o.Equal(1))
45 45
 				job := jobs.Items[0]
46 46
 				o.Expect(len(job.Status.Conditions)).Should(o.Equal(1))
47
-				o.Expect(job.Status.Conditions[0].Type).Should(o.Equal(kapiextensions.JobComplete))
47
+				o.Expect(job.Status.Conditions[0].Type).Should(o.Equal(batch.JobComplete))
48 48
 
49 49
 				g.By("removing a job...")
50 50
 				err = oc.Run("delete").Args(fmt.Sprintf("job/%s", name)).Execute()
... ...
@@ -7,6 +7,7 @@ import (
7 7
 	g "github.com/onsi/ginkgo"
8 8
 
9 9
 	gson "encoding/json"
10
+
10 11
 	dockerClient "github.com/fsouza/go-dockerclient"
11 12
 	tutil "github.com/openshift/origin/test/util"
12 13
 	kapi "k8s.io/kubernetes/pkg/api"
... ...
@@ -115,7 +116,8 @@ func BuildAuthConfiguration(credKey string, oc *CLI) (*dockerClient.AuthConfigur
115 115
 						authConfs[0].ServerAddress = credKey
116 116
 					}
117 117
 					g.By(fmt.Sprintf("dockercfg with svrAddr %s user %s pass %s email %s ", authConfs[0].ServerAddress, authConfs[0].Username, authConfs[0].Password, authConfs[0].Email))
118
-					return &authConfs[0], err
118
+					c := dockerClient.AuthConfiguration{Username: authConfs[0].Username, ServerAddress: authConfs[0].ServerAddress, Password: authConfs[0].Password}
119
+					return &c, err
119 120
 				}
120 121
 			}
121 122
 		}
... ...
@@ -19,7 +19,7 @@ import (
19 19
 	"k8s.io/kubernetes/pkg/api/resource"
20 20
 	"k8s.io/kubernetes/pkg/api/unversioned"
21 21
 	"k8s.io/kubernetes/pkg/apimachinery/registered"
22
-	"k8s.io/kubernetes/pkg/apis/extensions"
22
+	"k8s.io/kubernetes/pkg/apis/batch"
23 23
 	kclient "k8s.io/kubernetes/pkg/client/unversioned"
24 24
 	"k8s.io/kubernetes/pkg/fields"
25 25
 	"k8s.io/kubernetes/pkg/labels"
... ...
@@ -585,7 +585,7 @@ func WaitForAJob(c kclient.JobInterface, name string, timeout time.Duration) err
585 585
 		// TODO soltysh: replace this with a function once such exist, currently
586 586
 		// it's private in the controller
587 587
 		for _, c := range j.Status.Conditions {
588
-			if (c.Type == extensions.JobComplete || c.Type == extensions.JobFailed) && c.Status == kapi.ConditionTrue {
588
+			if (c.Type == batch.JobComplete || c.Type == batch.JobFailed) && c.Status == kapi.ConditionTrue {
589 589
 				return true, nil
590 590
 			}
591 591
 		}
... ...
@@ -11,6 +11,7 @@ import (
11 11
 
12 12
 	kapi "k8s.io/kubernetes/pkg/api"
13 13
 	"k8s.io/kubernetes/pkg/api/errors"
14
+	"k8s.io/kubernetes/pkg/apis/batch"
14 15
 	expapi "k8s.io/kubernetes/pkg/apis/extensions"
15 16
 	"k8s.io/kubernetes/pkg/util/wait"
16 17
 )
... ...
@@ -64,9 +65,9 @@ func TestExtensionsAPIDeletion(t *testing.T) {
64 64
 		t.Fatalf("unexpected error creating the HPA object: %v", err)
65 65
 	}
66 66
 
67
-	job := expapi.Job{
67
+	job := batch.Job{
68 68
 		ObjectMeta: kapi.ObjectMeta{Name: "test-job"},
69
-		Spec: expapi.JobSpec{
69
+		Spec: batch.JobSpec{
70 70
 			Template: kapi.PodTemplateSpec{
71 71
 				ObjectMeta: kapi.ObjectMeta{Labels: map[string]string{"foo": "bar"}},
72 72
 				Spec: kapi.PodSpec{
... ...
@@ -10,6 +10,7 @@ import (
10 10
 
11 11
 	kapi "k8s.io/kubernetes/pkg/api"
12 12
 	"k8s.io/kubernetes/pkg/api/errors"
13
+	"k8s.io/kubernetes/pkg/apis/batch"
13 14
 	expapi "k8s.io/kubernetes/pkg/apis/extensions"
14 15
 )
15 16
 
... ...
@@ -65,9 +66,9 @@ func TestExtensionsAPIDisabledAutoscaleBatchEnabled(t *testing.T) {
65 65
 			MaxReplicas: 1,
66 66
 		},
67 67
 	}
68
-	validJob := &expapi.Job{
68
+	validJob := &batch.Job{
69 69
 		ObjectMeta: kapi.ObjectMeta{Name: "myjob"},
70
-		Spec: expapi.JobSpec{
70
+		Spec: batch.JobSpec{
71 71
 			Template: kapi.PodTemplateSpec{
72 72
 				Spec: kapi.PodSpec{
73 73
 					Containers:    []kapi.Container{{Name: "mycontainer", Image: "myimage"}},
... ...
@@ -189,7 +190,7 @@ func TestExtensionsAPIDisabled(t *testing.T) {
189 189
 	if _, err := projectAdminKubeClient.Extensions().Jobs(projName).List(kapi.ListOptions{}); !errors.IsNotFound(err) {
190 190
 		t.Fatalf("expected NotFound error listing jobs, got %v", err)
191 191
 	}
192
-	if _, err := projectAdminKubeClient.Extensions().Jobs(projName).Create(&expapi.Job{}); !errors.IsNotFound(err) {
192
+	if _, err := projectAdminKubeClient.Extensions().Jobs(projName).Create(&batch.Job{}); !errors.IsNotFound(err) {
193 193
 		t.Fatalf("expected NotFound error creating job, got %v", err)
194 194
 	}
195 195
 
... ...
@@ -2,6 +2,11 @@
2 2
 
3 3
 package integration
4 4
 
5
+/*
6
+
7
+// FIXME: This test is disabled because kubernetes switched to engine-api which
8
+// will require significant refactor.
9
+
5 10
 import (
6 11
 	"bytes"
7 12
 	"fmt"
... ...
@@ -1714,3 +1719,5 @@ func PrepareAppConfig(config *cmd.AppConfig) (stdout, stderr *bytes.Buffer) {
1714 1714
 	config.Typer = kapi.Scheme
1715 1715
 	return
1716 1716
 }
1717
+
1718
+*/
... ...
@@ -8,6 +8,7 @@ import (
8 8
 	kapi "k8s.io/kubernetes/pkg/api"
9 9
 	kapierrors "k8s.io/kubernetes/pkg/api/errors"
10 10
 	"k8s.io/kubernetes/pkg/api/unversioned"
11
+	"k8s.io/kubernetes/pkg/apis/batch"
11 12
 	"k8s.io/kubernetes/pkg/apis/extensions"
12 13
 	kclient "k8s.io/kubernetes/pkg/client/unversioned"
13 14
 
... ...
@@ -197,8 +198,8 @@ func testPodNodeConstraintsReplicaSet(nodeName string, nodeSelector map[string]s
197 197
 	return rs
198 198
 }
199 199
 
200
-func testPodNodeConstraintsJob(nodeName string, nodeSelector map[string]string) *extensions.Job {
201
-	job := &extensions.Job{}
200
+func testPodNodeConstraintsJob(nodeName string, nodeSelector map[string]string) *batch.Job {
201
+	job := &batch.Job{}
202 202
 	job.Name = "testjob"
203 203
 	job.Spec.Template.Labels = map[string]string{"foo": "bar"}
204 204
 	job.Spec.Template.Spec = testPodNodeConstraintsPodSpec(nodeName, nodeSelector)
... ...
@@ -14,6 +14,7 @@ import (
14 14
 
15 15
 	kapi "k8s.io/kubernetes/pkg/api"
16 16
 	"k8s.io/kubernetes/pkg/api/unversioned"
17
+	"k8s.io/kubernetes/pkg/apis/batch"
17 18
 	"k8s.io/kubernetes/pkg/apis/extensions"
18 19
 	extensions_v1beta1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
19 20
 	kclient "k8s.io/kubernetes/pkg/client/unversioned"
... ...
@@ -89,13 +90,12 @@ func runStorageTest(t *testing.T, ns string, autoscalingVersion, batchVersion, e
89 89
 	jobTestcases := map[string]struct {
90 90
 		creator kclient.JobInterface
91 91
 	}{
92
-		"batch":      {creator: projectAdminKubeClient.Batch().Jobs(ns)},
93
-		"extensions": {creator: projectAdminKubeClient.Extensions().Jobs(ns)},
92
+		"batch": {creator: projectAdminKubeClient.Batch().Jobs(ns)},
94 93
 	}
95 94
 	for name, testcase := range jobTestcases {
96
-		job := extensions.Job{
95
+		job := batch.Job{
97 96
 			ObjectMeta: kapi.ObjectMeta{Name: name + "-job"},
98
-			Spec: extensions.JobSpec{
97
+			Spec: batch.JobSpec{
99 98
 				Template: kapi.PodTemplateSpec{
100 99
 					Spec: kapi.PodSpec{
101 100
 						RestartPolicy: kapi.RestartPolicyNever,
... ...
@@ -69,7 +69,14 @@ func setupStartOptions(startEtcd, useDefaultPort bool) (*start.MasterArgs, *star
69 69
 
70 70
 	nodeArgs.NodeName = "127.0.0.1"
71 71
 	nodeArgs.VolumeDir = path.Join(basedir, "volume")
72
-	masterArgs.EtcdDir = path.Join(basedir, "etcd")
72
+
73
+	// Allows to override the default etcd directory from the shell script.
74
+	etcdDir := os.Getenv("TEST_ETCD_DIR")
75
+	if len(etcdDir) == 0 {
76
+		etcdDir = path.Join(basedir, "etcd")
77
+	}
78
+
79
+	masterArgs.EtcdDir = etcdDir
73 80
 	masterArgs.ConfigDir.Default(path.Join(basedir, "openshift.local.config", "master"))
74 81
 	nodeArgs.ConfigDir.Default(path.Join(basedir, "openshift.local.config", nodeArgs.NodeName))
75 82
 	nodeArgs.MasterCertDir = masterArgs.ConfigDir.Value()
... ...
@@ -13,43 +13,53 @@ import (
13 13
 	"k8s.io/kubernetes/cmd/libs/go2idl/args"
14 14
 	"k8s.io/kubernetes/cmd/libs/go2idl/conversion-gen/generators"
15 15
 	"k8s.io/kubernetes/cmd/libs/go2idl/generator"
16
+	"k8s.io/kubernetes/pkg/util/sets"
16 17
 )
17 18
 
18 19
 func main() {
19 20
 	arguments := args.Default()
20 21
 
21
-	// Override defaults. These are Kubernetes specific input locations.
22
-	arguments.InputDirs = []string{
22
+	// These are the packages we expect generated conversions for
23
+	expectedPackages := sets.NewString(
24
+		"github.com/openshift/origin/pkg/authorization/api/v1",
25
+		"github.com/openshift/origin/pkg/build/api/v1",
26
+		"github.com/openshift/origin/pkg/deploy/api/v1",
27
+		"github.com/openshift/origin/pkg/image/api/v1",
28
+		"github.com/openshift/origin/pkg/oauth/api/v1",
29
+		"github.com/openshift/origin/pkg/project/api/v1",
30
+		"github.com/openshift/origin/pkg/route/api/v1",
31
+		"github.com/openshift/origin/pkg/sdn/api/v1",
32
+		"github.com/openshift/origin/pkg/template/api/v1",
33
+		"github.com/openshift/origin/pkg/user/api/v1",
34
+		"github.com/openshift/origin/pkg/security/api/v1",
35
+	)
36
+
37
+	// These are the packages containing types and conversion functions used by the packages we want to generate for
38
+	supportingPackages := sets.NewString(
23 39
 		"k8s.io/kubernetes/pkg/api/v1",
24 40
 		"k8s.io/kubernetes/pkg/api",
25 41
 		"k8s.io/kubernetes/pkg/runtime",
26 42
 		"k8s.io/kubernetes/pkg/conversion",
27
-		"github.com/openshift/origin/pkg/authorization/api/v1",
28 43
 		"github.com/openshift/origin/pkg/authorization/api",
29
-		"github.com/openshift/origin/pkg/build/api/v1",
30 44
 		"github.com/openshift/origin/pkg/build/api",
31
-		"github.com/openshift/origin/pkg/deploy/api/v1",
32 45
 		"github.com/openshift/origin/pkg/deploy/api",
33
-		"github.com/openshift/origin/pkg/image/api/v1",
34 46
 		"github.com/openshift/origin/pkg/image/api",
35
-		"github.com/openshift/origin/pkg/oauth/api/v1",
36 47
 		"github.com/openshift/origin/pkg/oauth/api",
37
-		"github.com/openshift/origin/pkg/project/api/v1",
38 48
 		"github.com/openshift/origin/pkg/project/api",
39
-		"github.com/openshift/origin/pkg/route/api/v1",
40 49
 		"github.com/openshift/origin/pkg/route/api",
41
-		"github.com/openshift/origin/pkg/sdn/api/v1",
42 50
 		"github.com/openshift/origin/pkg/sdn/api",
43
-		"github.com/openshift/origin/pkg/template/api/v1",
44 51
 		"github.com/openshift/origin/pkg/template/api",
45
-		"github.com/openshift/origin/pkg/user/api/v1",
46 52
 		"github.com/openshift/origin/pkg/user/api",
47
-		"github.com/openshift/origin/pkg/security/api/v1",
48 53
 		"github.com/openshift/origin/pkg/security/api",
49
-	}
54
+	)
55
+
56
+	// Override defaults. These are Kubernetes specific input locations.
57
+	arguments.InputDirs = sets.NewString().Union(expectedPackages).Union(supportingPackages).List()
50 58
 
51 59
 	arguments.GoHeaderFilePath = "hack/boilerplate.txt"
52 60
 
61
+	foundPackages := sets.NewString()
62
+
53 63
 	if err := arguments.Execute(
54 64
 		generators.NameSystems(),
55 65
 		generators.DefaultNameSystem(),
... ...
@@ -57,6 +67,7 @@ func main() {
57 57
 			pkgs := generators.Packages(context, arguments)
58 58
 			var include generator.Packages
59 59
 			for _, pkg := range pkgs {
60
+				foundPackages.Insert(pkg.Path())
60 61
 				if strings.HasPrefix(pkg.Path(), "k8s.io/") {
61 62
 					continue
62 63
 				}
... ...
@@ -67,5 +78,10 @@ func main() {
67 67
 	); err != nil {
68 68
 		glog.Fatalf("Error: %v", err)
69 69
 	}
70
+
71
+	if missing := expectedPackages.Difference(foundPackages); len(missing) > 0 {
72
+		glog.Fatalf("Missing expected packages:\n%v", missing.List())
73
+	}
74
+
70 75
 	glog.Info("Completed successfully.")
71 76
 }