master, genericapiserver, registry

This commit is contained in:
Chao Xu 2016-11-18 13:31:36 -08:00
parent 4f3d0e3bde
commit d0a725a522
5 changed files with 41 additions and 22 deletions

View File

@ -37,6 +37,7 @@ import (
"k8s.io/kubernetes/pkg/admission" "k8s.io/kubernetes/pkg/admission"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/v1"
apiserverfilters "k8s.io/kubernetes/pkg/apiserver/filters" apiserverfilters "k8s.io/kubernetes/pkg/apiserver/filters"
apiserveropenapi "k8s.io/kubernetes/pkg/apiserver/openapi" apiserveropenapi "k8s.io/kubernetes/pkg/apiserver/openapi"
"k8s.io/kubernetes/pkg/apiserver/request" "k8s.io/kubernetes/pkg/apiserver/request"
@ -522,7 +523,7 @@ func DefaultAndValidateRunOptions(options *options.ServerRunOptions) {
glog.Warningf("Unable to obtain external host address from cloud provider: %v", err) glog.Warningf("Unable to obtain external host address from cloud provider: %v", err)
} else { } else {
for _, addr := range addrs { for _, addr := range addrs {
if addr.Type == api.NodeExternalIP { if addr.Type == v1.NodeExternalIP {
options.ExternalHost = addr.Address options.ExternalHost = addr.Address
} }
} }

View File

@ -38,6 +38,7 @@ import (
rbacapi "k8s.io/kubernetes/pkg/apis/rbac/v1alpha1" rbacapi "k8s.io/kubernetes/pkg/apis/rbac/v1alpha1"
storageapiv1beta1 "k8s.io/kubernetes/pkg/apis/storage/v1beta1" storageapiv1beta1 "k8s.io/kubernetes/pkg/apis/storage/v1beta1"
coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion" coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion"
corev1client "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5/typed/core/v1"
"k8s.io/kubernetes/pkg/genericapiserver" "k8s.io/kubernetes/pkg/genericapiserver"
"k8s.io/kubernetes/pkg/genericapiserver/options" "k8s.io/kubernetes/pkg/genericapiserver/options"
"k8s.io/kubernetes/pkg/healthz" "k8s.io/kubernetes/pkg/healthz"
@ -258,7 +259,7 @@ func (c completedConfig) New() (*Master, error) {
m.InstallAPIs(c.Config.GenericConfig.APIResourceConfigSource, restOptionsFactory.NewFor, restStorageProviders...) m.InstallAPIs(c.Config.GenericConfig.APIResourceConfigSource, restOptionsFactory.NewFor, restStorageProviders...)
if c.Tunneler != nil { if c.Tunneler != nil {
m.installTunneler(c.Tunneler, coreclient.NewForConfigOrDie(c.GenericConfig.LoopbackClientConfig).Nodes()) m.installTunneler(c.Tunneler, corev1client.NewForConfigOrDie(c.GenericConfig.LoopbackClientConfig).Nodes())
} }
return m, nil return m, nil
@ -283,7 +284,7 @@ func (m *Master) InstallLegacyAPI(c *Config, restOptionsGetter genericapiserver.
} }
} }
func (m *Master) installTunneler(tunneler genericapiserver.Tunneler, nodeClient coreclient.NodeInterface) { func (m *Master) installTunneler(tunneler genericapiserver.Tunneler, nodeClient corev1client.NodeInterface) {
tunneler.Run(nodeAddressProvider{nodeClient}.externalAddresses) tunneler.Run(nodeAddressProvider{nodeClient}.externalAddresses)
m.GenericAPIServer.AddHealthzChecks(healthz.NamedCheck("SSH Tunnel Check", genericapiserver.TunnelSyncHealthChecker(tunneler))) m.GenericAPIServer.AddHealthzChecks(healthz.NamedCheck("SSH Tunnel Check", genericapiserver.TunnelSyncHealthChecker(tunneler)))
prometheus.NewGaugeFunc(prometheus.GaugeOpts{ prometheus.NewGaugeFunc(prometheus.GaugeOpts{
@ -352,15 +353,15 @@ func (f restOptionsFactory) NewFor(resource unversioned.GroupResource) generic.R
} }
type nodeAddressProvider struct { type nodeAddressProvider struct {
nodeClient coreclient.NodeInterface nodeClient corev1client.NodeInterface
} }
func (n nodeAddressProvider) externalAddresses() (addresses []string, err error) { func (n nodeAddressProvider) externalAddresses() (addresses []string, err error) {
preferredAddressTypes := []api.NodeAddressType{ preferredAddressTypes := []apiv1.NodeAddressType{
api.NodeExternalIP, apiv1.NodeExternalIP,
api.NodeLegacyHostIP, apiv1.NodeLegacyHostIP,
} }
nodes, err := n.nodeClient.List(api.ListOptions{}) nodes, err := n.nodeClient.List(apiv1.ListOptions{})
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -42,12 +42,11 @@ import (
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
extensionsapiv1beta1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" extensionsapiv1beta1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
"k8s.io/kubernetes/pkg/apis/rbac" "k8s.io/kubernetes/pkg/apis/rbac"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5/fake"
"k8s.io/kubernetes/pkg/client/restclient" "k8s.io/kubernetes/pkg/client/restclient"
openapigen "k8s.io/kubernetes/pkg/generated/openapi" openapigen "k8s.io/kubernetes/pkg/generated/openapi"
"k8s.io/kubernetes/pkg/genericapiserver" "k8s.io/kubernetes/pkg/genericapiserver"
kubeletclient "k8s.io/kubernetes/pkg/kubelet/client" kubeletclient "k8s.io/kubernetes/pkg/kubelet/client"
"k8s.io/kubernetes/pkg/registry/registrytest"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
utilnet "k8s.io/kubernetes/pkg/util/net" utilnet "k8s.io/kubernetes/pkg/util/net"
@ -173,25 +172,36 @@ func (*fakeEndpointReconciler) ReconcileEndpoints(serviceName string, ip net.IP,
return nil return nil
} }
func makeNodeList(nodes []string, nodeResources apiv1.NodeResources) *apiv1.NodeList {
list := apiv1.NodeList{
Items: make([]apiv1.Node, len(nodes)),
}
for i := range nodes {
list.Items[i].Name = nodes[i]
list.Items[i].Status.Capacity = nodeResources.Capacity
}
return &list
}
// TestGetNodeAddresses verifies that proper results are returned // TestGetNodeAddresses verifies that proper results are returned
// when requesting node addresses. // when requesting node addresses.
func TestGetNodeAddresses(t *testing.T) { func TestGetNodeAddresses(t *testing.T) {
assert := assert.New(t) assert := assert.New(t)
fakeNodeClient := fake.NewSimpleClientset(registrytest.MakeNodeList([]string{"node1", "node2"}, api.NodeResources{})).Core().Nodes() fakeNodeClient := fake.NewSimpleClientset(makeNodeList([]string{"node1", "node2"}, apiv1.NodeResources{})).Core().Nodes()
addressProvider := nodeAddressProvider{fakeNodeClient} addressProvider := nodeAddressProvider{fakeNodeClient}
// Fail case (no addresses associated with nodes) // Fail case (no addresses associated with nodes)
nodes, _ := fakeNodeClient.List(api.ListOptions{}) nodes, _ := fakeNodeClient.List(apiv1.ListOptions{})
addrs, err := addressProvider.externalAddresses() addrs, err := addressProvider.externalAddresses()
assert.Error(err, "addresses should have caused an error as there are no addresses.") assert.Error(err, "addresses should have caused an error as there are no addresses.")
assert.Equal([]string(nil), addrs) assert.Equal([]string(nil), addrs)
// Pass case with External type IP // Pass case with External type IP
nodes, _ = fakeNodeClient.List(api.ListOptions{}) nodes, _ = fakeNodeClient.List(apiv1.ListOptions{})
for index := range nodes.Items { for index := range nodes.Items {
nodes.Items[index].Status.Addresses = []api.NodeAddress{{Type: api.NodeExternalIP, Address: "127.0.0.1"}} nodes.Items[index].Status.Addresses = []apiv1.NodeAddress{{Type: apiv1.NodeExternalIP, Address: "127.0.0.1"}}
fakeNodeClient.Update(&nodes.Items[index]) fakeNodeClient.Update(&nodes.Items[index])
} }
addrs, err = addressProvider.externalAddresses() addrs, err = addressProvider.externalAddresses()
@ -199,9 +209,9 @@ func TestGetNodeAddresses(t *testing.T) {
assert.Equal([]string{"127.0.0.1", "127.0.0.1"}, addrs) assert.Equal([]string{"127.0.0.1", "127.0.0.1"}, addrs)
// Pass case with LegacyHost type IP // Pass case with LegacyHost type IP
nodes, _ = fakeNodeClient.List(api.ListOptions{}) nodes, _ = fakeNodeClient.List(apiv1.ListOptions{})
for index := range nodes.Items { for index := range nodes.Items {
nodes.Items[index].Status.Addresses = []api.NodeAddress{{Type: api.NodeLegacyHostIP, Address: "127.0.0.2"}} nodes.Items[index].Status.Addresses = []apiv1.NodeAddress{{Type: apiv1.NodeLegacyHostIP, Address: "127.0.0.2"}}
fakeNodeClient.Update(&nodes.Items[index]) fakeNodeClient.Update(&nodes.Items[index])
} }
addrs, err = addressProvider.externalAddresses() addrs, err = addressProvider.externalAddresses()

View File

@ -23,6 +23,7 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/rest" "k8s.io/kubernetes/pkg/api/rest"
"k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/kubelet/client" "k8s.io/kubernetes/pkg/kubelet/client"
"k8s.io/kubernetes/pkg/registry/cachesize" "k8s.io/kubernetes/pkg/registry/cachesize"
"k8s.io/kubernetes/pkg/registry/core/node" "k8s.io/kubernetes/pkg/registry/core/node"
@ -115,7 +116,7 @@ func NewStorage(opts generic.RESTOptions, kubeletClientConfig client.KubeletClie
proxyREST := &noderest.ProxyREST{Store: store, ProxyTransport: proxyTransport} proxyREST := &noderest.ProxyREST{Store: store, ProxyTransport: proxyTransport}
// Build a NodeGetter that looks up nodes using the REST handler // Build a NodeGetter that looks up nodes using the REST handler
nodeGetter := client.NodeGetterFunc(func(nodeName string) (*api.Node, error) { nodeGetter := client.NodeGetterFunc(func(nodeName string) (*v1.Node, error) {
obj, err := nodeREST.Get(api.NewContext(), nodeName) obj, err := nodeREST.Get(api.NewContext(), nodeName)
if err != nil { if err != nil {
return nil, err return nil, err
@ -124,7 +125,13 @@ func NewStorage(opts generic.RESTOptions, kubeletClientConfig client.KubeletClie
if !ok { if !ok {
return nil, fmt.Errorf("unexpected type %T", obj) return nil, fmt.Errorf("unexpected type %T", obj)
} }
return node, nil // TODO: Remove the conversion. Consider only return the NodeAddresses
externalNode := &v1.Node{}
err = v1.Convert_api_Node_To_v1_Node(node, externalNode, nil)
if err != nil {
return nil, fmt.Errorf("failed to convert to v1.Node: %v", err)
}
return externalNode, nil
}) })
connectionInfoGetter, err := client.NewNodeConnectionInfoGetter(nodeGetter, kubeletClientConfig) connectionInfoGetter, err := client.NewNodeConnectionInfoGetter(nodeGetter, kubeletClientConfig)
if err != nil { if err != nil {

View File

@ -63,7 +63,7 @@ func validNewPod() *api.Pod {
ImagePullPolicy: api.PullAlways, ImagePullPolicy: api.PullAlways,
TerminationMessagePath: api.TerminationMessagePathDefault, TerminationMessagePath: api.TerminationMessagePathDefault,
SecurityContext: securitycontext.ValidSecurityContextWithContainerDefaults(), SecurityContext: securitycontext.ValidInternalSecurityContextWithContainerDefaults(),
}, },
}, },
SecurityContext: &api.PodSecurityContext{}, SecurityContext: &api.PodSecurityContext{},
@ -658,7 +658,7 @@ func TestEtcdUpdateScheduled(t *testing.T) {
{ {
Name: "foobar", Name: "foobar",
Image: "foo:v1", Image: "foo:v1",
SecurityContext: securitycontext.ValidSecurityContextWithContainerDefaults(), SecurityContext: securitycontext.ValidInternalSecurityContextWithContainerDefaults(),
}, },
}, },
SecurityContext: &api.PodSecurityContext{}, SecurityContext: &api.PodSecurityContext{},
@ -683,7 +683,7 @@ func TestEtcdUpdateScheduled(t *testing.T) {
Image: "foo:v2", Image: "foo:v2",
ImagePullPolicy: api.PullIfNotPresent, ImagePullPolicy: api.PullIfNotPresent,
TerminationMessagePath: api.TerminationMessagePathDefault, TerminationMessagePath: api.TerminationMessagePathDefault,
SecurityContext: securitycontext.ValidSecurityContextWithContainerDefaults(), SecurityContext: securitycontext.ValidInternalSecurityContextWithContainerDefaults(),
}}, }},
RestartPolicy: api.RestartPolicyAlways, RestartPolicy: api.RestartPolicyAlways,
DNSPolicy: api.DNSClusterFirst, DNSPolicy: api.DNSClusterFirst,
@ -727,7 +727,7 @@ func TestEtcdUpdateStatus(t *testing.T) {
Containers: []api.Container{ Containers: []api.Container{
{ {
Image: "foo:v1", Image: "foo:v1",
SecurityContext: securitycontext.ValidSecurityContextWithContainerDefaults(), SecurityContext: securitycontext.ValidInternalSecurityContextWithContainerDefaults(),
}, },
}, },
SecurityContext: &api.PodSecurityContext{}, SecurityContext: &api.PodSecurityContext{},