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

Fix self hosted runner Action field behavior change #2881

Merged
merged 1 commit into from
Jan 20, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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