1
+ import logging
1
2
from datetime import datetime
2
3
from typing import Any , List , Optional , Self , Union
3
4
from uuid import uuid4
4
5
5
6
import redis
6
7
from githubkit import Response
8
+ from githubkit .exception import RequestFailed
7
9
from githubkit .rest .models import AuthenticationToken
8
10
from githubkit .rest .models import Runner as GitHubRunner
9
11
from githubkit .webhooks .models import WorkflowJobInProgress
18
20
from runner_manager .backend .gcloud import GCPBackend
19
21
from runner_manager .clients .github import GitHub
20
22
from runner_manager .clients .github import RunnerGroup as GitHubRunnerGroup
21
- from runner_manager .logging import log
22
23
from runner_manager .models .base import BaseModel
23
24
from runner_manager .models .runner import Runner , RunnerLabel , RunnerStatus
24
25
26
+ log = logging .getLogger (__name__ )
27
+
25
28
26
29
class BaseRunnerGroup (PydanticBaseModel ):
27
30
name : str
@@ -51,8 +54,8 @@ class RunnerGroup(BaseModel, BaseRunnerGroup):
51
54
name : str = Field (index = True , full_text_search = True )
52
55
organization : str = Field (index = True , full_text_search = True )
53
56
repository : Optional [str ] = Field (index = True , full_text_search = True )
54
- max : Optional [ int ] = Field (index = True , ge = 1 , default = 20 )
55
- min : Optional [ int ] = Field (index = True , ge = 0 , default = 0 )
57
+ max : int = Field (index = True , ge = 1 , default = 20 )
58
+ min : int = Field (index = True , ge = 0 , default = 0 )
56
59
labels : List [str ] = Field (index = True )
57
60
58
61
def __post_init_post_parse__ (self ):
@@ -104,9 +107,10 @@ def create_runner(self, token: AuthenticationToken) -> Runner | None:
104
107
Runner: Runner instance.
105
108
"""
106
109
count = len (self .get_runners ())
107
- if count < ( self .max or 0 ) :
110
+ if count < self .max :
108
111
runner : Runner = Runner (
109
112
name = self .generate_runner_name (),
113
+ organization = self .organization ,
110
114
status = RunnerStatus .offline ,
111
115
token = token .token ,
112
116
busy = False ,
@@ -116,22 +120,9 @@ def create_runner(self, token: AuthenticationToken) -> Runner | None:
116
120
labels = self .runner_labels ,
117
121
manager = self .manager ,
118
122
)
119
- runner .save ()
123
+ runner = runner .save ()
120
124
return self .backend .create (runner )
121
125
return None
122
- runner : Runner = Runner (
123
- name = self .generate_runner_name (),
124
- status = RunnerStatus .offline ,
125
- token = token .token ,
126
- busy = False ,
127
- runner_group_id = self .id ,
128
- runner_group_name = self .name ,
129
- labels = self .runner_labels ,
130
- manager = self .manager ,
131
- organization = self .organization ,
132
- )
133
- runner .save ()
134
- return self .backend .create (runner )
135
126
136
127
def update_runner (self : Self , webhook : WorkflowJobInProgress ) -> Runner :
137
128
"""Update a runner instance.
@@ -192,6 +183,9 @@ def save(
192
183
Returns:
193
184
RunnerGroup: Runner group instance.
194
185
"""
186
+ # add label "self-hosted" to the list of labels
187
+ if "self-hosted" not in self .labels :
188
+ self .labels .append ("self-hosted" )
195
189
if github :
196
190
github_group : GitHubRunnerGroup = self .create_github_group (github )
197
191
self .id = github_group .id
@@ -279,6 +273,24 @@ def find_from_base(cls, basegroup: "BaseRunnerGroup") -> "RunnerGroup":
279
273
group = None
280
274
return group
281
275
276
+ def delete_github_group (self , github : GitHub ) -> Response [GitHubRunnerGroup ] | None :
277
+ """Delete a GitHub runner group."""
278
+ if self .id :
279
+ # check if runner group exists
280
+ try :
281
+ github .rest .actions .get_self_hosted_runner_group_for_org (
282
+ org = self .organization ,
283
+ runner_group_id = self .id ,
284
+ )
285
+ except RequestFailed :
286
+ log .info ("Runner group does not exist" )
287
+ return None
288
+ return github .rest .actions .delete_self_hosted_runner_group_from_org (
289
+ org = self .organization , runner_group_id = self .id
290
+ )
291
+
292
+ return None
293
+
282
294
@classmethod
283
295
def delete (
284
296
cls ,
@@ -303,10 +315,8 @@ def delete(
303
315
runners : List [Runner ] = group .get_runners ()
304
316
for runner in runners :
305
317
group .delete_runner (runner )
306
- if github and group .id :
307
- github .rest .actions .delete_self_hosted_runner_group_from_org (
308
- org = group .organization , runner_group_id = group .id
309
- )
318
+ if github :
319
+ group .delete_github_group (github )
310
320
db = cls ._get_db (pipeline )
311
321
312
322
return cls ._delete (db , cls .make_primary_key (pk ))
0 commit comments