~0x44/nova/extdoc

« back to all changes in this revision

Viewing changes to nova/fakevirt.py

  • Committer: Jesse Andrews
  • Date: 2010-05-28 06:05:26 UTC
  • Revision ID: git-v1:bf6e6e718cdc7488e2da87b21e258ccc065fe499
initial commit

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# vim: tabstop=4 shiftwidth=4 softtabstop=4
 
2
# Copyright [2010] [Anso Labs, LLC]
 
3
#
 
4
#    Licensed under the Apache License, Version 2.0 (the "License");
 
5
#    you may not use this file except in compliance with the License.
 
6
#    You may obtain a copy of the License at
 
7
#
 
8
#        http://www.apache.org/licenses/LICENSE-2.0
 
9
#
 
10
#    Unless required by applicable law or agreed to in writing, software
 
11
#    distributed under the License is distributed on an "AS IS" BASIS,
 
12
#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
13
#    See the License for the specific language governing permissions and
 
14
#    limitations under the License.
 
15
 
 
16
"""
 
17
A fake (in-memory) hypervisor+api. Allows nova testing w/o KVM and libvirt.
 
18
"""
 
19
 
 
20
import StringIO
 
21
from xml.etree import ElementTree
 
22
 
 
23
 
 
24
class FakeVirtConnection(object):
 
25
    # FIXME: networkCreateXML, listNetworks don't do anything since
 
26
    # they aren't exercised in tests yet
 
27
 
 
28
    def __init__(self):
 
29
        self.next_index = 0
 
30
        self.instances = {}
 
31
 
 
32
    @classmethod
 
33
    def instance(cls):
 
34
        if not hasattr(cls, '_instance'):
 
35
            cls._instance = cls()
 
36
        return cls._instance
 
37
 
 
38
    def lookupByID(self, i):
 
39
        return self.instances[str(i)]
 
40
 
 
41
    def listDomainsID(self):
 
42
        return self.instances.keys()
 
43
 
 
44
    def listNetworks(self):
 
45
        return []
 
46
 
 
47
    def lookupByName(self, instance_id):
 
48
        for x in self.instances.values():
 
49
            if x.name() == instance_id:
 
50
                return x
 
51
        raise Exception('no instance found for instance_id: %s' % instance_id)
 
52
 
 
53
    def networkCreateXML(self, xml):
 
54
        pass
 
55
 
 
56
    def createXML(self, xml, flags):
 
57
        # parse the xml :(
 
58
        xml_stringio = StringIO.StringIO(xml)
 
59
 
 
60
        my_xml = ElementTree.parse(xml_stringio)
 
61
        name = my_xml.find('name').text
 
62
 
 
63
        fake_instance = FakeVirtInstance(conn=self,
 
64
                                         index=str(self.next_index),
 
65
                                         name=name,
 
66
                                         xml=my_xml)
 
67
        self.instances[str(self.next_index)] = fake_instance
 
68
        self.next_index += 1
 
69
 
 
70
    def _removeInstance(self, i):
 
71
        self.instances.pop(str(i))
 
72
 
 
73
 
 
74
class FakeVirtInstance(object):
 
75
    NOSTATE = 0x00
 
76
    RUNNING = 0x01
 
77
    BLOCKED = 0x02
 
78
    PAUSED = 0x03
 
79
    SHUTDOWN = 0x04
 
80
    SHUTOFF = 0x05
 
81
    CRASHED = 0x06
 
82
 
 
83
    def __init__(self, conn, index, name, xml):
 
84
        self._conn = conn
 
85
        self._destroyed = False
 
86
        self._name = name
 
87
        self._index = index
 
88
        self._state = self.RUNNING
 
89
 
 
90
    def name(self):
 
91
        return self._name
 
92
 
 
93
    def destroy(self):
 
94
        if self._state == self.SHUTOFF:
 
95
            raise Exception('instance already destroyed: %s' % self.name())
 
96
        self._state = self.SHUTDOWN
 
97
        self._conn._removeInstance(self._index)
 
98
 
 
99
    def info(self):
 
100
        return [self._state, 0, 2, 0, 0]
 
101
 
 
102
    def XMLDesc(self, flags):
 
103
        return open('fakevirtinstance.xml', 'r').read()
 
104
 
 
105
    def blockStats(self, disk):
 
106
        return [0L, 0L, 0L, 0L, null]
 
107
 
 
108
    def interfaceStats(self, iface):
 
109
        return [0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L]