2
"""Assess juju charm storage."""
4
from __future__ import print_function
13
from deploy_stack import (
16
from jujucharm import Charm
18
add_basic_testing_arguments,
29
log = logging.getLogger("assess_storage")
32
storage_pool_details = {
63
storage_pool_1X = copy.deepcopy(storage_pool_details)
64
storage_pool_1X["ebs-ssd"] = {
72
storage_list_expected = {
82
{"location": "/srv/data"}}}}}}
84
storage_list_expected_2 = copy.deepcopy(storage_list_expected)
85
storage_list_expected_2["storage"]["disks/1"] = {
90
{"dummy-storage-lp/0":
93
storage_list_expected_3 = copy.deepcopy(storage_list_expected_2)
94
storage_list_expected_3["storage"]["disks/2"] = {
99
{"dummy-storage-lp/0":
102
storage_list_expected_4 = copy.deepcopy(storage_list_expected_3)
103
storage_list_expected_4["storage"]["data/3"] = {
104
"kind": "filesystem",
108
{"dummy-storage-tp/0":
110
"location": "/srv/data"}}}}
111
storage_list_expected_5 = copy.deepcopy(storage_list_expected_4)
112
storage_list_expected_5["storage"]["data/4"] = {
113
"kind": "filesystem",
117
{"dummy-storage-np/0":
119
"location": "/srv/data"}}}}
120
storage_list_expected_6 = copy.deepcopy(storage_list_expected_5)
121
storage_list_expected_6["storage"]["data/5"] = {
122
"kind": "filesystem",
126
{"dummy-storage-mp/0":
128
"location": "/srv/data"}}}}
131
def storage_list(client):
132
"""Return the storage list."""
133
list_storage = json.loads(client.list_storage())
134
for instance in list_storage["storage"].keys():
136
list_storage["storage"][instance].pop("status")
137
list_storage["storage"][instance].pop("persistent")
138
attachments = list_storage["storage"][instance]["attachments"]
139
unit = attachments["units"].keys()[0]
140
attachments["units"][unit].pop("machine")
141
if instance.startswith("disks"):
142
attachments["units"][unit]["location"] = ""
148
def storage_pool_list(client):
149
"""Return the list of storage pool."""
150
return json.loads(client.list_storage_pool())
153
def create_storage_charm(charm_dir, name, summary, storage):
154
"""Manually create a temporary charm to test with storage."""
155
storage_charm = Charm(name, summary, storage=storage, series=['trusty'])
156
charm_root = storage_charm.to_repo_dir(charm_dir)
160
def assess_create_pool(client):
161
"""Test creating storage pool."""
162
for name, pool in storage_pool_details.iteritems():
163
client.create_storage_pool(name, pool["provider"],
164
pool["attrs"]["size"])
167
def assess_add_storage(client, unit, storage_type, amount="1"):
168
"""Test adding storage instances to service.
170
Only type 'disk' is able to add instances.
172
client.add_storage(unit, storage_type, amount)
175
def deploy_storage(client, charm, series, pool, amount="1G", charm_repo=None):
176
"""Test deploying charm with storage."""
178
client.deploy(charm, series=series, repository=charm_repo,
179
storage="disks=" + pool + "," + amount)
181
client.deploy(charm, series=series, repository=charm_repo,
182
storage="data=" + amount)
184
client.deploy(charm, series=series, repository=charm_repo,
185
storage="data=" + pool + "," + amount)
186
client.wait_for_started()
189
def assess_deploy_storage(client, charm_series,
190
charm_name, provider_type, pool=None):
191
"""Set up the test for deploying charm with storage."""
192
if provider_type == "block":
195
"type": provider_type,
204
"type": provider_type,
205
"location": "/srv/data"
208
with temp_dir() as charm_dir:
209
charm_root = create_storage_charm(charm_dir, charm_name,
210
'Test charm for storage', storage)
212
charm = local_charm_path(charm=charm_name, juju_ver=client.version,
214
repository=os.path.dirname(charm_root),
216
deploy_storage(client, charm, charm_series, pool, "1G", charm_dir)
219
def assess_multiple_provider(client, charm_series, amount, charm_name,
220
provider_1, provider_2, pool_1, pool_2):
222
for provider in [provider_1, provider_2]:
223
if provider == "block":
236
"location": "/srv/data"
239
with temp_dir() as charm_dir:
240
charm_root = create_storage_charm(charm_dir, charm_name,
241
'Test charm for storage', storage)
243
charm = local_charm_path(charm=charm_name, juju_ver=client.version,
245
repository=os.path.dirname(charm_root),
248
command = "disks=" + pool_1 + "," + amount
250
command = "data=" + pool_1 + "," + amount
252
command = command + ",disks=" + pool_2
254
command = command + ",data=" + pool_2
255
client.deploy(charm, series=charm_series, repository=charm_dir,
257
client.wait_for_started()
260
def assess_storage(client, charm_series):
261
"""Test the storage feature."""
262
assess_create_pool(client)
263
pool_list = storage_pool_list(client)
264
if client.version.startswith('2.'):
265
if pool_list != storage_pool_details:
266
raise JujuAssertionError(pool_list)
267
elif client.version.startswith('1.'):
268
if pool_list != storage_pool_1X:
269
raise JujuAssertionError(pool_list)
270
assess_deploy_storage(client, charm_series,
271
'dummy-storage-fs', 'filesystem', 'rootfs')
272
storage_list_derived = storage_list(client)
273
if storage_list_derived != storage_list_expected:
274
raise JujuAssertionError(storage_list_derived)
275
assess_deploy_storage(client, charm_series,
276
'dummy-storage-lp', 'block', 'loop')
277
storage_list_derived = storage_list(client)
278
if storage_list_derived != storage_list_expected_2:
279
raise JujuAssertionError(storage_list_derived)
280
assess_add_storage(client, 'dummy-storage-lp/0', 'disks', "1")
281
storage_list_derived = storage_list(client)
282
if storage_list_derived != storage_list_expected_3:
283
raise JujuAssertionError(storage_list_derived)
284
assess_deploy_storage(client, charm_series,
285
'dummy-storage-tp', 'filesystem', 'tmpfs')
286
storage_list_derived = storage_list(client)
287
if storage_list_derived != storage_list_expected_4:
288
raise JujuAssertionError(storage_list_derived)
289
assess_deploy_storage(client, charm_series,
290
'dummy-storage-np', 'filesystem')
291
storage_list_derived = storage_list(client)
292
if storage_list_derived != storage_list_expected_5:
293
raise JujuAssertionError(storage_list_derived)
294
assess_multiple_provider(client, charm_series, "1G", 'dummy-storage-mp',
295
'filesystem', 'block', 'rootfs', 'loop')
296
storage_list_derived = storage_list(client)
297
if storage_list_derived != storage_list_expected_6:
298
raise JujuAssertionError(storage_list_derived)
299
# storage with provider 'ebs' is only available under 'aws'
300
# assess_deploy_storage(client, charm_series,
301
# 'dummy-storage-eb', 'filesystem', 'ebs')
304
def parse_args(argv):
305
"""Parse all arguments."""
306
parser = argparse.ArgumentParser(description="Test Storage Feature")
307
add_basic_testing_arguments(parser)
308
parser.set_defaults(series='trusty')
309
return parser.parse_args(argv)
313
args = parse_args(argv)
314
configure_logging(args.verbose)
315
bs_manager = BootstrapManager.from_args(args)
316
with bs_manager.booted_context(args.upload_tools):
317
assess_storage(bs_manager.client, bs_manager.series)
321
if __name__ == '__main__':