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  }