Statistics
| Branch: | Tag: | Revision:

root / test / py / cmdlib / backup_unittest.py @ fbeb41e6

History | View | Annotate | Download (6.3 kB)

1
#!/usr/bin/python
2
#
3

    
4
# Copyright (C) 2013 Google Inc.
5
#
6
# This program is free software; you can redistribute it and/or modify
7
# it under the terms of the GNU General Public License as published by
8
# the Free Software Foundation; either version 2 of the License, or
9
# (at your option) any later version.
10
#
11
# This program is distributed in the hope that it will be useful, but
12
# WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
# General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License
17
# along with this program; if not, write to the Free Software
18
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19
# 02110-1301, USA.
20

    
21

    
22
"""Tests for LUBackup*"""
23

    
24
from ganeti import constants
25
from ganeti import objects
26
from ganeti import opcodes
27
from ganeti import query
28

    
29
from testsupport import *
30

    
31
import testutils
32

    
33

    
34
class TestLUBackupPrepare(CmdlibTestCase):
35
  @patchUtils("instance_utils")
36
  def testPrepareLocalExport(self, utils):
37
    utils.ReadOneLineFile.return_value = "cluster_secret"
38
    inst = self.cfg.AddNewInstance()
39
    op = opcodes.OpBackupPrepare(instance_name=inst.name,
40
                                 mode=constants.EXPORT_MODE_LOCAL)
41
    self.ExecOpCode(op)
42

    
43
  @patchUtils("instance_utils")
44
  def testPrepareRemoteExport(self, utils):
45
    utils.ReadOneLineFile.return_value = "cluster_secret"
46
    inst = self.cfg.AddNewInstance()
47
    self.rpc.call_x509_cert_create.return_value = \
48
      self.RpcResultsBuilder() \
49
        .CreateSuccessfulNodeResult(inst.primary_node,
50
                                    ("key_name",
51
                                     testutils.ReadTestData("cert1.pem")))
52
    op = opcodes.OpBackupPrepare(instance_name=inst.name,
53
                                 mode=constants.EXPORT_MODE_REMOTE)
54
    self.ExecOpCode(op)
55

    
56

    
57
class TestLUBackupExportBase(CmdlibTestCase):
58
  def setUp(self):
59
    super(TestLUBackupExportBase, self).setUp()
60

    
61
    self.rpc.call_instance_start.return_value = \
62
      self.RpcResultsBuilder() \
63
        .CreateSuccessfulNodeResult(self.master, True)
64

    
65
    self.rpc.call_blockdev_assemble.return_value = \
66
      self.RpcResultsBuilder() \
67
        .CreateSuccessfulNodeResult(self.master, ("/dev/mock_path",
68
                                                  "/dev/mock_link_name"))
69

    
70
    self.rpc.call_blockdev_shutdown.return_value = \
71
      self.RpcResultsBuilder() \
72
        .CreateSuccessfulNodeResult(self.master, None)
73

    
74
    self.rpc.call_blockdev_snapshot.return_value = \
75
      self.RpcResultsBuilder() \
76
        .CreateSuccessfulNodeResult(self.master, ("mock_vg", "mock_id"))
77

    
78
    self.rpc.call_blockdev_remove.return_value = \
79
      self.RpcResultsBuilder() \
80
        .CreateSuccessfulNodeResult(self.master, None)
81

    
82
    self.rpc.call_export_start.return_value = \
83
      self.RpcResultsBuilder() \
84
        .CreateSuccessfulNodeResult(self.master, "export_daemon")
85

    
86
    def ImpExpStatus(node_uuid, name):
87
      return self.RpcResultsBuilder() \
88
               .CreateSuccessfulNodeResult(node_uuid,
89
                                           [objects.ImportExportStatus(
90
                                             exit_status=0
91
                                           )])
92
    self.rpc.call_impexp_status.side_effect = ImpExpStatus
93

    
94
    def ImpExpCleanup(node_uuid, name):
95
      return self.RpcResultsBuilder() \
96
               .CreateSuccessfulNodeResult(node_uuid)
97
    self.rpc.call_impexp_cleanup.side_effect = ImpExpCleanup
98

    
99
    self.rpc.call_finalize_export.return_value = \
100
      self.RpcResultsBuilder() \
101
        .CreateSuccessfulNodeResult(self.master, None)
102

    
103
  def testRemoveRunningInstanceWithoutShutdown(self):
104
    inst = self.cfg.AddNewInstance(admin_state=constants.ADMINST_UP)
105
    op = opcodes.OpBackupExport(instance_name=inst.name,
106
                                target_node=self.master.name,
107
                                shutdown=False,
108
                                remove_instance=True)
109
    self.ExecOpCodeExpectOpPrereqError(
110
      op, "Can not remove instance without shutting it down before")
111

    
112
  def testUnsupportedDiskTemplate(self):
113
    inst = self.cfg.AddNewInstance(disk_template=constants.DT_FILE)
114
    op = opcodes.OpBackupExport(instance_name=inst.name,
115
                                target_node=self.master.name)
116
    self.ExecOpCodeExpectOpPrereqError(
117
      op, "Export not supported for instances with file-based disks")
118

    
119

    
120
class TestLUBackupExportLocalExport(TestLUBackupExportBase):
121
  def setUp(self):
122
    super(TestLUBackupExportLocalExport, self).setUp()
123

    
124
    self.inst = self.cfg.AddNewInstance()
125
    self.target_node = self.cfg.AddNewNode()
126
    self.op = opcodes.OpBackupExport(mode=constants.EXPORT_MODE_LOCAL,
127
                                     instance_name=self.inst.name,
128
                                     target_node=self.target_node.name)
129

    
130
    self.rpc.call_import_start.return_value = \
131
      self.RpcResultsBuilder() \
132
        .CreateSuccessfulNodeResult(self.target_node, "import_daemon")
133

    
134
  def testExportWithShutdown(self):
135
    inst = self.cfg.AddNewInstance(admin_state=constants.ADMINST_UP)
136
    op = self.CopyOpCode(self.op, instance_name=inst.name, shutdown=True)
137
    self.ExecOpCode(op)
138

    
139
  def testExportDeactivatedDisks(self):
140
    self.ExecOpCode(self.op)
141

    
142
  def testExportRemoveInstance(self):
143
    op = self.CopyOpCode(self.op, remove_instance=True)
144
    self.ExecOpCode(op)
145

    
146

    
147
class TestLUBackupExportRemoteExport(TestLUBackupExportBase):
148
  def setUp(self):
149
    super(TestLUBackupExportRemoteExport, self).setUp()
150

    
151
    self.inst = self.cfg.AddNewInstance()
152
    self.op = opcodes.OpBackupExport(mode=constants.EXPORT_MODE_REMOTE,
153
                                     instance_name=self.inst.name,
154
                                     target_node=[],
155
                                     x509_key_name=["mock_key_name"],
156
                                     destination_x509_ca="mock_dest_ca")
157

    
158
  def testRemoteExportWithoutX509KeyName(self):
159
    op = self.CopyOpCode(self.op, x509_key_name=self.REMOVE)
160
    self.ExecOpCodeExpectOpPrereqError(op,
161
                                       "Missing X509 key name for encryption")
162

    
163
  def testRemoteExportWithoutX509DestCa(self):
164
    op = self.CopyOpCode(self.op, destination_x509_ca=self.REMOVE)
165
    self.ExecOpCodeExpectOpPrereqError(op,
166
                                       "Missing destination X509 CA")
167

    
168

    
169
if __name__ == "__main__":
170
  testutils.GanetiTestProgram()