mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-26 21:17:23 +00:00
Merge pull request #6708 from roberthbailey/node-controller
Restrict functions and structs that aren't used outside of the nodecontroller to have package private scope
This commit is contained in:
commit
65d132a3ee
@ -41,12 +41,10 @@ var (
|
|||||||
ErrCloudInstance = errors.New("cloud provider doesn't support instances.")
|
ErrCloudInstance = errors.New("cloud provider doesn't support instances.")
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
// nodeStatusUpdateRetry controls the number of retries of writing NodeStatus update.
|
||||||
// Constant controlling number of retries of writing NodeStatus update.
|
const nodeStatusUpdateRetry = 5
|
||||||
nodeStatusUpdateRetry = 5
|
|
||||||
)
|
|
||||||
|
|
||||||
type NodeStatusData struct {
|
type nodeStatusData struct {
|
||||||
probeTimestamp util.Time
|
probeTimestamp util.Time
|
||||||
readyTransitionTimestamp util.Time
|
readyTransitionTimestamp util.Time
|
||||||
status api.NodeStatus
|
status api.NodeStatus
|
||||||
@ -62,10 +60,10 @@ type NodeController struct {
|
|||||||
registerRetryCount int
|
registerRetryCount int
|
||||||
podEvictionTimeout time.Duration
|
podEvictionTimeout time.Duration
|
||||||
deletingPodsRateLimiter util.RateLimiter
|
deletingPodsRateLimiter util.RateLimiter
|
||||||
// per Node map storing last observed Status togheter with a local time when it was observed.
|
// per Node map storing last observed Status together with a local time when it was observed.
|
||||||
// This timestamp is to be used instead of LastProbeTime stored in Condition. We do this
|
// This timestamp is to be used instead of LastProbeTime stored in Condition. We do this
|
||||||
// to aviod the problem with time skew across the cluster.
|
// to aviod the problem with time skew across the cluster.
|
||||||
nodeStatusMap map[string]NodeStatusData
|
nodeStatusMap map[string]nodeStatusData
|
||||||
// Value used if sync_nodes_status=False. NodeController will not proactively
|
// Value used if sync_nodes_status=False. NodeController will not proactively
|
||||||
// sync node status in this case, but will monitor node status updated from kubelet. If
|
// sync node status in this case, but will monitor node status updated from kubelet. If
|
||||||
// it doesn't receive update for this amount of time, it will start posting "NodeReady==
|
// it doesn't receive update for this amount of time, it will start posting "NodeReady==
|
||||||
@ -128,7 +126,7 @@ func NewNodeController(
|
|||||||
registerRetryCount: registerRetryCount,
|
registerRetryCount: registerRetryCount,
|
||||||
podEvictionTimeout: podEvictionTimeout,
|
podEvictionTimeout: podEvictionTimeout,
|
||||||
deletingPodsRateLimiter: deletingPodsRateLimiter,
|
deletingPodsRateLimiter: deletingPodsRateLimiter,
|
||||||
nodeStatusMap: make(map[string]NodeStatusData),
|
nodeStatusMap: make(map[string]nodeStatusData),
|
||||||
nodeMonitorGracePeriod: nodeMonitorGracePeriod,
|
nodeMonitorGracePeriod: nodeMonitorGracePeriod,
|
||||||
nodeMonitorPeriod: nodeMonitorPeriod,
|
nodeMonitorPeriod: nodeMonitorPeriod,
|
||||||
nodeStartupGracePeriod: nodeStartupGracePeriod,
|
nodeStartupGracePeriod: nodeStartupGracePeriod,
|
||||||
@ -140,12 +138,12 @@ func NewNodeController(
|
|||||||
|
|
||||||
// Run creates initial node list and start syncing instances from cloudprovider, if any.
|
// Run creates initial node list and start syncing instances from cloudprovider, if any.
|
||||||
// It also starts syncing or monitoring cluster node status.
|
// It also starts syncing or monitoring cluster node status.
|
||||||
// 1. RegisterNodes() is called only once to register all initial nodes (from cloudprovider
|
// 1. registerNodes() is called only once to register all initial nodes (from cloudprovider
|
||||||
// or from command line flag). To make cluster bootstrap faster, node controller populates
|
// or from command line flag). To make cluster bootstrap faster, node controller populates
|
||||||
// node addresses.
|
// node addresses.
|
||||||
// 2. SyncCloudNodes() is called periodically (if enabled) to sync instances from cloudprovider.
|
// 2. syncCloudNodes() is called periodically (if enabled) to sync instances from cloudprovider.
|
||||||
// Node created here will only have specs.
|
// Node created here will only have specs.
|
||||||
// 3. MonitorNodeStatus() is called periodically to incorporate the results of node status
|
// 3. monitorNodeStatus() is called periodically to incorporate the results of node status
|
||||||
// pushed from kubelet to master.
|
// pushed from kubelet to master.
|
||||||
func (nc *NodeController) Run(period time.Duration, syncNodeList bool) {
|
func (nc *NodeController) Run(period time.Duration, syncNodeList bool) {
|
||||||
// Register intial set of nodes with their status set.
|
// Register intial set of nodes with their status set.
|
||||||
@ -153,28 +151,29 @@ func (nc *NodeController) Run(period time.Duration, syncNodeList bool) {
|
|||||||
var err error
|
var err error
|
||||||
if nc.isRunningCloudProvider() {
|
if nc.isRunningCloudProvider() {
|
||||||
if syncNodeList {
|
if syncNodeList {
|
||||||
if nodes, err = nc.GetCloudNodesWithSpec(); err != nil {
|
if nodes, err = nc.getCloudNodesWithSpec(); err != nil {
|
||||||
glog.Errorf("Error loading initial node from cloudprovider: %v", err)
|
glog.Errorf("Error loading initial node from cloudprovider: %v", err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
nodes = &api.NodeList{}
|
nodes = &api.NodeList{}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if nodes, err = nc.GetStaticNodesWithSpec(); err != nil {
|
if nodes, err = nc.getStaticNodesWithSpec(); err != nil {
|
||||||
glog.Errorf("Error loading initial static nodes: %v", err)
|
glog.Errorf("Error loading initial static nodes: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if nodes, err = nc.PopulateAddresses(nodes); err != nil {
|
|
||||||
|
if nodes, err = nc.populateAddresses(nodes); err != nil {
|
||||||
glog.Errorf("Error getting nodes ips: %v", err)
|
glog.Errorf("Error getting nodes ips: %v", err)
|
||||||
}
|
}
|
||||||
if err = nc.RegisterNodes(nodes, nc.registerRetryCount, period); err != nil {
|
if err := nc.registerNodes(nodes, nc.registerRetryCount, period); err != nil {
|
||||||
glog.Errorf("Error registering node list %+v: %v", nodes, err)
|
glog.Errorf("Error registering node list %+v: %v", nodes, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start syncing node list from cloudprovider.
|
// Start syncing node list from cloudprovider.
|
||||||
if syncNodeList && nc.isRunningCloudProvider() {
|
if syncNodeList && nc.isRunningCloudProvider() {
|
||||||
go util.Forever(func() {
|
go util.Forever(func() {
|
||||||
if err := nc.SyncCloudNodes(); err != nil {
|
if err := nc.syncCloudNodes(); err != nil {
|
||||||
glog.Errorf("Error syncing cloud: %v", err)
|
glog.Errorf("Error syncing cloud: %v", err)
|
||||||
}
|
}
|
||||||
}, period)
|
}, period)
|
||||||
@ -182,14 +181,14 @@ func (nc *NodeController) Run(period time.Duration, syncNodeList bool) {
|
|||||||
|
|
||||||
// Start monitoring node status.
|
// Start monitoring node status.
|
||||||
go util.Forever(func() {
|
go util.Forever(func() {
|
||||||
if err = nc.MonitorNodeStatus(); err != nil {
|
if err := nc.monitorNodeStatus(); err != nil {
|
||||||
glog.Errorf("Error monitoring node status: %v", err)
|
glog.Errorf("Error monitoring node status: %v", err)
|
||||||
}
|
}
|
||||||
}, nc.nodeMonitorPeriod)
|
}, nc.nodeMonitorPeriod)
|
||||||
}
|
}
|
||||||
|
|
||||||
// RegisterNodes registers the given list of nodes, it keeps retrying for `retryCount` times.
|
// registerNodes registers the given list of nodes, it keeps retrying for `retryCount` times.
|
||||||
func (nc *NodeController) RegisterNodes(nodes *api.NodeList, retryCount int, retryInterval time.Duration) error {
|
func (nc *NodeController) registerNodes(nodes *api.NodeList, retryCount int, retryInterval time.Duration) error {
|
||||||
if len(nodes.Items) == 0 {
|
if len(nodes.Items) == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -278,9 +277,9 @@ func (nc *NodeController) reconcileExternalServices(nodes *api.NodeList) (should
|
|||||||
return shouldRetry
|
return shouldRetry
|
||||||
}
|
}
|
||||||
|
|
||||||
// SyncCloudNodes synchronizes the list of instances from cloudprovider to master server.
|
// syncCloudNodes synchronizes the list of instances from cloudprovider to master server.
|
||||||
func (nc *NodeController) SyncCloudNodes() error {
|
func (nc *NodeController) syncCloudNodes() error {
|
||||||
matches, err := nc.GetCloudNodesWithSpec()
|
matches, err := nc.getCloudNodesWithSpec()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -302,7 +301,7 @@ func (nc *NodeController) SyncCloudNodes() error {
|
|||||||
glog.V(3).Infof("Querying addresses for new node: %s", node.Name)
|
glog.V(3).Infof("Querying addresses for new node: %s", node.Name)
|
||||||
nodeList := &api.NodeList{}
|
nodeList := &api.NodeList{}
|
||||||
nodeList.Items = []api.Node{node}
|
nodeList.Items = []api.Node{node}
|
||||||
_, err = nc.PopulateAddresses(nodeList)
|
_, err = nc.populateAddresses(nodeList)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Errorf("Error fetching addresses for new node %s: %v", node.Name, err)
|
glog.Errorf("Error fetching addresses for new node %s: %v", node.Name, err)
|
||||||
continue
|
continue
|
||||||
@ -341,8 +340,8 @@ func (nc *NodeController) SyncCloudNodes() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// PopulateAddresses queries Address for given list of nodes.
|
// populateAddresses queries Address for given list of nodes.
|
||||||
func (nc *NodeController) PopulateAddresses(nodes *api.NodeList) (*api.NodeList, error) {
|
func (nc *NodeController) populateAddresses(nodes *api.NodeList) (*api.NodeList, error) {
|
||||||
if nc.isRunningCloudProvider() {
|
if nc.isRunningCloudProvider() {
|
||||||
instances, ok := nc.cloud.Instances()
|
instances, ok := nc.cloud.Instances()
|
||||||
if !ok {
|
if !ok {
|
||||||
@ -411,7 +410,7 @@ func (nc *NodeController) tryUpdateNodeStatus(node *api.Node) (time.Duration, ap
|
|||||||
LastTransitionTime: node.CreationTimestamp,
|
LastTransitionTime: node.CreationTimestamp,
|
||||||
}
|
}
|
||||||
gracePeriod = nc.nodeStartupGracePeriod
|
gracePeriod = nc.nodeStartupGracePeriod
|
||||||
nc.nodeStatusMap[node.Name] = NodeStatusData{
|
nc.nodeStatusMap[node.Name] = nodeStatusData{
|
||||||
status: node.Status,
|
status: node.Status,
|
||||||
probeTimestamp: node.CreationTimestamp,
|
probeTimestamp: node.CreationTimestamp,
|
||||||
readyTransitionTimestamp: node.CreationTimestamp,
|
readyTransitionTimestamp: node.CreationTimestamp,
|
||||||
@ -441,7 +440,7 @@ func (nc *NodeController) tryUpdateNodeStatus(node *api.Node) (time.Duration, ap
|
|||||||
observedCondition := nc.getCondition(&node.Status, api.NodeReady)
|
observedCondition := nc.getCondition(&node.Status, api.NodeReady)
|
||||||
if !found {
|
if !found {
|
||||||
glog.Warningf("Missing timestamp for Node %s. Assuming now as a timestamp.", node.Name)
|
glog.Warningf("Missing timestamp for Node %s. Assuming now as a timestamp.", node.Name)
|
||||||
savedNodeStatus = NodeStatusData{
|
savedNodeStatus = nodeStatusData{
|
||||||
status: node.Status,
|
status: node.Status,
|
||||||
probeTimestamp: nc.now(),
|
probeTimestamp: nc.now(),
|
||||||
readyTransitionTimestamp: nc.now(),
|
readyTransitionTimestamp: nc.now(),
|
||||||
@ -449,7 +448,7 @@ func (nc *NodeController) tryUpdateNodeStatus(node *api.Node) (time.Duration, ap
|
|||||||
nc.nodeStatusMap[node.Name] = savedNodeStatus
|
nc.nodeStatusMap[node.Name] = savedNodeStatus
|
||||||
} else if savedCondition == nil && observedCondition != nil {
|
} else if savedCondition == nil && observedCondition != nil {
|
||||||
glog.V(1).Infof("Creating timestamp entry for newly observed Node %s", node.Name)
|
glog.V(1).Infof("Creating timestamp entry for newly observed Node %s", node.Name)
|
||||||
savedNodeStatus = NodeStatusData{
|
savedNodeStatus = nodeStatusData{
|
||||||
status: node.Status,
|
status: node.Status,
|
||||||
probeTimestamp: nc.now(),
|
probeTimestamp: nc.now(),
|
||||||
readyTransitionTimestamp: nc.now(),
|
readyTransitionTimestamp: nc.now(),
|
||||||
@ -458,7 +457,7 @@ func (nc *NodeController) tryUpdateNodeStatus(node *api.Node) (time.Duration, ap
|
|||||||
} else if savedCondition != nil && observedCondition == nil {
|
} else if savedCondition != nil && observedCondition == nil {
|
||||||
glog.Errorf("ReadyCondition was removed from Status of Node %s", node.Name)
|
glog.Errorf("ReadyCondition was removed from Status of Node %s", node.Name)
|
||||||
// TODO: figure out what to do in this case. For now we do the same thing as above.
|
// TODO: figure out what to do in this case. For now we do the same thing as above.
|
||||||
savedNodeStatus = NodeStatusData{
|
savedNodeStatus = nodeStatusData{
|
||||||
status: node.Status,
|
status: node.Status,
|
||||||
probeTimestamp: nc.now(),
|
probeTimestamp: nc.now(),
|
||||||
readyTransitionTimestamp: nc.now(),
|
readyTransitionTimestamp: nc.now(),
|
||||||
@ -476,7 +475,7 @@ func (nc *NodeController) tryUpdateNodeStatus(node *api.Node) (time.Duration, ap
|
|||||||
transitionTime = savedNodeStatus.readyTransitionTimestamp
|
transitionTime = savedNodeStatus.readyTransitionTimestamp
|
||||||
}
|
}
|
||||||
glog.V(3).Infof("Nodes ReadyCondition updated. Updating timestamp: %+v\n vs %+v.", savedNodeStatus.status, node.Status)
|
glog.V(3).Infof("Nodes ReadyCondition updated. Updating timestamp: %+v\n vs %+v.", savedNodeStatus.status, node.Status)
|
||||||
savedNodeStatus = NodeStatusData{
|
savedNodeStatus = nodeStatusData{
|
||||||
status: node.Status,
|
status: node.Status,
|
||||||
probeTimestamp: nc.now(),
|
probeTimestamp: nc.now(),
|
||||||
readyTransitionTimestamp: transitionTime,
|
readyTransitionTimestamp: transitionTime,
|
||||||
@ -512,7 +511,7 @@ func (nc *NodeController) tryUpdateNodeStatus(node *api.Node) (time.Duration, ap
|
|||||||
glog.Errorf("Error updating node %s: %v", node.Name, err)
|
glog.Errorf("Error updating node %s: %v", node.Name, err)
|
||||||
return gracePeriod, lastReadyCondition, readyCondition, err
|
return gracePeriod, lastReadyCondition, readyCondition, err
|
||||||
} else {
|
} else {
|
||||||
nc.nodeStatusMap[node.Name] = NodeStatusData{
|
nc.nodeStatusMap[node.Name] = nodeStatusData{
|
||||||
status: node.Status,
|
status: node.Status,
|
||||||
probeTimestamp: nc.nodeStatusMap[node.Name].probeTimestamp,
|
probeTimestamp: nc.nodeStatusMap[node.Name].probeTimestamp,
|
||||||
readyTransitionTimestamp: nc.now(),
|
readyTransitionTimestamp: nc.now(),
|
||||||
@ -525,10 +524,10 @@ func (nc *NodeController) tryUpdateNodeStatus(node *api.Node) (time.Duration, ap
|
|||||||
return gracePeriod, lastReadyCondition, readyCondition, err
|
return gracePeriod, lastReadyCondition, readyCondition, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// MonitorNodeStatus verifies node status are constantly updated by kubelet, and if not,
|
// monitorNodeStatus verifies node status are constantly updated by kubelet, and if not,
|
||||||
// post "NodeReady==ConditionUnknown". It also evicts all pods if node is not ready or
|
// post "NodeReady==ConditionUnknown". It also evicts all pods if node is not ready or
|
||||||
// not reachable for a long period of time.
|
// not reachable for a long period of time.
|
||||||
func (nc *NodeController) MonitorNodeStatus() error {
|
func (nc *NodeController) monitorNodeStatus() error {
|
||||||
nodes, err := nc.kubeClient.Nodes().List(labels.Everything(), fields.Everything())
|
nodes, err := nc.kubeClient.Nodes().List(labels.Everything(), fields.Everything())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -592,10 +591,10 @@ func (nc *NodeController) MonitorNodeStatus() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetStaticNodesWithSpec constructs and returns api.NodeList for static nodes. If error
|
// getStaticNodesWithSpec constructs and returns api.NodeList for static nodes. If error
|
||||||
// occurs, an empty NodeList will be returned with a non-nil error info. The method only
|
// occurs, an empty NodeList will be returned with a non-nil error info. The method only
|
||||||
// constructs spec fields for nodes.
|
// constructs spec fields for nodes.
|
||||||
func (nc *NodeController) GetStaticNodesWithSpec() (*api.NodeList, error) {
|
func (nc *NodeController) getStaticNodesWithSpec() (*api.NodeList, error) {
|
||||||
result := &api.NodeList{}
|
result := &api.NodeList{}
|
||||||
for _, nodeID := range nc.nodes {
|
for _, nodeID := range nc.nodes {
|
||||||
node := api.Node{
|
node := api.Node{
|
||||||
@ -612,10 +611,10 @@ func (nc *NodeController) GetStaticNodesWithSpec() (*api.NodeList, error) {
|
|||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetCloudNodesWithSpec constructs and returns api.NodeList from cloudprovider. If error
|
// getCloudNodesWithSpec constructs and returns api.NodeList from cloudprovider. If error
|
||||||
// occurs, an empty NodeList will be returned with a non-nil error info. The method only
|
// occurs, an empty NodeList will be returned with a non-nil error info. The method only
|
||||||
// constructs spec fields for nodes.
|
// constructs spec fields for nodes.
|
||||||
func (nc *NodeController) GetCloudNodesWithSpec() (*api.NodeList, error) {
|
func (nc *NodeController) getCloudNodesWithSpec() (*api.NodeList, error) {
|
||||||
result := &api.NodeList{}
|
result := &api.NodeList{}
|
||||||
instances, ok := nc.cloud.Instances()
|
instances, ok := nc.cloud.Instances()
|
||||||
if !ok {
|
if !ok {
|
||||||
@ -640,7 +639,7 @@ func (nc *NodeController) GetCloudNodesWithSpec() (*api.NodeList, error) {
|
|||||||
}
|
}
|
||||||
instanceID, err := instances.ExternalID(node.Name)
|
instanceID, err := instances.ExternalID(node.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Errorf("error getting instance id for %s: %v", node.Name, err)
|
glog.Errorf("Error getting instance id for %s: %v", node.Name, err)
|
||||||
} else {
|
} else {
|
||||||
node.Spec.ExternalID = instanceID
|
node.Spec.ExternalID = instanceID
|
||||||
}
|
}
|
||||||
|
@ -239,7 +239,7 @@ func TestRegisterNodes(t *testing.T) {
|
|||||||
}
|
}
|
||||||
nodeController := NewNodeController(nil, "", item.machines, &api.NodeResources{}, item.fakeNodeHandler, 10, time.Minute,
|
nodeController := NewNodeController(nil, "", item.machines, &api.NodeResources{}, item.fakeNodeHandler, 10, time.Minute,
|
||||||
util.NewFakeRateLimiter(), testNodeMonitorGracePeriod, testNodeStartupGracePeriod, testNodeMonitorPeriod, "")
|
util.NewFakeRateLimiter(), testNodeMonitorGracePeriod, testNodeStartupGracePeriod, testNodeMonitorPeriod, "")
|
||||||
err := nodeController.RegisterNodes(&nodes, item.retryCount, time.Millisecond)
|
err := nodeController.registerNodes(&nodes, item.retryCount, time.Millisecond)
|
||||||
if !item.expectedFail && err != nil {
|
if !item.expectedFail && err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@ -325,7 +325,7 @@ func TestCreateGetStaticNodesWithSpec(t *testing.T) {
|
|||||||
for _, item := range table {
|
for _, item := range table {
|
||||||
nodeController := NewNodeController(nil, "", item.machines, &resources, nil, 10, time.Minute,
|
nodeController := NewNodeController(nil, "", item.machines, &resources, nil, 10, time.Minute,
|
||||||
util.NewFakeRateLimiter(), testNodeMonitorGracePeriod, testNodeStartupGracePeriod, testNodeMonitorPeriod, "")
|
util.NewFakeRateLimiter(), testNodeMonitorGracePeriod, testNodeStartupGracePeriod, testNodeMonitorPeriod, "")
|
||||||
nodes, err := nodeController.GetStaticNodesWithSpec()
|
nodes, err := nodeController.getStaticNodesWithSpec()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@ -387,7 +387,7 @@ func TestCreateGetCloudNodesWithSpec(t *testing.T) {
|
|||||||
for _, item := range table {
|
for _, item := range table {
|
||||||
nodeController := NewNodeController(item.fakeCloud, ".*", nil, &api.NodeResources{}, nil, 10, time.Minute,
|
nodeController := NewNodeController(item.fakeCloud, ".*", nil, &api.NodeResources{}, nil, 10, time.Minute,
|
||||||
util.NewFakeRateLimiter(), testNodeMonitorGracePeriod, testNodeStartupGracePeriod, testNodeMonitorPeriod, "")
|
util.NewFakeRateLimiter(), testNodeMonitorGracePeriod, testNodeStartupGracePeriod, testNodeMonitorPeriod, "")
|
||||||
nodes, err := nodeController.GetCloudNodesWithSpec()
|
nodes, err := nodeController.getCloudNodesWithSpec()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@ -497,7 +497,7 @@ func TestSyncCloudNodes(t *testing.T) {
|
|||||||
}
|
}
|
||||||
nodeController := NewNodeController(item.fakeCloud, item.matchRE, nil, &api.NodeResources{}, item.fakeNodeHandler, 10, time.Minute,
|
nodeController := NewNodeController(item.fakeCloud, item.matchRE, nil, &api.NodeResources{}, item.fakeNodeHandler, 10, time.Minute,
|
||||||
util.NewFakeRateLimiter(), testNodeMonitorGracePeriod, testNodeStartupGracePeriod, testNodeMonitorPeriod, "")
|
util.NewFakeRateLimiter(), testNodeMonitorGracePeriod, testNodeStartupGracePeriod, testNodeMonitorPeriod, "")
|
||||||
if err := nodeController.SyncCloudNodes(); err != nil {
|
if err := nodeController.syncCloudNodes(); err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
if item.fakeNodeHandler.RequestCount != item.expectedRequestCount {
|
if item.fakeNodeHandler.RequestCount != item.expectedRequestCount {
|
||||||
@ -581,7 +581,7 @@ func TestSyncCloudNodesEvictPods(t *testing.T) {
|
|||||||
}
|
}
|
||||||
nodeController := NewNodeController(item.fakeCloud, item.matchRE, nil, &api.NodeResources{}, item.fakeNodeHandler, 10, time.Minute,
|
nodeController := NewNodeController(item.fakeCloud, item.matchRE, nil, &api.NodeResources{}, item.fakeNodeHandler, 10, time.Minute,
|
||||||
util.NewFakeRateLimiter(), testNodeMonitorGracePeriod, testNodeStartupGracePeriod, testNodeMonitorPeriod, "")
|
util.NewFakeRateLimiter(), testNodeMonitorGracePeriod, testNodeStartupGracePeriod, testNodeMonitorPeriod, "")
|
||||||
if err := nodeController.SyncCloudNodes(); err != nil {
|
if err := nodeController.syncCloudNodes(); err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
if item.fakeNodeHandler.RequestCount != item.expectedRequestCount {
|
if item.fakeNodeHandler.RequestCount != item.expectedRequestCount {
|
||||||
@ -650,7 +650,7 @@ func TestSyncCloudNodesReconcilesExternalService(t *testing.T) {
|
|||||||
for _, item := range table {
|
for _, item := range table {
|
||||||
nodeController := NewNodeController(item.fakeCloud, item.matchRE, nil, &api.NodeResources{}, item.fakeNodeHandler,
|
nodeController := NewNodeController(item.fakeCloud, item.matchRE, nil, &api.NodeResources{}, item.fakeNodeHandler,
|
||||||
10, time.Minute, util.NewFakeRateLimiter(), testNodeMonitorGracePeriod, testNodeStartupGracePeriod, testNodeMonitorPeriod, "kubernetes")
|
10, time.Minute, util.NewFakeRateLimiter(), testNodeMonitorGracePeriod, testNodeStartupGracePeriod, testNodeMonitorPeriod, "kubernetes")
|
||||||
if err := nodeController.SyncCloudNodes(); err != nil {
|
if err := nodeController.syncCloudNodes(); err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
if !reflect.DeepEqual(item.expectedClientActions, item.fakeNodeHandler.Actions) {
|
if !reflect.DeepEqual(item.expectedClientActions, item.fakeNodeHandler.Actions) {
|
||||||
@ -686,7 +686,7 @@ func TestPopulateNodeAddresses(t *testing.T) {
|
|||||||
for _, item := range table {
|
for _, item := range table {
|
||||||
nodeController := NewNodeController(item.fakeCloud, ".*", nil, nil, nil, 10, time.Minute,
|
nodeController := NewNodeController(item.fakeCloud, ".*", nil, nil, nil, 10, time.Minute,
|
||||||
util.NewFakeRateLimiter(), testNodeMonitorGracePeriod, testNodeStartupGracePeriod, testNodeMonitorPeriod, "")
|
util.NewFakeRateLimiter(), testNodeMonitorGracePeriod, testNodeStartupGracePeriod, testNodeMonitorPeriod, "")
|
||||||
result, err := nodeController.PopulateAddresses(item.nodes)
|
result, err := nodeController.populateAddresses(item.nodes)
|
||||||
// In case of IP querying error, we should continue.
|
// In case of IP querying error, we should continue.
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
@ -887,14 +887,14 @@ func TestMonitorNodeStatusEvictPods(t *testing.T) {
|
|||||||
evictionTimeout, util.NewFakeRateLimiter(), testNodeMonitorGracePeriod,
|
evictionTimeout, util.NewFakeRateLimiter(), testNodeMonitorGracePeriod,
|
||||||
testNodeStartupGracePeriod, testNodeMonitorPeriod, "")
|
testNodeStartupGracePeriod, testNodeMonitorPeriod, "")
|
||||||
nodeController.now = func() util.Time { return fakeNow }
|
nodeController.now = func() util.Time { return fakeNow }
|
||||||
if err := nodeController.MonitorNodeStatus(); err != nil {
|
if err := nodeController.monitorNodeStatus(); err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
if item.timeToPass > 0 {
|
if item.timeToPass > 0 {
|
||||||
nodeController.now = func() util.Time { return util.Time{Time: fakeNow.Add(item.timeToPass)} }
|
nodeController.now = func() util.Time { return util.Time{Time: fakeNow.Add(item.timeToPass)} }
|
||||||
item.fakeNodeHandler.Existing[0].Status = item.newNodeStatus
|
item.fakeNodeHandler.Existing[0].Status = item.newNodeStatus
|
||||||
}
|
}
|
||||||
if err := nodeController.MonitorNodeStatus(); err != nil {
|
if err := nodeController.monitorNodeStatus(); err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
podEvicted := false
|
podEvicted := false
|
||||||
@ -1089,13 +1089,13 @@ func TestMonitorNodeStatusUpdateStatus(t *testing.T) {
|
|||||||
nodeController := NewNodeController(nil, "", []string{"node0"}, nil, item.fakeNodeHandler, 10, 5*time.Minute, util.NewFakeRateLimiter(),
|
nodeController := NewNodeController(nil, "", []string{"node0"}, nil, item.fakeNodeHandler, 10, 5*time.Minute, util.NewFakeRateLimiter(),
|
||||||
testNodeMonitorGracePeriod, testNodeStartupGracePeriod, testNodeMonitorPeriod, "")
|
testNodeMonitorGracePeriod, testNodeStartupGracePeriod, testNodeMonitorPeriod, "")
|
||||||
nodeController.now = func() util.Time { return fakeNow }
|
nodeController.now = func() util.Time { return fakeNow }
|
||||||
if err := nodeController.MonitorNodeStatus(); err != nil {
|
if err := nodeController.monitorNodeStatus(); err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
if item.timeToPass > 0 {
|
if item.timeToPass > 0 {
|
||||||
nodeController.now = func() util.Time { return util.Time{Time: fakeNow.Add(item.timeToPass)} }
|
nodeController.now = func() util.Time { return util.Time{Time: fakeNow.Add(item.timeToPass)} }
|
||||||
item.fakeNodeHandler.Existing[0].Status = item.newNodeStatus
|
item.fakeNodeHandler.Existing[0].Status = item.newNodeStatus
|
||||||
if err := nodeController.MonitorNodeStatus(); err != nil {
|
if err := nodeController.monitorNodeStatus(); err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -39,8 +39,7 @@ var providers = make(map[string]Factory)
|
|||||||
func RegisterCloudProvider(name string, cloud Factory) {
|
func RegisterCloudProvider(name string, cloud Factory) {
|
||||||
providersMutex.Lock()
|
providersMutex.Lock()
|
||||||
defer providersMutex.Unlock()
|
defer providersMutex.Unlock()
|
||||||
_, found := providers[name]
|
if _, found := providers[name]; found {
|
||||||
if found {
|
|
||||||
glog.Fatalf("Cloud provider %q was registered twice", name)
|
glog.Fatalf("Cloud provider %q was registered twice", name)
|
||||||
}
|
}
|
||||||
glog.V(1).Infof("Registered cloud provider %q", name)
|
glog.V(1).Infof("Registered cloud provider %q", name)
|
||||||
|
Loading…
Reference in New Issue
Block a user