From e2ee32ed82f8b801b9ea4019f1e06313523c3e61 Mon Sep 17 00:00:00 2001 From: SamYaple Date: Wed, 13 Jan 2016 19:10:17 +0000 Subject: [PATCH] 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 --- ekko/manifest/_drivers/__init__.py | 0 ekko/manifest/{ => _drivers}/osdk.py | 4 +-- ekko/manifest/{ => _drivers}/sqlite.py | 4 +-- ekko/manifest/{driver.py => drivers.py} | 42 ++++++++++++++++++------- requirements.txt | 1 + setup.cfg | 5 +++ tools/generate_manifest.py | 17 +++++----- 7 files changed, 47 insertions(+), 26 deletions(-) create mode 100644 ekko/manifest/_drivers/__init__.py rename ekko/manifest/{ => _drivers}/osdk.py (96%) rename ekko/manifest/{ => _drivers}/sqlite.py (98%) rename ekko/manifest/{driver.py => drivers.py} (53%) diff --git a/ekko/manifest/_drivers/__init__.py b/ekko/manifest/_drivers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ekko/manifest/osdk.py b/ekko/manifest/_drivers/osdk.py similarity index 96% rename from ekko/manifest/osdk.py rename to ekko/manifest/_drivers/osdk.py index 98021cb..d2af6ad 100644 --- a/ekko/manifest/osdk.py +++ b/ekko/manifest/_drivers/osdk.py @@ -20,10 +20,10 @@ import os 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): with open(self.manifest_file, 'wb', 4096) as f: diff --git a/ekko/manifest/sqlite.py b/ekko/manifest/_drivers/sqlite.py similarity index 98% rename from ekko/manifest/sqlite.py rename to ekko/manifest/_drivers/sqlite.py index 6f42265..80530ef 100644 --- a/ekko/manifest/sqlite.py +++ b/ekko/manifest/_drivers/sqlite.py @@ -17,11 +17,11 @@ from contextlib import closing from contextlib import contextmanager import sqlite3 -from ekko.manifest import driver +from ekko.manifest import drivers from ekko.manifest import structure -class SQLiteDriver(driver.ManifestDriver): +class SQLiteManifest(drivers.BaseManifest): def initialize(self): with self.get_conn() as conn: diff --git a/ekko/manifest/driver.py b/ekko/manifest/drivers.py similarity index 53% rename from ekko/manifest/driver.py rename to ekko/manifest/drivers.py index c7e66ba..28a1e35 100644 --- a/ekko/manifest/driver.py +++ b/ekko/manifest/drivers.py @@ -13,35 +13,53 @@ # See the License for the specific language governing permissions and # limitations under the License. -from oslo_utils import importutils +import abc + +import six -def load_manifest_driver(manifest_location, manifest_driver=None): - if not manifest_driver: - manifest_driver = 'sqlite.SQLiteDriver' - - return importutils.import_object_ns('ekko.manifest', - manifest_driver, - manifest_location) - - -class ManifestDriver(object): - """Base class for manifest drivers +@six.add_metaclass(abc.ABCMeta) +class BaseManifest(object): + """Base class for Manifest drivers + :params manifest_file: File location for manifest """ def __init__(self, manifest_file): self.conn = None self.manifest_file = manifest_file + @abc.abstractmethod def get_metadata(self): + """Get segments from manifest + + :returns: An object of class manifest.structure.Metadata + """ raise NotImplementedError() + @abc.abstractmethod def get_segments(self): + """Get segments from manifest + + :returns: A generator of with objects of class + manifest.structure.Segment + """ raise NotImplementedError() + @abc.abstractmethod def put_metadata(self, metadata): + """Puts given metadata into manifest + + :params metadata: An object of class manifest.structure.Metadata + """ raise NotImplementedError() + @abc.abstractmethod 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() diff --git a/requirements.txt b/requirements.txt index 99dc27b..d41a7d7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,3 +5,4 @@ pbr>=1.6 six>=1.9.0 oslo.utils>=3.2.0 # Apache-2.0 +stevedore>=1.5.0 # Apache-2.0 diff --git a/setup.cfg b/setup.cfg index 2c84fee..9a2e59e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -19,6 +19,11 @@ classifier = Programming Language :: Python :: 3.3 Programming Language :: Python :: 3.4 +[entry_points] +ekko.manifest.drivers = + osdk = ekko.manifest._drivers.osdk:OSDKManifest + sqlite = ekko.manifest._drivers.sqlite:SQLiteManifest + [files] packages = ekko diff --git a/tools/generate_manifest.py b/tools/generate_manifest.py index cacb2c3..e949f1a 100755 --- a/tools/generate_manifest.py +++ b/tools/generate_manifest.py @@ -21,16 +21,9 @@ import argparse import os 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 six.moves import range - - -DRIVERS = { - 'osdk': 'osdk.OSDKDriver', - 'sqlite': 'sqlite.SQLiteDriver' -} +from stevedore import driver def parse_args(): @@ -68,8 +61,12 @@ def main(): print('manifest exists; exiting') return - manifest = manifest_driver.load_manifest_driver(args.manifest, - DRIVERS[args.driver]) + manifest = driver.DriverManager( + 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 num_of_sectors = int(size_of_disk / 512)