Skip to content

Commit 3195975

Browse files
authored
feat: add workspace management functions to CoderAPI (#91)
- Introduced methods for listing, deleting, and cleansing workspaces within the CoderAPI. - Implemented logic to delete dormant workspaces based on their scheduled deletion date. - Enhanced workspace management capabilities to improve user experience and maintain workspace organization.
1 parent ceb5fca commit 3195975

File tree

1 file changed

+47
-1
lines changed

1 file changed

+47
-1
lines changed

src/backend/coder.py

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import requests
22
import random
3+
from datetime import datetime
34
from config import CODER_API_KEY, CODER_URL, CODER_TEMPLATE_ID, CODER_DEFAULT_ORGANIZATION, CODER_WORKSPACE_NAME
45

56
class CoderAPI:
@@ -343,4 +344,49 @@ def set_workspace_dormancy(self, workspace_id, dormant: bool):
343344
headers['Content-Type'] = 'application/json'
344345
response = requests.put(endpoint, headers=headers, json=data)
345346
response.raise_for_status()
346-
return response.json()
347+
return response.json()
348+
349+
def list_workspaces(self, query=None, limit=None, offset=None):
350+
"""
351+
List all workspaces
352+
"""
353+
endpoint = f"{self.coder_url}/api/v2/workspaces"
354+
params = {}
355+
if query:
356+
params['q'] = query
357+
if limit:
358+
params['limit'] = limit
359+
if offset:
360+
params['offset'] = offset
361+
response = requests.get(endpoint, headers=self.headers, params=params)
362+
return response.json()
363+
364+
def delete_workspace(self, workspace_id):
365+
"""
366+
Delete a workspace
367+
"""
368+
endpoint = f"{self.coder_url}/api/v2/workspaces/{workspace_id}/builds"
369+
data = {
370+
"transition": "delete"
371+
}
372+
headers = self.headers.copy()
373+
headers['Content-Type'] = 'application/json'
374+
response = requests.post(endpoint, headers=headers, json=data)
375+
response.raise_for_status()
376+
return response.json()
377+
378+
def cleanse_workspaces(self, days_until_deleting: int):
379+
"""
380+
Cleanse workspaces that are due to be deleted
381+
"""
382+
result = self.list_workspaces(query="dormant:true")
383+
count = 0
384+
for workspace in result["workspaces"]:
385+
now = datetime.now()
386+
deleting_at = datetime.strptime(workspace["deleting_at"], "%Y-%m-%dT%H:%M:%S.%fZ")
387+
days_until_deleting = (deleting_at - now).days
388+
if days_until_deleting < days_until_deleting:
389+
count += 1
390+
print(f"[{count}] Deleting workspace {workspace['id']} from {workspace['owner_name']}, due deletion was in {days_until_deleting} days")
391+
self.delete_workspace(workspace["id"])
392+

0 commit comments

Comments
 (0)