forked from evergreen-ci/evergreen
/
project_aliases.go
101 lines (87 loc) · 2.41 KB
/
project_aliases.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package migrations
import (
"github.com/mongodb/anser"
"github.com/mongodb/anser/db"
"github.com/mongodb/anser/model"
"github.com/mongodb/grip"
"github.com/pkg/errors"
"gopkg.in/mgo.v2/bson"
)
const (
migrationProjectAliasesToCollection = "project-aliases-to-collection"
projectVarsCollection = "project_vars"
projectAliasCollection = "project_aliases"
)
type patchDefinition struct {
Alias string `bson:"alias"`
Variant string `bson:"variant"`
Task string `bson:"task"`
Tags []string `bson:"tags"`
}
func projectAliasesToCollectionGenerator(env anser.Environment, args migrationGeneratorFactoryOptions) (anser.Generator, error) {
const migrationName = "project_aliases_to_collection"
if err := env.RegisterManualMigrationOperation(migrationName, makeProjectAliasMigration(args.db)); err != nil {
return nil, err
}
opts := model.GeneratorOptions{
NS: model.Namespace{
DB: args.db,
Collection: projectVarsCollection,
},
Limit: args.limit,
Query: bson.M{
"patch_definitions": bson.M{
"$exists": true,
"$ne": []interface{}{},
},
},
JobID: args.id,
}
return anser.NewManualMigrationGenerator(env, opts, migrationName), nil
}
func makeProjectAliasMigration(database string) db.MigrationOperation {
const (
idKey = "_id"
patchDefinitionsKey = "patch_definitions"
)
return func(session db.Session, rawD bson.RawD) error {
defer session.Close()
projectID := ""
aliases := []patchDefinition{}
for _, raw := range rawD {
switch raw.Name {
case idKey:
if err := raw.Value.Unmarshal(&projectID); err != nil {
return errors.Wrap(err, "error unmarshaling id")
}
case patchDefinitionsKey:
if err := raw.Value.Unmarshal(&aliases); err != nil {
return errors.Wrap(err, "error unmarshaling patch aliases")
}
}
}
catcher := grip.NewSimpleCatcher()
for _, alias := range aliases {
data := bson.M{
"project_id": projectID,
"alias": alias.Alias,
"variant": alias.Variant,
}
if alias.Task != "" {
data["task"] = alias.Task
} else {
data["tags"] = alias.Tags
}
catcher.Add(session.DB(database).C(projectAliasCollection).Insert(data))
}
if catcher.HasErrors() {
return catcher.Resolve()
}
return session.DB(database).C(projectVarsCollection).UpdateId(projectID,
bson.M{
"$unset": bson.M{
patchDefinitionsKey: 1,
},
})
}
}