Statistics
| Branch: | Tag: | Revision:

root / lib / server / noded.py @ 07e68848

History | View | Annotate | Download (33.2 kB)

1 69cf3abd Michael Hanselmann
#
2 a8083063 Iustin Pop
#
3 a8083063 Iustin Pop
4 cad0723b Iustin Pop
# Copyright (C) 2006, 2007, 2010, 2011, 2012 Google Inc.
5 a8083063 Iustin Pop
#
6 a8083063 Iustin Pop
# This program is free software; you can redistribute it and/or modify
7 a8083063 Iustin Pop
# it under the terms of the GNU General Public License as published by
8 a8083063 Iustin Pop
# the Free Software Foundation; either version 2 of the License, or
9 a8083063 Iustin Pop
# (at your option) any later version.
10 a8083063 Iustin Pop
#
11 a8083063 Iustin Pop
# This program is distributed in the hope that it will be useful, but
12 a8083063 Iustin Pop
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 a8083063 Iustin Pop
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 a8083063 Iustin Pop
# General Public License for more details.
15 a8083063 Iustin Pop
#
16 a8083063 Iustin Pop
# You should have received a copy of the GNU General Public License
17 a8083063 Iustin Pop
# along with this program; if not, write to the Free Software
18 a8083063 Iustin Pop
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 a8083063 Iustin Pop
# 02110-1301, USA.
20 a8083063 Iustin Pop
21 a8083063 Iustin Pop
22 a8083063 Iustin Pop
"""Ganeti node daemon"""
23 a8083063 Iustin Pop
24 b459a848 Andrea Spadaccini
# pylint: disable=C0103,W0142
25 7260cfbe Iustin Pop
26 7260cfbe Iustin Pop
# C0103: Functions in this module need to have a given name structure,
27 7260cfbe Iustin Pop
# and the name of the daemon doesn't match
28 7260cfbe Iustin Pop
29 7260cfbe Iustin Pop
# W0142: Used * or ** magic, since we do use it extensively in this
30 7260cfbe Iustin Pop
# module
31 3ecf6786 Iustin Pop
32 a8083063 Iustin Pop
import os
33 a8083063 Iustin Pop
import sys
34 c89189b1 Iustin Pop
import logging
35 84b58db2 Michael Hanselmann
import signal
36 f01738fc Iustin Pop
import codecs
37 a8083063 Iustin Pop
38 a8083063 Iustin Pop
from optparse import OptionParser
39 a8083063 Iustin Pop
40 a8083063 Iustin Pop
from ganeti import backend
41 a8083063 Iustin Pop
from ganeti import constants
42 a8083063 Iustin Pop
from ganeti import objects
43 a8083063 Iustin Pop
from ganeti import errors
44 25d6d12a Michael Hanselmann
from ganeti import jstore
45 cc28af80 Michael Hanselmann
from ganeti import daemon
46 1df6506c Michael Hanselmann
from ganeti import http
47 16abfbc2 Alexander Schreiber
from ganeti import utils
48 8f096849 Helga Velroyen
from ganeti.storage import container
49 ab221ddf Michael Hanselmann
from ganeti import serializer
50 a744b676 Manuel Franceschini
from ganeti import netutils
51 a5ce2ea2 Michael Hanselmann
from ganeti import pathutils
52 ee501db1 Michael Hanselmann
from ganeti import ssconf
53 a8083063 Iustin Pop
54 b459a848 Andrea Spadaccini
import ganeti.http.server # pylint: disable=W0611
55 19205c39 Michael Hanselmann
56 a8083063 Iustin Pop
57 25d6d12a Michael Hanselmann
queue_lock = None
58 25d6d12a Michael Hanselmann
59 25d6d12a Michael Hanselmann
60 8e00f36a Michele Tartara
def _extendReasonTrail(trail, source, reason=""):
61 8e00f36a Michele Tartara
  """Extend the reason trail with noded information
62 8e00f36a Michele Tartara

63 8e00f36a Michele Tartara
  The trail is extended by appending the name of the noded functionality
64 8e00f36a Michele Tartara
  """
65 8e00f36a Michele Tartara
  assert trail is not None
66 8e00f36a Michele Tartara
  trail_source = "%s:%s" % (constants.OPCODE_REASON_SRC_NODED, source)
67 8e00f36a Michele Tartara
  trail.append((trail_source, reason, utils.EpochNano()))
68 8e00f36a Michele Tartara
69 8e00f36a Michele Tartara
70 81198f6e Iustin Pop
def _PrepareQueueLock():
71 81198f6e Iustin Pop
  """Try to prepare the queue lock.
72 81198f6e Iustin Pop

73 81198f6e Iustin Pop
  @return: None for success, otherwise an exception object
74 81198f6e Iustin Pop

75 81198f6e Iustin Pop
  """
76 b459a848 Andrea Spadaccini
  global queue_lock # pylint: disable=W0603
77 81198f6e Iustin Pop
78 81198f6e Iustin Pop
  if queue_lock is not None:
79 81198f6e Iustin Pop
    return None
80 81198f6e Iustin Pop
81 81198f6e Iustin Pop
  # Prepare job queue
82 81198f6e Iustin Pop
  try:
83 81198f6e Iustin Pop
    queue_lock = jstore.InitAndVerifyQueue(must_lock=False)
84 81198f6e Iustin Pop
    return None
85 81198f6e Iustin Pop
  except EnvironmentError, err:
86 81198f6e Iustin Pop
    return err
87 81198f6e Iustin Pop
88 81198f6e Iustin Pop
89 7f30777b Michael Hanselmann
def _RequireJobQueueLock(fn):
90 7f30777b Michael Hanselmann
  """Decorator for job queue manipulating functions.
91 7f30777b Michael Hanselmann

92 7f30777b Michael Hanselmann
  """
93 8785cb30 Michael Hanselmann
  QUEUE_LOCK_TIMEOUT = 10
94 8785cb30 Michael Hanselmann
95 7f30777b Michael Hanselmann
  def wrapper(*args, **kwargs):
96 7f30777b Michael Hanselmann
    # Locking in exclusive, blocking mode because there could be several
97 506cff12 Michael Hanselmann
    # children running at the same time. Waiting up to 10 seconds.
98 81198f6e Iustin Pop
    if _PrepareQueueLock() is not None:
99 81198f6e Iustin Pop
      raise errors.JobQueueError("Job queue failed initialization,"
100 81198f6e Iustin Pop
                                 " cannot update jobs")
101 8785cb30 Michael Hanselmann
    queue_lock.Exclusive(blocking=True, timeout=QUEUE_LOCK_TIMEOUT)
102 7f30777b Michael Hanselmann
    try:
103 7f30777b Michael Hanselmann
      return fn(*args, **kwargs)
104 7f30777b Michael Hanselmann
    finally:
105 7f30777b Michael Hanselmann
      queue_lock.Unlock()
106 8785cb30 Michael Hanselmann
107 7f30777b Michael Hanselmann
  return wrapper
108 7f30777b Michael Hanselmann
109 7f30777b Michael Hanselmann
110 1651d116 Michael Hanselmann
def _DecodeImportExportIO(ieio, ieioargs):
111 1651d116 Michael Hanselmann
  """Decodes import/export I/O information.
112 1651d116 Michael Hanselmann

113 1651d116 Michael Hanselmann
  """
114 1651d116 Michael Hanselmann
  if ieio == constants.IEIO_RAW_DISK:
115 1651d116 Michael Hanselmann
    assert len(ieioargs) == 1
116 1651d116 Michael Hanselmann
    return (objects.Disk.FromDict(ieioargs[0]), )
117 1651d116 Michael Hanselmann
118 1651d116 Michael Hanselmann
  if ieio == constants.IEIO_SCRIPT:
119 1651d116 Michael Hanselmann
    assert len(ieioargs) == 2
120 1651d116 Michael Hanselmann
    return (objects.Disk.FromDict(ieioargs[0]), ieioargs[1])
121 1651d116 Michael Hanselmann
122 1651d116 Michael Hanselmann
  return ieioargs
123 1651d116 Michael Hanselmann
124 1651d116 Michael Hanselmann
125 4a90bd4f Michele Tartara
def _DefaultAlternative(value, default):
126 a82d9394 Michael Hanselmann
  """Returns value or, if evaluating to False, a default value.
127 4a90bd4f Michele Tartara

128 a82d9394 Michael Hanselmann
  Returns the given value, unless it evaluates to False. In the latter case the
129 a82d9394 Michael Hanselmann
  default value is returned.
130 a82d9394 Michael Hanselmann

131 a82d9394 Michael Hanselmann
  @param value: Value to return if it doesn't evaluate to False
132 a82d9394 Michael Hanselmann
  @param default: Default value
133 a82d9394 Michael Hanselmann
  @return: Given value or the default
134 4a90bd4f Michele Tartara

135 4a90bd4f Michele Tartara
  """
136 4a90bd4f Michele Tartara
  if value:
137 4a90bd4f Michele Tartara
    return value
138 4a90bd4f Michele Tartara
139 4a90bd4f Michele Tartara
  return default
140 4a90bd4f Michele Tartara
141 4a90bd4f Michele Tartara
142 38b77287 Luca Bigliardi
class MlockallRequestExecutor(http.server.HttpServerRequestExecutor):
143 cca5b3fc Michael Hanselmann
  """Subclass ensuring request handlers are locked in RAM.
144 38b77287 Luca Bigliardi

145 38b77287 Luca Bigliardi
  """
146 38b77287 Luca Bigliardi
  def __init__(self, *args, **kwargs):
147 38b77287 Luca Bigliardi
    utils.Mlockall()
148 38b77287 Luca Bigliardi
149 38b77287 Luca Bigliardi
    http.server.HttpServerRequestExecutor.__init__(self, *args, **kwargs)
150 38b77287 Luca Bigliardi
151 38b77287 Luca Bigliardi
152 e0003509 Michael Hanselmann
class NodeRequestHandler(http.server.HttpServerHandler):
153 3ecf6786 Iustin Pop
  """The server implementation.
154 3ecf6786 Iustin Pop

155 3ecf6786 Iustin Pop
  This class holds all methods exposed over the RPC interface.
156 3ecf6786 Iustin Pop

157 3ecf6786 Iustin Pop
  """
158 2d54e29c Iustin Pop
  # too many public methods, and unused args - all methods get params
159 2d54e29c Iustin Pop
  # due to the API
160 b459a848 Andrea Spadaccini
  # pylint: disable=R0904,W0613
161 e0003509 Michael Hanselmann
  def __init__(self):
162 e0003509 Michael Hanselmann
    http.server.HttpServerHandler.__init__(self)
163 cc28af80 Michael Hanselmann
    self.noded_pid = os.getpid()
164 cc28af80 Michael Hanselmann
165 cc28af80 Michael Hanselmann
  def HandleRequest(self, req):
166 1df6506c Michael Hanselmann
    """Handle a request.
167 a8083063 Iustin Pop

168 098c0958 Michael Hanselmann
    """
169 a7862455 Iustin Pop
    if req.request_method.upper() != http.HTTP_POST:
170 a7862455 Iustin Pop
      raise http.HttpBadRequest("Only the POST method is supported")
171 1df6506c Michael Hanselmann
172 cc28af80 Michael Hanselmann
    path = req.request_path
173 81010134 Iustin Pop
    if path.startswith("/"):
174 81010134 Iustin Pop
      path = path[1:]
175 81010134 Iustin Pop
176 1df6506c Michael Hanselmann
    method = getattr(self, "perspective_%s" % path, None)
177 1df6506c Michael Hanselmann
    if method is None:
178 84f2756e Michael Hanselmann
      raise http.HttpNotFound()
179 a8083063 Iustin Pop
180 81010134 Iustin Pop
    try:
181 ab221ddf Michael Hanselmann
      result = (True, method(serializer.LoadJson(req.request_body)))
182 4dd42c9d Iustin Pop
183 0623d351 Iustin Pop
    except backend.RPCFail, err:
184 0623d351 Iustin Pop
      # our custom failure exception; str(err) works fine if the
185 0623d351 Iustin Pop
      # exception was constructed with a single argument, and in
186 0623d351 Iustin Pop
      # this case, err.message == err.args[0] == str(err)
187 ab221ddf Michael Hanselmann
      result = (False, str(err))
188 9ae49f27 Guido Trotter
    except errors.QuitGanetiException, err:
189 84b58db2 Michael Hanselmann
      # Tell parent to quit
190 0623d351 Iustin Pop
      logging.info("Shutting down the node daemon, arguments: %s",
191 0623d351 Iustin Pop
                   str(err.args))
192 cc28af80 Michael Hanselmann
      os.kill(self.noded_pid, signal.SIGTERM)
193 0623d351 Iustin Pop
      # And return the error's arguments, which must be already in
194 0623d351 Iustin Pop
      # correct tuple format
195 ab221ddf Michael Hanselmann
      result = err.args
196 4dd42c9d Iustin Pop
    except Exception, err:
197 0623d351 Iustin Pop
      logging.exception("Error in RPC call")
198 ab221ddf Michael Hanselmann
      result = (False, "Error while executing backend function: %s" % str(err))
199 ab221ddf Michael Hanselmann
200 a182a3ed Michael Hanselmann
    return serializer.DumpJson(result)
201 a8083063 Iustin Pop
202 a8083063 Iustin Pop
  # the new block devices  --------------------------
203 a8083063 Iustin Pop
204 3ecf6786 Iustin Pop
  @staticmethod
205 3ecf6786 Iustin Pop
  def perspective_blockdev_create(params):
206 3ecf6786 Iustin Pop
    """Create a block device.
207 3ecf6786 Iustin Pop

208 3ecf6786 Iustin Pop
    """
209 ee1478e5 Bernardo Dal Seno
    (bdev_s, size, owner, on_primary, info, excl_stor) = params
210 319856a9 Michael Hanselmann
    bdev = objects.Disk.FromDict(bdev_s)
211 a8083063 Iustin Pop
    if bdev is None:
212 a8083063 Iustin Pop
      raise ValueError("can't unserialize data!")
213 ee1478e5 Bernardo Dal Seno
    return backend.BlockdevCreate(bdev, size, owner, on_primary, info,
214 ee1478e5 Bernardo Dal Seno
                                  excl_stor)
215 a8083063 Iustin Pop
216 3ecf6786 Iustin Pop
  @staticmethod
217 9c007da8 René Nussbaumer
  def perspective_blockdev_pause_resume_sync(params):
218 9c007da8 René Nussbaumer
    """Pause/resume sync of a block device.
219 9c007da8 René Nussbaumer

220 9c007da8 René Nussbaumer
    """
221 9c007da8 René Nussbaumer
    disks_s, pause = params
222 9c007da8 René Nussbaumer
    disks = [objects.Disk.FromDict(bdev_s) for bdev_s in disks_s]
223 9c007da8 René Nussbaumer
    return backend.BlockdevPauseResumeSync(disks, pause)
224 9c007da8 René Nussbaumer
225 9c007da8 René Nussbaumer
  @staticmethod
226 271b7cf9 René Nussbaumer
  def perspective_blockdev_wipe(params):
227 271b7cf9 René Nussbaumer
    """Wipe a block device.
228 271b7cf9 René Nussbaumer

229 271b7cf9 René Nussbaumer
    """
230 271b7cf9 René Nussbaumer
    bdev_s, offset, size = params
231 271b7cf9 René Nussbaumer
    bdev = objects.Disk.FromDict(bdev_s)
232 271b7cf9 René Nussbaumer
    return backend.BlockdevWipe(bdev, offset, size)
233 271b7cf9 René Nussbaumer
234 271b7cf9 René Nussbaumer
  @staticmethod
235 3ecf6786 Iustin Pop
  def perspective_blockdev_remove(params):
236 3ecf6786 Iustin Pop
    """Remove a block device.
237 3ecf6786 Iustin Pop

238 3ecf6786 Iustin Pop
    """
239 a8083063 Iustin Pop
    bdev_s = params[0]
240 319856a9 Michael Hanselmann
    bdev = objects.Disk.FromDict(bdev_s)
241 821d1bd1 Iustin Pop
    return backend.BlockdevRemove(bdev)
242 a8083063 Iustin Pop
243 3ecf6786 Iustin Pop
  @staticmethod
244 f3e513ad Iustin Pop
  def perspective_blockdev_rename(params):
245 f3e513ad Iustin Pop
    """Remove a block device.
246 f3e513ad Iustin Pop

247 f3e513ad Iustin Pop
    """
248 8a31717c Michael Hanselmann
    devlist = [(objects.Disk.FromDict(ds), uid) for ds, uid in params[0]]
249 821d1bd1 Iustin Pop
    return backend.BlockdevRename(devlist)
250 f3e513ad Iustin Pop
251 f3e513ad Iustin Pop
  @staticmethod
252 3ecf6786 Iustin Pop
  def perspective_blockdev_assemble(params):
253 3ecf6786 Iustin Pop
    """Assemble a block device.
254 3ecf6786 Iustin Pop

255 3ecf6786 Iustin Pop
    """
256 c417e115 Iustin Pop
    bdev_s, owner, on_primary, idx = params
257 319856a9 Michael Hanselmann
    bdev = objects.Disk.FromDict(bdev_s)
258 a8083063 Iustin Pop
    if bdev is None:
259 a8083063 Iustin Pop
      raise ValueError("can't unserialize data!")
260 c417e115 Iustin Pop
    return backend.BlockdevAssemble(bdev, owner, on_primary, idx)
261 a8083063 Iustin Pop
262 3ecf6786 Iustin Pop
  @staticmethod
263 3ecf6786 Iustin Pop
  def perspective_blockdev_shutdown(params):
264 3ecf6786 Iustin Pop
    """Shutdown a block device.
265 3ecf6786 Iustin Pop

266 3ecf6786 Iustin Pop
    """
267 a8083063 Iustin Pop
    bdev_s = params[0]
268 319856a9 Michael Hanselmann
    bdev = objects.Disk.FromDict(bdev_s)
269 a8083063 Iustin Pop
    if bdev is None:
270 a8083063 Iustin Pop
      raise ValueError("can't unserialize data!")
271 821d1bd1 Iustin Pop
    return backend.BlockdevShutdown(bdev)
272 a8083063 Iustin Pop
273 3ecf6786 Iustin Pop
  @staticmethod
274 153d9724 Iustin Pop
  def perspective_blockdev_addchildren(params):
275 3ecf6786 Iustin Pop
    """Add a child to a mirror device.
276 3ecf6786 Iustin Pop

277 3ecf6786 Iustin Pop
    Note: this is only valid for mirror devices. It's the caller's duty
278 3ecf6786 Iustin Pop
    to send a correct disk, otherwise we raise an error.
279 3ecf6786 Iustin Pop

280 3ecf6786 Iustin Pop
    """
281 a8083063 Iustin Pop
    bdev_s, ndev_s = params
282 319856a9 Michael Hanselmann
    bdev = objects.Disk.FromDict(bdev_s)
283 153d9724 Iustin Pop
    ndevs = [objects.Disk.FromDict(disk_s) for disk_s in ndev_s]
284 153d9724 Iustin Pop
    if bdev is None or ndevs.count(None) > 0:
285 a8083063 Iustin Pop
      raise ValueError("can't unserialize data!")
286 821d1bd1 Iustin Pop
    return backend.BlockdevAddchildren(bdev, ndevs)
287 a8083063 Iustin Pop
288 3ecf6786 Iustin Pop
  @staticmethod
289 153d9724 Iustin Pop
  def perspective_blockdev_removechildren(params):
290 3ecf6786 Iustin Pop
    """Remove a child from a mirror device.
291 3ecf6786 Iustin Pop

292 3ecf6786 Iustin Pop
    This is only valid for mirror devices, of course. It's the callers
293 3ecf6786 Iustin Pop
    duty to send a correct disk, otherwise we raise an error.
294 3ecf6786 Iustin Pop

295 3ecf6786 Iustin Pop
    """
296 a8083063 Iustin Pop
    bdev_s, ndev_s = params
297 319856a9 Michael Hanselmann
    bdev = objects.Disk.FromDict(bdev_s)
298 153d9724 Iustin Pop
    ndevs = [objects.Disk.FromDict(disk_s) for disk_s in ndev_s]
299 153d9724 Iustin Pop
    if bdev is None or ndevs.count(None) > 0:
300 a8083063 Iustin Pop
      raise ValueError("can't unserialize data!")
301 821d1bd1 Iustin Pop
    return backend.BlockdevRemovechildren(bdev, ndevs)
302 a8083063 Iustin Pop
303 3ecf6786 Iustin Pop
  @staticmethod
304 3ecf6786 Iustin Pop
  def perspective_blockdev_getmirrorstatus(params):
305 3ecf6786 Iustin Pop
    """Return the mirror status for a list of disks.
306 3ecf6786 Iustin Pop

307 3ecf6786 Iustin Pop
    """
308 319856a9 Michael Hanselmann
    disks = [objects.Disk.FromDict(dsk_s)
309 e437117f Michael Hanselmann
             for dsk_s in params[0]]
310 36145b12 Michael Hanselmann
    return [status.ToDict()
311 36145b12 Michael Hanselmann
            for status in backend.BlockdevGetmirrorstatus(disks)]
312 a8083063 Iustin Pop
313 3ecf6786 Iustin Pop
  @staticmethod
314 b8d26c6e Michael Hanselmann
  def perspective_blockdev_getmirrorstatus_multi(params):
315 b8d26c6e Michael Hanselmann
    """Return the mirror status for a list of disks.
316 b8d26c6e Michael Hanselmann

317 b8d26c6e Michael Hanselmann
    """
318 b8d26c6e Michael Hanselmann
    (node_disks, ) = params
319 b8d26c6e Michael Hanselmann
320 5449685e Iustin Pop
    disks = [objects.Disk.FromDict(dsk_s) for dsk_s in node_disks]
321 b8d26c6e Michael Hanselmann
322 c6a9dffa Michael Hanselmann
    result = []
323 c6a9dffa Michael Hanselmann
324 c6a9dffa Michael Hanselmann
    for (success, status) in backend.BlockdevGetmirrorstatusMulti(disks):
325 c6a9dffa Michael Hanselmann
      if success:
326 c6a9dffa Michael Hanselmann
        result.append((success, status.ToDict()))
327 c6a9dffa Michael Hanselmann
      else:
328 c6a9dffa Michael Hanselmann
        result.append((success, status))
329 c6a9dffa Michael Hanselmann
330 c6a9dffa Michael Hanselmann
    return result
331 b8d26c6e Michael Hanselmann
332 b8d26c6e Michael Hanselmann
  @staticmethod
333 3ecf6786 Iustin Pop
  def perspective_blockdev_find(params):
334 3ecf6786 Iustin Pop
    """Expose the FindBlockDevice functionality for a disk.
335 3ecf6786 Iustin Pop

336 3ecf6786 Iustin Pop
    This will try to find but not activate a disk.
337 3ecf6786 Iustin Pop

338 3ecf6786 Iustin Pop
    """
339 319856a9 Michael Hanselmann
    disk = objects.Disk.FromDict(params[0])
340 ddfe2228 Michael Hanselmann
341 ddfe2228 Michael Hanselmann
    result = backend.BlockdevFind(disk)
342 ddfe2228 Michael Hanselmann
    if result is None:
343 ddfe2228 Michael Hanselmann
      return None
344 ddfe2228 Michael Hanselmann
345 ddfe2228 Michael Hanselmann
    return result.ToDict()
346 a8083063 Iustin Pop
347 3ecf6786 Iustin Pop
  @staticmethod
348 3ecf6786 Iustin Pop
  def perspective_blockdev_snapshot(params):
349 3ecf6786 Iustin Pop
    """Create a snapshot device.
350 3ecf6786 Iustin Pop

351 3ecf6786 Iustin Pop
    Note that this is only valid for LVM disks, if we get passed
352 3ecf6786 Iustin Pop
    something else we raise an exception. The snapshot device can be
353 3ecf6786 Iustin Pop
    remove by calling the generic block device remove call.
354 3ecf6786 Iustin Pop

355 3ecf6786 Iustin Pop
    """
356 319856a9 Michael Hanselmann
    cfbd = objects.Disk.FromDict(params[0])
357 821d1bd1 Iustin Pop
    return backend.BlockdevSnapshot(cfbd)
358 a8083063 Iustin Pop
359 4c8ba8b3 Iustin Pop
  @staticmethod
360 4c8ba8b3 Iustin Pop
  def perspective_blockdev_grow(params):
361 4c8ba8b3 Iustin Pop
    """Grow a stack of devices.
362 4c8ba8b3 Iustin Pop

363 4c8ba8b3 Iustin Pop
    """
364 e43a624e Bernardo Dal Seno
    if len(params) < 5:
365 e43a624e Bernardo Dal Seno
      raise ValueError("Received only %s parameters in blockdev_grow,"
366 e43a624e Bernardo Dal Seno
                       " old master?" % len(params))
367 4c8ba8b3 Iustin Pop
    cfbd = objects.Disk.FromDict(params[0])
368 4c8ba8b3 Iustin Pop
    amount = params[1]
369 a59faf4b Iustin Pop
    dryrun = params[2]
370 cad0723b Iustin Pop
    backingstore = params[3]
371 be9150ea Bernardo Dal Seno
    excl_stor = params[4]
372 be9150ea Bernardo Dal Seno
    return backend.BlockdevGrow(cfbd, amount, dryrun, backingstore, excl_stor)
373 4c8ba8b3 Iustin Pop
374 d61cbe76 Iustin Pop
  @staticmethod
375 d61cbe76 Iustin Pop
  def perspective_blockdev_close(params):
376 d61cbe76 Iustin Pop
    """Closes the given block devices.
377 d61cbe76 Iustin Pop

378 d61cbe76 Iustin Pop
    """
379 b2e7666a Iustin Pop
    disks = [objects.Disk.FromDict(cf) for cf in params[1]]
380 821d1bd1 Iustin Pop
    return backend.BlockdevClose(params[0], disks)
381 d61cbe76 Iustin Pop
382 968a7623 Iustin Pop
  @staticmethod
383 6ef8077e Bernardo Dal Seno
  def perspective_blockdev_getdimensions(params):
384 968a7623 Iustin Pop
    """Compute the sizes of the given block devices.
385 968a7623 Iustin Pop

386 968a7623 Iustin Pop
    """
387 968a7623 Iustin Pop
    disks = [objects.Disk.FromDict(cf) for cf in params[0]]
388 6ef8077e Bernardo Dal Seno
    return backend.BlockdevGetdimensions(disks)
389 968a7623 Iustin Pop
390 858f3d18 Iustin Pop
  @staticmethod
391 858f3d18 Iustin Pop
  def perspective_blockdev_export(params):
392 858f3d18 Iustin Pop
    """Compute the sizes of the given block devices.
393 858f3d18 Iustin Pop

394 858f3d18 Iustin Pop
    """
395 858f3d18 Iustin Pop
    disk = objects.Disk.FromDict(params[0])
396 f56ab6d1 Thomas Thrainer
    dest_node_ip, dest_path, cluster_name = params[1:]
397 f56ab6d1 Thomas Thrainer
    return backend.BlockdevExport(disk, dest_node_ip, dest_path, cluster_name)
398 858f3d18 Iustin Pop
399 48e175a2 Iustin Pop
  @staticmethod
400 48e175a2 Iustin Pop
  def perspective_blockdev_setinfo(params):
401 48e175a2 Iustin Pop
    """Sets metadata information on the given block device.
402 48e175a2 Iustin Pop

403 48e175a2 Iustin Pop
    """
404 48e175a2 Iustin Pop
    (disk, info) = params
405 48e175a2 Iustin Pop
    disk = objects.Disk.FromDict(disk)
406 48e175a2 Iustin Pop
    return backend.BlockdevSetInfo(disk, info)
407 48e175a2 Iustin Pop
408 6b93ec9d Iustin Pop
  # blockdev/drbd specific methods ----------
409 6b93ec9d Iustin Pop
410 6b93ec9d Iustin Pop
  @staticmethod
411 6b93ec9d Iustin Pop
  def perspective_drbd_disconnect_net(params):
412 6b93ec9d Iustin Pop
    """Disconnects the network connection of drbd disks.
413 6b93ec9d Iustin Pop

414 6b93ec9d Iustin Pop
    Note that this is only valid for drbd disks, so the members of the
415 6b93ec9d Iustin Pop
    disk list must all be drbd devices.
416 6b93ec9d Iustin Pop

417 6b93ec9d Iustin Pop
    """
418 0c3d9c7c Thomas Thrainer
    (disks,) = params
419 0c3d9c7c Thomas Thrainer
    disks = [objects.Disk.FromDict(disk) for disk in disks]
420 0c3d9c7c Thomas Thrainer
    return backend.DrbdDisconnectNet(disks)
421 6b93ec9d Iustin Pop
422 6b93ec9d Iustin Pop
  @staticmethod
423 6b93ec9d Iustin Pop
  def perspective_drbd_attach_net(params):
424 6b93ec9d Iustin Pop
    """Attaches the network connection of drbd disks.
425 6b93ec9d Iustin Pop

426 6b93ec9d Iustin Pop
    Note that this is only valid for drbd disks, so the members of the
427 6b93ec9d Iustin Pop
    disk list must all be drbd devices.
428 6b93ec9d Iustin Pop

429 6b93ec9d Iustin Pop
    """
430 0c3d9c7c Thomas Thrainer
    disks, instance_name, multimaster = params
431 0c3d9c7c Thomas Thrainer
    disks = [objects.Disk.FromDict(disk) for disk in disks]
432 0c3d9c7c Thomas Thrainer
    return backend.DrbdAttachNet(disks, instance_name, multimaster)
433 6b93ec9d Iustin Pop
434 6b93ec9d Iustin Pop
  @staticmethod
435 6b93ec9d Iustin Pop
  def perspective_drbd_wait_sync(params):
436 6b93ec9d Iustin Pop
    """Wait until DRBD disks are synched.
437 6b93ec9d Iustin Pop

438 6b93ec9d Iustin Pop
    Note that this is only valid for drbd disks, so the members of the
439 6b93ec9d Iustin Pop
    disk list must all be drbd devices.
440 6b93ec9d Iustin Pop

441 6b93ec9d Iustin Pop
    """
442 0c3d9c7c Thomas Thrainer
    (disks,) = params
443 0c3d9c7c Thomas Thrainer
    disks = [objects.Disk.FromDict(disk) for disk in disks]
444 0c3d9c7c Thomas Thrainer
    return backend.DrbdWaitSync(disks)
445 6b93ec9d Iustin Pop
446 c46b9782 Luca Bigliardi
  @staticmethod
447 235a6b29 Thomas Thrainer
  def perspective_drbd_needs_activation(params):
448 235a6b29 Thomas Thrainer
    """Checks if the drbd devices need activation
449 235a6b29 Thomas Thrainer

450 235a6b29 Thomas Thrainer
    Note that this is only valid for drbd disks, so the members of the
451 235a6b29 Thomas Thrainer
    disk list must all be drbd devices.
452 235a6b29 Thomas Thrainer

453 235a6b29 Thomas Thrainer
    """
454 0c3d9c7c Thomas Thrainer
    (disks,) = params
455 0c3d9c7c Thomas Thrainer
    disks = [objects.Disk.FromDict(disk) for disk in disks]
456 0c3d9c7c Thomas Thrainer
    return backend.DrbdNeedsActivation(disks)
457 235a6b29 Thomas Thrainer
458 235a6b29 Thomas Thrainer
  @staticmethod
459 0c3d9c7c Thomas Thrainer
  def perspective_drbd_helper(_):
460 c46b9782 Luca Bigliardi
    """Query drbd helper.
461 c46b9782 Luca Bigliardi

462 c46b9782 Luca Bigliardi
    """
463 c46b9782 Luca Bigliardi
    return backend.GetDrbdUsermodeHelper()
464 c46b9782 Luca Bigliardi
465 a8083063 Iustin Pop
  # export/import  --------------------------
466 a8083063 Iustin Pop
467 3ecf6786 Iustin Pop
  @staticmethod
468 3ecf6786 Iustin Pop
  def perspective_finalize_export(params):
469 3ecf6786 Iustin Pop
    """Expose the finalize export functionality.
470 a8083063 Iustin Pop

471 3ecf6786 Iustin Pop
    """
472 319856a9 Michael Hanselmann
    instance = objects.Instance.FromDict(params[0])
473 7b651654 Michael Hanselmann
474 7b651654 Michael Hanselmann
    snap_disks = []
475 7b651654 Michael Hanselmann
    for disk in params[1]:
476 7b651654 Michael Hanselmann
      if isinstance(disk, bool):
477 7b651654 Michael Hanselmann
        snap_disks.append(disk)
478 7b651654 Michael Hanselmann
      else:
479 7b651654 Michael Hanselmann
        snap_disks.append(objects.Disk.FromDict(disk))
480 7b651654 Michael Hanselmann
481 a8083063 Iustin Pop
    return backend.FinalizeExport(instance, snap_disks)
482 a8083063 Iustin Pop
483 3ecf6786 Iustin Pop
  @staticmethod
484 3ecf6786 Iustin Pop
  def perspective_export_info(params):
485 3ecf6786 Iustin Pop
    """Query information about an existing export on this node.
486 3ecf6786 Iustin Pop

487 3ecf6786 Iustin Pop
    The given path may not contain an export, in which case we return
488 3ecf6786 Iustin Pop
    None.
489 3ecf6786 Iustin Pop

490 3ecf6786 Iustin Pop
    """
491 3ecf6786 Iustin Pop
    path = params[0]
492 3eccac06 Iustin Pop
    return backend.ExportInfo(path)
493 a8083063 Iustin Pop
494 3ecf6786 Iustin Pop
  @staticmethod
495 3ecf6786 Iustin Pop
  def perspective_export_list(params):
496 3ecf6786 Iustin Pop
    """List the available exports on this node.
497 3ecf6786 Iustin Pop

498 3ecf6786 Iustin Pop
    Note that as opposed to export_info, which may query data about an
499 3ecf6786 Iustin Pop
    export in any path, this only queries the standard Ganeti path
500 a5ce2ea2 Michael Hanselmann
    (pathutils.EXPORT_DIR).
501 3ecf6786 Iustin Pop

502 3ecf6786 Iustin Pop
    """
503 a8083063 Iustin Pop
    return backend.ListExports()
504 a8083063 Iustin Pop
505 3ecf6786 Iustin Pop
  @staticmethod
506 3ecf6786 Iustin Pop
  def perspective_export_remove(params):
507 3ecf6786 Iustin Pop
    """Remove an export.
508 3ecf6786 Iustin Pop

509 3ecf6786 Iustin Pop
    """
510 a8083063 Iustin Pop
    export = params[0]
511 a8083063 Iustin Pop
    return backend.RemoveExport(export)
512 a8083063 Iustin Pop
513 2be7273c Apollon Oikonomopoulos
  # block device ---------------------
514 2be7273c Apollon Oikonomopoulos
  @staticmethod
515 2be7273c Apollon Oikonomopoulos
  def perspective_bdev_sizes(params):
516 2be7273c Apollon Oikonomopoulos
    """Query the list of block devices
517 2be7273c Apollon Oikonomopoulos

518 2be7273c Apollon Oikonomopoulos
    """
519 2be7273c Apollon Oikonomopoulos
    devices = params[0]
520 2be7273c Apollon Oikonomopoulos
    return backend.GetBlockDevSizes(devices)
521 2be7273c Apollon Oikonomopoulos
522 a8083063 Iustin Pop
  # volume  --------------------------
523 a8083063 Iustin Pop
524 3ecf6786 Iustin Pop
  @staticmethod
525 b2a6ccd4 Iustin Pop
  def perspective_lv_list(params):
526 3ecf6786 Iustin Pop
    """Query the list of logical volumes in a given volume group.
527 3ecf6786 Iustin Pop

528 3ecf6786 Iustin Pop
    """
529 a8083063 Iustin Pop
    vgname = params[0]
530 c26a6bd2 Iustin Pop
    return backend.GetVolumeList(vgname)
531 a8083063 Iustin Pop
532 3ecf6786 Iustin Pop
  @staticmethod
533 3ecf6786 Iustin Pop
  def perspective_vg_list(params):
534 3ecf6786 Iustin Pop
    """Query the list of volume groups.
535 3ecf6786 Iustin Pop

536 3ecf6786 Iustin Pop
    """
537 a8083063 Iustin Pop
    return backend.ListVolumeGroups()
538 a8083063 Iustin Pop
539 e337de97 Michael Hanselmann
  # Storage --------------------------
540 e337de97 Michael Hanselmann
541 e337de97 Michael Hanselmann
  @staticmethod
542 e337de97 Michael Hanselmann
  def perspective_storage_list(params):
543 e337de97 Michael Hanselmann
    """Get list of storage units.
544 e337de97 Michael Hanselmann

545 e337de97 Michael Hanselmann
    """
546 e337de97 Michael Hanselmann
    (su_name, su_args, name, fields) = params
547 c23bb217 Helga Velroyen
    return container.GetStorage(su_name, *su_args).List(name, fields)
548 e337de97 Michael Hanselmann
549 8979196a Michael Hanselmann
  @staticmethod
550 8979196a Michael Hanselmann
  def perspective_storage_modify(params):
551 8979196a Michael Hanselmann
    """Modify a storage unit.
552 8979196a Michael Hanselmann

553 8979196a Michael Hanselmann
    """
554 8979196a Michael Hanselmann
    (su_name, su_args, name, changes) = params
555 c23bb217 Helga Velroyen
    return container.GetStorage(su_name, *su_args).Modify(name, changes)
556 8979196a Michael Hanselmann
557 637b8d7e Michael Hanselmann
  @staticmethod
558 637b8d7e Michael Hanselmann
  def perspective_storage_execute(params):
559 637b8d7e Michael Hanselmann
    """Execute an operation on a storage unit.
560 637b8d7e Michael Hanselmann

561 637b8d7e Michael Hanselmann
    """
562 637b8d7e Michael Hanselmann
    (su_name, su_args, name, op) = params
563 c23bb217 Helga Velroyen
    return container.GetStorage(su_name, *su_args).Execute(name, op)
564 637b8d7e Michael Hanselmann
565 a8083063 Iustin Pop
  # bridge  --------------------------
566 a8083063 Iustin Pop
567 3ecf6786 Iustin Pop
  @staticmethod
568 3ecf6786 Iustin Pop
  def perspective_bridges_exist(params):
569 3ecf6786 Iustin Pop
    """Check if all bridges given exist on this node.
570 3ecf6786 Iustin Pop

571 3ecf6786 Iustin Pop
    """
572 a8083063 Iustin Pop
    bridges_list = params[0]
573 a8083063 Iustin Pop
    return backend.BridgesExist(bridges_list)
574 a8083063 Iustin Pop
575 a8083063 Iustin Pop
  # instance  --------------------------
576 a8083063 Iustin Pop
577 3ecf6786 Iustin Pop
  @staticmethod
578 3ecf6786 Iustin Pop
  def perspective_instance_os_add(params):
579 3ecf6786 Iustin Pop
    """Install an OS on a given instance.
580 3ecf6786 Iustin Pop

581 3ecf6786 Iustin Pop
    """
582 d15a9ad3 Guido Trotter
    inst_s = params[0]
583 319856a9 Michael Hanselmann
    inst = objects.Instance.FromDict(inst_s)
584 e557bae9 Guido Trotter
    reinstall = params[1]
585 4a0e011f Iustin Pop
    debug = params[2]
586 4a0e011f Iustin Pop
    return backend.InstanceOsAdd(inst, reinstall, debug)
587 a8083063 Iustin Pop
588 3ecf6786 Iustin Pop
  @staticmethod
589 decd5f45 Iustin Pop
  def perspective_instance_run_rename(params):
590 decd5f45 Iustin Pop
    """Runs the OS rename script for an instance.
591 decd5f45 Iustin Pop

592 decd5f45 Iustin Pop
    """
593 4a0e011f Iustin Pop
    inst_s, old_name, debug = params
594 319856a9 Michael Hanselmann
    inst = objects.Instance.FromDict(inst_s)
595 4a0e011f Iustin Pop
    return backend.RunRenameInstance(inst, old_name, debug)
596 decd5f45 Iustin Pop
597 decd5f45 Iustin Pop
  @staticmethod
598 3ecf6786 Iustin Pop
  def perspective_instance_shutdown(params):
599 3ecf6786 Iustin Pop
    """Shutdown an instance.
600 3ecf6786 Iustin Pop

601 3ecf6786 Iustin Pop
    """
602 319856a9 Michael Hanselmann
    instance = objects.Instance.FromDict(params[0])
603 6263189c Guido Trotter
    timeout = params[1]
604 1f350e0f Michele Tartara
    trail = params[2]
605 1f350e0f Michele Tartara
    _extendReasonTrail(trail, "shutdown")
606 1f350e0f Michele Tartara
    return backend.InstanceShutdown(instance, timeout, trail)
607 a8083063 Iustin Pop
608 3ecf6786 Iustin Pop
  @staticmethod
609 3ecf6786 Iustin Pop
  def perspective_instance_start(params):
610 3ecf6786 Iustin Pop
    """Start an instance.
611 3ecf6786 Iustin Pop

612 3ecf6786 Iustin Pop
    """
613 1fa6fcba Michele Tartara
    (instance_name, startup_paused, trail) = params
614 323f9095 Stephen Shirley
    instance = objects.Instance.FromDict(instance_name)
615 1fa6fcba Michele Tartara
    _extendReasonTrail(trail, "start")
616 1fa6fcba Michele Tartara
    return backend.StartInstance(instance, startup_paused, trail)
617 a8083063 Iustin Pop
618 3ecf6786 Iustin Pop
  @staticmethod
619 c5708931 Dimitris Aragiorgis
  def perspective_hotplug_device(params):
620 c5708931 Dimitris Aragiorgis
    """Hotplugs device to a running instance.
621 c5708931 Dimitris Aragiorgis

622 c5708931 Dimitris Aragiorgis
    """
623 c5708931 Dimitris Aragiorgis
    (idict, action, dev_type, ddict, extra, seq) = params
624 c5708931 Dimitris Aragiorgis
    instance = objects.Instance.FromDict(idict)
625 c5708931 Dimitris Aragiorgis
    if dev_type == constants.HOTPLUG_TARGET_DISK:
626 c5708931 Dimitris Aragiorgis
      device = objects.Disk.FromDict(ddict)
627 c5708931 Dimitris Aragiorgis
    elif dev_type == constants.HOTPLUG_TARGET_NIC:
628 c5708931 Dimitris Aragiorgis
      device = objects.NIC.FromDict(ddict)
629 c5708931 Dimitris Aragiorgis
    else:
630 c5708931 Dimitris Aragiorgis
      assert dev_type in constants.HOTPLUG_ALL_TARGETS
631 c5708931 Dimitris Aragiorgis
    return backend.HotplugDevice(instance, action, dev_type, device, extra, seq)
632 c5708931 Dimitris Aragiorgis
633 c5708931 Dimitris Aragiorgis
  @staticmethod
634 24711492 Dimitris Aragiorgis
  def perspective_hotplug_supported(params):
635 24711492 Dimitris Aragiorgis
    """Checks if hotplug is supported.
636 24711492 Dimitris Aragiorgis

637 24711492 Dimitris Aragiorgis
    """
638 24711492 Dimitris Aragiorgis
    instance = objects.Instance.FromDict(params[0])
639 24711492 Dimitris Aragiorgis
    return backend.HotplugSupported(instance)
640 24711492 Dimitris Aragiorgis
641 24711492 Dimitris Aragiorgis
  @staticmethod
642 6906a9d8 Guido Trotter
  def perspective_migration_info(params):
643 6906a9d8 Guido Trotter
    """Gather information about an instance to be migrated.
644 6906a9d8 Guido Trotter

645 6906a9d8 Guido Trotter
    """
646 6906a9d8 Guido Trotter
    instance = objects.Instance.FromDict(params[0])
647 6906a9d8 Guido Trotter
    return backend.MigrationInfo(instance)
648 6906a9d8 Guido Trotter
649 6906a9d8 Guido Trotter
  @staticmethod
650 6906a9d8 Guido Trotter
  def perspective_accept_instance(params):
651 6906a9d8 Guido Trotter
    """Prepare the node to accept an instance.
652 6906a9d8 Guido Trotter

653 6906a9d8 Guido Trotter
    """
654 6906a9d8 Guido Trotter
    instance, info, target = params
655 6906a9d8 Guido Trotter
    instance = objects.Instance.FromDict(instance)
656 6906a9d8 Guido Trotter
    return backend.AcceptInstance(instance, info, target)
657 6906a9d8 Guido Trotter
658 6906a9d8 Guido Trotter
  @staticmethod
659 6a1434d7 Andrea Spadaccini
  def perspective_instance_finalize_migration_dst(params):
660 6a1434d7 Andrea Spadaccini
    """Finalize the instance migration on the destination node.
661 6906a9d8 Guido Trotter

662 6906a9d8 Guido Trotter
    """
663 6906a9d8 Guido Trotter
    instance, info, success = params
664 6906a9d8 Guido Trotter
    instance = objects.Instance.FromDict(instance)
665 6a1434d7 Andrea Spadaccini
    return backend.FinalizeMigrationDst(instance, info, success)
666 6906a9d8 Guido Trotter
667 6906a9d8 Guido Trotter
  @staticmethod
668 2a10865c Iustin Pop
  def perspective_instance_migrate(params):
669 2a10865c Iustin Pop
    """Migrates an instance.
670 2a10865c Iustin Pop

671 2a10865c Iustin Pop
    """
672 bc0a2284 Helga Velroyen
    cluster_name, instance, target, live = params
673 9f0e6b37 Iustin Pop
    instance = objects.Instance.FromDict(instance)
674 bc0a2284 Helga Velroyen
    return backend.MigrateInstance(cluster_name, instance, target, live)
675 2a10865c Iustin Pop
676 2a10865c Iustin Pop
  @staticmethod
677 6a1434d7 Andrea Spadaccini
  def perspective_instance_finalize_migration_src(params):
678 6a1434d7 Andrea Spadaccini
    """Finalize the instance migration on the source node.
679 6a1434d7 Andrea Spadaccini

680 6a1434d7 Andrea Spadaccini
    """
681 6a1434d7 Andrea Spadaccini
    instance, success, live = params
682 6a1434d7 Andrea Spadaccini
    instance = objects.Instance.FromDict(instance)
683 6a1434d7 Andrea Spadaccini
    return backend.FinalizeMigrationSource(instance, success, live)
684 6a1434d7 Andrea Spadaccini
685 6a1434d7 Andrea Spadaccini
  @staticmethod
686 6a1434d7 Andrea Spadaccini
  def perspective_instance_get_migration_status(params):
687 6a1434d7 Andrea Spadaccini
    """Reports migration status.
688 6a1434d7 Andrea Spadaccini

689 6a1434d7 Andrea Spadaccini
    """
690 6a1434d7 Andrea Spadaccini
    instance = objects.Instance.FromDict(params[0])
691 6a1434d7 Andrea Spadaccini
    return backend.GetMigrationStatus(instance).ToDict()
692 6a1434d7 Andrea Spadaccini
693 6a1434d7 Andrea Spadaccini
  @staticmethod
694 007a2f3e Alexander Schreiber
  def perspective_instance_reboot(params):
695 007a2f3e Alexander Schreiber
    """Reboot an instance.
696 007a2f3e Alexander Schreiber

697 007a2f3e Alexander Schreiber
    """
698 007a2f3e Alexander Schreiber
    instance = objects.Instance.FromDict(params[0])
699 007a2f3e Alexander Schreiber
    reboot_type = params[1]
700 17c3f802 Guido Trotter
    shutdown_timeout = params[2]
701 55cec070 Michele Tartara
    trail = params[3]
702 55cec070 Michele Tartara
    _extendReasonTrail(trail, "reboot")
703 55cec070 Michele Tartara
    return backend.InstanceReboot(instance, reboot_type, shutdown_timeout,
704 55cec070 Michele Tartara
                                  trail)
705 007a2f3e Alexander Schreiber
706 007a2f3e Alexander Schreiber
  @staticmethod
707 ebe466d8 Guido Trotter
  def perspective_instance_balloon_memory(params):
708 ebe466d8 Guido Trotter
    """Modify instance runtime memory.
709 ebe466d8 Guido Trotter

710 ebe466d8 Guido Trotter
    """
711 ebe466d8 Guido Trotter
    instance_dict, memory = params
712 ebe466d8 Guido Trotter
    instance = objects.Instance.FromDict(instance_dict)
713 ebe466d8 Guido Trotter
    return backend.InstanceBalloonMemory(instance, memory)
714 ebe466d8 Guido Trotter
715 ebe466d8 Guido Trotter
  @staticmethod
716 3ecf6786 Iustin Pop
  def perspective_instance_info(params):
717 3ecf6786 Iustin Pop
    """Query instance information.
718 3ecf6786 Iustin Pop

719 3ecf6786 Iustin Pop
    """
720 0bbec3af Helga Velroyen
    (instance_name, hypervisor_name, hvparams) = params
721 0bbec3af Helga Velroyen
    return backend.GetInstanceInfo(instance_name, hypervisor_name, hvparams)
722 a8083063 Iustin Pop
723 3ecf6786 Iustin Pop
  @staticmethod
724 56e7640c Iustin Pop
  def perspective_instance_migratable(params):
725 56e7640c Iustin Pop
    """Query whether the specified instance can be migrated.
726 56e7640c Iustin Pop

727 56e7640c Iustin Pop
    """
728 56e7640c Iustin Pop
    instance = objects.Instance.FromDict(params[0])
729 56e7640c Iustin Pop
    return backend.GetInstanceMigratable(instance)
730 56e7640c Iustin Pop
731 56e7640c Iustin Pop
  @staticmethod
732 3ecf6786 Iustin Pop
  def perspective_all_instances_info(params):
733 3ecf6786 Iustin Pop
    """Query information about all instances.
734 3ecf6786 Iustin Pop

735 3ecf6786 Iustin Pop
    """
736 0200a1af Helga Velroyen
    (hypervisor_list, all_hvparams) = params
737 0200a1af Helga Velroyen
    return backend.GetAllInstancesInfo(hypervisor_list, all_hvparams)
738 a8083063 Iustin Pop
739 3ecf6786 Iustin Pop
  @staticmethod
740 3ecf6786 Iustin Pop
  def perspective_instance_list(params):
741 3ecf6786 Iustin Pop
    """Query the list of running instances.
742 3ecf6786 Iustin Pop

743 3ecf6786 Iustin Pop
    """
744 8ac806e6 Helga Velroyen
    (hypervisor_list, hvparams) = params
745 8ac806e6 Helga Velroyen
    return backend.GetInstanceList(hypervisor_list, hvparams)
746 a8083063 Iustin Pop
747 a8083063 Iustin Pop
  # node --------------------------
748 a8083063 Iustin Pop
749 3ecf6786 Iustin Pop
  @staticmethod
750 caad16e2 Iustin Pop
  def perspective_node_has_ip_address(params):
751 caad16e2 Iustin Pop
    """Checks if a node has the given ip address.
752 caad16e2 Iustin Pop

753 caad16e2 Iustin Pop
    """
754 8b312c1d Manuel Franceschini
    return netutils.IPAddress.Own(params[0])
755 caad16e2 Iustin Pop
756 caad16e2 Iustin Pop
  @staticmethod
757 3ecf6786 Iustin Pop
  def perspective_node_info(params):
758 3ecf6786 Iustin Pop
    """Query node information.
759 3ecf6786 Iustin Pop

760 3ecf6786 Iustin Pop
    """
761 a59c31ca Helga Velroyen
    (storage_units, hv_specs) = params
762 152759e4 Helga Velroyen
    return backend.GetNodeInfo(storage_units, hv_specs)
763 152759e4 Helga Velroyen
764 152759e4 Helga Velroyen
  @staticmethod
765 19ddc57a René Nussbaumer
  def perspective_etc_hosts_modify(params):
766 19ddc57a René Nussbaumer
    """Modify a node entry in /etc/hosts.
767 19ddc57a René Nussbaumer

768 19ddc57a René Nussbaumer
    """
769 19ddc57a René Nussbaumer
    backend.EtcHostsModify(params[0], params[1], params[2])
770 19ddc57a René Nussbaumer
771 19ddc57a René Nussbaumer
    return True
772 19ddc57a René Nussbaumer
773 19ddc57a René Nussbaumer
  @staticmethod
774 3ecf6786 Iustin Pop
  def perspective_node_verify(params):
775 3ecf6786 Iustin Pop
    """Run a verify sequence on this node.
776 3ecf6786 Iustin Pop

777 3ecf6786 Iustin Pop
    """
778 5b0dfcef Helga Velroyen
    (what, cluster_name, hvparams) = params
779 5b0dfcef Helga Velroyen
    return backend.VerifyNode(what, cluster_name, hvparams)
780 a8083063 Iustin Pop
781 14fe92c7 Bernardo Dal Seno
  @classmethod
782 14fe92c7 Bernardo Dal Seno
  def perspective_node_verify_light(cls, params):
783 14fe92c7 Bernardo Dal Seno
    """Run a light verify sequence on this node.
784 14fe92c7 Bernardo Dal Seno

785 14fe92c7 Bernardo Dal Seno
    """
786 14fe92c7 Bernardo Dal Seno
    # So far it's the same as the normal node_verify
787 14fe92c7 Bernardo Dal Seno
    return cls.perspective_node_verify(params)
788 14fe92c7 Bernardo Dal Seno
789 3ecf6786 Iustin Pop
  @staticmethod
790 fb460cf7 Andrea Spadaccini
  def perspective_node_start_master_daemons(params):
791 fb460cf7 Andrea Spadaccini
    """Start the master daemons on this node.
792 3ecf6786 Iustin Pop

793 3ecf6786 Iustin Pop
    """
794 fb460cf7 Andrea Spadaccini
    return backend.StartMasterDaemons(params[0])
795 fb460cf7 Andrea Spadaccini
796 fb460cf7 Andrea Spadaccini
  @staticmethod
797 fb460cf7 Andrea Spadaccini
  def perspective_node_activate_master_ip(params):
798 fb460cf7 Andrea Spadaccini
    """Activate the master IP on this node.
799 fb460cf7 Andrea Spadaccini

800 fb460cf7 Andrea Spadaccini
    """
801 c79198a0 Andrea Spadaccini
    master_params = objects.MasterNetworkParameters.FromDict(params[0])
802 57c7bc57 Andrea Spadaccini
    return backend.ActivateMasterIp(master_params, params[1])
803 fb460cf7 Andrea Spadaccini
804 fb460cf7 Andrea Spadaccini
  @staticmethod
805 fb460cf7 Andrea Spadaccini
  def perspective_node_deactivate_master_ip(params):
806 fb460cf7 Andrea Spadaccini
    """Deactivate the master IP on this node.
807 fb460cf7 Andrea Spadaccini

808 fb460cf7 Andrea Spadaccini
    """
809 c79198a0 Andrea Spadaccini
    master_params = objects.MasterNetworkParameters.FromDict(params[0])
810 57c7bc57 Andrea Spadaccini
    return backend.DeactivateMasterIp(master_params, params[1])
811 a8083063 Iustin Pop
812 3ecf6786 Iustin Pop
  @staticmethod
813 3ecf6786 Iustin Pop
  def perspective_node_stop_master(params):
814 7c74bbe0 Andrea Spadaccini
    """Stops master daemons on this node.
815 3ecf6786 Iustin Pop

816 3ecf6786 Iustin Pop
    """
817 fb460cf7 Andrea Spadaccini
    return backend.StopMasterDaemons()
818 a8083063 Iustin Pop
819 3ecf6786 Iustin Pop
  @staticmethod
820 5a8648eb Andrea Spadaccini
  def perspective_node_change_master_netmask(params):
821 5a8648eb Andrea Spadaccini
    """Change the master IP netmask.
822 5a8648eb Andrea Spadaccini

823 5a8648eb Andrea Spadaccini
    """
824 41e079ce Andrea Spadaccini
    return backend.ChangeMasterNetmask(params[0], params[1], params[2],
825 41e079ce Andrea Spadaccini
                                       params[3])
826 5a8648eb Andrea Spadaccini
827 5a8648eb Andrea Spadaccini
  @staticmethod
828 3ecf6786 Iustin Pop
  def perspective_node_leave_cluster(params):
829 3ecf6786 Iustin Pop
    """Cleanup after leaving a cluster.
830 3ecf6786 Iustin Pop

831 3ecf6786 Iustin Pop
    """
832 b989b9d9 Ken Wehr
    return backend.LeaveCluster(params[0])
833 a8083063 Iustin Pop
834 3ecf6786 Iustin Pop
  @staticmethod
835 3ecf6786 Iustin Pop
  def perspective_node_volumes(params):
836 3ecf6786 Iustin Pop
    """Query the list of all logical volume groups.
837 3ecf6786 Iustin Pop

838 3ecf6786 Iustin Pop
    """
839 dcb93971 Michael Hanselmann
    return backend.NodeVolumes()
840 dcb93971 Michael Hanselmann
841 56aa9fd5 Iustin Pop
  @staticmethod
842 56aa9fd5 Iustin Pop
  def perspective_node_demote_from_mc(params):
843 56aa9fd5 Iustin Pop
    """Demote a node from the master candidate role.
844 56aa9fd5 Iustin Pop

845 56aa9fd5 Iustin Pop
    """
846 56aa9fd5 Iustin Pop
    return backend.DemoteFromMC()
847 56aa9fd5 Iustin Pop
848 f5118ade Iustin Pop
  @staticmethod
849 f5118ade Iustin Pop
  def perspective_node_powercycle(params):
850 37f56360 Sebastian Gebhard
    """Tries to powercycle the node.
851 f5118ade Iustin Pop

852 f5118ade Iustin Pop
    """
853 8ef418bb Helga Velroyen
    (hypervisor_type, hvparams) = params
854 8ef418bb Helga Velroyen
    return backend.PowercycleNode(hypervisor_type, hvparams)
855 f5118ade Iustin Pop
856 90d8d4d1 Sebastian Gebhard
  @staticmethod
857 90d8d4d1 Sebastian Gebhard
  def perspective_node_configure_ovs(params):
858 90d8d4d1 Sebastian Gebhard
    """Sets up OpenvSwitch on the node.
859 90d8d4d1 Sebastian Gebhard

860 90d8d4d1 Sebastian Gebhard
    """
861 90d8d4d1 Sebastian Gebhard
    (ovs_name, ovs_link) = params
862 90d8d4d1 Sebastian Gebhard
    return backend.ConfigureOVS(ovs_name, ovs_link)
863 90d8d4d1 Sebastian Gebhard
864 a8083063 Iustin Pop
  # cluster --------------------------
865 a8083063 Iustin Pop
866 3ecf6786 Iustin Pop
  @staticmethod
867 3ecf6786 Iustin Pop
  def perspective_version(params):
868 3ecf6786 Iustin Pop
    """Query version information.
869 3ecf6786 Iustin Pop

870 3ecf6786 Iustin Pop
    """
871 c26a6bd2 Iustin Pop
    return constants.PROTOCOL_VERSION
872 a8083063 Iustin Pop
873 3ecf6786 Iustin Pop
  @staticmethod
874 3ecf6786 Iustin Pop
  def perspective_upload_file(params):
875 3ecf6786 Iustin Pop
    """Upload a file.
876 3ecf6786 Iustin Pop

877 3ecf6786 Iustin Pop
    Note that the backend implementation imposes strict rules on which
878 3ecf6786 Iustin Pop
    files are accepted.
879 3ecf6786 Iustin Pop

880 3ecf6786 Iustin Pop
    """
881 415a7304 Michael Hanselmann
    return backend.UploadFile(*(params[0]))
882 a8083063 Iustin Pop
883 4e071d3b Iustin Pop
  @staticmethod
884 4e071d3b Iustin Pop
  def perspective_master_info(params):
885 4e071d3b Iustin Pop
    """Query master information.
886 4e071d3b Iustin Pop

887 4e071d3b Iustin Pop
    """
888 4e071d3b Iustin Pop
    return backend.GetMasterInfo()
889 a8083063 Iustin Pop
890 6ddc95ec Michael Hanselmann
  @staticmethod
891 4f6014d4 René Nussbaumer
  def perspective_run_oob(params):
892 4f6014d4 René Nussbaumer
    """Runs oob on node.
893 4f6014d4 René Nussbaumer

894 4f6014d4 René Nussbaumer
    """
895 1aa88d95 René Nussbaumer
    output = backend.RunOob(params[0], params[1], params[2], params[3])
896 1aa88d95 René Nussbaumer
    if output:
897 1aa88d95 René Nussbaumer
      result = serializer.LoadJson(output)
898 1aa88d95 René Nussbaumer
    else:
899 1aa88d95 René Nussbaumer
      result = None
900 1aa88d95 René Nussbaumer
    return result
901 4f6014d4 René Nussbaumer
902 4f6014d4 René Nussbaumer
  @staticmethod
903 db2203e0 Michael Hanselmann
  def perspective_restricted_command(params):
904 db2203e0 Michael Hanselmann
    """Runs a restricted command.
905 db2203e0 Michael Hanselmann

906 db2203e0 Michael Hanselmann
    """
907 db2203e0 Michael Hanselmann
    (cmd, ) = params
908 db2203e0 Michael Hanselmann
909 42bd26e8 Michael Hanselmann
    return backend.RunRestrictedCmd(cmd)
910 db2203e0 Michael Hanselmann
911 db2203e0 Michael Hanselmann
  @staticmethod
912 6ddc95ec Michael Hanselmann
  def perspective_write_ssconf_files(params):
913 6ddc95ec Michael Hanselmann
    """Write ssconf files.
914 6ddc95ec Michael Hanselmann

915 6ddc95ec Michael Hanselmann
    """
916 03d1dba2 Michael Hanselmann
    (values,) = params
917 ee501db1 Michael Hanselmann
    return ssconf.WriteSsconfFiles(values)
918 6ddc95ec Michael Hanselmann
919 99e222b1 Michael Hanselmann
  @staticmethod
920 ec5af888 Michael Hanselmann
  def perspective_get_watcher_pause(params):
921 ec5af888 Michael Hanselmann
    """Get watcher pause end.
922 ec5af888 Michael Hanselmann

923 ec5af888 Michael Hanselmann
    """
924 ec5af888 Michael Hanselmann
    return utils.ReadWatcherPauseFile(pathutils.WATCHER_PAUSEFILE)
925 ec5af888 Michael Hanselmann
926 ec5af888 Michael Hanselmann
  @staticmethod
927 99e222b1 Michael Hanselmann
  def perspective_set_watcher_pause(params):
928 99e222b1 Michael Hanselmann
    """Set watcher pause.
929 99e222b1 Michael Hanselmann

930 99e222b1 Michael Hanselmann
    """
931 99e222b1 Michael Hanselmann
    (until, ) = params
932 99e222b1 Michael Hanselmann
    return backend.SetWatcherPause(until)
933 99e222b1 Michael Hanselmann
934 a8083063 Iustin Pop
  # os -----------------------
935 a8083063 Iustin Pop
936 3ecf6786 Iustin Pop
  @staticmethod
937 3ecf6786 Iustin Pop
  def perspective_os_diagnose(params):
938 3ecf6786 Iustin Pop
    """Query detailed information about existing OSes.
939 3ecf6786 Iustin Pop

940 3ecf6786 Iustin Pop
    """
941 255dcebd Iustin Pop
    return backend.DiagnoseOS()
942 a8083063 Iustin Pop
943 3ecf6786 Iustin Pop
  @staticmethod
944 3ecf6786 Iustin Pop
  def perspective_os_get(params):
945 3ecf6786 Iustin Pop
    """Query information about a given OS.
946 3ecf6786 Iustin Pop

947 3ecf6786 Iustin Pop
    """
948 a8083063 Iustin Pop
    name = params[0]
949 255dcebd Iustin Pop
    os_obj = backend.OSFromDisk(name)
950 c26a6bd2 Iustin Pop
    return os_obj.ToDict()
951 a8083063 Iustin Pop
952 acd9ff9e Iustin Pop
  @staticmethod
953 acd9ff9e Iustin Pop
  def perspective_os_validate(params):
954 acd9ff9e Iustin Pop
    """Run a given OS' validation routine.
955 acd9ff9e Iustin Pop

956 acd9ff9e Iustin Pop
    """
957 acd9ff9e Iustin Pop
    required, name, checks, params = params
958 acd9ff9e Iustin Pop
    return backend.ValidateOS(required, name, checks, params)
959 acd9ff9e Iustin Pop
960 b954f097 Constantinos Venetsanopoulos
  # extstorage -----------------------
961 b954f097 Constantinos Venetsanopoulos
962 b954f097 Constantinos Venetsanopoulos
  @staticmethod
963 b954f097 Constantinos Venetsanopoulos
  def perspective_extstorage_diagnose(params):
964 b954f097 Constantinos Venetsanopoulos
    """Query detailed information about existing extstorage providers.
965 b954f097 Constantinos Venetsanopoulos

966 b954f097 Constantinos Venetsanopoulos
    """
967 b954f097 Constantinos Venetsanopoulos
    return backend.DiagnoseExtStorage()
968 b954f097 Constantinos Venetsanopoulos
969 a8083063 Iustin Pop
  # hooks -----------------------
970 a8083063 Iustin Pop
971 3ecf6786 Iustin Pop
  @staticmethod
972 3ecf6786 Iustin Pop
  def perspective_hooks_runner(params):
973 3ecf6786 Iustin Pop
    """Run hook scripts.
974 3ecf6786 Iustin Pop

975 3ecf6786 Iustin Pop
    """
976 a8083063 Iustin Pop
    hpath, phase, env = params
977 a8083063 Iustin Pop
    hr = backend.HooksRunner()
978 a8083063 Iustin Pop
    return hr.RunHooks(hpath, phase, env)
979 a8083063 Iustin Pop
980 8d528b7c Iustin Pop
  # iallocator -----------------
981 8d528b7c Iustin Pop
982 8d528b7c Iustin Pop
  @staticmethod
983 8d528b7c Iustin Pop
  def perspective_iallocator_runner(params):
984 8d528b7c Iustin Pop
    """Run an iallocator script.
985 8d528b7c Iustin Pop

986 8d528b7c Iustin Pop
    """
987 8d528b7c Iustin Pop
    name, idata = params
988 8d528b7c Iustin Pop
    iar = backend.IAllocatorRunner()
989 8d528b7c Iustin Pop
    return iar.Run(name, idata)
990 8d528b7c Iustin Pop
991 06009e27 Iustin Pop
  # test -----------------------
992 06009e27 Iustin Pop
993 06009e27 Iustin Pop
  @staticmethod
994 06009e27 Iustin Pop
  def perspective_test_delay(params):
995 06009e27 Iustin Pop
    """Run test delay.
996 06009e27 Iustin Pop

997 06009e27 Iustin Pop
    """
998 06009e27 Iustin Pop
    duration = params[0]
999 c26a6bd2 Iustin Pop
    status, rval = utils.TestDelay(duration)
1000 c26a6bd2 Iustin Pop
    if not status:
1001 c26a6bd2 Iustin Pop
      raise backend.RPCFail(rval)
1002 c26a6bd2 Iustin Pop
    return rval
1003 06009e27 Iustin Pop
1004 4e071d3b Iustin Pop
  # file storage ---------------
1005 4e071d3b Iustin Pop
1006 a5d7fb43 Manuel Franceschini
  @staticmethod
1007 a5d7fb43 Manuel Franceschini
  def perspective_file_storage_dir_create(params):
1008 a5d7fb43 Manuel Franceschini
    """Create the file storage directory.
1009 a5d7fb43 Manuel Franceschini

1010 a5d7fb43 Manuel Franceschini
    """
1011 a5d7fb43 Manuel Franceschini
    file_storage_dir = params[0]
1012 a5d7fb43 Manuel Franceschini
    return backend.CreateFileStorageDir(file_storage_dir)
1013 a5d7fb43 Manuel Franceschini
1014 a5d7fb43 Manuel Franceschini
  @staticmethod
1015 a5d7fb43 Manuel Franceschini
  def perspective_file_storage_dir_remove(params):
1016 a5d7fb43 Manuel Franceschini
    """Remove the file storage directory.
1017 a5d7fb43 Manuel Franceschini

1018 a5d7fb43 Manuel Franceschini
    """
1019 a5d7fb43 Manuel Franceschini
    file_storage_dir = params[0]
1020 a5d7fb43 Manuel Franceschini
    return backend.RemoveFileStorageDir(file_storage_dir)
1021 a5d7fb43 Manuel Franceschini
1022 a5d7fb43 Manuel Franceschini
  @staticmethod
1023 a5d7fb43 Manuel Franceschini
  def perspective_file_storage_dir_rename(params):
1024 a5d7fb43 Manuel Franceschini
    """Rename the file storage directory.
1025 a5d7fb43 Manuel Franceschini

1026 a5d7fb43 Manuel Franceschini
    """
1027 a5d7fb43 Manuel Franceschini
    old_file_storage_dir = params[0]
1028 a5d7fb43 Manuel Franceschini
    new_file_storage_dir = params[1]
1029 a5d7fb43 Manuel Franceschini
    return backend.RenameFileStorageDir(old_file_storage_dir,
1030 a5d7fb43 Manuel Franceschini
                                        new_file_storage_dir)
1031 a5d7fb43 Manuel Franceschini
1032 4e071d3b Iustin Pop
  # jobs ------------------------
1033 4e071d3b Iustin Pop
1034 ca52cdeb Michael Hanselmann
  @staticmethod
1035 7f30777b Michael Hanselmann
  @_RequireJobQueueLock
1036 ca52cdeb Michael Hanselmann
  def perspective_jobqueue_update(params):
1037 ca52cdeb Michael Hanselmann
    """Update job queue.
1038 ca52cdeb Michael Hanselmann

1039 ca52cdeb Michael Hanselmann
    """
1040 ca52cdeb Michael Hanselmann
    (file_name, content) = params
1041 7f30777b Michael Hanselmann
    return backend.JobQueueUpdate(file_name, content)
1042 ca52cdeb Michael Hanselmann
1043 ca52cdeb Michael Hanselmann
  @staticmethod
1044 f1f3f45c Michael Hanselmann
  @_RequireJobQueueLock
1045 ca52cdeb Michael Hanselmann
  def perspective_jobqueue_purge(params):
1046 ca52cdeb Michael Hanselmann
    """Purge job queue.
1047 ca52cdeb Michael Hanselmann

1048 ca52cdeb Michael Hanselmann
    """
1049 ca52cdeb Michael Hanselmann
    return backend.JobQueuePurge()
1050 ca52cdeb Michael Hanselmann
1051 af5ebcb1 Michael Hanselmann
  @staticmethod
1052 af5ebcb1 Michael Hanselmann
  @_RequireJobQueueLock
1053 af5ebcb1 Michael Hanselmann
  def perspective_jobqueue_rename(params):
1054 af5ebcb1 Michael Hanselmann
    """Rename a job queue file.
1055 af5ebcb1 Michael Hanselmann

1056 af5ebcb1 Michael Hanselmann
    """
1057 dd875d32 Michael Hanselmann
    # TODO: What if a file fails to rename?
1058 fb1ffbca Michael Hanselmann
    return [backend.JobQueueRename(old, new) for old, new in params[0]]
1059 af5ebcb1 Michael Hanselmann
1060 be6c403e Michael Hanselmann
  @staticmethod
1061 be6c403e Michael Hanselmann
  @_RequireJobQueueLock
1062 be6c403e Michael Hanselmann
  def perspective_jobqueue_set_drain_flag(params):
1063 be6c403e Michael Hanselmann
    """Set job queue's drain flag.
1064 be6c403e Michael Hanselmann

1065 be6c403e Michael Hanselmann
    """
1066 be6c403e Michael Hanselmann
    (flag, ) = params
1067 be6c403e Michael Hanselmann
1068 be6c403e Michael Hanselmann
    return jstore.SetDrainFlag(flag)
1069 be6c403e Michael Hanselmann
1070 6217e295 Iustin Pop
  # hypervisor ---------------
1071 6217e295 Iustin Pop
1072 6217e295 Iustin Pop
  @staticmethod
1073 6217e295 Iustin Pop
  def perspective_hypervisor_validate_params(params):
1074 6217e295 Iustin Pop
    """Validate the hypervisor parameters.
1075 6217e295 Iustin Pop

1076 6217e295 Iustin Pop
    """
1077 6217e295 Iustin Pop
    (hvname, hvparams) = params
1078 6217e295 Iustin Pop
    return backend.ValidateHVParams(hvname, hvparams)
1079 6217e295 Iustin Pop
1080 f942a838 Michael Hanselmann
  # Crypto
1081 f942a838 Michael Hanselmann
1082 f942a838 Michael Hanselmann
  @staticmethod
1083 ef40fbfb Michael Hanselmann
  def perspective_x509_cert_create(params):
1084 f942a838 Michael Hanselmann
    """Creates a new X509 certificate for SSL/TLS.
1085 f942a838 Michael Hanselmann

1086 f942a838 Michael Hanselmann
    """
1087 f942a838 Michael Hanselmann
    (validity, ) = params
1088 f942a838 Michael Hanselmann
    return backend.CreateX509Certificate(validity)
1089 f942a838 Michael Hanselmann
1090 f942a838 Michael Hanselmann
  @staticmethod
1091 ef40fbfb Michael Hanselmann
  def perspective_x509_cert_remove(params):
1092 f942a838 Michael Hanselmann
    """Removes a X509 certificate.
1093 f942a838 Michael Hanselmann

1094 f942a838 Michael Hanselmann
    """
1095 f942a838 Michael Hanselmann
    (name, ) = params
1096 f942a838 Michael Hanselmann
    return backend.RemoveX509Certificate(name)
1097 f942a838 Michael Hanselmann
1098 1651d116 Michael Hanselmann
  # Import and export
1099 1651d116 Michael Hanselmann
1100 1651d116 Michael Hanselmann
  @staticmethod
1101 ef40fbfb Michael Hanselmann
  def perspective_import_start(params):
1102 1651d116 Michael Hanselmann
    """Starts an import daemon.
1103 1651d116 Michael Hanselmann

1104 1651d116 Michael Hanselmann
    """
1105 b8c160c1 Michael Hanselmann
    (opts_s, instance, component, (dest, dest_args)) = params
1106 eb630f50 Michael Hanselmann
1107 eb630f50 Michael Hanselmann
    opts = objects.ImportExportOptions.FromDict(opts_s)
1108 eb630f50 Michael Hanselmann
1109 eb630f50 Michael Hanselmann
    return backend.StartImportExportDaemon(constants.IEM_IMPORT, opts,
1110 1651d116 Michael Hanselmann
                                           None, None,
1111 1651d116 Michael Hanselmann
                                           objects.Instance.FromDict(instance),
1112 6613661a Iustin Pop
                                           component, dest,
1113 1651d116 Michael Hanselmann
                                           _DecodeImportExportIO(dest,
1114 1651d116 Michael Hanselmann
                                                                 dest_args))
1115 eb630f50 Michael Hanselmann
1116 1651d116 Michael Hanselmann
  @staticmethod
1117 ef40fbfb Michael Hanselmann
  def perspective_export_start(params):
1118 1651d116 Michael Hanselmann
    """Starts an export daemon.
1119 1651d116 Michael Hanselmann

1120 1651d116 Michael Hanselmann
    """
1121 b8c160c1 Michael Hanselmann
    (opts_s, host, port, instance, component, (source, source_args)) = params
1122 eb630f50 Michael Hanselmann
1123 eb630f50 Michael Hanselmann
    opts = objects.ImportExportOptions.FromDict(opts_s)
1124 eb630f50 Michael Hanselmann
1125 eb630f50 Michael Hanselmann
    return backend.StartImportExportDaemon(constants.IEM_EXPORT, opts,
1126 1651d116 Michael Hanselmann
                                           host, port,
1127 1651d116 Michael Hanselmann
                                           objects.Instance.FromDict(instance),
1128 6613661a Iustin Pop
                                           component, source,
1129 1651d116 Michael Hanselmann
                                           _DecodeImportExportIO(source,
1130 1651d116 Michael Hanselmann
                                                                 source_args))
1131 1651d116 Michael Hanselmann
1132 1651d116 Michael Hanselmann
  @staticmethod
1133 ef40fbfb Michael Hanselmann
  def perspective_impexp_status(params):
1134 1651d116 Michael Hanselmann
    """Retrieves the status of an import or export daemon.
1135 1651d116 Michael Hanselmann

1136 1651d116 Michael Hanselmann
    """
1137 1651d116 Michael Hanselmann
    return backend.GetImportExportStatus(params[0])
1138 1651d116 Michael Hanselmann
1139 1651d116 Michael Hanselmann
  @staticmethod
1140 f81c4737 Michael Hanselmann
  def perspective_impexp_abort(params):
1141 f81c4737 Michael Hanselmann
    """Aborts an import or export.
1142 f81c4737 Michael Hanselmann

1143 f81c4737 Michael Hanselmann
    """
1144 f81c4737 Michael Hanselmann
    return backend.AbortImportExport(params[0])
1145 f81c4737 Michael Hanselmann
1146 f81c4737 Michael Hanselmann
  @staticmethod
1147 ef40fbfb Michael Hanselmann
  def perspective_impexp_cleanup(params):
1148 1651d116 Michael Hanselmann
    """Cleans up after an import or export.
1149 1651d116 Michael Hanselmann

1150 1651d116 Michael Hanselmann
    """
1151 1651d116 Michael Hanselmann
    return backend.CleanupImportExport(params[0])
1152 1651d116 Michael Hanselmann
1153 a8083063 Iustin Pop
1154 f93427cd Iustin Pop
def CheckNoded(_, args):
1155 f93427cd Iustin Pop
  """Initial checks whether to run or exit with a failure.
1156 f93427cd Iustin Pop

1157 f93427cd Iustin Pop
  """
1158 f93427cd Iustin Pop
  if args: # noded doesn't take any arguments
1159 f93427cd Iustin Pop
    print >> sys.stderr, ("Usage: %s [-f] [-d] [-p port] [-b ADDRESS]" %
1160 f93427cd Iustin Pop
                          sys.argv[0])
1161 f93427cd Iustin Pop
    sys.exit(constants.EXIT_FAILURE)
1162 f01738fc Iustin Pop
  try:
1163 f01738fc Iustin Pop
    codecs.lookup("string-escape")
1164 f01738fc Iustin Pop
  except LookupError:
1165 f01738fc Iustin Pop
    print >> sys.stderr, ("Can't load the string-escape code which is part"
1166 f01738fc Iustin Pop
                          " of the Python installation. Is your installation"
1167 f01738fc Iustin Pop
                          " complete/correct? Aborting.")
1168 f01738fc Iustin Pop
    sys.exit(constants.EXIT_FAILURE)
1169 f93427cd Iustin Pop
1170 f93427cd Iustin Pop
1171 3ee53f1f Iustin Pop
def PrepNoded(options, _):
1172 3ee53f1f Iustin Pop
  """Preparation node daemon function, executed with the PID file held.
1173 3ecf6786 Iustin Pop

1174 3ecf6786 Iustin Pop
  """
1175 bebf68d3 Guido Trotter
  if options.mlock:
1176 bebf68d3 Guido Trotter
    request_executor_class = MlockallRequestExecutor
1177 4c32a8bd Luca Bigliardi
    try:
1178 4c32a8bd Luca Bigliardi
      utils.Mlockall()
1179 4c32a8bd Luca Bigliardi
    except errors.NoCtypesError:
1180 4c32a8bd Luca Bigliardi
      logging.warning("Cannot set memory lock, ctypes module not found")
1181 4c32a8bd Luca Bigliardi
      request_executor_class = http.server.HttpServerRequestExecutor
1182 bebf68d3 Guido Trotter
  else:
1183 bebf68d3 Guido Trotter
    request_executor_class = http.server.HttpServerRequestExecutor
1184 02bea2fc Luca Bigliardi
1185 04ccf5e9 Guido Trotter
  # Read SSL certificate
1186 3b1b0cb6 Guido Trotter
  if options.ssl:
1187 3b1b0cb6 Guido Trotter
    ssl_params = http.HttpSslParams(ssl_key_path=options.ssl_key,
1188 3b1b0cb6 Guido Trotter
                                    ssl_cert_path=options.ssl_cert)
1189 3b1b0cb6 Guido Trotter
  else:
1190 3b1b0cb6 Guido Trotter
    ssl_params = None
1191 7d88772a Iustin Pop
1192 81198f6e Iustin Pop
  err = _PrepareQueueLock()
1193 81198f6e Iustin Pop
  if err is not None:
1194 81198f6e Iustin Pop
    # this might be some kind of file-system/permission error; while
1195 81198f6e Iustin Pop
    # this breaks the job queue functionality, we shouldn't prevent
1196 81198f6e Iustin Pop
    # startup of the whole node daemon because of this
1197 81198f6e Iustin Pop
    logging.critical("Can't init/verify the queue, proceeding anyway: %s", err)
1198 7d88772a Iustin Pop
1199 e0003509 Michael Hanselmann
  handler = NodeRequestHandler()
1200 e0003509 Michael Hanselmann
1201 04ccf5e9 Guido Trotter
  mainloop = daemon.Mainloop()
1202 e0003509 Michael Hanselmann
  server = \
1203 e0003509 Michael Hanselmann
    http.server.HttpServer(mainloop, options.bind_address, options.port,
1204 5ae4945a Iustin Pop
                           handler, ssl_params=ssl_params, ssl_verify_peer=True,
1205 5ae4945a Iustin Pop
                           request_executor_class=request_executor_class)
1206 04ccf5e9 Guido Trotter
  server.Start()
1207 e0003509 Michael Hanselmann
1208 3ee53f1f Iustin Pop
  return (mainloop, server)
1209 3ee53f1f Iustin Pop
1210 5119f2ec Michael Hanselmann
1211 b459a848 Andrea Spadaccini
def ExecNoded(options, args, prep_data): # pylint: disable=W0613
1212 3ee53f1f Iustin Pop
  """Main node daemon function, executed with the PID file held.
1213 3ee53f1f Iustin Pop

1214 3ee53f1f Iustin Pop
  """
1215 3ee53f1f Iustin Pop
  (mainloop, server) = prep_data
1216 04ccf5e9 Guido Trotter
  try:
1217 04ccf5e9 Guido Trotter
    mainloop.Run()
1218 04ccf5e9 Guido Trotter
  finally:
1219 04ccf5e9 Guido Trotter
    server.Stop()
1220 a8083063 Iustin Pop
1221 a8083063 Iustin Pop
1222 5119f2ec Michael Hanselmann
def Main():
1223 04ccf5e9 Guido Trotter
  """Main function for the node daemon.
1224 04ccf5e9 Guido Trotter

1225 04ccf5e9 Guido Trotter
  """
1226 04ccf5e9 Guido Trotter
  parser = OptionParser(description="Ganeti node daemon",
1227 b01d9504 Michele Tartara
                        usage=("%prog [-f] [-d] [-p port] [-b ADDRESS]"
1228 b01d9504 Michele Tartara
                               " [-i INTERFACE]"),
1229 04ccf5e9 Guido Trotter
                        version="%%prog (ganeti) %s" %
1230 04ccf5e9 Guido Trotter
                        constants.RELEASE_VERSION)
1231 bebf68d3 Guido Trotter
  parser.add_option("--no-mlock", dest="mlock",
1232 bebf68d3 Guido Trotter
                    help="Do not mlock the node memory in ram",
1233 bebf68d3 Guido Trotter
                    default=True, action="store_false")
1234 bebf68d3 Guido Trotter
1235 3ee53f1f Iustin Pop
  daemon.GenericMain(constants.NODED, parser, CheckNoded, PrepNoded, ExecNoded,
1236 a5ce2ea2 Michael Hanselmann
                     default_ssl_cert=pathutils.NODED_CERT_FILE,
1237 a5ce2ea2 Michael Hanselmann
                     default_ssl_key=pathutils.NODED_CERT_FILE,
1238 565083ef Luca Bigliardi
                     console_logging=True)