in api/PclusterApiHandler.py [0:0]
def get_dcv_session():
start = time.time()
user = request.args.get("user", "ec2-user")
instance_id = request.args.get("instance_id")
dcv_command = "/opt/parallelcluster/scripts/pcluster_dcv_connect.sh"
session_directory = f"/home/{user}"
if request.args.get("region"):
config = botocore.config.Config(region_name=request.args.get("region"))
ssm = boto3.client("ssm", config=config)
else:
ssm = boto3.client("ssm")
command = f"runuser -l {user} -c '{dcv_command} {session_directory}'"
ssm_resp = ssm.send_command(
InstanceIds=[instance_id],
DocumentName="AWS-RunShellScript",
Comment="Create DCV Session",
Parameters={"commands": [command]},
)
command_id = ssm_resp["Command"]["CommandId"]
# Wait for command to complete
time.sleep(0.75)
while time.time() - start < 15:
status = ssm.get_command_invocation(CommandId=command_id, InstanceId=instance_id)
if status["Status"] != "InProgress":
break
time.sleep(0.75)
if time.time() - start > 15:
raise Exception("Timed out waiting for dcv session to start.")
if status["Status"] != "Success":
raise Exception(status["StandardErrorContent"])
output = status["StandardOutputContent"]
dcv_parameters = re.search(
r"PclusterDcvServerPort=([\d]+) PclusterDcvSessionId=([\w]+) PclusterDcvSessionToken=([\w-]+)", output
)
if not dcv_parameters:
raise Exception("Something went wrong during DCV connection. Check logs in /var/log/parallelcluster/ .")
ret = {
"port": dcv_parameters.group(1),
"session_id": dcv_parameters.group(2),
"session_token": dcv_parameters.group(3),
}
return ret