Statistics
| Branch: | Tag: | Revision:

root / lib / hypervisor / hv_fake.py @ 4c4b5058

History | View | Annotate | Download (5.6 kB)

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

24 65a6f9b7 Michael Hanselmann
"""
25 65a6f9b7 Michael Hanselmann
26 65a6f9b7 Michael Hanselmann
import os
27 65a6f9b7 Michael Hanselmann
import os.path
28 65a6f9b7 Michael Hanselmann
29 65a6f9b7 Michael Hanselmann
from ganeti import utils
30 65a6f9b7 Michael Hanselmann
from ganeti import constants
31 65a6f9b7 Michael Hanselmann
from ganeti import errors
32 a2d32034 Michael Hanselmann
from ganeti.hypervisor import hv_base
33 65a6f9b7 Michael Hanselmann
34 65a6f9b7 Michael Hanselmann
35 a2d32034 Michael Hanselmann
class FakeHypervisor(hv_base.BaseHypervisor):
36 65a6f9b7 Michael Hanselmann
  """Fake hypervisor interface.
37 65a6f9b7 Michael Hanselmann

38 65a6f9b7 Michael Hanselmann
  This can be used for testing the ganeti code without having to have
39 65a6f9b7 Michael Hanselmann
  a real virtualisation software installed.
40 65a6f9b7 Michael Hanselmann

41 65a6f9b7 Michael Hanselmann
  """
42 65a6f9b7 Michael Hanselmann
  _ROOT_DIR = constants.RUN_DIR + "/ganeti-fake-hypervisor"
43 65a6f9b7 Michael Hanselmann
44 65a6f9b7 Michael Hanselmann
  def __init__(self):
45 a2d32034 Michael Hanselmann
    hv_base.BaseHypervisor.__init__(self)
46 65a6f9b7 Michael Hanselmann
    if not os.path.exists(self._ROOT_DIR):
47 65a6f9b7 Michael Hanselmann
      os.mkdir(self._ROOT_DIR)
48 65a6f9b7 Michael Hanselmann
49 65a6f9b7 Michael Hanselmann
  def ListInstances(self):
50 65a6f9b7 Michael Hanselmann
    """Get the list of running instances.
51 65a6f9b7 Michael Hanselmann

52 65a6f9b7 Michael Hanselmann
    """
53 65a6f9b7 Michael Hanselmann
    return os.listdir(self._ROOT_DIR)
54 65a6f9b7 Michael Hanselmann
55 65a6f9b7 Michael Hanselmann
  def GetInstanceInfo(self, instance_name):
56 65a6f9b7 Michael Hanselmann
    """Get instance properties.
57 65a6f9b7 Michael Hanselmann

58 c41eea6e Iustin Pop
    @param instance_name: the instance name
59 c41eea6e Iustin Pop

60 c41eea6e Iustin Pop
    @return: tuple of (name, id, memory, vcpus, stat, times)
61 65a6f9b7 Michael Hanselmann

62 65a6f9b7 Michael Hanselmann
    """
63 65a6f9b7 Michael Hanselmann
    file_name = "%s/%s" % (self._ROOT_DIR, instance_name)
64 65a6f9b7 Michael Hanselmann
    if not os.path.exists(file_name):
65 65a6f9b7 Michael Hanselmann
      return None
66 65a6f9b7 Michael Hanselmann
    try:
67 bfc30ec0 Iustin Pop
      fh = open(file_name, "r")
68 65a6f9b7 Michael Hanselmann
      try:
69 65a6f9b7 Michael Hanselmann
        inst_id = fh.readline().strip()
70 bfc30ec0 Iustin Pop
        memory = utils.TryConvert(int, fh.readline().strip())
71 4c4b5058 Iustin Pop
        vcpus = utils.TryConvert(int, fh.readline().strip())
72 65a6f9b7 Michael Hanselmann
        stat = "---b-"
73 65a6f9b7 Michael Hanselmann
        times = "0"
74 65a6f9b7 Michael Hanselmann
        return (instance_name, inst_id, memory, vcpus, stat, times)
75 65a6f9b7 Michael Hanselmann
      finally:
76 65a6f9b7 Michael Hanselmann
        fh.close()
77 65a6f9b7 Michael Hanselmann
    except IOError, err:
78 65a6f9b7 Michael Hanselmann
      raise errors.HypervisorError("Failed to list instance %s: %s" %
79 65a6f9b7 Michael Hanselmann
                                   (instance_name, err))
80 65a6f9b7 Michael Hanselmann
81 65a6f9b7 Michael Hanselmann
  def GetAllInstancesInfo(self):
82 65a6f9b7 Michael Hanselmann
    """Get properties of all instances.
83 65a6f9b7 Michael Hanselmann

84 c41eea6e Iustin Pop
    @return: list of tuples (name, id, memory, vcpus, stat, times)
85 c41eea6e Iustin Pop

86 65a6f9b7 Michael Hanselmann
    """
87 65a6f9b7 Michael Hanselmann
    data = []
88 65a6f9b7 Michael Hanselmann
    for file_name in os.listdir(self._ROOT_DIR):
89 65a6f9b7 Michael Hanselmann
      try:
90 bfc30ec0 Iustin Pop
        fh = open(self._ROOT_DIR+"/"+file_name, "r")
91 65a6f9b7 Michael Hanselmann
        inst_id = "-1"
92 bfc30ec0 Iustin Pop
        memory = 0
93 bfc30ec0 Iustin Pop
        vcpus = 1
94 65a6f9b7 Michael Hanselmann
        stat = "-----"
95 65a6f9b7 Michael Hanselmann
        times = "-1"
96 65a6f9b7 Michael Hanselmann
        try:
97 65a6f9b7 Michael Hanselmann
          inst_id = fh.readline().strip()
98 bfc30ec0 Iustin Pop
          memory = utils.TryConvert(int, fh.readline().strip())
99 bfc30ec0 Iustin Pop
          vcpus = utils.TryConvert(int, fh.readline().strip())
100 65a6f9b7 Michael Hanselmann
          stat = "---b-"
101 65a6f9b7 Michael Hanselmann
          times = "0"
102 65a6f9b7 Michael Hanselmann
        finally:
103 65a6f9b7 Michael Hanselmann
          fh.close()
104 65a6f9b7 Michael Hanselmann
        data.append((file_name, inst_id, memory, vcpus, stat, times))
105 65a6f9b7 Michael Hanselmann
      except IOError, err:
106 65a6f9b7 Michael Hanselmann
        raise errors.HypervisorError("Failed to list instances: %s" % err)
107 65a6f9b7 Michael Hanselmann
    return data
108 65a6f9b7 Michael Hanselmann
109 07813a9e Iustin Pop
  def StartInstance(self, instance, block_devices):
110 65a6f9b7 Michael Hanselmann
    """Start an instance.
111 65a6f9b7 Michael Hanselmann

112 65a6f9b7 Michael Hanselmann
    For the fake hypervisor, it just creates a file in the base dir,
113 65a6f9b7 Michael Hanselmann
    creating an exception if it already exists. We don't actually
114 65a6f9b7 Michael Hanselmann
    handle race conditions properly, since these are *FAKE* instances.
115 65a6f9b7 Michael Hanselmann

116 65a6f9b7 Michael Hanselmann
    """
117 65a6f9b7 Michael Hanselmann
    file_name = self._ROOT_DIR + "/%s" % instance.name
118 65a6f9b7 Michael Hanselmann
    if os.path.exists(file_name):
119 65a6f9b7 Michael Hanselmann
      raise errors.HypervisorError("Failed to start instance %s: %s" %
120 65a6f9b7 Michael Hanselmann
                                   (instance.name, "already running"))
121 65a6f9b7 Michael Hanselmann
    try:
122 65a6f9b7 Michael Hanselmann
      fh = file(file_name, "w")
123 65a6f9b7 Michael Hanselmann
      try:
124 8b3fd458 Iustin Pop
        fh.write("0\n%d\n%d\n" %
125 8b3fd458 Iustin Pop
                 (instance.beparams[constants.BE_MEMORY],
126 8b3fd458 Iustin Pop
                  instance.beparams[constants.BE_VCPUS]))
127 65a6f9b7 Michael Hanselmann
      finally:
128 65a6f9b7 Michael Hanselmann
        fh.close()
129 65a6f9b7 Michael Hanselmann
    except IOError, err:
130 65a6f9b7 Michael Hanselmann
      raise errors.HypervisorError("Failed to start instance %s: %s" %
131 65a6f9b7 Michael Hanselmann
                                   (instance.name, err))
132 65a6f9b7 Michael Hanselmann
133 65a6f9b7 Michael Hanselmann
  def StopInstance(self, instance, force=False):
134 65a6f9b7 Michael Hanselmann
    """Stop an instance.
135 65a6f9b7 Michael Hanselmann

136 65a6f9b7 Michael Hanselmann
    For the fake hypervisor, this just removes the file in the base
137 65a6f9b7 Michael Hanselmann
    dir, if it exist, otherwise we raise an exception.
138 65a6f9b7 Michael Hanselmann

139 65a6f9b7 Michael Hanselmann
    """
140 65a6f9b7 Michael Hanselmann
    file_name = self._ROOT_DIR + "/%s" % instance.name
141 65a6f9b7 Michael Hanselmann
    if not os.path.exists(file_name):
142 65a6f9b7 Michael Hanselmann
      raise errors.HypervisorError("Failed to stop instance %s: %s" %
143 65a6f9b7 Michael Hanselmann
                                   (instance.name, "not running"))
144 65a6f9b7 Michael Hanselmann
    utils.RemoveFile(file_name)
145 65a6f9b7 Michael Hanselmann
146 65a6f9b7 Michael Hanselmann
  def RebootInstance(self, instance):
147 65a6f9b7 Michael Hanselmann
    """Reboot an instance.
148 65a6f9b7 Michael Hanselmann

149 65a6f9b7 Michael Hanselmann
    For the fake hypervisor, this does nothing.
150 65a6f9b7 Michael Hanselmann

151 65a6f9b7 Michael Hanselmann
    """
152 65a6f9b7 Michael Hanselmann
    return
153 65a6f9b7 Michael Hanselmann
154 65a6f9b7 Michael Hanselmann
  def GetNodeInfo(self):
155 65a6f9b7 Michael Hanselmann
    """Return information about the node.
156 65a6f9b7 Michael Hanselmann

157 572e52bf Iustin Pop
    This is just a wrapper over the base GetLinuxNodeInfo method.
158 572e52bf Iustin Pop

159 c41eea6e Iustin Pop
    @return: a dict with the following keys (values in MiB):
160 c41eea6e Iustin Pop
          - memory_total: the total memory size on the node
161 c41eea6e Iustin Pop
          - memory_free: the available memory on the node for instances
162 c41eea6e Iustin Pop
          - memory_dom0: the memory used by the node itself, if available
163 65a6f9b7 Michael Hanselmann

164 65a6f9b7 Michael Hanselmann
    """
165 572e52bf Iustin Pop
    result = self.GetLinuxNodeInfo()
166 bfc30ec0 Iustin Pop
    # substract running instances
167 bfc30ec0 Iustin Pop
    all_instances = self.GetAllInstancesInfo()
168 bfc30ec0 Iustin Pop
    result['memory_free'] -= min(result['memory_free'],
169 bfc30ec0 Iustin Pop
                                 sum([row[2] for row in all_instances]))
170 65a6f9b7 Michael Hanselmann
    return result
171 65a6f9b7 Michael Hanselmann
172 637ce7f9 Guido Trotter
  @classmethod
173 5431b2e4 Guido Trotter
  def GetShellCommandForConsole(cls, instance, hvparams, beparams):
174 65a6f9b7 Michael Hanselmann
    """Return a command for connecting to the console of an instance.
175 65a6f9b7 Michael Hanselmann

176 65a6f9b7 Michael Hanselmann
    """
177 65a6f9b7 Michael Hanselmann
    return "echo Console not available for fake hypervisor"
178 65a6f9b7 Michael Hanselmann
179 65a6f9b7 Michael Hanselmann
  def Verify(self):
180 65a6f9b7 Michael Hanselmann
    """Verify the hypervisor.
181 65a6f9b7 Michael Hanselmann

182 65a6f9b7 Michael Hanselmann
    For the fake hypervisor, it just checks the existence of the base
183 65a6f9b7 Michael Hanselmann
    dir.
184 65a6f9b7 Michael Hanselmann

185 65a6f9b7 Michael Hanselmann
    """
186 65a6f9b7 Michael Hanselmann
    if not os.path.exists(self._ROOT_DIR):
187 65a6f9b7 Michael Hanselmann
      return "The required directory '%s' does not exist." % self._ROOT_DIR