Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
a082a2e7
Unverified
Commit
a082a2e7
authored
Oct 07, 2016
by
Jordan Liggitt
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove static kubelet client, refactor ConnectionInfoGetter
parent
3f4c4389
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
168 additions
and
229 deletions
+168
-229
server.go
cmd/kube-apiserver/app/server.go
+1
-7
kubelet_client.go
pkg/kubelet/client/kubelet_client.go
+80
-51
kubelet_client_test.go
pkg/kubelet/client/kubelet_client_test.go
+12
-68
master.go
pkg/master/master.go
+6
-5
master_test.go
pkg/master/master_test.go
+2
-2
etcd.go
pkg/registry/core/node/etcd/etcd.go
+33
-41
etcd_test.go
pkg/registry/core/node/etcd/etcd_test.go
+5
-10
strategy.go
pkg/registry/core/node/strategy.go
+10
-29
strategy.go
pkg/registry/core/pod/strategy.go
+12
-12
storage_core.go
pkg/registry/core/rest/storage_core.go
+6
-3
master_utils.go
test/integration/framework/master_utils.go
+1
-1
No files found.
cmd/kube-apiserver/app/server.go
View file @
a082a2e7
...
@@ -52,7 +52,6 @@ import (
...
@@ -52,7 +52,6 @@ import (
"k8s.io/kubernetes/pkg/genericapiserver"
"k8s.io/kubernetes/pkg/genericapiserver"
"k8s.io/kubernetes/pkg/genericapiserver/authorizer"
"k8s.io/kubernetes/pkg/genericapiserver/authorizer"
genericvalidation
"k8s.io/kubernetes/pkg/genericapiserver/validation"
genericvalidation
"k8s.io/kubernetes/pkg/genericapiserver/validation"
kubeletclient
"k8s.io/kubernetes/pkg/kubelet/client"
"k8s.io/kubernetes/pkg/master"
"k8s.io/kubernetes/pkg/master"
"k8s.io/kubernetes/pkg/registry/cachesize"
"k8s.io/kubernetes/pkg/registry/cachesize"
"k8s.io/kubernetes/pkg/serviceaccount"
"k8s.io/kubernetes/pkg/serviceaccount"
...
@@ -137,11 +136,6 @@ func Run(s *options.APIServer) error {
...
@@ -137,11 +136,6 @@ func Run(s *options.APIServer) error {
// Proxying to pods and services is IP-based... don't expect to be able to verify the hostname
// Proxying to pods and services is IP-based... don't expect to be able to verify the hostname
proxyTLSClientConfig
:=
&
tls
.
Config
{
InsecureSkipVerify
:
true
}
proxyTLSClientConfig
:=
&
tls
.
Config
{
InsecureSkipVerify
:
true
}
kubeletClient
,
err
:=
kubeletclient
.
NewStaticKubeletClient
(
&
s
.
KubeletConfig
)
if
err
!=
nil
{
glog
.
Fatalf
(
"Failed to start kubelet client: %v"
,
err
)
}
if
s
.
StorageConfig
.
DeserializationCacheSize
==
0
{
if
s
.
StorageConfig
.
DeserializationCacheSize
==
0
{
// When size of cache is not explicitly set, estimate its size based on
// When size of cache is not explicitly set, estimate its size based on
// target memory usage.
// target memory usage.
...
@@ -316,7 +310,7 @@ func Run(s *options.APIServer) error {
...
@@ -316,7 +310,7 @@ func Run(s *options.APIServer) error {
EnableCoreControllers
:
true
,
EnableCoreControllers
:
true
,
DeleteCollectionWorkers
:
s
.
DeleteCollectionWorkers
,
DeleteCollectionWorkers
:
s
.
DeleteCollectionWorkers
,
EventTTL
:
s
.
EventTTL
,
EventTTL
:
s
.
EventTTL
,
KubeletClient
:
kubeletClient
,
KubeletClient
Config
:
s
.
KubeletConfig
,
EnableUISupport
:
true
,
EnableUISupport
:
true
,
EnableLogsSupport
:
true
,
EnableLogsSupport
:
true
,
...
...
pkg/kubelet/client/kubelet_client.go
View file @
a082a2e7
...
@@ -17,19 +17,17 @@ limitations under the License.
...
@@ -17,19 +17,17 @@ limitations under the License.
package
client
package
client
import
(
import
(
"errors"
"fmt"
"net"
"net"
"net/http"
"net/http"
"str
ings
"
"str
conv
"
"time"
"time"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/validation"
"k8s.io/kubernetes/pkg/client/restclient"
"k8s.io/kubernetes/pkg/client/restclient"
"k8s.io/kubernetes/pkg/client/transport"
"k8s.io/kubernetes/pkg/client/transport"
"k8s.io/kubernetes/pkg/types"
"k8s.io/kubernetes/pkg/types"
utilnet
"k8s.io/kubernetes/pkg/util/net"
utilnet
"k8s.io/kubernetes/pkg/util/net"
nodeutil
"k8s.io/kubernetes/pkg/util/node"
)
)
type
KubeletClientConfig
struct
{
type
KubeletClientConfig
struct
{
...
@@ -50,19 +48,17 @@ type KubeletClientConfig struct {
...
@@ -50,19 +48,17 @@ type KubeletClientConfig struct {
Dial
func
(
net
,
addr
string
)
(
net
.
Conn
,
error
)
Dial
func
(
net
,
addr
string
)
(
net
.
Conn
,
error
)
}
}
// KubeletClient is an interface for all kubelet functionality
// ConnectionInfo provides the information needed to connect to a kubelet
type
KubeletClient
interface
{
type
ConnectionInfo
struct
{
GetRawConnectionInfo
(
ctx
api
.
Context
,
nodeName
types
.
NodeName
)
(
scheme
string
,
port
uint
,
transport
http
.
RoundTripper
,
err
error
)
Scheme
string
Hostname
string
Port
string
Transport
http
.
RoundTripper
}
}
// ConnectionInfoGetter provides ConnectionInfo for the kubelet running on a named node
type
ConnectionInfoGetter
interface
{
type
ConnectionInfoGetter
interface
{
GetConnectionInfo
(
ctx
api
.
Context
,
nodeName
types
.
NodeName
)
(
scheme
string
,
host
string
,
port
uint
,
transport
http
.
RoundTripper
,
err
error
)
GetConnectionInfo
(
ctx
api
.
Context
,
nodeName
types
.
NodeName
)
(
*
ConnectionInfo
,
error
)
}
// HTTPKubeletClient is the default implementation of KubeletHealthchecker, accesses the kubelet over HTTP.
type
HTTPKubeletClient
struct
{
Client
*
http
.
Client
Config
*
KubeletClientConfig
}
}
func
MakeTransport
(
config
*
KubeletClientConfig
)
(
http
.
RoundTripper
,
error
)
{
func
MakeTransport
(
config
*
KubeletClientConfig
)
(
http
.
RoundTripper
,
error
)
{
...
@@ -82,43 +78,6 @@ func MakeTransport(config *KubeletClientConfig) (http.RoundTripper, error) {
...
@@ -82,43 +78,6 @@ func MakeTransport(config *KubeletClientConfig) (http.RoundTripper, error) {
return
transport
.
HTTPWrappersForConfig
(
config
.
transportConfig
(),
rt
)
return
transport
.
HTTPWrappersForConfig
(
config
.
transportConfig
(),
rt
)
}
}
// TODO: this structure is questionable, it should be using client.Config and overriding defaults.
func
NewStaticKubeletClient
(
config
*
KubeletClientConfig
)
(
KubeletClient
,
error
)
{
transport
,
err
:=
MakeTransport
(
config
)
if
err
!=
nil
{
return
nil
,
err
}
c
:=
&
http
.
Client
{
Transport
:
transport
,
Timeout
:
config
.
HTTPTimeout
,
}
return
&
HTTPKubeletClient
{
Client
:
c
,
Config
:
config
,
},
nil
}
// In default HTTPKubeletClient ctx is unused.
func
(
c
*
HTTPKubeletClient
)
GetRawConnectionInfo
(
ctx
api
.
Context
,
nodeName
types
.
NodeName
)
(
string
,
uint
,
http
.
RoundTripper
,
error
)
{
if
errs
:=
validation
.
ValidateNodeName
(
string
(
nodeName
),
false
);
len
(
errs
)
!=
0
{
return
""
,
0
,
nil
,
fmt
.
Errorf
(
"invalid node name: %s"
,
strings
.
Join
(
errs
,
";"
))
}
scheme
:=
"http"
if
c
.
Config
.
EnableHttps
{
scheme
=
"https"
}
return
scheme
,
c
.
Config
.
Port
,
c
.
Client
.
Transport
,
nil
}
// FakeKubeletClient is a fake implementation of KubeletClient which returns an error
// when called. It is useful to pass to the master in a test configuration with
// no kubelets.
type
FakeKubeletClient
struct
{}
func
(
c
FakeKubeletClient
)
GetRawConnectionInfo
(
ctx
api
.
Context
,
nodeName
types
.
NodeName
)
(
string
,
uint
,
http
.
RoundTripper
,
error
)
{
return
""
,
0
,
nil
,
errors
.
New
(
"Not Implemented"
)
}
// transportConfig converts a client config to an appropriate transport config.
// transportConfig converts a client config to an appropriate transport config.
func
(
c
*
KubeletClientConfig
)
transportConfig
()
*
transport
.
Config
{
func
(
c
*
KubeletClientConfig
)
transportConfig
()
*
transport
.
Config
{
cfg
:=
&
transport
.
Config
{
cfg
:=
&
transport
.
Config
{
...
@@ -137,3 +96,73 @@ func (c *KubeletClientConfig) transportConfig() *transport.Config {
...
@@ -137,3 +96,73 @@ func (c *KubeletClientConfig) transportConfig() *transport.Config {
}
}
return
cfg
return
cfg
}
}
// NodeGetter defines an interface for looking up a node by name
type
NodeGetter
interface
{
Get
(
name
string
)
(
*
api
.
Node
,
error
)
}
// NodeGetterFunc allows implementing NodeGetter with a function
type
NodeGetterFunc
func
(
name
string
)
(
*
api
.
Node
,
error
)
func
(
f
NodeGetterFunc
)
Get
(
name
string
)
(
*
api
.
Node
,
error
)
{
return
f
(
name
)
}
// NodeConnectionInfoGetter obtains connection info from the status of a Node API object
type
NodeConnectionInfoGetter
struct
{
// nodes is used to look up Node objects
nodes
NodeGetter
// scheme is the scheme to use to connect to all kubelets
scheme
string
// defaultPort is the port to use if no Kubelet endpoint port is recorded in the node status
defaultPort
int
// transport is the transport to use to send a request to all kubelets
transport
http
.
RoundTripper
}
func
NewNodeConnectionInfoGetter
(
nodes
NodeGetter
,
config
KubeletClientConfig
)
(
ConnectionInfoGetter
,
error
)
{
scheme
:=
"http"
if
config
.
EnableHttps
{
scheme
=
"https"
}
transport
,
err
:=
MakeTransport
(
&
config
)
if
err
!=
nil
{
return
nil
,
err
}
return
&
NodeConnectionInfoGetter
{
nodes
:
nodes
,
scheme
:
scheme
,
defaultPort
:
int
(
config
.
Port
),
transport
:
transport
,
},
nil
}
func
(
k
*
NodeConnectionInfoGetter
)
GetConnectionInfo
(
ctx
api
.
Context
,
nodeName
types
.
NodeName
)
(
*
ConnectionInfo
,
error
)
{
node
,
err
:=
k
.
nodes
.
Get
(
string
(
nodeName
))
if
err
!=
nil
{
return
nil
,
err
}
// Find a kubelet-reported address, using preferred address type
hostIP
,
err
:=
nodeutil
.
GetNodeHostIP
(
node
)
if
err
!=
nil
{
return
nil
,
err
}
host
:=
hostIP
.
String
()
// Use the kubelet-reported port, if present
port
:=
int
(
node
.
Status
.
DaemonEndpoints
.
KubeletEndpoint
.
Port
)
if
port
<=
0
{
port
=
k
.
defaultPort
}
return
&
ConnectionInfo
{
Scheme
:
k
.
scheme
,
Hostname
:
host
,
Port
:
strconv
.
Itoa
(
port
),
Transport
:
k
.
transport
,
},
nil
}
pkg/kubelet/client/kubelet_client_test.go
View file @
a082a2e7
...
@@ -17,50 +17,17 @@ limitations under the License.
...
@@ -17,50 +17,17 @@ limitations under the License.
package
client
package
client
import
(
import
(
"encoding/json"
"net/http/httptest"
"net/url"
"testing"
"testing"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned"
"k8s.io/kubernetes/pkg/client/restclient"
"k8s.io/kubernetes/pkg/client/restclient"
"k8s.io/kubernetes/pkg/probe"
utiltesting
"k8s.io/kubernetes/pkg/util/testing"
)
)
func
TestHTTPKubeletClient
(
t
*
testing
.
T
)
{
// Ensure a node client can be used as a NodeGetter.
expectObj
:=
probe
.
Success
// This allows anyone with a node client to easily construct a NewNodeConnectionInfoGetter.
body
,
err
:=
json
.
Marshal
(
expectObj
)
var
_
=
NodeGetter
(
unversioned
.
NodeInterface
(
nil
))
if
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
}
fakeHandler
:=
utiltesting
.
FakeHandler
{
StatusCode
:
200
,
ResponseBody
:
string
(
body
),
}
testServer
:=
httptest
.
NewServer
(
&
fakeHandler
)
defer
testServer
.
Close
()
if
_
,
err
:=
url
.
Parse
(
testServer
.
URL
);
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
}
}
func
TestNewKubeletClient
(
t
*
testing
.
T
)
{
config
:=
&
KubeletClientConfig
{
EnableHttps
:
false
,
}
client
,
err
:=
NewStaticKubeletClient
(
config
)
if
err
!=
nil
{
t
.
Errorf
(
"Error while trying to create a client: %v"
,
err
)
}
if
client
==
nil
{
t
.
Error
(
"client is nil."
)
}
}
func
Test
NewKubeletClientTLS
Invalid
(
t
*
testing
.
T
)
{
func
Test
MakeTransport
Invalid
(
t
*
testing
.
T
)
{
config
:=
&
KubeletClientConfig
{
config
:=
&
KubeletClientConfig
{
EnableHttps
:
true
,
EnableHttps
:
true
,
//Invalid certificate and key path
//Invalid certificate and key path
...
@@ -71,16 +38,16 @@ func TestNewKubeletClientTLSInvalid(t *testing.T) {
...
@@ -71,16 +38,16 @@ func TestNewKubeletClientTLSInvalid(t *testing.T) {
},
},
}
}
client
,
err
:=
NewStaticKubeletClien
t
(
config
)
rt
,
err
:=
MakeTranspor
t
(
config
)
if
err
==
nil
{
if
err
==
nil
{
t
.
Errorf
(
"Expected an error"
)
t
.
Errorf
(
"Expected an error"
)
}
}
if
clien
t
!=
nil
{
if
r
t
!=
nil
{
t
.
Error
(
"
clien
t should be nil as we provided invalid cert file"
)
t
.
Error
(
"
r
t should be nil as we provided invalid cert file"
)
}
}
}
}
func
Test
NewKubeletClientTLS
Valid
(
t
*
testing
.
T
)
{
func
Test
MakeTransport
Valid
(
t
*
testing
.
T
)
{
config
:=
&
KubeletClientConfig
{
config
:=
&
KubeletClientConfig
{
Port
:
1234
,
Port
:
1234
,
EnableHttps
:
true
,
EnableHttps
:
true
,
...
@@ -93,34 +60,11 @@ func TestNewKubeletClientTLSValid(t *testing.T) {
...
@@ -93,34 +60,11 @@ func TestNewKubeletClientTLSValid(t *testing.T) {
},
},
}
}
client
,
err
:=
NewStaticKubeletClien
t
(
config
)
rt
,
err
:=
MakeTranspor
t
(
config
)
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Errorf
(
"Not expecting an error #%v"
,
err
)
t
.
Errorf
(
"Not expecting an error #%v"
,
err
)
}
}
if
client
==
nil
{
if
rt
==
nil
{
t
.
Error
(
"client should not be nil"
)
t
.
Error
(
"rt should not be nil"
)
}
{
scheme
,
port
,
transport
,
err
:=
client
.
GetRawConnectionInfo
(
nil
,
"foo"
)
if
err
!=
nil
{
t
.
Errorf
(
"Error getting info: %v"
,
err
)
}
if
scheme
!=
"https"
{
t
.
Errorf
(
"Expected https, got %s"
,
scheme
)
}
if
port
!=
1234
{
t
.
Errorf
(
"Expected 1234, got %d"
,
port
)
}
if
transport
==
nil
{
t
.
Errorf
(
"Expected transport, got nil"
)
}
}
{
_
,
_
,
_
,
err
:=
client
.
GetRawConnectionInfo
(
nil
,
"foo bar"
)
if
err
==
nil
{
t
.
Errorf
(
"Expected error getting connection info for invalid node name, got none"
)
}
}
}
}
}
pkg/master/master.go
View file @
a082a2e7
...
@@ -20,6 +20,7 @@ import (
...
@@ -20,6 +20,7 @@ import (
"fmt"
"fmt"
"net"
"net"
"net/url"
"net/url"
"reflect"
"strconv"
"strconv"
"strings"
"strings"
"sync"
"sync"
...
@@ -100,7 +101,7 @@ type Config struct {
...
@@ -100,7 +101,7 @@ type Config struct {
EndpointReconcilerConfig
EndpointReconcilerConfig
EndpointReconcilerConfig
EndpointReconcilerConfig
DeleteCollectionWorkers
int
DeleteCollectionWorkers
int
EventTTL
time
.
Duration
EventTTL
time
.
Duration
KubeletClient
kubeletclient
.
KubeletClient
KubeletClient
Config
kubeletclient
.
KubeletClientConfig
// genericapiserver.RESTStorageProviders provides RESTStorage building methods keyed by groupName
// genericapiserver.RESTStorageProviders provides RESTStorage building methods keyed by groupName
RESTStorageProviders
map
[
string
]
genericapiserver
.
RESTStorageProvider
RESTStorageProviders
map
[
string
]
genericapiserver
.
RESTStorageProvider
// Used to start and monitor tunneling
// Used to start and monitor tunneling
...
@@ -183,10 +184,10 @@ func (c *Config) SkipComplete() completedConfig {
...
@@ -183,10 +184,10 @@ func (c *Config) SkipComplete() completedConfig {
// New returns a new instance of Master from the given config.
// New returns a new instance of Master from the given config.
// Certain config fields will be set to a default value if unset.
// Certain config fields will be set to a default value if unset.
// Certain config fields must be specified, including:
// Certain config fields must be specified, including:
// KubeletClient
// KubeletClient
Config
func
(
c
completedConfig
)
New
()
(
*
Master
,
error
)
{
func
(
c
completedConfig
)
New
()
(
*
Master
,
error
)
{
if
c
.
KubeletClient
==
nil
{
if
reflect
.
DeepEqual
(
c
.
KubeletClientConfig
,
kubeletclient
.
KubeletClientConfig
{})
{
return
nil
,
fmt
.
Errorf
(
"Master.New() called with
config.KubeletClient == nil
"
)
return
nil
,
fmt
.
Errorf
(
"Master.New() called with
empty config.KubeletClientConfig
"
)
}
}
s
,
err
:=
c
.
Config
.
GenericConfig
.
SkipComplete
()
.
New
()
// completion is done in Complete, no need for a second time
s
,
err
:=
c
.
Config
.
GenericConfig
.
SkipComplete
()
.
New
()
// completion is done in Complete, no need for a second time
...
@@ -226,7 +227,7 @@ func (c completedConfig) New() (*Master, error) {
...
@@ -226,7 +227,7 @@ func (c completedConfig) New() (*Master, error) {
legacyRESTStorageProvider
:=
corerest
.
LegacyRESTStorageProvider
{
legacyRESTStorageProvider
:=
corerest
.
LegacyRESTStorageProvider
{
StorageFactory
:
c
.
StorageFactory
,
StorageFactory
:
c
.
StorageFactory
,
ProxyTransport
:
s
.
ProxyTransport
,
ProxyTransport
:
s
.
ProxyTransport
,
KubeletClient
:
c
.
KubeletClient
,
KubeletClient
Config
:
c
.
KubeletClientConfig
,
EventTTL
:
c
.
EventTTL
,
EventTTL
:
c
.
EventTTL
,
ServiceClusterIPRange
:
c
.
GenericConfig
.
ServiceClusterIPRange
,
ServiceClusterIPRange
:
c
.
GenericConfig
.
ServiceClusterIPRange
,
ServiceNodePortRange
:
c
.
GenericConfig
.
ServiceNodePortRange
,
ServiceNodePortRange
:
c
.
GenericConfig
.
ServiceNodePortRange
,
...
...
pkg/master/master_test.go
View file @
a082a2e7
...
@@ -49,7 +49,7 @@ import (
...
@@ -49,7 +49,7 @@ import (
"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"
"k8s.io/kubernetes/pkg/kubelet/client"
kubeletclient
"k8s.io/kubernetes/pkg/kubelet/client"
ipallocator
"k8s.io/kubernetes/pkg/registry/core/service/ipallocator"
ipallocator
"k8s.io/kubernetes/pkg/registry/core/service/ipallocator"
"k8s.io/kubernetes/pkg/registry/registrytest"
"k8s.io/kubernetes/pkg/registry/registrytest"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/runtime"
...
@@ -87,7 +87,6 @@ func setUp(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert.
...
@@ -87,7 +87,6 @@ func setUp(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert.
config
.
GenericConfig
.
LoopbackClientConfig
=
&
restclient
.
Config
{
APIPath
:
"/api"
,
ContentConfig
:
restclient
.
ContentConfig
{
NegotiatedSerializer
:
api
.
Codecs
}}
config
.
GenericConfig
.
LoopbackClientConfig
=
&
restclient
.
Config
{
APIPath
:
"/api"
,
ContentConfig
:
restclient
.
ContentConfig
{
NegotiatedSerializer
:
api
.
Codecs
}}
config
.
GenericConfig
.
APIResourceConfigSource
=
DefaultAPIResourceConfigSource
()
config
.
GenericConfig
.
APIResourceConfigSource
=
DefaultAPIResourceConfigSource
()
config
.
GenericConfig
.
PublicAddress
=
net
.
ParseIP
(
"192.168.10.4"
)
config
.
GenericConfig
.
PublicAddress
=
net
.
ParseIP
(
"192.168.10.4"
)
config
.
KubeletClient
=
client
.
FakeKubeletClient
{}
config
.
GenericConfig
.
LegacyAPIGroupPrefixes
=
sets
.
NewString
(
"/api"
)
config
.
GenericConfig
.
LegacyAPIGroupPrefixes
=
sets
.
NewString
(
"/api"
)
config
.
GenericConfig
.
APIGroupPrefix
=
"/apis"
config
.
GenericConfig
.
APIGroupPrefix
=
"/apis"
config
.
GenericConfig
.
APIResourceConfigSource
=
DefaultAPIResourceConfigSource
()
config
.
GenericConfig
.
APIResourceConfigSource
=
DefaultAPIResourceConfigSource
()
...
@@ -97,6 +96,7 @@ func setUp(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert.
...
@@ -97,6 +96,7 @@ func setUp(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert.
config
.
GenericConfig
.
EnableVersion
=
true
config
.
GenericConfig
.
EnableVersion
=
true
config
.
GenericConfig
.
LoopbackClientConfig
=
&
restclient
.
Config
{
APIPath
:
"/api"
,
ContentConfig
:
restclient
.
ContentConfig
{
NegotiatedSerializer
:
api
.
Codecs
}}
config
.
GenericConfig
.
LoopbackClientConfig
=
&
restclient
.
Config
{
APIPath
:
"/api"
,
ContentConfig
:
restclient
.
ContentConfig
{
NegotiatedSerializer
:
api
.
Codecs
}}
config
.
EnableCoreControllers
=
false
config
.
EnableCoreControllers
=
false
config
.
KubeletClientConfig
=
kubeletclient
.
KubeletClientConfig
{
Port
:
10250
}
// TODO: this is kind of hacky. The trouble is that the sync loop
// TODO: this is kind of hacky. The trouble is that the sync loop
// runs in a go-routine and there is no way to validate in the test
// runs in a go-routine and there is no way to validate in the test
...
...
pkg/registry/core/node/etcd/etcd.go
View file @
a082a2e7
...
@@ -30,8 +30,6 @@ import (
...
@@ -30,8 +30,6 @@ import (
"k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/generic/registry"
"k8s.io/kubernetes/pkg/registry/generic/registry"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/types"
nodeutil
"k8s.io/kubernetes/pkg/util/node"
)
)
// NodeStorage includes storage for nodes and all sub resources
// NodeStorage includes storage for nodes and all sub resources
...
@@ -39,11 +37,13 @@ type NodeStorage struct {
...
@@ -39,11 +37,13 @@ type NodeStorage struct {
Node
*
REST
Node
*
REST
Status
*
StatusREST
Status
*
StatusREST
Proxy
*
noderest
.
ProxyREST
Proxy
*
noderest
.
ProxyREST
KubeletConnectionInfo
client
.
ConnectionInfoGetter
}
}
type
REST
struct
{
type
REST
struct
{
*
registry
.
Store
*
registry
.
Store
connection
client
.
KubeletClient
connection
client
.
ConnectionInfoGetter
proxyTransport
http
.
RoundTripper
proxyTransport
http
.
RoundTripper
}
}
...
@@ -67,7 +67,7 @@ func (r *StatusREST) Update(ctx api.Context, name string, objInfo rest.UpdatedOb
...
@@ -67,7 +67,7 @@ func (r *StatusREST) Update(ctx api.Context, name string, objInfo rest.UpdatedOb
}
}
// NewStorage returns a NodeStorage object that will work against nodes.
// NewStorage returns a NodeStorage object that will work against nodes.
func
NewStorage
(
opts
generic
.
RESTOptions
,
connection
client
.
KubeletClient
,
proxyTransport
http
.
RoundTripper
)
NodeStorage
{
func
NewStorage
(
opts
generic
.
RESTOptions
,
kubeletClientConfig
client
.
KubeletClientConfig
,
proxyTransport
http
.
RoundTripper
)
(
*
NodeStorage
,
error
)
{
prefix
:=
"/"
+
opts
.
ResourcePrefix
prefix
:=
"/"
+
opts
.
ResourcePrefix
newListFunc
:=
func
()
runtime
.
Object
{
return
&
api
.
NodeList
{}
}
newListFunc
:=
func
()
runtime
.
Object
{
return
&
api
.
NodeList
{}
}
...
@@ -109,50 +109,42 @@ func NewStorage(opts generic.RESTOptions, connection client.KubeletClient, proxy
...
@@ -109,50 +109,42 @@ func NewStorage(opts generic.RESTOptions, connection client.KubeletClient, proxy
statusStore
:=
*
store
statusStore
:=
*
store
statusStore
.
UpdateStrategy
=
node
.
StatusStrategy
statusStore
.
UpdateStrategy
=
node
.
StatusStrategy
nodeREST
:=
&
REST
{
store
,
connection
,
proxyTransport
}
// Set up REST handlers
nodeREST
:=
&
REST
{
Store
:
store
,
proxyTransport
:
proxyTransport
}
return
NodeStorage
{
statusREST
:=
&
StatusREST
{
store
:
&
statusStore
}
Node
:
nodeREST
,
proxyREST
:=
&
noderest
.
ProxyREST
{
Store
:
store
,
ProxyTransport
:
proxyTransport
}
Status
:
&
StatusREST
{
store
:
&
statusStore
},
Proxy
:
&
noderest
.
ProxyREST
{
Store
:
store
,
Connection
:
client
.
ConnectionInfoGetter
(
nodeREST
),
ProxyTransport
:
proxyTransport
},
}
}
// Implement Redirector.
var
_
=
rest
.
Redirector
(
&
REST
{})
// ResourceLocation returns a URL to which one can send traffic for the specified node.
func
(
r
*
REST
)
ResourceLocation
(
ctx
api
.
Context
,
id
string
)
(
*
url
.
URL
,
http
.
RoundTripper
,
error
)
{
return
node
.
ResourceLocation
(
r
,
r
,
r
.
proxyTransport
,
ctx
,
id
)
}
var
_
=
client
.
ConnectionInfoGetter
(
&
REST
{})
func
(
r
*
REST
)
GetConnectionInfo
(
ctx
api
.
Context
,
nodeName
types
.
NodeName
)
(
string
,
string
,
uint
,
http
.
RoundTripper
,
error
)
{
// Build a NodeGetter that looks up nodes using the REST handler
scheme
,
port
,
transport
,
err
:=
r
.
connection
.
GetRawConnectionInfo
(
ctx
,
nodeName
)
nodeGetter
:=
client
.
NodeGetterFunc
(
func
(
nodeName
string
)
(
*
api
.
Node
,
error
)
{
obj
,
err
:=
nodeREST
.
Get
(
api
.
NewContext
(),
nodeName
)
if
err
!=
nil
{
if
err
!=
nil
{
return
""
,
""
,
0
,
nil
,
err
return
nil
,
err
}
// We probably shouldn't care about context when looking for Node object.
obj
,
err
:=
r
.
Get
(
ctx
,
string
(
nodeName
))
if
err
!=
nil
{
return
""
,
""
,
0
,
nil
,
err
}
}
node
,
ok
:=
obj
.
(
*
api
.
Node
)
node
,
ok
:=
obj
.
(
*
api
.
Node
)
if
!
ok
{
if
!
ok
{
return
""
,
""
,
0
,
nil
,
fmt
.
Errorf
(
"Unexpected object type: %#v"
,
node
)
return
nil
,
fmt
.
Errorf
(
"unexpected type %T"
,
obj
)
}
}
return
node
,
nil
hostIP
,
err
:=
nodeutil
.
GetNodeHostIP
(
node
)
})
connectionInfoGetter
,
err
:=
client
.
NewNodeConnectionInfoGetter
(
nodeGetter
,
kubeletClientConfig
)
if
err
!=
nil
{
if
err
!=
nil
{
return
""
,
""
,
0
,
nil
,
err
return
nil
,
err
}
}
host
:=
hostIP
.
String
()
nodeREST
.
connection
=
connectionInfoGetter
proxyREST
.
Connection
=
connectionInfoGetter
daemonPort
:=
int
(
node
.
Status
.
DaemonEndpoints
.
KubeletEndpoint
.
Port
)
return
&
NodeStorage
{
if
daemonPort
>
0
{
Node
:
nodeREST
,
return
scheme
,
host
,
uint
(
daemonPort
),
transport
,
nil
Status
:
statusREST
,
}
Proxy
:
proxyREST
,
return
scheme
,
host
,
port
,
transport
,
nil
KubeletConnectionInfo
:
connectionInfoGetter
,
},
nil
}
// Implement Redirector.
var
_
=
rest
.
Redirector
(
&
REST
{})
// ResourceLocation returns a URL to which one can send traffic for the specified node.
func
(
r
*
REST
)
ResourceLocation
(
ctx
api
.
Context
,
id
string
)
(
*
url
.
URL
,
http
.
RoundTripper
,
error
)
{
return
node
.
ResourceLocation
(
r
,
r
.
connection
,
r
.
proxyTransport
,
ctx
,
id
)
}
}
pkg/registry/core/node/etcd/etcd_test.go
View file @
a082a2e7
...
@@ -17,31 +17,26 @@ limitations under the License.
...
@@ -17,31 +17,26 @@ limitations under the License.
package
etcd
package
etcd
import
(
import
(
"net/http"
"testing"
"testing"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/resource"
"k8s.io/kubernetes/pkg/api/resource"
"k8s.io/kubernetes/pkg/fields"
"k8s.io/kubernetes/pkg/fields"
kubeletclient
"k8s.io/kubernetes/pkg/kubelet/client"
"k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/registrytest"
"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"
"k8s.io/kubernetes/pkg/types"
)
)
type
fakeConnectionInfoGetter
struct
{
}
func
(
fakeConnectionInfoGetter
)
GetRawConnectionInfo
(
ctx
api
.
Context
,
nodeName
types
.
NodeName
)
(
string
,
uint
,
http
.
RoundTripper
,
error
)
{
return
"http"
,
12345
,
nil
,
nil
}
func
newStorage
(
t
*
testing
.
T
)
(
*
REST
,
*
etcdtesting
.
EtcdTestServer
)
{
func
newStorage
(
t
*
testing
.
T
)
(
*
REST
,
*
etcdtesting
.
EtcdTestServer
)
{
etcdStorage
,
server
:=
registrytest
.
NewEtcdStorage
(
t
,
""
)
etcdStorage
,
server
:=
registrytest
.
NewEtcdStorage
(
t
,
""
)
restOptions
:=
generic
.
RESTOptions
{
StorageConfig
:
etcdStorage
,
Decorator
:
generic
.
UndecoratedStorage
,
DeleteCollectionWorkers
:
1
}
restOptions
:=
generic
.
RESTOptions
{
StorageConfig
:
etcdStorage
,
Decorator
:
generic
.
UndecoratedStorage
,
DeleteCollectionWorkers
:
1
}
storage
:=
NewStorage
(
restOptions
,
fakeConnectionInfoGetter
{},
nil
)
storage
,
err
:=
NewStorage
(
restOptions
,
kubeletclient
.
KubeletClientConfig
{},
nil
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
return
storage
.
Node
,
server
return
storage
.
Node
,
server
}
}
...
...
pkg/registry/core/node/strategy.go
View file @
a082a2e7
...
@@ -21,7 +21,6 @@ import (
...
@@ -21,7 +21,6 @@ import (
"net"
"net"
"net/http"
"net/http"
"net/url"
"net/url"
"strconv"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/errors"
...
@@ -29,13 +28,11 @@ import (
...
@@ -29,13 +28,11 @@ import (
"k8s.io/kubernetes/pkg/fields"
"k8s.io/kubernetes/pkg/fields"
"k8s.io/kubernetes/pkg/kubelet/client"
"k8s.io/kubernetes/pkg/kubelet/client"
"k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/master/ports"
"k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/runtime"
pkgstorage
"k8s.io/kubernetes/pkg/storage"
pkgstorage
"k8s.io/kubernetes/pkg/storage"
"k8s.io/kubernetes/pkg/types"
"k8s.io/kubernetes/pkg/types"
utilnet
"k8s.io/kubernetes/pkg/util/net"
utilnet
"k8s.io/kubernetes/pkg/util/net"
nodeutil
"k8s.io/kubernetes/pkg/util/node"
"k8s.io/kubernetes/pkg/util/validation/field"
"k8s.io/kubernetes/pkg/util/validation/field"
)
)
...
@@ -176,39 +173,23 @@ func ResourceLocation(getter ResourceGetter, connection client.ConnectionInfoGet
...
@@ -176,39 +173,23 @@ func ResourceLocation(getter ResourceGetter, connection client.ConnectionInfoGet
return
nil
,
nil
,
errors
.
NewBadRequest
(
fmt
.
Sprintf
(
"invalid node request %q"
,
id
))
return
nil
,
nil
,
errors
.
NewBadRequest
(
fmt
.
Sprintf
(
"invalid node request %q"
,
id
))
}
}
nodeObj
,
err
:=
getter
.
Get
(
ctx
,
name
)
info
,
err
:=
connection
.
GetConnectionInfo
(
ctx
,
types
.
NodeName
(
name
)
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
nil
,
err
return
nil
,
nil
,
err
}
}
node
:=
nodeObj
.
(
*
api
.
Node
)
hostIP
,
err
:=
nodeutil
.
GetNodeHostIP
(
node
)
if
err
!=
nil
{
return
nil
,
nil
,
err
}
host
:=
hostIP
.
String
()
// We check if we want to get a default Kubelet's transport. It happens if either:
// We check if we want to get a default Kubelet's transport. It happens if either:
// - no port is specified in request (Kubelet's port is default),
// - no port is specified in request (Kubelet's port is default)
// - we're using Port stored as a DaemonEndpoint and requested port is a Kubelet's port stored in the DaemonEndpoint,
// - the requested port matches the kubelet port for this node
// - there's no information in the API about DaemonEndpoint (legacy cluster) and requested port is equal to ports.KubeletPort (cluster-wide config)
if
portReq
==
""
||
portReq
==
info
.
Port
{
kubeletPort
:=
node
.
Status
.
DaemonEndpoints
.
KubeletEndpoint
.
Port
if
kubeletPort
==
0
{
kubeletPort
=
ports
.
KubeletPort
}
if
portReq
==
""
||
strconv
.
Itoa
(
int
(
kubeletPort
))
==
portReq
{
scheme
,
host
,
port
,
kubeletTransport
,
err
:=
connection
.
GetConnectionInfo
(
ctx
,
types
.
NodeName
(
node
.
Name
))
if
err
!=
nil
{
return
nil
,
nil
,
err
}
return
&
url
.
URL
{
return
&
url
.
URL
{
Scheme
:
scheme
,
Scheme
:
info
.
Scheme
,
Host
:
net
.
JoinHostPort
(
Host
:
net
.
JoinHostPort
(
info
.
Hostname
,
info
.
Port
),
host
,
strconv
.
FormatUint
(
uint64
(
port
),
10
),
),
},
},
kubelet
Transport
,
info
.
Transport
,
nil
nil
}
}
return
&
url
.
URL
{
Scheme
:
schemeReq
,
Host
:
net
.
JoinHostPort
(
host
,
portReq
)},
proxyTransport
,
nil
// Otherwise, return the requested scheme and port, and the proxy transport
return
&
url
.
URL
{
Scheme
:
schemeReq
,
Host
:
net
.
JoinHostPort
(
info
.
Hostname
,
portReq
)},
proxyTransport
,
nil
}
}
pkg/registry/core/pod/strategy.go
View file @
a082a2e7
...
@@ -305,7 +305,7 @@ func LogLocation(
...
@@ -305,7 +305,7 @@ func LogLocation(
// If pod has not been assigned a host, return an empty location
// If pod has not been assigned a host, return an empty location
return
nil
,
nil
,
nil
return
nil
,
nil
,
nil
}
}
node
Scheme
,
nodeHost
,
nodePort
,
nodeTransport
,
err
:=
connInfo
.
GetConnectionInfo
(
ctx
,
nodeName
)
node
Info
,
err
:=
connInfo
.
GetConnectionInfo
(
ctx
,
nodeName
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
nil
,
err
return
nil
,
nil
,
err
}
}
...
@@ -332,12 +332,12 @@ func LogLocation(
...
@@ -332,12 +332,12 @@ func LogLocation(
params
.
Add
(
"limitBytes"
,
strconv
.
FormatInt
(
*
opts
.
LimitBytes
,
10
))
params
.
Add
(
"limitBytes"
,
strconv
.
FormatInt
(
*
opts
.
LimitBytes
,
10
))
}
}
loc
:=
&
url
.
URL
{
loc
:=
&
url
.
URL
{
Scheme
:
nodeScheme
,
Scheme
:
node
Info
.
Scheme
,
Host
:
fmt
.
Sprintf
(
"%s:%d"
,
nodeHost
,
node
Port
),
Host
:
net
.
JoinHostPort
(
nodeInfo
.
Hostname
,
nodeInfo
.
Port
),
Path
:
fmt
.
Sprintf
(
"/containerLogs/%s/%s/%s"
,
pod
.
Namespace
,
pod
.
Name
,
container
),
Path
:
fmt
.
Sprintf
(
"/containerLogs/%s/%s/%s"
,
pod
.
Namespace
,
pod
.
Name
,
container
),
RawQuery
:
params
.
Encode
(),
RawQuery
:
params
.
Encode
(),
}
}
return
loc
,
nodeTransport
,
nil
return
loc
,
node
Info
.
Transport
,
nil
}
}
func
podHasContainerWithName
(
pod
*
api
.
Pod
,
containerName
string
)
bool
{
func
podHasContainerWithName
(
pod
*
api
.
Pod
,
containerName
string
)
bool
{
...
@@ -456,7 +456,7 @@ func streamLocation(
...
@@ -456,7 +456,7 @@ func streamLocation(
// If pod has not been assigned a host, return an empty location
// If pod has not been assigned a host, return an empty location
return
nil
,
nil
,
errors
.
NewBadRequest
(
fmt
.
Sprintf
(
"pod %s does not have a host assigned"
,
name
))
return
nil
,
nil
,
errors
.
NewBadRequest
(
fmt
.
Sprintf
(
"pod %s does not have a host assigned"
,
name
))
}
}
node
Scheme
,
nodeHost
,
nodePort
,
nodeTransport
,
err
:=
connInfo
.
GetConnectionInfo
(
ctx
,
nodeName
)
node
Info
,
err
:=
connInfo
.
GetConnectionInfo
(
ctx
,
nodeName
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
nil
,
err
return
nil
,
nil
,
err
}
}
...
@@ -465,12 +465,12 @@ func streamLocation(
...
@@ -465,12 +465,12 @@ func streamLocation(
return
nil
,
nil
,
err
return
nil
,
nil
,
err
}
}
loc
:=
&
url
.
URL
{
loc
:=
&
url
.
URL
{
Scheme
:
nodeScheme
,
Scheme
:
node
Info
.
Scheme
,
Host
:
fmt
.
Sprintf
(
"%s:%d"
,
nodeHost
,
node
Port
),
Host
:
net
.
JoinHostPort
(
nodeInfo
.
Hostname
,
nodeInfo
.
Port
),
Path
:
fmt
.
Sprintf
(
"/%s/%s/%s/%s"
,
path
,
pod
.
Namespace
,
pod
.
Name
,
container
),
Path
:
fmt
.
Sprintf
(
"/%s/%s/%s/%s"
,
path
,
pod
.
Namespace
,
pod
.
Name
,
container
),
RawQuery
:
params
.
Encode
(),
RawQuery
:
params
.
Encode
(),
}
}
return
loc
,
nodeTransport
,
nil
return
loc
,
node
Info
.
Transport
,
nil
}
}
// PortForwardLocation returns the port-forward URL for a pod.
// PortForwardLocation returns the port-forward URL for a pod.
...
@@ -490,14 +490,14 @@ func PortForwardLocation(
...
@@ -490,14 +490,14 @@ func PortForwardLocation(
// If pod has not been assigned a host, return an empty location
// If pod has not been assigned a host, return an empty location
return
nil
,
nil
,
errors
.
NewBadRequest
(
fmt
.
Sprintf
(
"pod %s does not have a host assigned"
,
name
))
return
nil
,
nil
,
errors
.
NewBadRequest
(
fmt
.
Sprintf
(
"pod %s does not have a host assigned"
,
name
))
}
}
node
Scheme
,
nodeHost
,
nodePort
,
nodeTransport
,
err
:=
connInfo
.
GetConnectionInfo
(
ctx
,
nodeName
)
node
Info
,
err
:=
connInfo
.
GetConnectionInfo
(
ctx
,
nodeName
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
nil
,
err
return
nil
,
nil
,
err
}
}
loc
:=
&
url
.
URL
{
loc
:=
&
url
.
URL
{
Scheme
:
nodeScheme
,
Scheme
:
node
Info
.
Scheme
,
Host
:
fmt
.
Sprintf
(
"%s:%d"
,
nodeHost
,
node
Port
),
Host
:
net
.
JoinHostPort
(
nodeInfo
.
Hostname
,
nodeInfo
.
Port
),
Path
:
fmt
.
Sprintf
(
"/portForward/%s/%s"
,
pod
.
Namespace
,
pod
.
Name
),
Path
:
fmt
.
Sprintf
(
"/portForward/%s/%s"
,
pod
.
Namespace
,
pod
.
Name
),
}
}
return
loc
,
nodeTransport
,
nil
return
loc
,
node
Info
.
Transport
,
nil
}
}
pkg/registry/core/rest/storage_core.go
View file @
a082a2e7
...
@@ -65,7 +65,7 @@ type LegacyRESTStorageProvider struct {
...
@@ -65,7 +65,7 @@ type LegacyRESTStorageProvider struct {
StorageFactory
genericapiserver
.
StorageFactory
StorageFactory
genericapiserver
.
StorageFactory
// Used for custom proxy dialing, and proxy TLS options
// Used for custom proxy dialing, and proxy TLS options
ProxyTransport
http
.
RoundTripper
ProxyTransport
http
.
RoundTripper
KubeletClient
kubeletclient
.
KubeletClient
KubeletClient
Config
kubeletclient
.
KubeletClientConfig
EventTTL
time
.
Duration
EventTTL
time
.
Duration
// ServiceClusterIPRange is used to build cluster IPs for discovery.
// ServiceClusterIPRange is used to build cluster IPs for discovery.
...
@@ -135,12 +135,15 @@ func (c LegacyRESTStorageProvider) NewLegacyRESTStorage(restOptionsGetter generi
...
@@ -135,12 +135,15 @@ func (c LegacyRESTStorageProvider) NewLegacyRESTStorage(restOptionsGetter generi
endpointsStorage
:=
endpointsetcd
.
NewREST
(
restOptionsGetter
(
api
.
Resource
(
"endpoints"
)))
endpointsStorage
:=
endpointsetcd
.
NewREST
(
restOptionsGetter
(
api
.
Resource
(
"endpoints"
)))
restStorage
.
EndpointRegistry
=
endpoint
.
NewRegistry
(
endpointsStorage
)
restStorage
.
EndpointRegistry
=
endpoint
.
NewRegistry
(
endpointsStorage
)
nodeStorage
:=
nodeetcd
.
NewStorage
(
restOptionsGetter
(
api
.
Resource
(
"nodes"
)),
c
.
KubeletClient
,
c
.
ProxyTransport
)
nodeStorage
,
err
:=
nodeetcd
.
NewStorage
(
restOptionsGetter
(
api
.
Resource
(
"nodes"
)),
c
.
KubeletClientConfig
,
c
.
ProxyTransport
)
if
err
!=
nil
{
return
LegacyRESTStorage
{},
genericapiserver
.
APIGroupInfo
{},
err
}
restStorage
.
NodeRegistry
=
node
.
NewRegistry
(
nodeStorage
.
Node
)
restStorage
.
NodeRegistry
=
node
.
NewRegistry
(
nodeStorage
.
Node
)
podStorage
:=
podetcd
.
NewStorage
(
podStorage
:=
podetcd
.
NewStorage
(
restOptionsGetter
(
api
.
Resource
(
"pods"
)),
restOptionsGetter
(
api
.
Resource
(
"pods"
)),
kubeletclient
.
ConnectionInfoGetter
(
nodeStorage
.
Node
)
,
nodeStorage
.
KubeletConnectionInfo
,
c
.
ProxyTransport
,
c
.
ProxyTransport
,
podDisruptionClient
,
podDisruptionClient
,
)
)
...
...
test/integration/framework/master_utils.go
View file @
a082a2e7
...
@@ -354,7 +354,7 @@ func NewMasterConfig() *master.Config {
...
@@ -354,7 +354,7 @@ func NewMasterConfig() *master.Config {
StorageFactory
:
storageFactory
,
StorageFactory
:
storageFactory
,
EnableCoreControllers
:
true
,
EnableCoreControllers
:
true
,
EnableWatchCache
:
true
,
EnableWatchCache
:
true
,
KubeletClient
:
kubeletclient
.
FakeKubeletClient
{
},
KubeletClient
Config
:
kubeletclient
.
KubeletClientConfig
{
Port
:
10250
},
}
}
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment