3
from __future__ import print_function
9
from tempfile import NamedTemporaryFile
11
from deploy_stack import (
14
from jujucharm import (
18
add_basic_testing_arguments,
25
log = logging.getLogger("assess_resources")
28
def _resource_info(name, fingerprint, size, service_app_id):
30
data['resourceid'] = "dummy-resource/{}".format(name)
31
data[service_app_id] = 'dummy-resource'
34
data['description'] = '{} resource.'.format(name)
35
data['fingerprint'] = fingerprint
37
data['origin'] = 'upload'
39
data['username'] = 'admin@local'
40
data['path'] = '{}.txt'.format(name)
44
def verify_status(status, resource_id, name, fingerprint, size):
45
resources = status['resources']
46
for resource in resources:
47
if resource['expected']['resourceid'] == resource_id:
48
if 'serviceid' in resource['unit']:
49
service_app_id = 'serviceid'
51
service_app_id = 'applicationId'
52
expected_values = _resource_info(name, fingerprint,
54
if resource['expected'] != expected_values:
55
raise JujuAssertionError(
56
'Unexpected resource list values: {} Expected: {}'.format(
57
resource['expected'], expected_values))
58
if resource['unit'] != expected_values:
59
raise JujuAssertionError(
60
'Unexpected unit resource list values: {} Expected: '
61
'{}'.format(resource['unit'], expected_values))
64
raise JujuAssertionError('Resource id not found.')
67
def push_resource(client, resource_name, finger_print, size, agent_timeout,
68
resource_timeout, deploy=True, resource_file=None):
69
charm_name = 'dummy-resource'
70
charm_path = local_charm_path(charm=charm_name, juju_ver=client.version)
71
if resource_file is None:
72
resource_file = os.path.join(
73
charm_path, '{}.txt'.format(resource_name))
75
resource_file = os.path.join(charm_path, resource_file)
76
resource_arg = '{}={}'.format(resource_name, resource_file)
77
log.info("Deploy charm with resource {} Size: {} File: {}".format(
78
resource_name, size, resource_file))
80
client.deploy(charm_path, resource=resource_arg)
82
client.attach(charm_name, resource=resource_arg)
83
client.wait_for_started(timeout=agent_timeout)
84
resource_id = '{}/{}'.format(charm_name, resource_name)
85
client.wait_for_resource(
86
resource_id, charm_name, timeout=resource_timeout)
87
status = client.list_resources(charm_name)
88
verify_status(status, resource_id, resource_name, finger_print, size)
92
def fill_dummy_file(file_path, size):
93
with open(file_path, "wb") as f:
98
def large_assess(client, agent_timeout, resource_timeout):
100
{"size": 1024 * 1024 * 10,
101
"finger_print": ('d7c014629d74ae132cc9f88e3ec2f31652f40a7a1fcc52c54b'
102
'04d6c0d089169bcd55958d1277b4cdf6262f21c712d0a7')},
103
{"size": 1024 * 1024 * 100,
104
"finger_print": ('c11e93892b66de781e4d0883efe10482f8d1642f3b6574ba2e'
105
'e0da6f8db03f53c0eadfb5e5e0463574c113024ded369e')},
106
{"size": 1024 * 1024 * 200,
107
"finger_print": ('77db39eca74c6205e31a7701e488a1df4b9b38a527a6084bd'
108
'bb6843fd430a0b51047378ee0255e633b32c0dda3cf43ab')}]
110
with NamedTemporaryFile(suffix=".txt") as temp_file:
111
fill_dummy_file(temp_file.name, size=test['size'])
113
client, 'bar', test['finger_print'], test['size'],
114
agent_timeout, resource_timeout, deploy=False,
115
resource_file=temp_file.name)
118
def assess_resources(client, args):
119
finger_print = ('4ddc48627c6404e538bb0957632ef68618c0839649d9ad9e41ad94472'
120
'c1589f4b7f9d830df6c4b209d7eb1b4b5522c4d')
122
push_resource(client, 'foo', finger_print, size, args.agent_timeout,
123
args.resource_timeout)
124
finger_print = ('ffbf43d68a6960de63908bb05c14a026abeda136119d3797431bdd7b'
125
'469c1f027e57a28aeec0df01a792e9e70aad2d6b')
127
push_resource(client, 'bar', finger_print, size, args.agent_timeout,
128
args.resource_timeout, deploy=False)
129
finger_print = ('2a3821585efcccff1562efea4514dd860cd536441954e182a764991'
130
'0e21f6a179a015677a68a351a11d3d2f277e551e4')
132
push_resource(client, 'bar', finger_print, size, args.agent_timeout,
133
args.resource_timeout, deploy=False, resource_file='baz.txt')
134
with NamedTemporaryFile(suffix=".txt") as temp_file:
136
finger_print = ('3164673a8ac27576ab5fc06b9adc4ce0aca5bd3025384b1cf2128'
137
'a8795e747c431e882785a0bf8dc70b42995db388575')
138
fill_dummy_file(temp_file.name, size=size)
139
push_resource(client, 'bar', finger_print, size, args.agent_timeout,
140
args.resource_timeout, deploy=False,
141
resource_file=temp_file.name)
142
if args.large_test_enabled:
143
large_assess(client, args.agent_timeout, args.resource_timeout)
146
def parse_args(argv):
147
"""Parse all arguments."""
148
parser = argparse.ArgumentParser(description="Assess resources")
149
add_basic_testing_arguments(parser)
150
parser.add_argument('--large-test-enabled', action='store_true',
151
help="Uses large file for testing.")
152
parser.add_argument('--agent-timeout', type=int, default=1800,
153
help='The time to wait for agents to start')
154
parser.add_argument('--resource-timeout', type=int, default=1800,
155
help='The time to wait for agents to start')
157
return parser.parse_args(argv)
161
args = parse_args(argv)
162
configure_logging(args.verbose)
163
bs_manager = BootstrapManager.from_args(args)
164
with bs_manager.booted_context(args.upload_tools):
165
assess_resources(bs_manager.client, args)
169
if __name__ == '__main__':