Revision b07a9f05

b/scripts/gnt-os
66 66

  
67 67
  return 0
68 68

  
69
def _DiagnoseOSValid(obj):
70
  """Verify whether an OS diagnose object represents a valid OS
71

  
72
    Args:
73
      obj: an diagnostic object as returned by OpDiagnoseOS
74

  
75
    Returns:
76
      bool: OS validity status
77
  """
78

  
79
  if isinstance(obj, objects.OS):
80
    return True
81
  elif isinstance(obj, errors.InvalidOS):
82
    return False
83
  else:
84
    raise errors.ProgrammerError('unknown OS diagnose type')
85

  
86
def _DiagnoseOSStatus(obj):
87
  """Generate a status message for an OS diagnose object.
88

  
89
    Args:
90
      obj: an diagnostic object as returned by OpDiagnoseOS
91

  
92
    Returns:
93
      string: a description of the OS status
94
  """
95

  
96
  if _DiagnoseOSValid(obj):
97
    return "valid (path: %s)" % obj.path
98
  else:
99
    return "%s (path: %s)" % (obj.args[2], obj.args[1])
100

  
69 101
def DiagnoseOS(opts, args):
70 102
  """Analyse all OSes on this cluster.
71 103

  
......
106 138
                            'Details'))
107 139

  
108 140
  for os_name in all_os:
109
    nodes_valid = []
141
    nodes_valid = {}
110 142
    nodes_bad = {}
111 143
    for node_name in node_data:
112 144
      if node_name in all_os[os_name]:
113
       nos = all_os[os_name][node_name]
114
       if isinstance(nos[0], objects.OS):
115
         nodes_valid.append(node_name)
116
       elif isinstance(nos[0], errors.InvalidOS):
117
         nodes_bad[node_name] = ("%s (path: %s)" %
118
                                 (nos[0].args[2], nos[0].args[1]))
145
        first_os = all_os[os_name][node_name].pop(0)
146
        first_os_status = _DiagnoseOSStatus(first_os)
147
        if _DiagnoseOSValid(first_os):
148
          nodes_valid[node_name] = first_os_status
149
        else:
150
          nodes_bad[node_name] = first_os_status
119 151
      else:
120
        nodes_bad[node_name] = "os dir not found"
152
        nodes_bad[node_name] = "OS not found"
121 153

  
122 154
    if nodes_valid and not nodes_bad:
123 155
      status = "valid"
......
126 158
    else:
127 159
      status = "partial valid"
128 160

  
161
    def _OutputNodeHiddenOSStatus(dobj_list):
162
      for dobj in dobj_list:
163
        logger.ToStdout(format % (max_name, "", max_node, "",
164
                                  "[hidden] %s" %
165
                                  _DiagnoseOSStatus(dobj)))
166

  
167
    def _OutputPerNodeOSStatus(status_map):
168
      map_k = utils.NiceSort(status_map.keys())
169
      for node_name in map_k:
170
        logger.ToStdout(format % (max_name, "", max_node,
171
                                  node_name, status_map[node_name]))
172
        if node_name in all_os[os_name]:
173
          _OutputNodeHiddenOSStatus(all_os[os_name][node_name])
174

  
129 175
    logger.ToStdout(format % (max_name, os_name, max_node, status, ""))
130
    nodes_valid = utils.NiceSort(nodes_valid)
131
    for node_name in nodes_valid:
132
      logger.ToStdout(format % (max_name, "", max_node, node_name,
133
                      "valid (path: %s)" % all_os[os_name][node_name][0].path))
134
    nbk = utils.NiceSort(nodes_bad.keys())
135
    for node_name in nbk:
136
      logger.ToStdout(format % (max_name, "", max_node,
137
                                node_name, nodes_bad[node_name]))
176
    _OutputPerNodeOSStatus(nodes_valid)
177
    _OutputPerNodeOSStatus(nodes_bad)
138 178

  
139 179

  
140 180
commands = {

Also available in: Unified diff