nova/nova/virt/image/model.py

132 lines
3.5 KiB
Python

#
# Copyright (C) 2014 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.
#
from oslo_utils import strutils
from nova import exception
FORMAT_RAW = "raw"
FORMAT_QCOW2 = "qcow2"
FORMAT_PLOOP = "ploop"
ALL_FORMATS = [
FORMAT_RAW,
FORMAT_QCOW2,
FORMAT_PLOOP,
]
class Image(object):
"""Base class for all image types.
All image types have a format, though for many of
them only a subset of formats will commonly be
used. For example, block devices are almost
always going to be FORMAT_RAW. Though it is in
fact possible from a technical POV to store a
qcow2 data inside a block device, Nova does not
(at this time) make use of such possibilities.
"""
def __init__(self, format):
"""Create a new abstract image
:param format: one of the format constants
"""
super(Image, self).__init__()
self.format = format
if format not in ALL_FORMATS:
raise exception.InvalidImageFormat(format=format)
def __repr__(self):
msg = "<" + self.__class__.__name__ + ":" + str(self.__dict__) + ">"
return strutils.mask_password(msg)
def __eq__(self, other):
return ((self.__class__ == other.__class__) and
(self.__dict__ == other.__dict__))
def __hash__(self):
return hash(str(self.__dict__))
class LocalImage(Image):
"""Class for images that are paths within the
local filesystem
"""
def __init__(self, path, format):
"""Create a new local image object
:param path: qualified filename of the image
:param format: one of the format constants
"""
super(LocalImage, self).__init__(format)
self.path = path
class LocalFileImage(LocalImage):
"""Class for images that are files on a locally
accessible filesystem
"""
def __init__(self, path, format):
"""Create a new local file object
:param path: qualified filename of the image
:param format: one of the format constants
"""
super(LocalFileImage, self).__init__(path, format)
class LocalBlockImage(LocalImage):
"""Class for images that are block devices on
the local host
"""
def __init__(self, path):
"""Create a new local file object
:param path: qualified filename of the image
"""
super(LocalBlockImage, self).__init__(path, FORMAT_RAW)
class RBDImage(Image):
"""Class for images that are volumes on a remote
RBD server
"""
def __init__(self, name, pool, user, password, servers):
"""Create a new RBD image object
:param name: name of the image relative to the pool
:param pool: name of the pool holding the image
:param user: username to authenticate as
:param password: credentials for authenticating with
:param servers: list of hostnames for the server
"""
super(RBDImage, self).__init__(FORMAT_RAW)
self.name = name
self.pool = pool
self.user = user
self.password = password
self.servers = servers