Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(106)

Side by Side Diff: appengine/cmd/dm/model/quest.go

Issue 1537883002: Initial distributor implementation (Closed) Base URL: https://chromium.googlesource.com/external/github.com/luci/luci-go@master
Patch Set: fix imports and make dummy.go a real file Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « appengine/cmd/dm/model/keys.go ('k') | appengine/cmd/dm/model/quest_test.go » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The LUCI Authors. All rights reserved. 1 // Copyright 2016 The LUCI Authors. All rights reserved.
2 // Use of this source code is governed under the Apache License, Version 2.0 2 // Use of this source code is governed under the Apache License, Version 2.0
3 // that can be found in the LICENSE file. 3 // that can be found in the LICENSE file.
4 4
5 package model 5 package model
6 6
7 import ( 7 import (
8 "crypto/sha256"
9 "encoding/base64"
10 "fmt"
11 "time" 8 "time"
12 9
13 "github.com/golang/protobuf/proto"
14 "golang.org/x/net/context" 10 "golang.org/x/net/context"
15 11
16 "github.com/luci/gae/service/datastore" 12 "github.com/luci/gae/service/datastore"
17 "github.com/luci/luci-go/common/clock" 13 "github.com/luci/luci-go/common/clock"
18 google_pb "github.com/luci/luci-go/common/proto/google" 14 google_pb "github.com/luci/luci-go/common/proto/google"
19 15
20 » "github.com/luci/luci-go/common/api/dm/service/v1" 16 » dm "github.com/luci/luci-go/common/api/dm/service/v1"
21 » "github.com/luci/luci-go/common/api/template"
22 )
23
24 var (
25 » // QuestIDLength is the number of encoded bytes to use. It removes the
26 » // single padding character.
27 » QuestIDLength = base64.URLEncoding.EncodedLen(sha256.Size) - 1
28 )
29
30 const (
31 » // payloadMaxLength is the maximum size of the Quest Desc
32 » payloadMaxLength = 256 * 1024
33 ) 17 )
34 18
35 // NewQuest builds a new Quest object with a correct ID given the current 19 // NewQuest builds a new Quest object with a correct ID given the current
36 // contents of the Quest_Desc. It returns an error if the Desc is invalid. 20 // contents of the Quest_Desc. It returns an error if the Desc is invalid.
37 // 21 //
38 // This will also compactify the inner json Desc as a side effect. 22 // Desc must already be Normalize()'d
39 func NewQuest(c context.Context, desc *dm.Quest_Desc) (ret *Quest, err error) { 23 func NewQuest(c context.Context, desc *dm.Quest_Desc) *Quest {
40 » if len(desc.JsonPayload) > payloadMaxLength { 24 » return &Quest{ID: desc.QuestID(), Desc: *desc, Created: clock.Now(c).UTC ()}
41 » » return nil, fmt.Errorf("quest payload is too large: %d > %d",
42 » » » len(desc.JsonPayload), payloadMaxLength)
43 » }
44 » desc.JsonPayload, err = template.NormalizeJSON(desc.JsonPayload, true)
45 » if err != nil {
46 » » return
47 » }
48
49 » data, err := proto.Marshal(desc)
50 » if err != nil {
51 » » panic(err)
52 » }
53 » h := sha256.Sum256(data)
54
55 » ret = &Quest{
56 » » ID: base64.URLEncoding.EncodeToString(h[:])[:QuestIDLength] ,
57 » » Desc: *desc,
58 » » Created: clock.Now(c).UTC(),
59 » }
60 » return
61 } 25 }
62 26
63 // Quest is the model for a job-to-run. Its questPayload should fully 27 // Quest is the model for a job-to-run. Its questPayload should fully
64 // describe the job to be done. 28 // describe the job to be done.
65 type Quest struct { 29 type Quest struct {
66 // ID is the base64 sha256 of questPayload 30 // ID is the base64 sha256 of questPayload
67 ID string `gae:"$id"` 31 ID string `gae:"$id"`
68 32
69 Desc dm.Quest_Desc `gae:",noindex"` 33 Desc dm.Quest_Desc `gae:",noindex"`
70 BuiltBy TemplateInfo `gae:",noindex"` 34 BuiltBy TemplateInfo `gae:",noindex"`
(...skipping 23 matching lines...) Expand all
94 for i := range q.BuiltBy { 58 for i := range q.BuiltBy {
95 spec[i] = &q.BuiltBy[i] 59 spec[i] = &q.BuiltBy[i]
96 } 60 }
97 61
98 return &dm.Quest_Data{ 62 return &dm.Quest_Data{
99 Created: google_pb.NewTimestamp(q.Created), 63 Created: google_pb.NewTimestamp(q.Created),
100 Desc: &q.Desc, 64 Desc: &q.Desc,
101 BuiltBy: spec, 65 BuiltBy: spec,
102 } 66 }
103 } 67 }
OLDNEW
« no previous file with comments | « appengine/cmd/dm/model/keys.go ('k') | appengine/cmd/dm/model/quest_test.go » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698