31 |
31 |
from ganeti import opcodes
|
32 |
32 |
from ganeti import utils
|
33 |
33 |
from ganeti import constants
|
34 |
|
from ganeti import compat
|
35 |
34 |
from ganeti import errors
|
36 |
35 |
from ganeti import netutils
|
37 |
36 |
|
... | ... | |
60 |
59 |
]
|
61 |
60 |
|
62 |
61 |
|
63 |
|
#: headers (and full field list) for L{ListNodes}
|
64 |
|
_LIST_HEADERS = {
|
65 |
|
"name": "Node", "pinst_cnt": "Pinst", "sinst_cnt": "Sinst",
|
66 |
|
"pinst_list": "PriInstances", "sinst_list": "SecInstances",
|
67 |
|
"pip": "PrimaryIP", "sip": "SecondaryIP",
|
68 |
|
"dtotal": "DTotal", "dfree": "DFree",
|
69 |
|
"mtotal": "MTotal", "mnode": "MNode", "mfree": "MFree",
|
70 |
|
"bootid": "BootID",
|
71 |
|
"ctotal": "CTotal", "cnodes": "CNodes", "csockets": "CSockets",
|
72 |
|
"tags": "Tags",
|
73 |
|
"serial_no": "SerialNo",
|
74 |
|
"master_candidate": "MasterC",
|
75 |
|
"master": "IsMaster",
|
76 |
|
"offline": "Offline", "drained": "Drained",
|
77 |
|
"role": "Role",
|
78 |
|
"ctime": "CTime", "mtime": "MTime", "uuid": "UUID",
|
79 |
|
"master_capable": "MasterCapable", "vm_capable": "VMCapable",
|
80 |
|
"group": "Group", "group.uuid": "GroupUUID",
|
81 |
|
}
|
82 |
|
|
83 |
|
|
84 |
62 |
#: headers (and full field list) for L{ListStorage}
|
85 |
63 |
_LIST_STOR_HEADERS = {
|
86 |
64 |
constants.SF_NODE: "Node",
|
... | ... | |
232 |
210 |
"""
|
233 |
211 |
selected_fields = ParseFields(opts.output, _LIST_DEF_FIELDS)
|
234 |
212 |
|
235 |
|
output = GetClient().QueryNodes(args, selected_fields, opts.do_locking)
|
|
213 |
fmtoverride = dict.fromkeys(["pinst_list", "sinst_list", "tags"],
|
|
214 |
(lambda value: ",".join(value), False))
|
236 |
215 |
|
237 |
|
if not opts.no_headers:
|
238 |
|
headers = _LIST_HEADERS
|
239 |
|
else:
|
240 |
|
headers = None
|
|
216 |
return GenericList(constants.QR_NODE, selected_fields, args, opts.units,
|
|
217 |
opts.separator, not opts.no_headers,
|
|
218 |
format_override=fmtoverride)
|
241 |
219 |
|
242 |
|
unitfields = ["dtotal", "dfree", "mtotal", "mnode", "mfree"]
|
243 |
220 |
|
244 |
|
numfields = ["dtotal", "dfree",
|
245 |
|
"mtotal", "mnode", "mfree",
|
246 |
|
"pinst_cnt", "sinst_cnt",
|
247 |
|
"ctotal", "serial_no"]
|
|
221 |
def ListNodeFields(opts, args):
|
|
222 |
"""List node fields.
|
248 |
223 |
|
249 |
|
list_type_fields = ("pinst_list", "sinst_list", "tags")
|
250 |
|
# change raw values to nicer strings
|
251 |
|
for row in output:
|
252 |
|
for idx, field in enumerate(selected_fields):
|
253 |
|
val = row[idx]
|
254 |
|
if field in list_type_fields:
|
255 |
|
val = ",".join(val)
|
256 |
|
elif field in ('master', 'master_candidate', 'offline', 'drained',
|
257 |
|
'master_capable', 'vm_capable'):
|
258 |
|
if val:
|
259 |
|
val = 'Y'
|
260 |
|
else:
|
261 |
|
val = 'N'
|
262 |
|
elif field == "ctime" or field == "mtime":
|
263 |
|
val = utils.FormatTime(val)
|
264 |
|
elif val is None:
|
265 |
|
val = "?"
|
266 |
|
elif opts.roman_integers and isinstance(val, int):
|
267 |
|
val = compat.TryToRoman(val)
|
268 |
|
row[idx] = str(val)
|
269 |
|
|
270 |
|
data = GenerateTable(separator=opts.separator, headers=headers,
|
271 |
|
fields=selected_fields, unitfields=unitfields,
|
272 |
|
numfields=numfields, data=output, units=opts.units)
|
273 |
|
for line in data:
|
274 |
|
ToStdout(line)
|
|
224 |
@param opts: the command line options selected by the user
|
|
225 |
@type args: list
|
|
226 |
@param args: fields to list, or empty for all
|
|
227 |
@rtype: int
|
|
228 |
@return: the desired exit code
|
275 |
229 |
|
276 |
|
return 0
|
|
230 |
"""
|
|
231 |
return GenericListFields(constants.QR_NODE, args, opts.separator,
|
|
232 |
not opts.no_headers)
|
277 |
233 |
|
278 |
234 |
|
279 |
235 |
def EvacuateNode(opts, args):
|
... | ... | |
716 |
672 |
"[<node_name>...]", "Show information about the node(s)"),
|
717 |
673 |
'list': (
|
718 |
674 |
ListNodes, ARGS_MANY_NODES,
|
719 |
|
[NOHDR_OPT, SEP_OPT, USEUNITS_OPT, FIELDS_OPT, SYNC_OPT, ROMAN_OPT],
|
|
675 |
[NOHDR_OPT, SEP_OPT, USEUNITS_OPT, FIELDS_OPT],
|
720 |
676 |
"[nodes...]",
|
721 |
|
"Lists the nodes in the cluster. The available fields are (see the man"
|
722 |
|
" page for details): %s. The default field list is (in order): %s." %
|
723 |
|
(utils.CommaJoin(_LIST_HEADERS), utils.CommaJoin(_LIST_DEF_FIELDS))),
|
|
677 |
"Lists the nodes in the cluster. The available fields can be shown using"
|
|
678 |
" the \"list-fields\" command (see the man page for details)."
|
|
679 |
" The default field list is (in order): %s." %
|
|
680 |
utils.CommaJoin(_LIST_DEF_FIELDS)),
|
|
681 |
"list-fields": (
|
|
682 |
ListNodeFields, [ArgUnknown()],
|
|
683 |
[NOHDR_OPT, SEP_OPT],
|
|
684 |
"[fields...]",
|
|
685 |
"Lists all available fields for nodes"),
|
724 |
686 |
'modify': (
|
725 |
687 |
SetNodeParams, ARGS_ONE_NODE,
|
726 |
688 |
[FORCE_OPT, SUBMIT_OPT, MC_OPT, DRAINED_OPT, OFFLINE_OPT,
|