Revision a8ae3eb5 lib/cmdlib.py
b/lib/cmdlib.py | ||
---|---|---|
2202 | 2202 |
" based ping to noded port") |
2203 | 2203 |
|
2204 | 2204 |
cp_size = self.cfg.GetClusterInfo().candidate_pool_size |
2205 |
mc_now, _ = self.cfg.GetMasterCandidateStats() |
|
2206 |
master_candidate = mc_now < cp_size |
|
2205 |
if self.op.readd: |
|
2206 |
exceptions = [node] |
|
2207 |
else: |
|
2208 |
exceptions = [] |
|
2209 |
mc_now, mc_max = self.cfg.GetMasterCandidateStats(exceptions) |
|
2210 |
# the new node will increase mc_max with one, so: |
|
2211 |
mc_max = min(mc_max + 1, cp_size) |
|
2212 |
self.master_candidate = mc_now < mc_max |
|
2207 | 2213 |
|
2208 |
self.new_node = objects.Node(name=node, |
|
2209 |
primary_ip=primary_ip, |
|
2210 |
secondary_ip=secondary_ip, |
|
2211 |
master_candidate=master_candidate, |
|
2212 |
offline=False, drained=False) |
|
2214 |
if self.op.readd: |
|
2215 |
self.new_node = self.cfg.GetNodeInfo(node) |
|
2216 |
assert self.new_node is not None, "Can't retrieve locked node %s" % node |
|
2217 |
else: |
|
2218 |
self.new_node = objects.Node(name=node, |
|
2219 |
primary_ip=primary_ip, |
|
2220 |
secondary_ip=secondary_ip, |
|
2221 |
master_candidate=self.master_candidate, |
|
2222 |
offline=False, drained=False) |
|
2213 | 2223 |
|
2214 | 2224 |
def Exec(self, feedback_fn): |
2215 | 2225 |
"""Adds the new node to the cluster. |
... | ... | |
2218 | 2228 |
new_node = self.new_node |
2219 | 2229 |
node = new_node.name |
2220 | 2230 |
|
2231 |
# for re-adds, reset the offline/drained/master-candidate flags; |
|
2232 |
# we need to reset here, otherwise offline would prevent RPC calls |
|
2233 |
# later in the procedure; this also means that if the re-add |
|
2234 |
# fails, we are left with a non-offlined, broken node |
|
2235 |
if self.op.readd: |
|
2236 |
new_node.drained = new_node.offline = False |
|
2237 |
self.LogInfo("Readding a node, the offline/drained flags were reset") |
|
2238 |
# if we demote the node, we do cleanup later in the procedure |
|
2239 |
new_node.master_candidate = self.master_candidate |
|
2240 |
|
|
2241 |
# notify the user about any possible mc promotion |
|
2242 |
if new_node.master_candidate: |
|
2243 |
self.LogInfo("Node will be a master candidate") |
|
2244 |
|
|
2221 | 2245 |
# check connectivity |
2222 | 2246 |
result = self.rpc.call_version([node])[node] |
2223 | 2247 |
result.Raise() |
... | ... | |
2313 | 2337 |
|
2314 | 2338 |
if self.op.readd: |
2315 | 2339 |
self.context.ReaddNode(new_node) |
2340 |
# make sure we redistribute the config |
|
2341 |
self.cfg.Update(new_node) |
|
2342 |
# and make sure the new node will not have old files around |
|
2343 |
if not new_node.master_candidate: |
|
2344 |
result = self.rpc.call_node_demote_from_mc(new_node.name) |
|
2345 |
msg = result.RemoteFailMsg() |
|
2346 |
if msg: |
|
2347 |
self.LogWarning("Node failed to demote itself from master" |
|
2348 |
" candidate status: %s" % msg) |
|
2316 | 2349 |
else: |
2317 | 2350 |
self.context.AddNode(new_node) |
2318 | 2351 |
|
Also available in: Unified diff