~veebers/juju-ci-tools/migration-add-migrate-back-to-original

1331.2.1 by Reed O'Brien
Checkpoint adding multi series charm CI tests.
1
#!/usr/bin/env python
2
"""
1357.2.2 by Seman
Added assess_multi_series_charms.
3
Charms have the capability to declare that they support more than
1357.2.3 by Seman
Minor reformatting.
4
one series. Previously a separate copy of the charm was required for
5
each series. An important constraint here is that for a given charm,
1331.2.1 by Reed O'Brien
Checkpoint adding multi series charm CI tests.
6
all of the  listed series must be for the same distro/OS; it is not
7
allowed to offer a  single charm for Ubuntu and CentOS for example.
1357.2.2 by Seman
Added assess_multi_series_charms.
8
Supported series are added to charm metadata as follows:
1331.2.1 by Reed O'Brien
Checkpoint adding multi series charm CI tests.
9
10
    name: mycharm
11
    summary: "Great software"
12
    description: It works
13
    series:
1357.2.1 by Seman
Merge from ~reedobrien branch.
14
       - trusty
1331.2.1 by Reed O'Brien
Checkpoint adding multi series charm CI tests.
15
       - precise
16
       - wily
17
18
The default series is the first in the list:
19
20
    juju deploy mycharm
21
1357.2.2 by Seman
Added assess_multi_series_charms.
22
should deploy a mycharm service running on trusty.
1331.2.1 by Reed O'Brien
Checkpoint adding multi series charm CI tests.
23
24
A different, non-default series may be specified:
25
1357.2.1 by Seman
Merge from ~reedobrien branch.
26
    juju deploy mycharm --series precise
1331.2.1 by Reed O'Brien
Checkpoint adding multi series charm CI tests.
27
28
It is possible to force the charm to deploy using an unsupported series
29
(so long as the underlying OS is compatible):
30
31
    juju deploy mycharm --series xenial --force
32
33
"""
34
from __future__ import print_function
35
36
import argparse
1357.2.2 by Seman
Added assess_multi_series_charms.
37
from collections import namedtuple
1331.2.1 by Reed O'Brien
Checkpoint adding multi series charm CI tests.
38
import logging
1369.2.1 by Seman
Update assess_multi_series_charms to support Juju 1.X tests.
39
import os
1357.2.2 by Seman
Added assess_multi_series_charms.
40
import subprocess
1331.2.1 by Reed O'Brien
Checkpoint adding multi series charm CI tests.
41
import sys
42
1357.2.3 by Seman
Minor reformatting.
43
from deploy_stack import BootstrapManager
1409.1.1 by Martin
First pass at new jujucharm module.
44
from jujucharm import (
1409.1.2 by Martin
Correct repo handling before addition of fancier logic
45
    Charm,
1409.1.1 by Martin
First pass at new jujucharm module.
46
    local_charm_path,
47
)
1357.2.1 by Seman
Merge from ~reedobrien branch.
48
from utility import (
49
    add_basic_testing_arguments,
50
    configure_logging,
1485.1.1 by Martin
Switch all imports of local_charm_path to using jujucharm over utility
51
    JujuAssertionError,
1357.2.2 by Seman
Added assess_multi_series_charms.
52
    temp_dir,
1357.2.1 by Seman
Merge from ~reedobrien branch.
53
)
1357.2.3 by Seman
Minor reformatting.
54
from assess_heterogeneous_control import check_series
1357.2.2 by Seman
Added assess_multi_series_charms.
55
1331.2.1 by Reed O'Brien
Checkpoint adding multi series charm CI tests.
56
57
__metaclass__ = type
58
59
log = logging.getLogger("assess_multi_series_charms")
60
61
1369.2.1 by Seman
Update assess_multi_series_charms to support Juju 1.X tests.
62
Test = namedtuple("Test", ["series", "service", "force", "success", "machine",
63
                           "juju1x_supported"])
1331.2.1 by Reed O'Brien
Checkpoint adding multi series charm CI tests.
64
65
66
def assess_multi_series_charms(client):
1357.2.3 by Seman
Minor reformatting.
67
    """Assess multi series charms.
1357.2.2 by Seman
Added assess_multi_series_charms.
68
69
    :param client: Juju client.
70
    :type client: jujupy.EnvJujuClient
71
    :return: None
72
    """
73
    tests = [
74
        Test(series="precise", service='test0', force=False, success=False,
1369.2.1 by Seman
Update assess_multi_series_charms to support Juju 1.X tests.
75
             machine=None, juju1x_supported=False),
1357.2.2 by Seman
Added assess_multi_series_charms.
76
        Test(series=None, service='test1', force=False, success=True,
1369.2.1 by Seman
Update assess_multi_series_charms to support Juju 1.X tests.
77
             machine='0', juju1x_supported=True),
1357.2.2 by Seman
Added assess_multi_series_charms.
78
        Test(series="trusty", service='test2', force=False, success=True,
1369.2.1 by Seman
Update assess_multi_series_charms to support Juju 1.X tests.
79
             machine='1', juju1x_supported=True),
1357.2.2 by Seman
Added assess_multi_series_charms.
80
        Test(series="xenial", service='test3', force=False, success=True,
1369.2.1 by Seman
Update assess_multi_series_charms to support Juju 1.X tests.
81
             machine='2', juju1x_supported=False),
1357.2.2 by Seman
Added assess_multi_series_charms.
82
        Test(series="precise", service='test4', force=True, success=True,
1369.2.1 by Seman
Update assess_multi_series_charms to support Juju 1.X tests.
83
             machine='3', juju1x_supported=False),
1331.2.1 by Reed O'Brien
Checkpoint adding multi series charm CI tests.
84
    ]
1369.2.1 by Seman
Update assess_multi_series_charms to support Juju 1.X tests.
85
    with temp_dir() as repository:
86
        charm_name = 'dummy'
1409.1.2 by Martin
Correct repo handling before addition of fancier logic
87
        charm = Charm(charm_name, 'Test charm', series=['trusty', 'xenial'])
88
        charm_dir = charm.to_repo_dir(repository)
1369.2.1 by Seman
Update assess_multi_series_charms to support Juju 1.X tests.
89
        charm_path = local_charm_path(
90
            charm=charm_name, juju_ver=client.version, series='trusty',
91
            repository=os.path.dirname(charm_dir))
1357.2.2 by Seman
Added assess_multi_series_charms.
92
        for test in tests:
1369.2.1 by Seman
Update assess_multi_series_charms to support Juju 1.X tests.
93
            if client.is_juju1x() and not test.juju1x_supported:
94
                continue
1357.2.2 by Seman
Added assess_multi_series_charms.
95
            log.info(
96
                "Assessing multi series charms: test: {} charm_dir:{}".format(
1369.2.1 by Seman
Update assess_multi_series_charms to support Juju 1.X tests.
97
                    test, charm_path))
98
            assert_deploy(client, test, charm_path, repository=repository)
1357.2.2 by Seman
Added assess_multi_series_charms.
99
            if test.machine:
100
                check_series(client, machine=test.machine, series=test.series)
101
102
1369.2.1 by Seman
Update assess_multi_series_charms to support Juju 1.X tests.
103
def assert_deploy(client, test, charm_path, repository=None):
1357.2.3 by Seman
Minor reformatting.
104
    """Deploy a charm and assert a success or fail.
1357.2.2 by Seman
Added assess_multi_series_charms.
105
106
    :param client: Juju client
107
    :type client: jujupy.EnvJujuClient
108
    :param test: Deploy test data.
109
    :type  test: Test
110
    :param charm_dir:
111
    :type charm_dir: str
1369.2.1 by Seman
Update assess_multi_series_charms to support Juju 1.X tests.
112
    :param repository: Direcotry path to the repository
113
    :type repository: str
1357.2.2 by Seman
Added assess_multi_series_charms.
114
    :return: None
115
    """
116
    if test.success:
1369.2.1 by Seman
Update assess_multi_series_charms to support Juju 1.X tests.
117
        client.deploy(charm=charm_path, series=test.series,
118
                      service=test.service, force=test.force,
119
                      repository=repository)
1357.2.2 by Seman
Added assess_multi_series_charms.
120
        client.wait_for_started()
121
    else:
122
        try:
1369.2.1 by Seman
Update assess_multi_series_charms to support Juju 1.X tests.
123
            client.deploy(charm=charm_path, series=test.series,
124
                          service=test.service, force=test.force,
125
                          repository=repository)
1357.2.2 by Seman
Added assess_multi_series_charms.
126
        except subprocess.CalledProcessError:
127
            return
128
        raise JujuAssertionError('Assert deploy failed for {}'.format(test))
1331.2.1 by Reed O'Brien
Checkpoint adding multi series charm CI tests.
129
130
131
def parse_args(argv):
132
    """Parse all arguments."""
133
    parser = argparse.ArgumentParser(
134
        description="Test multi series charm feature")
135
    add_basic_testing_arguments(parser)
136
    return parser.parse_args(argv)
137
138
139
def main(argv=None):
140
    args = parse_args(argv)
141
    configure_logging(args.verbose)
142
    bs_manager = BootstrapManager.from_args(args)
143
    with bs_manager.booted_context(args.upload_tools):
144
        assess_multi_series_charms(bs_manager.client)
145
    return 0
146
147
148
if __name__ == '__main__':
149
    sys.exit(main())