6
from twisted.internet.defer import succeed
8
from txaws.ec2.model import SecurityGroup
10
from juju.lib.mocker import MATCH
11
from juju.lib.testing import TestCase
12
from juju.providers.ec2.machine import EC2ProviderMachine
14
from .common import EC2TestMixin, EC2MachineLaunchMixin
16
DATA_DIR = os.path.join(os.path.abspath(os.path.dirname(__file__)), "data")
19
class EC2BootstrapTest(EC2TestMixin, EC2MachineLaunchMixin, TestCase):
21
def _mock_verify(self):
23
self.env_name, "bootstrap-verify", "storage is writable")
24
self.mocker.result(succeed(True))
27
"""Mock saving bootstrap instances to S3."""
29
def match_string(data):
30
return isinstance(data, str)
33
self.env_name, "provider-state",
35
self.mocker.result(succeed(True))
37
def _mock_launch(self):
38
"""Mock launching a bootstrap machine on ec2."""
39
def verify_user_data(data):
40
expect_path = os.path.join(DATA_DIR, "bootstrap_cloud_init")
41
with open(expect_path) as f:
42
expect_cloud_init = yaml.load(f.read())
43
self.assertEquals(yaml.load(data), expect_cloud_init)
46
self.ec2.run_instances(
47
image_id="ami-default",
48
instance_type="m1.small",
51
security_groups=["juju-moon", "juju-moon-0"],
52
user_data=MATCH(verify_user_data))
54
def test_launch_bootstrap(self):
55
"""The provider bootstrap can launch a bootstrap/zookeeper machine."""
57
log = self.capture_logging("juju.common", level=logging.DEBUG)
59
self.s3.get_object(self.env_name, "provider-state")
60
self.mocker.result(succeed(""))
62
self.ec2.describe_security_groups()
63
self.mocker.result(succeed([]))
64
self._mock_create_group()
65
self._mock_create_machine_group(0)
66
self._mock_launch_utils(region="us-east-1")
68
self.mocker.result(succeed([]))
72
provider = self.get_provider()
73
deferred = provider.bootstrap()
75
def check_log(result):
76
log_text = log.getvalue()
77
self.assertIn("Launching juju bootstrap instance", log_text)
78
self.assertNotIn("previously bootstrapped", log_text)
80
deferred.addCallback(check_log)
83
def test_launch_bootstrap_existing_provider_group(self):
85
When launching a bootstrap instance the provider will use an existing
86
provider instance group.
88
self.capture_logging("juju.ec2")
89
self.s3.get_object(self.env_name, "provider-state")
90
self.mocker.result(succeed(""))
92
self.ec2.describe_security_groups()
93
self.mocker.result(succeed([
94
SecurityGroup("juju-%s" % self.env_name, "")]))
95
self._mock_create_machine_group(0)
96
self._mock_launch_utils(region="us-east-1")
98
self.mocker.result(succeed([]))
102
provider = self.get_provider()
103
return provider.bootstrap()
105
def test_run_with_loaded_state(self):
107
If the provider bootstrap is run when there is already a running
108
bootstrap instance, it will just return the existing machine.
110
state = yaml.dump({"zookeeper-instances": ["i-foobar"]})
111
self.s3.get_object(self.env_name, "provider-state")
112
self.mocker.result(succeed(state))
113
self.ec2.describe_instances("i-foobar")
114
self.mocker.result(succeed([self.get_instance("i-foobar")]))
117
log = self.capture_logging("juju.common")
119
def validate_result(result):
120
self.assertTrue(result)
121
machine = result.pop()
122
self.assertTrue(isinstance(machine, EC2ProviderMachine))
123
self.assertEqual(machine.instance_id, "i-foobar")
126
"juju environment previously bootstrapped.\n")
128
provider = self.get_provider()
129
d = provider.bootstrap()
130
d.addCallback(validate_result)
133
def test_run_with_launch(self):
135
The provider bootstrap will launch an instance when run if there
136
is no existing instance.
138
self.s3.get_object(self.env_name, "provider-state")
139
self.mocker.result(succeed(""))
141
self.ec2.describe_security_groups()
142
self.mocker.result(succeed([
143
SecurityGroup("juju-%s" % self.env_name, "")]))
144
self._mock_create_machine_group(0)
145
self._mock_launch_utils(region="us-east-1")
147
self.mocker.result(succeed([self.get_instance("i-foobar")]))
151
def validate_result(result):
153
self.assert_machine(machine, "i-foobar", "")
154
provider = self.get_provider()
155
d = provider.bootstrap()
156
d.addCallback(validate_result)