Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.impexpd_unittest.py @ 14933c17

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()