78322e7923f22f5f0afc8b5cdd26dafc324141c3
2 import concurrent
.futures
4 from pathlib
import Path
7 async def execute_process(*cmd
, log
=None):
9 Wrapper around asyncio.create_subprocess_exec.
12 p
= await asyncio
.create_subprocess_exec(
14 stdin
=asyncio
.subprocess
.PIPE
,
15 stdout
=asyncio
.subprocess
.PIPE
,
16 stderr
=asyncio
.subprocess
.PIPE
,
18 stdout
, stderr
= await p
.communicate()
20 log
.debug("Exec %s -> %d", cmd
, p
.returncode
)
22 log
.debug(stdout
.decode('utf-8'))
24 log
.debug(stderr
.decode('utf-8'))
25 return p
.returncode
== 0
30 Inner function for read_ssh_key, suitable for passing to our
34 default_data_dir
= Path(Path
.home(), ".local", "share", "juju")
35 juju_data
= os
.environ
.get("JUJU_DATA", default_data_dir
)
36 ssh_key_path
= Path(juju_data
, 'ssh', 'juju_id_rsa.pub')
37 with ssh_key_path
.open('r') as ssh_key_file
:
38 ssh_key
= ssh_key_file
.readlines()[0].strip()
42 async def read_ssh_key(loop
):
44 Attempt to read the local juju admin's public ssh key, so that it
45 can be passed on to a model.
48 ssh_key
= await loop
.run_in_executor(
49 concurrent
.futures
.ThreadPoolExecutor(),