blob: 9c6f7ac45eb939e735b990e29c800ef4b3697d79 [file] [log] [blame]
Adam Israel1a15d1c2017-10-23 12:00:49 -04001import asyncio
Adam Israeldcdf82b2017-08-15 15:26:43 -04002import pytest
3import uuid
4
Adam Israelc3e6c2e2018-03-01 09:31:50 -05005from juju.client.connection import Connection
Adam Israeldcdf82b2017-08-15 15:26:43 -04006from juju.errors import JujuAPIError
7
Adam Israelc3e6c2e2018-03-01 09:31:50 -05008import pytest
9
10from .. import base
11
Adam Israeldcdf82b2017-08-15 15:26:43 -040012
13@base.bootstrapped
14@pytest.mark.asyncio
Adam Israel1a15d1c2017-10-23 12:00:49 -040015async def test_add_remove_user(event_loop):
Adam Israeldcdf82b2017-08-15 15:26:43 -040016 async with base.CleanController() as controller:
17 username = 'test{}'.format(uuid.uuid4())
Adam Israel1a15d1c2017-10-23 12:00:49 -040018 user = await controller.get_user(username)
19 assert user is None
20 user = await controller.add_user(username)
21 assert user is not None
22 assert user.username == username
23 users = await controller.get_users()
24 assert any(u.username == username for u in users)
25 await controller.remove_user(username)
26 user = await controller.get_user(username)
27 assert user is None
28 users = await controller.get_users()
29 assert not any(u.username == username for u in users)
Adam Israeldcdf82b2017-08-15 15:26:43 -040030
31
32@base.bootstrapped
33@pytest.mark.asyncio
34async def test_disable_enable_user(event_loop):
35 async with base.CleanController() as controller:
36 username = 'test-disable{}'.format(uuid.uuid4())
Adam Israel1a15d1c2017-10-23 12:00:49 -040037 user = await controller.add_user(username)
38
39 await user.disable()
40 assert not user.enabled
41 assert user.disabled
42
43 fresh = await controller.get_user(username) # fetch fresh copy
44 assert not fresh.enabled
45 assert fresh.disabled
46
47 await user.enable()
48 assert user.enabled
49 assert not user.disabled
50
51 fresh = await controller.get_user(username) # fetch fresh copy
52 assert fresh.enabled
53 assert not fresh.disabled
Adam Israeldcdf82b2017-08-15 15:26:43 -040054
55
56@base.bootstrapped
57@pytest.mark.asyncio
58async def test_change_user_password(event_loop):
59 async with base.CleanController() as controller:
60 username = 'test-password{}'.format(uuid.uuid4())
Adam Israel1a15d1c2017-10-23 12:00:49 -040061 user = await controller.add_user(username)
62 await user.set_password('password')
Adam Israelc3e6c2e2018-03-01 09:31:50 -050063 # Check that we can connect with the new password.
64 new_connection = None
Adam Israeldcdf82b2017-08-15 15:26:43 -040065 try:
Adam Israelc3e6c2e2018-03-01 09:31:50 -050066 kwargs = controller.connection().connect_params()
67 kwargs['username'] = username
68 kwargs['password'] = 'password'
69 new_connection = await Connection.connect(**kwargs)
Adam Israeldcdf82b2017-08-15 15:26:43 -040070 except JujuAPIError:
Adam Israel1a15d1c2017-10-23 12:00:49 -040071 raise AssertionError('Unable to connect with new password')
72 finally:
Adam Israelc3e6c2e2018-03-01 09:31:50 -050073 if new_connection:
74 await new_connection.close()
Adam Israeldcdf82b2017-08-15 15:26:43 -040075
76
77@base.bootstrapped
78@pytest.mark.asyncio
Adam Israel1a15d1c2017-10-23 12:00:49 -040079async def test_grant_revoke(event_loop):
Adam Israeldcdf82b2017-08-15 15:26:43 -040080 async with base.CleanController() as controller:
81 username = 'test-grant{}'.format(uuid.uuid4())
Adam Israel1a15d1c2017-10-23 12:00:49 -040082 user = await controller.add_user(username)
83 await user.grant('superuser')
84 assert user.access == 'superuser'
85 fresh = await controller.get_user(username) # fetch fresh copy
86 assert fresh.access == 'superuser'
Adam Israelc3e6c2e2018-03-01 09:31:50 -050087 await user.grant('login') # already has 'superuser', so no-op
88 assert user.access == 'superuser'
Adam Israel1a15d1c2017-10-23 12:00:49 -040089 fresh = await controller.get_user(username) # fetch fresh copy
Adam Israelc3e6c2e2018-03-01 09:31:50 -050090 assert fresh.access == 'superuser'
Adam Israel1a15d1c2017-10-23 12:00:49 -040091 await user.revoke()
92 assert user.access is ''
93 fresh = await controller.get_user(username) # fetch fresh copy
94 assert fresh.access is ''
Adam Israeldcdf82b2017-08-15 15:26:43 -040095
96
97@base.bootstrapped
98@pytest.mark.asyncio
Adam Israel1a15d1c2017-10-23 12:00:49 -040099async def test_list_models(event_loop):
Adam Israeldcdf82b2017-08-15 15:26:43 -0400100 async with base.CleanController() as controller:
Adam Israel1a15d1c2017-10-23 12:00:49 -0400101 async with base.CleanModel() as model:
102 result = await controller.list_models()
103 assert model.info.name in result
104
105
106@base.bootstrapped
107@pytest.mark.asyncio
108async def test_get_model(event_loop):
109 async with base.CleanController() as controller:
110 by_name, by_uuid = None, None
111 model_name = 'test-{}'.format(uuid.uuid4())
112 model = await controller.add_model(model_name)
113 model_uuid = model.info.uuid
114 await model.disconnect()
115 try:
116 by_name = await controller.get_model(model_name)
117 by_uuid = await controller.get_model(model_uuid)
118 assert by_name.info.name == model_name
119 assert by_name.info.uuid == model_uuid
120 assert by_uuid.info.name == model_name
121 assert by_uuid.info.uuid == model_uuid
122 finally:
123 if by_name:
124 await by_name.disconnect()
125 if by_uuid:
126 await by_uuid.disconnect()
127 await controller.destroy_model(model_name)
128
129
Adam Israelc3e6c2e2018-03-01 09:31:50 -0500130async def _wait_for_model(controller, model_name):
131 while model_name not in await controller.list_models():
132 await asyncio.sleep(0.5, loop=controller.loop)
133
134
Adam Israel1a15d1c2017-10-23 12:00:49 -0400135async def _wait_for_model_gone(controller, model_name):
136 while model_name in await controller.list_models():
137 await asyncio.sleep(0.5, loop=controller.loop)
138
139
140@base.bootstrapped
141@pytest.mark.asyncio
142async def test_destroy_model_by_name(event_loop):
143 async with base.CleanController() as controller:
144 model_name = 'test-{}'.format(uuid.uuid4())
145 model = await controller.add_model(model_name)
146 await model.disconnect()
Adam Israelc3e6c2e2018-03-01 09:31:50 -0500147 await asyncio.wait_for(_wait_for_model(controller,
148 model_name),
149 timeout=60)
Adam Israel1a15d1c2017-10-23 12:00:49 -0400150 await controller.destroy_model(model_name)
151 await asyncio.wait_for(_wait_for_model_gone(controller,
152 model_name),
153 timeout=60)
154
155
156@base.bootstrapped
157@pytest.mark.asyncio
158async def test_add_destroy_model_by_uuid(event_loop):
159 async with base.CleanController() as controller:
160 model_name = 'test-{}'.format(uuid.uuid4())
161 model = await controller.add_model(model_name)
162 model_uuid = model.info.uuid
163 await model.disconnect()
Adam Israelc3e6c2e2018-03-01 09:31:50 -0500164 await asyncio.wait_for(_wait_for_model(controller,
165 model_name),
166 timeout=60)
Adam Israel1a15d1c2017-10-23 12:00:49 -0400167 await controller.destroy_model(model_uuid)
168 await asyncio.wait_for(_wait_for_model_gone(controller,
169 model_name),
170 timeout=60)