Revision 5d28cb6f
b/lib/cmdlib.py | ||
---|---|---|
3868 | 3868 |
"""Computes the list of instances and their attributes. |
3869 | 3869 |
|
3870 | 3870 |
""" |
3871 |
cluster = lu.cfg.GetClusterInfo() |
|
3871 | 3872 |
all_info = lu.cfg.GetAllInstancesInfo() |
3872 | 3873 |
|
3873 | 3874 |
instance_names = self._GetNames(lu, all_info.keys(), locking.LEVEL_INSTANCE) |
... | ... | |
3881 | 3882 |
wrongnode_inst = set() |
3882 | 3883 |
|
3883 | 3884 |
# Gather data as requested |
3884 |
if query.IQ_LIVE in self.requested_data:
|
|
3885 |
if self.requested_data & set([query.IQ_LIVE, query.IQ_CONSOLE]):
|
|
3885 | 3886 |
live_data = {} |
3886 | 3887 |
node_data = lu.rpc.call_all_instances_info(nodes, hv_list) |
3887 | 3888 |
for name in nodes: |
... | ... | |
3911 | 3912 |
else: |
3912 | 3913 |
disk_usage = None |
3913 | 3914 |
|
3915 |
if query.IQ_CONSOLE in self.requested_data: |
|
3916 |
consinfo = {} |
|
3917 |
for inst in instance_list: |
|
3918 |
if inst.name in live_data: |
|
3919 |
# Instance is running |
|
3920 |
consinfo[inst.name] = _GetInstanceConsole(cluster, inst) |
|
3921 |
else: |
|
3922 |
consinfo[inst.name] = None |
|
3923 |
assert set(consinfo.keys()) == set(instance_names) |
|
3924 |
else: |
|
3925 |
consinfo = None |
|
3926 |
|
|
3914 | 3927 |
return query.InstanceQueryData(instance_list, lu.cfg.GetClusterInfo(), |
3915 | 3928 |
disk_usage, offline_nodes, bad_nodes, |
3916 |
live_data, wrongnode_inst) |
|
3929 |
live_data, wrongnode_inst, consinfo)
|
|
3917 | 3930 |
|
3918 | 3931 |
|
3919 | 3932 |
class LUQuery(NoHooksLU): |
... | ... | |
7804 | 7817 |
|
7805 | 7818 |
logging.debug("Connecting to console of %s on %s", instance.name, node) |
7806 | 7819 |
|
7807 |
hyper = hypervisor.GetHypervisor(instance.hypervisor) |
|
7808 |
cluster = self.cfg.GetClusterInfo() |
|
7809 |
# beparams and hvparams are passed separately, to avoid editing the |
|
7810 |
# instance and then saving the defaults in the instance itself. |
|
7811 |
hvparams = cluster.FillHV(instance) |
|
7812 |
beparams = cluster.FillBE(instance) |
|
7813 |
console = hyper.GetInstanceConsole(instance, hvparams, beparams) |
|
7820 |
return _GetInstanceConsole(self.cfg.GetClusterInfo(), instance) |
|
7821 |
|
|
7822 |
|
|
7823 |
def _GetInstanceConsole(cluster, instance): |
|
7824 |
"""Returns console information for an instance. |
|
7825 |
|
|
7826 |
@type cluster: L{objects.Cluster} |
|
7827 |
@type instance: L{objects.Instance} |
|
7828 |
@rtype: dict |
|
7829 |
|
|
7830 |
""" |
|
7831 |
hyper = hypervisor.GetHypervisor(instance.hypervisor) |
|
7832 |
# beparams and hvparams are passed separately, to avoid editing the |
|
7833 |
# instance and then saving the defaults in the instance itself. |
|
7834 |
hvparams = cluster.FillHV(instance) |
|
7835 |
beparams = cluster.FillBE(instance) |
|
7836 |
console = hyper.GetInstanceConsole(instance, hvparams, beparams) |
|
7814 | 7837 |
|
7815 |
assert console.instance == instance.name
|
|
7816 |
assert console.Validate()
|
|
7838 |
assert console.instance == instance.name |
|
7839 |
assert console.Validate() |
|
7817 | 7840 |
|
7818 |
return console.ToDict()
|
|
7841 |
return console.ToDict() |
|
7819 | 7842 |
|
7820 | 7843 |
|
7821 | 7844 |
class LUInstanceReplaceDisks(LogicalUnit): |
b/lib/query.py | ||
---|---|---|
79 | 79 |
|
80 | 80 |
(IQ_CONFIG, |
81 | 81 |
IQ_LIVE, |
82 |
IQ_DISKUSAGE) = range(100, 103) |
|
82 |
IQ_DISKUSAGE, |
|
83 |
IQ_CONSOLE) = range(100, 104) |
|
83 | 84 |
|
84 | 85 |
(LQ_MODE, |
85 | 86 |
LQ_OWNER, |
... | ... | |
664 | 665 |
|
665 | 666 |
""" |
666 | 667 |
def __init__(self, instances, cluster, disk_usage, offline_nodes, bad_nodes, |
667 |
live_data, wrongnode_inst): |
|
668 |
live_data, wrongnode_inst, console):
|
|
668 | 669 |
"""Initializes this class. |
669 | 670 |
|
670 | 671 |
@param instances: List of instance objects |
... | ... | |
679 | 680 |
@param live_data: Per-instance live data |
680 | 681 |
@type wrongnode_inst: set |
681 | 682 |
@param wrongnode_inst: Set of instances running on wrong node(s) |
683 |
@type console: dict; instance name as key |
|
684 |
@param console: Per-instance console information |
|
682 | 685 |
|
683 | 686 |
""" |
684 | 687 |
assert len(set(bad_nodes) & set(offline_nodes)) == len(offline_nodes), \ |
... | ... | |
693 | 696 |
self.bad_nodes = bad_nodes |
694 | 697 |
self.live_data = live_data |
695 | 698 |
self.wrongnode_inst = wrongnode_inst |
699 |
self.console = console |
|
696 | 700 |
|
697 | 701 |
# Used for individual rows |
698 | 702 |
self.inst_hvparams = None |
... | ... | |
991 | 995 |
return usage |
992 | 996 |
|
993 | 997 |
|
998 |
def _GetInstanceConsole(ctx, inst): |
|
999 |
"""Get console information for instance. |
|
1000 |
|
|
1001 |
@type ctx: L{InstanceQueryData} |
|
1002 |
@type inst: L{objects.Instance} |
|
1003 |
@param inst: Instance object |
|
1004 |
|
|
1005 |
""" |
|
1006 |
consinfo = ctx.console[inst.name] |
|
1007 |
|
|
1008 |
if consinfo is None: |
|
1009 |
return _FS_UNAVAIL |
|
1010 |
|
|
1011 |
return consinfo |
|
1012 |
|
|
1013 |
|
|
994 | 1014 |
def _GetInstanceDiskFields(): |
995 | 1015 |
"""Get instance fields involving disks. |
996 | 1016 |
|
... | ... | |
1108 | 1128 |
_GetItemAttr("admin_up")), |
1109 | 1129 |
(_MakeField("tags", "Tags", QFT_OTHER), IQ_CONFIG, |
1110 | 1130 |
lambda ctx, inst: list(inst.GetTags())), |
1131 |
(_MakeField("console", "Console", QFT_OTHER), IQ_CONSOLE, |
|
1132 |
_GetInstanceConsole), |
|
1111 | 1133 |
] |
1112 | 1134 |
|
1113 | 1135 |
# Add simple fields |
b/test/ganeti.query_unittest.py | ||
---|---|---|
539 | 539 |
nics=[objects.NIC(ip="192.0.2.99", nicparams={})]), |
540 | 540 |
] |
541 | 541 |
|
542 |
iqd = query.InstanceQueryData(instances, cluster, None, [], [], {}, set()) |
|
542 |
iqd = query.InstanceQueryData(instances, cluster, None, [], [], {}, |
|
543 |
set(), {}) |
|
543 | 544 |
self.assertEqual(q.Query(iqd), |
544 | 545 |
[[(constants.RS_NORMAL, "inst1"), |
545 | 546 |
(constants.RS_NORMAL, 128), |
... | ... | |
567 | 568 |
|
568 | 569 |
q = self._Create(selected) |
569 | 570 |
self.assertEqual(q.RequestedData(), |
570 |
set([query.IQ_CONFIG, query.IQ_LIVE, query.IQ_DISKUSAGE])) |
|
571 |
set([query.IQ_CONFIG, query.IQ_LIVE, query.IQ_DISKUSAGE, |
|
572 |
query.IQ_CONSOLE])) |
|
571 | 573 |
|
572 | 574 |
cluster = objects.Cluster(cluster_name="testcluster", |
573 | 575 |
hvparams=constants.HVC_DEFAULTS, |
... | ... | |
671 | 673 |
|
672 | 674 |
assert not utils.FindDuplicates(inst.name for inst in instances) |
673 | 675 |
|
676 |
instbyname = dict((inst.name, inst) for inst in instances) |
|
677 |
|
|
674 | 678 |
disk_usage = dict((inst.name, |
675 | 679 |
cmdlib._ComputeDiskSize(inst.disk_template, |
676 | 680 |
[{"size": disk.size} |
... | ... | |
696 | 700 |
} |
697 | 701 |
wrongnode_inst = set("inst2") |
698 | 702 |
|
703 |
consinfo = dict((inst.name, None) for inst in instances) |
|
704 |
consinfo["inst7"] = \ |
|
705 |
objects.InstanceConsole(instance="inst7", kind=constants.CONS_SSH, |
|
706 |
host=instbyname["inst7"].primary_node, |
|
707 |
user=constants.GANETI_RUNAS, |
|
708 |
command=["hostname"]).ToDict() |
|
709 |
|
|
699 | 710 |
iqd = query.InstanceQueryData(instances, cluster, disk_usage, |
700 | 711 |
offline_nodes, bad_nodes, live_data, |
701 |
wrongnode_inst) |
|
712 |
wrongnode_inst, consinfo)
|
|
702 | 713 |
result = q.Query(iqd) |
703 | 714 |
self.assertEqual(len(result), len(instances)) |
704 | 715 |
self.assert_(compat.all(len(row) == len(selected) |
... | ... | |
792 | 803 |
exp = (constants.RS_NORMAL, getattr(inst, field)) |
793 | 804 |
self.assertEqual(row[fieldidx[field]], exp) |
794 | 805 |
|
806 |
self._CheckInstanceConsole(inst, row[fieldidx["console"]]) |
|
807 |
|
|
795 | 808 |
# Ensure all possible status' have been tested |
796 | 809 |
self.assertEqual(tested_status, |
797 | 810 |
set(["ERROR_nodeoffline", "ERROR_nodedown", |
798 | 811 |
"running", "ERROR_up", "ERROR_down", |
799 | 812 |
"ADMIN_down"])) |
800 | 813 |
|
814 |
def _CheckInstanceConsole(self, instance, (status, consdata)): |
|
815 |
if instance.name == "inst7": |
|
816 |
self.assertEqual(status, constants.RS_NORMAL) |
|
817 |
console = objects.InstanceConsole.FromDict(consdata) |
|
818 |
self.assertTrue(console.Validate()) |
|
819 |
self.assertEqual(console.host, instance.primary_node) |
|
820 |
else: |
|
821 |
self.assertEqual(status, constants.RS_UNAVAIL) |
|
822 |
|
|
801 | 823 |
|
802 | 824 |
class TestGroupQuery(unittest.TestCase): |
803 | 825 |
|
Also available in: Unified diff