nova/nova/tests/fakeguestfs.py
Pádraig Brady 2ee83a493a improve libguestfs exception handling
* nova/virt/disk/vfs/guestfs.py (teardown): Handle specific
exceptions when tearing down so that (future) nova bugs
aren't masked.  Also handle AttributeError so that the
relatively new handle() and close() don't cause erroneous
debug logs on older versions of libguestfs.
(has_file): remove the last use of generic exception
catching and use the more specific RuntimeError.

Change-Id: Ia7345675d75c1c6727e9254791d44475c0ed9295
2013-01-03 18:12:26 +00:00

141 lines
4.0 KiB
Python

# vim: tabstop=4 shiftwidth=4 softtabstop=4
#
# Copyright 2012 Red Hat, Inc
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
class GuestFS(object):
def __init__(self):
self.drives = []
self.running = False
self.closed = False
self.mounts = []
self.files = {}
self.auginit = False
def launch(self):
self.running = True
def shutdown(self):
self.running = False
self.mounts = []
self.drives = []
def close(self):
self.closed = True
def add_drive_opts(self, file, *args, **kwargs):
self.drives.append((file, kwargs['format']))
def inspect_os(self):
return ["/dev/guestvgf/lv_root"]
def inspect_get_mountpoints(self, dev):
return [["/", "/dev/mapper/guestvgf-lv_root"],
["/boot", "/dev/vda1"]]
def mount_options(self, options, device, mntpoint):
self.mounts.append((options, device, mntpoint))
def mkdir_p(self, path):
if not path in self.files:
self.files[path] = {
"isdir": True,
"gid": 100,
"uid": 100,
"mode": 0700
}
def read_file(self, path):
if not path in self.files:
self.files[path] = {
"isdir": False,
"content": "Hello World",
"gid": 100,
"uid": 100,
"mode": 0700
}
return self.files[path]["content"]
def write(self, path, content):
if not path in self.files:
self.files[path] = {
"isdir": False,
"content": "Hello World",
"gid": 100,
"uid": 100,
"mode": 0700
}
self.files[path]["content"] = content
def write_append(self, path, content):
if not path in self.files:
self.files[path] = {
"isdir": False,
"content": "Hello World",
"gid": 100,
"uid": 100,
"mode": 0700
}
self.files[path]["content"] = self.files[path]["content"] + content
def stat(self, path):
if not path in self.files:
raise RuntimeError("No such file: " + path)
return self.files[path]["mode"]
def chown(self, uid, gid, path):
if not path in self.files:
raise RuntimeError("No such file: " + path)
if uid != -1:
self.files[path]["uid"] = uid
if gid != -1:
self.files[path]["gid"] = gid
def chmod(self, mode, path):
if not path in self.files:
raise RuntimeError("No such file: " + path)
self.files[path]["mode"] = mode
def aug_init(self, root, flags):
self.auginit = True
def aug_close(self):
self.auginit = False
def aug_get(self, cfgpath):
if not self.auginit:
raise RuntimeError("Augeus not initialized")
if cfgpath == "/files/etc/passwd/root/uid":
return 0
elif cfgpath == "/files/etc/passwd/fred/uid":
return 105
elif cfgpath == "/files/etc/passwd/joe/uid":
return 110
elif cfgpath == "/files/etc/group/root/gid":
return 0
elif cfgpath == "/files/etc/group/users/gid":
return 500
elif cfgpath == "/files/etc/group/admins/gid":
return 600
raise RuntimeError("Unknown path %s", cfgpath)