Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.impexpd_unittest.py @ 18215385

History | View | Annotate | Download (3.9 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 bb44b1ae Michael Hanselmann
                builder = impexpd.CommandBuilder(mode, opts, 1)
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 bb44b1ae Michael Hanselmann
      builder = impexpd.CommandBuilder(mode, opts, 1)
112 bb44b1ae Michael Hanselmann
      self.assertRaises(errors.GenericError, builder.GetCommand)
113 bb44b1ae Michael Hanselmann
114 bb44b1ae Michael Hanselmann
  def testModeError(self):
115 bb44b1ae Michael Hanselmann
    mode = "foobarbaz"
116 bb44b1ae Michael Hanselmann
117 bb44b1ae Michael Hanselmann
    assert mode not in [constants.IEM_IMPORT, constants.IEM_EXPORT]
118 bb44b1ae Michael Hanselmann
119 bb44b1ae Michael Hanselmann
    opts = CmdBuilderConfig(host="localhost", port=1234)
120 bb44b1ae Michael Hanselmann
    builder = impexpd.CommandBuilder(mode, opts, 1)
121 bb44b1ae Michael Hanselmann
    self.assertRaises(errors.GenericError, builder.GetCommand)
122 bb44b1ae Michael Hanselmann
123 bb44b1ae Michael Hanselmann
124 bb44b1ae Michael Hanselmann
if __name__ == "__main__":
125 bb44b1ae Michael Hanselmann
  testutils.GanetiTestProgram()