summaryrefslogtreecommitdiffstats
path: root/tests/test_storage.py
blob: 75f3ab95361ad8c7992d180b0a91777fb6a453a3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
#
# Copyright 2014 Red Hat, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
#
# Refer to the README and COPYING files for full details of the license
#

import mock

from testrunner import GlusterNagiosTestCase as TestCaseBase
import glusternagios


class TestStorageUtils(TestCaseBase):
    @mock.patch('glusternagios.storage._getLvsCmd')
    @mock.patch('glusternagios.storage.utils')
    def testGetLvs(self, mock_utils, mock_lvs_cmd):
        tmp_str = ["LVM2_LV_UUID=zjuuHG-HajL-PXxm-fjlL-5i00-EUnV-Wd2qL3^"
                   "LVM2_LV_NAME=lv_root^"
                   "LVM2_LV_PATH=/dev/vg_shubhnd/lv_root^"
                   "LVM2_LV_ATTR=-wi-ao---^"
                   "LVM2_LV_MAJOR=-1^"
                   "LVM2_LV_MINOR=-1^"
                   "LVM2_LV_READ_AHEAD=auto^"
                   "LVM2_LV_KERNEL_MAJOR=253^"
                   "LVM2_LV_KERNEL_MINOR=0^"
                   "LVM2_LV_KERNEL_READ_AHEAD=0.12^"
                   "LVM2_LV_SIZE=46728.00^"
                   "LVM2_LV_METADATA_SIZE=^"
                   "LVM2_SEG_COUNT=1^"
                   "LVM2_ORIGIN=^"
                   "LVM2_ORIGIN_SIZE=0^"
                   "LVM2_DATA_PERCENT=^"
                   "LVM2_SNAP_PERCENT=^"
                   "LVM2_METADATA_PERCENT=^"
                   "LVM2_COPY_PERCENT=^"
                   "LVM2_SYNC_PERCENT=^"
                   "LVM2_MOVE_PV=^"
                   "LVM2_CONVERT_LV=^"
                   "LVM2_MIRROR_LOG=^"
                   "LVM2_DATA_LV=^"
                   "LVM2_METADATA_LV=^"
                   "LVM2_POOL_LV=^"
                   "LVM2_LV_TAGS=^"
                   "LVM2_LV_TIME=2014-03-14 04:27:56 +0530^"
                   "LVM2_LV_HOST=shubh-nd.redhat.com^"
                   "LVM2_MODULES=^"
                   "LVM2_VG_NAME=vg_shubhnd",
                   "LVM2_LV_UUID=klTthp-BXN8-9loo-UUo9-Y2lB-6azb-X9fFdH^"
                   "LVM2_LV_NAME=lv_swap^"
                   "LVM2_LV_PATH=/dev/vg_shubhnd/lv_swap^"
                   "LVM2_LV_ATTR=-wi-ao---^"
                   "LVM2_LV_MAJOR=-1^"
                   "LVM2_LV_MINOR=-1^"
                   "LVM2_LV_READ_AHEAD=auto^"
                   "LVM2_LV_KERNEL_MAJOR=253^"
                   "LVM2_LV_KERNEL_MINOR=1^"
                   "LVM2_LV_KERNEL_READ_AHEAD=0.12^"
                   "LVM2_LV_SIZE=3968.00^"
                   "LVM2_LV_METADATA_SIZE=^"
                   "LVM2_SEG_COUNT=1^"
                   "LVM2_ORIGIN=^"
                   "LVM2_ORIGIN_SIZE=0^"
                   "LVM2_DATA_PERCENT=^"
                   "LVM2_SNAP_PERCENT=^"
                   "LVM2_METADATA_PERCENT=^"
                   "LVM2_COPY_PERCENT=^"
                   "LVM2_SYNC_PERCENT=^"
                   "LVM2_MOVE_PV=^"
                   "LVM2_CONVERT_LV=^"
                   "LVM2_MIRROR_LOG=^"
                   "LVM2_DATA_LV=^"
                   "LVM2_METADATA_LV=^"
                   "LVM2_POOL_LV=^"
                   "LVM2_LV_TAGS=^"
                   "LVM2_LV_TIME=2014-03-14 04:28:01 +0530^"
                   "LVM2_LV_HOST=shubh-nd.redhat.com^"
                   "LVM2_MODULES=^"
                   "LVM2_VG_NAME=vg_shubhnd"]
        mock_utils.execCmd.return_value = (0, tmp_str, "")
        mock_lvs_cmd.return_value = ("/sbin/lvs" +
                                     " --unquoted --noheading " +
                                     "--nameprefixes --separator ^ " +
                                     "--nosuffix --units m -o " +
                                     "lv_all,vg_name").split()
        ret_val = glusternagios.storage.getLvs()
        value_to_verify = {'/dev/vg_shubhnd/lv_root':
                           {'LVM2_SYNC_PERCENT': '',
                            'LVM2_LV_METADATA_SIZE': '',
                            'LVM2_LV_ATTR': '-wi-ao---',
                            'LVM2_MIRROR_LOG': '',
                            'LVM2_LV_KERNEL_MINOR': '0',
                            'LVM2_LV_SIZE': '46728.00',
                            'LVM2_LV_MAJOR': '-1',
                            'LVM2_ORIGIN_SIZE': '0',
                            'LVM2_LV_TIME': '2014-03-14 04:27:56 +0530',
                            'LVM2_METADATA_PERCENT': '',
                            'LVM2_POOL_LV': '',
                            'LVM2_COPY_PERCENT': '',
                            'LVM2_CONVERT_LV': '',
                            'LVM2_LV_KERNEL_READ_AHEAD': '0.12',
                            'LVM2_LV_NAME': 'lv_root',
                            'LVM2_LV_HOST': 'shubh-nd.redhat.com',
                            'LVM2_LV_UUID':
                            'zjuuHG-HajL-PXxm-fjlL-5i00-EUnV-Wd2qL3',
                            'LVM2_LV_MINOR': '-1',
                            'LVM2_DATA_PERCENT': '',
                            'LVM2_LV_KERNEL_MAJOR': '253',
                            'LVM2_LV_TAGS': '',
                            'LVM2_MODULES': '',
                            'LVM2_VG_NAME': 'vg_shubhnd',
                            'LVM2_METADATA_LV': '',
                            'LVM2_LV_PATH': '/dev/vg_shubhnd/lv_root',
                            'LVM2_DATA_LV': '',
                            'LVM2_LV_READ_AHEAD': 'auto',
                            'LVM2_SNAP_PERCENT': '',
                            'LVM2_MOVE_PV': '',
                            'LVM2_ORIGIN': '',
                            'LVM2_SEG_COUNT': '1'},
                           '/dev/vg_shubhnd/lv_swap':
                           {'LVM2_SYNC_PERCENT': '',
                            'LVM2_LV_METADATA_SIZE': '',
                            'LVM2_LV_ATTR': '-wi-ao---',
                            'LVM2_MIRROR_LOG': '',
                            'LVM2_LV_KERNEL_MINOR': '1',
                            'LVM2_LV_SIZE': '3968.00',
                            'LVM2_LV_MAJOR': '-1',
                            'LVM2_ORIGIN_SIZE': '0',
                            'LVM2_LV_TIME': '2014-03-14 04:28:01 +0530',
                            'LVM2_METADATA_PERCENT': '',
                            'LVM2_POOL_LV': '',
                            'LVM2_COPY_PERCENT': '',
                            'LVM2_CONVERT_LV': '',
                            'LVM2_LV_KERNEL_READ_AHEAD': '0.12',
                            'LVM2_LV_NAME': 'lv_swap',
                            'LVM2_LV_HOST': 'shubh-nd.redhat.com',
                            'LVM2_LV_UUID':
                            'klTthp-BXN8-9loo-UUo9-Y2lB-6azb-X9fFdH',
                            'LVM2_LV_MINOR': '-1',
                            'LVM2_DATA_PERCENT': '',
                            'LVM2_LV_KERNEL_MAJOR': '253',
                            'LVM2_LV_TAGS': '',
                            'LVM2_MODULES': '',
                            'LVM2_VG_NAME': 'vg_shubhnd',
                            'LVM2_METADATA_LV': '',
                            'LVM2_LV_PATH': '/dev/vg_shubhnd/lv_swap',
                            'LVM2_DATA_LV': '',
                            'LVM2_LV_READ_AHEAD': 'auto',
                            'LVM2_SNAP_PERCENT': '',
                            'LVM2_MOVE_PV': '',
                            'LVM2_ORIGIN': '',
                            'LVM2_SEG_COUNT': '1'}}
        self.assertEquals(ret_val, value_to_verify)

    @mock.patch('glusternagios.storage._getVgsCmd')
    @mock.patch('glusternagios.storage.utils')
    def testGetVgs(self, mock_utils, mock_vgs_cmd):
        tmp_str = ["LVM2_VG_FMT=lvm2^"
                   "LVM2_VG_UUID=sTDsBh-DOc7-JR3y-RPHb-yz4R-aWP7-yZWQ0E^"
                   "LVM2_VG_NAME=vg_shubhnd^"
                   "LVM2_VG_ATTR=wz--n-^"
                   "LVM2_VG_SIZE=50696.00^"
                   "LVM2_VG_FREE=0^"
                   "LVM2_VG_SYSID=^"
                   "LVM2_VG_EXTENT_SIZE=4.00^"
                   "LVM2_VG_EXTENT_COUNT=12674^"
                   "LVM2_VG_FREE_COUNT=0^"
                   "LVM2_MAX_LV=0^"
                   "LVM2_MAX_PV=0^"
                   "LVM2_PV_COUNT=1^"
                   "LVM2_LV_COUNT=2^"
                   "LVM2_SNAP_COUNT=0^"
                   "LVM2_VG_SEQNO=3^"
                   "LVM2_VG_TAGS=^"
                   "LVM2_VG_MDA_COUNT=1^"
                   "LVM2_VG_MDA_USED_COUNT=1^"
                   "LVM2_VG_MDA_FREE=0.50^"
                   "LVM2_VG_MDA_SIZE=1.00^"
                   "LVM2_VG_MDA_COPIES=unmanaged^"
                   "LVM2_LV_PATH=/dev/vg_shubhnd/lv_root",
                   "LVM2_VG_FMT=lvm2^"
                   "LVM2_VG_UUID=sTDsBh-DOc7-JR3y-RPHb-yz4R-aWP7-yZWQ0E^"
                   "LVM2_VG_NAME=vg_shubhnd^"
                   "LVM2_VG_ATTR=wz--n-^"
                   "LVM2_VG_SIZE=50696.00^"
                   "LVM2_VG_FREE=0^"
                   "LVM2_VG_SYSID=^"
                   "LVM2_VG_EXTENT_SIZE=4.00^"
                   "LVM2_VG_EXTENT_COUNT=12674^"
                   "LVM2_VG_FREE_COUNT=0^"
                   "LVM2_MAX_LV=0^"
                   "LVM2_MAX_PV=0^"
                   "LVM2_PV_COUNT=1^"
                   "LVM2_LV_COUNT=2^"
                   "LVM2_SNAP_COUNT=0^"
                   "LVM2_VG_SEQNO=3^"
                   "LVM2_VG_TAGS=^"
                   "LVM2_VG_MDA_COUNT=1^"
                   "LVM2_VG_MDA_USED_COUNT=1^"
                   "LVM2_VG_MDA_FREE=0.50^"
                   "LVM2_VG_MDA_SIZE=1.00^"
                   "LVM2_VG_MDA_COPIES=unmanaged^"
                   "LVM2_LV_PATH=/dev/vg_shubhnd/lv_swap"]
        mock_utils.execCmd.return_value = (0, tmp_str, "")
        mock_vgs_cmd.return_value = ("/sbin/vgs" +
                                     " --unquoted --noheading " +
                                     "--nameprefixes --separator ^ " +
                                     "--nosuffix --units m -o " +
                                     "vg_all,lv_path").split()
        ret_val = glusternagios.storage.getVgs()
        value_to_verify = {'vg_shubhnd':
                           {'LVM2_VG_EXTENT_SIZE': '4.00',
                            'LVM2_VG_MDA_COUNT': '1',
                            'LVM2_VG_SYSID': '',
                            'LVM2_VG_ATTR': 'wz--n-',
                            'LVM2_VG_UUID':
                            'sTDsBh-DOc7-JR3y-RPHb-yz4R-aWP7-yZWQ0E',
                            'LVM2_VG_MDA_COPIES': 'unmanaged',
                            'LVM2_VG_MDA_FREE': '0.50',
                            'LVM2_VG_TAGS': '',
                            'LVM2_VG_FMT': 'lvm2',
                            'LVM2_PV_COUNT': '1',
                            'LVM2_VG_EXTENT_COUNT': '12674',
                            'LVM2_VG_MDA_SIZE': '1.00',
                            'LVM2_SNAP_COUNT': '0',
                            'LVM2_LV_COUNT': '2',
                            'LVM2_VG_NAME': 'vg_shubhnd',
                            'LVM2_VG_MDA_USED_COUNT': '1',
                            'LVM2_VG_FREE': '0',
                            'LVM2_VG_SEQNO': '3',
                            'LVM2_LV_PATH': ['/dev/vg_shubhnd/lv_root',
                                             '/dev/vg_shubhnd/lv_swap'],
                            'LVM2_VG_FREE_COUNT': '0',
                            'LVM2_MAX_PV': '0',
                            'LVM2_MAX_LV': '0',
                            'LVM2_VG_SIZE': '50696.00'}}
        self.assertEquals(ret_val, value_to_verify)

    @mock.patch('glusternagios.storage._getPvsCmd')
    @mock.patch('glusternagios.storage.utils')
    def testGetPvs(self, mock_utils, mock_pvs_cmd):
        tmp_str = ["LVM2_PV_FMT=lvm2^"
                   "LVM2_PV_UUID=NF1uv0-eXJM-YJrn-Rc7b-Z2nw-E1Ly-3S24zn^"
                   "LVM2_DEV_SIZE=50699.00^"
                   "LVM2_PV_NAME=/dev/vda2^"
                   "LVM2_PV_MDA_FREE=0.50^"
                   "LVM2_PV_MDA_SIZE=1.00^"
                   "LVM2_PE_START=1.00^"
                   "LVM2_PV_SIZE=50696.00^"
                   "LVM2_PV_FREE=0^"
                   "LVM2_PV_USED=50696.00^"
                   "LVM2_PV_ATTR=a--^"
                   "LVM2_PV_PE_COUNT=12674^"
                   "LVM2_PV_PE_ALLOC_COUNT=12674^"
                   "LVM2_PV_TAGS=^"
                   "LVM2_PV_MDA_COUNT=1^"
                   "LVM2_PV_MDA_USED_COUNT=1^"
                   "LVM2_VG_NAME=vg_shubhnd"]
        mock_utils.execCmd.return_value = (0, tmp_str, "")
        mock_pvs_cmd.return_value = ("/sbin/pvs" +
                                     " --unquoted --noheading " +
                                     "--nameprefixes --separator ^ " +
                                     "--nosuffix --units m -o " +
                                     "pv_all,vg_name").split()
        ret_val = glusternagios.storage.getPvs()
        value_to_verify = {'/dev/vda2':
                           {'LVM2_PV_MDA_USED_COUNT': '1',
                            'LVM2_PV_UUID':
                            'NF1uv0-eXJM-YJrn-Rc7b-Z2nw-E1Ly-3S24zn',
                            'LVM2_PE_START': '1.00',
                            'LVM2_DEV_SIZE': '50699.00',
                            'LVM2_PV_NAME': '/dev/vda2',
                            'LVM2_PV_FMT': 'lvm2',
                            'LVM2_PV_MDA_COUNT': '1',
                            'LVM2_PV_MDA_FREE': '0.50',
                            'LVM2_PV_TAGS': '',
                            'LVM2_PV_FREE': '0',
                            'LVM2_PV_SIZE': '50696.00',
                            'LVM2_PV_PE_ALLOC_COUNT': '12674',
                            'LVM2_PV_MDA_SIZE': '1.00',
                            'LVM2_VG_NAME': 'vg_shubhnd',
                            'LVM2_PV_USED': '50696.00',
                            'LVM2_PV_ATTR': 'a--',
                            'LVM2_PV_PE_COUNT': '12674'}}
        self.assertEquals(ret_val, value_to_verify)

    @mock.patch('glusternagios.storage._getBrickMountPoints')
    @mock.patch('glusternagios.storage._getMountPoint')
    @mock.patch('glusternagios.storage._getProcMounts')
    @mock.patch('glusternagios.storage.glustercli.utils')
    @mock.patch('glusternagios.storage._getLvDetails')
    def testGetBricksForDisk(self,
                             mock_get_lv_details,
                             mock_utils,
                             mock_proc_mounts,
                             mock_get_mount_point,
                             mock_get_brick_mount_points):
        mock_get_lv_details.return_value = {'lv_root':
                                            {'LVM2_LV_NAME': 'lv_root',
                                             'LVM2_PV_NAME': '/dev/vda2',
                                             'LVM2_VG_NAME': 'vg_shubhnd'},
                                            'lv_swap':
                                            {'LVM2_LV_NAME': 'lv_swap',
                                             'LVM2_PV_NAME': '/dev/vda2',
                                             'LVM2_VG_NAME': 'vg_shubhnd'}}
        tmp_out = ['<?xml version="1.0" encoding="UTF-8" standalone="yes"?>',
                   '<cliOutput>',
                   '  <opRet>0</opRet>',
                   '  <opErrno>0</opErrno>',
                   '  <opErrstr/>',
                   '  <volInfo>',
                   '    <volumes>',
                   '      <volume>',
                   '        <name>vol1</name>',
                   '        <id>9510c150-f471-450c-9c6e-1c489792bfb2</id>',
                   '        <status>1</status>',
                   '        <statusStr>Started</statusStr>',
                   '        <brickCount>1</brickCount>',
                   '        <distCount>1</distCount>',
                   '        <stripeCount>1</stripeCount>',
                   '        <replicaCount>1</replicaCount>',
                   '        <type>0</type>',
                   '        <typeStr>Distribute</typeStr>',
                   '        <transport>0</transport>',
                   '        <bricks>',
                   '          <brick>server-1:/tmp/vol1-a</brick>',
                   '        </bricks>',
                   '        <optCount>0</optCount>',
                   '        <options/>',
                   '      </volume>',
                   '      <count>1</count>',
                   '    </volumes>',
                   '  </volInfo>',
                   '</cliOutput>']
        mock_utils.execCmd.return_value = (0, tmp_out, "")
        mock_proc_mounts.return_value = {'devpts': '/dev/pts',
                                         '/dev/mapper/vg_shubhnd-lv_root': '/',
                                         'sysfs': '/sys',
                                         '/proc/bus/usb': '/proc/bus/usb',
                                         'proc': '/proc'}
        mock_get_mount_point.return_value = "/"
        mock_get_brick_mount_points.return_value = {'server-1:/tmp/vol1-a':
                                                    "/"}
        bricks = glusternagios.storage.getBricksForDisk("/dev/vda2")
        self.assertEquals(bricks, ['server-1:/tmp/vol1-a'])

    @mock.patch('glusternagios.storage._getBrickDeviceName')
    @mock.patch('glusternagios.storage._getLvDetails')
    @mock.patch('glusternagios.storage.glustercli.utils')
    @mock.patch('glusternagios.storage._getMountPoint')
    def testGetDisksForBrick(self,
                             mock_get_mount_point,
                             mock_utils,
                             mock_get_lv_details,
                             mock_get_brick_device_name):
        mock_get_mount_point.return_value = "/"
        tmp_out = ['<?xml version="1.0" encoding="UTF-8" standalone="yes"?>',
                   '<cliOutput>',
                   '  <opRet>0</opRet>',
                   '  <opErrno>0</opErrno>',
                   '  <opErrstr>(null)</opErrstr>',
                   '  <volStatus>',
                   '    <volumes>',
                   '      <volume>',
                   '        <volName>vol1</volName>',
                   '        <nodeCount>1</nodeCount>',
                   '        <node>',
                   '          <hostname>server-1</hostname>',
                   '          <path>/tmp/vol1-a</path>',
                   '          <status>1</status>',
                   '          <port>49152</port>',
                   '          <pid>8716</pid>',
                   '          <sizeTotal>48228589568</sizeTotal>',
                   '          <sizeFree>45994987520</sizeFree>',
                   '          <device>/dev/mapper/vg_shubhnd-lv_root</device>',
                   '          <blockSize>4096</blockSize>',
                   '          <mntOptions>rw</mntOptions>',
                   '          <fsName>ext4</fsName>',
                   '        </node>',
                   '      </volume>',
                   '    </volumes>',
                   '  </volStatus>',
                   '</cliOutput>']
        mock_utils.execCmd.return_value = (0, tmp_out, "")
        mock_get_lv_details.return_value = {'lv_root':
                                            {'LVM2_LV_NAME': 'lv_root',
                                             'LVM2_PV_NAME': '/dev/vda2',
                                             'LVM2_VG_NAME': 'vg_shubhnd'},
                                            'lv_swap':
                                            {'LVM2_LV_NAME': 'lv_swap',
                                             'LVM2_PV_NAME': '/dev/vda2',
                                             'LVM2_VG_NAME': 'vg_shubhnd'}}
        disk = glusternagios.storage.getDisksForBrick(
            None, "server-1:/tmp/vol1-a")
        self.assertEquals(disk, "/dev/vda2")
        mock_get_brick_device_name.return_value = "/dev/mapper/" \
                                                  "vg_shubhnd-lv_root"

        disk = glusternagios.storage.getDisksForBrick(
            "/dev/mapper/vg_shubhnd-lv_root", "server-1:/tmp/vol1-a")
        self.assertEquals(disk, "/dev/vda2")