commit 480d09e2581cc64b076a763a6d401787d1dc6b5b Author: CentOS Sources Date: Tue Nov 5 16:28:04 2019 -0500 import system-storage-manager-1.4-1.el8 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6b12977 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/system-storage-manager-1.4.tar.gz diff --git a/.system-storage-manager.metadata b/.system-storage-manager.metadata new file mode 100644 index 0000000..2159435 --- /dev/null +++ b/.system-storage-manager.metadata @@ -0,0 +1 @@ +14c095c24b57a44eec76807cf788f9cb715cbdb4 SOURCES/system-storage-manager-1.4.tar.gz diff --git a/SOURCES/0001-ssm-enforce-python3.patch b/SOURCES/0001-ssm-enforce-python3.patch new file mode 100644 index 0000000..e9452af --- /dev/null +++ b/SOURCES/0001-ssm-enforce-python3.patch @@ -0,0 +1,259 @@ +From e19db289c5080530f2d2a2f21dde35fd12571c1b Mon Sep 17 00:00:00 2001 +From: Jan Tulak +Date: Fri, 10 Aug 2018 17:29:48 +0200 +Subject: [PATCH 1/9] ssm: enforce python3 + +RHEL8 and later have python3 only. + +Change all shebangs and version-dependent calls to explicitly use +Python 3 and update the docs respectively. This also marks the end of +python2 support. + +Signed-off-by: Jan Tulak +--- + INSTALL | 2 +- + Makefile | 8 ++++---- + README | 2 +- + bin/ssm | 2 +- + bin/ssm.local | 2 +- + doc/Makefile | 2 +- + doc/generate_usage_includes.py | 2 +- + doc/src/requirements.rst | 2 +- + man8/ssm.8 | 2 +- + test.py | 2 +- + tests/__init__.py | 2 +- + tests/unittests/__init__.py | 2 +- + tests/unittests/common.py | 2 +- + tests/unittests/test_btrfs.py | 2 +- + tests/unittests/test_lvm.py | 2 +- + tests/unittests/test_misc.py | 2 +- + tests/unittests/test_multipath.py | 2 +- + tests/unittests/test_ssm.py | 2 +- + 18 files changed, 21 insertions(+), 21 deletions(-) + +diff --git a/INSTALL b/INSTALL +index f1f0277..4dbcd2e 100644 +--- a/INSTALL ++++ b/INSTALL +@@ -21,7 +21,7 @@ local sources with: + Requirements + ************ + +-Python 2.6 or higher is required to run this tool. System Storage ++Python 3.6 or higher is required to run this tool. System Storage + Manager can only be run as root since most of the commands require + root privileges. + +diff --git a/Makefile b/Makefile +index 2d887c4..80ae3f9 100644 +--- a/Makefile ++++ b/Makefile +@@ -28,7 +28,7 @@ ifndef PREVIOUS + endif + + clean: +- @python setup.py clean ++ @python3 setup.py clean + rm -f MANIFEST + find . -\( -name "*.pyc" -o -name '*.pyo' -o -name "*~" -\) -delete + +@@ -36,7 +36,7 @@ git-clean: + git clean -f + + install: +- @python setup.py install ++ @python3 setup.py install + + spec: check_vars + @(LC_ALL=C date +"* %a %b %e %Y `git config --get user.name` <`git config --get user.email`> - $(VERSION)"; git log --pretty="format:- %s (%an)" $(PREVIOUS)..HEAD| cat; echo -e "\n\n"; cat CHANGES) > CHANGES.bck; mv CHANGES.bck CHANGES +@@ -51,10 +51,10 @@ docs: + @make dist -C doc + + source: test clean +- @python setup.py sdist ++ @python3 setup.py sdist + + test: +- @python test.py ++ @python3 test.py + + push_html: + scp -r doc/_build/singlehtml/* lczerner@shell.sourceforge.net:/home/project-web/storagemanager/htdocs/ +diff --git a/README b/README +index fe16990..95f20ae 100644 +--- a/README ++++ b/README +@@ -684,7 +684,7 @@ local sources with: + Requirements + ************ + +-Python 2.6 or higher is required to run this tool. System Storage ++Python 3.6 or higher is required to run this tool. System Storage + Manager can only be run as root since most of the commands require + root privileges. + +diff --git a/bin/ssm b/bin/ssm +index 53aece6..13b2241 100755 +--- a/bin/ssm ++++ b/bin/ssm +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + # + # (C)2011 Red Hat, Inc., Lukas Czerner + # +diff --git a/bin/ssm.local b/bin/ssm.local +index d5bedec..94ea9dd 100755 +--- a/bin/ssm.local ++++ b/bin/ssm.local +@@ -26,7 +26,7 @@ export PYTHONPATH="$SSMDIR" + + # Run coverage if the environment variable is set up. + if [ "$RUN_COVERAGE" = "" ]; then +- python $SSMDIR/bin/ssm "$@" ++ python3 $SSMDIR/bin/ssm "$@" + else + $RUN_COVERAGE $SSMDIR/bin/ssm "$@" + fi +diff --git a/doc/Makefile b/doc/Makefile +index 09ee867..43e531b 100644 +--- a/doc/Makefile ++++ b/doc/Makefile +@@ -3,7 +3,7 @@ + + # You can set these variables from the command line. + SPHINXOPTS = +-SPHINXBUILD = sphinx-build ++SPHINXBUILD = sphinx-build-3 + PAPER = a4 + BUILDDIR = _build + +diff --git a/doc/generate_usage_includes.py b/doc/generate_usage_includes.py +index d7695f8..5ced9e6 100755 +--- a/doc/generate_usage_includes.py ++++ b/doc/generate_usage_includes.py +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + + import re + import sys, os +diff --git a/doc/src/requirements.rst b/doc/src/requirements.rst +index 0482e1d..18508e9 100644 +--- a/doc/src/requirements.rst ++++ b/doc/src/requirements.rst +@@ -3,7 +3,7 @@ + Requirements + ============ + +-Python 2.6 or higher is required to run this tool. System Storage Manager ++Python 3.6 or higher is required to run this tool. System Storage Manager + can only be run as root since most of the commands require root privileges. + + There are other requirements listed below, but note that you do not +diff --git a/man8/ssm.8 b/man8/ssm.8 +index 12859dc..94ad144 100644 +--- a/man8/ssm.8 ++++ b/man8/ssm.8 +@@ -865,7 +865,7 @@ You should have received a copy of the GNU General Public License + along with this program. If not, see <\fI\%http://www.gnu.org/licenses/\fP>. + .SH REQUIREMENTS + .sp +-Python 2.6 or higher is required to run this tool. System Storage Manager ++Python 3.6 or higher is required to run this tool. System Storage Manager + can only be run as root since most of the commands require root privileges. + .sp + There are other requirements listed below, but note that you do not +diff --git a/test.py b/test.py +index 721fe08..28530fa 100755 +--- a/test.py ++++ b/test.py +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + # + # (C)2011 Red Hat, Inc., Lukas Czerner + # +diff --git a/tests/__init__.py b/tests/__init__.py +index 6d8f17e..9f0c266 100644 +--- a/tests/__init__.py ++++ b/tests/__init__.py +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + # + # (C)2011 Red Hat, Inc., Lukas Czerner + # +diff --git a/tests/unittests/__init__.py b/tests/unittests/__init__.py +index 3776154..512baac 100644 +--- a/tests/unittests/__init__.py ++++ b/tests/unittests/__init__.py +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + # + # (C)2011 Red Hat, Inc., Lukas Czerner + # +diff --git a/tests/unittests/common.py b/tests/unittests/common.py +index 5495e22..37e0434 100644 +--- a/tests/unittests/common.py ++++ b/tests/unittests/common.py +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + # + # (C)2011 Red Hat, Inc., Lukas Czerner + # +diff --git a/tests/unittests/test_btrfs.py b/tests/unittests/test_btrfs.py +index 36db292..6af94cd 100644 +--- a/tests/unittests/test_btrfs.py ++++ b/tests/unittests/test_btrfs.py +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + # + # (C)2012 Red Hat, Inc., Lukas Czerner + # +diff --git a/tests/unittests/test_lvm.py b/tests/unittests/test_lvm.py +index 6489ba8..abe6d6b 100644 +--- a/tests/unittests/test_lvm.py ++++ b/tests/unittests/test_lvm.py +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + # + # (C)2011 Red Hat, Inc., Lukas Czerner + # +diff --git a/tests/unittests/test_misc.py b/tests/unittests/test_misc.py +index 2afc88f..cea3d19 100644 +--- a/tests/unittests/test_misc.py ++++ b/tests/unittests/test_misc.py +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + # + # (C)2018 Red Hat, Inc., Jan Tulak + # +diff --git a/tests/unittests/test_multipath.py b/tests/unittests/test_multipath.py +index 7239c2a..49c4a6c 100644 +--- a/tests/unittests/test_multipath.py ++++ b/tests/unittests/test_multipath.py +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + # + # (C)2012 Red Hat, Inc., Lukas Czerner + # (C)2016 Red Hat, Inc., Jan Tulak +diff --git a/tests/unittests/test_ssm.py b/tests/unittests/test_ssm.py +index 1fb0297..142bee2 100644 +--- a/tests/unittests/test_ssm.py ++++ b/tests/unittests/test_ssm.py +@@ -1,4 +1,4 @@ +-#!/usr/bin/env python ++#!/usr/bin/env python3 + # + # (C)2011 Red Hat, Inc., Lukas Czerner + # +-- +2.21.0 + diff --git a/SOURCES/0002-Remove-info-command-for-RHEL.patch b/SOURCES/0002-Remove-info-command-for-RHEL.patch new file mode 100644 index 0000000..b7ed254 --- /dev/null +++ b/SOURCES/0002-Remove-info-command-for-RHEL.patch @@ -0,0 +1,511 @@ +From a80454ac89489945349f2eb0c0c70d6621b67f5b Mon Sep 17 00:00:00 2001 +From: Jan Tulak +Date: Fri, 10 Aug 2018 16:43:45 +0200 +Subject: [PATCH 2/9] Remove info command for RHEL + +Signed-off-by: Jan Tulak +--- + README | 9 -- + doc/generate_usage_includes.py | 10 -- + doc/src/commands/index.rst | 1 - + doc/src/commands/info.rst | 8 -- + doc/src/commands/info.txt | 7 - + man8/ssm.8 | 47 +------ + ssmlib/main.py | 32 ----- + tests/bashtests/017-info.sh | 230 --------------------------------- + tests/unittests/test_ssm.py | 1 - + 9 files changed, 1 insertion(+), 344 deletions(-) + delete mode 100644 doc/src/commands/info.rst + delete mode 100644 doc/src/commands/info.txt + delete mode 100755 tests/bashtests/017-info.sh + +diff --git a/README b/README +index 95f20ae..17df34d 100644 +--- a/README ++++ b/README +@@ -148,15 +148,6 @@ The following sections can be specified: + Info command + ************ + +-**EXPERIMENTAL** This feature is currently experimental. The output +-format can change and fields can be added or removed. +- +-Show detailed information about all detected devices, pools, volumes +-and snapshots found on the system. The **info** command can be used +-either alone to show all available items, or you can specify a device, +-pool, or any other identifier to see information about the specific +-item. +- + + Remove command + ************** +diff --git a/doc/generate_usage_includes.py b/doc/generate_usage_includes.py +index 5ced9e6..b672dec 100755 +--- a/doc/generate_usage_includes.py ++++ b/doc/generate_usage_includes.py +@@ -12,7 +12,6 @@ SYNOPSIS_INC = "src/synopsis.inc" + OPTIONS_DIR = "src/options/" + SSM_OPTIONS_INC = OPTIONS_DIR + "ssm_options.inc" + CREATE_OPTIONS_INC = OPTIONS_DIR + "create_options.inc" +-INFO_OPTIONS_INC = OPTIONS_DIR + "info_options.inc" + LIST_OPTIONS_INC = OPTIONS_DIR + "list_options.inc" + REMOVE_OPTIONS_INC = OPTIONS_DIR + "remove_options.inc" + RESIZE_OPTIONS_INC = OPTIONS_DIR + "resize_options.inc" +@@ -24,7 +23,6 @@ MIGRATE_OPTIONS_INC = OPTIONS_DIR + "migrate_options.inc" + + SSM_USAGE_INC = OPTIONS_DIR + "ssm_usage.inc" + CREATE_USAGE_INC = OPTIONS_DIR + "create_usage.inc" +-INFO_USAGE_INC = OPTIONS_DIR + "info_usage.inc" + LIST_USAGE_INC = OPTIONS_DIR + "list_usage.inc" + REMOVE_USAGE_INC = OPTIONS_DIR + "remove_usage.inc" + RESIZE_USAGE_INC = OPTIONS_DIR + "resize_usage.inc" +@@ -68,10 +66,6 @@ class GenerateIncludes(object): + message = self.format_synopsis(self.ssm_parser.parser_create) + self._write_message(message, CREATE_USAGE_INC) + +- def write_info_usage(self): +- message = self.format_synopsis(self.ssm_parser.parser_info) +- self._write_message(message, INFO_USAGE_INC) +- + def write_list_usage(self): + message = self.format_synopsis(self.ssm_parser.parser_list) + self._write_message(message, LIST_USAGE_INC) +@@ -107,7 +101,6 @@ class GenerateIncludes(object): + def write_usage(self): + self.write_ssm_usage() + self.write_create_usage() +- self.write_info_usage() + self.write_list_usage() + self.write_remove_usage() + self.write_resize_usage() +@@ -137,9 +130,6 @@ class GenerateIncludes(object): + message = self._format_options(self.ssm_parser.parser_create) + self._write_message(message, CREATE_OPTIONS_INC) + +- message = self._format_options(self.ssm_parser.parser_info) +- self._write_message(message, INFO_OPTIONS_INC) +- + message = self._format_options(self.ssm_parser.parser_list) + self._write_message(message, LIST_OPTIONS_INC) + +diff --git a/doc/src/commands/index.rst b/doc/src/commands/index.rst +index 85ee495..d3f0a0f 100644 +--- a/doc/src/commands/index.rst ++++ b/doc/src/commands/index.rst +@@ -7,7 +7,6 @@ System Storage Manager Commands + + commands_introduction + create +- info + list + remove + resize +diff --git a/doc/src/commands/info.rst b/doc/src/commands/info.rst +deleted file mode 100644 +index d2917ef..0000000 +--- a/doc/src/commands/info.rst ++++ /dev/null +@@ -1,8 +0,0 @@ +-Info command +-============ +- +-.. include:: ../options/info_usage.inc +- +-.. include:: info.txt +- +-.. include:: ../options/info_options.inc +\ No newline at end of file +diff --git a/doc/src/commands/info.txt b/doc/src/commands/info.txt +deleted file mode 100644 +index 7fadda0..0000000 +--- a/doc/src/commands/info.txt ++++ /dev/null +@@ -1,7 +0,0 @@ +-**EXPERIMENTAL** This feature is currently experimental. The output format can +-change and fields can be added or removed. +- +-Show detailed information about all detected devices, pools, volumes and +-snapshots found on the system. The **info** command can be used either alone +-to show all available items, or you can specify a device, pool, or any other +-identifier to see information about the specific item. +\ No newline at end of file +diff --git a/man8/ssm.8 b/man8/ssm.8 +index 94ad144..5e4057a 100644 +--- a/man8/ssm.8 ++++ b/man8/ssm.8 +@@ -30,43 +30,14 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] + .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] + .in \\n[rst2man-indent\\n[rst2man-indent-level]]u + .. +-. +-.nr rst2man-indent-level 0 +-. +-.de1 rstReportMargin +-\\$1 \\n[an-margin] +-level \\n[rst2man-indent-level] +-level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] +-- +-\\n[rst2man-indent0] +-\\n[rst2man-indent1] +-\\n[rst2man-indent2] +-.. +-.de1 INDENT +-.\" .rstReportMargin pre: +-. RS \\$1 +-. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] +-. nr rst2man-indent-level +1 +-.\" .rstReportMargin post: +-.. +-.de UNINDENT +-. RE +-.\" indent \\n[an-margin] +-.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] +-.nr rst2man-indent-level -1 +-.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] +-.in \\n[rst2man-indent\\n[rst2man-indent-level]]u +-.. + .SH SYNOPSIS + .sp +-\fBssm\fP [\fB\-h\fP] [\fB\-\-version\fP] [\fB\-v\fP] [\fB\-v**v] [\fP\-v**vv] [\fB\-f\fP] [\fB\-b\fP BACKEND] [\fB\-n\fP] {check,resize,create,list,info,add,remove,snapshot,mount,migrate} ... ++\fBssm\fP [\fB\-h\fP] [\fB\-\-version\fP] [\fB\-v\fP] [\fB\-v**v] [\fP\-v**vv] [\fB\-f\fP] [\fB\-b\fP BACKEND] [\fB\-n\fP] {check,resize,create,list,add,remove,snapshot,mount,migrate} ... + .sp + \fBssm\fP \fBcreate\fP [\fB\-h\fP] [\fB\-s\fP SIZE] [\fB\-n\fP NAME] [\fB\-\-fstype\fP FSTYPE] [\fB\-r\fP LEVEL] [\fB\-I\fP STRIPESIZE] [\fB\-i\fP STRIPES] [\fB\-p\fP POOL] [\fB\-e\fP [{luks,plain}]] [\fB\-o\fP MNT_OPTIONS] [\fB\-v\fP VIRTUAL_SIZE] [\fBdevice\fP [\fBdevice\fP ...]] [mount] + .sp + \fBssm\fP \fBlist\fP [\fB\-h\fP] [{volumes,vol,dev,devices,pool,pools,fs,filesystems,snap,snapshots}] + .sp +-\fBssm\fP \fBinfo\fP [\fB\-h\fP] [item] +-.sp + \fBssm\fP \fBremove\fP [\fB\-h\fP] [\fB\-a\fP] [\fBitems\fP [\fBitems\fP ...]] + .sp + \fBssm\fP \fBresize\fP [\fB\-h\fP] [\fB\-s\fP SIZE] \fBvolume\fP [\fBdevice\fP [\fBdevice\fP ...]] +@@ -249,22 +220,6 @@ volume. A size suffix K|k, M|m, G|g, T|t, P|p, E|e can + be used to define \(aqpower of two\(aq units. If no unit is + provided, it defaults to kilobytes. + .UNINDENT +-.SS Info command +-.sp +-\fBssm\fP \fBinfo\fP [\fB\-h\fP] [item] +-.sp +-\fBEXPERIMENTAL\fP This feature is currently experimental. The output format can +-change and fields can be added or removed. +-.sp +-Show detailed information about all detected devices, pools, volumes and +-snapshots found on the system. The \fBinfo\fP command can be used either alone +-to show all available items, or you can specify a device, pool, or any other +-identifier to see information about the specific item. +-.INDENT 0.0 +-.TP +-.B \-h\fP,\fB \-\-help +-show this help message and exit +-.UNINDENT + .SS List command + .sp + \fBssm\fP \fBlist\fP [\fB\-h\fP] [{volumes,vol,dev,devices,pool,pools,fs,filesystems,snap,snapshots}] +diff --git a/ssmlib/main.py b/ssmlib/main.py +index 5e99ae4..57a75cc 100644 +--- a/ssmlib/main.py ++++ b/ssmlib/main.py +@@ -2032,26 +2032,6 @@ class StorageHandle(object): + elif args.type in ['snap', 'snapshots']: + self.snap.psummary() + +- def info(self, args): +- """ +- Show a detailed info about an object +- """ +- sources = [self.pool, self.dev, self.vol, self.snap] +- create_graph(*sources) +- print("EXPERIMENTAL FEATURE (The format can yet change)\n") +- +- if not args.item: +- for source in sources: +- source.pinfo() +- else: +- found = False +- for source in sources: +- found |= source.pinfo(item=args.item) +- if not found: +- err = "The item '%s' was not found." % args.item +- raise argparse.ArgumentTypeError(err) +- +- + def add(self, args, skip_check=False): + """ + Add devices into the pool +@@ -2585,7 +2565,6 @@ class SsmParser(object): + self.parser_resize = self._get_parser_resize() + self.parser_create = self._get_parser_create() + self.parser_list = self._get_parser_list() +- self.parser_info = self._get_parser_info() + self.parser_add = self._get_parser_add() + self.parser_remove = self._get_parser_remove() + self.parser_snapshot = self._get_parser_snapshot() +@@ -2769,17 +2748,6 @@ class SsmParser(object): + parser_list.set_defaults(func=self.storage.list) + return parser_list + +- def _get_parser_info(self): +- """ +- Info command +- """ +- parser_info = self.subcommands.add_parser("info", +- help='''Show detailed information about +- an object. EXPERIMENTAL''') +- parser_info.add_argument('item', nargs='?') +- parser_info.set_defaults(func=self.storage.info) +- return parser_info +- + def _get_parser_add(self): + """ + Add command +diff --git a/tests/bashtests/017-info.sh b/tests/bashtests/017-info.sh +deleted file mode 100755 +index 2e947db..0000000 +--- a/tests/bashtests/017-info.sh ++++ /dev/null +@@ -1,230 +0,0 @@ +-#!/bin/bash +-# +-# (C)2013 Red Hat, Inc., Jan Tulak +-# +-# 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, see . +- +-export test_name='017-info' +-export test_description='Check whether info command prints correct values' +- +-. lib/test +- +-DEV_COUNT=10 +-DEV_SIZE=128 +-TEST_MAX_SIZE=$(($DEV_COUNT*$DEV_SIZE)) +-aux prepare_devs $DEV_COUNT $DEV_SIZE +-aux prepare_mnts 10 +-TEST_DEVS=$(cat DEVICES) +-export LVOL_PREFIX="lvol" +-export SSM_DEFAULT_BACKEND='lvm' +-export SSM_LVM_DEFAULT_POOL=$vg1 +-export SSM_NONINTERACTIVE='1' +- +-snap1="snap1" +-snap2="snap2" +- +-lvol1=${LVOL_PREFIX}001 +-lvol2=${LVOL_PREFIX}002 +-lvol3=${LVOL_PREFIX}003 +- +-pool0=$vg1 +-pool1=$vg2 +-pool2=$vg3 +-pool3=$vg4 +- +-TEST_FS= +-#which mkfs.ext2 && TEST_FS+="ext2 " +-#which mkfs.ext3 && TEST_FS+="ext3 " +-which mkfs.ext4 && TEST_FS+="ext4 " +-which mkfs.xfs && TEST_FS+="xfs" +- +-TEST_MNT=$TESTDIR/mnt +-[ ! -d $TEST_MNT ] && mkdir $TEST_MNT &> /dev/null +- +-# Prepare pools and volumes +- +-vol1=volsf +-vol2=volss +-vol3=volmf +-vol4=volms1 +-vol5=volms2 +-vol6=volms3 +-maxvolsz=$((DEV_SIZE-4)) +-size1=$maxvolsz +-size2=$((DEV_SIZE/2)) +-size3=$((maxvolsz*2)) +-size4=$((DEV_SIZE/2)) +-size5=$((DEV_SIZE*2)) +-size6=$((DEV_SIZE/4)) +-size4s=$((size4-20)) +-size2r=$((size2-4)) +-size5r=$((size5+16)) +- +-## test a btrfs on a partition +-# +-# this is commented out, because the current testing infrastructure is not able +-# to handle such configuration. We need to move away from the lvm-like test suite +-# as anything complex and non-lvm is having issues with it. But at the same time +-# I want this test documented. +-# +-# +-# Test btrfs on a (loopback) partition. +-# This is a reproducer of a reported issue with ssm info. +-# +-# to create the partitions programatically (rather than manually) +-# we're going to simulate the manual input to fdisk +-# The sed script strips off all the comments so that we can +-# document what we're doing in-line with the actual commands +-# Note that a blank line (commented as "defualt" will send a empty +-# line terminated with a newline to take the fdisk default. +-# +-#sed -e 's/\s*\([\+0-9a-zA-Z]*\).*/\1/' << EOF | gdisk ${dev1} +-# n # new partition +-# 1 # partition number 1 +-# # default - start at beginning of disk +-# # default - end at end of disk +-# # default - partition type is not important +-# p # print the in-memory partition table +-# w # write the partition table +-# Y # confirm +-# q # and we're done +-#EOF +-#partprobe -s $dev1 +-# +-#mkfs.btrfs ${dev1}p1 +-#ssm info +-# +- +- +-# Test without a filesystem +-ssm -f create -n $vol1 $dev1 +-ssm create -n $vol2 -p $pool1 -s ${size2}M $dev2 +-ssm create -n $vol3 -p $pool2 $dev3 $dev4 +-ssm add -p $pool3 $dev{5,6,7,8} +-ssm create -p $pool3 -s ${size4}m -n $vol4 +-ssm create -p $pool3 -s ${size5}m -n $vol5 +-ssm create -p $pool3 -s ${size6}m -n $vol6 +-lvchange -an $pool3/$vol6 +- +-# test a not found case +-output=$(not ssm info foobarbaznotfound 2>&1 ) +-echo "$output" | grep "The item 'foobarbaznotfound' was not found." +- +-# Check vol, dev, pool, resized vol, and snapshot +-output=`ssm info $pool0` +-check info_table none "$output" "pool name" name $pool0 +-check info_table none "$output" type lvm volume group +-check info_table none "$output" "logical volume" volume ".*$pool0-$vol1" +-check info_table none "$output" size $size1.00MB +-check info_table none "$output" used $size1.00MB +- +-output=`ssm info $pool1` +-check info_table none "$output" "pool name" name $pool1 +-check info_table none "$output" type lvm volume group +-check info_table none "$output" "logical volume" volume ".*$pool1-$vol2" +-check info_table none "$output" size $size1.00MB +-check info_table none "$output" used $size2.00MB +- +-output=`ssm info $pool2` +-check info_table none "$output" "pool name" name $pool2 +-check info_table none "$output" type lvm volume group +-check info_table none "$output" "logical volume" volume ".*$pool2-$vol3" +-check info_table none "$output" size $size3.00MB +-check info_table none "$output" used $size3.00MB +- +-output=`ssm info $pool3` +-check info_table none "$output" "pool name" name $pool3 +-check info_table none "$output" type lvm volume group +-# The "\|#" is there because info_table none adds a space at the end +-# of the expression, but we have to get rid of it without causing +-# false matches. +-check info_table none "$output" "logical volume.*$vol4\|#" volume ".*$pool3.$vol4" +-check info_table none "$output" "logical volume.*$vol5\|#" volume ".*$pool3.$vol5" +-check info_table none "$output" "logical volume.*$vol6\|#" volume ".*$pool3.$vol6" +-check info_table none "$output" size $((maxvolsz*4)).00MB +-check info_table none "$output" used $((size4+size5+size6)).00MB +- +- +-output=`ssm info $dev1` +-check info_table none "$output" type disk +-check info_table none "$output" "object name" name ".*$dev1" +-check info_table none "$output" "size" $size1.00MB +- +-output=$(ssm info $pool0/$vol1) +-check info_table none "$output" type lvm logical volume +-check info_table none "$output" "object name.*dev/$pool0/$vol1\|#" +-check info_table none "$output" "object name.*mapper/$pool0-$vol1\|#" +-check info_table none "$output" "size" $size1.00MB +-check info_table none "$output" "parent pool" +-check info_table "parent pool" "$output" type lvm volume group +-check info_table "parent pool" "$output" name $pool0 +- +- +-# Check ssm vol after resize +-ssm -f resize $pool1/$vol2 -s ${size2r}M +-ssm resize -s ${size5r}m $pool3/$vol5 +- +-output=`ssm info $pool1` +-check info_table none "$output" size $size1.00MB +-check info_table none "$output" used $size2r.00MB +-output=`ssm info $pool3/$vol5` +-check info_table none "$output" size $size5r.00MB +- +-ssm snapshot $pool3/$vol4 -n snap1 +-ssm snapshot $pool3/$vol4 -s ${size4s}m -n snap2 +-output=`ssm info $pool3/snap1` +-check info_table none "$output" type snapshot +-check info_table none "$output" parent volume $pool3/$vol4 +-output=`ssm info $pool3/snap2` +-check info_table none "$output" size $size4s.00MB +- +-ssm -f remove -a +- +-# Test with filesystem +-for fs in $TEST_FS ; do +- ssm -f create -n $vol1 $dev1 --fs $fs +- ssm create -n $vol2 -p $pool1 -s ${size2}M $dev2 --fs $fs +- +- # Check fs, vol, dev, pool, resized vol, and snapshot +- output=`ssm info $pool0/$vol1` +- check info_table none "$output" "object name.*$pool0/$vol1" +- check info_table filesystem "$output" "type" $fs +- +- ssm -f remove -a +- +-done +- +-# Create volume with all devices at once +-size=$(($DEV_SIZE*6)) +-ssm create --size ${size}M $TEST_DEVS +- +-# Take a snapshot with the default params +-export SSM_DEFAULT_BACKEND='btrfs' +-ssm snapshot --name $snap1 $SSM_LVM_DEFAULT_POOL/$lvol1 +- +-output=$(ssm info $SSM_LVM_DEFAULT_POOL/$snap1) +-check info_table none "$output" "object name.*$SSM_LVM_DEFAULT_POOL/$snap1" +-check info_table none "$output" "type" snapshot +-check info_table none "$output" "parent volume.*$SSM_LVM_DEFAULT_POOL/$lvol1" +- +-output=$(ssm info $SSM_LVM_DEFAULT_POOL) +-check info_table none "$output" "type" lvm volume group +-check info_table none "$output" "logical volume.*$snap1" +- +- +-export SSM_DEFAULT_BACKEND='lvm' +- +- +- +-exit 0 +diff --git a/tests/unittests/test_ssm.py b/tests/unittests/test_ssm.py +index 142bee2..3fe8f5f 100644 +--- a/tests/unittests/test_ssm.py ++++ b/tests/unittests/test_ssm.py +@@ -281,7 +281,6 @@ class SimpleSsmSanityCheck(unittest.TestCase): + self.assert_("resize" in obj) + self.assert_("create" in obj) + self.assert_("list" in obj) +- self.assert_("info" in obj) + self.assert_("add" in obj) + self.assert_("remove" in obj) + self.assert_("snapshot" in obj) +-- +2.21.0 + diff --git a/SOURCES/0003-unittests-better-multipath-message-on-fail.patch b/SOURCES/0003-unittests-better-multipath-message-on-fail.patch new file mode 100644 index 0000000..260cac7 --- /dev/null +++ b/SOURCES/0003-unittests-better-multipath-message-on-fail.patch @@ -0,0 +1,34 @@ +From 168e3e9b41cfa4a954576c08cf03e0a18c80edb4 Mon Sep 17 00:00:00 2001 +From: Jan Tulak +Date: Thu, 11 Apr 2019 13:17:36 +0200 +Subject: [PATCH 3/9] unittests: better multipath message on fail + +Signed-off-by: Jan Tulak +--- + tests/unittests/test_multipath.py | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/tests/unittests/test_multipath.py b/tests/unittests/test_multipath.py +index 49c4a6c..6e58153 100644 +--- a/tests/unittests/test_multipath.py ++++ b/tests/unittests/test_multipath.py +@@ -167,13 +167,14 @@ class MultipathFunctionCheck(MockSystemDataSource): + finally: + sys.stdout = self._stdout + vol_entries = 0 +- for line in self._stringio.getvalue().splitlines(): ++ output = self._stringio.getvalue() ++ for line in output.splitlines(): + if line[:6] in ['------', 'Device']: + continue + dev = line.split(" ") + if dev[0] in ['/dev/dm-90', '/dev/dm-91']: + vol_entries += 1 +- self.assertEqual(vol_entries, 2, "List vol should show 2 entries for 2 multipath devices, but found {0}.".format(vol_entries)) ++ self.assertEqual(vol_entries, 2, "List vol should show 2 entries for 2 multipath devices, but found {0}: {1}".format(vol_entries, output)) + + # There should be no output for pools + sys.stdout = self._stringio = StringIO() +-- +2.21.0 + diff --git a/SOURCES/0004-bashtests-allow-testing-of-system-wide-ssm.patch b/SOURCES/0004-bashtests-allow-testing-of-system-wide-ssm.patch new file mode 100644 index 0000000..f121c07 --- /dev/null +++ b/SOURCES/0004-bashtests-allow-testing-of-system-wide-ssm.patch @@ -0,0 +1,65 @@ +From e92811e297c5eb91a5285e10a7519b53dc45a6d9 Mon Sep 17 00:00:00 2001 +From: Jan Tulak +Date: Thu, 11 Apr 2019 14:15:26 +0200 +Subject: [PATCH 4/9] bashtests: allow testing of system-wide ssm + +This patch allows us to test the installed, system-wide ssm, instead of +the local version. + +Signed-off-by: Jan Tulak +--- + test.py | 5 +++++ + tests/bashtests/lib/test.sh | 13 ++++++++++++- + 2 files changed, 17 insertions(+), 1 deletion(-) + +diff --git a/test.py b/test.py +index 28530fa..5620679 100755 +--- a/test.py ++++ b/test.py +@@ -268,6 +268,8 @@ if __name__ == '__main__': + help='run only unit tests') + parser.add_argument('-l', '--logs', dest='want_logs', action='store_true', + help='if a bash test fails, print out it\'s log to stdout') ++ parser.add_argument('-s', '--system', dest='system', action='store_true', ++ help='Test the installed version of ssm in system. Implies --bash.') + parser.add_argument('tests', metavar='TEST', type=str, nargs='*', + help='Specific tests to be run. For bash tests, ' + 'that means either a full name (001-foo.sh), ' +@@ -280,6 +282,9 @@ if __name__ == '__main__': + args = parser.parse_args() + + check_system_dependencies() ++ if args.system: ++ args.bash = True ++ os.environ['SSM_TEST_SYSTEM'] = '1' + + run_all = not args.unit and not args.bash + if args.unit and args.bash: +diff --git a/tests/bashtests/lib/test.sh b/tests/bashtests/lib/test.sh +index 319cf97..af37d98 100644 +--- a/tests/bashtests/lib/test.sh ++++ b/tests/bashtests/lib/test.sh +@@ -15,8 +15,19 @@ TZ=UTC + + unset CDPATH + export HERE=$(pwd) ++# If SSM_TEST_SYSTEM is set, run the test on a system-wide version instead of ++# local one. ++if [ "$SSM_TEST_SYSTEM" != "" ]; then ++ export SSM="$(which ssm)" ++ if [ "$SSM" == "" ]; then ++ echo "ERROR: SSM_TEST_SYSTEM set, but ssm wasn't found in PATH." ++ exit 1 ++ fi ++else ++ export SSM="$HERE/../../bin/ssm.local" ++fi ++echo "Tested ssm executable is '$SSM'" + export PATH=$HERE/lib:$PATH +-export SSM="$HERE/../../bin/ssm.local" + chmod +x $SSM + + # grab some common utilities +-- +2.21.0 + diff --git a/SOURCES/0005-bashtests-remove-btrfs-tests.patch b/SOURCES/0005-bashtests-remove-btrfs-tests.patch new file mode 100644 index 0000000..863963a --- /dev/null +++ b/SOURCES/0005-bashtests-remove-btrfs-tests.patch @@ -0,0 +1,742 @@ +From 249118233b47afa7f17c0777b79195e5453e98b3 Mon Sep 17 00:00:00 2001 +From: Jan Tulak +Date: Wed, 17 Apr 2019 11:43:05 +0200 +Subject: [PATCH 5/9] bashtests: remove btrfs tests + +Btrfs is not in RHEL8, there is no sense in testing it on CI, so let's +remove all btrfs related tests. + +Signed-off-by: Jan Tulak +--- + tests/bashtests/006-btrfs-add.sh | 106 --------------- + tests/bashtests/007-btrfs-create.sh | 178 -------------------------- + tests/bashtests/008-btrfs-remove.sh | 161 ----------------------- + tests/bashtests/010-btrfs-snapshot.sh | 135 ------------------- + tests/bashtests/018-migrate.sh | 96 -------------- + 5 files changed, 676 deletions(-) + delete mode 100755 tests/bashtests/006-btrfs-add.sh + delete mode 100755 tests/bashtests/007-btrfs-create.sh + delete mode 100755 tests/bashtests/008-btrfs-remove.sh + delete mode 100755 tests/bashtests/010-btrfs-snapshot.sh + +diff --git a/tests/bashtests/006-btrfs-add.sh b/tests/bashtests/006-btrfs-add.sh +deleted file mode 100755 +index f0b6556..0000000 +--- a/tests/bashtests/006-btrfs-add.sh ++++ /dev/null +@@ -1,106 +0,0 @@ +-#!/bin/bash +-# +-# (C)2012 Red Hat, Inc., Lukas Czerner +-# +-# 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, see . +- +-export test_name='006-btrfs-add' +-test_description='Exercise ssm add with btrfs backend' +- +-. lib/test +- +-DEV_COUNT=10 +-DEV_SIZE=300 +-TEST_MAX_SIZE=$(($DEV_COUNT*$DEV_SIZE)) +-aux prepare_devs $DEV_COUNT $DEV_SIZE +-aux prepare_mnts 10 +-TEST_DEVS=$(cat DEVICES) +-export SSM_DEFAULT_BACKEND='btrfs' +-export SSM_BTRFS_DEFAULT_POOL=$vg1 +-export VOL_PREFIX="vol" +-export SSM_NONINTERACTIVE='1' +-vol1=${VOL_PREFIX}001 +-vol2=${VOL_PREFIX}002 +-vol3=${VOL_PREFIX}003 +- +-pool1=$vg2 +-pool2=$vg3 +- +-# Create default pool with all devices at once +-ssm add $TEST_DEVS +-check btrfs_fs_field $SSM_BTRFS_DEFAULT_POOL dev_count $DEV_COUNT +-check list_table "$(ssm list pool)" $SSM_BTRFS_DEFAULT_POOL btrfs 10 none none none +-ssm -f remove $SSM_BTRFS_DEFAULT_POOL +- +-# Specify backend +-ssm -b btrfs add $TEST_DEVS +-check btrfs_fs_field $SSM_BTRFS_DEFAULT_POOL dev_count $DEV_COUNT +-ssm -f remove $SSM_BTRFS_DEFAULT_POOL +- +-export SSM_DEFAULT_BACKEND='lvm' +-ssm --backend btrfs add $TEST_DEVS +-check btrfs_fs_field $SSM_BTRFS_DEFAULT_POOL dev_count $DEV_COUNT +-ssm -f remove $SSM_BTRFS_DEFAULT_POOL +-export SSM_DEFAULT_BACKEND='btrfs' +- +- +- +-ssm add $TEST_DEVS +-check btrfs_fs_field $SSM_BTRFS_DEFAULT_POOL dev_count $DEV_COUNT +-check list_table "$(ssm list pool)" $SSM_BTRFS_DEFAULT_POOL btrfs $DEV_COUNT none none none +-ssm remove $dev1 $dev2 $dev3 +-check btrfs_fs_field $SSM_BTRFS_DEFAULT_POOL dev_count $(($DEV_COUNT-3)) +-ssm remove $dev4 +-check btrfs_fs_field $SSM_BTRFS_DEFAULT_POOL dev_count $(($DEV_COUNT-4)) +-check list_table "$(ssm list pool)" $SSM_BTRFS_DEFAULT_POOL btrfs $(($DEV_COUNT-4)) none none none +-ssm -f remove $SSM_BTRFS_DEFAULT_POOL +- +-# Create default pool by adding devices one per a call +-for i in $TEST_DEVS; do +- ssm add $i +-done +-check btrfs_fs_field $SSM_BTRFS_DEFAULT_POOL dev_count $DEV_COUNT +-ssm -f remove $SSM_BTRFS_DEFAULT_POOL +- +-# Create different groups from different devices +-ssm add $dev4 +-ssm add $dev1 $dev2 $dev3 -p $pool1 +-ssm add --pool $pool2 $dev7 $dev8 +-ssm add $dev5 $dev6 +-not ssm add $dev5 $dev6 $dev1 -p $pool1 +-ssm add $dev9 $dev1 -p $pool1 +-ssm add $dev10 -p $pool2 +-not ssm add $dev10 -p $pool1 +-not ssm add $dev10 $pool2 -p $pool1 +- +-check btrfs_fs_field $SSM_BTRFS_DEFAULT_POOL dev_count 3 +-check btrfs_fs_field $pool1 dev_count 4 +-check btrfs_fs_field $pool2 dev_count 3 +-ssm_output=$(ssm list pool) +-check list_table "$ssm_output" $SSM_BTRFS_DEFAULT_POOL btrfs 3 none none none +-check list_table "$ssm_output" $pool1 btrfs 4 none none none +-check list_table "$ssm_output" $pool2 btrfs 3 none none none +- +-ssm -f remove --all +- +-ssm add --help +- +-# Some cases which should fail +-not ssm _garbage_ +-not ssm add +-not ssm add _garbage_ +-not ssm add $dev1 ${dev1}not_exist +-not check btrfs_fs_field $SSM_BTRFS_DEFAULT_POOL label $SSM_BTRFS_DEFAULT_POOL +-not ssm add _somepool +-not ssm add $dev1 $dev2 $dev3 -p $pool1 _otherpool +diff --git a/tests/bashtests/007-btrfs-create.sh b/tests/bashtests/007-btrfs-create.sh +deleted file mode 100755 +index 162b7b2..0000000 +--- a/tests/bashtests/007-btrfs-create.sh ++++ /dev/null +@@ -1,178 +0,0 @@ +-#!/bin/bash +-# +-# (C)2012 Red Hat, Inc., Lukas Czerner +-# +-# 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, see . +- +-export test_name='007-btrfs-create' +-test_description='Exercise ssm create command with btrfs backend' +- +-. lib/test +- +-DEV_COUNT=10 +-DEV_SIZE=300 +-TEST_MAX_SIZE=$(($DEV_COUNT*$DEV_SIZE)) +-aux prepare_devs $DEV_COUNT $DEV_SIZE +-aux prepare_mnts 10 +-TEST_DEVS=$(cat DEVICES) +-export SSM_DEFAULT_BACKEND='btrfs' +-export SSM_BTRFS_DEFAULT_POOL=$vg1 +-export VOL_PREFIX="vol" +-export SSM_NONINTERACTIVE='1' +-vol1=${VOL_PREFIX}001 +-vol2=${VOL_PREFIX}002 +-vol3=${VOL_PREFIX}003 +- +-pool1=$vg2 +-pool2=$vg3 +- +-dehumanise() { +- for v in "${@:-$( +-# +-# 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, see . +- +-export test_name='008-btrfs-remove' +-test_description='Exercise ssm remove command with btrfs backend' +- +-. lib/test +- +-DEV_COUNT=10 +-DEV_SIZE=300 +-TEST_MAX_SIZE=$(($DEV_COUNT*$DEV_SIZE)) +-aux prepare_devs $DEV_COUNT $DEV_SIZE +-aux prepare_mnts 10 +-TEST_DEVS=$(cat DEVICES) +-export SSM_DEFAULT_BACKEND='btrfs' +-export SSM_BTRFS_DEFAULT_POOL=$vg1 +-export VOL_PREFIX="vol" +-export SSM_NONINTERACTIVE='1' +-vol1=${VOL_PREFIX}001 +-vol2=${VOL_PREFIX}002 +-vol3=${VOL_PREFIX}003 +- +-pool1=$vg2 +-pool2=$vg3 +- +-# Remove subvolume +-ssm create $TEST_DEVS +-ssm create --name $vol1 +-check btrfs_fs_field $SSM_BTRFS_DEFAULT_POOL label $SSM_BTRFS_DEFAULT_POOL +-ssm -f remove $SSM_BTRFS_DEFAULT_POOL +-not check btrfs_fs_field $SSM_BTRFS_DEFAULT_POOL label $SSM_BTRFS_DEFAULT_POOL +- +-# Remove volume group +-ssm create $TEST_DEVS $mnt1 +-ssm create --name $vol1 +-check btrfs_fs_field $SSM_BTRFS_DEFAULT_POOL dev_count $DEV_COUNT +-check btrfs_vol_field $mnt1 subvolume $vol1 +-ssm list +-ssm -f remove $mnt1/$vol1 +-check btrfs_fs_field $SSM_BTRFS_DEFAULT_POOL dev_count $DEV_COUNT +-not check btrfs_vol_field $mnt1 subvolume $vol1 +-umount $mnt1 +-ssm -f remove $SSM_BTRFS_DEFAULT_POOL +- +-# Remove unused devices from the pool +-ssm create $dev1 +-btrfs filesystem show +-ssm add $TEST_DEVS +-btrfs filesystem show +-check btrfs_fs_field $SSM_BTRFS_DEFAULT_POOL dev_count $DEV_COUNT +-# Skip first few devices, because btrfs is now in a raid mode +-# and won't allow us to delete the last few devices. +-# We only want to see if removal works, so deleting only some is ok. +-ssm -f remove $(echo $TEST_DEVS | cut -d' ' -f5-) +-btrfs filesystem show +-ssm list +-check btrfs_fs_field $SSM_BTRFS_DEFAULT_POOL dev_count 4 +-ssm -f remove --all +- +-# Remove multiple things +-ssm add $dev1 $dev2 -p $pool1 +-ssm create --pool $pool2 $dev3 $dev4 $mnt1 +-ssm create --name $vol1 -p $pool2 +-ssm create --name $vol1 $dev5 $dev6 $mnt3 +-ssm create --name $vol2 $dev7 $dev8 +-ssm add $dev9 +- +-check btrfs_fs_field $pool1 dev_count 2 +-check btrfs_fs_field $pool2 dev_count 2 +-check btrfs_vol_field $mnt1 vol_count 1 +-check btrfs_vol_field $mnt1 subvolume $vol1 +-check btrfs_fs_field $SSM_BTRFS_DEFAULT_POOL dev_count 5 +-check btrfs_vol_field $mnt3 vol_count 1 +-check btrfs_vol_field $mnt3 subvolume $vol2 +- +-ssm list +- +-export SSM_DEFAULT_BACKEND='lvm' +-ssm -f remove $pool1 ${pool2}:$vol1 $mnt3/$vol2 $dev9 +-export SSM_DEFAULT_BACKEND='btrfs' +- +-not check btrfs_fs_field $pool1 label $pool1 +-not check btrfs_vol_field $mnt1 subvolume $vol1 +-not check btrfs_vol_field $mnt2 subvolume $vol2 +-check btrfs_fs_field $SSM_BTRFS_DEFAULT_POOL dev_count 4 +-umount_all +-ssm -f remove --all +- +-# Remove all +-ssm add $dev1 $dev2 -p $pool1 +-ssm create --pool $pool2 $dev3 $dev4 $mnt1 +-ssm create --name $vol1 -p $pool2 +-ssm create --name $vol1 $dev5 $dev6 $mnt3 +-ssm create --name $vol2 $dev7 $dev8 +-ssm create --name $vol3 $mnt2 +-ssm add $dev9 +- +-# We can not remove mounted fs +-not ssm remove $pool2 +- +-# We can not remove mounted subvolume +-not ssm remove ${SSM_BTRFS_DEFAULT_POOL}:${vol3} +- +-check btrfs_fs_field $pool1 dev_count 2 +-check btrfs_fs_field $pool2 dev_count 2 +-check btrfs_vol_field $mnt1 vol_count 1 +-check btrfs_vol_field $mnt1 subvolume $vol1 +-check btrfs_fs_field $SSM_BTRFS_DEFAULT_POOL dev_count 5 +-check btrfs_vol_field $mnt3 vol_count 2 +-check btrfs_vol_field $mnt3 subvolume $vol2 +-check btrfs_vol_field $mnt2 subvolume $vol3 +- +-# but we can force it +-ssm -f remove ${SSM_BTRFS_DEFAULT_POOL}:${vol3} +-not check btrfs_vol_field $mnt2 subvolume $vol3 +- +-umount_all +-ssm -f remove --all +- +-#Remove subvolume which is not mounted +-ssm create $dev1 $dev2 +-ssm create --name $vol1 +-ssm create --name $vol2 +-ssm create --name ${vol1}/${vol3} $mnt1 +- +-check btrfs_vol_field $mnt1 vol_count 3 +-ssm remove ${SSM_BTRFS_DEFAULT_POOL}:$vol2 +-ssm list +- +-check btrfs_vol_field $mnt1 vol_count 2 +-check btrfs_fs_field $SSM_BTRFS_DEFAULT_POOL dev_count 2 +-check btrfs_vol_field $mnt1 subvolume $vol1 +-not check btrfs_vol_field $mnt1 subvolume $vol2 +-check btrfs_vol_field $mnt1 subvolume ${vol1}/${vol3} +- +-umount_all +-ssm -f remove --all +- +-not check btrfs_fs_field $pool1 label $pool1 +-not check btrfs_fs_field $pool2 label $pool2 +-not check btrfs_fs_field $SSM_BTRFS_DEFAULT_POOL label $SSM_BTRFS_DEFAULT_POOL +- +-ssm remove --help +- +-# Some cases which should fail +-not ssm remove +-not ssm -f remove --all +diff --git a/tests/bashtests/010-btrfs-snapshot.sh b/tests/bashtests/010-btrfs-snapshot.sh +deleted file mode 100755 +index 075dedf..0000000 +--- a/tests/bashtests/010-btrfs-snapshot.sh ++++ /dev/null +@@ -1,135 +0,0 @@ +-#!/bin/bash +-# +-# (C)2012 Red Hat, Inc., Lukas Czerner +-# +-# 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, see . +- +-export test_name='010-btrfs-snapshot' +-test_description='Exercise ssm snapshot command with btrfs' +- +-. lib/test +- +-DEV_COUNT=10 +-DEV_SIZE=300 +-TEST_MAX_SIZE=$(($DEV_COUNT*$DEV_SIZE)) +-aux prepare_devs $DEV_COUNT $DEV_SIZE +-aux prepare_mnts 10 +-TEST_DEVS=$(cat DEVICES) +-export SSM_DEFAULT_BACKEND='btrfs' +-export SSM_BTRFS_DEFAULT_POOL=$vg1 +-export VOL_PREFIX="vol" +-export SSM_NONINTERACTIVE='1' +-vol1=${VOL_PREFIX}001 +-vol2=${VOL_PREFIX}002 +-vol3=${VOL_PREFIX}003 +- +-pool1=$vg2 +-pool2=$vg3 +- +-snap1="snap1" +-snap2="snap2" +-snap3="snap3" +-snap4="snap4" +-snap5="snap5" +-snap6="snap6" +- +- +-# Create volume with all devices at once +-ssm create $TEST_DEVS $mnt1 +- +-# Take a snapshot with the default params +-export SSM_DEFAULT_BACKEND='lvm' +-ssm snapshot $mnt1 +-check btrfs_vol_field $mnt1 vol_count 1 +-check list_table "$(ssm list snap)" $SSM_BTRFS_DEFAULT_POOL:snap-....-..-..-....... $SSM_BTRFS_DEFAULT_POOL none btrfs $mnt1/snap-....-..-..-....... +-export SSM_DEFAULT_BACKEND='btrfs' +- +-umount $mnt1 +-# Remove entire pool +-ssm -f remove $SSM_BTRFS_DEFAULT_POOL +- +-# Create volume with all devices at once +-ssm create $TEST_DEVS +- +-# Take a snapshot with the default params +-ssm snapshot $SSM_BTRFS_DEFAULT_POOL +-mount LABEL=$SSM_BTRFS_DEFAULT_POOL $mnt1 +-check btrfs_vol_field $mnt1 vol_count 1 +-umount $mnt1 +- +-# Remove entire pool +-ssm -f remove $SSM_BTRFS_DEFAULT_POOL +- +-# Create volume with all devices at once +-ssm create $TEST_DEVS +- +-# Take a snapshot with defined name +-ssm snapshot --name $snap1 $SSM_BTRFS_DEFAULT_POOL +-ssm snapshot --name $snap2 $SSM_BTRFS_DEFAULT_POOL +-ssm snapshot --name $snap3 $SSM_BTRFS_DEFAULT_POOL +-mount LABEL=$SSM_BTRFS_DEFAULT_POOL $mnt1 +-check btrfs_vol_field $mnt1 vol_count 3 +-check btrfs_vol_field $mnt1 subvolume $snap1 +-check btrfs_vol_field $mnt1 subvolume $snap2 +-check btrfs_vol_field $mnt1 subvolume $snap3 +-ssm_output=$(ssm list vol) +-check list_table "$ssm_output" $SSM_BTRFS_DEFAULT_POOL $SSM_BTRFS_DEFAULT_POOL none btrfs none none btrfs $mnt1 +-not check list_table "$ssm_output" $SSM_BTRFS_DEFAULT_POOL:$snap1 $SSM_BTRFS_DEFAULT_POOL none btrfs none none btrfs $mnt1/$snap1 +-not check list_table "$ssm_output" $SSM_BTRFS_DEFAULT_POOL:$snap2 $SSM_BTRFS_DEFAULT_POOL none btrfs none none btrfs $mnt1/$snap2 +-not check list_table "$ssm_output" $SSM_BTRFS_DEFAULT_POOL:$snap3 $SSM_BTRFS_DEFAULT_POOL none btrfs none none btrfs $mnt1/$snap3 +-ssm_output=$(ssm list snap) +-not check list_table "$ssm_output" $SSM_BTRFS_DEFAULT_POOL $SSM_BTRFS_DEFAULT_POOL none btrfs btrfs $mnt1 +-check list_table "$ssm_output" $SSM_BTRFS_DEFAULT_POOL:$snap1 $SSM_BTRFS_DEFAULT_POOL none btrfs $mnt1/$snap1 +-check list_table "$ssm_output" $SSM_BTRFS_DEFAULT_POOL:$snap2 $SSM_BTRFS_DEFAULT_POOL none btrfs $mnt1/$snap2 +-check list_table "$ssm_output" $SSM_BTRFS_DEFAULT_POOL:$snap3 $SSM_BTRFS_DEFAULT_POOL none btrfs $mnt1/$snap3 +- +-# Remove the snapshot volumes +-ssm -f remove $SSM_BTRFS_DEFAULT_POOL:$snap1 $SSM_BTRFS_DEFAULT_POOL:$snap2 $SSM_BTRFS_DEFAULT_POOL:$snap3 +-not check btrfs_vol_field $mnt1 subvolume $snap1 +-not check btrfs_vol_field $mnt1 subvolume $snap2 +-not check btrfs_vol_field $mnt1 subvolume $snap3 +- +-# Take a snapshot with defined name when volume is mounted +-ssm snapshot --name $snap1 $SSM_BTRFS_DEFAULT_POOL +-ssm snapshot --name $snap2 $mnt1 +-ssm snapshot --name $snap3 $SSM_BTRFS_DEFAULT_POOL +- +-ssm snapshot --name $snap4 $mnt1/$snap3 +-ssm snapshot --name $snap3/$snap4/$snap5 $mnt1 +-check btrfs_vol_field $mnt1 vol_count 5 +-check btrfs_vol_field $mnt1 subvolume $snap1 +-check btrfs_vol_field $mnt1 subvolume $snap2 +-check btrfs_vol_field $mnt1 subvolume $snap3 +-check btrfs_vol_field $mnt1 subvolume $snap3/$snap4 +-check btrfs_vol_field $mnt1 subvolume $snap3/$snap4/$snap5 +-ssm_output=$(ssm list vol) +-check list_table "$ssm_output" $SSM_BTRFS_DEFAULT_POOL $SSM_BTRFS_DEFAULT_POOL none btrfs none none btrfs $mnt1 +-ssm_output=$(ssm list snap) +-check list_table "$ssm_output" $SSM_BTRFS_DEFAULT_POOL:$snap1 $SSM_BTRFS_DEFAULT_POOL none btrfs $mnt1/$snap1 +-check list_table "$ssm_output" $SSM_BTRFS_DEFAULT_POOL:$snap2 $SSM_BTRFS_DEFAULT_POOL none btrfs $mnt1/$snap2 +-check list_table "$ssm_output" $SSM_BTRFS_DEFAULT_POOL:$snap3 $SSM_BTRFS_DEFAULT_POOL none btrfs $mnt1/$snap3 +-check list_table "$ssm_output" $SSM_BTRFS_DEFAULT_POOL:$snap3/$snap4 $SSM_BTRFS_DEFAULT_POOL none btrfs $mnt1/$snap3/$snap4 +-check list_table "$ssm_output" $SSM_BTRFS_DEFAULT_POOL:$snap3/$snap4/$snap5 $SSM_BTRFS_DEFAULT_POOL none btrfs $mnt1/$snap3/$snap4/$snap5 +- +-umount_all +- +-ssm -f remove --all +-ssm snapshot --help +- +-# Some cases which should fail +-not ssm snapshot +-ssm create $TEST_DEVS +-not ssm snapshot $SSM_BTRFS_DEFAULT_POOL/$lvol1 +- +-ssm -f remove --all +diff --git a/tests/bashtests/018-migrate.sh b/tests/bashtests/018-migrate.sh +index fa378fd..fa1a745 100755 +--- a/tests/bashtests/018-migrate.sh ++++ b/tests/bashtests/018-migrate.sh +@@ -80,79 +80,6 @@ not ssm migrate $mnt1 $dev1 + #wipefs -a $dev1 + #wipefs -a $dev2 + +-# BTRFS +-export SSM_DEFAULT_BACKEND='btrfs' +- +-# Simple btrfs migrate to plain device +-#ssm create $dev1 +-#check btrfs_devices $SSM_BTRFS_DEFAULT_POOL $dev1 +-#ssm migrate $dev1 $dev2 +-#check btrfs_devices $SSM_BTRFS_DEFAULT_POOL $dev2 +-#test_volume $SSM_BTRFS_DEFAULT_POOL +-# Btrfs migrate on device with signature (ext4) +-#not ssm migrate $dev2 $dev3 +-#ssm -f migrate $dev2 $dev3 +-#check btrfs_devices $SSM_BTRFS_DEFAULT_POOL $dev3 +-#test_volume $SSM_BTRFS_DEFAULT_POOL +-#ssm -f remove --all +- +-# Simple btrfs migrate of mounted fs +-ssm create $dev1 $mnt1 +-check btrfs_devices $SSM_BTRFS_DEFAULT_POOL $dev1 +-not ssm migrate $mnt1 $dev2 +-ssm migrate $dev1 $dev2 +-check btrfs_devices $SSM_BTRFS_DEFAULT_POOL $dev2 +-umount $mnt1 +-ssm check $SSM_BTRFS_DEFAULT_POOL +-ssm -f remove --all +- +-# Migrate device from multi-device btrfs +-ssm create -p $vg1 $dev1 $dev2 +-ssm create -p $vg2 $dev3 $dev4 $dev5 +-ssm -f migrate $dev2 $dev6 +-check btrfs_devices $vg1 $dev1 $dev6 +-check btrfs_devices $vg2 $dev3 $dev4 $dev5 +-test_volume $vg1 +-test_volume $vg2 +- +-# Migrate to a device already used in btrfs pool +-not ssm migrate $dev1 $dev3 +-ssm -f migrate $dev1 $dev3 +-check btrfs_devices $vg1 $dev3 $dev6 +-check btrfs_devices $vg2 $dev4 $dev5 +-test_volume $vg1 +-test_volume $vg2 +-ssm -f remove --all +- +-# Do not allow migrate between devices within a single pool in btrfs +-ssm create $dev1 $dev2 $dev3 $dev4 +-not ssm migrate $dev1 $dev2 +-not ssm -f migrate $dev1 $dev2 +-check btrfs_devices $SSM_BTRFS_DEFAULT_POOL $dev1 $dev2 $dev3 $dev4 +-ssm -f remove --all +- +-# migrate plain device to a device in btrfs pool - not used +-#ssm create -p $vg1 $dev1 $dev2 $dev3 +-#mkfs.ext4 -F $dev4 +-#not ssm migrate $dev4 $dev3 +-#ssm -f migrate $dev4 $dev3 +-#check btrfs_devices $vg1 $dev1 $dev2 +-#test_volume $vg1 +-#fsck.ext4 -fn $dev3 +- +-# migrate plain device to a device in btrfs pool - used completely +-#ssm -f add -p $vg1 $dev3 +-#ssm mount $vg1 $mnt1 +-# Fill it up as much as we can, we do not care if dd fails +-#! dd if=/dev/zero of=$mnt1/file bs=1M +-#sync +-#umount $mnt1 +-#not ssm migrate $dev4 $dev1 +-#not ssm -f migrate $dev4 $dev1 +-#check btrfs_devices $vg1 $dev1 $dev2 $dev3 +-#test_volume $vg1 +-#ssm -f remove --all +- + export SSM_DEFAULT_BACKEND='lvm' + + # LVM +@@ -252,29 +179,6 @@ check vg_devices $SSM_LVM_DEFAULT_POOL $dev1 $dev2 $dev3 $dev5 + #test_volume $dev5 + ssm -f remove --all + +-# migrate from btrfs pool to lvm +-wipefs -a $dev4 $dev5 +-ssm -b btrfs create -p $vg1 $dev1 $dev2 $dev3 +-ssm -b lvm create --fs ext4 -p $vg2 $dev4 $dev5 +-not ssm migrate $dev5 $dev3 +-ssm -f migrate $dev5 $dev3 +-check btrfs_devices $vg1 $dev1 $dev2 +-check vg_devices $vg2 $dev4 $dev5 $dev3 +-test_volume $vg1 +-test_volume $vg2/$lvol1 +-ssm -f remove --all +- +-# migrate from lvm to btrfs pool +-ssm -b btrfs create -p $vg1 $dev1 $dev2 $dev3 +-ssm -b lvm create --fs ext4 -p $vg2 $dev4 $dev5 +-ssm add -p $vg2 $dev6 +-not ssm migrate $dev3 $dev6 +-ssm -f migrate $dev3 $dev6 +-check btrfs_devices $vg1 $dev1 $dev2 $dev6 +-check vg_devices $vg2 $dev4 $dev5 +-test_volume $vg1 +-test_volume $vg2/$lvol1 +-ssm -f remove --all + + # CRYPT + +-- +2.21.0 + diff --git a/SOURCES/0006-tests-add-bash-test-skipping-capabilities.patch b/SOURCES/0006-tests-add-bash-test-skipping-capabilities.patch new file mode 100644 index 0000000..657aba2 --- /dev/null +++ b/SOURCES/0006-tests-add-bash-test-skipping-capabilities.patch @@ -0,0 +1,163 @@ +From 63b1437d96468d0fc81ea6ed0def628b98cbb285 Mon Sep 17 00:00:00 2001 +From: Jan Tulak +Date: Tue, 24 Jul 2018 14:11:13 +0200 +Subject: [PATCH 6/9] tests: add bash test skipping capabilities + +Not all tests can be run all the time. If e.g. a required tool for some +backend is missing, it is better to skip the test and mark it so, rather +than fail, leaving the developer to search why. + +Signed-off-by: Jan Tulak +--- + .gitignore | 1 + + test.py | 35 ++++++++++++++++++++++++++++---- + tests/bashtests/016-multipath.sh | 4 ++-- + tests/bashtests/lib/utils.sh | 5 +++++ + 4 files changed, 39 insertions(+), 6 deletions(-) + +diff --git a/.gitignore b/.gitignore +index 53af491..d0038e8 100644 +--- a/.gitignore ++++ b/.gitignore +@@ -5,4 +5,5 @@ doc/src/options/ + *.pyc + *.swp + tests/bashtests/*.bad ++tests/bashtests/*.skipped + tests/bashtests/*.out +diff --git a/test.py b/test.py +index 5620679..9c2610e 100755 +--- a/test.py ++++ b/test.py +@@ -103,7 +103,7 @@ def check_system_dependencies(): + return True + + +-def run_bash_tests(names, want_logs=False): ++def run_bash_tests(names, exclude=[], want_logs=False): + cur = os.getcwd() + os.chdir('./tests/bashtests') + command = ['ls', '-m'] +@@ -112,6 +112,7 @@ def run_bash_tests(names, want_logs=False): + + failed = [] + passed = [] ++ skipped = [] + count = 0 + misc.run('./set.sh', stdout=False) + output = misc.run(command, stdout=False)[1] +@@ -122,12 +123,20 @@ def run_bash_tests(names, want_logs=False): + continue + if names and script not in names and script[:3] not in names: + continue ++ if exclude and (script in exclude or script[:3] in exclude): ++ skipped.append(script) ++ print("{0:<29} \033[90m[SKIPPED]\033[0m".format(script)) ++ continue ++ + count += 1 + sys.stdout.write("{0:<29}".format(script) + " ") + sys.stdout.flush() + bad_file = re.sub("\.sh$",".bad", script) ++ skip_file = re.sub("\.sh$",".skipped", script) + if os.access(bad_file, os.R_OK): + os.remove(bad_file) ++ if os.access(skip_file, os.R_OK): ++ os.remove(skip_file) + ret, out, err = misc.run(['./' + script], stdout=False, can_fail=True) + if ret: + print("\033[91m[FAILED]\033[0m") +@@ -140,6 +149,11 @@ def run_bash_tests(names, want_logs=False): + print("\033[93m[WARNING]\033[0m") + with open(bad_file, 'w') as f: + f.write(out) ++ elif re.search("\[TEST SKIPPED\]", out): ++ print("\033[90m[SKIPPED]\033[0m") ++ skipped.append(script) ++ with open(skip_file, 'w') as f: ++ f.write(out) + else: + print("\033[92m[PASSED]\033[0m") + passed.append(script) +@@ -156,6 +170,10 @@ def run_bash_tests(names, want_logs=False): + print("Ran {0} tests in {1} seconds.".format(count, round(t1, 2))) + print("{0} tests PASSED: {1}".format(len(passed), ", ".join(passed))) + ret = 0 ++ if len(skipped) > 0: ++ print("{0} tests SKIPPED: {1}".format(len(skipped), ", ".join(skipped))) ++ print("See files with \"skipped\" extension for output") ++ + if len(failed) > 0: + print("{0} tests FAILED: {1}".format(len(failed), ", ".join(failed))) + print("See files with \"bad\" extension for output") +@@ -269,7 +287,11 @@ if __name__ == '__main__': + parser.add_argument('-l', '--logs', dest='want_logs', action='store_true', + help='if a bash test fails, print out it\'s log to stdout') + parser.add_argument('-s', '--system', dest='system', action='store_true', +- help='Test the installed version of ssm in system. Implies --bash.') ++ help='test the installed version of ssm in system. implies --bash.') ++ parser.add_argument('--skip', metavar='TEST', type=str, nargs='+', ++ help='Bash tests to to be skipped. ' ++ 'Can\'t be used together with an explicit list of tests to run.' ++ 'Tests can be specified either with a full name, or by just their number.') + parser.add_argument('tests', metavar='TEST', type=str, nargs='*', + help='Specific tests to be run. For bash tests, ' + 'that means either a full name (001-foo.sh), ' +@@ -277,10 +299,15 @@ if __name__ == '__main__': + 'For unit tests, it means something like ' + 'BtrfsFunctionCheck.test_btrfs_resize for a specific test, ' + 'BtrfsFunctionCheck for specific test suite ' +- 'and test_btrfs for a whole file of tests.') ++ 'and test_btrfs for a whole file of tests.' ++ 'Can\'t be used together with --skip.') + + args = parser.parse_args() + ++ if args.skip and args.tests: ++ print("Do not use --skip together with a list of tests to be run.") ++ sys.exit(1) ++ + check_system_dependencies() + if args.system: + args.bash = True +@@ -306,5 +333,5 @@ if __name__ == '__main__': + print("\nRoot privileges required to run more tests!\n") + sys.exit(0) + print("[+] Running bash tests") +- result = run_bash_tests(names=args.tests, want_logs=args.want_logs) ++ result = run_bash_tests(names=args.tests, exclude=args.skip, want_logs=args.want_logs) + sys.exit(result) +diff --git a/tests/bashtests/016-multipath.sh b/tests/bashtests/016-multipath.sh +index a8e8855..5a43e24 100755 +--- a/tests/bashtests/016-multipath.sh ++++ b/tests/bashtests/016-multipath.sh +@@ -25,11 +25,11 @@ if ! mpath_is_configured; then + echo "Multipath is not installed or configured!" + echo "If it is installed, then you need to have an empty configuration created with this:" + echo "sudo mpathconf --enable --with_multipathd y" +- exit 1 ++ skip_test + fi + if [ mpath_verify -eq 0]; then + echo "This test can't be run, because there already is an existing multipath configuration." +- exit 1 ++ skip_test + fi + + export COLUMNS=1024 +diff --git a/tests/bashtests/lib/utils.sh b/tests/bashtests/lib/utils.sh +index 5627770..7b87f89 100644 +--- a/tests/bashtests/lib/utils.sh ++++ b/tests/bashtests/lib/utils.sh +@@ -205,3 +205,8 @@ if [ -n "$PREFIX" ]; then + eval "mnt$i=$mnt" + done + fi ++ ++skip_test() { ++ echo "[TEST SKIPPED]" ++ exit 0 ++} +-- +2.21.0 + diff --git a/SOURCES/0007-show-available-memory-when-running-tests.patch b/SOURCES/0007-show-available-memory-when-running-tests.patch new file mode 100644 index 0000000..d5c077c --- /dev/null +++ b/SOURCES/0007-show-available-memory-when-running-tests.patch @@ -0,0 +1,26 @@ +From ee669a077d48bf1c5e3ffd8bf14b79d640055c93 Mon Sep 17 00:00:00 2001 +From: Jan Tulak +Date: Tue, 23 Apr 2019 14:23:21 +0200 +Subject: [PATCH 7/9] show available memory when running tests + +Signed-off-by: Jan Tulak +--- + test.py | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/test.py b/test.py +index 9c2610e..3c8ba4f 100755 +--- a/test.py ++++ b/test.py +@@ -309,6 +309,8 @@ if __name__ == '__main__': + sys.exit(1) + + check_system_dependencies() ++ os.system('free -h') ++ + if args.system: + args.bash = True + os.environ['SSM_TEST_SYSTEM'] = '1' +-- +2.21.0 + diff --git a/SOURCES/0008-tests-018-remove-unnecessary-check-for-crypt.patch b/SOURCES/0008-tests-018-remove-unnecessary-check-for-crypt.patch new file mode 100644 index 0000000..713dce6 --- /dev/null +++ b/SOURCES/0008-tests-018-remove-unnecessary-check-for-crypt.patch @@ -0,0 +1,29 @@ +From 56160e073deee585ea75a2ee69b2706918430ebe Mon Sep 17 00:00:00 2001 +From: Jan Tulak +Date: Tue, 23 Apr 2019 16:10:36 +0200 +Subject: [PATCH 8/9] tests: 018 - remove unnecessary check for crypt + +This is migrate test, not crypt test, so we don't have to test +what version of encryption was used; Hardcoded value like the removed +line leads to trouble when the system default changes. + +Signed-off-by: Jan Tulak +--- + tests/bashtests/018-migrate.sh | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/tests/bashtests/018-migrate.sh b/tests/bashtests/018-migrate.sh +index fa1a745..898f827 100755 +--- a/tests/bashtests/018-migrate.sh ++++ b/tests/bashtests/018-migrate.sh +@@ -196,7 +196,6 @@ crypt_vol1=${CRYPT_VOL_PREFIX}001 + + passwd="cai0ohMo8M" + pass | ssm create $dev1 +-check crypt_vol_field $crypt_vol1 type LUKS1 + check crypt_vol_field $crypt_vol1 device $dev1 + check list_table "$(ssm list vol)" $crypt_vol1 $SSM_CRYPT_DEFAULT_POOL none crypt + +-- +2.21.0 + diff --git a/SOURCES/0009-tests-rhel8-changed-default-luks1-to-luks2.patch b/SOURCES/0009-tests-rhel8-changed-default-luks1-to-luks2.patch new file mode 100644 index 0000000..ccd375e --- /dev/null +++ b/SOURCES/0009-tests-rhel8-changed-default-luks1-to-luks2.patch @@ -0,0 +1,76 @@ +From bf5770bb1b25c35a978f446e479e12f9f6805e76 Mon Sep 17 00:00:00 2001 +From: Jan Tulak +Date: Tue, 23 Apr 2019 16:15:51 +0200 +Subject: [PATCH 9/9] tests: rhel8 changed default luks1 to luks2 + +Signed-off-by: Jan Tulak +--- + tests/bashtests/012-crypt-create.sh | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +diff --git a/tests/bashtests/012-crypt-create.sh b/tests/bashtests/012-crypt-create.sh +index b668339..bf39637 100755 +--- a/tests/bashtests/012-crypt-create.sh ++++ b/tests/bashtests/012-crypt-create.sh +@@ -67,17 +67,17 @@ ssm remove ${DEV}/$crypt_vol1 + + # Create encrypted volume + pass | ssm create $dev1 +-check crypt_vol_field $crypt_vol1 type LUKS1 ++check crypt_vol_field $crypt_vol1 type LUKS2 + check crypt_vol_field $crypt_vol1 device $dev1 + check list_table "$(ssm list vol)" $crypt_vol1 $SSM_CRYPT_DEFAULT_POOL none crypt + + pass | ssm create $dev2 -e +-check crypt_vol_field $crypt_vol2 type LUKS1 ++check crypt_vol_field $crypt_vol2 type LUKS2 + check crypt_vol_field $crypt_vol2 device $dev2 + check list_table "$(ssm list vol)" $crypt_vol2 $SSM_CRYPT_DEFAULT_POOL none crypt + + pass | ssm create -e luks $dev3 +-check crypt_vol_field $crypt_vol3 type LUKS1 ++check crypt_vol_field $crypt_vol3 type LUKS2 + check crypt_vol_field $crypt_vol3 device $dev3 + check list_table "$(ssm list vol)" $crypt_vol3 $SSM_CRYPT_DEFAULT_POOL none crypt + +@@ -115,16 +115,16 @@ export SSM_DEFAULT_BACKEND='lvm' + + # Try a short password with backend different than crypt + ! echo -e "a\na" | ssm create $dev1 -e luks +-! check crypt_vol_field $crypt_vol1 type LUKS1 ++! check crypt_vol_field $crypt_vol1 type LUKS2 + # force it + echo -e "a\na" | ssm -f create $dev1 -e luks +-check crypt_vol_field $crypt_vol1 type LUKS1 ++check crypt_vol_field $crypt_vol1 type LUKS2 + ssm remove ${DEV}/$crypt_vol1 + ssm -f remove $SSM_LVM_DEFAULT_POOL || true + + pass | ssm create --fs $fs3 $dev1 $dev2 $mnt1 -e + check mountpoint $crypt_vol1 $mnt1 +-check crypt_vol_field $crypt_vol1 type LUKS1 ++check crypt_vol_field $crypt_vol1 type LUKS2 + check crypt_vol_field $crypt_vol1 device ${SSM_LVM_DEFAULT_POOL}-$lvol1 + check list_table "$(ssm list vol)" $crypt_vol1 $SSM_CRYPT_DEFAULT_POOL none $fs3 none none crypt + check list_table "$(ssm list vol)" $SSM_LVM_DEFAULT_POOL/$lvol1 $SSM_LVM_DEFAULT_POOL none linear +@@ -138,7 +138,7 @@ check list_table "$(ssm list vol)" $SSM_LVM_DEFAULT_POOL/$lvol2 $SSM_LVM_DEFAULT + check lv_field $SSM_LVM_DEFAULT_POOL/$lvol2 pv_count 4 + + pass | ssm create $dev5 -e luks +-check crypt_vol_field $crypt_vol3 type LUKS1 ++check crypt_vol_field $crypt_vol3 type LUKS2 + check crypt_vol_field $crypt_vol3 device ${SSM_LVM_DEFAULT_POOL}-$lvol3 + check list_table "$(ssm list vol)" $crypt_vol3 $SSM_CRYPT_DEFAULT_POOL none crypt + check list_table "$(ssm list vol)" $SSM_LVM_DEFAULT_POOL/$lvol3 $SSM_LVM_DEFAULT_POOL none linear +@@ -161,7 +161,7 @@ ssm -f remove $SSM_LVM_DEFAULT_POOL + ssm create $dev1 $dev2 + ssm list + pass | ssm -b crypt create $DM_DEV_DIR/$SSM_LVM_DEFAULT_POOL/$lvol1 +-check crypt_vol_field $crypt_vol1 type LUKS1 ++check crypt_vol_field $crypt_vol1 type LUKS2 + check crypt_vol_field $crypt_vol1 device ${SSM_LVM_DEFAULT_POOL}-$lvol1 + check list_table "$(ssm list vol)" $crypt_vol1 $SSM_CRYPT_DEFAULT_POOL none crypt + check list_table "$(ssm list vol)" $SSM_LVM_DEFAULT_POOL/$lvol1 $SSM_LVM_DEFAULT_POOL none linear +-- +2.21.0 + diff --git a/SOURCES/0010-crypt-accept-versions-with-rc-suffix-as-well.patch b/SOURCES/0010-crypt-accept-versions-with-rc-suffix-as-well.patch new file mode 100644 index 0000000..516d417 --- /dev/null +++ b/SOURCES/0010-crypt-accept-versions-with-rc-suffix-as-well.patch @@ -0,0 +1,102 @@ +From a3419509c2f4baadd453fc650cef894a6b53329b Mon Sep 17 00:00:00 2001 +From: Jan Tulak +Date: Thu, 6 Jun 2019 13:13:15 +0200 +Subject: [PATCH] crypt: accept versions with -rc suffix as well + +SSM crashed if cryptsetup --version produced a string like cryptsetup +1.2.3-rc0. Make sure that the -rc and similar suffixes doesn't matter. + +Signed-off-by: Jan Tulak +--- + ssmlib/backends/crypt.py | 2 ++ + tests/unittests/__init__.py | 3 +- + tests/unittests/test_crypt.py | 52 +++++++++++++++++++++++++++++++++++ + 3 files changed, 56 insertions(+), 1 deletion(-) + create mode 100644 tests/unittests/test_crypt.py + +diff --git a/ssmlib/backends/crypt.py b/ssmlib/backends/crypt.py +index 8d93fe9..dd203e0 100644 +--- a/ssmlib/backends/crypt.py ++++ b/ssmlib/backends/crypt.py +@@ -52,6 +52,8 @@ MAX_DEVS = 999 + def get_cryptsetup_version(): + try: + output = misc.run(['cryptsetup', '--version'], can_fail=True)[1] ++ # drop -rc and similar additions ++ output = re.sub(r"-.*$", '', output) + version = list(map(int, output.strip().split()[-1].split('.', 3))) + except (OSError, AttributeError): + version = [0, 0, 0] +diff --git a/tests/unittests/__init__.py b/tests/unittests/__init__.py +index 512baac..52cd1ba 100644 +--- a/tests/unittests/__init__.py ++++ b/tests/unittests/__init__.py +@@ -15,4 +15,5 @@ + # You should have received a copy of the GNU General Public License + # along with this program. If not, see . + +-__all__ = ["test_ssm", "test_lvm", "test_btrfs", "test_misc", "test_multipath"] ++__all__ = ["test_ssm", "test_lvm", "test_btrfs", "test_misc", "test_multipath", ++ "test_crypt"] +diff --git a/tests/unittests/test_crypt.py b/tests/unittests/test_crypt.py +new file mode 100644 +index 0000000..2acb58a +--- /dev/null ++++ b/tests/unittests/test_crypt.py +@@ -0,0 +1,52 @@ ++#!/usr/bin/env python ++# ++# (C)2012 Red Hat, Inc., Lukas Czerner ++# ++# 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, see . ++ ++# Unittests for the system storage manager btrfs backend ++ ++ ++import unittest ++from ssmlib import main ++from ssmlib import misc ++from ssmlib import problem ++from ssmlib.backends import crypt ++from tests.unittests.common import * ++from unittest.mock import MagicMock, patch ++ ++IGNORE_CMDS = ['udevadm'] ++ ++class CryptFunctionCheck(MockSystemDataSource): ++ ++ def test_get_version(self): ++ """Traceback (most recent call last): ++ File "./test.py", line 32, in ++ from ssmlib import main ++ File "/var/str/source/ssmlib/main.py", line 31, in ++ from ssmlib.backends import lvm, crypt, btrfs, md, multipath ++ File "/var/str/source/ssmlib/backends/crypt.py", line 60, in ++ CRYPTSETUP_VERSION = get_cryptsetup_version() ++ File "/var/str/source/ssmlib/backends/crypt.py", line 55, in get_cryptsetup_version ++ version = list(map(int, output.strip().split()[-1].split('.', 3))) ++ ValueError: invalid literal for int() with base 10: '0-rc0' ++ """ ++ ++ mock = MagicMock(return_value=(None, "cryptsetup 1.2.3-rc0")) ++ with patch('ssmlib.misc.run', mock): ++ self.assertEqual([1, 2, 3], crypt.get_cryptsetup_version()) ++ ++ mock = MagicMock(return_value=(None, "cryptsetup 10.21.32")) ++ with patch('ssmlib.misc.run', mock): ++ self.assertEqual([10, 21, 32], crypt.get_cryptsetup_version()) +\ No newline at end of file +-- +2.21.0 + diff --git a/SPECS/system-storage-manager.spec b/SPECS/system-storage-manager.spec new file mode 100644 index 0000000..df49274 --- /dev/null +++ b/SPECS/system-storage-manager.spec @@ -0,0 +1,183 @@ +%{!?_pkgdocdir: %global _pkgdocdir %{_docdir}/%{name}-%{version}} + +Name: system-storage-manager +Version: 1.4 +Release: 1%{?dist} +Summary: A single tool to manage your storage + +Group: System Environment/Base +License: GPLv2+ +URL: https://system-storage-manager.github.io/ +Source0: https://github.com/system-storage-manager/ssm/archive/%{name}-%{version}.tar.gz + +Patch1: 0001-ssm-enforce-python3.patch +Patch2: 0002-Remove-info-command-for-RHEL.patch +Patch3: 0003-unittests-better-multipath-message-on-fail.patch +Patch4: 0004-bashtests-allow-testing-of-system-wide-ssm.patch +Patch5: 0005-bashtests-remove-btrfs-tests.patch +Patch6: 0006-tests-add-bash-test-skipping-capabilities.patch +Patch7: 0007-show-available-memory-when-running-tests.patch +Patch8: 0008-tests-018-remove-unnecessary-check-for-crypt.patch +Patch9: 0009-tests-rhel8-changed-default-luks1-to-luks2.patch +Patch10: 0010-crypt-accept-versions-with-rc-suffix-as-well.patch + + +BuildArch: noarch +BuildRequires: python3-devel +BuildRequires: python3-sphinx +BuildRequires: python3-pwquality +Requires: util-linux +Requires: which +Requires: xfsprogs +Requires: e2fsprogs +Requires: python3-pwquality + + +%description +System Storage Manager provides an easy to use command line interface to manage +your storage using various technologies like lvm, btrfs, encrypted volumes and +more. + +In more sophisticated enterprise storage environments, management with Device +Mapper (dm), Logical Volume Manager (LVM), or Multiple Devices (md) is becoming +increasingly more difficult. With file systems added to the mix, the number of +tools needed to configure and manage storage has grown so large that it is +simply not user friendly. With so many options for a system administrator to +consider, the opportunity for errors and problems is large. + +The btrfs administration tools have shown us that storage management can be +simplified, and we are working to bring that ease of use to Linux file systems +in general. + +You should install the ssm if you need to manage your storage with various +technologies via a single unified interface. + + +%prep +%setup -q -n ssm-%{name}-%{version} + +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 +%patch7 -p1 +%patch8 -p1 +%patch9 -p1 +%patch10 -p1 + + + +%build +make docs + + +%install +rm -rf ${RPM_BUILD_ROOT} +%{__python3} setup.py install --root=${RPM_BUILD_ROOT} +if [ "%{_pkgdocdir}" != "%{_docdir}/%{name}-%{version}" ]; then + mv ${RPM_BUILD_ROOT}/{%{_docdir}/%{name}-%{version},%{_pkgdocdir}} +fi + +%check +# run unit tests, these have to pass +%{__python3} test.py -u + + +%files +%{_bindir}/ssm +%{_pkgdocdir}/ +%{_mandir}/man8/ssm.8* +%{python3_sitelib}/ssmlib/ +%{python3_sitelib}/*.egg-info + + +%changelog +*Wed Jun 5 2019 Jan Tulak - 1.4-1: +- Bring changes from upstream 1.4 (mostly bugfixes) +- Remove multipath from the list of default backends (rhbz#1685019) +- Fix locale issue (rhbz#1679587) + +*Fri Feb 15 2019 Jan Tulak - 1.2-3: +- Gating tests implementation, which meant adding few more changes + to the existing patches (#1681969) +- sphinx patch was merged to python3 change +- add seq numbers to patch files + +*Fri Feb 15 2019 Jan Tulak - 1.2-2: +- fix poor luks password leads to ssm crash (rhbz#1670714) + +* Sun Aug 12 2018 Jan Tulak - 1.2-1 +- Upstream release 1.2 which fixes: +- use pwquality to test password strength for cryptsetup (#1141871) +- add multipath detection support (#1309729) +- add migrate command (#1014708) + +* Fri Feb 09 2018 Fedora Release Engineering - 0.5-1 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Mon Oct 30 2017 Jan Tulak - 0.5-0 +- New upstream stable version 0.5 + +* Thu Jul 27 2017 Fedora Release Engineering - 0.4-14 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Sat Feb 11 2017 Fedora Release Engineering - 0.4-13 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Mon Dec 19 2016 Miro Hrončok - 0.4-12 +- Rebuild for Python 3.6 + +* Tue Jul 19 2016 Fedora Release Engineering - 0.4-11 +- https://fedoraproject.org/wiki/Changes/Automatic_Provides_for_Python_RPM_Packages + +* Fri Feb 05 2016 Fedora Release Engineering - 0.4-10 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Tue Nov 10 2015 Fedora Release Engineering - 0.4-9 +- Rebuilt for https://fedoraproject.org/wiki/Changes/python3.5 + + +* Mon Jul 27 2015 Lukas Czerner 0.4-7 +- Big upstream update +- Python3 support (#1239016) +- Error out if file system is not supported (#1196428) + +* Fri Jun 19 2015 Fedora Release Engineering - 0.4-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Sun Jun 08 2014 Fedora Release Engineering - 0.4-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Mon Jan 20 2014 Lukas Czerner 0.4-4 +- Update to a new upstream release v0.4 +- Remove btrfs resize support +- Unmount all btrfs subvolumes when removing a filesystem +- Fix size argument parsing for create and snapshot command +- Fix list output for some cases +- Add support to create encrypted volumes with crypt backend +- Add dry-run option +- Fix removing volumes with crypt backend +- Add raid1 and raid10 support for lvm backend +- Allow to check btrfs volumes +- Fix error handling when trying to resize btrfs subvolume +- Fix ssm mount command so it detects directory properly +- Suppress backtrace when a command fails +- Fix ssm to recognize units in new btrfs output properly +- Use correct sysfs file to get size for a partition +- Fix ssm to be able add a device with signature to btrfs file system +- Resognize btrfs devices from new btrfs output properly + + +* Mon Dec 16 2013 Ville Skyttä - 0.2-4 +- Install docs to %%{_pkgdocdir} where available (#994122). + +* Sun Aug 04 2013 Fedora Release Engineering - 0.2-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Fri Feb 15 2013 Fedora Release Engineering - 0.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Fri Jun 1 2012 Lukas Czerner 0.2-1 +- Initial version of the package