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