Skip to content

Commit

Permalink
Merge pull request #135 from kthcloud/pierrelefevre-get_status_code_d…
Browse files Browse the repository at this point in the history
…eployments

ping deployments
  • Loading branch information
saffronjam authored Aug 14, 2023
2 parents dfd747d + 074a870 commit 92553c9
Show file tree
Hide file tree
Showing 10 changed files with 143 additions and 1 deletion.
6 changes: 5 additions & 1 deletion main.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ func main() {
_ = flag.Bool("status-updater", false, "start status updater")
_ = flag.Bool("job-executor", false, "start job executor")
_ = flag.Bool("repairer", false, "start repairer")
_ = flag.Bool("pinger", false, "start pinger")

flag.Parse()

Expand All @@ -31,22 +32,25 @@ func main() {
statusUpdater := isFlagPassed("status-updater")
jobExecutor := isFlagPassed("job-executor")
repairer := isFlagPassed("repairer")
pinger := isFlagPassed("pinger")

var options *app.StartOptions
if confirmer || statusUpdater || jobExecutor || repairer || api {
if confirmer || statusUpdater || jobExecutor || repairer || api || pinger {
options = &app.StartOptions{
API: api,
Confirmer: confirmer,
StatusUpdater: statusUpdater,
JobExecutor: jobExecutor,
Repairer: repairer,
Pinger: pinger,
}

log.Println("api: ", options.API)
log.Println("confirmer: ", options.Confirmer)
log.Println("status-updater: ", options.StatusUpdater)
log.Println("job-executor: ", options.JobExecutor)
log.Println("repairer: ", options.Repairer)
log.Println("pinger: ", options.Pinger)
} else {
log.Println("no workers specified, starting all")
}
Expand Down
1 change: 1 addition & 0 deletions models/dto/body/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ type DeploymentRead struct {
Envs []Env `json:"envs"`
Private bool `json:"private"`
Integrations []string `json:"integrations"`
PingResult *int `json:"pingResult,omitempty"`
}

type CiConfig struct {
Expand Down
6 changes: 6 additions & 0 deletions models/sys/deployment/converters.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,11 @@ func (deployment *Deployment) ToDTO(url *string) body.DeploymentRead {
integrations = append(integrations, "github")
}

var pingResult *int
if deployment.PingResult != 0 {
pingResult = &deployment.PingResult
}

return body.DeploymentRead{
ID: deployment.ID,
Name: deployment.Name,
Expand All @@ -38,6 +43,7 @@ func (deployment *Deployment) ToDTO(url *string) body.DeploymentRead {
Envs: envs,
Private: deployment.Private,
Integrations: integrations,
PingResult: pingResult,
}
}

Expand Down
2 changes: 2 additions & 0 deletions models/sys/deployment/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ type Deployment struct {
Subsystems Subsystems `bson:"subsystems"`
StatusCode int `bson:"statusCode"`
StatusMessage string `bson:"statusMessage"`

PingResult int `bson:"pingResult"`
}

func (deployment *Deployment) Ready() bool {
Expand Down
21 changes: 21 additions & 0 deletions models/sys/deployment/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -363,3 +363,24 @@ func GetLastGitLabBuild(deploymentID string) (*GitLabBuild, error) {

return &deployment.Subsystems.GitLab.LastBuild, nil
}

func SavePing(id string, pingResult int) error {
updateData := bson.M{}

models.AddIfNotNil(updateData, "pingResult", pingResult)

if len(updateData) == 0 {
return nil
}

_, err := models.DeploymentCollection.UpdateOne(context.TODO(),
bson.D{{"id", id}},
bson.D{{"$set", updateData}},
)
if err != nil {
return fmt.Errorf("failed to update deployment ping result %s. details: %s", id, err)
}

return nil

}
6 changes: 6 additions & 0 deletions pkg/app/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"go-deploy/pkg/sys"
"go-deploy/pkg/workers/confirm"
"go-deploy/pkg/workers/job_execute"
"go-deploy/pkg/workers/ping"
"go-deploy/pkg/workers/migrator"
"go-deploy/pkg/workers/repair"
"go-deploy/pkg/workers/status_update"
Expand All @@ -27,6 +28,7 @@ type StartOptions struct {
StatusUpdater bool
JobExecutor bool
Repairer bool
Pinger bool
}

func shutdown() {
Expand Down Expand Up @@ -56,6 +58,7 @@ func Start(options *StartOptions) *http.Server {
StatusUpdater: true,
JobExecutor: true,
Repairer: true,
Pinger: true,
}
}

Expand All @@ -71,6 +74,9 @@ func Start(options *StartOptions) *http.Server {
if options.Repairer {
repair.Setup(c)
}
if options.Pinger {
ping.Setup(c)
}
if options.API {
ginMode, exists := os.LookupEnv("GIN_MODE")
if exists {
Expand Down
1 change: 1 addition & 0 deletions pkg/conf/environment.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ type Environment struct {
ExtraDomainIP string `yaml:"extraDomainIp"`
IngressClass string `yaml:"ingressClass"`
RepairInterval int `yaml:"repairInterval"`
PingInterval int `yaml:"pingInterval"`
Resources struct {
Limits struct {
CPU string `yaml:"cpu"`
Expand Down
11 changes: 11 additions & 0 deletions pkg/workers/ping/ping.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package ping

import (
"go-deploy/pkg/sys"
"log"
)

func Setup(ctx *sys.Context) {
log.Println("starting status updaters")
go deploymentPingUpdater(ctx)
}
67 changes: 67 additions & 0 deletions pkg/workers/ping/workers.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package ping

import (
deploymentModels "go-deploy/models/sys/deployment"
"go-deploy/pkg/conf"
"go-deploy/pkg/sys"
"go-deploy/service/deployment_service"
"log"
"net/http"
"time"
)

func deploymentPingUpdater(ctx *sys.Context) {
log.Println("starting deployment ping updater")
for {
if ctx.Stop {
break
}

updateAllDeploymentPings()
time.Sleep(time.Duration(conf.Env.Deployment.PingInterval) * time.Second)
}
}

func updateAllDeploymentPings() {
deployments, _ := deployment_service.GetAll()

log.Println("pinging", len(deployments), "deployments")

for _, deployment := range deployments {

url := getURL(&deployment)

if url == nil {
log.Println("deployment has no url")
continue
}

go updateOneDeploymentPing(&deployment, *url)
}
}

func updateOneDeploymentPing(deployment *deploymentModels.Deployment, url string) {
code, err := ping(url)

if err != nil {
log.Println("error fetching deployment status ping. details:", err)
}

_ = deployment_service.SavePing(deployment.ID, code)
}

func ping(url string) (int, error) {
resp, err := http.Get("https://" + url)
if err != nil {
return 0, err
}

return resp.StatusCode, nil
}

func getURL(deployment *deploymentModels.Deployment) *string {
if len(deployment.Subsystems.K8s.Ingress.Hosts) > 0 && len(deployment.Subsystems.K8s.Ingress.Hosts[0]) > 0 {
return &deployment.Subsystems.K8s.Ingress.Hosts[0]
}
return nil
}
23 changes: 23 additions & 0 deletions service/deployment_service/deployment_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -455,3 +455,26 @@ func build(deployment *deploymentModel.Deployment, params *deploymentModel.Build

return nil
}

func SavePing(id string, pingResult int) error {
makeError := func(err error) error {
return fmt.Errorf("failed to update deployment with ping result. details: %s", err)
}

deployment, err := deploymentModel.GetByID(id)
if err != nil {
return makeError(err)
}

if deployment == nil {
log.Println("deployment", id, "not found when updating ping result. assuming it was deleted")
return nil
}

err = deploymentModel.SavePing(id, pingResult)
if err != nil {
return makeError(err)
}

return nil
}

0 comments on commit 92553c9

Please sign in to comment.