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
This commit is contained in:
Boris Pavlovic 2015-06-28 19:08:03 -07:00
parent 65d473f7a0
commit d3773cbfbe
2 changed files with 45 additions and 0 deletions

View File

@ -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)

View File

@ -21,6 +21,7 @@ from oslotest import base
from oslotest import mockpatch from oslotest import mockpatch
from rally import db from rally import db
from rally import plugins
from tests.unit import fakes from tests.unit import fakes
@ -41,6 +42,7 @@ class TestCase(base.BaseTestCase):
def setUp(self): def setUp(self):
super(TestCase, self).setUp() super(TestCase, self).setUp()
self.addCleanup(mock.patch.stopall) self.addCleanup(mock.patch.stopall)
plugins.load()
def _test_atomic_action_timer(self, atomic_actions, name): def _test_atomic_action_timer(self, atomic_actions, name):
action_duration = atomic_actions.get(name) action_duration = atomic_actions.get(name)