Revision c450e9b0 scripts/gnt-node

b/scripts/gnt-node
27 27
from ganeti import logger
28 28
from ganeti import utils
29 29
from ganeti import constants
30
from ganeti import errors
30 31

  
31 32

  
32 33
def AddNode(opts, args):
......
93 94
  return 0
94 95

  
95 96

  
97
def FailoverNode(opts, args):
98
  """Failover all primary instance on a node.
99

  
100
  """
101
  force = opts.force
102
  selected_fields = ["name", "pinst_list"]
103

  
104
  op = opcodes.OpQueryNodes(output_fields=selected_fields, names=args)
105
  result = SubmitOpCode(op)
106
  node, pinst = result[0]
107

  
108
  if not pinst:
109
    logger.ToStderr("No primary instances on node %s, exiting." % node)
110
    return 0
111

  
112
  pinst = utils.NiceSort(pinst)
113

  
114
  retcode = 0
115

  
116
  if not force and not AskUser("Fail over instance(s) %s?" %
117
                               (",".join("'%s'" % name for name in pinst))):
118
    return 2
119

  
120
  good_cnt = bad_cnt = 0
121
  for iname in pinst:
122
    op = opcodes.OpFailoverInstance(instance_name=iname,
123
                                    ignore_consistency=opts.ignore_consistency)
124
    try:
125
      logger.ToStdout("Failing over instance %s" % iname)
126
      SubmitOpCode(op)
127
      logger.ToStdout("Instance %s has been failed over" % iname)
128
      good_cnt += 1
129
    except errors.GenericError, err:
130
      nret, msg = FormatError(err)
131
      retcode |= nret
132
      logger.ToStderr("Error failing over instance %s: %s" % (iname, msg))
133
      bad_cnt += 1
134

  
135
  if retcode == 0:
136
    logger.ToStdout("All %d instance(s) failed over successfully." % good_cnt)
137
  else:
138
    logger.ToStdout("There were errors during the failover:\n"
139
                    "%d error(s) out of %d instance(s)." %
140
                    (bad_cnt, good_cnt + bad_cnt))
141
  return retcode
142

  
143

  
96 144
def ShowNodeConfig(opts, args):
97 145
  """Show node information.
98 146

  
......
172 220
                       help="Specify the secondary ip for the node",
173 221
                       metavar="ADDRESS", default=None),],
174 222
          "<node_name>", "Add a node to the cluster"),
223
  'failover': (FailoverNode, ARGS_ONE,
224
               [DEBUG_OPT, FORCE_OPT,
225
                make_option("--ignore-consistency", dest="ignore_consistency",
226
                            action="store_true", default=False,
227
                            help="Ignore the consistency of the disks on"
228
                            " the secondary"),
229
                ],
230
               "[-f] <node>",
231
               "Stops the primary instances on a node and start them on their"
232
               " secondary node (only for instances of type remote_raid1)"),
175 233
  'info': (ShowNodeConfig, ARGS_ANY, [DEBUG_OPT],
176 234
           "[<node_name>...]", "Show information about the node(s)"),
177 235
  'list': (ListNodes, ARGS_NONE,

Also available in: Unified diff