Skip to content
This repository has been archived by the owner on Jun 28, 2023. It is now read-only.

Commit

Permalink
Fix self hosted runner Action field behavior change (#2881)
Browse files Browse the repository at this point in the history
  • Loading branch information
davidvonthenen authored Jan 20, 2022
1 parent 3ed5ed2 commit 7db20fd
Show file tree
Hide file tree
Showing 4 changed files with 211 additions and 64 deletions.
44 changes: 33 additions & 11 deletions hack/runner/webhook/aws.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@ const (
defaultInstanceToTagDelay int = 3
)

// Aws object
type Aws struct {
client *ec2.EC2
}

// get github client
func getAwsClientWithEnvToken() (*ec2.EC2, error) {
// creds from env
Expand Down Expand Up @@ -47,7 +52,22 @@ func getAwsClientWithEnvToken() (*ec2.EC2, error) {
return client, nil
}

func createEc2Runner(client *ec2.EC2, uniqueID, runnerToken string) (string, error) {
// NewAws generates a new Aws object
func NewAws() (*Aws, error) {
client, err := getAwsClientWithEnvToken()
if err != nil {
klog.Errorf("getAwsClientWithEnvToken failed. Err: %v\n", err)
return nil, err
}

mya := &Aws{
client: client,
}
return mya, nil
}

// CreateEc2Runner creates a runner
func (a *Aws) CreateEc2Runner(uniqueID, runnerToken string) (string, error) {
klog.V(6).Infof("uniqueID: %s\n", uniqueID)
klog.V(6).Infof("runnerToken: %s\n", runnerToken)

Expand All @@ -57,7 +77,7 @@ func createEc2Runner(client *ec2.EC2, uniqueID, runnerToken string) (string, err
awsSubnet := os.Getenv("AWS_SUBNET")

// Specify the details of the instance that you want to create.
runResult, err := client.RunInstances(&ec2.RunInstancesInput{
runResult, err := a.client.RunInstances(&ec2.RunInstancesInput{
ImageId: aws.String(awsAmi),
InstanceType: aws.String("t2.2xlarge"),
MinCount: aws.Int64(1),
Expand All @@ -78,7 +98,7 @@ func createEc2Runner(client *ec2.EC2, uniqueID, runnerToken string) (string, err
time.Sleep(time.Duration(defaultInstanceToTagDelay) * time.Second)

// Add tags to the created instance
_, err = client.CreateTags(&ec2.CreateTagsInput{
_, err = a.client.CreateTags(&ec2.CreateTagsInput{
Resources: []*string{runResult.Instances[0].InstanceId},
Tags: []*ec2.Tag{
{
Expand All @@ -94,7 +114,7 @@ func createEc2Runner(client *ec2.EC2, uniqueID, runnerToken string) (string, err
if err != nil {
klog.Errorf("CreateTags failed. Err: %v\n", err)

errDel := deleteEc2Instance(client, instanceID)
errDel := a.DeleteEc2Instance(instanceID)
if errDel != nil {
klog.Errorf("deleteEc2Instance failed. Err: %v\n", errDel)
}
Expand All @@ -103,13 +123,13 @@ func createEc2Runner(client *ec2.EC2, uniqueID, runnerToken string) (string, err
}

// wait for instance running
err = client.WaitUntilInstanceRunning(&ec2.DescribeInstancesInput{
err = a.client.WaitUntilInstanceRunning(&ec2.DescribeInstancesInput{
InstanceIds: []*string{aws.String(instanceID)},
})
if err != nil {
klog.Errorf("WaitUntilInstanceRunning failed. Err: %v\n", err)

errDel := deleteEc2Instance(client, instanceID)
errDel := a.DeleteEc2Instance(instanceID)
if errDel != nil {
klog.Errorf("deleteEc2Instance failed. Err: %v\n", errDel)
}
Expand All @@ -121,7 +141,8 @@ func createEc2Runner(client *ec2.EC2, uniqueID, runnerToken string) (string, err
return instanceID, nil
}

func deleteEc2InstanceByName(client *ec2.EC2, uniqueID string) error {
// DeleteEc2InstanceByName uhhh deletes an instance by name
func (a *Aws) DeleteEc2InstanceByName(uniqueID string) error {
klog.Infof("deleteEc2InstanceByName(%s)\n", uniqueID)

params := &ec2.DescribeInstancesInput{
Expand All @@ -135,7 +156,7 @@ func deleteEc2InstanceByName(client *ec2.EC2, uniqueID string) error {
},
}

result, err := client.DescribeInstances(params)
result, err := a.client.DescribeInstances(params)
if err != nil {
klog.Errorf("DescribeInstances failed. Err: %v\n", err.Error())
return err
Expand All @@ -151,7 +172,7 @@ func deleteEc2InstanceByName(client *ec2.EC2, uniqueID string) error {
for _, instance := range reservation.Instances {
klog.Infof("Attempt to Delete InstanceID: %s\n", *instance.InstanceId)

err := deleteEc2Instance(client, *instance.InstanceId)
err := a.DeleteEc2Instance(*instance.InstanceId)
if err != nil {
klog.Errorf("deleteEc2Instance failed. Err: %v\n", err)
return err
Expand All @@ -165,9 +186,10 @@ func deleteEc2InstanceByName(client *ec2.EC2, uniqueID string) error {
return nil
}

func deleteEc2Instance(client *ec2.EC2, instanceID string) error {
// DeleteEc2Instance uhhh deletes an instance by ID
func (a *Aws) DeleteEc2Instance(instanceID string) error {
// Specify the details of the instance that you want to create.
_, err := client.TerminateInstances(&ec2.TerminateInstancesInput{
_, err := a.client.TerminateInstances(&ec2.TerminateInstancesInput{
InstanceIds: []*string{aws.String(instanceID)},
})
if err != nil {
Expand Down
82 changes: 53 additions & 29 deletions hack/runner/webhook/github.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,10 @@ import (
)

const (
runnerIdle string = "idle"
runnerOnline string = "online"
runnerActive string = "active"
// runnerOffline string = "offline"
)

// Errors
Expand All @@ -26,8 +29,16 @@ var (

// ErrRunnerOffline Runner is offline
ErrRunnerOffline = errors.New("runner is offline")

// ErrRunnerIsBusy Runner is busy
ErrRunnerIsBusy = errors.New("runner is busy")
)

// GitHub object
type GitHub struct {
client *github.Client
}

// get github client
func getGitHubClientWithEnvToken() (*github.Client, error) {
token := os.Getenv("GITHUB_TOKEN")
Expand All @@ -53,14 +64,23 @@ func getGitHubClientWithEnvToken() (*github.Client, error) {
return client, nil
}

func createRunnerToken(client *github.Client) (string, error) {
if client == nil {
err := ErrClientInvalid
klog.Errorf("Client == nil. Err: %v\n", err)
return "", err
// NewGitHub generates a new GH object
func NewGitHub() (*GitHub, error) {
client, err := getGitHubClientWithEnvToken()
if err != nil {
klog.Errorf("getGitHubClientWithEnvToken failed. Err: %v\n", err)
return nil, err
}

token, _, err := client.Actions.CreateRegistrationToken(context.Background(), "vmware-tanzu", "community-edition")
mygh := &GitHub{
client: client,
}
return mygh, nil
}

// CreateRunnerToken create a token
func (g *GitHub) CreateRunnerToken() (string, error) {
token, _, err := g.client.Actions.CreateRegistrationToken(context.Background(), "vmware-tanzu", "community-edition")
if err != nil {
klog.Errorf("Actions.CreateRegistrationToken returned Err: %v\n", err)
return "", err
Expand All @@ -70,17 +90,25 @@ func createRunnerToken(client *github.Client) (string, error) {
return *token.Token, nil
}

func getGitHubRunner(client *github.Client, runnerName string) (*github.Runner, error) {
klog.Infof("getGitHubRunner(%s)\n", runnerName)

if client == nil {
err := ErrClientInvalid
klog.Errorf("Client == nil. Err: %v\n", err)
// GetGitHubRunners get all runner
func (g *GitHub) GetGitHubRunners() (*github.Runners, error) {
opts := &github.ListOptions{}
runners, _, err := g.client.Actions.ListRunners(context.Background(), "vmware-tanzu", "community-edition", opts)
if err != nil {
klog.Errorf("Actions.ListRunners failed. Err: %v\n", err)
return nil, err
}

klog.Infof("GetGitHubRunners succeeded!\n")
return runners, nil
}

// GetGitHubRunner get runner
func (g *GitHub) GetGitHubRunner(runnerName string) (*github.Runner, error) {
klog.Infof("getGitHubRunner(%s)\n", runnerName)

opts := &github.ListOptions{}
runners, _, err := client.Actions.ListRunners(context.Background(), "vmware-tanzu", "community-edition", opts)
runners, _, err := g.client.Actions.ListRunners(context.Background(), "vmware-tanzu", "community-edition", opts)
if err != nil {
klog.Errorf("Actions.ListRunners failed. Err: %v\n", err)
return nil, err
Expand All @@ -103,39 +131,35 @@ func getGitHubRunner(client *github.Client, runnerName string) (*github.Runner,
return nil, ErrRunnerOffline
}

func deleteGitHubRunnerByName(client *github.Client, runnerName string) error {
// DeleteGitHubRunnerByName delete by name
func (g *GitHub) DeleteGitHubRunnerByName(runnerName string) error {
klog.Infof("deleteGitHubRunnerByName(%s)\n", runnerName)

if client == nil {
err := ErrClientInvalid
klog.Errorf("Client == nil. Err: %v\n", err)
return err
}
if runnerName == "" {
err := ErrClientInvalid
klog.Errorf("runnerName is empty. Err: %v\n", err)
return err
}

runner, err := getGitHubRunner(client, runnerName)
runner, err := g.GetGitHubRunner(runnerName)
if err != nil {
klog.Errorf("getGitHubRunner failed. Err: %v\n", err)
return err
}

return deleteGitHubRunnerByID(client, *runner.ID)
if *runner.Busy {
klog.Infof("Runner %s is working on another job\n", runnerName)
return ErrRunnerIsBusy
}

return g.DeleteGitHubRunnerByID(*runner.ID)
}

func deleteGitHubRunnerByID(client *github.Client, runnerID int64) error {
// DeleteGitHubRunnerByID delete by ID
func (g *GitHub) DeleteGitHubRunnerByID(runnerID int64) error {
klog.Infof("deleteGitHubRunnerByID(%d)\n", runnerID)

if client == nil {
err := ErrClientInvalid
klog.Errorf("Client == nil. Err: %v\n", err)
return err
}

_, err := client.Actions.RemoveRunner(context.Background(), "vmware-tanzu", "community-edition", runnerID)
_, err := g.client.Actions.RemoveRunner(context.Background(), "vmware-tanzu", "community-edition", runnerID)
if err != nil {
klog.Errorf("Actions.RemoveRunner failed. Err: %v\n", err)
return err
Expand Down
16 changes: 12 additions & 4 deletions hack/runner/webhook/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -137,10 +137,7 @@ func checkAndDumpSettings() {
}
}

func main() {
initLogging()
checkAndDumpSettings()

func initServer() {
// envvars
var port string
if v := os.Getenv("LISTEN_PORT"); v != "" {
Expand Down Expand Up @@ -190,6 +187,11 @@ func main() {
}
})

// clean up
go func() {
backgroundClean()
}()

// generic version check
http.HandleFunc(versionPath, func(w http.ResponseWriter, r *http.Request) {
version := Version{
Expand All @@ -211,3 +213,9 @@ func main() {
klog.Errorf("ListenAndServe failed. Err: %v\n", err)
}
}

func main() {
initLogging()
checkAndDumpSettings()
initServer()
}
Loading

0 comments on commit 7db20fd

Please sign in to comment.