stevedoreize the drivers

I don't expect these to be plugable, mostly just wrapping my head
around stevedores codebase.

Of note, because of the stevedore-ness, we _must_ install ekko to use
it. No longer will it work in the local dir, it must be installed on
the system (or in a venv)

Change-Id: I5037f6877e623614ef7ecf991b0009f49824ec0a
This commit is contained in:
SamYaple 2016-01-13 19:10:17 +00:00
parent 94bf4209b2
commit e2ee32ed82
7 changed files with 47 additions and 26 deletions

View File

View File

@ -20,10 +20,10 @@
import os import os
from struct import pack from struct import pack
from ekko.manifest import driver from ekko.manifest import drivers
class OSDKDriver(driver.ManifestDriver): class OSDKManifest(drivers.BaseManifest):
def initialize(self): def initialize(self):
with open(self.manifest_file, 'wb', 4096) as f: with open(self.manifest_file, 'wb', 4096) as f:

View File

@ -17,11 +17,11 @@ from contextlib import closing
from contextlib import contextmanager from contextlib import contextmanager
import sqlite3 import sqlite3
from ekko.manifest import driver from ekko.manifest import drivers
from ekko.manifest import structure from ekko.manifest import structure
class SQLiteDriver(driver.ManifestDriver): class SQLiteManifest(drivers.BaseManifest):
def initialize(self): def initialize(self):
with self.get_conn() as conn: with self.get_conn() as conn:

View File

@ -13,35 +13,53 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from oslo_utils import importutils import abc
import six
def load_manifest_driver(manifest_location, manifest_driver=None): @six.add_metaclass(abc.ABCMeta)
if not manifest_driver: class BaseManifest(object):
manifest_driver = 'sqlite.SQLiteDriver' """Base class for Manifest drivers
return importutils.import_object_ns('ekko.manifest',
manifest_driver,
manifest_location)
class ManifestDriver(object):
"""Base class for manifest drivers
:params manifest_file: File location for manifest
""" """
def __init__(self, manifest_file): def __init__(self, manifest_file):
self.conn = None self.conn = None
self.manifest_file = manifest_file self.manifest_file = manifest_file
@abc.abstractmethod
def get_metadata(self): def get_metadata(self):
"""Get segments from manifest
:returns: An object of class manifest.structure.Metadata
"""
raise NotImplementedError() raise NotImplementedError()
@abc.abstractmethod
def get_segments(self): def get_segments(self):
"""Get segments from manifest
:returns: A generator of with objects of class
manifest.structure.Segment
"""
raise NotImplementedError() raise NotImplementedError()
@abc.abstractmethod
def put_metadata(self, metadata): def put_metadata(self, metadata):
"""Puts given metadata into manifest
:params metadata: An object of class manifest.structure.Metadata
"""
raise NotImplementedError() raise NotImplementedError()
@abc.abstractmethod
def put_segments(self, segments, metadata): def put_segments(self, segments, metadata):
"""Puts given segment information into manifest
:params segments: An interable with objects of class
manifest.structure.Segment
:params metadata: An object of class manifest.structure.Metadata
"""
raise NotImplementedError() raise NotImplementedError()

View File

@ -5,3 +5,4 @@
pbr>=1.6 pbr>=1.6
six>=1.9.0 six>=1.9.0
oslo.utils>=3.2.0 # Apache-2.0 oslo.utils>=3.2.0 # Apache-2.0
stevedore>=1.5.0 # Apache-2.0

View File

@ -19,6 +19,11 @@ classifier =
Programming Language :: Python :: 3.3 Programming Language :: Python :: 3.3
Programming Language :: Python :: 3.4 Programming Language :: Python :: 3.4
[entry_points]
ekko.manifest.drivers =
osdk = ekko.manifest._drivers.osdk:OSDKManifest
sqlite = ekko.manifest._drivers.sqlite:SQLiteManifest
[files] [files]
packages = packages =
ekko ekko

View File

@ -21,16 +21,9 @@ import argparse
import os import os
import sys import sys
sys.path.insert(0, '/root/ekko/')
from ekko.manifest import driver as manifest_driver
from ekko.manifest import structure as manifest_structure from ekko.manifest import structure as manifest_structure
from six.moves import range from six.moves import range
from stevedore import driver
DRIVERS = {
'osdk': 'osdk.OSDKDriver',
'sqlite': 'sqlite.SQLiteDriver'
}
def parse_args(): def parse_args():
@ -68,8 +61,12 @@ def main():
print('manifest exists; exiting') print('manifest exists; exiting')
return return
manifest = manifest_driver.load_manifest_driver(args.manifest, manifest = driver.DriverManager(
DRIVERS[args.driver]) namespace='ekko.manifest.drivers',
name=args.driver,
invoke_on_load=True,
invoke_args=[args.manifest]
).driver
size_of_disk = args.backupsize * 1024**3 # Convert GB to B size_of_disk = args.backupsize * 1024**3 # Convert GB to B
num_of_sectors = int(size_of_disk / 512) num_of_sectors = int(size_of_disk / 512)