github.com/leg100/ots@v0.0.7-0.20210919080622-034055ced4bd/configuration_version.go (about)

     1  package ots
     2  
     3  import (
     4  	"errors"
     5  
     6  	tfe "github.com/leg100/go-tfe"
     7  	"gorm.io/gorm"
     8  )
     9  
    10  const (
    11  	DefaultAutoQueueRuns       = true
    12  	DefaultConfigurationSource = "tfe-api"
    13  )
    14  
    15  var (
    16  	ErrInvalidConfigurationVersionGetOptions = errors.New("invalid configuration version get options")
    17  )
    18  
    19  // ConfigurationVersionList represents a list of configuration versions.
    20  type ConfigurationVersionList struct {
    21  	*tfe.Pagination
    22  	Items []*ConfigurationVersion
    23  }
    24  
    25  // ConfigurationVersion is a representation of an uploaded or ingressed
    26  // Terraform configuration in TFE. A workspace must have at least one
    27  // configuration version before any runs may be queued on it.
    28  type ConfigurationVersion struct {
    29  	ID string
    30  
    31  	gorm.Model
    32  
    33  	AutoQueueRuns    bool
    34  	Error            string
    35  	ErrorMessage     string
    36  	Source           tfe.ConfigurationSource
    37  	Speculative      bool
    38  	Status           tfe.ConfigurationStatus
    39  	StatusTimestamps *tfe.CVStatusTimestamps
    40  
    41  	// BlobID is the ID of the blob containing the configuration
    42  	BlobID string
    43  
    44  	// Configuration Version belongs to a Workspace
    45  	Workspace *Workspace
    46  }
    47  
    48  type ConfigurationVersionService interface {
    49  	Create(workspaceID string, opts *tfe.ConfigurationVersionCreateOptions) (*ConfigurationVersion, error)
    50  	Get(id string) (*ConfigurationVersion, error)
    51  	GetLatest(workspaceID string) (*ConfigurationVersion, error)
    52  	List(workspaceID string, opts tfe.ConfigurationVersionListOptions) (*ConfigurationVersionList, error)
    53  	Upload(id string, payload []byte) error
    54  	Download(id string) ([]byte, error)
    55  }
    56  
    57  type ConfigurationVersionStore interface {
    58  	Create(run *ConfigurationVersion) (*ConfigurationVersion, error)
    59  	Get(opts ConfigurationVersionGetOptions) (*ConfigurationVersion, error)
    60  	List(workspaceID string, opts ConfigurationVersionListOptions) (*ConfigurationVersionList, error)
    61  	Update(id string, fn func(*ConfigurationVersion) error) (*ConfigurationVersion, error)
    62  }
    63  
    64  // ConfigurationVersionGetOptions are options for retrieving a single config
    65  // version. Either ID *or* WorkspaceID must be specfiied.
    66  type ConfigurationVersionGetOptions struct {
    67  	// ID of config version to retrieve
    68  	ID *string
    69  
    70  	// Get latest config version for this workspace ID
    71  	WorkspaceID *string
    72  }
    73  
    74  // ConfigurationVersionListOptions are options for paginating and filtering a
    75  // list of configuration versions
    76  type ConfigurationVersionListOptions struct {
    77  	tfe.ListOptions
    78  
    79  	// Filter by run statuses (with an implicit OR condition)
    80  	Statuses []tfe.ConfigurationStatus
    81  
    82  	// Filter by workspace ID
    83  	WorkspaceID *string
    84  }
    85  
    86  // ConfigurationVersionFactory creates ConfigurationVersion objects
    87  type ConfigurationVersionFactory struct {
    88  	WorkspaceService WorkspaceService
    89  }
    90  
    91  // NewConfigurationVersion creates a ConfigurationVersion object from scratch
    92  func (f *ConfigurationVersionFactory) NewConfigurationVersion(workspaceID string, opts *tfe.ConfigurationVersionCreateOptions) (*ConfigurationVersion, error) {
    93  	cv := ConfigurationVersion{
    94  		ID:            GenerateID("cv"),
    95  		AutoQueueRuns: DefaultAutoQueueRuns,
    96  		Status:        tfe.ConfigurationPending,
    97  		Source:        DefaultConfigurationSource,
    98  		BlobID:        NewBlobID(),
    99  	}
   100  
   101  	if opts.AutoQueueRuns != nil {
   102  		cv.AutoQueueRuns = *opts.AutoQueueRuns
   103  	}
   104  
   105  	if opts.Speculative != nil {
   106  		cv.Speculative = *opts.Speculative
   107  	}
   108  
   109  	ws, err := f.WorkspaceService.Get(WorkspaceSpecifier{ID: &workspaceID})
   110  	if err != nil {
   111  		return nil, err
   112  	}
   113  	cv.Workspace = ws
   114  
   115  	return &cv, nil
   116  }