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
65d132a3
Commit
65d132a3
authored
Apr 16, 2015
by
Wojciech Tyczynski
Browse files
Options
Browse Files
Download
Plain Diff
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
parents
1c47f2d7
f633ac0a
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
49 additions
and
51 deletions
+49
-51
nodecontroller.go
pkg/cloudprovider/nodecontroller/nodecontroller.go
+37
-38
nodecontroller_test.go
pkg/cloudprovider/nodecontroller/nodecontroller_test.go
+11
-11
plugins.go
pkg/cloudprovider/plugins.go
+1
-2
No files found.
pkg/cloudprovider/nodecontroller/nodecontroller.go
View file @
65d132a3
...
...
@@ -41,12 +41,10 @@ var (
ErrCloudInstance
=
errors
.
New
(
"cloud provider doesn't support instances."
)
)
const
(
// Constant controlling number of retries of writing NodeStatus update.
nodeStatusUpdateRetry
=
5
)
// nodeStatusUpdateRetry controls the number of retries of writing NodeStatus update.
const
nodeStatusUpdateRetry
=
5
type
N
odeStatusData
struct
{
type
n
odeStatusData
struct
{
probeTimestamp
util
.
Time
readyTransitionTimestamp
util
.
Time
status
api
.
NodeStatus
...
...
@@ -62,10 +60,10 @@ type NodeController struct {
registerRetryCount
int
podEvictionTimeout
time
.
Duration
deletingPodsRateLimiter
util
.
RateLimiter
// per Node map storing last observed Status tog
het
er with a local time when it was observed.
// per Node map storing last observed Status tog
eth
er with a local time when it was observed.
// 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.
nodeStatusMap
map
[
string
]
N
odeStatusData
nodeStatusMap
map
[
string
]
n
odeStatusData
// 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
// it doesn't receive update for this amount of time, it will start posting "NodeReady==
...
...
@@ -128,7 +126,7 @@ func NewNodeController(
registerRetryCount
:
registerRetryCount
,
podEvictionTimeout
:
podEvictionTimeout
,
deletingPodsRateLimiter
:
deletingPodsRateLimiter
,
nodeStatusMap
:
make
(
map
[
string
]
N
odeStatusData
),
nodeStatusMap
:
make
(
map
[
string
]
n
odeStatusData
),
nodeMonitorGracePeriod
:
nodeMonitorGracePeriod
,
nodeMonitorPeriod
:
nodeMonitorPeriod
,
nodeStartupGracePeriod
:
nodeStartupGracePeriod
,
...
...
@@ -140,12 +138,12 @@ func NewNodeController(
// Run creates initial node list and start syncing instances from cloudprovider, if any.
// It also starts syncing or monitoring cluster node status.
// 1.
R
egisterNodes() is called only once to register all initial nodes (from cloudprovider
// 1.
r
egisterNodes() is called only once to register all initial nodes (from cloudprovider
// or from command line flag). To make cluster bootstrap faster, node controller populates
// node addresses.
// 2.
S
yncCloudNodes() is called periodically (if enabled) to sync instances from cloudprovider.
// 2.
s
yncCloudNodes() is called periodically (if enabled) to sync instances from cloudprovider.
// Node created here will only have specs.
// 3.
M
onitorNodeStatus() is called periodically to incorporate the results of node status
// 3.
m
onitorNodeStatus() is called periodically to incorporate the results of node status
// pushed from kubelet to master.
func
(
nc
*
NodeController
)
Run
(
period
time
.
Duration
,
syncNodeList
bool
)
{
// 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
if
nc
.
isRunningCloudProvider
()
{
if
syncNodeList
{
if
nodes
,
err
=
nc
.
G
etCloudNodesWithSpec
();
err
!=
nil
{
if
nodes
,
err
=
nc
.
g
etCloudNodesWithSpec
();
err
!=
nil
{
glog
.
Errorf
(
"Error loading initial node from cloudprovider: %v"
,
err
)
}
}
else
{
nodes
=
&
api
.
NodeList
{}
}
}
else
{
if
nodes
,
err
=
nc
.
G
etStaticNodesWithSpec
();
err
!=
nil
{
if
nodes
,
err
=
nc
.
g
etStaticNodesWithSpec
();
err
!=
nil
{
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
)
}
if
err
=
nc
.
R
egisterNodes
(
nodes
,
nc
.
registerRetryCount
,
period
);
err
!=
nil
{
if
err
:=
nc
.
r
egisterNodes
(
nodes
,
nc
.
registerRetryCount
,
period
);
err
!=
nil
{
glog
.
Errorf
(
"Error registering node list %+v: %v"
,
nodes
,
err
)
}
// Start syncing node list from cloudprovider.
if
syncNodeList
&&
nc
.
isRunningCloudProvider
()
{
go
util
.
Forever
(
func
()
{
if
err
:=
nc
.
S
yncCloudNodes
();
err
!=
nil
{
if
err
:=
nc
.
s
yncCloudNodes
();
err
!=
nil
{
glog
.
Errorf
(
"Error syncing cloud: %v"
,
err
)
}
},
period
)
...
...
@@ -182,14 +181,14 @@ func (nc *NodeController) Run(period time.Duration, syncNodeList bool) {
// Start monitoring node status.
go
util
.
Forever
(
func
()
{
if
err
=
nc
.
M
onitorNodeStatus
();
err
!=
nil
{
if
err
:=
nc
.
m
onitorNodeStatus
();
err
!=
nil
{
glog
.
Errorf
(
"Error monitoring node status: %v"
,
err
)
}
},
nc
.
nodeMonitorPeriod
)
}
//
R
egisterNodes registers the given list of nodes, it keeps retrying for `retryCount` times.
func
(
nc
*
NodeController
)
R
egisterNodes
(
nodes
*
api
.
NodeList
,
retryCount
int
,
retryInterval
time
.
Duration
)
error
{
//
r
egisterNodes registers the given list of nodes, it keeps retrying for `retryCount` times.
func
(
nc
*
NodeController
)
r
egisterNodes
(
nodes
*
api
.
NodeList
,
retryCount
int
,
retryInterval
time
.
Duration
)
error
{
if
len
(
nodes
.
Items
)
==
0
{
return
nil
}
...
...
@@ -278,9 +277,9 @@ func (nc *NodeController) reconcileExternalServices(nodes *api.NodeList) (should
return
shouldRetry
}
//
S
yncCloudNodes synchronizes the list of instances from cloudprovider to master server.
func
(
nc
*
NodeController
)
S
yncCloudNodes
()
error
{
matches
,
err
:=
nc
.
G
etCloudNodesWithSpec
()
//
s
yncCloudNodes synchronizes the list of instances from cloudprovider to master server.
func
(
nc
*
NodeController
)
s
yncCloudNodes
()
error
{
matches
,
err
:=
nc
.
g
etCloudNodesWithSpec
()
if
err
!=
nil
{
return
err
}
...
...
@@ -302,7 +301,7 @@ func (nc *NodeController) SyncCloudNodes() error {
glog
.
V
(
3
)
.
Infof
(
"Querying addresses for new node: %s"
,
node
.
Name
)
nodeList
:=
&
api
.
NodeList
{}
nodeList
.
Items
=
[]
api
.
Node
{
node
}
_
,
err
=
nc
.
P
opulateAddresses
(
nodeList
)
_
,
err
=
nc
.
p
opulateAddresses
(
nodeList
)
if
err
!=
nil
{
glog
.
Errorf
(
"Error fetching addresses for new node %s: %v"
,
node
.
Name
,
err
)
continue
...
...
@@ -341,8 +340,8 @@ func (nc *NodeController) SyncCloudNodes() error {
return
nil
}
//
P
opulateAddresses queries Address for given list of nodes.
func
(
nc
*
NodeController
)
P
opulateAddresses
(
nodes
*
api
.
NodeList
)
(
*
api
.
NodeList
,
error
)
{
//
p
opulateAddresses queries Address for given list of nodes.
func
(
nc
*
NodeController
)
p
opulateAddresses
(
nodes
*
api
.
NodeList
)
(
*
api
.
NodeList
,
error
)
{
if
nc
.
isRunningCloudProvider
()
{
instances
,
ok
:=
nc
.
cloud
.
Instances
()
if
!
ok
{
...
...
@@ -411,7 +410,7 @@ func (nc *NodeController) tryUpdateNodeStatus(node *api.Node) (time.Duration, ap
LastTransitionTime
:
node
.
CreationTimestamp
,
}
gracePeriod
=
nc
.
nodeStartupGracePeriod
nc
.
nodeStatusMap
[
node
.
Name
]
=
N
odeStatusData
{
nc
.
nodeStatusMap
[
node
.
Name
]
=
n
odeStatusData
{
status
:
node
.
Status
,
probeTimestamp
:
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
)
if
!
found
{
glog
.
Warningf
(
"Missing timestamp for Node %s. Assuming now as a timestamp."
,
node
.
Name
)
savedNodeStatus
=
N
odeStatusData
{
savedNodeStatus
=
n
odeStatusData
{
status
:
node
.
Status
,
probeTimestamp
:
nc
.
now
(),
readyTransitionTimestamp
:
nc
.
now
(),
...
...
@@ -449,7 +448,7 @@ func (nc *NodeController) tryUpdateNodeStatus(node *api.Node) (time.Duration, ap
nc
.
nodeStatusMap
[
node
.
Name
]
=
savedNodeStatus
}
else
if
savedCondition
==
nil
&&
observedCondition
!=
nil
{
glog
.
V
(
1
)
.
Infof
(
"Creating timestamp entry for newly observed Node %s"
,
node
.
Name
)
savedNodeStatus
=
N
odeStatusData
{
savedNodeStatus
=
n
odeStatusData
{
status
:
node
.
Status
,
probeTimestamp
:
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
{
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.
savedNodeStatus
=
N
odeStatusData
{
savedNodeStatus
=
n
odeStatusData
{
status
:
node
.
Status
,
probeTimestamp
:
nc
.
now
(),
readyTransitionTimestamp
:
nc
.
now
(),
...
...
@@ -476,7 +475,7 @@ func (nc *NodeController) tryUpdateNodeStatus(node *api.Node) (time.Duration, ap
transitionTime
=
savedNodeStatus
.
readyTransitionTimestamp
}
glog
.
V
(
3
)
.
Infof
(
"Nodes ReadyCondition updated. Updating timestamp: %+v
\n
vs %+v."
,
savedNodeStatus
.
status
,
node
.
Status
)
savedNodeStatus
=
N
odeStatusData
{
savedNodeStatus
=
n
odeStatusData
{
status
:
node
.
Status
,
probeTimestamp
:
nc
.
now
(),
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
)
return
gracePeriod
,
lastReadyCondition
,
readyCondition
,
err
}
else
{
nc
.
nodeStatusMap
[
node
.
Name
]
=
N
odeStatusData
{
nc
.
nodeStatusMap
[
node
.
Name
]
=
n
odeStatusData
{
status
:
node
.
Status
,
probeTimestamp
:
nc
.
nodeStatusMap
[
node
.
Name
]
.
probeTimestamp
,
readyTransitionTimestamp
:
nc
.
now
(),
...
...
@@ -525,10 +524,10 @@ func (nc *NodeController) tryUpdateNodeStatus(node *api.Node) (time.Duration, ap
return
gracePeriod
,
lastReadyCondition
,
readyCondition
,
err
}
//
M
onitorNodeStatus verifies node status are constantly updated by kubelet, and if not,
//
m
onitorNodeStatus 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
// not reachable for a long period of time.
func
(
nc
*
NodeController
)
M
onitorNodeStatus
()
error
{
func
(
nc
*
NodeController
)
m
onitorNodeStatus
()
error
{
nodes
,
err
:=
nc
.
kubeClient
.
Nodes
()
.
List
(
labels
.
Everything
(),
fields
.
Everything
())
if
err
!=
nil
{
return
err
...
...
@@ -592,10 +591,10 @@ func (nc *NodeController) MonitorNodeStatus() error {
return
nil
}
//
G
etStaticNodesWithSpec constructs and returns api.NodeList for static nodes. If error
//
g
etStaticNodesWithSpec 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
// constructs spec fields for nodes.
func
(
nc
*
NodeController
)
G
etStaticNodesWithSpec
()
(
*
api
.
NodeList
,
error
)
{
func
(
nc
*
NodeController
)
g
etStaticNodesWithSpec
()
(
*
api
.
NodeList
,
error
)
{
result
:=
&
api
.
NodeList
{}
for
_
,
nodeID
:=
range
nc
.
nodes
{
node
:=
api
.
Node
{
...
...
@@ -612,10 +611,10 @@ func (nc *NodeController) GetStaticNodesWithSpec() (*api.NodeList, error) {
return
result
,
nil
}
//
G
etCloudNodesWithSpec constructs and returns api.NodeList from cloudprovider. If error
//
g
etCloudNodesWithSpec 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
// constructs spec fields for nodes.
func
(
nc
*
NodeController
)
G
etCloudNodesWithSpec
()
(
*
api
.
NodeList
,
error
)
{
func
(
nc
*
NodeController
)
g
etCloudNodesWithSpec
()
(
*
api
.
NodeList
,
error
)
{
result
:=
&
api
.
NodeList
{}
instances
,
ok
:=
nc
.
cloud
.
Instances
()
if
!
ok
{
...
...
@@ -640,7 +639,7 @@ func (nc *NodeController) GetCloudNodesWithSpec() (*api.NodeList, error) {
}
instanceID
,
err
:=
instances
.
ExternalID
(
node
.
Name
)
if
err
!=
nil
{
glog
.
Errorf
(
"
e
rror getting instance id for %s: %v"
,
node
.
Name
,
err
)
glog
.
Errorf
(
"
E
rror getting instance id for %s: %v"
,
node
.
Name
,
err
)
}
else
{
node
.
Spec
.
ExternalID
=
instanceID
}
...
...
pkg/cloudprovider/nodecontroller/nodecontroller_test.go
View file @
65d132a3
...
...
@@ -239,7 +239,7 @@ func TestRegisterNodes(t *testing.T) {
}
nodeController
:=
NewNodeController
(
nil
,
""
,
item
.
machines
,
&
api
.
NodeResources
{},
item
.
fakeNodeHandler
,
10
,
time
.
Minute
,
util
.
NewFakeRateLimiter
(),
testNodeMonitorGracePeriod
,
testNodeStartupGracePeriod
,
testNodeMonitorPeriod
,
""
)
err
:=
nodeController
.
R
egisterNodes
(
&
nodes
,
item
.
retryCount
,
time
.
Millisecond
)
err
:=
nodeController
.
r
egisterNodes
(
&
nodes
,
item
.
retryCount
,
time
.
Millisecond
)
if
!
item
.
expectedFail
&&
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
}
...
...
@@ -325,7 +325,7 @@ func TestCreateGetStaticNodesWithSpec(t *testing.T) {
for
_
,
item
:=
range
table
{
nodeController
:=
NewNodeController
(
nil
,
""
,
item
.
machines
,
&
resources
,
nil
,
10
,
time
.
Minute
,
util
.
NewFakeRateLimiter
(),
testNodeMonitorGracePeriod
,
testNodeStartupGracePeriod
,
testNodeMonitorPeriod
,
""
)
nodes
,
err
:=
nodeController
.
G
etStaticNodesWithSpec
()
nodes
,
err
:=
nodeController
.
g
etStaticNodesWithSpec
()
if
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
}
...
...
@@ -387,7 +387,7 @@ func TestCreateGetCloudNodesWithSpec(t *testing.T) {
for
_
,
item
:=
range
table
{
nodeController
:=
NewNodeController
(
item
.
fakeCloud
,
".*"
,
nil
,
&
api
.
NodeResources
{},
nil
,
10
,
time
.
Minute
,
util
.
NewFakeRateLimiter
(),
testNodeMonitorGracePeriod
,
testNodeStartupGracePeriod
,
testNodeMonitorPeriod
,
""
)
nodes
,
err
:=
nodeController
.
G
etCloudNodesWithSpec
()
nodes
,
err
:=
nodeController
.
g
etCloudNodesWithSpec
()
if
err
!=
nil
{
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
,
util
.
NewFakeRateLimiter
(),
testNodeMonitorGracePeriod
,
testNodeStartupGracePeriod
,
testNodeMonitorPeriod
,
""
)
if
err
:=
nodeController
.
S
yncCloudNodes
();
err
!=
nil
{
if
err
:=
nodeController
.
s
yncCloudNodes
();
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
}
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
,
util
.
NewFakeRateLimiter
(),
testNodeMonitorGracePeriod
,
testNodeStartupGracePeriod
,
testNodeMonitorPeriod
,
""
)
if
err
:=
nodeController
.
S
yncCloudNodes
();
err
!=
nil
{
if
err
:=
nodeController
.
s
yncCloudNodes
();
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
}
if
item
.
fakeNodeHandler
.
RequestCount
!=
item
.
expectedRequestCount
{
...
...
@@ -650,7 +650,7 @@ func TestSyncCloudNodesReconcilesExternalService(t *testing.T) {
for
_
,
item
:=
range
table
{
nodeController
:=
NewNodeController
(
item
.
fakeCloud
,
item
.
matchRE
,
nil
,
&
api
.
NodeResources
{},
item
.
fakeNodeHandler
,
10
,
time
.
Minute
,
util
.
NewFakeRateLimiter
(),
testNodeMonitorGracePeriod
,
testNodeStartupGracePeriod
,
testNodeMonitorPeriod
,
"kubernetes"
)
if
err
:=
nodeController
.
S
yncCloudNodes
();
err
!=
nil
{
if
err
:=
nodeController
.
s
yncCloudNodes
();
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
}
if
!
reflect
.
DeepEqual
(
item
.
expectedClientActions
,
item
.
fakeNodeHandler
.
Actions
)
{
...
...
@@ -686,7 +686,7 @@ func TestPopulateNodeAddresses(t *testing.T) {
for
_
,
item
:=
range
table
{
nodeController
:=
NewNodeController
(
item
.
fakeCloud
,
".*"
,
nil
,
nil
,
nil
,
10
,
time
.
Minute
,
util
.
NewFakeRateLimiter
(),
testNodeMonitorGracePeriod
,
testNodeStartupGracePeriod
,
testNodeMonitorPeriod
,
""
)
result
,
err
:=
nodeController
.
P
opulateAddresses
(
item
.
nodes
)
result
,
err
:=
nodeController
.
p
opulateAddresses
(
item
.
nodes
)
// In case of IP querying error, we should continue.
if
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
...
...
@@ -887,14 +887,14 @@ func TestMonitorNodeStatusEvictPods(t *testing.T) {
evictionTimeout
,
util
.
NewFakeRateLimiter
(),
testNodeMonitorGracePeriod
,
testNodeStartupGracePeriod
,
testNodeMonitorPeriod
,
""
)
nodeController
.
now
=
func
()
util
.
Time
{
return
fakeNow
}
if
err
:=
nodeController
.
M
onitorNodeStatus
();
err
!=
nil
{
if
err
:=
nodeController
.
m
onitorNodeStatus
();
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
}
if
item
.
timeToPass
>
0
{
nodeController
.
now
=
func
()
util
.
Time
{
return
util
.
Time
{
Time
:
fakeNow
.
Add
(
item
.
timeToPass
)}
}
item
.
fakeNodeHandler
.
Existing
[
0
]
.
Status
=
item
.
newNodeStatus
}
if
err
:=
nodeController
.
M
onitorNodeStatus
();
err
!=
nil
{
if
err
:=
nodeController
.
m
onitorNodeStatus
();
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
}
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
(),
testNodeMonitorGracePeriod
,
testNodeStartupGracePeriod
,
testNodeMonitorPeriod
,
""
)
nodeController
.
now
=
func
()
util
.
Time
{
return
fakeNow
}
if
err
:=
nodeController
.
M
onitorNodeStatus
();
err
!=
nil
{
if
err
:=
nodeController
.
m
onitorNodeStatus
();
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
}
if
item
.
timeToPass
>
0
{
nodeController
.
now
=
func
()
util
.
Time
{
return
util
.
Time
{
Time
:
fakeNow
.
Add
(
item
.
timeToPass
)}
}
item
.
fakeNodeHandler
.
Existing
[
0
]
.
Status
=
item
.
newNodeStatus
if
err
:=
nodeController
.
M
onitorNodeStatus
();
err
!=
nil
{
if
err
:=
nodeController
.
m
onitorNodeStatus
();
err
!=
nil
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
}
}
...
...
pkg/cloudprovider/plugins.go
View file @
65d132a3
...
...
@@ -39,8 +39,7 @@ var providers = make(map[string]Factory)
func
RegisterCloudProvider
(
name
string
,
cloud
Factory
)
{
providersMutex
.
Lock
()
defer
providersMutex
.
Unlock
()
_
,
found
:=
providers
[
name
]
if
found
{
if
_
,
found
:=
providers
[
name
];
found
{
glog
.
Fatalf
(
"Cloud provider %q was registered twice"
,
name
)
}
glog
.
V
(
1
)
.
Infof
(
"Registered cloud provider %q"
,
name
)
...
...
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