ARIA-42-Generic-ctx-serialization-mechanism
Project: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/commit/1498ad39 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/tree/1498ad39 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/diff/1498ad39 Branch: refs/heads/ARIA-79-concurrent-storage-modifications Commit: 1498ad397bcbed5a69c01f6d512a251e375792c7 Parents: d35d09a Author: mxmrlv <mxm...@gmail.com> Authored: Wed Feb 1 16:16:01 2017 +0200 Committer: mxmrlv <mxm...@gmail.com> Committed: Thu Feb 9 11:00:23 2017 +0200 ---------------------------------------------------------------------- aria/__init__.py | 25 +++--- aria/orchestrator/context/operation.py | 27 ++++++ aria/orchestrator/context/serialization.py | 95 -------------------- aria/orchestrator/runner.py | 70 ++++----------- aria/orchestrator/workflows/executor/process.py | 11 +-- aria/storage/api.py | 3 +- aria/storage/core.py | 55 ++++++++++-- aria/storage/sql_mapi.py | 35 +++++++- setup.py | 2 +- tests/mock/context.py | 32 ++++--- tests/orchestrator/context/test_operation.py | 7 +- .../context/test_resource_render.py | 3 +- tests/orchestrator/context/test_serialize.py | 19 ++-- tests/orchestrator/context/test_toolbelt.py | 2 +- tests/orchestrator/context/test_workflow.py | 6 +- .../orchestrator/execution_plugin/test_local.py | 4 +- tests/orchestrator/execution_plugin/test_ssh.py | 4 +- tests/orchestrator/workflows/api/test_task.py | 4 +- .../workflows/builtin/test_execute_operation.py | 2 +- .../orchestrator/workflows/builtin/test_heal.py | 2 +- .../workflows/builtin/test_install.py | 2 +- .../workflows/builtin/test_uninstall.py | 2 +- .../orchestrator/workflows/core/test_engine.py | 2 +- tests/orchestrator/workflows/core/test_task.py | 2 +- .../test_task_graph_into_exececution_graph.py | 4 +- .../workflows/executor/test_executor.py | 9 +- .../workflows/executor/test_process_executor.py | 26 ++++-- .../executor/test_process_executor_extension.py | 2 +- .../test_process_executor_tracked_changes.py | 2 +- tests/storage/__init__.py | 41 +++------ tests/storage/test_instrumentation.py | 9 +- tests/storage/test_model_storage.py | 7 +- tests/storage/test_models.py | 4 +- tests/storage/test_structures.py | 11 +-- tests/utils/test_plugin.py | 6 +- 35 files changed, 254 insertions(+), 283 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/aria/__init__.py ---------------------------------------------------------------------- diff --git a/aria/__init__.py b/aria/__init__.py index 248aa1a..8b87473 100644 --- a/aria/__init__.py +++ b/aria/__init__.py @@ -57,7 +57,7 @@ def install_aria_extensions(): extension.init() -def application_model_storage(api, api_kwargs=None): +def application_model_storage(api, api_kwargs=None, initiator=None, initiator_kwargs=None): """ Initiate model storage """ @@ -78,19 +78,20 @@ def application_model_storage(api, api_kwargs=None): storage.model.Execution, storage.model.Task, ] - # if api not in _model_storage: - return storage.ModelStorage(api, items=models, api_kwargs=api_kwargs or {}) + return storage.ModelStorage(api_cls=api, + api_kwargs=api_kwargs, + items=models, + initiator=initiator, + initiator_kwargs=initiator_kwargs or {}) -def application_resource_storage(api, api_kwargs=None): +def application_resource_storage(api, api_kwargs=None, initiator=None, initiator_kwargs=None): """ Initiate resource storage """ - return storage.ResourceStorage( - api, - api_kwargs=api_kwargs or {}, - items=[ - 'blueprint', - 'deployment', - 'plugin', - ]) + + return storage.ResourceStorage(api_cls=api, + api_kwargs=api_kwargs, + items=['blueprint', 'deployment', 'plugin'], + initiator=initiator, + initiator_kwargs=initiator_kwargs) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/aria/orchestrator/context/operation.py ---------------------------------------------------------------------- diff --git a/aria/orchestrator/context/operation.py b/aria/orchestrator/context/operation.py index 23a6fd4..d1f61b2 100644 --- a/aria/orchestrator/context/operation.py +++ b/aria/orchestrator/context/operation.py @@ -17,6 +17,7 @@ Workflow and operation contexts """ +import aria from aria.utils import file from .common import BaseContext @@ -73,6 +74,32 @@ class BaseOperationContext(BaseContext): file.makedirs(plugin_workdir) return plugin_workdir + @property + def serialization_dict(self): + context_cls = self.__class__ + context_dict = { + 'name': self.name, + 'deployment_id': self._deployment_id, + 'task_id': self._task_id, + 'actor_id': self._actor_id, + 'workdir': self._workdir, + 'model_storage': self.model.serialization_dict if self.model else None, + 'resource_storage': self.resource.serialization_dict if self.resource else None + } + return { + 'context_cls': context_cls, + 'context': context_dict + } + + @classmethod + def deserialize_from_dict(cls, model_storage=None, resource_storage=None, **kwargs): + if model_storage: + model_storage = aria.application_model_storage(**model_storage) + if resource_storage: + resource_storage = aria.application_resource_storage(**resource_storage) + + return cls(model_storage=model_storage, resource_storage=resource_storage, **kwargs) + class NodeOperationContext(BaseOperationContext): """ http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/aria/orchestrator/context/serialization.py ---------------------------------------------------------------------- diff --git a/aria/orchestrator/context/serialization.py b/aria/orchestrator/context/serialization.py deleted file mode 100644 index 760818f..0000000 --- a/aria/orchestrator/context/serialization.py +++ /dev/null @@ -1,95 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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. - -import sqlalchemy.orm -import sqlalchemy.pool - -import aria - - -def operation_context_to_dict(context): - context_cls = context.__class__ - context_dict = { - 'name': context.name, - 'deployment_id': context._deployment_id, - 'task_id': context._task_id, - 'actor_id': context._actor_id, - 'workdir': context._workdir - } - if context.model: - model = context.model - context_dict['model_storage'] = { - 'api_cls': model.api, - 'api_kwargs': _serialize_sql_mapi_kwargs(model) - } - else: - context_dict['model_storage'] = None - if context.resource: - resource = context.resource - context_dict['resource_storage'] = { - 'api_cls': resource.api, - 'api_kwargs': _serialize_file_rapi_kwargs(resource) - } - else: - context_dict['resource_storage'] = None - return { - 'context_cls': context_cls, - 'context': context_dict - } - - -def operation_context_from_dict(context_dict): - context_cls = context_dict['context_cls'] - context = context_dict['context'] - - model_storage = context['model_storage'] - if model_storage: - api_cls = model_storage['api_cls'] - api_kwargs = _deserialize_sql_mapi_kwargs(model_storage.get('api_kwargs', {})) - context['model_storage'] = aria.application_model_storage(api=api_cls, - api_kwargs=api_kwargs) - - resource_storage = context['resource_storage'] - if resource_storage: - api_cls = resource_storage['api_cls'] - api_kwargs = _deserialize_file_rapi_kwargs(resource_storage.get('api_kwargs', {})) - context['resource_storage'] = aria.application_resource_storage(api=api_cls, - api_kwargs=api_kwargs) - - return context_cls(**context) - - -def _serialize_sql_mapi_kwargs(model): - engine_url = str(model._api_kwargs['engine'].url) - assert ':memory:' not in engine_url - return {'engine_url': engine_url} - - -def _deserialize_sql_mapi_kwargs(api_kwargs): - engine_url = api_kwargs.get('engine_url') - if not engine_url: - return {} - engine = sqlalchemy.create_engine(engine_url) - session_factory = sqlalchemy.orm.sessionmaker(bind=engine) - session = sqlalchemy.orm.scoped_session(session_factory=session_factory) - return {'session': session, 'engine': engine} - - -def _serialize_file_rapi_kwargs(resource): - return {'directory': resource._api_kwargs['directory']} - - -def _deserialize_file_rapi_kwargs(api_kwargs): - return api_kwargs http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/aria/orchestrator/runner.py ---------------------------------------------------------------------- diff --git a/aria/orchestrator/runner.py b/aria/orchestrator/runner.py index 16acc19..5950dc5 100644 --- a/aria/orchestrator/runner.py +++ b/aria/orchestrator/runner.py @@ -17,20 +17,20 @@ Workflow runner """ -import platform import tempfile import os -from sqlalchemy import (create_engine, orm) # @UnresolvedImport -from sqlalchemy.pool import StaticPool # @UnresolvedImport - from .context.workflow import WorkflowContext from .workflows.core.engine import Engine from .workflows.executor.thread import ThreadExecutor -from ..storage import model -from ..storage.sql_mapi import SQLAlchemyModelAPI -from ..storage.filesystem_rapi import FileSystemResourceAPI -from .. import (application_model_storage, application_resource_storage) +from ..storage import ( + sql_mapi, + filesystem_rapi, +) +from .. import ( + application_model_storage, + application_resource_storage +) SQLITE_IN_MEMORY = 'sqlite:///:memory:' @@ -57,6 +57,8 @@ class Runner(object): os.close(the_file) self._storage_path = storage_path + self._storage_dir = os.path.dirname(storage_path) + self._storage_name = os.path.basename(storage_path) self._is_storage_temporary = is_storage_temporary workflow_context = self.create_workflow_context(workflow_name, deployment_id, @@ -76,9 +78,13 @@ class Runner(object): self.cleanup() def create_workflow_context(self, workflow_name, deployment_id, initialize_model_storage_fn): - model_storage = self.create_sqlite_model_storage() + self.cleanup() + model_storage = application_model_storage( + sql_mapi.SQLAlchemyModelAPI, + initiator_kwargs=dict(base_dir=self._storage_dir, filename=self._storage_name)) initialize_model_storage_fn(model_storage) - resource_storage = self.create_fs_resource_storage() + resource_storage = application_resource_storage( + filesystem_rapi.FileSystemResourceAPI, api_kwargs=dict(directory='.')) return WorkflowContext( name=workflow_name, model_storage=model_storage, @@ -88,48 +94,8 @@ class Runner(object): task_max_attempts=1, task_retry_interval=1) - def create_sqlite_model_storage(self): # pylint: disable=no-self-use - self.cleanup() - - # Engine - if self._storage_path is None: - # In memory - # Causes serious threading problems: - # https://gehrcke.de/2015/05/in-memory-sqlite-database-and-flask-a-threading-trap/ - sqlite_engine = create_engine( - SQLITE_IN_MEMORY, - connect_args={'check_same_thread': False}, - poolclass=StaticPool) - else: - path_prefix = '' if 'Windows' in platform.system() else '/' - sqlite_engine = create_engine( - 'sqlite:///%s%s' % (path_prefix, self._storage_path)) - - # Models - model.DeclarativeBase.metadata.create_all(bind=sqlite_engine) # @UndefinedVariable - - # Session - sqlite_session_factory = orm.sessionmaker(bind=sqlite_engine) - if self._storage_path is None: - sqlite_session = sqlite_session_factory() - else: - # File-based storage only - sqlite_session = orm.scoped_session(session_factory=sqlite_session_factory) - - # Storage - sqlite_kwargs = dict(engine=sqlite_engine, session=sqlite_session) - return application_model_storage( - SQLAlchemyModelAPI, - api_kwargs=sqlite_kwargs) - - def create_fs_resource_storage(self, directory='.'): # pylint: disable=no-self-use - fs_kwargs = dict(directory=directory) - return application_resource_storage( - FileSystemResourceAPI, - api_kwargs=fs_kwargs) def cleanup(self): - if self._is_storage_temporary \ - and (self._storage_path is not None) \ - and os.path.isfile(self._storage_path): + if (self._is_storage_temporary and (self._storage_path is not None) and + os.path.isfile(self._storage_path)): os.remove(self._storage_path) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/aria/orchestrator/workflows/executor/process.py ---------------------------------------------------------------------- diff --git a/aria/orchestrator/workflows/executor/process.py b/aria/orchestrator/workflows/executor/process.py index 7d990fa..c4b8ba1 100644 --- a/aria/orchestrator/workflows/executor/process.py +++ b/aria/orchestrator/workflows/executor/process.py @@ -37,6 +37,7 @@ import struct import subprocess import tempfile import Queue +import pickle import jsonpickle @@ -45,7 +46,6 @@ from aria.extension import process_executor from aria.utils import imports from aria.utils import exceptions from aria.orchestrator.workflows.executor import base -from aria.orchestrator.context import serialization from aria.storage import instrumentation from aria.storage import type as storage_type @@ -113,7 +113,7 @@ class ProcessExecutor(base.BaseExecutor): file_descriptor, arguments_json_path = tempfile.mkstemp(prefix='executor-', suffix='.json') os.close(file_descriptor) with open(arguments_json_path, 'wb') as f: - f.write(jsonpickle.dumps(self._create_arguments_dict(task))) + f.write(pickle.dumps(self._create_arguments_dict(task))) env = os.environ.copy() # See _update_env for plugin_prefix usage @@ -193,7 +193,7 @@ class ProcessExecutor(base.BaseExecutor): 'operation_mapping': task.operation_mapping, 'operation_inputs': task.inputs, 'port': self._server_port, - 'context': serialization.operation_context_to_dict(task.context), + 'context': task.context.serialization_dict, } def _update_env(self, env, plugin_prefix): @@ -306,7 +306,7 @@ def _patch_session(ctx, messenger, instrument): def _main(): arguments_json_path = sys.argv[1] with open(arguments_json_path) as f: - arguments = jsonpickle.loads(f.read()) + arguments = pickle.loads(f.read()) # arguments_json_path is a temporary file created by the parent process. # so we remove it here @@ -327,7 +327,7 @@ def _main(): with instrumentation.track_changes() as instrument: try: - ctx = serialization.operation_context_from_dict(context_dict) + ctx = context_dict['context_cls'].deserialize_from_dict(**context_dict['context']) _patch_session(ctx=ctx, messenger=messenger, instrument=instrument) task_func = imports.load_attribute(operation_mapping) aria.install_aria_extensions() @@ -338,5 +338,6 @@ def _main(): except BaseException as e: messenger.failed(exception=e, tracked_changes=instrument.tracked_changes) + if __name__ == '__main__': _main() http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/aria/storage/api.py ---------------------------------------------------------------------- diff --git a/aria/storage/api.py b/aria/storage/api.py index d6fc3b8..f6da6de 100644 --- a/aria/storage/api.py +++ b/aria/storage/api.py @@ -119,11 +119,12 @@ class ResourceAPI(StorageAPI): """ A Base object for the resource. """ - def __init__(self, name): + def __init__(self, name, **kwargs): """ Base resource API :param str name: the resource type """ + super(ResourceAPI, self).__init__(**kwargs) self._name = name @property http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/aria/storage/core.py ---------------------------------------------------------------------- diff --git a/aria/storage/core.py b/aria/storage/core.py index 94b4fe0..3878dca 100644 --- a/aria/storage/core.py +++ b/aria/storage/core.py @@ -39,7 +39,10 @@ API: """ from aria.logger import LoggerMixin -from . import api as storage_api +from . import ( + api as storage_api, + sql_mapi +) __all__ = ( 'Storage', @@ -52,11 +55,33 @@ class Storage(LoggerMixin): """ Represents the storage """ - def __init__(self, api_cls, api_kwargs=None, items=(), **kwargs): + def __init__(self, + api_cls, + api_kwargs=None, + items=(), + initiator=None, + initiator_kwargs=None, + **kwargs): + """ + + :param api_cls: API cls for each model. + :param api_kwargs: + :param items: the items to register + :param initiator: a func which initializes the storage before the first use. + This function should return a dict, this dict would be passed in addition to the api kwargs. + This enables the creation of any unpickable objects across process. + :param initiator_kwargs: + :param kwargs: + """ super(Storage, self).__init__(**kwargs) self.api = api_cls - self._api_kwargs = api_kwargs or {} self.registered = {} + self._initiator = initiator + self._initiator_kwargs = initiator_kwargs or {} + self._api_kwargs = api_kwargs or {} + self._additional_api_kwargs = {} + if self._initiator: + self._additional_api_kwargs = self._initiator(**self._initiator_kwargs) for item in items: self.register(item) self.logger.debug('{name} object is ready: {0!r}'.format( @@ -71,6 +96,15 @@ class Storage(LoggerMixin): except KeyError: return super(Storage, self).__getattribute__(item) + @property + def serialization_dict(self): + return { + 'api': self.api, + 'api_kwargs': self._api_kwargs, + 'initiator': self._initiator, + 'initiator_kwargs': self._initiator_kwargs + } + def register(self, entry): """ Register the entry to the storage @@ -90,7 +124,9 @@ class ResourceStorage(Storage): :param name: :return: """ - self.registered[name] = self.api(name=name, **self._api_kwargs) + kwargs = self._api_kwargs.copy() + kwargs.update(self._additional_api_kwargs) + self.registered[name] = self.api(name=name, **kwargs) self.registered[name].create() self.logger.debug('setup {name} in storage {self!r}'.format(name=name, self=self)) @@ -99,6 +135,11 @@ class ModelStorage(Storage): """ Represents model storage. """ + def __init__(self, *args, **kwargs): + if kwargs.get('initiator', None) is None: + kwargs['initiator'] = sql_mapi.init_storage + super(ModelStorage, self).__init__(*args, **kwargs) + def register(self, model_cls): """ Register the model into the model storage. @@ -110,9 +151,9 @@ class ModelStorage(Storage): self.logger.debug('{name} in already storage {self!r}'.format(name=model_name, self=self)) return - self.registered[model_name] = self.api(name=model_name, - model_cls=model_cls, - **self._api_kwargs) + kwargs = self._api_kwargs.copy() + kwargs.update(self._additional_api_kwargs) + self.registered[model_name] = self.api(name=model_name, model_cls=model_cls, **kwargs) self.registered[model_name].create() self.logger.debug('setup {name} in storage {self!r}'.format(name=model_name, self=self)) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/aria/storage/sql_mapi.py ---------------------------------------------------------------------- diff --git a/aria/storage/sql_mapi.py b/aria/storage/sql_mapi.py index 809f677..9dae08a 100644 --- a/aria/storage/sql_mapi.py +++ b/aria/storage/sql_mapi.py @@ -15,13 +15,19 @@ """ SQLAlchemy based MAPI """ +import os +import platform +from sqlalchemy import ( + create_engine, + orm, +) from sqlalchemy.exc import SQLAlchemyError from aria.utils.collections import OrderedDict -from aria.storage import ( +from . import ( api, - exceptions + exceptions, ) @@ -364,6 +370,31 @@ class SQLAlchemyModelAPI(api.ModelAPI): getattr(instance, rel.key) +def init_storage(base_dir, filename='db.sqlite'): + """ + A builtin ModelStorage initiator. + Creates a sqlalchemy engine and a session to be passed to the mapi. + + Initiator_kwargs must be passed to the ModelStorage which must hold the base_dir for the + location of the db file, and an option filename. This would create an sqlite db. + :param base_dir: the dir of the db + :param filename: the db file name. + :return: + """ + uri = 'sqlite:///{platform_char}{path}'.format( + # Handles the windows behavior where there is not root, but drivers. + # Thus behaving as relative path. + platform_char='' if 'Windows' in platform.system() else '/', + + path=os.path.join(base_dir, filename)) + + engine = create_engine(uri) + session_factory = orm.sessionmaker(bind=engine) + session = orm.scoped_session(session_factory=session_factory) + + return dict(engine=engine, session=session) + + class ListResult(object): """ a ListResult contains results about the requested items. http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/setup.py ---------------------------------------------------------------------- diff --git a/setup.py b/setup.py index 2d1106d..7a1a3f4 100644 --- a/setup.py +++ b/setup.py @@ -64,7 +64,7 @@ console_scripts = ['aria = aria.cli.cli:main'] class InstallCommand(install): user_options = install.user_options + [ - ('skip-ctx', None, 'Install with or without the ctx (Defaults to False') + ('skip-ctx', None, 'Install with or without the ctx (Defaults to False)') ] boolean_options = install.boolean_options + ['skip-ctx'] http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/tests/mock/context.py ---------------------------------------------------------------------- diff --git a/tests/mock/context.py b/tests/mock/context.py index ec4bfb8..cb040ae 100644 --- a/tests/mock/context.py +++ b/tests/mock/context.py @@ -13,28 +13,32 @@ # See the License for the specific language governing permissions and # limitations under the License. +import os + import aria from aria.orchestrator import context -from aria.storage.filesystem_rapi import FileSystemResourceAPI -from aria.storage.sql_mapi import SQLAlchemyModelAPI +from aria.storage import ( + sql_mapi, + filesystem_rapi, +) from . import models +from ..storage import init_inmemory_model_storage from .topology import create_simple_topology_two_nodes -def simple(mapi_kwargs, resources_dir=None, **kwargs): - model_storage = aria.application_model_storage(SQLAlchemyModelAPI, api_kwargs=mapi_kwargs) +def simple(tmpdir, inmemory=False, context_kwargs=None): + initiator = init_inmemory_model_storage if inmemory else None + initiator_kwargs = {} if inmemory else dict(base_dir=tmpdir) - deployment_id = create_simple_topology_two_nodes(model_storage) + model_storage = aria.application_model_storage( + sql_mapi.SQLAlchemyModelAPI, initiator=initiator, initiator_kwargs=initiator_kwargs) + resource_storage = aria.application_resource_storage( + filesystem_rapi.FileSystemResourceAPI, + api_kwargs=dict(directory=os.path.join(tmpdir, 'resources')) + ) - # pytest tmpdir - if resources_dir: - resource_storage = aria.application_resource_storage( - FileSystemResourceAPI, - api_kwargs={'directory': resources_dir} - ) - else: - resource_storage = None + deployment_id = create_simple_topology_two_nodes(model_storage) final_kwargs = dict( name='simple_context', @@ -45,5 +49,5 @@ def simple(mapi_kwargs, resources_dir=None, **kwargs): task_max_attempts=models.TASK_MAX_ATTEMPTS, task_retry_interval=models.TASK_RETRY_INTERVAL ) - final_kwargs.update(kwargs) + final_kwargs.update(context_kwargs or {}) return context.workflow.WorkflowContext(**final_kwargs) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/tests/orchestrator/context/test_operation.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/context/test_operation.py b/tests/orchestrator/context/test_operation.py index b0918d1..e8c7cca 100644 --- a/tests/orchestrator/context/test_operation.py +++ b/tests/orchestrator/context/test_operation.py @@ -37,8 +37,11 @@ global_test_holder = {} @pytest.fixture def ctx(tmpdir): - context = mock.context.simple(storage.get_sqlite_api_kwargs(str(tmpdir)), - workdir=str(tmpdir.join('workdir'))) + context = mock.context.simple( + str(tmpdir.join('workdir')), + inmemory=True, + context_kwargs=dict(workdir=str(tmpdir.join('workdir'))) + ) yield context storage.release_sqlite_storage(context.model) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/tests/orchestrator/context/test_resource_render.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/context/test_resource_render.py b/tests/orchestrator/context/test_resource_render.py index ca2ef42..ded18c8 100644 --- a/tests/orchestrator/context/test_resource_render.py +++ b/tests/orchestrator/context/test_resource_render.py @@ -53,8 +53,7 @@ def test_download_resource_and_render_provided_variables(tmpdir, ctx): @pytest.fixture def ctx(tmpdir): - context = mock.context.simple(storage.get_sqlite_api_kwargs(), - resources_dir=str(tmpdir.join('resources'))) + context = mock.context.simple(str(tmpdir)) yield context storage.release_sqlite_storage(context.model) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/tests/orchestrator/context/test_serialize.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/context/test_serialize.py b/tests/orchestrator/context/test_serialize.py index 76930b1..ee123a7 100644 --- a/tests/orchestrator/context/test_serialize.py +++ b/tests/orchestrator/context/test_serialize.py @@ -16,13 +16,11 @@ import pytest import aria -from aria.storage.sql_mapi import SQLAlchemyModelAPI +from aria.storage import sql_mapi from aria.orchestrator.workflows import api from aria.orchestrator.workflows.core import engine from aria.orchestrator.workflows.executor import process from aria.orchestrator import workflow, operation -from aria.orchestrator.context import serialization - import tests from tests import mock from tests import storage @@ -42,10 +40,6 @@ def test_serialize_operation_context(context, executor, tmpdir): eng.execute() -def test_illegal_serialize_of_memory_model_storage(memory_model_storage): - with pytest.raises(AssertionError): - serialization._serialize_sql_mapi_kwargs(memory_model_storage) - @workflow def _mock_workflow(ctx, graph): @@ -93,16 +87,17 @@ def executor(): @pytest.fixture def context(tmpdir): - result = mock.context.simple(storage.get_sqlite_api_kwargs(str(tmpdir)), - resources_dir=str(tmpdir.join('resources')), - workdir=str(tmpdir.join('workdir'))) + result = mock.context.simple( + str(tmpdir), + context_kwargs=dict(workdir=str(tmpdir.join('workdir'))) + ) + yield result storage.release_sqlite_storage(result.model) @pytest.fixture def memory_model_storage(): - result = aria.application_model_storage( - SQLAlchemyModelAPI, api_kwargs=storage.get_sqlite_api_kwargs()) + result = aria.application_model_storage(sql_mapi.SQLAlchemyModelAPI) yield result storage.release_sqlite_storage(result) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/tests/orchestrator/context/test_toolbelt.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/context/test_toolbelt.py b/tests/orchestrator/context/test_toolbelt.py index b63811b..beb5730 100644 --- a/tests/orchestrator/context/test_toolbelt.py +++ b/tests/orchestrator/context/test_toolbelt.py @@ -33,7 +33,7 @@ global_test_holder = {} @pytest.fixture def workflow_context(tmpdir): - context = mock.context.simple(storage.get_sqlite_api_kwargs(str(tmpdir))) + context = mock.context.simple(str(tmpdir), inmemory=True) yield context storage.release_sqlite_storage(context.model) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/tests/orchestrator/context/test_workflow.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/context/test_workflow.py b/tests/orchestrator/context/test_workflow.py index 496c1ff..bb54037 100644 --- a/tests/orchestrator/context/test_workflow.py +++ b/tests/orchestrator/context/test_workflow.py @@ -19,7 +19,7 @@ import pytest from aria import application_model_storage from aria.orchestrator import context -from aria.storage.sql_mapi import SQLAlchemyModelAPI +from aria.storage import sql_mapi from tests import storage as test_storage from tests.mock import models @@ -60,8 +60,8 @@ class TestWorkflowContext(object): @pytest.fixture(scope='function') def storage(): - api_kwargs = test_storage.get_sqlite_api_kwargs() - workflow_storage = application_model_storage(SQLAlchemyModelAPI, api_kwargs=api_kwargs) + workflow_storage = application_model_storage( + sql_mapi.SQLAlchemyModelAPI, initiator=test_storage.init_inmemory_model_storage) workflow_storage.blueprint.put(models.get_blueprint()) blueprint = workflow_storage.blueprint.get_by_name(models.BLUEPRINT_NAME) workflow_storage.deployment.put(models.get_deployment(blueprint)) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/tests/orchestrator/execution_plugin/test_local.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/execution_plugin/test_local.py b/tests/orchestrator/execution_plugin/test_local.py index 497da48..86f2aa7 100644 --- a/tests/orchestrator/execution_plugin/test_local.py +++ b/tests/orchestrator/execution_plugin/test_local.py @@ -503,9 +503,7 @@ if __name__ == '__main__': @pytest.fixture def workflow_context(self, tmpdir): - workflow_context = mock.context.simple( - storage.get_sqlite_api_kwargs(str(tmpdir)), - resources_dir=str(tmpdir.join('resources'))) + workflow_context = mock.context.simple(str(tmpdir), inmemory=False) workflow_context.states = [] workflow_context.exception = None yield workflow_context http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/tests/orchestrator/execution_plugin/test_ssh.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/execution_plugin/test_ssh.py b/tests/orchestrator/execution_plugin/test_ssh.py index 6b5c783..65195c8 100644 --- a/tests/orchestrator/execution_plugin/test_ssh.py +++ b/tests/orchestrator/execution_plugin/test_ssh.py @@ -265,9 +265,7 @@ class TestWithActualSSHServer(object): @pytest.fixture def workflow_context(self, tmpdir): - workflow_context = mock.context.simple( - storage.get_sqlite_api_kwargs(str(tmpdir)), - resources_dir=str(tmpdir.join('resources'))) + workflow_context = mock.context.simple(str(tmpdir)) workflow_context.states = [] workflow_context.exception = None yield workflow_context http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/tests/orchestrator/workflows/api/test_task.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/api/test_task.py b/tests/orchestrator/workflows/api/test_task.py index 601c437..bb629ef 100644 --- a/tests/orchestrator/workflows/api/test_task.py +++ b/tests/orchestrator/workflows/api/test_task.py @@ -24,13 +24,13 @@ from tests import mock, storage @pytest.fixture -def ctx(): +def ctx(tmpdir): """ Create the following graph in storage: dependency_node <------ dependent_node :return: """ - simple_context = mock.context.simple(storage.get_sqlite_api_kwargs()) + simple_context = mock.context.simple(str(tmpdir), inmemory=False) simple_context.model.execution.put(mock.models.get_execution(simple_context.deployment)) yield simple_context storage.release_sqlite_storage(simple_context.model) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/tests/orchestrator/workflows/builtin/test_execute_operation.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/builtin/test_execute_operation.py b/tests/orchestrator/workflows/builtin/test_execute_operation.py index b7e5678..87e3425 100644 --- a/tests/orchestrator/workflows/builtin/test_execute_operation.py +++ b/tests/orchestrator/workflows/builtin/test_execute_operation.py @@ -24,7 +24,7 @@ from tests import storage @pytest.fixture def ctx(tmpdir): - context = mock.context.simple(storage.get_sqlite_api_kwargs(str(tmpdir))) + context = mock.context.simple(str(tmpdir)) yield context storage.release_sqlite_storage(context.model) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/tests/orchestrator/workflows/builtin/test_heal.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/builtin/test_heal.py b/tests/orchestrator/workflows/builtin/test_heal.py index b470790..3e4498f 100644 --- a/tests/orchestrator/workflows/builtin/test_heal.py +++ b/tests/orchestrator/workflows/builtin/test_heal.py @@ -26,7 +26,7 @@ from . import (assert_node_install_operations, @pytest.fixture def ctx(tmpdir): - context = mock.context.simple(storage.get_sqlite_api_kwargs(str(tmpdir))) + context = mock.context.simple(str(tmpdir)) yield context storage.release_sqlite_storage(context.model) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/tests/orchestrator/workflows/builtin/test_install.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/builtin/test_install.py b/tests/orchestrator/workflows/builtin/test_install.py index 789a161..1791719 100644 --- a/tests/orchestrator/workflows/builtin/test_install.py +++ b/tests/orchestrator/workflows/builtin/test_install.py @@ -25,7 +25,7 @@ from . import assert_node_install_operations @pytest.fixture def ctx(tmpdir): - context = mock.context.simple(storage.get_sqlite_api_kwargs(str(tmpdir))) + context = mock.context.simple(str(tmpdir)) yield context storage.release_sqlite_storage(context.model) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/tests/orchestrator/workflows/builtin/test_uninstall.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/builtin/test_uninstall.py b/tests/orchestrator/workflows/builtin/test_uninstall.py index 126c4cf..791291f 100644 --- a/tests/orchestrator/workflows/builtin/test_uninstall.py +++ b/tests/orchestrator/workflows/builtin/test_uninstall.py @@ -26,7 +26,7 @@ from . import assert_node_uninstall_operations @pytest.fixture def ctx(tmpdir): - context = mock.context.simple(storage.get_sqlite_api_kwargs(str(tmpdir))) + context = mock.context.simple(str(tmpdir)) yield context storage.release_sqlite_storage(context.model) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/tests/orchestrator/workflows/core/test_engine.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/core/test_engine.py b/tests/orchestrator/workflows/core/test_engine.py index d9b50a9..05a3d90 100644 --- a/tests/orchestrator/workflows/core/test_engine.py +++ b/tests/orchestrator/workflows/core/test_engine.py @@ -124,7 +124,7 @@ class BaseTest(object): @pytest.fixture def workflow_context(self, tmpdir): - workflow_context = mock.context.simple(storage.get_sqlite_api_kwargs(str(tmpdir))) + workflow_context = mock.context.simple(str(tmpdir)) workflow_context.states = [] workflow_context.exception = None yield workflow_context http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/tests/orchestrator/workflows/core/test_task.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/core/test_task.py b/tests/orchestrator/workflows/core/test_task.py index 061a3f2..b39a81f 100644 --- a/tests/orchestrator/workflows/core/test_task.py +++ b/tests/orchestrator/workflows/core/test_task.py @@ -31,7 +31,7 @@ from tests import mock, storage @pytest.fixture def ctx(tmpdir): - context = mock.context.simple(storage.get_sqlite_api_kwargs(str(tmpdir))) + context = mock.context.simple(str(tmpdir)) yield context storage.release_sqlite_storage(context.model) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/tests/orchestrator/workflows/core/test_task_graph_into_exececution_graph.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/core/test_task_graph_into_exececution_graph.py b/tests/orchestrator/workflows/core/test_task_graph_into_exececution_graph.py index cd37bde..57be075 100644 --- a/tests/orchestrator/workflows/core/test_task_graph_into_exececution_graph.py +++ b/tests/orchestrator/workflows/core/test_task_graph_into_exececution_graph.py @@ -22,9 +22,9 @@ from tests import mock from tests import storage -def test_task_graph_into_execution_graph(): +def test_task_graph_into_execution_graph(tmpdir): operation_name = 'tosca.interfaces.node.lifecycle.Standard.create' - task_context = mock.context.simple(storage.get_sqlite_api_kwargs()) + task_context = mock.context.simple(str(tmpdir)) node_instance = \ task_context.model.node_instance.get_by_name(mock.models.DEPENDENCY_NODE_INSTANCE_NAME) def sub_workflow(name, **_): http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/tests/orchestrator/workflows/executor/test_executor.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/executor/test_executor.py b/tests/orchestrator/workflows/executor/test_executor.py index 2486a1e..d983fe9 100644 --- a/tests/orchestrator/workflows/executor/test_executor.py +++ b/tests/orchestrator/workflows/executor/test_executor.py @@ -86,7 +86,14 @@ class MockContext(object): pass def __getattr__(self, item): - return None + if item == 'serialization_dict': + return {'context_cls': self.__class__, 'context': {}} + else: + return None + + @classmethod + def deserialize_from_dict(cls, **kwargs): + return cls() class MockTask(object): http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/tests/orchestrator/workflows/executor/test_process_executor.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/executor/test_process_executor.py b/tests/orchestrator/workflows/executor/test_process_executor.py index 687e245..ff5dce6 100644 --- a/tests/orchestrator/workflows/executor/test_process_executor.py +++ b/tests/orchestrator/workflows/executor/test_process_executor.py @@ -22,11 +22,15 @@ from contextlib import contextmanager import pytest from aria import application_model_storage -from aria.storage import model as aria_model +from aria.storage import ( + model as aria_model, + sql_mapi +) +from aria.orchestrator import ( + events, + plugin +) from aria.utils.plugin import create as create_plugin -from aria.storage.sql_mapi import SQLAlchemyModelAPI -from aria.orchestrator import events -from aria.orchestrator import plugin from aria.orchestrator.workflows.executor import process @@ -74,8 +78,9 @@ class TestProcessExecutor(object): @pytest.fixture def model(tmpdir): - api_kwargs = tests.storage.get_sqlite_api_kwargs(str(tmpdir)) - result = application_model_storage(SQLAlchemyModelAPI, api_kwargs=api_kwargs) + result = application_model_storage(sql_mapi.SQLAlchemyModelAPI, + initiator_kwargs=dict(base_dir=str(tmpdir)), + initiator=sql_mapi.init_storage) yield result tests.storage.release_sqlite_storage(result) @@ -112,7 +117,14 @@ class MockContext(object): pass def __getattr__(self, item): - return None + if item == 'serialization_dict': + return {'context_cls': self.__class__, 'context': {}} + else: + return None + + @classmethod + def deserialize_from_dict(cls, **kwargs): + return cls() class MockTask(object): http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/tests/orchestrator/workflows/executor/test_process_executor_extension.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/executor/test_process_executor_extension.py b/tests/orchestrator/workflows/executor/test_process_executor_extension.py index 4a8ef57..18957f1 100644 --- a/tests/orchestrator/workflows/executor/test_process_executor_extension.py +++ b/tests/orchestrator/workflows/executor/test_process_executor_extension.py @@ -75,6 +75,6 @@ def executor(): @pytest.fixture def context(tmpdir): - result = mock.context.simple(storage.get_sqlite_api_kwargs(str(tmpdir))) + result = mock.context.simple(str(tmpdir)) yield result storage.release_sqlite_storage(result.model) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/tests/orchestrator/workflows/executor/test_process_executor_tracked_changes.py ---------------------------------------------------------------------- diff --git a/tests/orchestrator/workflows/executor/test_process_executor_tracked_changes.py b/tests/orchestrator/workflows/executor/test_process_executor_tracked_changes.py index bd1fa96..e383859 100644 --- a/tests/orchestrator/workflows/executor/test_process_executor_tracked_changes.py +++ b/tests/orchestrator/workflows/executor/test_process_executor_tracked_changes.py @@ -148,6 +148,6 @@ def executor(): @pytest.fixture def context(tmpdir): - result = mock.context.simple(storage.get_sqlite_api_kwargs(str(tmpdir))) + result = mock.context.simple(str(tmpdir)) yield result storage.release_sqlite_storage(result.model) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/tests/storage/__init__.py ---------------------------------------------------------------------- diff --git a/tests/storage/__init__.py b/tests/storage/__init__.py index 3b3715e..b798e01 100644 --- a/tests/storage/__init__.py +++ b/tests/storage/__init__.py @@ -42,7 +42,6 @@ class MockModel(model.DeclarativeBase, structure.ModelMixin): #pylint: disable=a name = Column(Text) - class TestFileSystem(object): def setup_method(self): @@ -52,35 +51,6 @@ class TestFileSystem(object): rmtree(self.path, ignore_errors=True) -def get_sqlite_api_kwargs(base_dir=None, filename='db.sqlite'): - """ - Create sql params. works in in-memory and in filesystem mode. - If base_dir is passed, the mode will be filesystem mode. while the default mode is in-memory. - :param str base_dir: The base dir for the filesystem memory file. - :param str filename: the file name - defaults to 'db.sqlite'. - :return: - """ - if base_dir is not None: - uri = 'sqlite:///{platform_char}{path}'.format( - # Handles the windows behavior where there is not root, but drivers. - # Thus behaving as relative path. - platform_char='' if 'Windows' in platform.system() else '/', - - path=os.path.join(base_dir, filename)) - engine_kwargs = {} - else: - uri = 'sqlite:///:memory:' - engine_kwargs = dict(connect_args={'check_same_thread': False}, - poolclass=pool.StaticPool) - - engine = create_engine(uri, **engine_kwargs) - session_factory = orm.sessionmaker(bind=engine) - session = orm.scoped_session(session_factory=session_factory) if base_dir else session_factory() - - model.DeclarativeBase.metadata.create_all(bind=engine) - return dict(engine=engine, session=session) - - def release_sqlite_storage(storage): """ Drops the tables and clears the session @@ -95,3 +65,14 @@ def release_sqlite_storage(storage): session.close() for engine in set(mapi._engine for mapi in mapis): model.DeclarativeBase.metadata.drop_all(engine) + + +def init_inmemory_model_storage(): + uri = 'sqlite:///:memory:' + engine_kwargs = dict(connect_args={'check_same_thread': False}, poolclass=pool.StaticPool) + + engine = create_engine(uri, **engine_kwargs) + session_factory = orm.sessionmaker(bind=engine) + session = session_factory() + + return dict(engine=engine, session=session) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/tests/storage/test_instrumentation.py ---------------------------------------------------------------------- diff --git a/tests/storage/test_instrumentation.py b/tests/storage/test_instrumentation.py index 9b4da4f..771342c 100644 --- a/tests/storage/test_instrumentation.py +++ b/tests/storage/test_instrumentation.py @@ -25,7 +25,7 @@ from aria.storage import ( instrumentation, exceptions ) -from ..storage import get_sqlite_api_kwargs, release_sqlite_storage +from ..storage import release_sqlite_storage, init_inmemory_model_storage STUB = instrumentation._STUB @@ -328,10 +328,9 @@ def restore_instrumentation(): @pytest.fixture def storage(): - result = ModelStorage( - api_cls=sql_mapi.SQLAlchemyModelAPI, - api_kwargs=get_sqlite_api_kwargs(), - items=(MockModel1, MockModel2, StrictMockModel)) + result = ModelStorage(api_cls=sql_mapi.SQLAlchemyModelAPI, + items=(MockModel1, MockModel2, StrictMockModel), + initiator=init_inmemory_model_storage) yield result release_sqlite_storage(result) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/tests/storage/test_model_storage.py ---------------------------------------------------------------------- diff --git a/tests/storage/test_model_storage.py b/tests/storage/test_model_storage.py index d1596e3..34cc5df 100644 --- a/tests/storage/test_model_storage.py +++ b/tests/storage/test_model_storage.py @@ -22,14 +22,15 @@ from aria.storage import ( sql_mapi, ) from aria import application_model_storage -from ..storage import get_sqlite_api_kwargs, release_sqlite_storage +from ..storage import release_sqlite_storage, init_inmemory_model_storage from . import MockModel @pytest.fixture def storage(): - base_storage = ModelStorage(sql_mapi.SQLAlchemyModelAPI, api_kwargs=get_sqlite_api_kwargs()) + base_storage = ModelStorage(sql_mapi.SQLAlchemyModelAPI, + initiator=init_inmemory_model_storage) base_storage.register(MockModel) yield base_storage release_sqlite_storage(base_storage) @@ -61,7 +62,7 @@ def test_model_storage(storage): def test_application_storage_factory(): storage = application_model_storage(sql_mapi.SQLAlchemyModelAPI, - api_kwargs=get_sqlite_api_kwargs()) + initiator=init_inmemory_model_storage) assert storage.node assert storage.node_instance assert storage.plugin http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/tests/storage/test_models.py ---------------------------------------------------------------------- diff --git a/tests/storage/test_models.py b/tests/storage/test_models.py index 2088676..6450152 100644 --- a/tests/storage/test_models.py +++ b/tests/storage/test_models.py @@ -39,7 +39,7 @@ from aria.storage.model import ( from tests import mock -from tests.storage import get_sqlite_api_kwargs, release_sqlite_storage +from ..storage import release_sqlite_storage, init_inmemory_model_storage @contextmanager @@ -55,7 +55,7 @@ def sql_storage(storage_func): def _empty_storage(): return application_model_storage(sql_mapi.SQLAlchemyModelAPI, - api_kwargs=get_sqlite_api_kwargs()) + initiator=init_inmemory_model_storage) def _blueprint_storage(): http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/tests/storage/test_structures.py ---------------------------------------------------------------------- diff --git a/tests/storage/test_structures.py b/tests/storage/test_structures.py index 0223a98..4127905 100644 --- a/tests/storage/test_structures.py +++ b/tests/storage/test_structures.py @@ -25,7 +25,7 @@ from aria.storage import ( exceptions ) -from ..storage import get_sqlite_api_kwargs, release_sqlite_storage, structure +from ..storage import release_sqlite_storage, structure, init_inmemory_model_storage from . import MockModel from ..mock import ( models, @@ -36,7 +36,7 @@ from ..mock import ( @pytest.fixture def storage(): - base_storage = ModelStorage(sql_mapi.SQLAlchemyModelAPI, api_kwargs=get_sqlite_api_kwargs()) + base_storage = ModelStorage(sql_mapi.SQLAlchemyModelAPI, initiator=init_inmemory_model_storage) base_storage.register(MockModel) yield base_storage release_sqlite_storage(base_storage) @@ -48,8 +48,10 @@ def module_cleanup(): @pytest.fixture -def context(): - return mock_context.simple(get_sqlite_api_kwargs()) +def context(tmpdir): + ctx = mock_context.simple(str(tmpdir)) + yield ctx + release_sqlite_storage(ctx.model) def test_inner_dict_update(storage): @@ -174,7 +176,6 @@ def test_relationship_model_ordering(context): target_node_instance=target_node_instance, ) - context.model.node.put(new_node) context.model.node_instance.put(new_node_instance) context.model.relationship.put(source_to_new_relationship) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/1498ad39/tests/utils/test_plugin.py ---------------------------------------------------------------------- diff --git a/tests/utils/test_plugin.py b/tests/utils/test_plugin.py index 6f2dd92..09885ef 100644 --- a/tests/utils/test_plugin.py +++ b/tests/utils/test_plugin.py @@ -21,7 +21,7 @@ from aria import application_model_storage from aria.orchestrator import exceptions from aria.orchestrator import plugin from aria.utils.plugin import create as create_plugin -from aria.storage.sql_mapi import SQLAlchemyModelAPI +from aria.storage import sql_mapi from .. import storage @@ -49,8 +49,8 @@ class TestPluginManager(object): @pytest.fixture def model(): - api_kwargs = storage.get_sqlite_api_kwargs() - model = application_model_storage(SQLAlchemyModelAPI, api_kwargs=api_kwargs) + model = application_model_storage(sql_mapi.SQLAlchemyModelAPI, + initiator=storage.init_inmemory_model_storage) yield model storage.release_sqlite_storage(model)