1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 """Utility functions for storage.
22
23 """
24
25 import logging
26
27 from ganeti import constants
28
29
35
36
40
41
43 """Checks if a particular disk template is enabled.
44
45 """
46 return disk_template in enabled_disk_templates
47
48
54
55
61
62
64 """Check whether or not any lvm-based disk templates are enabled."""
65 return len(set(GetLvmDiskTemplates())
66 .intersection(set(enabled_disk_templates))) != 0
67
68
69 -def LvmGetsEnabled(enabled_disk_templates, new_enabled_disk_templates):
70 """Checks whether lvm was not enabled before, but will be enabled after
71 the operation.
72
73 """
74 if IsLvmEnabled(enabled_disk_templates):
75 return False
76 return set(GetLvmDiskTemplates()).intersection(
77 set(new_enabled_disk_templates))
78
79
81 """Retrieves the identifier of the default storage entity for the given
82 storage type.
83
84 @type cfg: C{objects.ConfigData}
85 @param cfg: the configuration data
86 @type disk_template: string
87 @param disk_template: a disk template, for example 'drbd'
88 @rtype: string
89 @return: identifier for a storage unit, for example the vg_name for lvm
90 storage
91
92 """
93 storage_type = constants.MAP_DISK_TEMPLATE_STORAGE_TYPE[disk_template]
94 cluster = cfg.GetClusterInfo()
95 if disk_template in GetLvmDiskTemplates():
96 return (storage_type, cfg.GetVGName())
97 elif disk_template == constants.DT_FILE:
98 return (storage_type, cluster.file_storage_dir)
99 elif disk_template == constants.DT_SHARED_FILE:
100 return (storage_type, cluster.shared_file_storage_dir)
101 else:
102 return (storage_type, None)
103
104
106 """Creates a 'spindle' storage unit, by retrieving the volume group
107 name and associating it to the lvm-pv storage type.
108
109 @rtype: (string, string)
110 @return: tuple (storage_type, storage_key), where storage type is
111 'lvm-pv' and storage_key the name of the default volume group
112
113 """
114 return (constants.ST_LVM_PV, cfg.GetVGName())
115
116
118 """Examines the cluster's configuration and returns a list of storage
119 units and their storage keys, ordered by the order in which they
120 are enabled.
121
122 @type cfg: L{config.ConfigWriter}
123 @param cfg: Cluster configuration
124 @type include_spindles: boolean
125 @param include_spindles: flag to include an extra storage unit for physical
126 volumes
127 @rtype: list of tuples (string, string)
128 @return: list of storage units, each storage unit being a tuple of
129 (storage_type, storage_key); storage_type is in
130 C{constants.STORAGE_TYPES} and the storage_key a string to
131 identify an entity of that storage type, for example a volume group
132 name for LVM storage or a file for file storage.
133
134 """
135 cluster_config = cfg.GetClusterInfo()
136 storage_units = []
137 for disk_template in cluster_config.enabled_disk_templates:
138 if constants.MAP_DISK_TEMPLATE_STORAGE_TYPE[disk_template]\
139 in constants.STS_REPORT:
140 storage_units.append(
141 _GetDefaultStorageUnitForDiskTemplate(cfg, disk_template))
142 if include_spindles:
143 included_storage_types = set([st for (st, _) in storage_units])
144 if not constants.ST_LVM_PV in included_storage_types:
145 storage_units.append(
146 _GetDefaultStorageUnitForSpindles(cfg))
147
148 return storage_units
149
150
152 """Looks up the storage space info for a given storage type.
153
154 Note that this lookup can be ambiguous if storage space reporting for several
155 units of the same storage type was requested. This function is only supposed
156 to be used for legacy code in situations where it actually is unambiguous.
157
158 @type storage_space_info: list of dicts
159 @param storage_space_info: result of C{GetNodeInfo}
160 @type storage_type: string
161 @param storage_type: a storage type, which is included in the storage_units
162 list
163 @rtype: tuple
164 @return: returns the element of storage_space_info that matches the given
165 storage type
166
167 """
168 result = None
169 for unit_info in storage_space_info:
170 if unit_info["type"] == storage_type:
171 if result is None:
172 result = unit_info
173 else:
174
175 logging.warning("Storage space information requested for"
176 " ambiguous storage type '%s'.", storage_type)
177 return result
178