diff --git a/controllers/horizontal_runner_autoscaler_webhook.go b/controllers/horizontal_runner_autoscaler_webhook.go index 0dc101d4..89ad7113 100644 --- a/controllers/horizontal_runner_autoscaler_webhook.go +++ b/controllers/horizontal_runner_autoscaler_webhook.go @@ -146,8 +146,8 @@ func (autoscaler *HorizontalRunnerAutoscalerGitHubWebhook) Handle(w http.Respons case *gogithub.CheckRunEvent: target, err = autoscaler.getScaleUpTarget( context.TODO(), - *e.Repo.Name, - *e.Org.Name, + e.GetRepo().GetName(), + e.GetOrg().GetLogin(), // empty string if the repo is not in an organization autoscaler.MatchCheckRunEvent(e), ) case *gogithub.PingEvent: diff --git a/controllers/horizontal_runner_autoscaler_webhook_test.go b/controllers/horizontal_runner_autoscaler_webhook_test.go index b6c76ac5..0e412359 100644 --- a/controllers/horizontal_runner_autoscaler_webhook_test.go +++ b/controllers/horizontal_runner_autoscaler_webhook_test.go @@ -14,6 +14,7 @@ import ( "net/http" "net/http/httptest" "net/url" + "os" "sigs.k8s.io/controller-runtime/pkg/client/fake" "testing" ) @@ -28,20 +29,18 @@ func init() { } func TestWebhookCheckRun(t *testing.T) { + f, err := os.Open("testdata/webhook_check_run_payload.json") + if err != nil { + t.Fatalf("could not open the fixture: %s", err) + } + defer f.Close() + var e github.CheckRunEvent + if err := json.NewDecoder(f).Decode(&e); err != nil { + t.Fatalf("invalid json: %s", err) + } testServer(t, "check_run", - &github.CheckRunEvent{ - CheckRun: &github.CheckRun{ - Status: github.String("queued"), - }, - Repo: &github.Repository{ - Name: github.String("myorg/myrepo"), - }, - Org: &github.Organization{ - Name: github.String("myorg"), - }, - Action: github.String("created"), - }, + &e, 200, "no horizontalrunnerautoscaler to scale for this github event", ) diff --git a/controllers/testdata/webhook_check_run_payload.json b/controllers/testdata/webhook_check_run_payload.json new file mode 100644 index 00000000..cb0f6827 --- /dev/null +++ b/controllers/testdata/webhook_check_run_payload.json @@ -0,0 +1,373 @@ +{ + "action": "created", + "check_run": { + "id": 1234567890, + "node_id": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", + "head_sha": "1234567890123456789012345678901234567890", + "external_id": "92058b04-f16a-5035-546c-cae3ad5e2f5f", + "url": "https://api.github.com/repos/MYORG/MYREPO/check-runs/123467890", + "html_url": "https://github.com/MYORG/MYREPO/runs/123467890", + "details_url": "https://github.com/MYORG/MYREPO/runs/123467890", + "status": "queued", + "conclusion": null, + "started_at": "2021-02-18T06:16:31Z", + "completed_at": null, + "output": { + "title": null, + "summary": null, + "text": null, + "annotations_count": 0, + "annotations_url": "https://api.github.com/repos/MYORG/MYREPO/check-runs/123467890/annotations" + }, + "name": "validate", + "check_suite": { + "id": 1234567890, + "node_id": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", + "head_branch": "MYNAME/actions-runner-controller-webhook", + "head_sha": "1234567890123456789012345678901234567890", + "status": "queued", + "conclusion": null, + "url": "https://api.github.com/repos/MYORG/MYREPO/check-suites/1234567890", + "before": "1234567890123456789012345678901234567890", + "after": "1234567890123456789012345678901234567890", + "pull_requests": [ + { + "url": "https://api.github.com/repos/MYORG/MYREPO/pulls/2033", + "id": 1234567890, + "number": 1234567890, + "head": { + "ref": "feature", + "sha": "1234567890123456789012345678901234567890", + "repo": { + "id": 1234567890, + "url": "https://api.github.com/repos/MYORG/MYREPO", + "name": "MYREPO" + } + }, + "base": { + "ref": "master", + "sha": "1234567890123456789012345678901234567890", + "repo": { + "id": 1234567890, + "url": "https://api.github.com/repos/MYORG/MYREPO", + "name": "MYREPO" + } + } + } + ], + "app": { + "id": 1234567890, + "slug": "github-actions", + "node_id": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", + "owner": { + "login": "github", + "id": 1234567890, + "node_id": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", + "avatar_url": "https://avatars.githubusercontent.com/u/123467890?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github", + "html_url": "https://github.com/github", + "followers_url": "https://api.github.com/users/github/followers", + "following_url": "https://api.github.com/users/github/following{/other_user}", + "gists_url": "https://api.github.com/users/github/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github/subscriptions", + "organizations_url": "https://api.github.com/users/github/orgs", + "repos_url": "https://api.github.com/users/github/repos", + "events_url": "https://api.github.com/users/github/events{/privacy}", + "received_events_url": "https://api.github.com/users/github/received_events", + "type": "Organization", + "site_admin": false + }, + "name": "GitHub Actions", + "description": "Automate your workflow from idea to production", + "external_url": "https://help.github.com/en/actions", + "html_url": "https://github.com/apps/github-actions", + "created_at": "2018-07-30T09:30:17Z", + "updated_at": "2019-12-10T19:04:12Z", + "permissions": { + "actions": "write", + "checks": "write", + "contents": "write", + "deployments": "write", + "issues": "write", + "metadata": "read", + "organization_packages": "write", + "packages": "write", + "pages": "write", + "pull_requests": "write", + "repository_hooks": "write", + "repository_projects": "write", + "security_events": "write", + "statuses": "write", + "vulnerability_alerts": "read" + }, + "events": [ + "check_run", + "check_suite", + "create", + "delete", + "deployment", + "deployment_status", + "fork", + "gollum", + "issues", + "issue_comment", + "label", + "milestone", + "page_build", + "project", + "project_card", + "project_column", + "public", + "pull_request", + "pull_request_review", + "pull_request_review_comment", + "push", + "registry_package", + "release", + "repository", + "repository_dispatch", + "status", + "watch", + "workflow_dispatch", + "workflow_run" + ] + }, + "created_at": "2021-02-18T06:15:32Z", + "updated_at": "2021-02-18T06:16:31Z" + }, + "app": { + "id": 1234567890, + "slug": "github-actions", + "node_id": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", + "owner": { + "login": "github", + "id": 1234567890, + "node_id": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", + "avatar_url": "https://avatars.githubusercontent.com/u/1234567890?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github", + "html_url": "https://github.com/github", + "followers_url": "https://api.github.com/users/github/followers", + "following_url": "https://api.github.com/users/github/following{/other_user}", + "gists_url": "https://api.github.com/users/github/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github/subscriptions", + "organizations_url": "https://api.github.com/users/github/orgs", + "repos_url": "https://api.github.com/users/github/repos", + "events_url": "https://api.github.com/users/github/events{/privacy}", + "received_events_url": "https://api.github.com/users/github/received_events", + "type": "Organization", + "site_admin": false + }, + "name": "GitHub Actions", + "description": "Automate your workflow from idea to production", + "external_url": "https://help.github.com/en/actions", + "html_url": "https://github.com/apps/github-actions", + "created_at": "2018-07-30T09:30:17Z", + "updated_at": "2019-12-10T19:04:12Z", + "permissions": { + "actions": "write", + "checks": "write", + "contents": "write", + "deployments": "write", + "issues": "write", + "metadata": "read", + "organization_packages": "write", + "packages": "write", + "pages": "write", + "pull_requests": "write", + "repository_hooks": "write", + "repository_projects": "write", + "security_events": "write", + "statuses": "write", + "vulnerability_alerts": "read" + }, + "events": [ + "check_run", + "check_suite", + "create", + "delete", + "deployment", + "deployment_status", + "fork", + "gollum", + "issues", + "issue_comment", + "label", + "milestone", + "page_build", + "project", + "project_card", + "project_column", + "public", + "pull_request", + "pull_request_review", + "pull_request_review_comment", + "push", + "registry_package", + "release", + "repository", + "repository_dispatch", + "status", + "watch", + "workflow_dispatch", + "workflow_run" + ] + }, + "pull_requests": [ + { + "url": "https://api.github.com/repos/MYORG/MYREPO/pulls/1234567890", + "id": 1234567890, + "number": 1234567890, + "head": { + "ref": "feature", + "sha": "1234567890123456789012345678901234567890", + "repo": { + "id": 1234567890, + "url": "https://api.github.com/repos/MYORG/MYREPO", + "name": "MYREPO" + } + }, + "base": { + "ref": "master", + "sha": "1234567890123456789012345678901234567890", + "repo": { + "id": 1234567890, + "url": "https://api.github.com/repos/MYORG/MYREPO", + "name": "MYREPO" + } + } + } + ] + }, + "repository": { + "id": 1234567890, + "node_id": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", + "name": "MYREPO", + "full_name": "MYORG/MYREPO", + "private": true, + "owner": { + "login": "MYORG", + "id": 1234567890, + "node_id": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", + "avatar_url": "https://avatars.githubusercontent.com/u/1234567890?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/MYORG", + "html_url": "https://github.com/MYORG", + "followers_url": "https://api.github.com/users/MYORG/followers", + "following_url": "https://api.github.com/users/MYORG/following{/other_user}", + "gists_url": "https://api.github.com/users/MYORG/gists{/gist_id}", + "starred_url": "https://api.github.com/users/MYORG/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/MYORG/subscriptions", + "organizations_url": "https://api.github.com/users/MYORG/orgs", + "repos_url": "https://api.github.com/users/MYORG/repos", + "events_url": "https://api.github.com/users/MYORG/events{/privacy}", + "received_events_url": "https://api.github.com/users/MYORG/received_events", + "type": "Organization", + "site_admin": false + }, + "html_url": "https://github.com/MYORG/MYREPO", + "description": "MYREPO", + "fork": false, + "url": "https://api.github.com/repos/MYORG/MYREPO", + "forks_url": "https://api.github.com/repos/MYORG/MYREPO/forks", + "keys_url": "https://api.github.com/repos/MYORG/MYREPO/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/MYORG/MYREPO/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/MYORG/MYREPO/teams", + "hooks_url": "https://api.github.com/repos/MYORG/MYREPO/hooks", + "issue_events_url": "https://api.github.com/repos/MYORG/MYREPO/issues/events{/number}", + "events_url": "https://api.github.com/repos/MYORG/MYREPO/events", + "assignees_url": "https://api.github.com/repos/MYORG/MYREPO/assignees{/user}", + "branches_url": "https://api.github.com/repos/MYORG/MYREPO/branches{/branch}", + "tags_url": "https://api.github.com/repos/MYORG/MYREPO/tags", + "blobs_url": "https://api.github.com/repos/MYORG/MYREPO/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/MYORG/MYREPO/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/MYORG/MYREPO/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/MYORG/MYREPO/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/MYORG/MYREPO/statuses/{sha}", + "languages_url": "https://api.github.com/repos/MYORG/MYREPO/languages", + "stargazers_url": "https://api.github.com/repos/MYORG/MYREPO/stargazers", + "contributors_url": "https://api.github.com/repos/MYORG/MYREPO/contributors", + "subscribers_url": "https://api.github.com/repos/MYORG/MYREPO/subscribers", + "subscription_url": "https://api.github.com/repos/MYORG/MYREPO/subscription", + "commits_url": "https://api.github.com/repos/MYORG/MYREPO/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/MYORG/MYREPO/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/MYORG/MYREPO/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/MYORG/MYREPO/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/MYORG/MYREPO/contents/{+path}", + "compare_url": "https://api.github.com/repos/MYORG/MYREPO/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/MYORG/MYREPO/merges", + "archive_url": "https://api.github.com/repos/MYORG/MYREPO/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/MYORG/MYREPO/downloads", + "issues_url": "https://api.github.com/repos/MYORG/MYREPO/issues{/number}", + "pulls_url": "https://api.github.com/repos/MYORG/MYREPO/pulls{/number}", + "milestones_url": "https://api.github.com/repos/MYORG/MYREPO/milestones{/number}", + "notifications_url": "https://api.github.com/repos/MYORG/MYREPO/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/MYORG/MYREPO/labels{/name}", + "releases_url": "https://api.github.com/repos/MYORG/MYREPO/releases{/id}", + "deployments_url": "https://api.github.com/repos/MYORG/MYREPO/deployments", + "created_at": "2017-08-10T02:21:10Z", + "updated_at": "2021-02-18T04:40:55Z", + "pushed_at": "2021-02-18T06:15:30Z", + "git_url": "git://github.com/MYORG/MYREPO.git", + "ssh_url": "git@github.com:MYORG/MYREPO.git", + "clone_url": "https://github.com/MYORG/MYREPO.git", + "svn_url": "https://github.com/MYORG/MYREPO", + "homepage": null, + "size": 30782, + "stargazers_count": 2, + "watchers_count": 2, + "language": "Shell", + "has_issues": false, + "has_projects": true, + "has_downloads": true, + "has_wiki": false, + "has_pages": false, + "forks_count": 0, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 6, + "license": null, + "forks": 0, + "open_issues": 6, + "watchers": 2, + "default_branch": "master" + }, + "organization": { + "login": "MYORG", + "id": 1234567890, + "node_id": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", + "url": "https://api.github.com/orgs/MYORG", + "repos_url": "https://api.github.com/orgs/MYORG/repos", + "events_url": "https://api.github.com/orgs/MYORG/events", + "hooks_url": "https://api.github.com/orgs/MYORG/hooks", + "issues_url": "https://api.github.com/orgs/MYORG/issues", + "members_url": "https://api.github.com/orgs/MYORG/members{/member}", + "public_members_url": "https://api.github.com/orgs/MYORG/public_members{/member}", + "avatar_url": "https://avatars.githubusercontent.com/u/1234567890?v=4", + "description": "" + }, + "sender": { + "login": "MYNAME", + "id": 1234567890, + "node_id": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", + "avatar_url": "https://avatars.githubusercontent.com/u/1234567890?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/MYNAME", + "html_url": "https://github.com/MYNAME", + "followers_url": "https://api.github.com/users/MYNAME/followers", + "following_url": "https://api.github.com/users/MYNAME/following{/other_user}", + "gists_url": "https://api.github.com/users/MYNAME/gists{/gist_id}", + "starred_url": "https://api.github.com/users/MYNAME/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/MYNAME/subscriptions", + "organizations_url": "https://api.github.com/users/MYNAME/orgs", + "repos_url": "https://api.github.com/users/MYNAME/repos", + "events_url": "https://api.github.com/users/MYNAME/events{/privacy}", + "received_events_url": "https://api.github.com/users/MYNAME/received_events", + "type": "User", + "site_admin": false + } +}