Files
deployment-manager/internal/worker/deploy.go
2026-02-01 20:22:29 +05:30

107 lines
2.3 KiB
Go

package worker
import (
"context"
"database/sql"
"deployment-manager/internal/db"
"deployment-manager/internal/events"
"deployment-manager/internal/k8s"
"deployment-manager/internal/model"
)
type DeploymentManager struct {
repoStore *db.RepoStore
kubectl *k8s.KubectlClient
eventChan chan<- *events.Event
}
func NewDeploymentManager(database *sql.DB, eventChan chan<- *events.Event) *DeploymentManager {
return &DeploymentManager{
repoStore: db.NewRepoStore(database),
kubectl: k8s.NewKubectlClient("default"),
eventChan: eventChan,
}
}
func (dm *DeploymentManager) StopDeployment(ctx context.Context, repoID int64) error {
repo, err := dm.repoStore.Get(repoID)
if err != nil {
return err
}
appName := k8s.GetAppName(repo)
// Scale deployment to 0
if err := dm.kubectl.ScaleDeployment(ctx, dm.eventChan, repoID, appName, 0); err != nil {
return err
}
// Update status
repo.Status = model.StatusStopped
if err := dm.repoStore.Update(repo); err != nil {
return err
}
// Send event
dm.eventChan <- events.NewRepoEvent(repo, events.EventTypeRepoUpdated)
return nil
}
func (dm *DeploymentManager) RestartDeployment(ctx context.Context, repoID int64) error {
repo, err := dm.repoStore.Get(repoID)
if err != nil {
return err
}
appName := k8s.GetAppName(repo)
// Update status to restarting
repo.Status = model.StatusRestarting
if err := dm.repoStore.Update(repo); err != nil {
return err
}
// Scale deployment to 1
if err := dm.kubectl.ScaleDeployment(ctx, dm.eventChan, repoID, appName, 1); err != nil {
return err
}
// Update status to deployed
repo.Status = model.StatusDeployed
if err := dm.repoStore.Update(repo); err != nil {
return err
}
// Send event
dm.eventChan <- events.NewRepoEvent(repo, events.EventTypeRepoUpdated)
return nil
}
func (dm *DeploymentManager) DeleteDeployment(ctx context.Context, repoID int64) error {
repo, err := dm.repoStore.Get(repoID)
if err != nil {
return err
}
appName := k8s.GetAppName(repo)
// Delete Kubernetes resources
if err := dm.kubectl.DeleteResources(ctx, dm.eventChan, repoID, appName); err != nil {
return err
}
// Update status to deleted
repo.Status = model.StatusDeleted
if err := dm.repoStore.Update(repo); err != nil {
return err
}
// Send event
dm.eventChan <- events.NewRepoEvent(repo, events.EventTypeRepoDeleted)
return nil
}