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 }