blob: 26edf32c812ac156a56407c95f38d4ddaa66a166 [file] [log] [blame]
// Copyright 2020 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
import (
"context"
"log"
"cloud.google.com/go/datastore"
"github.com/googleapis/google-cloud-go-testing/datastore/dsiface"
reluipb "golang.org/x/build/cmd/relui/protos"
)
// store is a persistence interface for saving data.
type store interface {
AddWorkflow(workflow *reluipb.Workflow) error
BuildableTask(workflowId, id string) *reluipb.BuildableTask
Workflow(id string) *reluipb.Workflow
Workflows() []*reluipb.Workflow
}
var _ store = (*dsStore)(nil)
// dsStore is a store backed by Google Cloud Datastore.
type dsStore struct {
client dsiface.Client
}
// AddWorkflow adds a reluipb.Workflow to the database.
func (d *dsStore) AddWorkflow(wf *reluipb.Workflow) error {
key := datastore.NameKey("Workflow", wf.GetId(), nil)
_, err := d.client.Put(context.TODO(), key, wf)
return err
}
// BuildableTask fetches a reluipb.BuildableTask from the database.
func (d *dsStore) BuildableTask(workflowId, id string) *reluipb.BuildableTask {
wf := d.Workflow(workflowId)
for _, bt := range wf.GetBuildableTasks() {
if bt.GetId() == id {
return bt
}
}
return nil
}
// Workflow fetches a reluipb.Workflow from the database.
func (d *dsStore) Workflow(id string) *reluipb.Workflow {
key := datastore.NameKey("Workflow", id, nil)
wf := new(reluipb.Workflow)
if err := d.client.Get(context.TODO(), key, wf); err != nil {
log.Printf("d.client.Get(_, %q, %v) = %v", key, wf, err)
return nil
}
return wf
}
// Workflows returns all reluipb.Workflow entities from the database.
func (d *dsStore) Workflows() []*reluipb.Workflow {
var wfs []*reluipb.Workflow
if _, err := d.client.GetAll(context.TODO(), datastore.NewQuery("Workflow"), &wfs); err != nil {
log.Printf("d.client.GetAll(_, %#v, %v) = %v", datastore.NewQuery("Workflow"), &wfs, err)
return nil
}
return wfs
}