Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.tools.prepare_node_join_unittest.py @ 1a2eb2dc

History | View | Annotate | Download (10.3 kB)

1 d12b9f66 Michael Hanselmann
#!/usr/bin/python
2 d12b9f66 Michael Hanselmann
#
3 d12b9f66 Michael Hanselmann
4 d12b9f66 Michael Hanselmann
# Copyright (C) 2012 Google Inc.
5 d12b9f66 Michael Hanselmann
#
6 d12b9f66 Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 d12b9f66 Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 d12b9f66 Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 d12b9f66 Michael Hanselmann
# (at your option) any later version.
10 d12b9f66 Michael Hanselmann
#
11 d12b9f66 Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 d12b9f66 Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 d12b9f66 Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 d12b9f66 Michael Hanselmann
# General Public License for more details.
15 d12b9f66 Michael Hanselmann
#
16 d12b9f66 Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 d12b9f66 Michael Hanselmann
# along with this program; if not, write to the Free Software
18 d12b9f66 Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 d12b9f66 Michael Hanselmann
# 02110-1301, USA.
20 d12b9f66 Michael Hanselmann
21 d12b9f66 Michael Hanselmann
22 d12b9f66 Michael Hanselmann
"""Script for testing ganeti.tools.prepare_node_join"""
23 d12b9f66 Michael Hanselmann
24 d12b9f66 Michael Hanselmann
import unittest
25 d12b9f66 Michael Hanselmann
import shutil
26 d12b9f66 Michael Hanselmann
import tempfile
27 d12b9f66 Michael Hanselmann
import os.path
28 d12b9f66 Michael Hanselmann
import OpenSSL
29 d12b9f66 Michael Hanselmann
30 d12b9f66 Michael Hanselmann
from ganeti import errors
31 d12b9f66 Michael Hanselmann
from ganeti import constants
32 d12b9f66 Michael Hanselmann
from ganeti import serializer
33 d12b9f66 Michael Hanselmann
from ganeti import pathutils
34 d12b9f66 Michael Hanselmann
from ganeti import compat
35 d12b9f66 Michael Hanselmann
from ganeti import utils
36 d12b9f66 Michael Hanselmann
from ganeti.tools import prepare_node_join
37 d12b9f66 Michael Hanselmann
38 d12b9f66 Michael Hanselmann
import testutils
39 d12b9f66 Michael Hanselmann
40 d12b9f66 Michael Hanselmann
41 d12b9f66 Michael Hanselmann
_JoinError = prepare_node_join.JoinError
42 d12b9f66 Michael Hanselmann
43 d12b9f66 Michael Hanselmann
44 d12b9f66 Michael Hanselmann
class TestLoadData(unittest.TestCase):
45 d12b9f66 Michael Hanselmann
  def testNoJson(self):
46 d12b9f66 Michael Hanselmann
    self.assertRaises(errors.ParseError, prepare_node_join.LoadData, "")
47 d12b9f66 Michael Hanselmann
    self.assertRaises(errors.ParseError, prepare_node_join.LoadData, "}")
48 d12b9f66 Michael Hanselmann
49 d12b9f66 Michael Hanselmann
  def testInvalidDataStructure(self):
50 d12b9f66 Michael Hanselmann
    raw = serializer.DumpJson({
51 d12b9f66 Michael Hanselmann
      "some other thing": False,
52 d12b9f66 Michael Hanselmann
      })
53 d12b9f66 Michael Hanselmann
    self.assertRaises(errors.ParseError, prepare_node_join.LoadData, raw)
54 d12b9f66 Michael Hanselmann
55 d12b9f66 Michael Hanselmann
    raw = serializer.DumpJson([])
56 d12b9f66 Michael Hanselmann
    self.assertRaises(errors.ParseError, prepare_node_join.LoadData, raw)
57 d12b9f66 Michael Hanselmann
58 d12b9f66 Michael Hanselmann
  def testValidData(self):
59 d12b9f66 Michael Hanselmann
    raw = serializer.DumpJson({})
60 d12b9f66 Michael Hanselmann
    self.assertEqual(prepare_node_join.LoadData(raw), {})
61 d12b9f66 Michael Hanselmann
62 d12b9f66 Michael Hanselmann
63 d12b9f66 Michael Hanselmann
class TestVerifyCertificate(testutils.GanetiTestCase):
64 d12b9f66 Michael Hanselmann
  def setUp(self):
65 d12b9f66 Michael Hanselmann
    testutils.GanetiTestCase.setUp(self)
66 d12b9f66 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
67 d12b9f66 Michael Hanselmann
68 d12b9f66 Michael Hanselmann
  def tearDown(self):
69 d12b9f66 Michael Hanselmann
    testutils.GanetiTestCase.tearDown(self)
70 d12b9f66 Michael Hanselmann
    shutil.rmtree(self.tmpdir)
71 d12b9f66 Michael Hanselmann
72 d12b9f66 Michael Hanselmann
  def testNoCert(self):
73 d12b9f66 Michael Hanselmann
    prepare_node_join.VerifyCertificate({}, _verify_fn=NotImplemented)
74 d12b9f66 Michael Hanselmann
75 d12b9f66 Michael Hanselmann
  def testMismatchingKey(self):
76 d12b9f66 Michael Hanselmann
    other_cert = self._TestDataFilename("cert1.pem")
77 d12b9f66 Michael Hanselmann
    node_cert = self._TestDataFilename("cert2.pem")
78 d12b9f66 Michael Hanselmann
79 d12b9f66 Michael Hanselmann
    self.assertRaises(_JoinError, prepare_node_join._VerifyCertificate,
80 d12b9f66 Michael Hanselmann
                      utils.ReadFile(other_cert), _noded_cert_file=node_cert)
81 d12b9f66 Michael Hanselmann
82 d12b9f66 Michael Hanselmann
  def testGivenPrivateKey(self):
83 d12b9f66 Michael Hanselmann
    cert_filename = self._TestDataFilename("cert2.pem")
84 d12b9f66 Michael Hanselmann
    cert_pem = utils.ReadFile(cert_filename)
85 d12b9f66 Michael Hanselmann
86 d12b9f66 Michael Hanselmann
    self.assertRaises(_JoinError, prepare_node_join._VerifyCertificate,
87 d12b9f66 Michael Hanselmann
                      cert_pem, _noded_cert_file=cert_filename)
88 d12b9f66 Michael Hanselmann
89 d12b9f66 Michael Hanselmann
  def testMatchingKey(self):
90 d12b9f66 Michael Hanselmann
    cert_filename = self._TestDataFilename("cert2.pem")
91 d12b9f66 Michael Hanselmann
92 d12b9f66 Michael Hanselmann
    # Extract certificate
93 d12b9f66 Michael Hanselmann
    cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM,
94 d12b9f66 Michael Hanselmann
                                           utils.ReadFile(cert_filename))
95 d12b9f66 Michael Hanselmann
    cert_pem = OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM,
96 d12b9f66 Michael Hanselmann
                                               cert)
97 d12b9f66 Michael Hanselmann
98 d12b9f66 Michael Hanselmann
    prepare_node_join._VerifyCertificate(cert_pem,
99 d12b9f66 Michael Hanselmann
                                         _noded_cert_file=cert_filename)
100 d12b9f66 Michael Hanselmann
101 d12b9f66 Michael Hanselmann
  def testMissingFile(self):
102 d12b9f66 Michael Hanselmann
    cert = self._TestDataFilename("cert1.pem")
103 d12b9f66 Michael Hanselmann
    nodecert = utils.PathJoin(self.tmpdir, "does-not-exist")
104 d12b9f66 Michael Hanselmann
    prepare_node_join._VerifyCertificate(utils.ReadFile(cert),
105 d12b9f66 Michael Hanselmann
                                         _noded_cert_file=nodecert)
106 d12b9f66 Michael Hanselmann
107 d12b9f66 Michael Hanselmann
  def testInvalidCertificate(self):
108 d12b9f66 Michael Hanselmann
    self.assertRaises(errors.X509CertError,
109 d12b9f66 Michael Hanselmann
                      prepare_node_join._VerifyCertificate,
110 d12b9f66 Michael Hanselmann
                      "Something that's not a certificate",
111 d12b9f66 Michael Hanselmann
                      _noded_cert_file=NotImplemented)
112 d12b9f66 Michael Hanselmann
113 d12b9f66 Michael Hanselmann
  def testNoPrivateKey(self):
114 d12b9f66 Michael Hanselmann
    cert = self._TestDataFilename("cert1.pem")
115 d12b9f66 Michael Hanselmann
    self.assertRaises(errors.X509CertError,
116 d12b9f66 Michael Hanselmann
                      prepare_node_join._VerifyCertificate,
117 d12b9f66 Michael Hanselmann
                      utils.ReadFile(cert), _noded_cert_file=cert)
118 d12b9f66 Michael Hanselmann
119 d12b9f66 Michael Hanselmann
120 d12b9f66 Michael Hanselmann
class TestVerifyClusterName(unittest.TestCase):
121 d12b9f66 Michael Hanselmann
  def setUp(self):
122 d12b9f66 Michael Hanselmann
    unittest.TestCase.setUp(self)
123 d12b9f66 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
124 d12b9f66 Michael Hanselmann
125 d12b9f66 Michael Hanselmann
  def tearDown(self):
126 d12b9f66 Michael Hanselmann
    unittest.TestCase.tearDown(self)
127 d12b9f66 Michael Hanselmann
    shutil.rmtree(self.tmpdir)
128 d12b9f66 Michael Hanselmann
129 d12b9f66 Michael Hanselmann
  def testNoName(self):
130 d12b9f66 Michael Hanselmann
    self.assertRaises(_JoinError, prepare_node_join.VerifyClusterName,
131 d12b9f66 Michael Hanselmann
                      {}, _verify_fn=NotImplemented)
132 d12b9f66 Michael Hanselmann
133 d12b9f66 Michael Hanselmann
  def testMissingFile(self):
134 d12b9f66 Michael Hanselmann
    tmpfile = utils.PathJoin(self.tmpdir, "does-not-exist")
135 d12b9f66 Michael Hanselmann
    prepare_node_join._VerifyClusterName(NotImplemented,
136 d12b9f66 Michael Hanselmann
                                         _ss_cluster_name_file=tmpfile)
137 d12b9f66 Michael Hanselmann
138 d12b9f66 Michael Hanselmann
  def testMatchingName(self):
139 d12b9f66 Michael Hanselmann
    tmpfile = utils.PathJoin(self.tmpdir, "cluster_name")
140 d12b9f66 Michael Hanselmann
141 d12b9f66 Michael Hanselmann
    for content in ["cluster.example.com", "cluster.example.com\n\n"]:
142 d12b9f66 Michael Hanselmann
      utils.WriteFile(tmpfile, data=content)
143 d12b9f66 Michael Hanselmann
      prepare_node_join._VerifyClusterName("cluster.example.com",
144 d12b9f66 Michael Hanselmann
                                           _ss_cluster_name_file=tmpfile)
145 d12b9f66 Michael Hanselmann
146 d12b9f66 Michael Hanselmann
  def testNameMismatch(self):
147 d12b9f66 Michael Hanselmann
    tmpfile = utils.PathJoin(self.tmpdir, "cluster_name")
148 d12b9f66 Michael Hanselmann
149 d12b9f66 Michael Hanselmann
    for content in ["something.example.com", "foobar\n\ncluster.example.com"]:
150 d12b9f66 Michael Hanselmann
      utils.WriteFile(tmpfile, data=content)
151 d12b9f66 Michael Hanselmann
      self.assertRaises(_JoinError, prepare_node_join._VerifyClusterName,
152 d12b9f66 Michael Hanselmann
                        "cluster.example.com", _ss_cluster_name_file=tmpfile)
153 d12b9f66 Michael Hanselmann
154 d12b9f66 Michael Hanselmann
155 d12b9f66 Michael Hanselmann
class TestUpdateSshDaemon(unittest.TestCase):
156 d12b9f66 Michael Hanselmann
  def setUp(self):
157 d12b9f66 Michael Hanselmann
    unittest.TestCase.setUp(self)
158 d12b9f66 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
159 d12b9f66 Michael Hanselmann
160 d12b9f66 Michael Hanselmann
    self.keyfiles = {
161 d12b9f66 Michael Hanselmann
      constants.SSHK_RSA:
162 340ae7da Michael Hanselmann
        (utils.PathJoin(self.tmpdir, "rsa.private"),
163 340ae7da Michael Hanselmann
         utils.PathJoin(self.tmpdir, "rsa.public")),
164 d12b9f66 Michael Hanselmann
      constants.SSHK_DSA:
165 340ae7da Michael Hanselmann
        (utils.PathJoin(self.tmpdir, "dsa.private"),
166 340ae7da Michael Hanselmann
         utils.PathJoin(self.tmpdir, "dsa.public")),
167 d12b9f66 Michael Hanselmann
      }
168 d12b9f66 Michael Hanselmann
169 d12b9f66 Michael Hanselmann
  def tearDown(self):
170 d12b9f66 Michael Hanselmann
    unittest.TestCase.tearDown(self)
171 d12b9f66 Michael Hanselmann
    shutil.rmtree(self.tmpdir)
172 d12b9f66 Michael Hanselmann
173 d12b9f66 Michael Hanselmann
  def testNoKeys(self):
174 d12b9f66 Michael Hanselmann
    data_empty_keys = {
175 d12b9f66 Michael Hanselmann
      constants.SSHS_SSH_HOST_KEY: [],
176 d12b9f66 Michael Hanselmann
      }
177 d12b9f66 Michael Hanselmann
178 d12b9f66 Michael Hanselmann
    for data in [{}, data_empty_keys]:
179 d12b9f66 Michael Hanselmann
      for dry_run in [False, True]:
180 d12b9f66 Michael Hanselmann
        prepare_node_join.UpdateSshDaemon(data, dry_run,
181 d12b9f66 Michael Hanselmann
                                          _runcmd_fn=NotImplemented,
182 d12b9f66 Michael Hanselmann
                                          _keyfiles=NotImplemented)
183 d12b9f66 Michael Hanselmann
    self.assertEqual(os.listdir(self.tmpdir), [])
184 d12b9f66 Michael Hanselmann
185 d12b9f66 Michael Hanselmann
  def _TestDryRun(self, data):
186 d12b9f66 Michael Hanselmann
    prepare_node_join.UpdateSshDaemon(data, True, _runcmd_fn=NotImplemented,
187 d12b9f66 Michael Hanselmann
                                      _keyfiles=self.keyfiles)
188 d12b9f66 Michael Hanselmann
    self.assertEqual(os.listdir(self.tmpdir), [])
189 d12b9f66 Michael Hanselmann
190 d12b9f66 Michael Hanselmann
  def testDryRunRsa(self):
191 d12b9f66 Michael Hanselmann
    self._TestDryRun({
192 d12b9f66 Michael Hanselmann
      constants.SSHS_SSH_HOST_KEY: [
193 340ae7da Michael Hanselmann
        (constants.SSHK_RSA, "rsapriv", "rsapub"),
194 d12b9f66 Michael Hanselmann
        ],
195 d12b9f66 Michael Hanselmann
      })
196 d12b9f66 Michael Hanselmann
197 d12b9f66 Michael Hanselmann
  def testDryRunDsa(self):
198 d12b9f66 Michael Hanselmann
    self._TestDryRun({
199 d12b9f66 Michael Hanselmann
      constants.SSHS_SSH_HOST_KEY: [
200 340ae7da Michael Hanselmann
        (constants.SSHK_DSA, "dsapriv", "dsapub"),
201 d12b9f66 Michael Hanselmann
        ],
202 d12b9f66 Michael Hanselmann
      })
203 d12b9f66 Michael Hanselmann
204 d12b9f66 Michael Hanselmann
  def _RunCmd(self, fail, cmd, interactive=NotImplemented):
205 d12b9f66 Michael Hanselmann
    self.assertTrue(interactive)
206 d12b9f66 Michael Hanselmann
    self.assertEqual(cmd, [pathutils.DAEMON_UTIL, "reload-ssh-keys"])
207 d12b9f66 Michael Hanselmann
    if fail:
208 d12b9f66 Michael Hanselmann
      exit_code = constants.EXIT_FAILURE
209 d12b9f66 Michael Hanselmann
    else:
210 d12b9f66 Michael Hanselmann
      exit_code = constants.EXIT_SUCCESS
211 d12b9f66 Michael Hanselmann
    return utils.RunResult(exit_code, None, "stdout", "stderr",
212 d12b9f66 Michael Hanselmann
                           utils.ShellQuoteArgs(cmd),
213 d12b9f66 Michael Hanselmann
                           NotImplemented, NotImplemented)
214 d12b9f66 Michael Hanselmann
215 d12b9f66 Michael Hanselmann
  def _TestUpdate(self, failcmd):
216 d12b9f66 Michael Hanselmann
    data = {
217 d12b9f66 Michael Hanselmann
      constants.SSHS_SSH_HOST_KEY: [
218 340ae7da Michael Hanselmann
        (constants.SSHK_DSA, "dsapriv", "dsapub"),
219 340ae7da Michael Hanselmann
        (constants.SSHK_RSA, "rsapriv", "rsapub"),
220 d12b9f66 Michael Hanselmann
        ],
221 d12b9f66 Michael Hanselmann
      }
222 d12b9f66 Michael Hanselmann
    runcmd_fn = compat.partial(self._RunCmd, failcmd)
223 d12b9f66 Michael Hanselmann
    if failcmd:
224 d12b9f66 Michael Hanselmann
      self.assertRaises(_JoinError, prepare_node_join.UpdateSshDaemon,
225 d12b9f66 Michael Hanselmann
                        data, False, _runcmd_fn=runcmd_fn,
226 d12b9f66 Michael Hanselmann
                        _keyfiles=self.keyfiles)
227 d12b9f66 Michael Hanselmann
    else:
228 d12b9f66 Michael Hanselmann
      prepare_node_join.UpdateSshDaemon(data, False, _runcmd_fn=runcmd_fn,
229 d12b9f66 Michael Hanselmann
                                        _keyfiles=self.keyfiles)
230 d12b9f66 Michael Hanselmann
    self.assertEqual(sorted(os.listdir(self.tmpdir)), sorted([
231 340ae7da Michael Hanselmann
      "rsa.public", "rsa.private",
232 340ae7da Michael Hanselmann
      "dsa.public", "dsa.private",
233 d12b9f66 Michael Hanselmann
      ]))
234 d12b9f66 Michael Hanselmann
    self.assertEqual(utils.ReadFile(utils.PathJoin(self.tmpdir, "rsa.public")),
235 d12b9f66 Michael Hanselmann
                     "rsapub")
236 d12b9f66 Michael Hanselmann
    self.assertEqual(utils.ReadFile(utils.PathJoin(self.tmpdir, "rsa.private")),
237 d12b9f66 Michael Hanselmann
                     "rsapriv")
238 d12b9f66 Michael Hanselmann
    self.assertEqual(utils.ReadFile(utils.PathJoin(self.tmpdir, "dsa.public")),
239 d12b9f66 Michael Hanselmann
                     "dsapub")
240 d12b9f66 Michael Hanselmann
    self.assertEqual(utils.ReadFile(utils.PathJoin(self.tmpdir, "dsa.private")),
241 d12b9f66 Michael Hanselmann
                     "dsapriv")
242 d12b9f66 Michael Hanselmann
243 d12b9f66 Michael Hanselmann
  def testSuccess(self):
244 d12b9f66 Michael Hanselmann
    self._TestUpdate(False)
245 d12b9f66 Michael Hanselmann
246 d12b9f66 Michael Hanselmann
  def testFailure(self):
247 d12b9f66 Michael Hanselmann
    self._TestUpdate(True)
248 d12b9f66 Michael Hanselmann
249 d12b9f66 Michael Hanselmann
250 d12b9f66 Michael Hanselmann
class TestUpdateSshRoot(unittest.TestCase):
251 d12b9f66 Michael Hanselmann
  def setUp(self):
252 d12b9f66 Michael Hanselmann
    unittest.TestCase.setUp(self)
253 d12b9f66 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
254 d12b9f66 Michael Hanselmann
    self.sshdir = utils.PathJoin(self.tmpdir, ".ssh")
255 d12b9f66 Michael Hanselmann
256 d12b9f66 Michael Hanselmann
  def tearDown(self):
257 d12b9f66 Michael Hanselmann
    unittest.TestCase.tearDown(self)
258 d12b9f66 Michael Hanselmann
    shutil.rmtree(self.tmpdir)
259 d12b9f66 Michael Hanselmann
260 d12b9f66 Michael Hanselmann
  def _GetHomeDir(self, user):
261 d12b9f66 Michael Hanselmann
    self.assertEqual(user, constants.SSH_LOGIN_USER)
262 d12b9f66 Michael Hanselmann
    return self.tmpdir
263 d12b9f66 Michael Hanselmann
264 d12b9f66 Michael Hanselmann
  def testNoKeys(self):
265 d12b9f66 Michael Hanselmann
    data_empty_keys = {
266 d12b9f66 Michael Hanselmann
      constants.SSHS_SSH_ROOT_KEY: [],
267 d12b9f66 Michael Hanselmann
      }
268 d12b9f66 Michael Hanselmann
269 d12b9f66 Michael Hanselmann
    for data in [{}, data_empty_keys]:
270 d12b9f66 Michael Hanselmann
      for dry_run in [False, True]:
271 d12b9f66 Michael Hanselmann
        prepare_node_join.UpdateSshRoot(data, dry_run,
272 d12b9f66 Michael Hanselmann
                                        _homedir_fn=NotImplemented)
273 d12b9f66 Michael Hanselmann
    self.assertEqual(os.listdir(self.tmpdir), [])
274 d12b9f66 Michael Hanselmann
275 d12b9f66 Michael Hanselmann
  def testDryRun(self):
276 d12b9f66 Michael Hanselmann
    data = {
277 d12b9f66 Michael Hanselmann
      constants.SSHS_SSH_ROOT_KEY: [
278 d12b9f66 Michael Hanselmann
        (constants.SSHK_RSA, "aaa", "bbb"),
279 d12b9f66 Michael Hanselmann
        ]
280 d12b9f66 Michael Hanselmann
      }
281 d12b9f66 Michael Hanselmann
282 d12b9f66 Michael Hanselmann
    prepare_node_join.UpdateSshRoot(data, True,
283 d12b9f66 Michael Hanselmann
                                    _homedir_fn=self._GetHomeDir)
284 d12b9f66 Michael Hanselmann
    self.assertEqual(os.listdir(self.tmpdir), [".ssh"])
285 d12b9f66 Michael Hanselmann
    self.assertEqual(os.listdir(self.sshdir), [])
286 d12b9f66 Michael Hanselmann
287 d12b9f66 Michael Hanselmann
  def testUpdate(self):
288 d12b9f66 Michael Hanselmann
    data = {
289 d12b9f66 Michael Hanselmann
      constants.SSHS_SSH_ROOT_KEY: [
290 340ae7da Michael Hanselmann
        (constants.SSHK_DSA, "privatedsa", "ssh-dss pubdsa"),
291 d12b9f66 Michael Hanselmann
        ]
292 d12b9f66 Michael Hanselmann
      }
293 d12b9f66 Michael Hanselmann
294 d12b9f66 Michael Hanselmann
    prepare_node_join.UpdateSshRoot(data, False,
295 d12b9f66 Michael Hanselmann
                                    _homedir_fn=self._GetHomeDir)
296 d12b9f66 Michael Hanselmann
    self.assertEqual(os.listdir(self.tmpdir), [".ssh"])
297 d12b9f66 Michael Hanselmann
    self.assertEqual(sorted(os.listdir(self.sshdir)),
298 d12b9f66 Michael Hanselmann
                     sorted(["authorized_keys", "id_dsa", "id_dsa.pub"]))
299 d12b9f66 Michael Hanselmann
    self.assertEqual(utils.ReadFile(utils.PathJoin(self.sshdir, "id_dsa")),
300 d12b9f66 Michael Hanselmann
                     "privatedsa")
301 d12b9f66 Michael Hanselmann
    self.assertEqual(utils.ReadFile(utils.PathJoin(self.sshdir, "id_dsa.pub")),
302 910ef222 Michael Hanselmann
                     "ssh-dss pubdsa")
303 d12b9f66 Michael Hanselmann
    self.assertEqual(utils.ReadFile(utils.PathJoin(self.sshdir,
304 d12b9f66 Michael Hanselmann
                                                   "authorized_keys")),
305 d12b9f66 Michael Hanselmann
                     "ssh-dss pubdsa\n")
306 d12b9f66 Michael Hanselmann
307 d12b9f66 Michael Hanselmann
308 d12b9f66 Michael Hanselmann
if __name__ == "__main__":
309 d12b9f66 Michael Hanselmann
  testutils.GanetiTestProgram()