Statistics
| Branch: | Tag: | Revision:

root / lib / utils / storage.py @ adec726e

History | View | Annotate | Download (5.9 kB)

1
#
2
#
3

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

    
21
"""Utility functions for storage.
22

23
"""
24

    
25
import logging
26

    
27
from ganeti import constants
28

    
29

    
30
def GetDiskTemplatesOfStorageTypes(*storage_types):
31
  """Given the storage type, returns a list of disk templates based on that
32
     storage type."""
33
  return [dt for dt in constants.DISK_TEMPLATES
34
          if constants.MAP_DISK_TEMPLATE_STORAGE_TYPE[dt] in storage_types]
35

    
36

    
37
def IsDiskTemplateEnabled(disk_template, enabled_disk_templates):
38
  """Checks if a particular disk template is enabled.
39

40
  """
41
  return disk_template in enabled_disk_templates
42

    
43

    
44
def IsFileStorageEnabled(enabled_disk_templates):
45
  """Checks if file storage is enabled.
46

47
  """
48
  return IsDiskTemplateEnabled(constants.DT_FILE, enabled_disk_templates)
49

    
50

    
51
def IsSharedFileStorageEnabled(enabled_disk_templates):
52
  """Checks if shared file storage is enabled.
53

54
  """
55
  return IsDiskTemplateEnabled(constants.DT_SHARED_FILE, enabled_disk_templates)
56

    
57

    
58
def IsLvmEnabled(enabled_disk_templates):
59
  """Check whether or not any lvm-based disk templates are enabled."""
60
  return len(constants.DTS_LVM & set(enabled_disk_templates)) != 0
61

    
62

    
63
def LvmGetsEnabled(enabled_disk_templates, new_enabled_disk_templates):
64
  """Checks whether lvm was not enabled before, but will be enabled after
65
     the operation.
66

67
  """
68
  if IsLvmEnabled(enabled_disk_templates):
69
    return False
70
  return len(constants.DTS_LVM & set(new_enabled_disk_templates)) != 0
71

    
72

    
73
def _GetDefaultStorageUnitForDiskTemplate(cfg, disk_template):
74
  """Retrieves the identifier of the default storage entity for the given
75
  storage type.
76

77
  @type cfg: C{objects.ConfigData}
78
  @param cfg: the configuration data
79
  @type disk_template: string
80
  @param disk_template: a disk template, for example 'drbd'
81
  @rtype: string
82
  @return: identifier for a storage unit, for example the vg_name for lvm
83
     storage
84

85
  """
86
  storage_type = constants.MAP_DISK_TEMPLATE_STORAGE_TYPE[disk_template]
87
  cluster = cfg.GetClusterInfo()
88
  if disk_template in constants.DTS_LVM:
89
    return (storage_type, cfg.GetVGName())
90
  elif disk_template == constants.DT_FILE:
91
    return (storage_type, cluster.file_storage_dir)
92
  elif disk_template == constants.DT_SHARED_FILE:
93
    return (storage_type, cluster.shared_file_storage_dir)
94
  elif disk_template == constants.DT_GLUSTER:
95
    return (storage_type, cluster.gluster_storage_dir)
96
  else:
97
    return (storage_type, None)
98

    
99

    
100
def DiskTemplateSupportsSpaceReporting(disk_template):
101
  """Check whether the disk template supports storage space reporting."""
102
  return (constants.MAP_DISK_TEMPLATE_STORAGE_TYPE[disk_template]
103
          in constants.STS_REPORT)
104

    
105

    
106
def GetStorageUnits(cfg, disk_templates):
107
  """Get the cluster's storage units for the given disk templates.
108

109
  If any lvm-based disk template is requested, spindle information
110
  is added to the request.
111

112
  @type cfg: L{config.ConfigWriter}
113
  @param cfg: Cluster configuration
114
  @type disk_templates: list of string
115
  @param disk_templates: list of disk templates for which the storage
116
    units will be computed
117
  @rtype: list of tuples (string, string)
118
  @return: list of storage units, each storage unit being a tuple of
119
    (storage_type, storage_key); storage_type is in
120
    C{constants.STORAGE_TYPES} and the storage_key a string to
121
    identify an entity of that storage type, for example a volume group
122
    name for LVM storage or a file for file storage.
123

124
  """
125
  storage_units = []
126
  for disk_template in disk_templates:
127
    if DiskTemplateSupportsSpaceReporting(disk_template):
128
      storage_units.append(
129
          _GetDefaultStorageUnitForDiskTemplate(cfg, disk_template))
130
  return storage_units
131

    
132

    
133
def LookupSpaceInfoByDiskTemplate(storage_space_info, disk_template):
134
  """Looks up the storage space info for a given disk template.
135

136
  @type storage_space_info: list of dicts
137
  @param storage_space_info: result of C{GetNodeInfo}
138
  @type disk_template: string
139
  @param disk_template: disk template to get storage space info
140
  @rtype: tuple
141
  @return: returns the element of storage_space_info that matches the given
142
    disk template
143

144
  """
145
  storage_type = constants.MAP_DISK_TEMPLATE_STORAGE_TYPE[disk_template]
146
  return LookupSpaceInfoByStorageType(storage_space_info, storage_type)
147

    
148

    
149
def LookupSpaceInfoByStorageType(storage_space_info, storage_type):
150
  """Looks up the storage space info for a given storage type.
151

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

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

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