Browse code

Interesting refactoring

Contains:
* a new field to the NewDefaultRESTMapper that has to do with API groups
* slight refactor of our validation in the expose command
* a new field in the Namespace controller that enables handling of experimental resources (currently disabled)
* removal of NamespaceExists plugin since it's superceded by NamespaceLifecycle
* configurable sync period for ip tables via NewProxier
* slight refactor of the route generator as per upstream changes to the Generator interface

kargakis authored on 2015/09/21 20:30:11
Showing 9 changed files
... ...
@@ -8,7 +8,7 @@ import (
8 8
 	klatest "k8s.io/kubernetes/pkg/api/latest"
9 9
 	kmeta "k8s.io/kubernetes/pkg/api/meta"
10 10
 	"k8s.io/kubernetes/pkg/runtime"
11
-	"k8s.io/kubernetes/pkg/util"
11
+	"k8s.io/kubernetes/pkg/util/sets"
12 12
 
13 13
 	"github.com/golang/glog"
14 14
 
... ...
@@ -76,7 +76,7 @@ func InterfacesFor(version string) (*kmeta.VersionInterfaces, error) {
76 76
 }
77 77
 
78 78
 // originTypes are the hardcoded types defined by the OpenShift API.
79
-var originTypes = util.StringSet{}
79
+var originTypes = sets.String{}
80 80
 
81 81
 // UserResources are the resource names that apply to the primary, user facing resources used by
82 82
 // client tools. They are in deletion-first order - dependent resources should be last.
... ...
@@ -100,6 +100,7 @@ func init() {
100 100
 	versions := []string{"v1", "v1beta3"}
101 101
 
102 102
 	originMapper := kmeta.NewDefaultRESTMapper(
103
+		"",
103 104
 		versions,
104 105
 		func(version string) (*kmeta.VersionInterfaces, error) {
105 106
 			interfaces, err := InterfacesFor(version)
... ...
@@ -50,11 +50,11 @@ func NewCmdExpose(fullName string, f *clientcmd.Factory, out io.Writer) *cobra.C
50 50
 	// when validating the use of it (invalid for routes)
51 51
 	cmd.Flags().Set("protocol", "")
52 52
 	cmd.Flag("protocol").DefValue = ""
53
+	defRun := cmd.Run
53 54
 	cmd.Run = func(cmd *cobra.Command, args []string) {
54 55
 		err := validate(cmd, f, args)
55 56
 		cmdutil.CheckErr(err)
56
-		err = kcmd.RunExpose(f.Factory, out, cmd, args)
57
-		cmdutil.CheckErr(err)
57
+		defRun(cmd, args)
58 58
 	}
59 59
 	cmd.Flags().String("hostname", "", "Set a hostname for the new route")
60 60
 	return cmd
... ...
@@ -63,7 +63,7 @@ func NewCmdExpose(fullName string, f *clientcmd.Factory, out io.Writer) *cobra.C
63 63
 // validate adds one layer of validation prior to calling the upstream
64 64
 // expose command.
65 65
 func validate(cmd *cobra.Command, f *clientcmd.Factory, args []string) error {
66
-	namespace, _, err := f.DefaultNamespace()
66
+	namespace, enforceNamespace, err := f.DefaultNamespace()
67 67
 	if err != nil {
68 68
 		return err
69 69
 	}
... ...
@@ -77,17 +77,10 @@ func validate(cmd *cobra.Command, f *clientcmd.Factory, args []string) error {
77 77
 	r := resource.NewBuilder(mapper, typer, f.ClientMapperForCommand()).
78 78
 		ContinueOnError().
79 79
 		NamespaceParam(namespace).DefaultNamespace().
80
+		FilenameParam(enforceNamespace, cmdutil.GetFlagStringSlice(cmd, "filename")...).
80 81
 		ResourceTypeOrNameArgs(false, args...).
81 82
 		Flatten().
82 83
 		Do()
83
-	err = r.Err()
84
-	if err != nil {
85
-		return err
86
-	}
87
-	mapping, err := r.ResourceMapping()
88
-	if err != nil {
89
-		return err
90
-	}
91 84
 	infos, err := r.Infos()
92 85
 	if err != nil {
93 86
 		return err
... ...
@@ -96,12 +89,13 @@ func validate(cmd *cobra.Command, f *clientcmd.Factory, args []string) error {
96 96
 		return fmt.Errorf("multiple resources provided: %v", args)
97 97
 	}
98 98
 	info := infos[0]
99
+	mapping := info.ResourceMapping()
99 100
 
100 101
 	generator := cmdutil.GetFlagString(cmd, "generator")
101 102
 	switch mapping.Kind {
102 103
 	case "Service":
103 104
 		switch generator {
104
-		case "service/v1":
105
+		case "service/v1", "service/v2":
105 106
 			// Set default protocol back for generating services
106 107
 			if len(cmdutil.GetFlagString(cmd, "protocol")) == 0 {
107 108
 				cmd.Flags().Set("protocol", "TCP")
... ...
@@ -141,7 +135,7 @@ func validate(cmd *cobra.Command, f *clientcmd.Factory, args []string) error {
141 141
 			// Default exposing everything except services as a service
142 142
 			cmd.Flags().Set("generator", "service/v1")
143 143
 			fallthrough
144
-		case "service/v1":
144
+		case "service/v1", "service/v2":
145 145
 			// Set default protocol back for generating services
146 146
 			if len(cmdutil.GetFlagString(cmd, "protocol")) == 0 {
147 147
 				cmd.Flags().Set("protocol", "TCP")
... ...
@@ -158,11 +152,12 @@ func validate(cmd *cobra.Command, f *clientcmd.Factory, args []string) error {
158 158
 func validateFlags(cmd *cobra.Command, generator string) error {
159 159
 	invalidFlags := []string{}
160 160
 
161
-	if generator == "service/v1" {
161
+	switch generator {
162
+	case "service/v1", "service/v2":
162 163
 		if len(cmdutil.GetFlagString(cmd, "hostname")) != 0 {
163 164
 			invalidFlags = append(invalidFlags, "--hostname")
164 165
 		}
165
-	} else if generator == "route/v1" {
166
+	case "route/v1":
166 167
 		if len(cmdutil.GetFlagString(cmd, "protocol")) != 0 {
167 168
 			invalidFlags = append(invalidFlags, "--protocol")
168 169
 		}
... ...
@@ -178,8 +173,8 @@ func validateFlags(cmd *cobra.Command, generator string) error {
178 178
 		if len(cmdutil.GetFlagString(cmd, "target-port")) != 0 {
179 179
 			invalidFlags = append(invalidFlags, "--target-port")
180 180
 		}
181
-		if len(cmdutil.GetFlagString(cmd, "public-ip")) != 0 {
182
-			invalidFlags = append(invalidFlags, "--public-ip")
181
+		if len(cmdutil.GetFlagString(cmd, "external-ip")) != 0 {
182
+			invalidFlags = append(invalidFlags, "--external-ip")
183 183
 		}
184 184
 		if cmdutil.GetFlagInt(cmd, "port") != -1 {
185 185
 			invalidFlags = append(invalidFlags, "--port")
... ...
@@ -10,8 +10,8 @@ import (
10 10
 	"github.com/golang/glog"
11 11
 
12 12
 	kapi "k8s.io/kubernetes/pkg/api"
13
-	"k8s.io/kubernetes/pkg/client"
14 13
 	"k8s.io/kubernetes/pkg/client/record"
14
+	client "k8s.io/kubernetes/pkg/client/unversioned"
15 15
 	endpointcontroller "k8s.io/kubernetes/pkg/controller/endpoint"
16 16
 	namespacecontroller "k8s.io/kubernetes/pkg/controller/namespace"
17 17
 	nodecontroller "k8s.io/kubernetes/pkg/controller/node"
... ...
@@ -57,7 +57,9 @@ func (c *MasterConfig) InstallAPI(container *restful.Container) []string {
57 57
 
58 58
 // RunNamespaceController starts the Kubernetes Namespace Manager
59 59
 func (c *MasterConfig) RunNamespaceController() {
60
-	namespaceController := namespacecontroller.NewNamespaceController(c.KubeClient, c.ControllerManager.NamespaceSyncPeriod)
60
+	// TODO: Add OR c.ControllerManager.EnableDeploymentController once we have upstream deployments
61
+	experimentalMode := c.ControllerManager.EnableHorizontalPodAutoscaler
62
+	namespaceController := namespacecontroller.NewNamespaceController(c.KubeClient, experimentalMode, c.ControllerManager.NamespaceSyncPeriod)
61 63
 	namespaceController.Run()
62 64
 }
63 65
 
... ...
@@ -68,7 +70,7 @@ func (c *MasterConfig) RunPersistentVolumeClaimBinder() {
68 68
 }
69 69
 
70 70
 func (c *MasterConfig) RunPersistentVolumeClaimRecycler(recyclerImageName string) {
71
-	defaultScrubPod := volume.GetDefaultPersistentVolumeRecyclerPod()
71
+	defaultScrubPod := volume.NewPersistentVolumeRecyclerPodTemplate()
72 72
 	defaultScrubPod.Spec.Containers[0].Image = recyclerImageName
73 73
 	defaultScrubPod.Spec.Containers[0].Command = []string{"/usr/share/openshift/scripts/volumes/recycler.sh"}
74 74
 	defaultScrubPod.Spec.Containers[0].Args = []string{"/scrub"}
... ...
@@ -76,12 +78,12 @@ func (c *MasterConfig) RunPersistentVolumeClaimRecycler(recyclerImageName string
76 76
 	hostPathConfig := volume.VolumeConfig{
77 77
 		RecyclerMinimumTimeout:   30,
78 78
 		RecyclerTimeoutIncrement: 30,
79
-		RecyclerDefaultPod:       defaultScrubPod,
79
+		RecyclerPodTemplate:      defaultScrubPod,
80 80
 	}
81 81
 	nfsConfig := volume.VolumeConfig{
82 82
 		RecyclerMinimumTimeout:   180,
83 83
 		RecyclerTimeoutIncrement: 30,
84
-		RecyclerDefaultPod:       defaultScrubPod,
84
+		RecyclerPodTemplate:      defaultScrubPod,
85 85
 	}
86 86
 
87 87
 	allPlugins := []volume.VolumePlugin{}
... ...
@@ -136,7 +138,7 @@ func (c *MasterConfig) RunNodeController() {
136 136
 		c.KubeClient,
137 137
 		s.PodEvictionTimeout,
138 138
 
139
-		nodecontroller.NewPodEvictor(util.NewTokenBucketRateLimiter(s.DeletingPodsQps, s.DeletingPodsBurst)),
139
+		util.NewTokenBucketRateLimiter(s.DeletingPodsQps, s.DeletingPodsBurst),
140 140
 
141 141
 		s.NodeMonitorGracePeriod,
142 142
 		s.NodeStartupGracePeriod,
... ...
@@ -28,7 +28,7 @@ import (
28 28
 )
29 29
 
30 30
 // AdmissionPlugins is the full list of admission control plugins to enable in the order they must run
31
-var AdmissionPlugins = []string{"NamespaceExists", "NamespaceLifecycle", "OriginPodNodeEnvironment", "LimitRanger", "ServiceAccount", "SecurityContextConstraint", "ResourceQuota", "SCCExecRestrictions"}
31
+var AdmissionPlugins = []string{"NamespaceLifecycle", "OriginPodNodeEnvironment", "LimitRanger", "ServiceAccount", "SecurityContextConstraint", "ResourceQuota", "SCCExecRestrictions"}
32 32
 
33 33
 // MasterConfig defines the required values to start a Kubernetes master
34 34
 type MasterConfig struct {
... ...
@@ -149,6 +149,7 @@ func (c *NodeConfig) RunProxy() {
149 149
 	endpointsConfig := pconfig.NewEndpointsConfig()
150 150
 	loadBalancer := proxy.NewLoadBalancerRR()
151 151
 	endpointsConfig.RegisterHandler(loadBalancer)
152
+	syncPeriod := 5 * time.Second
152 153
 
153 154
 	host, _, err := net.SplitHostPort(c.BindAddress)
154 155
 	if err != nil {
... ...
@@ -165,7 +166,7 @@ func (c *NodeConfig) RunProxy() {
165 165
 	}
166 166
 
167 167
 	go util.Forever(func() {
168
-		proxier, err := proxy.NewProxier(loadBalancer, ip, iptables.New(kexec.New(), protocol), util.PortRange{})
168
+		proxier, err := proxy.NewProxier(loadBalancer, ip, iptables.New(kexec.New(), protocol), util.PortRange{}, syncPeriod)
169 169
 		if err != nil {
170 170
 			switch {
171 171
 			// conflicting use of iptables, retry
... ...
@@ -22,6 +22,9 @@ var admissionPluginsNotUsedByKube = sets.NewString(
22 22
 
23 23
 	"BuildByStrategy",          // from origin, only needed for managing builds, not kubernetes resources
24 24
 	"OriginNamespaceLifecycle", // from origin, only needed for rejecting openshift resources, so not needed by kube
25
+
26
+	"NamespaceExists",  // superceded by NamespaceLifecycle
27
+	"InitialResources", // do we want this? https://github.com/kubernetes/kubernetes/blob/master/docs/proposals/initial-resources.md
25 28
 )
26 29
 
27 30
 func TestKubeAdmissionControllerUsage(t *testing.T) {
... ...
@@ -367,8 +367,10 @@ func (m *Master) Start() error {
367 367
 	// Allow privileged containers
368 368
 	// TODO: make this configurable and not the default https://github.com/openshift/origin/issues/662
369 369
 	capabilities.Initialize(capabilities.Capabilities{
370
-		AllowPrivileged:    true,
371
-		HostNetworkSources: []string{kubelet.ApiserverSource, kubelet.FileSource},
370
+		AllowPrivileged: true,
371
+		PrivilegedSources: capabilities.PrivilegedSources{
372
+			HostNetworkSources: []string{kubelet.ApiserverSource, kubelet.FileSource},
373
+		},
372 374
 	})
373 375
 
374 376
 	openshiftConfig, err := origin.BuildMasterConfig(*m.config)
... ...
@@ -6,8 +6,8 @@ import (
6 6
 
7 7
 	"k8s.io/kubernetes/pkg/api"
8 8
 	"k8s.io/kubernetes/pkg/api/errors"
9
-	"k8s.io/kubernetes/pkg/client"
10 9
 	"k8s.io/kubernetes/pkg/client/cache"
10
+	client "k8s.io/kubernetes/pkg/client/unversioned"
11 11
 	"k8s.io/kubernetes/pkg/fields"
12 12
 	"k8s.io/kubernetes/pkg/labels"
13 13
 	"k8s.io/kubernetes/pkg/watch"
... ...
@@ -122,3 +122,6 @@ func (a cachedServiceNamespacer) Delete(name string) error {
122 122
 func (a cachedServiceNamespacer) Watch(label labels.Selector, field fields.Selector, resourceVersion string) (watch.Interface, error) {
123 123
 	return nil, fmt.Errorf("not implemented")
124 124
 }
125
+func (a cachedServiceNamespacer) ProxyGet(name, path string, params map[string]string) client.ResponseWrapper {
126
+	return nil
127
+}
... ...
@@ -10,9 +10,12 @@ import (
10 10
 	"github.com/openshift/origin/pkg/route/api"
11 11
 )
12 12
 
13
-// RouteGenerator implements the kubectl.Generator interface for routes
13
+// RouteGenerator generates routes from a given set of parameters
14 14
 type RouteGenerator struct{}
15 15
 
16
+// RouteGenerator implements the kubectl.Generator interface for routes
17
+var _ kubectl.Generator = RouteGenerator{}
18
+
16 19
 // ParamNames returns the parameters required for generating a route
17 20
 func (RouteGenerator) ParamNames() []kubectl.GeneratorParam {
18 21
 	return []kubectl.GeneratorParam{
... ...
@@ -24,12 +27,21 @@ func (RouteGenerator) ParamNames() []kubectl.GeneratorParam {
24 24
 }
25 25
 
26 26
 // Generate accepts a set of parameters and maps them into a new route
27
-func (RouteGenerator) Generate(params map[string]string) (runtime.Object, error) {
27
+func (RouteGenerator) Generate(genericParams map[string]interface{}) (runtime.Object, error) {
28 28
 	var (
29 29
 		labels map[string]string
30 30
 		err    error
31 31
 	)
32 32
 
33
+	params := map[string]string{}
34
+	for key, value := range genericParams {
35
+		strVal, isString := value.(string)
36
+		if !isString {
37
+			return nil, fmt.Errorf("expected string, saw %v for '%s'", value, key)
38
+		}
39
+		params[key] = strVal
40
+	}
41
+
33 42
 	labelString, found := params["labels"]
34 43
 	if found && len(labelString) > 0 {
35 44
 		labels, err = kubectl.ParseLabels(labelString)
... ...
@@ -59,7 +71,3 @@ func (RouteGenerator) Generate(params map[string]string) (runtime.Object, error)
59 59
 		},
60 60
 	}, nil
61 61
 }
62
-
63
-// Useful pattern for validating that RouteGenerator implements
64
-// the Generator interface
65
-var _ kubectl.Generator = RouteGenerator{}