# 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 sys import pytest import sh @pytest.fixture def testenv(tmpdir, request, monkeypatch): test_name = request.node.name workdir = str(tmpdir) # Setting the workdir environment variable for the CLI monkeypatch.setenv('ARIA_WORKDIR', workdir) return TestEnvironment(workdir, test_name) class TestEnvironment(object): def __init__(self, workdir, test_name): self.workdir = workdir self.test_name = test_name self.cli = self._get_cli() env = self._get_aria_env() self.model_storage = env.model_storage self.resource_storage = env.resource_storage self.plugin_manager = env.plugin_manager def install_service(self, service_template_path, dry=False, service_template_name=None, service_name=None): service_template_name = service_template_name or self.test_name service_name = service_name or self.test_name self.cli.service_templates.store(service_template_path, service_template_name) self.cli.services.create(service_name, service_template_name=service_template_name) self.execute_workflow(service_name, 'install', dry=dry) return service_name def uninstall_service(self, service_name=None, service_template_name=None, dry=False, force_service_delete=False): service_name = service_name or self.test_name self.execute_workflow(service_name, 'uninstall', dry=dry) self.cli.services.delete(service_name, force=force_service_delete) self.cli.service_templates.delete(service_template_name or self.test_name) def execute_workflow(self, service_name, workflow_name, dry=False): self.cli.executions.start(workflow_name, service_name=service_name, dry=dry) def verify_clean_storage(self): assert len(self.model_storage.service_template.list()) == 0 assert len(self.model_storage.service.list()) == 0 assert len(self.model_storage.execution.list()) == 0 assert len(self.model_storage.node_template.list()) == 0 assert len(self.model_storage.node.list()) == 0 assert len(self.model_storage.log.list()) == 0 def _get_cli(self): cli = sh.aria.bake('-vvv', _out=sys.stdout, _err=sys.stderr) class PatchedCli(object): """ The ``sh`` library supports underscore-dash auto-replacement for commands and option flags yet not for subcommands (e.g. ``aria service-templates``). This class fixes this. """ def __getattr__(self, attr): if '_' in attr: return cli.bake(attr.replace('_', '-')) return getattr(cli, attr) def __call__(self, *args, **kwargs): """ This is to support the ``aria`` command itself (e.g. ``aria --version`` calls). """ return cli(*args, **kwargs) return PatchedCli() def _get_aria_env(self): """ A somewhat hacky but most simple way of acquiring environment context such as the model storage, resource storage, etc. Note that the ``ARIA_WORKDIR`` environment variable must be exported before the import below is used, as the import itself will initialize the ``.aria`` directory. """ from aria.cli import env as cli_env reload(cli_env) # reloading the module in-between tests return cli_env.env