1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
13 "git.arvados.org/arvados.git/lib/config"
14 "git.arvados.org/arvados.git/sdk/go/arvados"
15 "git.arvados.org/arvados.git/sdk/go/arvadosclient"
16 "git.arvados.org/arvados.git/sdk/go/ctxlog"
17 "git.arvados.org/arvados.git/sdk/go/keepclient"
18 "github.com/sirupsen/logrus"
25 func (command) RunCommand(prog string, args []string, stdin io.Reader, stdout, stderr io.Writer) int {
27 logger := ctxlog.New(stderr, "text", "info")
30 logger.WithError(err).Error("fatal")
32 logger.Info("exiting")
35 loader := config.NewLoader(stdin, logger)
37 flags := flag.NewFlagSet("", flag.ContinueOnError)
38 flags.SetOutput(stderr)
39 loader.SetupFlags(flags)
40 projectName := flags.String("project-name", "placeholder collections with lost data", "name of project to move collections into")
41 placeholderFilename := flags.String("placeholder-filename", ".contents_removed", "name of empty file in replacement collection")
42 loglevel := flags.String("log-level", "info", "logging level (debug, info, ...)")
43 err = flags.Parse(args)
44 if err == flag.ErrHelp {
47 } else if err != nil {
51 if len(flags.Args()) == 0 {
52 fmt.Fprintf(stderr, "Usage: %s [options] uuid ...\n", prog)
57 lvl, err := logrus.ParseLevel(*loglevel)
63 cfg, err := loader.Load()
67 cluster, err := cfg.GetCluster("")
71 client, err := arvados.NewClientFromConfig(cluster)
75 client.AuthToken = cluster.SystemRootToken
77 arv, err := arvadosclient.New(client)
81 kc, err := keepclient.MakeKeepClient(arv)
85 fs, err := (&arvados.Collection{}).FileSystem(client, kc)
89 f, err := fs.OpenFile(*placeholderFilename, os.O_CREATE|os.O_WRONLY, 0777)
97 manifest, err := fs.MarshalManifest(".")
101 logger.WithField("manifest_text", manifest).Debug("replacement manifest")
103 var systemUser arvados.User
104 err = client.RequestAndDecode(&systemUser, "GET", "arvados/v1/users/current", nil, nil)
108 logger.Printf("system user uuid is %s", systemUser.UUID)
109 var projectList arvados.GroupList
110 err = client.RequestAndDecode(&projectList, "GET", "arvados/v1/groups", nil, arvados.ListOptions{
112 Filters: []arvados.Filter{
113 {"name", "=", *projectName},
114 {"owner_uuid", "=", systemUser.UUID},
120 var project arvados.Group
121 if len(projectList.Items) > 0 {
122 project = projectList.Items[0]
123 logger.WithField("UUID", project.UUID).Info("using existing project")
125 logger.Info("creating new project")
126 err = client.RequestAndDecode(&project, "POST", "arvados/v1/groups", nil, map[string]interface{}{
127 "group": map[string]interface{}{
128 "name": *projectName,
129 "owner_uuid": systemUser.UUID,
130 "group_class": "project",
136 logger.WithField("UUID", project.UUID).Info("created new project")
139 for _, uuid := range flags.Args() {
140 logger := logger.WithField("UUID", uuid)
141 var coll arvados.Collection
142 err := client.RequestAndDecode(&coll, "PATCH", "arvados/v1/collections/"+uuid, nil, map[string]interface{}{
143 "collection": map[string]interface{}{
144 "owner_uuid": project.UUID,
145 "manifest_text": manifest,
146 "name": "placeholder for collection " + uuid,
150 logger.WithError(err).Error("error updating collection")