diff --git a/models/sys/base/activityResource/helpers.go b/models/sys/base/activityResource/helpers.go index 2b64731c..ff6a089b 100644 --- a/models/sys/base/activityResource/helpers.go +++ b/models/sys/base/activityResource/helpers.go @@ -22,7 +22,7 @@ func (client *ActivityResourceClient[T]) ListByActivity(activity string) ([]T, e func (client *ActivityResourceClient[T]) ListWithNoActivities() ([]T, error) { filter := bson.D{{ "activities", bson.M{ - "$size": 0, + "$gte": bson.M{}, }, }} diff --git a/models/sys/deployment/storage_manager/activities.go b/models/sys/storage_manager/activities.go similarity index 100% rename from models/sys/deployment/storage_manager/activities.go rename to models/sys/storage_manager/activities.go diff --git a/models/sys/deployment/storage_manager/client.go b/models/sys/storage_manager/client.go similarity index 100% rename from models/sys/deployment/storage_manager/client.go rename to models/sys/storage_manager/client.go diff --git a/models/sys/deployment/storage_manager/db.go b/models/sys/storage_manager/db.go similarity index 68% rename from models/sys/deployment/storage_manager/db.go rename to models/sys/storage_manager/db.go index 492fcd8f..ffff4c38 100644 --- a/models/sys/deployment/storage_manager/db.go +++ b/models/sys/storage_manager/db.go @@ -1,6 +1,7 @@ package storage_manager import ( + "context" "errors" "fmt" "go-deploy/models" @@ -39,7 +40,26 @@ func (client *Client) CreateStorageManager(id string, params *CreateParams) (*St return fetched, nil } +func (client *Client) DeleteSubsystemByID(id, key string) error { + subsystemKey := fmt.Sprintf("subsystems.%s", key) + return client.UpdateWithBsonByID(id, bson.D{{"$unset", bson.D{{subsystemKey, ""}}}}) +} + func (client *Client) UpdateSubsystemByID(id, key string, update interface{}) error { subsystemKey := fmt.Sprintf("subsystems.%s", key) return client.SetWithBsonByID(id, bson.D{{subsystemKey, update}}) } +func (client *Client) MarkRepaired(id string) error { + filter := bson.D{{"id", id}} + update := bson.D{ + {"$set", bson.D{{"repairedAt", time.Now()}}}, + {"$unset", bson.D{{"activities.repairing", ""}}}, + } + + _, err := client.Collection.UpdateOne(context.TODO(), filter, update) + if err != nil { + return err + } + + return nil +} diff --git a/models/sys/deployment/storage_manager/dto.go b/models/sys/storage_manager/dto.go similarity index 100% rename from models/sys/deployment/storage_manager/dto.go rename to models/sys/storage_manager/dto.go diff --git a/models/sys/deployment/storage_manager/models.go b/models/sys/storage_manager/models.go similarity index 100% rename from models/sys/deployment/storage_manager/models.go rename to models/sys/storage_manager/models.go diff --git a/models/sys/deployment/storage_manager/storage_manager.go b/models/sys/storage_manager/storage_manager.go similarity index 53% rename from models/sys/deployment/storage_manager/storage_manager.go rename to models/sys/storage_manager/storage_manager.go index c4adeb93..ae9edc84 100644 --- a/models/sys/deployment/storage_manager/storage_manager.go +++ b/models/sys/storage_manager/storage_manager.go @@ -7,15 +7,15 @@ import ( ) type StorageManager struct { - ID string `json:"id" bson:"id"` - OwnerID string `json:"ownerId" bson:"ownerId"` - Zone string `json:"zone" bson:"zone"` + ID string `bson:"id"` + OwnerID string `bson:"ownerId"` + Zone string `bson:"zone"` - CreatedAt time.Time `json:"createdAt" bson:"createdAt"` - RepairedAt time.Time `json:"repairAt" bson:"repairAt"` + CreatedAt time.Time `bson:"createdAt"` + RepairedAt time.Time `bson:"repairedAt"` - Activities map[string]activity.Activity `json:"activities" bson:"activities"` - Subsystems Subsystems `json:"subsystems" bson:"subsystems"` + Activities map[string]activity.Activity `bson:"activities"` + Subsystems Subsystems `bson:"subsystems"` } func (storageManager *StorageManager) GetURL() *string { diff --git a/models/sys/user/team/client.go b/models/sys/team/client.go similarity index 100% rename from models/sys/user/team/client.go rename to models/sys/team/client.go diff --git a/models/sys/user/team/db.go b/models/sys/team/db.go similarity index 100% rename from models/sys/user/team/db.go rename to models/sys/team/db.go diff --git a/models/sys/user/team/dto.go b/models/sys/team/dto.go similarity index 100% rename from models/sys/user/team/dto.go rename to models/sys/team/dto.go diff --git a/models/sys/user/team/params.go b/models/sys/team/params.go similarity index 100% rename from models/sys/user/team/params.go rename to models/sys/team/params.go diff --git a/models/sys/user/team/team.go b/models/sys/team/team.go similarity index 100% rename from models/sys/user/team/team.go rename to models/sys/team/team.go diff --git a/models/sys/user/user.go b/models/sys/user/user.go index 8d954712..f4159c4d 100644 --- a/models/sys/user/user.go +++ b/models/sys/user/user.go @@ -2,7 +2,7 @@ package user import ( "fmt" - teamModels "go-deploy/models/sys/user/team" + "go-deploy/models/sys/team" ) type PublicKey struct { @@ -35,15 +35,15 @@ type User struct { Onboarded bool `bson:"onboarded"` } -func (user *User) GetTeamMap() (map[string]teamModels.Team, error) { - client := teamModels.New() +func (user *User) GetTeamMap() (map[string]team.Team, error) { + client := team.New() teams, err := client.ListByUserID(user.ID) if err != nil { return nil, fmt.Errorf("failed to get teams for user %s. details: %w", user.Username, err) } - teamsMap := make(map[string]teamModels.Team) + teamsMap := make(map[string]team.Team) for _, team := range teams { teamsMap[team.ID] = team } diff --git a/pkg/jobs/jobs.go b/pkg/jobs/jobs.go index cff31f2b..1fc55653 100644 --- a/pkg/jobs/jobs.go +++ b/pkg/jobs/jobs.go @@ -7,11 +7,12 @@ import ( "github.com/mitchellh/mapstructure" "go-deploy/models/dto/body" deploymentModel "go-deploy/models/sys/deployment" - storageManagerModel "go-deploy/models/sys/deployment/storage_manager" jobModel "go-deploy/models/sys/job" + storageManagerModel "go-deploy/models/sys/storage_manager" vmModel "go-deploy/models/sys/vm" "go-deploy/pkg/workers/confirm" "go-deploy/service/deployment_service" + "go-deploy/service/storage_manager_service" "go-deploy/service/vm_service" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" @@ -397,9 +398,9 @@ func CreateStorageManager(job *jobModel.Job) error { return makeTerminatedError(err) } - err = deployment_service.CreateStorageManager(id, ¶ms) + err = storage_manager_service.CreateStorageManager(id, ¶ms) if err != nil { - if errors.Is(err, deployment_service.StorageManagerAlreadyExistsErr) { + if errors.Is(err, storage_manager_service.StorageManagerAlreadyExistsErr) { return makeTerminatedError(err) } @@ -417,7 +418,7 @@ func DeleteStorageManager(job *jobModel.Job) error { id := job.Args["id"].(string) - err = deployment_service.DeleteStorageManager(id) + err = storage_manager_service.DeleteStorageManager(id) if err != nil { return makeFailedError(err) } @@ -433,7 +434,7 @@ func RepairStorageManager(job *jobModel.Job) error { id := job.Args["id"].(string) - err = deployment_service.RepairStorageManager(id) + err = storage_manager_service.RepairStorageManager(id) if err != nil { return makeTerminatedError(err) } diff --git a/pkg/subsystems/cs/models/vm_public.go b/pkg/subsystems/cs/models/vm_public.go index 0a9113ee..cf1310f5 100644 --- a/pkg/subsystems/cs/models/vm_public.go +++ b/pkg/subsystems/cs/models/vm_public.go @@ -32,16 +32,9 @@ func CreateVmPublicFromGet(vm *cloudstack.VirtualMachine) *VmPublic { tags := FromCsTags(vm.Tags) - var name string - for _, tag := range tags { - if tag.Key == "deployName" { - name = tag.Value - } - } - return &VmPublic{ ID: vm.Id, - Name: name, + Name: vm.Name, ServiceOfferingID: vm.Serviceofferingid, TemplateID: vm.Templateid, ExtraConfig: extraConfig, diff --git a/pkg/subsystems/cs/vm.go b/pkg/subsystems/cs/vm.go index 92c6542d..45df8cb5 100644 --- a/pkg/subsystems/cs/vm.go +++ b/pkg/subsystems/cs/vm.go @@ -9,7 +9,6 @@ import ( "gopkg.in/yaml.v3" "log" "math/rand" - "net/url" "strings" "time" ) @@ -121,11 +120,11 @@ func (client *Client) UpdateVM(public *models.VmPublic) (*models.VmPublic, error params.SetName(public.Name) params.SetDisplayname(public.Name) - if public.ExtraConfig == "" { - params.SetExtraconfig(url.QueryEscape("none")) - } else { - params.SetExtraconfig(url.QueryEscape(public.ExtraConfig)) - } + //if public.ExtraConfig == "" { + // params.SetExtraconfig(url.QueryEscape("none")) + //} else { + // params.SetExtraconfig(url.QueryEscape(public.ExtraConfig)) + //} _, err = client.CsClient.VirtualMachine.UpdateVirtualMachine(params) if err != nil { diff --git a/pkg/workers/repair/workers.go b/pkg/workers/repair/workers.go index 157b3fd1..1a2a5678 100644 --- a/pkg/workers/repair/workers.go +++ b/pkg/workers/repair/workers.go @@ -5,8 +5,8 @@ import ( "fmt" "github.com/google/uuid" deploymentModel "go-deploy/models/sys/deployment" - storageManagerModel "go-deploy/models/sys/deployment/storage_manager" jobModel "go-deploy/models/sys/job" + storageManagerModel "go-deploy/models/sys/storage_manager" vmModel "go-deploy/models/sys/vm" "go-deploy/pkg/config" "go-deploy/service/job_service" @@ -97,7 +97,11 @@ func storageManagerRepairer(ctx context.Context) { continue } - err = deploymentModel.New().MarkRepaired(storageManager.ID) + err = storageManagerModel.New().MarkRepaired(storageManager.ID) + if err != nil { + utils.PrettyPrintError(fmt.Errorf("failed to mark storage manager %s as repaired. details: %w", storageManager.ID, err)) + continue + } } } case <-ctx.Done(): @@ -133,6 +137,10 @@ func vmRepairer(ctx context.Context) { } err = vmModel.New().MarkRepaired(vm.ID) + if err != nil { + log.Printf("failed to mark vm %s as repaired: %s\n", vm.Name, err.Error()) + continue + } } } case <-ctx.Done(): diff --git a/routers/api/v1/middleware/create_storage_manager.go b/routers/api/v1/middleware/create_storage_manager.go index 7702ac25..953aca10 100644 --- a/routers/api/v1/middleware/create_storage_manager.go +++ b/routers/api/v1/middleware/create_storage_manager.go @@ -5,7 +5,7 @@ import ( "github.com/gin-gonic/gin" "go-deploy/pkg/sys" v1 "go-deploy/routers/api/v1" - "go-deploy/service/deployment_service" + "go-deploy/service/storage_manager_service" "go-deploy/utils" ) @@ -19,7 +19,7 @@ func CreateStorageManager() gin.HandlerFunc { return } - err = deployment_service.CreateStorageManagerIfNotExists(auth.UserID) + err = storage_manager_service.CreateStorageManagerIfNotExists(auth.UserID) if err != nil { utils.PrettyPrintError(fmt.Errorf("failed to create storage manager. details: %w", err)) return diff --git a/routers/api/v1/v1_deployment/deployment.go b/routers/api/v1/v1_deployment/deployment.go index 4c817a89..c312a271 100644 --- a/routers/api/v1/v1_deployment/deployment.go +++ b/routers/api/v1/v1_deployment/deployment.go @@ -14,12 +14,13 @@ import ( "go-deploy/service" "go-deploy/service/deployment_service" "go-deploy/service/job_service" + "go-deploy/service/storage_manager_service" "go-deploy/service/user_service" "go-deploy/service/zone_service" ) func getStorageManagerURL(userID string, auth *service.AuthInfo) *string { - storageManager, err := deployment_service.GetStorageManagerByOwnerIdAuth(userID, auth) + storageManager, err := storage_manager_service.GetStorageManagerByOwnerIdAuth(userID, auth) if err != nil { return nil } diff --git a/routers/api/v1/v1_deployment/storage_manager.go b/routers/api/v1/v1_deployment/storage_manager.go index 45d6bf54..aec1242c 100644 --- a/routers/api/v1/v1_deployment/storage_manager.go +++ b/routers/api/v1/v1_deployment/storage_manager.go @@ -10,8 +10,8 @@ import ( "go-deploy/pkg/app/status_codes" "go-deploy/pkg/sys" v1 "go-deploy/routers/api/v1" - "go-deploy/service/deployment_service" "go-deploy/service/job_service" + "go-deploy/service/storage_manager_service" "net/http" ) @@ -44,7 +44,7 @@ func ListStorageManagers(c *gin.Context) { } if requestQuery.All { - storageManagers, _ := deployment_service.GetAllStorageManagers(auth) + storageManagers, _ := storage_manager_service.GetAllStorageManagers(auth) dtoStorageManagers := make([]body.StorageManagerRead, len(storageManagers)) for i, deployment := range storageManagers { @@ -55,7 +55,7 @@ func ListStorageManagers(c *gin.Context) { return } - storageManagers, err := deployment_service.ListStorageManagersAuth(requestQuery.All, requestQuery.UserID, auth, &requestQuery.Pagination) + storageManagers, err := storage_manager_service.ListStorageManagersAuth(requestQuery.All, requestQuery.UserID, auth, &requestQuery.Pagination) if err != nil { context.ServerError(err, v1.InternalError) return @@ -104,7 +104,7 @@ func GetStorageManager(c *gin.Context) { return } - storageManager, err := deployment_service.GetStorageManagerByIdAuth(requestURI.StorageManagerID, auth) + storageManager, err := storage_manager_service.GetStorageManagerByIdAuth(requestURI.StorageManagerID, auth) if err != nil { context.ErrorResponse(http.StatusInternalServerError, status_codes.ResourceValidationFailed, "Failed to validate") return @@ -148,7 +148,7 @@ func DeleteStorageManager(c *gin.Context) { return } - storageManager, err := deployment_service.GetStorageManagerByIdAuth(requestURI.StorageManagerID, auth) + storageManager, err := storage_manager_service.GetStorageManagerByIdAuth(requestURI.StorageManagerID, auth) if err != nil { context.ServerError(err, v1.InternalError) return diff --git a/routers/api/v1/v1_user/team.go b/routers/api/v1/v1_user/team.go index fef5772f..dc23bf68 100644 --- a/routers/api/v1/v1_user/team.go +++ b/routers/api/v1/v1_user/team.go @@ -9,7 +9,7 @@ import ( "go-deploy/models/dto/body" "go-deploy/models/dto/query" "go-deploy/models/dto/uri" - teamModels "go-deploy/models/sys/user/team" + teamModels "go-deploy/models/sys/team" "go-deploy/pkg/sys" v1 "go-deploy/routers/api/v1" "go-deploy/service/deployment_service" diff --git a/routers/api/v1/v1_user/user.go b/routers/api/v1/v1_user/user.go index 6a82beca..44fbdabc 100644 --- a/routers/api/v1/v1_user/user.go +++ b/routers/api/v1/v1_user/user.go @@ -13,6 +13,7 @@ import ( v1 "go-deploy/routers/api/v1" "go-deploy/service" "go-deploy/service/deployment_service" + "go-deploy/service/storage_manager_service" "go-deploy/service/user_service" "go-deploy/service/vm_service" "go-deploy/utils" @@ -42,7 +43,7 @@ func collectUsage(context *sys.ClientContext, userID string) *userModel.Usage { } func getStorageURL(userID string, auth *service.AuthInfo) (*string, error) { - storageManager, err := deployment_service.GetStorageManagerByOwnerIdAuth(userID, auth) + storageManager, err := storage_manager_service.GetStorageManagerByOwnerIdAuth(userID, auth) if err != nil { return nil, err } diff --git a/service/deployment_service/base/deployment_context.go b/service/deployment_service/base/deployment_context.go index 1428b5c5..155143e1 100644 --- a/service/deployment_service/base/deployment_context.go +++ b/service/deployment_service/base/deployment_context.go @@ -8,12 +8,10 @@ import ( ) type DeploymentContext struct { - Deployment *deploymentModels.Deployment - MainApp *deploymentModels.App - Zone *configModels.DeploymentZone - CreateParams *deploymentModels.CreateParams - UpdateParams *deploymentModels.UpdateParams - Generator *resources.PublicGeneratorType + Deployment *deploymentModels.Deployment + MainApp *deploymentModels.App + Zone *configModels.DeploymentZone + Generator *resources.PublicGeneratorType } func NewDeploymentBaseContext(deploymentID string) (*DeploymentContext, error) { @@ -44,12 +42,18 @@ func NewDeploymentBaseContext(deploymentID string) (*DeploymentContext, error) { }, nil } -func (c *DeploymentContext) WithCreateParams(params *deploymentModels.CreateParams) *DeploymentContext { - c.CreateParams = params - return c -} +func (dc *DeploymentContext) Refresh() error { + deployment, err := deploymentModels.New().GetByID(dc.Deployment.ID) + if err != nil { + return err + } + + if deployment == nil { + return DeploymentDeletedErr + } -func (c *DeploymentContext) WithUpdateParams(params *deploymentModels.UpdateParams) *DeploymentContext { - c.UpdateParams = params - return c + dc.Deployment = deployment + dc.Generator.WithDeployment(deployment) + + return nil } diff --git a/service/deployment_service/base/storage_manager_context.go b/service/deployment_service/base/storage_manager_context.go index 0d7c868b..79385082 100644 --- a/service/deployment_service/base/storage_manager_context.go +++ b/service/deployment_service/base/storage_manager_context.go @@ -2,20 +2,19 @@ package base import ( configModels "go-deploy/models/config" - "go-deploy/models/sys/deployment/storage_manager" + storage_manager2 "go-deploy/models/sys/storage_manager" "go-deploy/pkg/config" "go-deploy/service/resources" ) type StorageManagerContext struct { - StorageManager *storage_manager.StorageManager + StorageManager *storage_manager2.StorageManager Zone *configModels.DeploymentZone - CreateParams *storage_manager.CreateParams Generator *resources.PublicGeneratorType } func NewStorageManagerBaseContext(id string) (*StorageManagerContext, error) { - storageManager, err := storage_manager.New().GetByID(id) + storageManager, err := storage_manager2.New().GetByID(id) if err != nil { return nil, err } @@ -35,8 +34,3 @@ func NewStorageManagerBaseContext(id string) (*StorageManagerContext, error) { Generator: resources.PublicGenerator().WithStorageManager(storageManager).WithDeploymentZone(zone), }, nil } - -func (c *StorageManagerContext) WithCreateParams(params *storage_manager.CreateParams) *StorageManagerContext { - c.CreateParams = params - return c -} diff --git a/service/deployment_service/deployment_service.go b/service/deployment_service/deployment_service.go index 4d172af3..10e0fb56 100644 --- a/service/deployment_service/deployment_service.go +++ b/service/deployment_service/deployment_service.go @@ -7,7 +7,7 @@ import ( "go-deploy/models/dto/body" "go-deploy/models/dto/query" deploymentModel "go-deploy/models/sys/deployment" - teamModels "go-deploy/models/sys/user/team" + teamModels "go-deploy/models/sys/team" "go-deploy/pkg/config" "go-deploy/service" "go-deploy/service/deployment_service/base" diff --git a/service/deployment_service/github_service/github_service.go b/service/deployment_service/github_service/github_service.go index 393a0e35..c63e2015 100644 --- a/service/deployment_service/github_service/github_service.go +++ b/service/deployment_service/github_service/github_service.go @@ -29,8 +29,6 @@ func Create(id string, params *deploymentModel.CreateParams) error { return makeError(err) } - githubCtx.WithCreateParams(params) - // webhook err = resources.SsCreator(githubCtx.Client.CreateWebhook). WithDbFunc(dbFunc(id, "webhook")). diff --git a/service/deployment_service/harbor_service/harbor_service.go b/service/deployment_service/harbor_service/harbor_service.go index 35870adc..56b7e371 100644 --- a/service/deployment_service/harbor_service/harbor_service.go +++ b/service/deployment_service/harbor_service/harbor_service.go @@ -27,8 +27,6 @@ func Create(deploymentID string, params *deploymentModel.CreateParams) error { return makeError(err) } - context.WithCreateParams(params) - // Project err = resources.SsCreator(context.Client.CreateProject). WithDbFunc(dbFunc(deploymentID, "project")). diff --git a/service/deployment_service/k8s_service/deployment_context.go b/service/deployment_service/k8s_service/context.go similarity index 77% rename from service/deployment_service/k8s_service/deployment_context.go rename to service/deployment_service/k8s_service/context.go index 7bbe7dcf..fb96f21b 100644 --- a/service/deployment_service/k8s_service/deployment_context.go +++ b/service/deployment_service/k8s_service/context.go @@ -3,7 +3,6 @@ package k8s_service import ( "fmt" "go-deploy/models/config" - deploymentModels "go-deploy/models/sys/deployment" "go-deploy/pkg/subsystems/k8s" "go-deploy/service/deployment_service/base" "go-deploy/service/resources" @@ -46,18 +45,6 @@ func NewContext(deploymentID string, overrideOwnerID ...string) (*DeploymentCont }, nil } -func (c *DeploymentContext) WithCreateParams(params *deploymentModels.CreateParams) *DeploymentContext { - c.CreateParams = params - c.Generator.WithDeploymentCreateParams(params) - return c -} - -func (c *DeploymentContext) WithUpdateParams(params *deploymentModels.UpdateParams) *DeploymentContext { - c.UpdateParams = params - c.Generator.WithDeploymentUpdateParams(params) - return c -} - func getNamespaceName(userID string) string { return subsystemutils.GetPrefixedName(userID) } diff --git a/service/deployment_service/k8s_service/deployment_service.go b/service/deployment_service/k8s_service/k8s_service.go similarity index 98% rename from service/deployment_service/k8s_service/deployment_service.go rename to service/deployment_service/k8s_service/k8s_service.go index b9485ba7..a3d1b145 100644 --- a/service/deployment_service/k8s_service/deployment_service.go +++ b/service/deployment_service/k8s_service/k8s_service.go @@ -31,8 +31,6 @@ func Create(id string, params *deploymentModel.CreateParams) error { return makeError(err) } - context.WithCreateParams(params) - // Namespace err = resources.SsCreator(context.Client.CreateNamespace). WithDbFunc(dbFunc(id, "namespace")). @@ -223,8 +221,6 @@ func Update(id string, params *deploymentModel.UpdateParams) error { return makeError(err) } - context.WithUpdateParams(params) - if params.Name != nil { // since names are immutable in k8s, we actually need to recreate everything // we can trigger this in a repair. @@ -718,8 +714,17 @@ func recreatePvPvcDeployments(context *DeploymentContext) error { } } + err := context.Refresh() + if err != nil { + if errors.Is(err, base.DeploymentDeletedErr) { + return nil + } + + return err + } + for _, public := range context.Generator.PVs() { - err := resources.SsCreator(context.Client.CreatePV). + err = resources.SsCreator(context.Client.CreatePV). WithDbFunc(dbFunc(context.Deployment.ID, "pvMap."+public.Name)). WithPublic(&public). Exec() @@ -730,7 +735,7 @@ func recreatePvPvcDeployments(context *DeploymentContext) error { } for _, public := range context.Generator.PVCs() { - err := resources.SsCreator(context.Client.CreatePVC). + err = resources.SsCreator(context.Client.CreatePVC). WithDbFunc(dbFunc(context.Deployment.ID, "pvcMap."+public.Name)). WithPublic(&public). Exec() @@ -741,7 +746,7 @@ func recreatePvPvcDeployments(context *DeploymentContext) error { } for _, public := range context.Generator.Deployments() { - err := resources.SsCreator(context.Client.CreateDeployment). + err = resources.SsCreator(context.Client.CreateDeployment). WithDbFunc(dbFunc(context.Deployment.ID, "deploymentMap."+public.Name)). WithPublic(&public). Exec() diff --git a/service/resources/k8s_generator.go b/service/resources/k8s_generator.go index 37c1d37a..43689f80 100644 --- a/service/resources/k8s_generator.go +++ b/service/resources/k8s_generator.go @@ -6,7 +6,7 @@ import ( "fmt" configModels "go-deploy/models/config" "go-deploy/models/sys/deployment" - storageManagerModel "go-deploy/models/sys/deployment/storage_manager" + storageManagerModel "go-deploy/models/sys/storage_manager" userModel "go-deploy/models/sys/user" "go-deploy/models/sys/vm" "go-deploy/pkg/config" @@ -81,7 +81,7 @@ func (kg *K8sGenerator) Deployments() []models.DeploymentPublic { var volumes []models.Volume for _, volume := range mainApp.Volumes { - pvcName := getDeploymentPvcName(kg.d.deployment, volume.Name) + pvcName := dPvcName(kg.d.deployment, volume.Name) volumes = append(volumes, models.Volume{ Name: volume.Name, PvcName: &pvcName, @@ -184,7 +184,7 @@ func (kg *K8sGenerator) Deployments() []models.DeploymentPublic { return false } - return getVmProxyDeploymentName(kg.v.vm, p.HttpProxy.Name) == mapName + return vpDeploymentName(kg.v.vm, p.HttpProxy.Name) == mapName }) if idx != -1 { @@ -204,7 +204,7 @@ func (kg *K8sGenerator) Deployments() []models.DeploymentPublic { }, { Name: "URL", - Value: getVmProxyExternalURL(ports[idx].HttpProxy.Name, kg.v.deploymentZone), + Value: vpExternalURL(ports[idx].HttpProxy.Name, kg.v.deploymentZone), }, { Name: "VM_URL", @@ -228,7 +228,7 @@ func (kg *K8sGenerator) Deployments() []models.DeploymentPublic { continue } - if _, ok := kg.v.vm.Subsystems.K8s.GetDeploymentMap()[getVmProxyDeploymentName(kg.v.vm, port.HttpProxy.Name)]; !ok { + if _, ok := kg.v.vm.Subsystems.K8s.GetDeploymentMap()[vpDeploymentName(kg.v.vm, port.HttpProxy.Name)]; !ok { envVars := []models.EnvVar{ { Name: "PORT", @@ -240,7 +240,7 @@ func (kg *K8sGenerator) Deployments() []models.DeploymentPublic { }, { Name: "URL", - Value: getVmProxyExternalURL(port.HttpProxy.Name, kg.v.deploymentZone), + Value: vpExternalURL(port.HttpProxy.Name, kg.v.deploymentZone), }, { Name: "VM_URL", @@ -249,7 +249,7 @@ func (kg *K8sGenerator) Deployments() []models.DeploymentPublic { } res = append(res, models.DeploymentPublic{ - Name: getVmProxyDeploymentName(kg.v.vm, port.HttpProxy.Name), + Name: vpDeploymentName(kg.v.vm, port.HttpProxy.Name), Namespace: kg.namespace, Image: config.Config.Registry.VmHttpProxyImage, EnvVars: envVars, @@ -275,14 +275,14 @@ func (kg *K8sGenerator) Deployments() []models.DeploymentPublic { if filebrowser := kg.s.storageManager.Subsystems.K8s.GetDeployment(constants.StorageManagerAppName); service.Created(filebrowser) { res = append(res, *filebrowser) } else { - initVolumes, volumes := getStorageManagerVolumes(kg.s.storageManager.OwnerID) + initVolumes, volumes := sVolumes(kg.s.storageManager.OwnerID) allVolumes := append(initVolumes, volumes...) k8sVolumes := make([]models.Volume, len(allVolumes)) for i, volume := range allVolumes { - pvcName := getStorageManagerPvcName(volume.Name) + pvcName := sPvcName(volume.Name) k8sVolumes[i] = models.Volume{ - Name: getStorageManagerPvName(kg.s.storageManager.OwnerID, volume.Name), + Name: sPvName(kg.s.storageManager.OwnerID, volume.Name), PvcName: &pvcName, MountPath: volume.AppPath, Init: volume.Init, @@ -438,7 +438,7 @@ func (kg *K8sGenerator) Services() []models.ServicePublic { return false } - return getVmProxyServiceName(kg.v.vm, p.HttpProxy.Name) == mapName + return vpServiceName(kg.v.vm, p.HttpProxy.Name) == mapName }) != -1 { res = append(res, svc) } @@ -449,9 +449,9 @@ func (kg *K8sGenerator) Services() []models.ServicePublic { continue } - if _, ok := kg.v.vm.Subsystems.K8s.GetServiceMap()[getVmProxyServiceName(kg.v.vm, port.HttpProxy.Name)]; !ok { + if _, ok := kg.v.vm.Subsystems.K8s.GetServiceMap()[vpServiceName(kg.v.vm, port.HttpProxy.Name)]; !ok { res = append(res, models.ServicePublic{ - Name: getVmProxyServiceName(kg.v.vm, port.HttpProxy.Name), + Name: vpServiceName(kg.v.vm, port.HttpProxy.Name), Namespace: kg.namespace, Port: 8080, TargetPort: 8080, @@ -547,17 +547,17 @@ func (kg *K8sGenerator) Ingresses() []models.IngressPublic { return false } - return getVmProxyIngressName(kg.v.vm, p.HttpProxy.Name) == mapName || - (getVmProxyCustomDomainIngressName(kg.v.vm, p.HttpProxy.Name) == mapName && p.HttpProxy.CustomDomain != nil) + return vpIngressName(kg.v.vm, p.HttpProxy.Name) == mapName || + (vpCustomDomainIngressName(kg.v.vm, p.HttpProxy.Name) == mapName && p.HttpProxy.CustomDomain != nil) }) if idx != -1 { - if getVmProxyCustomDomainIngressName(kg.v.vm, ports[idx].HttpProxy.Name) == mapName { + if vpCustomDomainIngressName(kg.v.vm, ports[idx].HttpProxy.Name) == mapName { if ports[idx].HttpProxy.CustomDomain != nil { ingress.Hosts = []string{*ports[idx].HttpProxy.CustomDomain} } } else { - ingress.Hosts = []string{getVmProxyExternalURL(ports[idx].HttpProxy.Name, kg.v.deploymentZone)} + ingress.Hosts = []string{vpExternalURL(ports[idx].HttpProxy.Name, kg.v.deploymentZone)} } res = append(res, ingress) @@ -569,26 +569,26 @@ func (kg *K8sGenerator) Ingresses() []models.IngressPublic { continue } - if _, ok := kg.v.vm.Subsystems.K8s.GetIngressMap()[getVmProxyIngressName(kg.v.vm, port.HttpProxy.Name)]; !ok { + if _, ok := kg.v.vm.Subsystems.K8s.GetIngressMap()[vpIngressName(kg.v.vm, port.HttpProxy.Name)]; !ok { tlsSecret := constants.WildcardCertSecretName res = append(res, models.IngressPublic{ - Name: getVmProxyIngressName(kg.v.vm, port.HttpProxy.Name), + Name: vpIngressName(kg.v.vm, port.HttpProxy.Name), Namespace: kg.namespace, - ServiceName: getVmProxyServiceName(kg.v.vm, port.HttpProxy.Name), + ServiceName: vpServiceName(kg.v.vm, port.HttpProxy.Name), ServicePort: 8080, IngressClass: config.Config.Deployment.IngressClass, - Hosts: []string{getVmProxyExternalURL(port.HttpProxy.Name, kg.v.deploymentZone)}, + Hosts: []string{vpExternalURL(port.HttpProxy.Name, kg.v.deploymentZone)}, TlsSecret: &tlsSecret, }) } if port.HttpProxy.CustomDomain != nil { - if _, ok := kg.v.vm.Subsystems.K8s.GetIngressMap()[getVmProxyCustomDomainIngressName(kg.v.vm, port.HttpProxy.Name)]; !ok { + if _, ok := kg.v.vm.Subsystems.K8s.GetIngressMap()[vpCustomDomainIngressName(kg.v.vm, port.HttpProxy.Name)]; !ok { res = append(res, models.IngressPublic{ - Name: getVmProxyCustomDomainIngressName(kg.v.vm, port.HttpProxy.Name), + Name: vpCustomDomainIngressName(kg.v.vm, port.HttpProxy.Name), Namespace: kg.namespace, - ServiceName: getVmProxyServiceName(kg.v.vm, port.HttpProxy.Name), + ServiceName: vpServiceName(kg.v.vm, port.HttpProxy.Name), ServicePort: 8080, IngressClass: config.Config.Deployment.IngressClass, Hosts: []string{*port.HttpProxy.CustomDomain}, @@ -606,6 +606,8 @@ func (kg *K8sGenerator) Ingresses() []models.IngressPublic { if kg.s.storageManager != nil { if ingress := kg.s.storageManager.Subsystems.K8s.GetIngress(constants.StorageManagerAppName); service.Created(ingress) { + ingress.Hosts = []string{getStorageExternalFQDN(kg.s.storageManager.OwnerID, kg.s.zone)} + res = append(res, *ingress) } else { tlsSecret := constants.WildcardCertSecretName @@ -640,18 +642,18 @@ func (kg *K8sGenerator) PVs() []models.PvPublic { volumes := kg.d.deployment.GetMainApp().Volumes for mapName, pv := range kg.d.deployment.Subsystems.K8s.GetPvMap() { - if slices.IndexFunc(volumes, func(v deployment.Volume) bool { return v.Name == mapName }) != -1 { + if slices.IndexFunc(volumes, func(v deployment.Volume) bool { return dPvName(kg.d.deployment, v.Name) == mapName }) != -1 { res = append(res, pv) } } - for _, volume := range kg.d.deployment.GetMainApp().Volumes { - if _, ok := kg.d.deployment.Subsystems.K8s.GetPvMap()[volume.Name]; !ok { + for _, v := range kg.d.deployment.GetMainApp().Volumes { + if kg.d.deployment.Subsystems.K8s.GetPV(dPvName(kg.d.deployment, v.Name)) == nil { res = append(res, models.PvPublic{ - Name: getDeploymentPvName(kg.d.deployment, volume.Name), + Name: dPvName(kg.d.deployment, v.Name), Capacity: config.Config.Deployment.Resources.Limits.Storage, NfsServer: kg.d.zone.Storage.NfsServer, - NfsPath: path.Join(kg.d.zone.Storage.NfsParentPath, kg.d.deployment.OwnerID, "user"), + NfsPath: path.Join(kg.d.zone.Storage.NfsParentPath, kg.d.deployment.OwnerID, "user", v.ServerPath), }) } } @@ -660,22 +662,24 @@ func (kg *K8sGenerator) PVs() []models.PvPublic { } if kg.s.storageManager != nil { - initVolumes, volumes := getStorageManagerVolumes(kg.s.storageManager.OwnerID) + initVolumes, volumes := sVolumes(kg.s.storageManager.OwnerID) allVolumes := append(initVolumes, volumes...) for mapName, pv := range kg.s.storageManager.Subsystems.K8s.GetPvMap() { - if slices.IndexFunc(allVolumes, func(v storageManagerModel.Volume) bool { return v.Name == mapName }) != -1 { + if slices.IndexFunc(allVolumes, func(v storageManagerModel.Volume) bool { + return sPvName(kg.s.storageManager.OwnerID, v.Name) == mapName + }) != -1 { res = append(res, pv) } } - for _, volume := range allVolumes { - if _, ok := kg.s.storageManager.Subsystems.K8s.GetPvMap()[volume.Name]; !ok { + for _, v := range allVolumes { + if kg.s.storageManager.Subsystems.K8s.GetPV(sPvName(kg.s.storageManager.OwnerID, v.Name)) == nil { res = append(res, models.PvPublic{ - Name: getStorageManagerPvName(kg.s.storageManager.OwnerID, volume.Name), + Name: sPvName(kg.s.storageManager.OwnerID, v.Name), Capacity: config.Config.Deployment.Resources.Limits.Storage, NfsServer: kg.s.zone.Storage.NfsServer, - NfsPath: path.Join(kg.s.zone.Storage.NfsParentPath, volume.ServerPath), + NfsPath: path.Join(kg.s.zone.Storage.NfsParentPath, v.ServerPath), }) } } @@ -691,18 +695,18 @@ func (kg *K8sGenerator) PVCs() []models.PvcPublic { volumes := kg.d.deployment.GetMainApp().Volumes for mapName, pvc := range kg.d.deployment.Subsystems.K8s.GetPvcMap() { - if slices.IndexFunc(volumes, func(v deployment.Volume) bool { return v.Name == mapName }) != -1 { + if slices.IndexFunc(volumes, func(v deployment.Volume) bool { return dPvcName(kg.d.deployment, v.Name) == mapName }) != -1 { res = append(res, pvc) } } - for _, volume := range kg.d.deployment.GetMainApp().Volumes { - if _, ok := kg.d.deployment.Subsystems.K8s.GetPvcMap()[volume.Name]; !ok { + for _, v := range kg.d.deployment.GetMainApp().Volumes { + if kg.d.deployment.Subsystems.K8s.GetPVC(dPvcName(kg.d.deployment, v.Name)) == nil { res = append(res, models.PvcPublic{ - Name: getDeploymentPvcName(kg.d.deployment, volume.Name), + Name: dPvcName(kg.d.deployment, v.Name), Namespace: kg.namespace, Capacity: config.Config.Deployment.Resources.Limits.Storage, - PvName: getDeploymentPvName(kg.d.deployment, volume.Name), + PvName: dPvName(kg.d.deployment, v.Name), }) } } @@ -711,22 +715,24 @@ func (kg *K8sGenerator) PVCs() []models.PvcPublic { } if kg.s.storageManager != nil { - initVolumes, volumes := getStorageManagerVolumes(kg.s.storageManager.OwnerID) + initVolumes, volumes := sVolumes(kg.s.storageManager.OwnerID) allVolumes := append(initVolumes, volumes...) for mapName, pvc := range kg.s.storageManager.Subsystems.K8s.GetPvcMap() { - if slices.IndexFunc(allVolumes, func(v storageManagerModel.Volume) bool { return v.Name == mapName }) != -1 { + if slices.IndexFunc(allVolumes, func(v storageManagerModel.Volume) bool { + return sPvcName(kg.s.storageManager.OwnerID) == mapName + }) != -1 { res = append(res, pvc) } } for _, volume := range allVolumes { - if _, ok := kg.s.storageManager.Subsystems.K8s.GetPvcMap()[volume.Name]; !ok { + if kg.s.storageManager.Subsystems.K8s.GetPVC(sPvcName(kg.s.storageManager.OwnerID)) == nil { res = append(res, models.PvcPublic{ - Name: getStorageManagerPvcName(volume.Name), + Name: sPvcName(volume.Name), Namespace: kg.namespace, Capacity: config.Config.Deployment.Resources.Limits.Storage, - PvName: getStorageManagerPvName(kg.s.storageManager.OwnerID, volume.Name), + PvName: sPvName(kg.s.storageManager.OwnerID, volume.Name), }) } } @@ -900,7 +906,7 @@ func (kg *K8sGenerator) Jobs() []models.JobPublic { var res []models.JobPublic if kg.s.storageManager != nil { - jobs := getStorageManagerJobs(kg.s.storageManager.OwnerID) + jobs := sJobs(kg.s.storageManager.OwnerID) for mapName, job := range kg.s.storageManager.Subsystems.K8s.GetJobMap() { if slices.IndexFunc(jobs, func(j storageManagerModel.Job) bool { return j.Name == mapName }) != -1 { @@ -908,13 +914,13 @@ func (kg *K8sGenerator) Jobs() []models.JobPublic { } } - initVolumes, _ := getStorageManagerVolumes(kg.s.storageManager.OwnerID) + initVolumes, _ := sVolumes(kg.s.storageManager.OwnerID) k8sVolumes := make([]models.Volume, len(initVolumes)) for i, volume := range initVolumes { - pvcName := getStorageManagerPvcName(volume.Name) + pvcName := sPvcName(volume.Name) k8sVolumes[i] = models.Volume{ - Name: getStorageManagerPvName(kg.s.storageManager.OwnerID, volume.Name), + Name: sPvName(kg.s.storageManager.OwnerID, volume.Name), PvcName: &pvcName, MountPath: volume.AppPath, Init: volume.Init, @@ -967,43 +973,53 @@ func encodeDockerConfig(registry, username, password string) []byte { return jsonData } -func getDeploymentPvName(deployment *deployment.Deployment, volumeName string) string { +// deployment pv name +func dPvName(deployment *deployment.Deployment, volumeName string) string { return fmt.Sprintf("%s-%s", deployment.Name, volumeName) } -func getDeploymentPvcName(deployment *deployment.Deployment, volumeName string) string { +// deployment pvc name +func dPvcName(deployment *deployment.Deployment, volumeName string) string { return fmt.Sprintf("%s-%s", deployment.Name, volumeName) } -func getVmProxyDeploymentName(vm *vm.VM, portName string) string { +// vm proxy deployment name +func vpDeploymentName(vm *vm.VM, portName string) string { return fmt.Sprintf("%s-%s", vm.Name, portName) } -func getVmProxyServiceName(vm *vm.VM, portName string) string { +// vm proxy service name +func vpServiceName(vm *vm.VM, portName string) string { return fmt.Sprintf("%s-%s", vm.Name, portName) } -func getVmProxyIngressName(vm *vm.VM, portName string) string { +// vm proxy ingress name +func vpIngressName(vm *vm.VM, portName string) string { return fmt.Sprintf("%s-%s", vm.Name, portName) } -func getVmProxyCustomDomainIngressName(vm *vm.VM, portName string) string { +// vm proxy custom domain ingress name +func vpCustomDomainIngressName(vm *vm.VM, portName string) string { return fmt.Sprintf("%s-%s-custom-domain", vm.Name, portName) } -func getVmProxyExternalURL(portName string, zone *configModels.DeploymentZone) string { +// vm proxy external url +func vpExternalURL(portName string, zone *configModels.DeploymentZone) string { return fmt.Sprintf("%s.%s", portName, zone.ParentDomainVM) } -func getStorageManagerPvcName(volumeName string) string { +// storage manager pvc name +func sPvcName(volumeName string) string { return fmt.Sprintf("%s-%s", constants.StorageManagerAppName, volumeName) } -func getStorageManagerPvName(ownerID, volumeName string) string { +// storage manager pv name +func sPvName(ownerID, volumeName string) string { return fmt.Sprintf("%s-%s", volumeName, ownerID) } -func getStorageManagerVolumes(ownerID string) ([]storageManagerModel.Volume, []storageManagerModel.Volume) { +// storage manager volumes +func sVolumes(ownerID string) ([]storageManagerModel.Volume, []storageManagerModel.Volume) { initVolumes := []storageManagerModel.Volume{ { Name: "init", @@ -1031,7 +1047,8 @@ func getStorageManagerVolumes(ownerID string) ([]storageManagerModel.Volume, []s return initVolumes, volumes } -func getStorageManagerJobs(userID string) []storageManagerModel.Job { +// storage manager jobs +func sJobs(userID string) []storageManagerModel.Job { return []storageManagerModel.Job{ { Name: "init", diff --git a/service/resources/public_generator.go b/service/resources/public_generator.go index 3ebeed53..6f173333 100644 --- a/service/resources/public_generator.go +++ b/service/resources/public_generator.go @@ -3,28 +3,23 @@ package resources import ( "go-deploy/models/config" deploymentModels "go-deploy/models/sys/deployment" - "go-deploy/models/sys/deployment/storage_manager" + "go-deploy/models/sys/storage_manager" vmModels "go-deploy/models/sys/vm" "go-deploy/pkg/subsystems/k8s" ) type Deployment struct { - deployment *deploymentModels.Deployment - createParams *deploymentModels.CreateParams - updateParams *deploymentModels.UpdateParams - zone *config.DeploymentZone + deployment *deploymentModels.Deployment + zone *config.DeploymentZone } type StorageManager struct { storageManager *storage_manager.StorageManager - createParams *storage_manager.CreateParams zone *config.DeploymentZone } type VM struct { vm *vmModels.VM - createParams *vmModels.CreateParams - updateParams *vmModels.UpdateParams vmZone *config.VmZone deploymentZone *config.DeploymentZone } @@ -66,31 +61,6 @@ func (pc *PublicGeneratorType) WithVM(vm *vmModels.VM) *PublicGeneratorType { return pc } -func (pc *PublicGeneratorType) WithDeploymentCreateParams(params *deploymentModels.CreateParams) *PublicGeneratorType { - pc.d.createParams = params - return pc -} - -func (pc *PublicGeneratorType) WithDeploymentUpdateParams(params *deploymentModels.UpdateParams) *PublicGeneratorType { - pc.d.updateParams = params - return pc -} - -func (pc *PublicGeneratorType) WithStorageManagerCreateParams(params *storage_manager.CreateParams) *PublicGeneratorType { - pc.s.createParams = params - return pc -} - -func (pc *PublicGeneratorType) WithVmCreateParams(params *vmModels.CreateParams) *PublicGeneratorType { - pc.v.createParams = params - return pc -} - -func (pc *PublicGeneratorType) WithVmUpdateParams(params *vmModels.UpdateParams) *PublicGeneratorType { - pc.v.updateParams = params - return pc -} - func (pc *PublicGeneratorType) K8s(client *k8s.Client) *K8sGenerator { return &K8sGenerator{ PublicGeneratorType: pc, diff --git a/service/deployment_service/k8s_service/storage_manager_context.go b/service/storage_manager_service/k8s_service/context.go similarity index 69% rename from service/deployment_service/k8s_service/storage_manager_context.go rename to service/storage_manager_service/k8s_service/context.go index 16c7d674..f3148b2d 100644 --- a/service/deployment_service/k8s_service/storage_manager_context.go +++ b/service/storage_manager_service/k8s_service/context.go @@ -2,7 +2,7 @@ package k8s_service import ( "fmt" - "go-deploy/models/sys/deployment/storage_manager" + "go-deploy/models/config" "go-deploy/pkg/subsystems/k8s" "go-deploy/service/deployment_service/base" "go-deploy/service/resources" @@ -26,7 +26,7 @@ func NewStorageManagerContext(storageManagerID string) (*StorageManagerContext, return nil, makeError(err) } - k8sClient, err := withClient(baseContext.Zone, getStorageManagerNamespaceName(baseContext.StorageManager.OwnerID)) + k8sClient, err := withClient(baseContext.Zone, getNamespace(baseContext.StorageManager.OwnerID)) if err != nil { return nil, makeError(err) } @@ -38,12 +38,15 @@ func NewStorageManagerContext(storageManagerID string) (*StorageManagerContext, }, nil } -func getStorageManagerNamespaceName(userID string) string { +func getNamespace(userID string) string { return subsystemutils.GetPrefixedName("system-" + userID) } -func (c *StorageManagerContext) WithCreateParams(params *storage_manager.CreateParams) *StorageManagerContext { - c.CreateParams = params - c.Generator.WithStorageManagerCreateParams(params) - return c +func withClient(zone *config.DeploymentZone, namespace string) (*k8s.Client, error) { + client, err := k8s.New(zone.Client, namespace) + if err != nil { + return nil, fmt.Errorf("failed to create k8s client. details: %w", err) + } + + return client, nil } diff --git a/service/deployment_service/k8s_service/storage_manager_service.go b/service/storage_manager_service/k8s_service/k8s_service.go similarity index 88% rename from service/deployment_service/k8s_service/storage_manager_service.go rename to service/storage_manager_service/k8s_service/k8s_service.go index c9ab1f0e..bb62109a 100644 --- a/service/deployment_service/k8s_service/storage_manager_service.go +++ b/service/storage_manager_service/k8s_service/k8s_service.go @@ -3,7 +3,7 @@ package k8s_service import ( "errors" "fmt" - storageManagerModel "go-deploy/models/sys/deployment/storage_manager" + "go-deploy/models/sys/storage_manager" k8sModels "go-deploy/pkg/subsystems/k8s/models" "go-deploy/service/constants" "go-deploy/service/deployment_service/base" @@ -12,7 +12,7 @@ import ( "log" ) -func CreateStorageManager(smID string, params *storageManagerModel.CreateParams) error { +func CreateStorageManager(smID string, params *storage_manager.CreateParams) error { makeError := func(err error) error { return fmt.Errorf("failed to create storage manager in k8s. details: %w", err) } @@ -26,11 +26,9 @@ func CreateStorageManager(smID string, params *storageManagerModel.CreateParams) return makeError(err) } - context.WithCreateParams(params) - // Namespace err = resources.SsCreator(context.Client.CreateNamespace). - WithDbFunc(dbFuncSM(smID, "namespace")). + WithDbFunc(dbFunc(smID, "namespace")). WithPublic(context.Generator.Namespace()). Exec() @@ -41,7 +39,7 @@ func CreateStorageManager(smID string, params *storageManagerModel.CreateParams) // PersistentVolume for _, pvPublic := range context.Generator.PVs() { err = resources.SsCreator(context.Client.CreatePV). - WithDbFunc(dbFuncSM(smID, "pvMap."+pvPublic.Name)). + WithDbFunc(dbFunc(smID, "pvMap."+pvPublic.Name)). WithPublic(&pvPublic). Exec() @@ -53,7 +51,7 @@ func CreateStorageManager(smID string, params *storageManagerModel.CreateParams) // PersistentVolumeClaim for _, pvcPublic := range context.Generator.PVCs() { err = resources.SsCreator(context.Client.CreatePVC). - WithDbFunc(dbFuncSM(smID, "pvcMap."+pvcPublic.Name)). + WithDbFunc(dbFunc(smID, "pvcMap."+pvcPublic.Name)). WithPublic(&pvcPublic). Exec() @@ -65,7 +63,7 @@ func CreateStorageManager(smID string, params *storageManagerModel.CreateParams) // Job for _, jobPublic := range context.Generator.Jobs() { err = resources.SsCreator(context.Client.CreateJob). - WithDbFunc(dbFuncSM(smID, "jobMap."+jobPublic.Name)). + WithDbFunc(dbFunc(smID, "jobMap."+jobPublic.Name)). WithPublic(&jobPublic). Exec() @@ -77,7 +75,7 @@ func CreateStorageManager(smID string, params *storageManagerModel.CreateParams) // Secret for _, secret := range context.Generator.Secrets() { err = resources.SsCreator(context.Client.CreateSecret). - WithDbFunc(dbFuncSM(smID, "secretMap."+secret.Name)). + WithDbFunc(dbFunc(smID, "secretMap."+secret.Name)). WithPublic(&secret). Exec() @@ -89,7 +87,7 @@ func CreateStorageManager(smID string, params *storageManagerModel.CreateParams) // Deployment for _, deployment := range context.Generator.Deployments() { err = resources.SsCreator(context.Client.CreateDeployment). - WithDbFunc(dbFuncSM(smID, "deploymentMap."+deployment.Name)). + WithDbFunc(dbFunc(smID, "deploymentMap."+deployment.Name)). WithPublic(&deployment). Exec() @@ -101,7 +99,7 @@ func CreateStorageManager(smID string, params *storageManagerModel.CreateParams) // Service for _, k8sService := range context.Generator.Services() { err = resources.SsCreator(context.Client.CreateService). - WithDbFunc(dbFuncSM(smID, "serviceMap."+k8sService.Name)). + WithDbFunc(dbFunc(smID, "serviceMap."+k8sService.Name)). WithPublic(&k8sService). Exec() @@ -113,7 +111,7 @@ func CreateStorageManager(smID string, params *storageManagerModel.CreateParams) // Ingress for _, ingress := range context.Generator.Ingresses() { err = resources.SsCreator(context.Client.CreateIngress). - WithDbFunc(dbFuncSM(smID, "ingressMap."+ingress.Name)). + WithDbFunc(dbFunc(smID, "ingressMap."+ingress.Name)). WithPublic(&ingress). Exec() @@ -145,7 +143,7 @@ func DeleteStorageManager(id string) error { for mapName, k8sDeployment := range context.StorageManager.Subsystems.K8s.DeploymentMap { err = resources.SsDeleter(context.Client.DeleteDeployment). WithResourceID(k8sDeployment.ID). - WithDbFunc(dbFuncSM(id, "deploymentMap."+mapName)). + WithDbFunc(dbFunc(id, "deploymentMap."+mapName)). Exec() } @@ -153,7 +151,7 @@ func DeleteStorageManager(id string) error { for mapName, k8sService := range context.StorageManager.Subsystems.K8s.ServiceMap { err = resources.SsDeleter(context.Client.DeleteService). WithResourceID(k8sService.ID). - WithDbFunc(dbFuncSM(id, "serviceMap."+mapName)). + WithDbFunc(dbFunc(id, "serviceMap."+mapName)). Exec() } @@ -161,7 +159,7 @@ func DeleteStorageManager(id string) error { for mapName, ingress := range context.StorageManager.Subsystems.K8s.IngressMap { err = resources.SsDeleter(context.Client.DeleteIngress). WithResourceID(ingress.ID). - WithDbFunc(dbFuncSM(id, "ingressMap."+mapName)). + WithDbFunc(dbFunc(id, "ingressMap."+mapName)). Exec() } @@ -169,7 +167,7 @@ func DeleteStorageManager(id string) error { for mapName, job := range context.StorageManager.Subsystems.K8s.JobMap { err = resources.SsDeleter(context.Client.DeleteJob). WithResourceID(job.ID). - WithDbFunc(dbFuncSM(id, "jobMap."+mapName)). + WithDbFunc(dbFunc(id, "jobMap."+mapName)). Exec() } @@ -177,7 +175,7 @@ func DeleteStorageManager(id string) error { for mapName, pvc := range context.StorageManager.Subsystems.K8s.PvcMap { err = resources.SsDeleter(context.Client.DeletePVC). WithResourceID(pvc.ID). - WithDbFunc(dbFuncSM(id, "pvcMap."+mapName)). + WithDbFunc(dbFunc(id, "pvcMap."+mapName)). Exec() } @@ -185,7 +183,7 @@ func DeleteStorageManager(id string) error { for mapName, pv := range context.StorageManager.Subsystems.K8s.PvMap { err = resources.SsDeleter(context.Client.DeletePV). WithResourceID(pv.ID). - WithDbFunc(dbFuncSM(id, "pvMap."+mapName)). + WithDbFunc(dbFunc(id, "pvMap."+mapName)). Exec() } @@ -340,8 +338,11 @@ func RepairStorageManager(id string) error { return nil } -func dbFuncSM(id, key string) func(interface{}) error { +func dbFunc(id, key string) func(interface{}) error { return func(data interface{}) error { - return storageManagerModel.New().UpdateSubsystemByID(id, "k8s."+key, data) + if data == nil { + return storage_manager.New().DeleteSubsystemByID(id, "k8s."+key) + } + return storage_manager.New().UpdateSubsystemByID(id, "k8s."+key, data) } } diff --git a/service/deployment_service/k8s_service/utils.go b/service/storage_manager_service/k8s_service/utils.go similarity index 93% rename from service/deployment_service/k8s_service/utils.go rename to service/storage_manager_service/k8s_service/utils.go index 3c3d8022..c27da244 100644 --- a/service/deployment_service/k8s_service/utils.go +++ b/service/storage_manager_service/k8s_service/utils.go @@ -3,7 +3,7 @@ package k8s_service import ( "fmt" "go-deploy/models/config" - storageManagerModel "go-deploy/models/sys/deployment/storage_manager" + storageManagerModel "go-deploy/models/sys/storage_manager" "path" ) diff --git a/service/deployment_service/storage_manager_service.go b/service/storage_manager_service/storage_manager_service.go similarity index 72% rename from service/deployment_service/storage_manager_service.go rename to service/storage_manager_service/storage_manager_service.go index b1e4a558..bef04ed3 100644 --- a/service/deployment_service/storage_manager_service.go +++ b/service/storage_manager_service/storage_manager_service.go @@ -1,15 +1,15 @@ -package deployment_service +package storage_manager_service import ( "errors" "fmt" "github.com/google/uuid" "go-deploy/models/dto/query" - storageManagerModel "go-deploy/models/sys/deployment/storage_manager" jobModel "go-deploy/models/sys/job" + "go-deploy/models/sys/storage_manager" "go-deploy/service" - "go-deploy/service/deployment_service/k8s_service" "go-deploy/service/job_service" + "go-deploy/service/storage_manager_service/k8s_service" "log" ) @@ -17,12 +17,12 @@ var ( StorageManagerAlreadyExistsErr = fmt.Errorf("storage manager already exists for user") ) -func GetAllStorageManagers(auth *service.AuthInfo) ([]storageManagerModel.StorageManager, error) { +func GetAllStorageManagers(auth *service.AuthInfo) ([]storage_manager.StorageManager, error) { if auth.IsAdmin { - return storageManagerModel.New().ListAll() + return storage_manager.New().ListAll() } - ownerStorageManager, err := storageManagerModel.New().RestrictToOwner(auth.UserID).GetOne() + ownerStorageManager, err := storage_manager.New().RestrictToOwner(auth.UserID).GetOne() if err != nil { return nil, fmt.Errorf("failed to fetch storage manager. details: %w", err) } @@ -31,11 +31,11 @@ func GetAllStorageManagers(auth *service.AuthInfo) ([]storageManagerModel.Storag return nil, nil } - return []storageManagerModel.StorageManager{*ownerStorageManager}, nil + return []storage_manager.StorageManager{*ownerStorageManager}, nil } -func ListStorageManagersAuth(allUsers bool, userID *string, auth *service.AuthInfo, pagination *query.Pagination) ([]storageManagerModel.StorageManager, error) { - client := storageManagerModel.New() +func ListStorageManagersAuth(allUsers bool, userID *string, auth *service.AuthInfo, pagination *query.Pagination) ([]storage_manager.StorageManager, error) { + client := storage_manager.New() if pagination != nil { client.AddPagination(pagination.Page, pagination.PageSize) @@ -53,8 +53,8 @@ func ListStorageManagersAuth(allUsers bool, userID *string, auth *service.AuthIn return client.ListAll() } -func GetStorageManagerByIdAuth(id string, auth *service.AuthInfo) (*storageManagerModel.StorageManager, error) { - storageManager, err := storageManagerModel.New().GetByID(id) +func GetStorageManagerByIdAuth(id string, auth *service.AuthInfo) (*storage_manager.StorageManager, error) { + storageManager, err := storage_manager.New().GetByID(id) if err != nil { return nil, fmt.Errorf("failed to fetch storage manager. details: %w", err) } @@ -66,8 +66,8 @@ func GetStorageManagerByIdAuth(id string, auth *service.AuthInfo) (*storageManag return storageManager, nil } -func GetStorageManagerByOwnerIdAuth(ownerID string, auth *service.AuthInfo) (*storageManagerModel.StorageManager, error) { - storageManager, err := storageManagerModel.New().RestrictToOwner(ownerID).GetOne() +func GetStorageManagerByOwnerIdAuth(ownerID string, auth *service.AuthInfo) (*storage_manager.StorageManager, error) { + storageManager, err := storage_manager.New().RestrictToOwner(ownerID).GetOne() if err != nil { return nil, fmt.Errorf("failed to fetch storage manager. details: %w", err) } @@ -79,14 +79,14 @@ func GetStorageManagerByOwnerIdAuth(ownerID string, auth *service.AuthInfo) (*st return storageManager, nil } -func CreateStorageManager(id string, params *storageManagerModel.CreateParams) error { +func CreateStorageManager(id string, params *storage_manager.CreateParams) error { makeErr := func(err error) error { return fmt.Errorf("failed to create storage manager. details: %w", err) } - _, err := storageManagerModel.New().CreateStorageManager(id, params) + _, err := storage_manager.New().CreateStorageManager(id, params) if err != nil { - if errors.Is(err, storageManagerModel.AlreadyExistsErr) { + if errors.Is(err, storage_manager.AlreadyExistsErr) { return StorageManagerAlreadyExistsErr } @@ -109,7 +109,7 @@ func CreateStorageManagerIfNotExists(ownerID string) error { // right now the storage-manager is hosted in se-flem for all users zone := "se-flem" - exists, err := storageManagerModel.New().RestrictToOwner(ownerID).ExistsAny() + exists, err := storage_manager.New().RestrictToOwner(ownerID).ExistsAny() if err != nil { return makeError(err) } @@ -122,7 +122,7 @@ func CreateStorageManagerIfNotExists(ownerID string) error { jobID := uuid.New().String() err = job_service.Create(jobID, ownerID, jobModel.TypeCreateStorageManager, map[string]interface{}{ "id": storageManagerID, - "params": storageManagerModel.CreateParams{ + "params": storage_manager.CreateParams{ UserID: ownerID, Zone: zone, }, @@ -143,7 +143,7 @@ func DeleteStorageManager(id string) error { return makeErr(err) } - err = storageManagerModel.New().DeleteByID(id) + err = storage_manager.New().DeleteByID(id) if err != nil { return makeErr(err) } @@ -161,7 +161,7 @@ func RepairStorageManager(id string) error { return fmt.Errorf("failed to repair storage manager. details: %w", err) } - storageManager, err := storageManagerModel.New().GetByID(id) + storageManager, err := storage_manager.New().GetByID(id) if err != nil { return makeErr(err) } diff --git a/service/user_service/team_service.go b/service/user_service/team_service.go index 3dbcb093..a8d32817 100644 --- a/service/user_service/team_service.go +++ b/service/user_service/team_service.go @@ -8,8 +8,8 @@ import ( "go-deploy/models/dto/query" deploymentModel "go-deploy/models/sys/deployment" notificationModel "go-deploy/models/sys/notification" + team2 "go-deploy/models/sys/team" userModels "go-deploy/models/sys/user" - teamModels "go-deploy/models/sys/user/team" vmModel "go-deploy/models/sys/vm" "go-deploy/service" "go-deploy/service/notification_service" @@ -23,16 +23,16 @@ var TeamNotFoundErr = fmt.Errorf("team not found") var BadInviteCodeErr = fmt.Errorf("bad invite code") var NotInvitedErr = fmt.Errorf("not invited") -func CreateTeam(id, ownerID string, dtoCreateTeam *body.TeamCreate, auth *service.AuthInfo) (*teamModels.Team, error) { - params := &teamModels.CreateParams{} - params.FromDTO(dtoCreateTeam, func(resourceID string) *teamModels.Resource { +func CreateTeam(id, ownerID string, dtoCreateTeam *body.TeamCreate, auth *service.AuthInfo) (*team2.Team, error) { + params := &team2.CreateParams{} + params.FromDTO(dtoCreateTeam, func(resourceID string) *team2.Resource { return getResourceIfAccessible(resourceID, auth) }) - teamClient := teamModels.New() + teamClient := team2.New() team, err := teamClient.Create(id, ownerID, params) if err != nil { - if errors.Is(err, teamModels.NameTakenErr) { + if errors.Is(err, team2.NameTakenErr) { return nil, TeamNameTakenErr } return nil, err @@ -41,11 +41,11 @@ func CreateTeam(id, ownerID string, dtoCreateTeam *body.TeamCreate, auth *servic return team, nil } -func JoinTeam(id string, dtoTeamJoin *body.TeamJoin, auth *service.AuthInfo) (*teamModels.Team, error) { - params := &teamModels.JoinParams{} +func JoinTeam(id string, dtoTeamJoin *body.TeamJoin, auth *service.AuthInfo) (*team2.Team, error) { + params := &team2.JoinParams{} params.FromDTO(dtoTeamJoin) - teamClient := teamModels.New() + teamClient := team2.New() team, err := teamClient.GetByID(id) if err != nil { return nil, err @@ -55,7 +55,7 @@ func JoinTeam(id string, dtoTeamJoin *body.TeamJoin, auth *service.AuthInfo) (*t return nil, TeamNotFoundErr } - if team.GetMemberMap()[auth.UserID].MemberStatus != teamModels.MemberStatusInvited { + if team.GetMemberMap()[auth.UserID].MemberStatus != team2.MemberStatusInvited { return team, NotInvitedErr } @@ -64,7 +64,7 @@ func JoinTeam(id string, dtoTeamJoin *body.TeamJoin, auth *service.AuthInfo) (*t } updatedMember := team.GetMemberMap()[auth.UserID] - updatedMember.MemberStatus = teamModels.MemberStatusJoined + updatedMember.MemberStatus = team2.MemberStatusJoined updatedMember.JoinedAt = time.Now() err = teamClient.UpdateMember(id, auth.UserID, &updatedMember) @@ -75,8 +75,8 @@ func JoinTeam(id string, dtoTeamJoin *body.TeamJoin, auth *service.AuthInfo) (*t return teamClient.GetByID(id) } -func GetTeamByIdAuth(id string, auth *service.AuthInfo) (*teamModels.Team, error) { - teamClient := teamModels.New() +func GetTeamByIdAuth(id string, auth *service.AuthInfo) (*team2.Team, error) { + teamClient := team2.New() team, err := teamClient.GetByID(id) if err != nil { return nil, err @@ -93,8 +93,8 @@ func GetTeamByIdAuth(id string, auth *service.AuthInfo) (*teamModels.Team, error return team, nil } -func ListTeamsAuth(allUsers bool, userID *string, auth *service.AuthInfo, pagination *query.Pagination) ([]teamModels.Team, error) { - teamClient := teamModels.New() +func ListTeamsAuth(allUsers bool, userID *string, auth *service.AuthInfo, pagination *query.Pagination) ([]team2.Team, error) { + teamClient := team2.New() userClient := userModels.New() if pagination != nil { @@ -133,8 +133,8 @@ func ListTeamsAuth(allUsers bool, userID *string, auth *service.AuthInfo, pagina return teamClient.ListAll() } -func UpdateTeamAuth(id string, dtoUpdateTeam *body.TeamUpdate, auth *service.AuthInfo) (*teamModels.Team, error) { - teamClient := teamModels.New() +func UpdateTeamAuth(id string, dtoUpdateTeam *body.TeamUpdate, auth *service.AuthInfo) (*team2.Team, error) { + teamClient := team2.New() team, err := teamClient.GetByID(id) if err != nil { @@ -149,8 +149,8 @@ func UpdateTeamAuth(id string, dtoUpdateTeam *body.TeamUpdate, auth *service.Aut return nil, nil } - params := &teamModels.UpdateParams{} - params.FromDTO(dtoUpdateTeam, func(resourceID string) *teamModels.Resource { + params := &team2.UpdateParams{} + params.FromDTO(dtoUpdateTeam, func(resourceID string) *team2.Resource { return getResourceIfAccessible(resourceID, auth) }) @@ -164,10 +164,10 @@ func UpdateTeamAuth(id string, dtoUpdateTeam *body.TeamUpdate, auth *service.Aut member.AddedAt = time.Now() if auth.IsAdmin { member.JoinedAt = time.Now() - member.MemberStatus = teamModels.MemberStatusJoined + member.MemberStatus = team2.MemberStatusJoined } else { member.InvitationCode = utils.HashString(uuid.NewString()) - member.MemberStatus = teamModels.MemberStatusInvited + member.MemberStatus = team2.MemberStatusInvited err = notification_service.CreateNotification(uuid.NewString(), member.ID, ¬ificationModel.CreateParams{ Type: notificationModel.TypeTeamInvite, Content: map[string]interface{}{ @@ -216,7 +216,7 @@ func UpdateTeamAuth(id string, dtoUpdateTeam *body.TeamUpdate, auth *service.Aut } func DeleteTeamAuth(id string, auth *service.AuthInfo) error { - teamClient := teamModels.New() + teamClient := team2.New() team, err := teamClient.GetByID(id) if err != nil { @@ -234,7 +234,7 @@ func DeleteTeamAuth(id string, auth *service.AuthInfo) error { return teamClient.DeleteByID(id) } -func getResourceIfAccessible(resourceID string, auth *service.AuthInfo) *teamModels.Resource { +func getResourceIfAccessible(resourceID string, auth *service.AuthInfo) *team2.Resource { // try to fetch deployment dClient := deploymentModel.New() vClient := vmModel.New() @@ -251,9 +251,9 @@ func getResourceIfAccessible(resourceID string, auth *service.AuthInfo) *teamMod } if isOwner { - return &teamModels.Resource{ + return &team2.Resource{ ID: resourceID, - Type: teamModels.ResourceTypeDeployment, + Type: team2.ResourceTypeDeployment, AddedAt: time.Now(), } } @@ -266,9 +266,9 @@ func getResourceIfAccessible(resourceID string, auth *service.AuthInfo) *teamMod } if isOwner { - return &teamModels.Resource{ + return &team2.Resource{ ID: resourceID, - Type: teamModels.ResourceTypeVM, + Type: team2.ResourceTypeVM, AddedAt: time.Now(), } } diff --git a/service/utils.go b/service/utils.go index 5e0dbe4c..1018c2de 100644 --- a/service/utils.go +++ b/service/utils.go @@ -101,7 +101,7 @@ func UpdateIfDiff[T SsResource](dbResource T, fetchFunc func() (T, error), updat return nil } - if Nil(dbResource) { + if Nil(liveResource) { return recreateFunc(dbResource) } diff --git a/service/vm_service/base/vm_context.go b/service/vm_service/base/vm_context.go index a11a8edb..64aac49b 100644 --- a/service/vm_service/base/vm_context.go +++ b/service/vm_service/base/vm_context.go @@ -11,9 +11,6 @@ type VmContext struct { VM *vmModel.VM Generator *resources.PublicGeneratorType Zone *configModels.VmZone - - CreateParams *vmModel.CreateParams - UpdateParams *vmModel.UpdateParams } func NewVmBaseContext(vmID string) (*VmContext, error) { @@ -50,12 +47,18 @@ func NewVmBaseContextWithoutVM(zoneName string) (*VmContext, error) { }, nil } -func (c *VmContext) WithCreateParams(params *vmModel.CreateParams) *VmContext { - c.CreateParams = params - return c -} +func (vc *VmContext) Refresh() error { + vm, err := vmModel.New().GetByID(vc.VM.ID) + if err != nil { + return err + } + + if vm == nil { + return VmDeletedErr + } + + vc.VM = vm + vc.Generator.WithVM(vm) -func (c *VmContext) WithUpdateParams(params *vmModel.UpdateParams) *VmContext { - c.UpdateParams = params - return c + return nil } diff --git a/service/vm_service/cs_service/cs_service.go b/service/vm_service/cs_service/cs_service.go index df71cdfd..55cb7f39 100644 --- a/service/vm_service/cs_service/cs_service.go +++ b/service/vm_service/cs_service/cs_service.go @@ -33,7 +33,6 @@ func Create(vmID string, params *vmModel.CreateParams) error { context.Client.WithUserSshPublicKey(params.SshPublicKey) context.Client.WithAdminSshPublicKey(config.Config.VM.AdminSshPublicKey) - context.WithCreateParams(params) // Service offering for _, soPublic := range context.Generator.SOs() { @@ -211,8 +210,16 @@ func Update(vmID string, updateParams *vmModel.UpdateParams) error { return makeError(err) } + err = context.Refresh() + if err != nil { + if errors.Is(err, base.VmDeletedErr) { + return nil + } + + return makeError(err) + } + for _, soPublic := range context.Generator.SOs() { - soPublic.ID = "" err = resources.SsCreator(context.Client.CreateServiceOffering). WithDbFunc(dbFunc(vmID, "serviceOffering")). WithPublic(&soPublic). @@ -248,45 +255,26 @@ func Update(vmID string, updateParams *vmModel.UpdateParams) error { if soID != nil && context.VM.Subsystems.CS.VM.ServiceOfferingID != *soID { serviceOfferingUpdated = true - // turn it off if it is on, but remember the status - status, err := context.Client.GetVmStatus(context.VM.Subsystems.CS.VM.ID) + deferFunc, err := stopVmIfRunning(context) if err != nil { return makeError(err) } - if status == "Running" { - err = context.Client.DoVmCommand(context.VM.Subsystems.CS.VM.ID, nil, commands.Stop) - if err != nil { - return makeError(err) - } - } - - defer func() { - // turn it on if it was on - if status == "Running" { - var requiredHost *string - if context.VM.HasGPU() { - requiredHost, err = GetRequiredHost(context.VM.GpuID) - if err != nil { - log.Println("failed to get required host for vm", context.VM.Name, "in zone", context.Zone.Name, ". details:", err) - return - } - } - - err = context.Client.DoVmCommand(context.VM.Subsystems.CS.VM.ID, requiredHost, commands.Start) - if err != nil { - log.Println("failed to start vm", context.VM.Name, "in zone", context.Zone.Name, ". details:", err) - return - } - } - }() + defer deferFunc() } if updateParams.Name != nil || serviceOfferingUpdated { + err = context.Refresh() + if err != nil { + if errors.Is(err, base.VmDeletedErr) { + return nil + } + + return makeError(err) + } + vms := context.Generator.VMs() for _, vmPublic := range vms { - vmPublic.ServiceOfferingID = *soID - err = resources.SsUpdater(context.Client.UpdateVM). WithPublic(&vmPublic). WithDbFunc(dbFunc(vmID, "vm")). @@ -323,35 +311,46 @@ func Repair(id string) error { } // Service offering - if service.Created(&context.VM.Subsystems.CS.ServiceOffering) { - so := context.Generator.SOs()[0] + so := context.Generator.SOs()[0] + err = resources.SsRepairer( + context.Client.ReadServiceOffering, + context.Client.CreateServiceOffering, + context.Client.UpdateServiceOffering, + context.Client.DeleteServiceOffering, + ).WithResourceID(so.ID).WithGenPublic(&so).WithDbFunc(dbFunc(id, "serviceOffering")).Exec() - err = resources.SsRepairer( - context.Client.ReadServiceOffering, - context.Client.CreateServiceOffering, - context.Client.UpdateServiceOffering, - context.Client.DeleteServiceOffering, - ).WithResourceID(so.ID).WithGenPublic(&so).WithDbFunc(dbFunc(id, "serviceOffering")).Exec() + if err != nil { + return makeError(err) + } - if err != nil { - return makeError(err) + err = context.Refresh() + if err != nil { + if errors.Is(err, base.VmDeletedErr) { + return nil } + + return makeError(err) } // VM - if service.Created(&context.VM.Subsystems.CS.VM) { - vm := context.Generator.VMs()[0] + vm := context.Generator.VMs()[0] + status, err := context.Client.GetVmStatus(context.VM.Subsystems.CS.VM.ID) + if err != nil { + return makeError(err) + } + // only repair if the vm is stopped to prevent downtime for the user + if status == "Stopped" { err = resources.SsRepairer( context.Client.ReadVM, context.Client.CreateVM, context.Client.UpdateVM, func(id string) error { return nil }, ).WithResourceID(vm.ID).WithGenPublic(&vm).WithDbFunc(dbFunc(id, "vm")).Exec() - } - if err != nil { - return makeError(err) + if err != nil { + return makeError(err) + } } // Port-forwarding rules @@ -463,6 +462,41 @@ func HostInCorrectState(hostName string, zone *configModels.VmZone) (bool, strin return true, "", nil } +func stopVmIfRunning(context *Context) (func(), error) { + // turn it off if it is on, but remember the status + status, err := context.Client.GetVmStatus(context.VM.Subsystems.CS.VM.ID) + if err != nil { + return nil, err + } + + if status == "Running" { + err = context.Client.DoVmCommand(context.VM.Subsystems.CS.VM.ID, nil, commands.Stop) + if err != nil { + return nil, err + } + } + + return func() { + // turn it on if it was on + if status == "Running" { + var requiredHost *string + if context.VM.HasGPU() { + requiredHost, err = GetRequiredHost(context.VM.GpuID) + if err != nil { + log.Println("failed to get required host for vm", context.VM.Name, "in zone", context.Zone.Name, ". details:", err) + return + } + } + + err = context.Client.DoVmCommand(context.VM.Subsystems.CS.VM.ID, requiredHost, commands.Start) + if err != nil { + log.Println("failed to start vm", context.VM.Name, "in zone", context.Zone.Name, ". details:", err) + return + } + } + }, nil +} + func dbFunc(vmID, key string) func(interface{}) error { return func(data interface{}) error { if data == nil { diff --git a/service/vm_service/k8s_service/context.go b/service/vm_service/k8s_service/context.go index 84610018..a10c7d33 100644 --- a/service/vm_service/k8s_service/context.go +++ b/service/vm_service/k8s_service/context.go @@ -3,7 +3,6 @@ package k8s_service import ( "fmt" configModels "go-deploy/models/config" - vmModels "go-deploy/models/sys/vm" "go-deploy/pkg/config" "go-deploy/pkg/subsystems/k8s" "go-deploy/service/resources" @@ -54,22 +53,6 @@ func NewContext(vmID string, ownerID ...string) (*Context, error) { }, nil } -func (c *Context) WithCreateParams(params *vmModels.CreateParams) *Context { - c.CreateParams = params - if c.Generator != nil { - c.Generator.WithVmCreateParams(params) - } - return c -} - -func (c *Context) WithUpdateParams(params *vmModels.UpdateParams) *Context { - c.UpdateParams = params - if c.Generator != nil { - c.Generator.WithVmUpdateParams(params) - } - return c -} - func getNamespaceName(userID string) string { return subsystemutils.GetPrefixedName(fmt.Sprintf("vm-%s", userID)) } diff --git a/service/vm_service/k8s_service/k8s_service.go b/service/vm_service/k8s_service/k8s_service.go index 209709bb..a411f651 100644 --- a/service/vm_service/k8s_service/k8s_service.go +++ b/service/vm_service/k8s_service/k8s_service.go @@ -34,8 +34,6 @@ func Create(id string, params *vmModels.CreateParams) error { return makeError(err) } - context.WithCreateParams(params) - // Namespace namespace := context.Generator.Namespace() if namespace != nil { diff --git a/service/vm_service/vm_service.go b/service/vm_service/vm_service.go index 1bb4d96e..d9fd86e8 100644 --- a/service/vm_service/vm_service.go +++ b/service/vm_service/vm_service.go @@ -6,7 +6,7 @@ import ( roleModel "go-deploy/models/config/role" "go-deploy/models/dto/body" "go-deploy/models/dto/query" - teamModels "go-deploy/models/sys/user/team" + teamModels "go-deploy/models/sys/team" vmModel "go-deploy/models/sys/vm" "go-deploy/models/sys/vm/gpu" "go-deploy/pkg/config"