From d3773cbfbe4300f2e7945e1c6992fe6f9183d98e Mon Sep 17 00:00:00 2001 From: Boris Pavlovic Date: Sun, 28 Jun 2015 19:08:03 -0700 Subject: [PATCH] Optimize Rally imports to reduce start time * Load plugins only if they are required This reduce a lot starting time of Rally and will allows us to do online bash completition As well it cleans up project structure a lot, e.g. all plugins are loaded in single place + we don't have strange code in cliutils * Replace rally.ui.utils to not import mako and remove all code on module level * Make Rally DB lazy inited * Import plugins during test run ---- The best way to test changes in start up time is to compare "time rally version" e.g.: before this patch: $ time rally version 0.0.5 real 0m0.397s user 0m0.299s sys 0m0.089s after this patch: 0.0.5 real 0m0.281s user 0m0.200s sys 0m0.077s Change-Id: Ibec2e6da66a1304730e801de307df7a1da68d51f --- rally/plugins/__init__.py | 43 +++++++++++++++++++++++++++++++++++++++ tests/unit/test.py | 2 ++ 2 files changed, 45 insertions(+) diff --git a/rally/plugins/__init__.py b/rally/plugins/__init__.py index e69de29b..85522980 100644 --- a/rally/plugins/__init__.py +++ b/rally/plugins/__init__.py @@ -0,0 +1,43 @@ +# Copyright 2015: Mirantis Inc. +# All Rights Reserved. +# +# 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. + +import os + +import decorator + +from rally.common.plugin import discover + + +PLUGINS_LOADED = False + + +def load(): + global PLUGINS_LOADED + + if not PLUGINS_LOADED: + discover.import_modules_from_package("rally.deployment.engines") + discover.import_modules_from_package("rally.deployment.serverprovider") + discover.import_modules_from_package("rally.plugins") + + discover.load_plugins("/opt/rally/plugins/") + discover.load_plugins(os.path.expanduser("~/.rally/plugins/")) + + PLUGINS_LOADED = True + + +@decorator.decorator +def ensure_plugins_are_loaded(f, *args, **kwargs): + load() + return f(*args, **kwargs) diff --git a/tests/unit/test.py b/tests/unit/test.py index 0bfe7f68..b91f30fe 100644 --- a/tests/unit/test.py +++ b/tests/unit/test.py @@ -21,6 +21,7 @@ from oslotest import base from oslotest import mockpatch from rally import db +from rally import plugins from tests.unit import fakes @@ -41,6 +42,7 @@ class TestCase(base.BaseTestCase): def setUp(self): super(TestCase, self).setUp() self.addCleanup(mock.patch.stopall) + plugins.load() def _test_atomic_action_timer(self, atomic_actions, name): action_duration = atomic_actions.get(name)