[ARVADOS] created: 1.3.0-2618-g6b5158fe9

Git user git at public.arvados.org
Tue Jun 2 19:43:08 UTC 2020


        at  6b5158fe99d375e586264ad8427842d65b3da8e9 (commit)


commit 6b5158fe99d375e586264ad8427842d65b3da8e9
Author: Tom Clegg <tom at tomclegg.ca>
Date:   Tue Jun 2 15:42:38 2020 -0400

    16298: "arvados-server killcollection" command.
    
    Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom at tomclegg.ca>

diff --git a/cmd/arvados-server/cmd.go b/cmd/arvados-server/cmd.go
index fcea2223d..2c2b6c01f 100644
--- a/cmd/arvados-server/cmd.go
+++ b/cmd/arvados-server/cmd.go
@@ -15,6 +15,7 @@ import (
 	"git.arvados.org/arvados.git/lib/crunchrun"
 	"git.arvados.org/arvados.git/lib/dispatchcloud"
 	"git.arvados.org/arvados.git/lib/install"
+	"git.arvados.org/arvados.git/lib/killcollection"
 	"git.arvados.org/arvados.git/services/ws"
 )
 
@@ -33,6 +34,7 @@ var (
 		"crunch-run":      crunchrun.Command,
 		"dispatch-cloud":  dispatchcloud.Command,
 		"install":         install.Command,
+		"killcollection":  killcollection.Command,
 		"ws":              ws.Command,
 	})
 )
diff --git a/lib/killcollection/killcollection.go b/lib/killcollection/killcollection.go
new file mode 100644
index 000000000..6fe80f4f4
--- /dev/null
+++ b/lib/killcollection/killcollection.go
@@ -0,0 +1,156 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+package killcollection
+
+import (
+	"flag"
+	"fmt"
+	"io"
+	"os"
+
+	"git.arvados.org/arvados.git/lib/config"
+	"git.arvados.org/arvados.git/sdk/go/arvados"
+	"git.arvados.org/arvados.git/sdk/go/arvadosclient"
+	"git.arvados.org/arvados.git/sdk/go/ctxlog"
+	"git.arvados.org/arvados.git/sdk/go/keepclient"
+	"github.com/sirupsen/logrus"
+)
+
+var Command command
+
+type command struct{}
+
+func (command) RunCommand(prog string, args []string, stdin io.Reader, stdout, stderr io.Writer) int {
+	var err error
+	logger := ctxlog.New(stderr, "text", "info")
+	defer func() {
+		if err != nil {
+			logger.WithError(err).Error("fatal")
+		}
+		logger.Info("exiting")
+	}()
+
+	loader := config.NewLoader(stdin, logger)
+
+	flags := flag.NewFlagSet("", flag.ContinueOnError)
+	flags.SetOutput(stderr)
+	loader.SetupFlags(flags)
+	projectName := flags.String("project-name", "placeholder collections with lost data", "name of project to move collections into")
+	placeholderFilename := flags.String("placeholder-filename", ".contents_removed", "name of empty file in replacement collection")
+	loglevel := flags.String("log-level", "info", "logging level (debug, info, ...)")
+	err = flags.Parse(args)
+	if err == flag.ErrHelp {
+		err = nil
+		return 0
+	} else if err != nil {
+		return 2
+	}
+
+	if len(flags.Args()) == 0 {
+		fmt.Fprintf(stderr, "Usage: %s [options] uuid ...\n", prog)
+		flags.PrintDefaults()
+		return 2
+	}
+
+	lvl, err := logrus.ParseLevel(*loglevel)
+	if err != nil {
+		return 2
+	}
+	logger.SetLevel(lvl)
+
+	cfg, err := loader.Load()
+	if err != nil {
+		return 1
+	}
+	cluster, err := cfg.GetCluster("")
+	if err != nil {
+		return 1
+	}
+	client, err := arvados.NewClientFromConfig(cluster)
+	if err != nil {
+		return 1
+	}
+	client.AuthToken = cluster.SystemRootToken
+
+	arv, err := arvadosclient.New(client)
+	if err != nil {
+		return 1
+	}
+	kc, err := keepclient.MakeKeepClient(arv)
+	if err != nil {
+		return 1
+	}
+	fs, err := (&arvados.Collection{}).FileSystem(client, kc)
+	if err != nil {
+		return 1
+	}
+	f, err := fs.OpenFile(*placeholderFilename, os.O_CREATE|os.O_WRONLY, 0777)
+	if err != nil {
+		return 1
+	}
+	err = f.Close()
+	if err != nil {
+		return 1
+	}
+	manifest, err := fs.MarshalManifest(".")
+	if err != nil {
+		return 1
+	}
+	logger.WithField("manifest_text", manifest).Debug("replacement manifest")
+
+	var systemUser arvados.User
+	err = client.RequestAndDecode(&systemUser, "GET", "arvados/v1/users/current", nil, nil)
+	if err != nil {
+		return 1
+	}
+	logger.Printf("system user uuid is %s", systemUser.UUID)
+	var projectList arvados.GroupList
+	err = client.RequestAndDecode(&projectList, "GET", "arvados/v1/groups", nil, arvados.ListOptions{
+		Limit: 1,
+		Filters: []arvados.Filter{
+			{"name", "=", *projectName},
+			{"owner_uuid", "=", systemUser.UUID},
+		},
+	})
+	if err != nil {
+		return 1
+	}
+	var project arvados.Group
+	if len(projectList.Items) > 0 {
+		project = projectList.Items[0]
+		logger.WithField("UUID", project.UUID).Info("using existing project")
+	} else {
+		logger.Info("creating new project")
+		err = client.RequestAndDecode(&project, "POST", "arvados/v1/groups", nil, map[string]interface{}{
+			"group": map[string]interface{}{
+				"name":        *projectName,
+				"owner_uuid":  systemUser.UUID,
+				"group_class": "project",
+			},
+		})
+		if err != nil {
+			return 1
+		}
+		logger.WithField("UUID", project.UUID).Info("created new project")
+	}
+
+	for _, uuid := range flags.Args() {
+		logger := logger.WithField("UUID", uuid)
+		var coll arvados.Collection
+		err := client.RequestAndDecode(&coll, "PATCH", "arvados/v1/collections/"+uuid, nil, map[string]interface{}{
+			"collection": map[string]interface{}{
+				"owner_uuid":    project.UUID,
+				"manifest_text": manifest,
+				"name":          "placeholder for collection " + uuid,
+			},
+		})
+		if err != nil {
+			logger.WithError(err).Error("error updating collection")
+			return 1
+		}
+		logger.Info("done")
+	}
+	return 0
+}

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list