root / test / ganeti.impexpd_unittest.py @ 6760e4ed
History | View | Annotate | Download (5.8 kB)
1 | bb44b1ae | Michael Hanselmann | #!/usr/bin/python
|
---|---|---|---|
2 | bb44b1ae | Michael Hanselmann | #
|
3 | bb44b1ae | Michael Hanselmann | |
4 | bb44b1ae | Michael Hanselmann | # Copyright (C) 2010 Google Inc.
|
5 | bb44b1ae | Michael Hanselmann | #
|
6 | bb44b1ae | Michael Hanselmann | # This program is free software; you can redistribute it and/or modify
|
7 | bb44b1ae | Michael Hanselmann | # it under the terms of the GNU General Public License as published by
|
8 | bb44b1ae | Michael Hanselmann | # the Free Software Foundation; either version 2 of the License, or
|
9 | bb44b1ae | Michael Hanselmann | # (at your option) any later version.
|
10 | bb44b1ae | Michael Hanselmann | #
|
11 | bb44b1ae | Michael Hanselmann | # This program is distributed in the hope that it will be useful, but
|
12 | bb44b1ae | Michael Hanselmann | # WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 | bb44b1ae | Michael Hanselmann | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14 | bb44b1ae | Michael Hanselmann | # General Public License for more details.
|
15 | bb44b1ae | Michael Hanselmann | #
|
16 | bb44b1ae | Michael Hanselmann | # You should have received a copy of the GNU General Public License
|
17 | bb44b1ae | Michael Hanselmann | # along with this program; if not, write to the Free Software
|
18 | bb44b1ae | Michael Hanselmann | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
19 | bb44b1ae | Michael Hanselmann | # 02110-1301, USA.
|
20 | bb44b1ae | Michael Hanselmann | |
21 | bb44b1ae | Michael Hanselmann | |
22 | bb44b1ae | Michael Hanselmann | """Script for testing ganeti.impexpd"""
|
23 | bb44b1ae | Michael Hanselmann | |
24 | bb44b1ae | Michael Hanselmann | import os |
25 | bb44b1ae | Michael Hanselmann | import sys |
26 | bb44b1ae | Michael Hanselmann | import re |
27 | bb44b1ae | Michael Hanselmann | import unittest |
28 | bb44b1ae | Michael Hanselmann | |
29 | bb44b1ae | Michael Hanselmann | from ganeti import constants |
30 | bb44b1ae | Michael Hanselmann | from ganeti import objects |
31 | bb44b1ae | Michael Hanselmann | from ganeti import compat |
32 | bb44b1ae | Michael Hanselmann | from ganeti import utils |
33 | bb44b1ae | Michael Hanselmann | from ganeti import errors |
34 | bb44b1ae | Michael Hanselmann | from ganeti import impexpd |
35 | bb44b1ae | Michael Hanselmann | |
36 | bb44b1ae | Michael Hanselmann | import testutils |
37 | bb44b1ae | Michael Hanselmann | |
38 | bb44b1ae | Michael Hanselmann | |
39 | bb44b1ae | Michael Hanselmann | class CmdBuilderConfig(objects.ConfigObject): |
40 | bb44b1ae | Michael Hanselmann | __slots__ = [ |
41 | bb44b1ae | Michael Hanselmann | "bind",
|
42 | bb44b1ae | Michael Hanselmann | "key",
|
43 | bb44b1ae | Michael Hanselmann | "cert",
|
44 | bb44b1ae | Michael Hanselmann | "ca",
|
45 | bb44b1ae | Michael Hanselmann | "host",
|
46 | bb44b1ae | Michael Hanselmann | "port",
|
47 | bb44b1ae | Michael Hanselmann | "compress",
|
48 | 1d3dfa29 | Michael Hanselmann | "magic",
|
49 | bb44b1ae | Michael Hanselmann | "connect_timeout",
|
50 | bb44b1ae | Michael Hanselmann | "connect_retries",
|
51 | bb44b1ae | Michael Hanselmann | "cmd_prefix",
|
52 | bb44b1ae | Michael Hanselmann | "cmd_suffix",
|
53 | bb44b1ae | Michael Hanselmann | ] |
54 | bb44b1ae | Michael Hanselmann | |
55 | bb44b1ae | Michael Hanselmann | |
56 | bb44b1ae | Michael Hanselmann | def CheckCmdWord(cmd, word): |
57 | bb44b1ae | Michael Hanselmann | wre = re.compile(r"\b%s\b" % re.escape(word))
|
58 | bb44b1ae | Michael Hanselmann | return compat.any(wre.search(i) for i in cmd) |
59 | bb44b1ae | Michael Hanselmann | |
60 | bb44b1ae | Michael Hanselmann | |
61 | bb44b1ae | Michael Hanselmann | class TestCommandBuilder(unittest.TestCase): |
62 | bb44b1ae | Michael Hanselmann | def test(self): |
63 | bb44b1ae | Michael Hanselmann | for mode in [constants.IEM_IMPORT, constants.IEM_EXPORT]: |
64 | bb44b1ae | Michael Hanselmann | if mode == constants.IEM_IMPORT:
|
65 | bb44b1ae | Michael Hanselmann | comprcmd = "gunzip"
|
66 | bb44b1ae | Michael Hanselmann | elif mode == constants.IEM_EXPORT:
|
67 | bb44b1ae | Michael Hanselmann | comprcmd = "gzip"
|
68 | bb44b1ae | Michael Hanselmann | |
69 | bb44b1ae | Michael Hanselmann | for compress in [constants.IEC_NONE, constants.IEC_GZIP]: |
70 | 1d3dfa29 | Michael Hanselmann | for magic in [None, 10 * "-", "HelloWorld", "J9plh4nFo2", |
71 | 1d3dfa29 | Michael Hanselmann | "24A02A81-2264-4B51-A882-A2AB9D85B420"]:
|
72 | 1d3dfa29 | Michael Hanselmann | opts = CmdBuilderConfig(magic=magic, compress=compress) |
73 | 1d3dfa29 | Michael Hanselmann | builder = impexpd.CommandBuilder(mode, opts, 1, 2, 3) |
74 | 1d3dfa29 | Michael Hanselmann | |
75 | 1d3dfa29 | Michael Hanselmann | magic_cmd = builder._GetMagicCommand() |
76 | 1d3dfa29 | Michael Hanselmann | dd_cmd = builder._GetDdCommand() |
77 | 1d3dfa29 | Michael Hanselmann | |
78 | 1d3dfa29 | Michael Hanselmann | if magic:
|
79 | 1d3dfa29 | Michael Hanselmann | self.assert_(("M=%s" % magic) in magic_cmd) |
80 | 1d3dfa29 | Michael Hanselmann | self.assert_(("M=%s" % magic) in dd_cmd) |
81 | 1d3dfa29 | Michael Hanselmann | else:
|
82 | 1d3dfa29 | Michael Hanselmann | self.assertFalse(magic_cmd)
|
83 | 1d3dfa29 | Michael Hanselmann | |
84 | 926feaf1 | Manuel Franceschini | for host in ["localhost", "198.51.100.4", "192.0.2.99"]: |
85 | bb44b1ae | Michael Hanselmann | for port in [0, 1, 1234, 7856, 45452]: |
86 | bb44b1ae | Michael Hanselmann | for cmd_prefix in [None, "PrefixCommandGoesHere|", |
87 | bb44b1ae | Michael Hanselmann | "dd if=/dev/hda bs=1048576 |"]:
|
88 | bb44b1ae | Michael Hanselmann | for cmd_suffix in [None, "< /some/file/name", |
89 | bb44b1ae | Michael Hanselmann | "| dd of=/dev/null"]:
|
90 | bb44b1ae | Michael Hanselmann | opts = CmdBuilderConfig(host=host, port=port, compress=compress, |
91 | bb44b1ae | Michael Hanselmann | cmd_prefix=cmd_prefix, |
92 | bb44b1ae | Michael Hanselmann | cmd_suffix=cmd_suffix) |
93 | bb44b1ae | Michael Hanselmann | |
94 | c08d76f5 | Michael Hanselmann | builder = impexpd.CommandBuilder(mode, opts, 1, 2, 3) |
95 | bb44b1ae | Michael Hanselmann | |
96 | bb44b1ae | Michael Hanselmann | # Check complete command
|
97 | bb44b1ae | Michael Hanselmann | cmd = builder.GetCommand() |
98 | bb44b1ae | Michael Hanselmann | self.assert_(isinstance(cmd, list)) |
99 | bb44b1ae | Michael Hanselmann | |
100 | bb44b1ae | Michael Hanselmann | if compress == constants.IEC_GZIP:
|
101 | bb44b1ae | Michael Hanselmann | self.assert_(CheckCmdWord(cmd, comprcmd))
|
102 | bb44b1ae | Michael Hanselmann | |
103 | bb44b1ae | Michael Hanselmann | if cmd_prefix is not None: |
104 | bb44b1ae | Michael Hanselmann | self.assert_(cmd_prefix in i for i in cmd) |
105 | bb44b1ae | Michael Hanselmann | |
106 | bb44b1ae | Michael Hanselmann | if cmd_suffix is not None: |
107 | bb44b1ae | Michael Hanselmann | self.assert_(cmd_suffix in i for i in cmd) |
108 | bb44b1ae | Michael Hanselmann | |
109 | bb44b1ae | Michael Hanselmann | # Check socat command
|
110 | bb44b1ae | Michael Hanselmann | socat_cmd = builder._GetSocatCommand() |
111 | bb44b1ae | Michael Hanselmann | |
112 | bb44b1ae | Michael Hanselmann | if mode == constants.IEM_IMPORT:
|
113 | bb44b1ae | Michael Hanselmann | ssl_addr = socat_cmd[-2].split(",") |
114 | bb44b1ae | Michael Hanselmann | self.assert_(("OPENSSL-LISTEN:%s" % port) in ssl_addr) |
115 | bb44b1ae | Michael Hanselmann | elif mode == constants.IEM_EXPORT:
|
116 | bb44b1ae | Michael Hanselmann | ssl_addr = socat_cmd[-1].split(",") |
117 | bb44b1ae | Michael Hanselmann | self.assert_(("OPENSSL:%s:%s" % (host, port)) in ssl_addr) |
118 | bb44b1ae | Michael Hanselmann | |
119 | bb44b1ae | Michael Hanselmann | self.assert_("verify=1" in ssl_addr) |
120 | bb44b1ae | Michael Hanselmann | |
121 | bb44b1ae | Michael Hanselmann | def testCommaError(self): |
122 | bb44b1ae | Michael Hanselmann | opts = CmdBuilderConfig(host="localhost", port=1234, |
123 | bb44b1ae | Michael Hanselmann | ca="/some/path/with,a/,comma")
|
124 | bb44b1ae | Michael Hanselmann | |
125 | bb44b1ae | Michael Hanselmann | for mode in [constants.IEM_IMPORT, constants.IEM_EXPORT]: |
126 | c08d76f5 | Michael Hanselmann | builder = impexpd.CommandBuilder(mode, opts, 1, 2, 3) |
127 | bb44b1ae | Michael Hanselmann | self.assertRaises(errors.GenericError, builder.GetCommand)
|
128 | bb44b1ae | Michael Hanselmann | |
129 | 0559f745 | Michael Hanselmann | def testOptionLengthError(self): |
130 | 0559f745 | Michael Hanselmann | testopts = [ |
131 | 0559f745 | Michael Hanselmann | CmdBuilderConfig(bind="0.0.0.0" + ("A" * impexpd.SOCAT_OPTION_MAXLEN), |
132 | 0559f745 | Michael Hanselmann | port=1234, ca="/tmp/ca"), |
133 | 0559f745 | Michael Hanselmann | CmdBuilderConfig(host="localhost", port=1234, |
134 | 0559f745 | Michael Hanselmann | ca="/tmp/ca" + ("B" * impexpd.SOCAT_OPTION_MAXLEN)), |
135 | 0559f745 | Michael Hanselmann | CmdBuilderConfig(host="localhost", port=1234, |
136 | 0559f745 | Michael Hanselmann | key="/tmp/key" + ("B" * impexpd.SOCAT_OPTION_MAXLEN)), |
137 | 0559f745 | Michael Hanselmann | ] |
138 | 0559f745 | Michael Hanselmann | |
139 | 0559f745 | Michael Hanselmann | for opts in testopts: |
140 | 0559f745 | Michael Hanselmann | for mode in [constants.IEM_IMPORT, constants.IEM_EXPORT]: |
141 | 0559f745 | Michael Hanselmann | builder = impexpd.CommandBuilder(mode, opts, 1, 2, 3) |
142 | 0559f745 | Michael Hanselmann | self.assertRaises(errors.GenericError, builder.GetCommand)
|
143 | 0559f745 | Michael Hanselmann | |
144 | 0559f745 | Michael Hanselmann | opts.host = "localhost" + ("A" * impexpd.SOCAT_OPTION_MAXLEN) |
145 | 0559f745 | Michael Hanselmann | builder = impexpd.CommandBuilder(constants.IEM_EXPORT, opts, 1, 2, 3) |
146 | 0559f745 | Michael Hanselmann | self.assertRaises(errors.GenericError, builder.GetCommand)
|
147 | 0559f745 | Michael Hanselmann | |
148 | bb44b1ae | Michael Hanselmann | def testModeError(self): |
149 | bb44b1ae | Michael Hanselmann | mode = "foobarbaz"
|
150 | bb44b1ae | Michael Hanselmann | |
151 | bb44b1ae | Michael Hanselmann | assert mode not in [constants.IEM_IMPORT, constants.IEM_EXPORT] |
152 | bb44b1ae | Michael Hanselmann | |
153 | bb44b1ae | Michael Hanselmann | opts = CmdBuilderConfig(host="localhost", port=1234) |
154 | c08d76f5 | Michael Hanselmann | builder = impexpd.CommandBuilder(mode, opts, 1, 2, 3) |
155 | bb44b1ae | Michael Hanselmann | self.assertRaises(errors.GenericError, builder.GetCommand)
|
156 | bb44b1ae | Michael Hanselmann | |
157 | bb44b1ae | Michael Hanselmann | |
158 | c08d76f5 | Michael Hanselmann | class TestCalcThroughput(unittest.TestCase): |
159 | c08d76f5 | Michael Hanselmann | def test(self): |
160 | c08d76f5 | Michael Hanselmann | self.assertEqual(impexpd._CalcThroughput([]), None) |
161 | c08d76f5 | Michael Hanselmann | self.assertEqual(impexpd._CalcThroughput([(0, 0)]), None) |
162 | c08d76f5 | Michael Hanselmann | |
163 | c08d76f5 | Michael Hanselmann | samples = [ |
164 | c08d76f5 | Michael Hanselmann | (0.0, 0.0), |
165 | c08d76f5 | Michael Hanselmann | (10.0, 100.0), |
166 | c08d76f5 | Michael Hanselmann | ] |
167 | c08d76f5 | Michael Hanselmann | self.assertAlmostEqual(impexpd._CalcThroughput(samples), 10.0, 3) |
168 | c08d76f5 | Michael Hanselmann | |
169 | c08d76f5 | Michael Hanselmann | samples = [ |
170 | c08d76f5 | Michael Hanselmann | (5.0, 7.0), |
171 | c08d76f5 | Michael Hanselmann | (10.0, 100.0), |
172 | c08d76f5 | Michael Hanselmann | (16.0, 181.0), |
173 | c08d76f5 | Michael Hanselmann | ] |
174 | c08d76f5 | Michael Hanselmann | self.assertAlmostEqual(impexpd._CalcThroughput(samples), 15.818, 3) |
175 | c08d76f5 | Michael Hanselmann | |
176 | c08d76f5 | Michael Hanselmann | |
177 | bb44b1ae | Michael Hanselmann | if __name__ == "__main__": |
178 | bb44b1ae | Michael Hanselmann | testutils.GanetiTestProgram() |