implemented spawning of new agents
All checks were successful
ci/woodpecker/pr/pr Pipeline was successful

split pipeline
This commit is contained in:
2023-10-31 23:18:08 +01:00
parent bb1c7fb1d3
commit 7f2c465391
13 changed files with 412 additions and 91 deletions

View File

@ -2,11 +2,16 @@ package hetzner
import (
"bytes"
"context"
"errors"
"fmt"
"text/template"
"git.uploadfilter24.eu/covidnetes/woodpecker-autoscaler/internal/config"
"git.uploadfilter24.eu/covidnetes/woodpecker-autoscaler/internal/utils"
"github.com/hetznercloud/hcloud-go/hcloud"
log "github.com/sirupsen/logrus"
)
var USER_DATA_TEMPLATE = `
@ -37,11 +42,12 @@ type UserDataConfig struct {
EnvConfig map[string]string
}
func generateConfig(cfg *config.Config) (string, error) {
func generateConfig(cfg *config.Config, name string) (string, error) {
envConfig := map[string]string{}
envConfig["WOODPECKER_SERVER"] = cfg.WoodpeckerInstance
envConfig["WOODPECKER_AGENT_SECRET"] = cfg.WoodpeckerAgentSecret
envConfig["WOODPECKER_FILTER_LABELS"] = cfg.LabelSelector
envConfig["WOODPECKER_HOSTNAME"] = name
config := UserDataConfig{
Image: "woodpeckerci/woodpecker-agent:latest",
EnvConfig: envConfig,
@ -55,6 +61,66 @@ func generateConfig(cfg *config.Config) (string, error) {
if err != nil {
return "", errors.New(fmt.Sprintf("Could not render userdata template: %s", err.Error()))
}
return buf.String(), nil
}
func CreateNewAgent(cfg *config.Config) (*hcloud.Server, error) {
client := hcloud.NewClient(hcloud.WithToken(cfg.HcloudToken))
name := fmt.Sprintf("woodpecker-autoscaler-agent-%s", utils.RandStringBytes(5))
userdata, err := generateConfig(cfg, name)
img, _, err := client.Image.GetByNameAndArchitecture(context.Background(), "docker", "amd64")
loc, _, err := client.Location.GetByName(context.Background(), cfg.Region)
pln, _, err := client.ServerType.GetByName(context.Background(), cfg.InstanceType)
key, _, err := client.SSHKey.GetByName(context.Background(), cfg.SSHKey)
dc, _, err := client.Datacenter.GetByName(context.Background(), cfg.Datacenter)
labels := map[string]string{}
labels["Role"] = "WoodpeckerAgent"
labels["ControledBy"] = "WoodpeckerAutoscaler"
if err != nil {
return nil, errors.New(fmt.Sprintf("Could not create new Agent: %s", err.Error()))
}
res, _, err := client.Server.Create(context.Background(), hcloud.ServerCreateOpts{
Name: name,
ServerType: pln,
Image: img,
SSHKeys: []*hcloud.SSHKey{key},
Location: loc,
Datacenter: dc,
UserData: userdata,
StartAfterCreate: utils.BoolPointer(true),
Labels: labels,
})
log.WithFields(log.Fields{
"Caller": "CreateNewAgent",
}).Infof("Created new Build Agent %s", res.Server.Name)
return res.Server, nil
}
func ListAgents(cfg *config.Config) ([]hcloud.Server, error) {
client := hcloud.NewClient(hcloud.WithToken(cfg.HcloudToken))
allServers, err := client.Server.All(context.Background())
if err != nil {
return nil, errors.New(fmt.Sprintf("Could not query Server list: %s", err.Error()))
}
myServers := []hcloud.Server{}
for _, server := range allServers {
val, exists := server.Labels["ControledBy"]
if exists && val == "WoodpeckerAutoscaler" {
myServers = append(myServers, *server)
}
}
return myServers, nil
}
func DecomAgent(cfg *config.Config, server *hcloud.Server) error {
client := hcloud.NewClient(hcloud.WithToken(cfg.HcloudToken))
_, _, err := client.Server.DeleteWithResult(context.Background(), server)
if err != nil {
return errors.New(fmt.Sprintf("Could not delete Agent: %s", err.Error()))
}
return nil
}