github.com/nais/knorten@v0.0.0-20240104110906-55926958e361/pkg/user/compute.go (about) 1 package user 2 3 import ( 4 "context" 5 "database/sql" 6 "errors" 7 8 "github.com/nais/knorten/pkg/database/gensql" 9 "github.com/nais/knorten/pkg/logger" 10 ) 11 12 func (c Client) CreateComputeInstance(ctx context.Context, instance gensql.ComputeInstance, log logger.Logger) bool { 13 log.Info("Creating compute instance") 14 15 if retry, err := c.createComputeInstance(ctx, instance, log); err != nil { 16 log.Info("failed creating compute instance") 17 return retry 18 } 19 20 log.Info("Successfully created compute instance") 21 return false 22 } 23 24 func (c Client) createComputeInstance(ctx context.Context, instance gensql.ComputeInstance, log logger.Logger) (bool, error) { 25 existingInstance, err := c.repo.ComputeInstanceGet(ctx, instance.Owner) 26 if err != nil && !errors.Is(err, sql.ErrNoRows) { 27 log.WithError(err).Errorf("failed retrieving compute instance %v", instance.Owner) 28 return true, err 29 } 30 31 if existingInstance.Name != "" { 32 return false, nil 33 } 34 35 err = c.createComputeInstanceInGCP(ctx, instance.Name, instance.Owner) 36 if err != nil { 37 log.WithError(err).Error("failed creating compute instance in GCP") 38 return true, err 39 } 40 41 err = c.createIAMPolicyBindingsInGCP(ctx, instance.Name, instance.Owner) 42 if err != nil { 43 log.WithError(err).Error("failed creating IAM policy binding") 44 return true, err 45 } 46 47 if err := c.repo.ComputeInstanceCreate(ctx, instance); err != nil { 48 log.WithError(err).Error("failed saving compute instance to database") 49 return true, err 50 } 51 52 return false, nil 53 } 54 55 func (c Client) ResizeComputeInstanceDisk(ctx context.Context, instance gensql.ComputeInstance, log logger.Logger) bool { 56 log.Info("Resizing compute instance disk") 57 58 if err := c.resizeComputeInstanceDisk(ctx, instance, log); err != nil { 59 log.Info("failed to resize compute instance disk") 60 return true 61 } 62 63 log.Info("Successfully resized compute instance disk") 64 return false 65 } 66 67 func (c Client) resizeComputeInstanceDisk(ctx context.Context, instance gensql.ComputeInstance, log logger.Logger) error { 68 if err := c.resizeComputeInstanceDiskGCP(ctx, instance.Name, instance.DiskSize); err != nil { 69 log.WithError(err).Error("resizing compute instance disk") 70 return err 71 } 72 73 if err := c.repo.ComputeInstanceUpdate(ctx, instance.Owner, instance.DiskSize); err != nil { 74 log.WithError(err).Errorf("failed updating compute instance in database for owner %v", instance.Owner) 75 return err 76 } 77 78 return nil 79 } 80 81 func (c Client) DeleteComputeInstance(ctx context.Context, email string, log logger.Logger) bool { 82 log.Info("Deleting compute instance") 83 84 if retry, err := c.deleteComputeInstance(ctx, email, log); err != nil { 85 log.Info("failed creating compute instance") 86 return retry 87 } 88 89 log.Info("Successfully deleted compute instance") 90 return false 91 } 92 93 func (c Client) deleteComputeInstance(ctx context.Context, email string, log logger.Logger) (bool, error) { 94 instance, err := c.repo.ComputeInstanceGet(ctx, email) 95 if err != nil { 96 if errors.Is(err, sql.ErrNoRows) { 97 return false, nil 98 } 99 100 log.WithError(err).Error("failed retrieving compute instance") 101 return true, err 102 } 103 104 if err := c.deleteComputeInstanceFromGCP(ctx, instance.Name); err != nil { 105 log.WithError(err).Error("failed deleting compute instance from GCP") 106 return true, err 107 } 108 109 if err := c.deleteIAMPolicyBindingsFromGCP(ctx, instance.Name, email); err != nil { 110 log.WithError(err).Error("failed deleting IAM policy binding") 111 return true, err 112 } 113 114 if err = c.repo.ComputeInstanceDelete(ctx, email); err != nil { 115 log.WithError(err).Error("failed deleting compute instance from database") 116 return true, err 117 } 118 119 return false, nil 120 }