Skip to content

Commit c370bee

Browse files
authored
Get deployment status with request user's id token (#735)
Should fix Ready status updates for tool deployments
1 parent 504ee08 commit c370bee

File tree

5 files changed

+42
-26
lines changed

5 files changed

+42
-26
lines changed

controlpanel/api/cluster.py

+10-9
Original file line numberDiff line numberDiff line change
@@ -395,9 +395,9 @@ def deploy_tool(tool, user, **kwargs):
395395
raise ToolDeploymentError(error)
396396

397397

398-
def list_tool_deployments(user, search_name=None, search_version=None):
398+
def list_tool_deployments(user, id_token=None, search_name=None, search_version=None):
399399
deployments = []
400-
k8s = KubernetesClient()
400+
k8s = KubernetesClient(id_token=id_token)
401401
results = k8s.AppsV1Api.list_namespaced_deployment(user.k8s_namespace)
402402
for deployment in results.items:
403403
app_name = deployment.metadata.labels["app"]
@@ -410,11 +410,12 @@ def list_tool_deployments(user, search_name=None, search_version=None):
410410
return deployments
411411

412412

413-
def get_tool_deployment(tool_deployment):
413+
def get_tool_deployment(tool_deployment, **kwargs):
414414
deployments = list_tool_deployments(
415415
tool_deployment.user,
416416
search_name=tool_deployment.tool.chart_name,
417417
# search_version=tool_deployment.tool.version,
418+
**kwargs,
418419
)
419420

420421
if not deployments:
@@ -427,17 +428,17 @@ def get_tool_deployment(tool_deployment):
427428
return deployments[0]
428429

429430

430-
def delete_tool_deployment(tool_deployment):
431-
deployment = get_tool_deployment(tool_deployment)
431+
def delete_tool_deployment(tool_deployment, **kwargs):
432+
deployment = get_tool_deployment(tool_deployment, **kwargs)
432433
helm.delete(
433434
deployment.metadata.name,
434435
f"--namespace={tool_deployment.user.k8s_namespace}",
435436
)
436437

437438

438-
def get_tool_deployment_status(tool_deployment):
439+
def get_tool_deployment_status(tool_deployment, **kwargs):
439440
try:
440-
deployment = get_tool_deployment(tool_deployment)
441+
deployment = get_tool_deployment(tool_deployment, **kwargs)
441442

442443
except ObjectDoesNotExist:
443444
log.warning(f"{tool_deployment} not found")
@@ -470,8 +471,8 @@ def get_tool_deployment_status(tool_deployment):
470471
)
471472
return TOOL_STATUS_UNKNOWN
472473

473-
def restart_tool_deployment(tool_deployment):
474-
k8s = KubernetesClient()
474+
def restart_tool_deployment(tool_deployment, id_token=None):
475+
k8s = KubernetesClient(id_token=id_token)
475476
return k8s.AppsV1Api.delete_collection_namespaced_replica_set(
476477
tool_deployment.user.k8s_namespace,
477478
label_selector=(

controlpanel/api/models/tool.py

+12-3
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ class ToolDeployment:
7474
objects = ToolDeploymentManager()
7575

7676
def __init__(self, tool, user):
77+
self._id_token = None
7778
self._subprocess = None
7879
self.tool = tool
7980
self.user = user
@@ -95,6 +96,7 @@ def save(self, *args, **kwargs):
9596
"""
9697
Deploy the tool to the cluster (asynchronous)
9798
"""
99+
self._id_token = kwargs.get('id_token')
98100
self._subprocess = cluster.deploy_tool(self.tool, self.user)
99101

100102
@property
@@ -109,7 +111,10 @@ def status(self):
109111
if status:
110112
return status
111113

112-
return cluster.get_tool_deployment_status(self)
114+
return cluster.get_tool_deployment_status(
115+
self,
116+
id_token=self._id_token,
117+
)
113118

114119
def _poll(self):
115120
"""
@@ -129,9 +134,13 @@ def _poll(self):
129134
def url(self):
130135
return f"https://{self.host}/"
131136

132-
def restart(self):
137+
def restart(self, **kwargs):
133138
"""
134139
Restart the tool deployment
135140
"""
136-
cluster.restart_tool_deployment(self)
141+
self._id_token = kwargs.get('id_token')
142+
cluster.restart_tool_deployment(
143+
self,
144+
id_token=self._id_token,
145+
)
137146

controlpanel/frontend/consumers.py

+16-12
Original file line numberDiff line numberDiff line change
@@ -106,16 +106,13 @@ def tool_deploy(self, message):
106106
Expects a message with `tool_name`, `version` and `user_id` values
107107
"""
108108

109-
tool = Tool.objects.get(
110-
chart_name=message['tool_name'],
111-
# version=message['version'],
112-
)
113-
user = User.objects.get(auth0_id=message['user_id'])
109+
tool, user = self.get_tool_and_user(message)
114110

115111
update_tool_status(user, tool, TOOL_DEPLOYING)
116112

117113
try:
118-
deployment = ToolDeployment.objects.create(tool, user)
114+
deployment = ToolDeployment(tool, user)
115+
deployment.save(id_token=message.get('id_token'))
119116

120117
except ToolDeployment.Error as err:
121118
update_tool_status(user, tool, TOOL_DEPLOY_FAILED)
@@ -130,16 +127,15 @@ def tool_deploy(self, message):
130127
log.debug(f"Deployed {tool.name} for {user}")
131128

132129
def tool_restart(self, message):
133-
tool = Tool.objects.get(
134-
chart_name=message['tool_name'],
135-
# version=message['version'],
136-
)
137-
user = User.objects.get(auth0_id=message['user_id'])
130+
"""
131+
Restart the named tool for the specified user
132+
"""
133+
tool, user = self.get_tool_and_user(message)
138134

139135
update_tool_status(user, tool, "Restarting")
140136

141137
deployment = ToolDeployment(tool, user)
142-
deployment.restart()
138+
deployment.restart(id_token=message.get('id_token'))
143139

144140
status = wait_for_deployment(user, tool, deployment)
145141

@@ -148,6 +144,14 @@ def tool_restart(self, message):
148144
else:
149145
log.debug(f"Restarted {tool.name} for {user}")
150146

147+
def get_tool_and_user(self, message):
148+
tool = Tool.objects.get(
149+
chart_name=message['tool_name'],
150+
# version=message['version'],
151+
)
152+
user = User.objects.get(auth0_id=message['user_id'])
153+
return tool, user
154+
151155

152156
def send_sse(user_id, event):
153157
"""

controlpanel/frontend/static/javascripts/modules/tool-status.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ moj.Modules.toolStatus = {
3838
break;
3939
case 'READY':
4040
case 'IDLED':
41-
this.showActions(listener, ['open', 'remove']);
41+
this.showActions(listener, ['open', 'restart', 'remove']);
4242
break;
4343
case 'FAILED':
44-
this.showActions(listener, ['reset', 'remove']);
44+
this.showActions(listener, ['restart', 'remove']);
4545
break;
4646
}
4747
};

controlpanel/frontend/views/tool.py

+2
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ def get_redirect_url(self, *args, **kwargs):
4646
'tool_name': name,
4747
# 'version': self.request.POST['version'],
4848
'user_id': self.request.user.id,
49+
'id_token': self.request.user.get_id_token(),
4950
})
5051

5152
messages.success(
@@ -64,6 +65,7 @@ def get_redirect_url(self, *args, **kwargs):
6465
start_background_task('tool.restart', {
6566
'tool_name': name,
6667
'user_id': self.request.user.id,
68+
'id_token': self.request.user.get_id_token(),
6769
})
6870

6971
messages.success(

0 commit comments

Comments
 (0)