Statistics
| Branch: | Tag: | Revision:

root / lib / utils / storage.py @ 294254b1

History | View | Annotate | Download (5.9 kB)

1 59ef0f15 Helga Velroyen
#
2 59ef0f15 Helga Velroyen
#
3 59ef0f15 Helga Velroyen
4 59ef0f15 Helga Velroyen
# Copyright (C) 2013 Google Inc.
5 59ef0f15 Helga Velroyen
#
6 59ef0f15 Helga Velroyen
# This program is free software; you can redistribute it and/or modify
7 59ef0f15 Helga Velroyen
# it under the terms of the GNU General Public License as published by
8 59ef0f15 Helga Velroyen
# the Free Software Foundation; either version 2 of the License, or
9 59ef0f15 Helga Velroyen
# (at your option) any later version.
10 59ef0f15 Helga Velroyen
#
11 59ef0f15 Helga Velroyen
# This program is distributed in the hope that it will be useful, but
12 59ef0f15 Helga Velroyen
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 59ef0f15 Helga Velroyen
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 59ef0f15 Helga Velroyen
# General Public License for more details.
15 59ef0f15 Helga Velroyen
#
16 59ef0f15 Helga Velroyen
# You should have received a copy of the GNU General Public License
17 59ef0f15 Helga Velroyen
# along with this program; if not, write to the Free Software
18 59ef0f15 Helga Velroyen
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 59ef0f15 Helga Velroyen
# 02110-1301, USA.
20 59ef0f15 Helga Velroyen
21 59ef0f15 Helga Velroyen
"""Utility functions for storage.
22 59ef0f15 Helga Velroyen

23 59ef0f15 Helga Velroyen
"""
24 59ef0f15 Helga Velroyen
25 683335b3 Helga Velroyen
import logging
26 683335b3 Helga Velroyen
27 59ef0f15 Helga Velroyen
from ganeti import constants
28 59ef0f15 Helga Velroyen
29 59ef0f15 Helga Velroyen
30 59ef0f15 Helga Velroyen
def GetDiskTemplatesOfStorageType(storage_type):
31 59ef0f15 Helga Velroyen
  """Given the storage type, returns a list of disk templates based on that
32 59ef0f15 Helga Velroyen
     storage type."""
33 59ef0f15 Helga Velroyen
  return [dt for dt in constants.DISK_TEMPLATES
34 615551b2 Helga Velroyen
          if constants.MAP_DISK_TEMPLATE_STORAGE_TYPE[dt] == storage_type]
35 59ef0f15 Helga Velroyen
36 59ef0f15 Helga Velroyen
37 59ef0f15 Helga Velroyen
def GetLvmDiskTemplates():
38 59ef0f15 Helga Velroyen
  """Returns all disk templates that use LVM."""
39 59ef0f15 Helga Velroyen
  return GetDiskTemplatesOfStorageType(constants.ST_LVM_VG)
40 59ef0f15 Helga Velroyen
41 59ef0f15 Helga Velroyen
42 ebe93784 Helga Velroyen
def IsDiskTemplateEnabled(disk_template, enabled_disk_templates):
43 ebe93784 Helga Velroyen
  """Checks if a particular disk template is enabled.
44 ebe93784 Helga Velroyen

45 ebe93784 Helga Velroyen
  """
46 ebe93784 Helga Velroyen
  return disk_template in enabled_disk_templates
47 ebe93784 Helga Velroyen
48 ebe93784 Helga Velroyen
49 ebe93784 Helga Velroyen
def IsFileStorageEnabled(enabled_disk_templates):
50 ebe93784 Helga Velroyen
  """Checks if file storage is enabled.
51 ebe93784 Helga Velroyen

52 ebe93784 Helga Velroyen
  """
53 ebe93784 Helga Velroyen
  return IsDiskTemplateEnabled(constants.DT_FILE, enabled_disk_templates)
54 ebe93784 Helga Velroyen
55 ebe93784 Helga Velroyen
56 ebe93784 Helga Velroyen
def IsSharedFileStorageEnabled(enabled_disk_templates):
57 ebe93784 Helga Velroyen
  """Checks if shared file storage is enabled.
58 ebe93784 Helga Velroyen

59 ebe93784 Helga Velroyen
  """
60 ebe93784 Helga Velroyen
  return IsDiskTemplateEnabled(constants.DT_SHARED_FILE, enabled_disk_templates)
61 ebe93784 Helga Velroyen
62 ebe93784 Helga Velroyen
63 59ef0f15 Helga Velroyen
def IsLvmEnabled(enabled_disk_templates):
64 59ef0f15 Helga Velroyen
  """Check whether or not any lvm-based disk templates are enabled."""
65 59ef0f15 Helga Velroyen
  return len(set(GetLvmDiskTemplates())
66 59ef0f15 Helga Velroyen
             .intersection(set(enabled_disk_templates))) != 0
67 59ef0f15 Helga Velroyen
68 59ef0f15 Helga Velroyen
69 59ef0f15 Helga Velroyen
def LvmGetsEnabled(enabled_disk_templates, new_enabled_disk_templates):
70 59ef0f15 Helga Velroyen
  """Checks whether lvm was not enabled before, but will be enabled after
71 59ef0f15 Helga Velroyen
     the operation.
72 59ef0f15 Helga Velroyen

73 59ef0f15 Helga Velroyen
  """
74 59ef0f15 Helga Velroyen
  if IsLvmEnabled(enabled_disk_templates):
75 59ef0f15 Helga Velroyen
    return False
76 59ef0f15 Helga Velroyen
  return set(GetLvmDiskTemplates()).intersection(
77 59ef0f15 Helga Velroyen
      set(new_enabled_disk_templates))
78 683335b3 Helga Velroyen
79 683335b3 Helga Velroyen
80 683335b3 Helga Velroyen
def _GetDefaultStorageUnitForDiskTemplate(cfg, disk_template):
81 683335b3 Helga Velroyen
  """Retrieves the identifier of the default storage entity for the given
82 683335b3 Helga Velroyen
  storage type.
83 683335b3 Helga Velroyen

84 d721894a Helga Velroyen
  @type cfg: C{objects.ConfigData}
85 d721894a Helga Velroyen
  @param cfg: the configuration data
86 683335b3 Helga Velroyen
  @type disk_template: string
87 683335b3 Helga Velroyen
  @param disk_template: a disk template, for example 'drbd'
88 683335b3 Helga Velroyen
  @rtype: string
89 683335b3 Helga Velroyen
  @return: identifier for a storage unit, for example the vg_name for lvm
90 683335b3 Helga Velroyen
     storage
91 683335b3 Helga Velroyen

92 683335b3 Helga Velroyen
  """
93 615551b2 Helga Velroyen
  storage_type = constants.MAP_DISK_TEMPLATE_STORAGE_TYPE[disk_template]
94 d721894a Helga Velroyen
  cluster = cfg.GetClusterInfo()
95 683335b3 Helga Velroyen
  if disk_template in GetLvmDiskTemplates():
96 683335b3 Helga Velroyen
    return (storage_type, cfg.GetVGName())
97 683335b3 Helga Velroyen
  elif disk_template == constants.DT_FILE:
98 d721894a Helga Velroyen
    return (storage_type, cluster.file_storage_dir)
99 683335b3 Helga Velroyen
  elif disk_template == constants.DT_SHARED_FILE:
100 2fe1e043 Helga Velroyen
    return (storage_type, cluster.shared_file_storage_dir)
101 683335b3 Helga Velroyen
  else:
102 683335b3 Helga Velroyen
    return (storage_type, None)
103 683335b3 Helga Velroyen
104 683335b3 Helga Velroyen
105 683335b3 Helga Velroyen
def _GetDefaultStorageUnitForSpindles(cfg):
106 683335b3 Helga Velroyen
  """Creates a 'spindle' storage unit, by retrieving the volume group
107 683335b3 Helga Velroyen
  name and associating it to the lvm-pv storage type.
108 683335b3 Helga Velroyen

109 683335b3 Helga Velroyen
  @rtype: (string, string)
110 683335b3 Helga Velroyen
  @return: tuple (storage_type, storage_key), where storage type is
111 683335b3 Helga Velroyen
    'lvm-pv' and storage_key the name of the default volume group
112 683335b3 Helga Velroyen

113 683335b3 Helga Velroyen
  """
114 683335b3 Helga Velroyen
  return (constants.ST_LVM_PV, cfg.GetVGName())
115 683335b3 Helga Velroyen
116 683335b3 Helga Velroyen
117 683335b3 Helga Velroyen
def GetStorageUnitsOfCluster(cfg, include_spindles=False):
118 683335b3 Helga Velroyen
  """Examines the cluster's configuration and returns a list of storage
119 683335b3 Helga Velroyen
  units and their storage keys, ordered by the order in which they
120 683335b3 Helga Velroyen
  are enabled.
121 683335b3 Helga Velroyen

122 683335b3 Helga Velroyen
  @type cfg: L{config.ConfigWriter}
123 683335b3 Helga Velroyen
  @param cfg: Cluster configuration
124 683335b3 Helga Velroyen
  @type include_spindles: boolean
125 683335b3 Helga Velroyen
  @param include_spindles: flag to include an extra storage unit for physical
126 683335b3 Helga Velroyen
    volumes
127 683335b3 Helga Velroyen
  @rtype: list of tuples (string, string)
128 683335b3 Helga Velroyen
  @return: list of storage units, each storage unit being a tuple of
129 683335b3 Helga Velroyen
    (storage_type, storage_key); storage_type is in
130 d8e55568 Helga Velroyen
    C{constants.STORAGE_TYPES} and the storage_key a string to
131 683335b3 Helga Velroyen
    identify an entity of that storage type, for example a volume group
132 683335b3 Helga Velroyen
    name for LVM storage or a file for file storage.
133 683335b3 Helga Velroyen

134 683335b3 Helga Velroyen
  """
135 683335b3 Helga Velroyen
  cluster_config = cfg.GetClusterInfo()
136 683335b3 Helga Velroyen
  storage_units = []
137 683335b3 Helga Velroyen
  for disk_template in cluster_config.enabled_disk_templates:
138 e1a6abf9 Helga Velroyen
    if constants.MAP_DISK_TEMPLATE_STORAGE_TYPE[disk_template]\
139 f79be8ec Helga Velroyen
        in constants.STS_REPORT:
140 683335b3 Helga Velroyen
      storage_units.append(
141 683335b3 Helga Velroyen
          _GetDefaultStorageUnitForDiskTemplate(cfg, disk_template))
142 683335b3 Helga Velroyen
  if include_spindles:
143 683335b3 Helga Velroyen
    included_storage_types = set([st for (st, _) in storage_units])
144 683335b3 Helga Velroyen
    if not constants.ST_LVM_PV in included_storage_types:
145 683335b3 Helga Velroyen
      storage_units.append(
146 683335b3 Helga Velroyen
          _GetDefaultStorageUnitForSpindles(cfg))
147 683335b3 Helga Velroyen
148 683335b3 Helga Velroyen
  return storage_units
149 683335b3 Helga Velroyen
150 683335b3 Helga Velroyen
151 683335b3 Helga Velroyen
def LookupSpaceInfoByStorageType(storage_space_info, storage_type):
152 683335b3 Helga Velroyen
  """Looks up the storage space info for a given storage type.
153 683335b3 Helga Velroyen

154 683335b3 Helga Velroyen
  Note that this lookup can be ambiguous if storage space reporting for several
155 683335b3 Helga Velroyen
  units of the same storage type was requested. This function is only supposed
156 683335b3 Helga Velroyen
  to be used for legacy code in situations where it actually is unambiguous.
157 683335b3 Helga Velroyen

158 683335b3 Helga Velroyen
  @type storage_space_info: list of dicts
159 683335b3 Helga Velroyen
  @param storage_space_info: result of C{GetNodeInfo}
160 683335b3 Helga Velroyen
  @type storage_type: string
161 683335b3 Helga Velroyen
  @param storage_type: a storage type, which is included in the storage_units
162 683335b3 Helga Velroyen
    list
163 683335b3 Helga Velroyen
  @rtype: tuple
164 683335b3 Helga Velroyen
  @return: returns the element of storage_space_info that matches the given
165 683335b3 Helga Velroyen
    storage type
166 683335b3 Helga Velroyen

167 683335b3 Helga Velroyen
  """
168 683335b3 Helga Velroyen
  result = None
169 683335b3 Helga Velroyen
  for unit_info in storage_space_info:
170 683335b3 Helga Velroyen
    if unit_info["type"] == storage_type:
171 683335b3 Helga Velroyen
      if result is None:
172 683335b3 Helga Velroyen
        result = unit_info
173 683335b3 Helga Velroyen
      else:
174 683335b3 Helga Velroyen
        # There is more than one storage type in the query, log a warning
175 683335b3 Helga Velroyen
        logging.warning("Storage space information requested for"
176 683335b3 Helga Velroyen
                        " ambiguous storage type '%s'.", storage_type)
177 683335b3 Helga Velroyen
  return result