| package main |
| |
| import ( |
| "context" |
| "fmt" |
| "log" |
| |
| "cloud.google.com/go/datastore" |
| "github.com/bazelbuild/continuous-integration/metrics/data" |
| ) |
| |
| const settingsName = "" |
| |
| type Settings struct { |
| BuildkiteOrgs []string |
| BuildkiteApiToken string |
| BuildkiteDebug bool |
| BuildkitePipelines []string // TODO: make this field private |
| BuildkiteCacheTimeoutMinutes int |
| GitHubOrg string |
| GitHubRepo string |
| GitHubApiToken string |
| CloudSqlUser string |
| CloudSqlPassword string |
| CloudSqlInstance string |
| CloudSqlDatabase string |
| CloudSqlLocalPort int |
| CloudProjects []string |
| CloudBuildProject string |
| CloudBuildSubscription string |
| } |
| |
| func ReadSettingsFromDatastore(projectID, settingsName string) (*Settings, error) { |
| ctx := context.Background() |
| client, err := datastore.NewClient(ctx, projectID) |
| if err != nil { |
| return nil, fmt.Errorf("Could not connect to Datastore of project %s: %v", projectID, err) |
| } |
| |
| settings := make([]*Settings, 0) |
| q := datastore.NewQuery(settingsName) |
| |
| _, err = client.GetAll(ctx, q, &settings) |
| if err != nil { |
| if efm, ok := err.(*datastore.ErrFieldMismatch); ok { |
| log.Printf("Datastore: ignoring unexpected field '%s'\n", efm.FieldName) |
| } else { |
| return nil, fmt.Errorf("Could not list Datastore entities with name %s in project %s: %v", settingsName, projectID, err) |
| } |
| } |
| if len(settings) != 1 { |
| return nil, fmt.Errorf("Expected exactly one Datastore entry with name %s in project %s, but got %d.", settingsName, projectID, len(settings)) |
| } |
| return settings[0], nil |
| } |
| |
| func (s *Settings) GetPipelineIDs() ([]*data.PipelineID, error) { |
| result := make([]*data.PipelineID, len(s.BuildkitePipelines)) |
| for i, v := range s.BuildkitePipelines { |
| p, err := data.CreatePipelineID(v) |
| if err != nil { |
| return nil, err |
| } |
| result[i] = p |
| } |
| return result, nil |
| } |