Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.impexpd_unittest.py @ 0559f745

History | View | Annotate | Download (5.2 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 bb44b1ae Michael Hanselmann
    "connect_timeout",
49 bb44b1ae Michael Hanselmann
    "connect_retries",
50 bb44b1ae Michael Hanselmann
    "cmd_prefix",
51 bb44b1ae Michael Hanselmann
    "cmd_suffix",
52 bb44b1ae Michael Hanselmann
    ]
53 bb44b1ae Michael Hanselmann
54 bb44b1ae Michael Hanselmann
55 bb44b1ae Michael Hanselmann
def CheckCmdWord(cmd, word):
56 bb44b1ae Michael Hanselmann
  wre = re.compile(r"\b%s\b" % re.escape(word))
57 bb44b1ae Michael Hanselmann
  return compat.any(wre.search(i) for i in cmd)
58 bb44b1ae Michael Hanselmann
59 bb44b1ae Michael Hanselmann
60 bb44b1ae Michael Hanselmann
class TestCommandBuilder(unittest.TestCase):
61 bb44b1ae Michael Hanselmann
  def test(self):
62 bb44b1ae Michael Hanselmann
    for mode in [constants.IEM_IMPORT, constants.IEM_EXPORT]:
63 bb44b1ae Michael Hanselmann
      if mode == constants.IEM_IMPORT:
64 bb44b1ae Michael Hanselmann
        comprcmd = "gunzip"
65 bb44b1ae Michael Hanselmann
      elif mode == constants.IEM_EXPORT:
66 bb44b1ae Michael Hanselmann
        comprcmd = "gzip"
67 bb44b1ae Michael Hanselmann
68 bb44b1ae Michael Hanselmann
      for compress in [constants.IEC_NONE, constants.IEC_GZIP]:
69 bb44b1ae Michael Hanselmann
        for host in ["localhost", "1.2.3.4", "192.0.2.99"]:
70 bb44b1ae Michael Hanselmann
          for port in [0, 1, 1234, 7856, 45452]:
71 bb44b1ae Michael Hanselmann
            for cmd_prefix in [None, "PrefixCommandGoesHere|",
72 bb44b1ae Michael Hanselmann
                               "dd if=/dev/hda bs=1048576 |"]:
73 bb44b1ae Michael Hanselmann
              for cmd_suffix in [None, "< /some/file/name",
74 bb44b1ae Michael Hanselmann
                                 "| dd of=/dev/null"]:
75 bb44b1ae Michael Hanselmann
                opts = CmdBuilderConfig(host=host, port=port, compress=compress,
76 bb44b1ae Michael Hanselmann
                                        cmd_prefix=cmd_prefix,
77 bb44b1ae Michael Hanselmann
                                        cmd_suffix=cmd_suffix)
78 bb44b1ae Michael Hanselmann
79 c08d76f5 Michael Hanselmann
                builder = impexpd.CommandBuilder(mode, opts, 1, 2, 3)
80 bb44b1ae Michael Hanselmann
81 bb44b1ae Michael Hanselmann
                # Check complete command
82 bb44b1ae Michael Hanselmann
                cmd = builder.GetCommand()
83 bb44b1ae Michael Hanselmann
                self.assert_(isinstance(cmd, list))
84 bb44b1ae Michael Hanselmann
85 bb44b1ae Michael Hanselmann
                if compress == constants.IEC_GZIP:
86 bb44b1ae Michael Hanselmann
                  self.assert_(CheckCmdWord(cmd, comprcmd))
87 bb44b1ae Michael Hanselmann
88 bb44b1ae Michael Hanselmann
                if cmd_prefix is not None:
89 bb44b1ae Michael Hanselmann
                  self.assert_(cmd_prefix in i for i in cmd)
90 bb44b1ae Michael Hanselmann
91 bb44b1ae Michael Hanselmann
                if cmd_suffix is not None:
92 bb44b1ae Michael Hanselmann
                  self.assert_(cmd_suffix in i for i in cmd)
93 bb44b1ae Michael Hanselmann
94 bb44b1ae Michael Hanselmann
                # Check socat command
95 bb44b1ae Michael Hanselmann
                socat_cmd = builder._GetSocatCommand()
96 bb44b1ae Michael Hanselmann
97 bb44b1ae Michael Hanselmann
                if mode == constants.IEM_IMPORT:
98 bb44b1ae Michael Hanselmann
                  ssl_addr = socat_cmd[-2].split(",")
99 bb44b1ae Michael Hanselmann
                  self.assert_(("OPENSSL-LISTEN:%s" % port) in ssl_addr)
100 bb44b1ae Michael Hanselmann
                elif mode == constants.IEM_EXPORT:
101 bb44b1ae Michael Hanselmann
                  ssl_addr = socat_cmd[-1].split(",")
102 bb44b1ae Michael Hanselmann
                  self.assert_(("OPENSSL:%s:%s" % (host, port)) in ssl_addr)
103 bb44b1ae Michael Hanselmann
104 bb44b1ae Michael Hanselmann
                self.assert_("verify=1" in ssl_addr)
105 bb44b1ae Michael Hanselmann
106 bb44b1ae Michael Hanselmann
  def testCommaError(self):
107 bb44b1ae Michael Hanselmann
    opts = CmdBuilderConfig(host="localhost", port=1234,
108 bb44b1ae Michael Hanselmann
                            ca="/some/path/with,a/,comma")
109 bb44b1ae Michael Hanselmann
110 bb44b1ae Michael Hanselmann
    for mode in [constants.IEM_IMPORT, constants.IEM_EXPORT]:
111 c08d76f5 Michael Hanselmann
      builder = impexpd.CommandBuilder(mode, opts, 1, 2, 3)
112 bb44b1ae Michael Hanselmann
      self.assertRaises(errors.GenericError, builder.GetCommand)
113 bb44b1ae Michael Hanselmann
114 0559f745 Michael Hanselmann
  def testOptionLengthError(self):
115 0559f745 Michael Hanselmann
    testopts = [
116 0559f745 Michael Hanselmann
      CmdBuilderConfig(bind="0.0.0.0" + ("A" * impexpd.SOCAT_OPTION_MAXLEN),
117 0559f745 Michael Hanselmann
                       port=1234, ca="/tmp/ca"),
118 0559f745 Michael Hanselmann
      CmdBuilderConfig(host="localhost", port=1234,
119 0559f745 Michael Hanselmann
                       ca="/tmp/ca" + ("B" * impexpd.SOCAT_OPTION_MAXLEN)),
120 0559f745 Michael Hanselmann
      CmdBuilderConfig(host="localhost", port=1234,
121 0559f745 Michael Hanselmann
                       key="/tmp/key" + ("B" * impexpd.SOCAT_OPTION_MAXLEN)),
122 0559f745 Michael Hanselmann
      ]
123 0559f745 Michael Hanselmann
124 0559f745 Michael Hanselmann
    for opts in testopts:
125 0559f745 Michael Hanselmann
      for mode in [constants.IEM_IMPORT, constants.IEM_EXPORT]:
126 0559f745 Michael Hanselmann
        builder = impexpd.CommandBuilder(mode, opts, 1, 2, 3)
127 0559f745 Michael Hanselmann
        self.assertRaises(errors.GenericError, builder.GetCommand)
128 0559f745 Michael Hanselmann
129 0559f745 Michael Hanselmann
      opts.host = "localhost" + ("A" * impexpd.SOCAT_OPTION_MAXLEN)
130 0559f745 Michael Hanselmann
      builder = impexpd.CommandBuilder(constants.IEM_EXPORT, opts, 1, 2, 3)
131 0559f745 Michael Hanselmann
      self.assertRaises(errors.GenericError, builder.GetCommand)
132 0559f745 Michael Hanselmann
133 bb44b1ae Michael Hanselmann
  def testModeError(self):
134 bb44b1ae Michael Hanselmann
    mode = "foobarbaz"
135 bb44b1ae Michael Hanselmann
136 bb44b1ae Michael Hanselmann
    assert mode not in [constants.IEM_IMPORT, constants.IEM_EXPORT]
137 bb44b1ae Michael Hanselmann
138 bb44b1ae Michael Hanselmann
    opts = CmdBuilderConfig(host="localhost", port=1234)
139 c08d76f5 Michael Hanselmann
    builder = impexpd.CommandBuilder(mode, opts, 1, 2, 3)
140 bb44b1ae Michael Hanselmann
    self.assertRaises(errors.GenericError, builder.GetCommand)
141 bb44b1ae Michael Hanselmann
142 bb44b1ae Michael Hanselmann
143 c08d76f5 Michael Hanselmann
class TestCalcThroughput(unittest.TestCase):
144 c08d76f5 Michael Hanselmann
  def test(self):
145 c08d76f5 Michael Hanselmann
    self.assertEqual(impexpd._CalcThroughput([]), None)
146 c08d76f5 Michael Hanselmann
    self.assertEqual(impexpd._CalcThroughput([(0, 0)]), None)
147 c08d76f5 Michael Hanselmann
148 c08d76f5 Michael Hanselmann
    samples = [
149 c08d76f5 Michael Hanselmann
      (0.0, 0.0),
150 c08d76f5 Michael Hanselmann
      (10.0, 100.0),
151 c08d76f5 Michael Hanselmann
      ]
152 c08d76f5 Michael Hanselmann
    self.assertAlmostEqual(impexpd._CalcThroughput(samples), 10.0, 3)
153 c08d76f5 Michael Hanselmann
154 c08d76f5 Michael Hanselmann
    samples = [
155 c08d76f5 Michael Hanselmann
      (5.0, 7.0),
156 c08d76f5 Michael Hanselmann
      (10.0, 100.0),
157 c08d76f5 Michael Hanselmann
      (16.0, 181.0),
158 c08d76f5 Michael Hanselmann
      ]
159 c08d76f5 Michael Hanselmann
    self.assertAlmostEqual(impexpd._CalcThroughput(samples), 15.818, 3)
160 c08d76f5 Michael Hanselmann
161 c08d76f5 Michael Hanselmann
162 bb44b1ae Michael Hanselmann
if __name__ == "__main__":
163 bb44b1ae Michael Hanselmann
  testutils.GanetiTestProgram()