Merge lp:~veebers/juju-ci-tools/perfscale_add_mass_model_destruction into lp:juju-ci-tools

Proposed by Christopher Lee
Status: Merged
Merged at revision: 1684
Proposed branch: lp:~veebers/juju-ci-tools/perfscale_add_mass_model_destruction
Merge into: lp:juju-ci-tools
Diff against target: 180 lines (+171/-0)
2 files modified
perfscale_mass_model_destruction.py (+84/-0)
tests/test_perfscale_mass_model_destruction.py (+87/-0)
To merge this branch: bzr merge lp:~veebers/juju-ci-tools/perfscale_add_mass_model_destruction
Reviewer Review Type Date Requested Status
Curtis Hovey (community) code Approve
Review via email: mp+308879@code.launchpad.net

Description of the change

Add perfscale test that adds a lot of models (default 1000) and then destroys them, monitoring system metrics through out.

A relatively simple test. Takes about 2.5 hours. Demonstrates mongodb memory usage climbing to a peak.

To post a comment you must log in.
Revision history for this message
Curtis Hovey (sinzui) wrote :

I have some questions inline.

review: Needs Information (code)
1661. By Christopher Lee

Add missing tests.

1662. By Christopher Lee

Remove use of wait_for_started.

Revision history for this message
Christopher Lee (veebers) wrote :

Thanks Curtis. I have added the missing tests as you pointed out. I also removed wait_for_started as it wasn't needed.

Revision history for this message
Curtis Hovey (sinzui) wrote :

Thank you.

review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added file 'perfscale_mass_model_destruction.py'
2--- perfscale_mass_model_destruction.py 1970-01-01 00:00:00 +0000
3+++ perfscale_mass_model_destruction.py 2016-10-20 22:49:23 +0000
4@@ -0,0 +1,84 @@
5+#!/usr/bin/env python
6+"""Perfscale test measuring adding and destroying a large number of models.
7+
8+Steps taken in this test:
9+ - Bootstraps a provider
10+ - Creates x amount of models and waits for them to be ready
11+ - Delete all the models at once.
12+"""
13+
14+import argparse
15+from datetime import datetime
16+import logging
17+import sys
18+from time import sleep
19+
20+from deploy_stack import (
21+ BootstrapManager,
22+)
23+from generate_perfscale_results import (
24+ DeployDetails,
25+ TimingData,
26+ run_perfscale_test,
27+)
28+from utility import (
29+ add_basic_testing_arguments,
30+ configure_logging,
31+)
32+
33+
34+log = logging.getLogger("perfscale_mass_model_destruction")
35+
36+__metaclass__ = type
37+
38+
39+def perfscale_assess_model_destruction(client, args):
40+ """Create a bunch of models and then destroy them all."""
41+ model_count = args.model_count
42+
43+ all_models = []
44+ for item in xrange(0, model_count):
45+ model_name = 'model{}'.format(item)
46+ log.info('Creating model: {}'.format(model_name))
47+ new_model = client.add_model(client.env.clone(model_name))
48+ all_models.append(new_model)
49+
50+ # Workaround for bug: https://bugs.launchpad.net/juju/+bug/1635052
51+ # Noted here: https://bugs.launchpad.net/juju-ci-tools/+bug/1635109
52+ sleep(10)
53+ destruction_start = datetime.utcnow()
54+ for doomed in all_models:
55+ doomed.destroy_model()
56+ destruction_end = datetime.utcnow()
57+
58+ destruction_timing = TimingData(destruction_start, destruction_end)
59+ return DeployDetails(
60+ 'Destroy {} models'.format(model_count),
61+ {'Model Count': model_count},
62+ destruction_timing)
63+
64+
65+def parse_args(argv):
66+ """Parse all arguments."""
67+ parser = argparse.ArgumentParser(
68+ description="Perfscale bundle deployment test.")
69+ add_basic_testing_arguments(parser)
70+ parser.add_argument(
71+ '--model-count',
72+ type=int,
73+ help='Number of models to create.',
74+ default=100)
75+ return parser.parse_args(argv)
76+
77+
78+def main(argv=None):
79+ args = parse_args(argv)
80+ configure_logging(args.verbose)
81+ bs_manager = BootstrapManager.from_args(args)
82+ run_perfscale_test(perfscale_assess_model_destruction, bs_manager, args)
83+
84+ return 0
85+
86+
87+if __name__ == '__main__':
88+ sys.exit(main())
89
90=== added file 'tests/test_perfscale_mass_model_destruction.py'
91--- tests/test_perfscale_mass_model_destruction.py 1970-01-01 00:00:00 +0000
92+++ tests/test_perfscale_mass_model_destruction.py 2016-10-20 22:49:23 +0000
93@@ -0,0 +1,87 @@
94+"""Tests for perfscale_mass_model_desctruction"""
95+
96+import argparse
97+from mock import patch, Mock
98+
99+import perfscale_mass_model_destruction as pmmd
100+from generate_perfscale_results import DeployDetails
101+from fakejuju import fake_juju_client
102+from tests import (
103+ TestCase
104+)
105+from utility import temp_dir
106+
107+
108+def get_default_args(model_count=100, log_dir='/tmp/logs'):
109+ return argparse.Namespace(
110+ env='an-env',
111+ juju_bin='/bin/juju',
112+ logs=log_dir,
113+ temp_env_name='an-env-mod',
114+ model_count=model_count,
115+ debug=False,
116+ agent_stream=None,
117+ agent_url=None,
118+ bootstrap_host=None,
119+ keep_env=False,
120+ machine=[],
121+ region=None,
122+ series=None,
123+ upload_tools=False,
124+ verbose=20,
125+ deadline=None,
126+ )
127+
128+
129+class TestPerfscaleAssessModelDestruction(TestCase):
130+
131+ def test_returns_DeployDetails(self):
132+ client = fake_juju_client()
133+ client.bootstrap()
134+
135+ args = argparse.Namespace(model_count=1)
136+
137+ with patch.object(pmmd, 'sleep', autospec=True):
138+ results = pmmd.perfscale_assess_model_destruction(client, args)
139+ self.assertIsInstance(results, DeployDetails)
140+
141+ def test_returns_creates_requested_model_amount(self):
142+ client = fake_juju_client()
143+ client.bootstrap()
144+
145+ args = argparse.Namespace(model_count=12)
146+
147+ with patch.object(pmmd, 'sleep', autospec=True):
148+ results = pmmd.perfscale_assess_model_destruction(client, args)
149+ self.assertEqual(results.applications['Model Count'], 12)
150+
151+
152+class TestParseArgs(TestCase):
153+
154+ def test_default_args(self):
155+ expected_args = get_default_args(model_count=42)
156+ self.assertEqual(
157+ expected_args,
158+ pmmd.parse_args(
159+ ['an-env',
160+ '/bin/juju',
161+ '/tmp/logs',
162+ 'an-env-mod',
163+ '--model-count',
164+ '42']))
165+
166+
167+class TestMain(TestCase):
168+
169+ def test_main(self):
170+ with temp_dir() as log_dir:
171+ argv = ['an-env', '/bin/juju', log_dir, 'an-env-mod']
172+ bs_manager = Mock()
173+ with patch.object(pmmd, 'run_perfscale_test') as mock_run_pt:
174+ with patch.object(pmmd.BootstrapManager, 'from_args',
175+ return_value=bs_manager):
176+ pmmd.main(argv)
177+ mock_run_pt.assert_called_once_with(
178+ pmmd.perfscale_assess_model_destruction,
179+ bs_manager,
180+ get_default_args(log_dir=log_dir))

Subscribers

People subscribed via source and target branches