root / test / ganeti.impexpd_unittest.py @ 5f4464db
History | View | Annotate | Download (8.5 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 | 58bb385c | Michael Hanselmann | import socket |
29 | bb44b1ae | Michael Hanselmann | |
30 | bb44b1ae | Michael Hanselmann | from ganeti import constants |
31 | bb44b1ae | Michael Hanselmann | from ganeti import objects |
32 | bb44b1ae | Michael Hanselmann | from ganeti import compat |
33 | bb44b1ae | Michael Hanselmann | from ganeti import utils |
34 | bb44b1ae | Michael Hanselmann | from ganeti import errors |
35 | bb44b1ae | Michael Hanselmann | from ganeti import impexpd |
36 | bb44b1ae | Michael Hanselmann | |
37 | bb44b1ae | Michael Hanselmann | import testutils |
38 | bb44b1ae | Michael Hanselmann | |
39 | bb44b1ae | Michael Hanselmann | |
40 | bb44b1ae | Michael Hanselmann | class CmdBuilderConfig(objects.ConfigObject): |
41 | bb44b1ae | Michael Hanselmann | __slots__ = [ |
42 | bb44b1ae | Michael Hanselmann | "bind",
|
43 | bb44b1ae | Michael Hanselmann | "key",
|
44 | bb44b1ae | Michael Hanselmann | "cert",
|
45 | bb44b1ae | Michael Hanselmann | "ca",
|
46 | bb44b1ae | Michael Hanselmann | "host",
|
47 | bb44b1ae | Michael Hanselmann | "port",
|
48 | 58bb385c | Michael Hanselmann | "ipv4",
|
49 | 58bb385c | Michael Hanselmann | "ipv6",
|
50 | bb44b1ae | Michael Hanselmann | "compress",
|
51 | 1d3dfa29 | Michael Hanselmann | "magic",
|
52 | bb44b1ae | Michael Hanselmann | "connect_timeout",
|
53 | bb44b1ae | Michael Hanselmann | "connect_retries",
|
54 | bb44b1ae | Michael Hanselmann | "cmd_prefix",
|
55 | bb44b1ae | Michael Hanselmann | "cmd_suffix",
|
56 | bb44b1ae | Michael Hanselmann | ] |
57 | bb44b1ae | Michael Hanselmann | |
58 | bb44b1ae | Michael Hanselmann | |
59 | bb44b1ae | Michael Hanselmann | def CheckCmdWord(cmd, word): |
60 | bb44b1ae | Michael Hanselmann | wre = re.compile(r"\b%s\b" % re.escape(word))
|
61 | bb44b1ae | Michael Hanselmann | return compat.any(wre.search(i) for i in cmd) |
62 | bb44b1ae | Michael Hanselmann | |
63 | bb44b1ae | Michael Hanselmann | |
64 | bb44b1ae | Michael Hanselmann | class TestCommandBuilder(unittest.TestCase): |
65 | bb44b1ae | Michael Hanselmann | def test(self): |
66 | bb44b1ae | Michael Hanselmann | for mode in [constants.IEM_IMPORT, constants.IEM_EXPORT]: |
67 | bb44b1ae | Michael Hanselmann | if mode == constants.IEM_IMPORT:
|
68 | bb44b1ae | Michael Hanselmann | comprcmd = "gunzip"
|
69 | bb44b1ae | Michael Hanselmann | elif mode == constants.IEM_EXPORT:
|
70 | bb44b1ae | Michael Hanselmann | comprcmd = "gzip"
|
71 | bb44b1ae | Michael Hanselmann | |
72 | bb44b1ae | Michael Hanselmann | for compress in [constants.IEC_NONE, constants.IEC_GZIP]: |
73 | 1d3dfa29 | Michael Hanselmann | for magic in [None, 10 * "-", "HelloWorld", "J9plh4nFo2", |
74 | 1d3dfa29 | Michael Hanselmann | "24A02A81-2264-4B51-A882-A2AB9D85B420"]:
|
75 | 1d3dfa29 | Michael Hanselmann | opts = CmdBuilderConfig(magic=magic, compress=compress) |
76 | 1d3dfa29 | Michael Hanselmann | builder = impexpd.CommandBuilder(mode, opts, 1, 2, 3) |
77 | 1d3dfa29 | Michael Hanselmann | |
78 | 1d3dfa29 | Michael Hanselmann | magic_cmd = builder._GetMagicCommand() |
79 | 1d3dfa29 | Michael Hanselmann | dd_cmd = builder._GetDdCommand() |
80 | 1d3dfa29 | Michael Hanselmann | |
81 | 1d3dfa29 | Michael Hanselmann | if magic:
|
82 | 1d3dfa29 | Michael Hanselmann | self.assert_(("M=%s" % magic) in magic_cmd) |
83 | 1d3dfa29 | Michael Hanselmann | self.assert_(("M=%s" % magic) in dd_cmd) |
84 | 1d3dfa29 | Michael Hanselmann | else:
|
85 | 1d3dfa29 | Michael Hanselmann | self.assertFalse(magic_cmd)
|
86 | 1d3dfa29 | Michael Hanselmann | |
87 | 926feaf1 | Manuel Franceschini | for host in ["localhost", "198.51.100.4", "192.0.2.99"]: |
88 | bb44b1ae | Michael Hanselmann | for port in [0, 1, 1234, 7856, 45452]: |
89 | bb44b1ae | Michael Hanselmann | for cmd_prefix in [None, "PrefixCommandGoesHere|", |
90 | bb44b1ae | Michael Hanselmann | "dd if=/dev/hda bs=1048576 |"]:
|
91 | bb44b1ae | Michael Hanselmann | for cmd_suffix in [None, "< /some/file/name", |
92 | bb44b1ae | Michael Hanselmann | "| dd of=/dev/null"]:
|
93 | bb44b1ae | Michael Hanselmann | opts = CmdBuilderConfig(host=host, port=port, compress=compress, |
94 | bb44b1ae | Michael Hanselmann | cmd_prefix=cmd_prefix, |
95 | bb44b1ae | Michael Hanselmann | cmd_suffix=cmd_suffix) |
96 | bb44b1ae | Michael Hanselmann | |
97 | c08d76f5 | Michael Hanselmann | builder = impexpd.CommandBuilder(mode, opts, 1, 2, 3) |
98 | bb44b1ae | Michael Hanselmann | |
99 | bb44b1ae | Michael Hanselmann | # Check complete command
|
100 | bb44b1ae | Michael Hanselmann | cmd = builder.GetCommand() |
101 | bb44b1ae | Michael Hanselmann | self.assert_(isinstance(cmd, list)) |
102 | bb44b1ae | Michael Hanselmann | |
103 | bb44b1ae | Michael Hanselmann | if compress == constants.IEC_GZIP:
|
104 | bb44b1ae | Michael Hanselmann | self.assert_(CheckCmdWord(cmd, comprcmd))
|
105 | bb44b1ae | Michael Hanselmann | |
106 | bb44b1ae | Michael Hanselmann | if cmd_prefix is not None: |
107 | 58bb385c | Michael Hanselmann | self.assert_(compat.any(cmd_prefix in i for i in cmd)) |
108 | bb44b1ae | Michael Hanselmann | |
109 | bb44b1ae | Michael Hanselmann | if cmd_suffix is not None: |
110 | 58bb385c | Michael Hanselmann | self.assert_(compat.any(cmd_suffix in i for i in cmd)) |
111 | bb44b1ae | Michael Hanselmann | |
112 | bb44b1ae | Michael Hanselmann | # Check socat command
|
113 | bb44b1ae | Michael Hanselmann | socat_cmd = builder._GetSocatCommand() |
114 | bb44b1ae | Michael Hanselmann | |
115 | bb44b1ae | Michael Hanselmann | if mode == constants.IEM_IMPORT:
|
116 | bb44b1ae | Michael Hanselmann | ssl_addr = socat_cmd[-2].split(",") |
117 | bb44b1ae | Michael Hanselmann | self.assert_(("OPENSSL-LISTEN:%s" % port) in ssl_addr) |
118 | bb44b1ae | Michael Hanselmann | elif mode == constants.IEM_EXPORT:
|
119 | bb44b1ae | Michael Hanselmann | ssl_addr = socat_cmd[-1].split(",") |
120 | bb44b1ae | Michael Hanselmann | self.assert_(("OPENSSL:%s:%s" % (host, port)) in ssl_addr) |
121 | bb44b1ae | Michael Hanselmann | |
122 | bb44b1ae | Michael Hanselmann | self.assert_("verify=1" in ssl_addr) |
123 | bb44b1ae | Michael Hanselmann | |
124 | 58bb385c | Michael Hanselmann | def testIPv6(self): |
125 | 58bb385c | Michael Hanselmann | for mode in [constants.IEM_IMPORT, constants.IEM_EXPORT]: |
126 | 58bb385c | Michael Hanselmann | opts = CmdBuilderConfig(host="localhost", port=6789, |
127 | 58bb385c | Michael Hanselmann | ipv4=False, ipv6=False) |
128 | 58bb385c | Michael Hanselmann | builder = impexpd.CommandBuilder(mode, opts, 1, 2, 3) |
129 | 58bb385c | Michael Hanselmann | cmd = builder._GetSocatCommand() |
130 | 58bb385c | Michael Hanselmann | self.assert_(compat.all("pf=" not in i for i in cmd)) |
131 | 58bb385c | Michael Hanselmann | |
132 | 58bb385c | Michael Hanselmann | # IPv4
|
133 | 58bb385c | Michael Hanselmann | opts = CmdBuilderConfig(host="localhost", port=6789, |
134 | 58bb385c | Michael Hanselmann | ipv4=True, ipv6=False) |
135 | 58bb385c | Michael Hanselmann | builder = impexpd.CommandBuilder(mode, opts, 1, 2, 3) |
136 | 58bb385c | Michael Hanselmann | cmd = builder._GetSocatCommand() |
137 | 58bb385c | Michael Hanselmann | self.assert_(compat.any(",pf=ipv4" in i for i in cmd)) |
138 | 58bb385c | Michael Hanselmann | |
139 | 58bb385c | Michael Hanselmann | # IPv6
|
140 | 58bb385c | Michael Hanselmann | opts = CmdBuilderConfig(host="localhost", port=6789, |
141 | 58bb385c | Michael Hanselmann | ipv4=False, ipv6=True) |
142 | 58bb385c | Michael Hanselmann | builder = impexpd.CommandBuilder(mode, opts, 1, 2, 3) |
143 | 58bb385c | Michael Hanselmann | cmd = builder._GetSocatCommand() |
144 | 58bb385c | Michael Hanselmann | self.assert_(compat.any(",pf=ipv6" in i for i in cmd)) |
145 | 58bb385c | Michael Hanselmann | |
146 | 58bb385c | Michael Hanselmann | # IPv4 and IPv6
|
147 | 58bb385c | Michael Hanselmann | opts = CmdBuilderConfig(host="localhost", port=6789, |
148 | 58bb385c | Michael Hanselmann | ipv4=True, ipv6=True) |
149 | 58bb385c | Michael Hanselmann | builder = impexpd.CommandBuilder(mode, opts, 1, 2, 3) |
150 | 58bb385c | Michael Hanselmann | self.assertRaises(AssertionError, builder._GetSocatCommand) |
151 | 58bb385c | Michael Hanselmann | |
152 | bb44b1ae | Michael Hanselmann | def testCommaError(self): |
153 | bb44b1ae | Michael Hanselmann | opts = CmdBuilderConfig(host="localhost", port=1234, |
154 | bb44b1ae | Michael Hanselmann | ca="/some/path/with,a/,comma")
|
155 | bb44b1ae | Michael Hanselmann | |
156 | bb44b1ae | Michael Hanselmann | for mode in [constants.IEM_IMPORT, constants.IEM_EXPORT]: |
157 | c08d76f5 | Michael Hanselmann | builder = impexpd.CommandBuilder(mode, opts, 1, 2, 3) |
158 | bb44b1ae | Michael Hanselmann | self.assertRaises(errors.GenericError, builder.GetCommand)
|
159 | bb44b1ae | Michael Hanselmann | |
160 | 0559f745 | Michael Hanselmann | def testOptionLengthError(self): |
161 | 0559f745 | Michael Hanselmann | testopts = [ |
162 | 0559f745 | Michael Hanselmann | CmdBuilderConfig(bind="0.0.0.0" + ("A" * impexpd.SOCAT_OPTION_MAXLEN), |
163 | 0559f745 | Michael Hanselmann | port=1234, ca="/tmp/ca"), |
164 | 0559f745 | Michael Hanselmann | CmdBuilderConfig(host="localhost", port=1234, |
165 | 0559f745 | Michael Hanselmann | ca="/tmp/ca" + ("B" * impexpd.SOCAT_OPTION_MAXLEN)), |
166 | 0559f745 | Michael Hanselmann | CmdBuilderConfig(host="localhost", port=1234, |
167 | 0559f745 | Michael Hanselmann | key="/tmp/key" + ("B" * impexpd.SOCAT_OPTION_MAXLEN)), |
168 | 0559f745 | Michael Hanselmann | ] |
169 | 0559f745 | Michael Hanselmann | |
170 | 0559f745 | Michael Hanselmann | for opts in testopts: |
171 | 0559f745 | Michael Hanselmann | for mode in [constants.IEM_IMPORT, constants.IEM_EXPORT]: |
172 | 0559f745 | Michael Hanselmann | builder = impexpd.CommandBuilder(mode, opts, 1, 2, 3) |
173 | 0559f745 | Michael Hanselmann | self.assertRaises(errors.GenericError, builder.GetCommand)
|
174 | 0559f745 | Michael Hanselmann | |
175 | 0559f745 | Michael Hanselmann | opts.host = "localhost" + ("A" * impexpd.SOCAT_OPTION_MAXLEN) |
176 | 0559f745 | Michael Hanselmann | builder = impexpd.CommandBuilder(constants.IEM_EXPORT, opts, 1, 2, 3) |
177 | 0559f745 | Michael Hanselmann | self.assertRaises(errors.GenericError, builder.GetCommand)
|
178 | 0559f745 | Michael Hanselmann | |
179 | bb44b1ae | Michael Hanselmann | def testModeError(self): |
180 | bb44b1ae | Michael Hanselmann | mode = "foobarbaz"
|
181 | bb44b1ae | Michael Hanselmann | |
182 | bb44b1ae | Michael Hanselmann | assert mode not in [constants.IEM_IMPORT, constants.IEM_EXPORT] |
183 | bb44b1ae | Michael Hanselmann | |
184 | bb44b1ae | Michael Hanselmann | opts = CmdBuilderConfig(host="localhost", port=1234) |
185 | c08d76f5 | Michael Hanselmann | builder = impexpd.CommandBuilder(mode, opts, 1, 2, 3) |
186 | bb44b1ae | Michael Hanselmann | self.assertRaises(errors.GenericError, builder.GetCommand)
|
187 | bb44b1ae | Michael Hanselmann | |
188 | bb44b1ae | Michael Hanselmann | |
189 | 58bb385c | Michael Hanselmann | class TestVerifyListening(unittest.TestCase): |
190 | 58bb385c | Michael Hanselmann | def test(self): |
191 | 58bb385c | Michael Hanselmann | self.assertEqual(impexpd._VerifyListening(socket.AF_INET,
|
192 | 58bb385c | Michael Hanselmann | "192.0.2.7", 1234), |
193 | 58bb385c | Michael Hanselmann | ("192.0.2.7", 1234)) |
194 | 58bb385c | Michael Hanselmann | self.assertEqual(impexpd._VerifyListening(socket.AF_INET6, "::1", 9876), |
195 | 58bb385c | Michael Hanselmann | ("::1", 9876)) |
196 | 58bb385c | Michael Hanselmann | self.assertEqual(impexpd._VerifyListening(socket.AF_INET6, "[::1]", 4563), |
197 | 58bb385c | Michael Hanselmann | ("::1", 4563)) |
198 | 58bb385c | Michael Hanselmann | self.assertEqual(impexpd._VerifyListening(socket.AF_INET6,
|
199 | 58bb385c | Michael Hanselmann | "[2001:db8::1:4563]", 4563), |
200 | 58bb385c | Michael Hanselmann | ("2001:db8::1:4563", 4563)) |
201 | 58bb385c | Michael Hanselmann | |
202 | 58bb385c | Michael Hanselmann | def testError(self): |
203 | 58bb385c | Michael Hanselmann | for family in [socket.AF_UNIX, socket.AF_INET, socket.AF_INET6]: |
204 | 58bb385c | Michael Hanselmann | self.assertRaises(errors.GenericError, impexpd._VerifyListening,
|
205 | 58bb385c | Michael Hanselmann | family, "", 1234) |
206 | 58bb385c | Michael Hanselmann | self.assertRaises(errors.GenericError, impexpd._VerifyListening,
|
207 | 58bb385c | Michael Hanselmann | family, "192", 999) |
208 | 58bb385c | Michael Hanselmann | |
209 | 58bb385c | Michael Hanselmann | for family in [socket.AF_UNIX, socket.AF_INET6]: |
210 | 58bb385c | Michael Hanselmann | self.assertRaises(errors.GenericError, impexpd._VerifyListening,
|
211 | 58bb385c | Michael Hanselmann | family, "192.0.2.7", 1234) |
212 | 58bb385c | Michael Hanselmann | self.assertRaises(errors.GenericError, impexpd._VerifyListening,
|
213 | 58bb385c | Michael Hanselmann | family, "[2001:db8::1", 1234) |
214 | 58bb385c | Michael Hanselmann | self.assertRaises(errors.GenericError, impexpd._VerifyListening,
|
215 | 58bb385c | Michael Hanselmann | family, "2001:db8::1]", 1234) |
216 | 58bb385c | Michael Hanselmann | |
217 | 58bb385c | Michael Hanselmann | for family in [socket.AF_UNIX, socket.AF_INET]: |
218 | 58bb385c | Michael Hanselmann | self.assertRaises(errors.GenericError, impexpd._VerifyListening,
|
219 | 58bb385c | Michael Hanselmann | family, "::1", 1234) |
220 | 58bb385c | Michael Hanselmann | |
221 | 58bb385c | Michael Hanselmann | |
222 | c08d76f5 | Michael Hanselmann | class TestCalcThroughput(unittest.TestCase): |
223 | c08d76f5 | Michael Hanselmann | def test(self): |
224 | c08d76f5 | Michael Hanselmann | self.assertEqual(impexpd._CalcThroughput([]), None) |
225 | c08d76f5 | Michael Hanselmann | self.assertEqual(impexpd._CalcThroughput([(0, 0)]), None) |
226 | c08d76f5 | Michael Hanselmann | |
227 | c08d76f5 | Michael Hanselmann | samples = [ |
228 | c08d76f5 | Michael Hanselmann | (0.0, 0.0), |
229 | c08d76f5 | Michael Hanselmann | (10.0, 100.0), |
230 | c08d76f5 | Michael Hanselmann | ] |
231 | c08d76f5 | Michael Hanselmann | self.assertAlmostEqual(impexpd._CalcThroughput(samples), 10.0, 3) |
232 | c08d76f5 | Michael Hanselmann | |
233 | c08d76f5 | Michael Hanselmann | samples = [ |
234 | c08d76f5 | Michael Hanselmann | (5.0, 7.0), |
235 | c08d76f5 | Michael Hanselmann | (10.0, 100.0), |
236 | c08d76f5 | Michael Hanselmann | (16.0, 181.0), |
237 | c08d76f5 | Michael Hanselmann | ] |
238 | c08d76f5 | Michael Hanselmann | self.assertAlmostEqual(impexpd._CalcThroughput(samples), 15.818, 3) |
239 | c08d76f5 | Michael Hanselmann | |
240 | c08d76f5 | Michael Hanselmann | |
241 | bb44b1ae | Michael Hanselmann | if __name__ == "__main__": |
242 | bb44b1ae | Michael Hanselmann | testutils.GanetiTestProgram() |