~andrewjbeach/juju-ci-tools/make-local-patcher

« back to all changes in this revision

Viewing changes to assess_resources.py

  • Committer: Martin Packman
  • Date: 2015-12-16 03:59:38 UTC
  • mto: This revision was merged to the branch mainline in revision 1200.
  • Revision ID: martin.packman@canonical.com-20151216035938-881wbry7ezh8he5m
Add missing template test file

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/usr/bin/env python
2
 
 
3
 
from __future__ import print_function
4
 
 
5
 
import argparse
6
 
import logging
7
 
import os
8
 
import sys
9
 
from tempfile import NamedTemporaryFile
10
 
 
11
 
from deploy_stack import (
12
 
    BootstrapManager,
13
 
)
14
 
from jujucharm import (
15
 
    local_charm_path,
16
 
)
17
 
from utility import (
18
 
    add_basic_testing_arguments,
19
 
    configure_logging,
20
 
    JujuAssertionError,
21
 
)
22
 
 
23
 
 
24
 
__metaclass__ = type
25
 
log = logging.getLogger("assess_resources")
26
 
 
27
 
 
28
 
def _resource_info(name, fingerprint, size, service_app_id):
29
 
    data = {}
30
 
    data['resourceid'] = "dummy-resource/{}".format(name)
31
 
    data[service_app_id] = 'dummy-resource'
32
 
    data['name'] = name
33
 
    data['type'] = 'file'
34
 
    data['description'] = '{} resource.'.format(name)
35
 
    data['fingerprint'] = fingerprint
36
 
    data['size'] = size
37
 
    data['origin'] = 'upload'
38
 
    data['used'] = True
39
 
    data['username'] = 'admin@local'
40
 
    data['path'] = '{}.txt'.format(name)
41
 
    return data
42
 
 
43
 
 
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'
50
 
            else:
51
 
                service_app_id = 'applicationId'
52
 
            expected_values = _resource_info(name, fingerprint,
53
 
                                             size, service_app_id)
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))
62
 
            break
63
 
    else:
64
 
        raise JujuAssertionError('Resource id not found.')
65
 
 
66
 
 
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))
74
 
    else:
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))
79
 
    if deploy:
80
 
        client.deploy(charm_path, resource=resource_arg)
81
 
    else:
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)
89
 
    client.show_status()
90
 
 
91
 
 
92
 
def fill_dummy_file(file_path, size):
93
 
    with open(file_path, "wb") as f:
94
 
        f.seek(size - 1)
95
 
        f.write('\0')
96
 
 
97
 
 
98
 
def large_assess(client, agent_timeout, resource_timeout):
99
 
    tests = [
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')}]
109
 
    for test in tests:
110
 
        with NamedTemporaryFile(suffix=".txt") as temp_file:
111
 
            fill_dummy_file(temp_file.name, size=test['size'])
112
 
            push_resource(
113
 
                client, 'bar', test['finger_print'], test['size'],
114
 
                agent_timeout, resource_timeout, deploy=False,
115
 
                resource_file=temp_file.name)
116
 
 
117
 
 
118
 
def assess_resources(client, args):
119
 
    finger_print = ('4ddc48627c6404e538bb0957632ef68618c0839649d9ad9e41ad94472'
120
 
                    'c1589f4b7f9d830df6c4b209d7eb1b4b5522c4d')
121
 
    size = 27
122
 
    push_resource(client, 'foo', finger_print, size, args.agent_timeout,
123
 
                  args.resource_timeout)
124
 
    finger_print = ('ffbf43d68a6960de63908bb05c14a026abeda136119d3797431bdd7b'
125
 
                    '469c1f027e57a28aeec0df01a792e9e70aad2d6b')
126
 
    size = 17
127
 
    push_resource(client, 'bar', finger_print, size, args.agent_timeout,
128
 
                  args.resource_timeout, deploy=False)
129
 
    finger_print = ('2a3821585efcccff1562efea4514dd860cd536441954e182a764991'
130
 
                    '0e21f6a179a015677a68a351a11d3d2f277e551e4')
131
 
    size = 27
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:
135
 
        size = 1024 * 1024
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)
144
 
 
145
 
 
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')
156
 
 
157
 
    return parser.parse_args(argv)
158
 
 
159
 
 
160
 
def main(argv=None):
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)
166
 
    return 0
167
 
 
168
 
 
169
 
if __name__ == '__main__':
170
 
    sys.exit(main())