From e221461d596202d8af2dc99b915afd333a31d56f Mon Sep 17 00:00:00 2001 From: Blake Devcich <89158881+bdevcich@users.noreply.github.com> Date: Mon, 26 Aug 2024 15:20:35 -0500 Subject: [PATCH 1/6] Add StatCommand to NnfDataMovementProfile (#201) The current implementation of the stat commands that are used in data movement destination prep are hard-coded. This allows the command to be customized in the profile. When I first implemented this, I tried to keep the profile and dm resource out of the function calls as much as possible and just pass down the info needed. This change is to the contrary of that since we now need to pass the statCommand all the way down to the bottom of the call stack when the stat actually takes place. Signed-off-by: Blake Devcich --- go.mod | 2 +- go.sum | 4 +- .../controller/datamovement_controller.go | 158 +++++++++--------- .../datamovement_controller_test.go | 11 +- .../v1alpha1/nnfcontainerprofile_webhook.go | 5 +- .../v1alpha1/nnfdatamovementprofile_types.go | 12 ++ .../nnfdatamovementprofile_webhook.go | 2 + .../api/v1alpha1/nnfstorageprofile_webhook.go | 3 + ....cray.hpe.com_nnfdatamovementprofiles.yaml | 16 ++ vendor/modules.txt | 2 +- 10 files changed, 131 insertions(+), 84 deletions(-) diff --git a/go.mod b/go.mod index 6a1eadf8..279d5b27 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.21 require ( github.com/NearNodeFlash/lustre-fs-operator v0.0.1-0.20240820214524-99d5da17471d - github.com/NearNodeFlash/nnf-sos v0.0.1-0.20240821141947-f61076751e0f + github.com/NearNodeFlash/nnf-sos v0.0.1-0.20240826132702-ccad8ac920b3 github.com/onsi/ginkgo/v2 v2.17.1 github.com/onsi/gomega v1.32.0 github.com/prometheus/client_golang v1.16.0 diff --git a/go.sum b/go.sum index 81caa0d3..8b5dcd64 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ github.com/NearNodeFlash/lustre-fs-operator v0.0.1-0.20240820214524-99d5da17471d github.com/NearNodeFlash/lustre-fs-operator v0.0.1-0.20240820214524-99d5da17471d/go.mod h1:N5X1obpl0mBI0VoCJdQhv7cFXOC6g3VlXj712qWj0JE= github.com/NearNodeFlash/nnf-ec v0.0.1-0.20240820195316-cb407b151cb4 h1:cxUkRTnynEvCLbYL+d/FVyITLODO/goscivJLq5kipY= github.com/NearNodeFlash/nnf-ec v0.0.1-0.20240820195316-cb407b151cb4/go.mod h1:oxdwMqfttOF9dabJhqrWlirCnMk8/8eyLMwl+hducjk= -github.com/NearNodeFlash/nnf-sos v0.0.1-0.20240821141947-f61076751e0f h1:TzN+pKBC5jmLri5TEArWCzki4NIkfpxRTyQKev0oRKQ= -github.com/NearNodeFlash/nnf-sos v0.0.1-0.20240821141947-f61076751e0f/go.mod h1:uTPaHauR9qBPXN9HxWadxK4mrgmuQqBAEboDQI4Okms= +github.com/NearNodeFlash/nnf-sos v0.0.1-0.20240826132702-ccad8ac920b3 h1:Z3Rridh8oZPfonnWcwjOjtZtCgnP6l7F4GOkxh0r24c= +github.com/NearNodeFlash/nnf-sos v0.0.1-0.20240826132702-ccad8ac920b3/go.mod h1:t/xEK8ND+sTy3gvYEiCH6OOFxhQdRZgDVZQCHRbB+XU= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= diff --git a/internal/controller/datamovement_controller.go b/internal/controller/datamovement_controller.go index c4400efc..e60efcc4 100644 --- a/internal/controller/datamovement_controller.go +++ b/internal/controller/datamovement_controller.go @@ -270,12 +270,12 @@ func (r *DataMovementReconciler) Reconcile(ctx context.Context, req ctrl.Request log.Info("MPI Hostfile preview", "first line", peekMpiHostfile(mpiHostfile)) // Prepare Destination Directory - if err = r.prepareDestination(ctx, profile, mpiHostfile, dm, log); err != nil { + if err = r.prepareDestination(ctx, profile, dm, mpiHostfile, log); err != nil { return ctrl.Result{}, err } // Build command - cmdArgs, err := buildDMCommand(ctx, profile, mpiHostfile, dm) + cmdArgs, err := buildDMCommand(profile, mpiHostfile, dm, log) if err != nil { return ctrl.Result{}, dwsv1alpha2.NewResourceError("could not create data movement command").WithError(err).WithMajor() } @@ -551,8 +551,7 @@ func (r *DataMovementReconciler) getDMProfile(ctx context.Context, dm *nnfv1alph return profile, nil } -func buildDMCommand(ctx context.Context, profile *nnfv1alpha1.NnfDataMovementProfile, hostfile string, dm *nnfv1alpha1.NnfDataMovement) ([]string, error) { - log := log.FromContext(ctx) +func buildDMCommand(profile *nnfv1alpha1.NnfDataMovementProfile, hostfile string, dm *nnfv1alpha1.NnfDataMovement, log logr.Logger) ([]string, error) { userConfig := dm.Spec.UserConfig != nil // If Dryrun is enabled, just use the "true" command @@ -594,43 +593,49 @@ func buildDMCommand(ctx context.Context, profile *nnfv1alpha1.NnfDataMovementPro return strings.Split(cmd, " "), nil } -func (r *DataMovementReconciler) prepareDestination(ctx context.Context, profile *nnfv1alpha1.NnfDataMovementProfile, mpiHostfile string, dm *nnfv1alpha1.NnfDataMovement, log logr.Logger) error { - // These functions interact with the filesystem, so they can't run in the test env - // Also, if the profile disables destination creation, skip it - if isTestEnv() || !profile.Data.CreateDestDir { - return nil - } +func buildStatCommand(uid, gid uint32, cmd, hostfile, path string) string { + cmd = strings.ReplaceAll(cmd, "$HOSTFILE", hostfile) + cmd = strings.ReplaceAll(cmd, "$UID", fmt.Sprintf("%d", uid)) + cmd = strings.ReplaceAll(cmd, "$GID", fmt.Sprintf("%d", gid)) + cmd = strings.ReplaceAll(cmd, "$PATH", path) - // Determine the destination directory based on the source and path - log.Info("Determining destination directory based on source/dest file types") - destDir, err := getDestinationDir(dm, mpiHostfile, log) - if err != nil { - return dwsv1alpha2.NewResourceError("could not determine source type").WithError(err).WithFatal() - } + return cmd +} - // See if an index mount directory on the destination is required - log.Info("Determining if index mount directory is required") - indexMount, err := r.checkIndexMountDir(ctx, dm) - if err != nil { - return dwsv1alpha2.NewResourceError("could not determine index mount directory").WithError(err).WithFatal() - } +func (r *DataMovementReconciler) prepareDestination(ctx context.Context, profile *nnfv1alpha1.NnfDataMovementProfile, dm *nnfv1alpha1.NnfDataMovement, mpiHostfile string, log logr.Logger) error { + // These functions interact with the filesystem, so they can't run in the test env + if !isTestEnv() { + // Determine the destination directory based on the source and path + log.Info("Determining destination directory based on source/dest file types") + destDir, err := getDestinationDir(profile, dm, mpiHostfile, log) + if err != nil { + return dwsv1alpha2.NewResourceError("could not determine source type").WithError(err).WithFatal() + } - // Account for index mount directory on the destDir and the dm dest path - // This updates the destination on dm - if indexMount != "" { - log.Info("Index mount directory is required", "indexMountdir", indexMount) - d, err := handleIndexMountDir(destDir, indexMount, dm, mpiHostfile, log) + // See if an index mount directory on the destination is required + log.Info("Determining if index mount directory is required") + indexMount, err := r.checkIndexMountDir(ctx, dm) if err != nil { - return dwsv1alpha2.NewResourceError("could not handle index mount directory").WithError(err).WithFatal() + return dwsv1alpha2.NewResourceError("could not determine index mount directory").WithError(err).WithFatal() + } + + // Account for index mount directory on the destDir and the dm dest path + // This updates the destination on dm + if indexMount != "" { + log.Info("Index mount directory is required", "indexMountdir", indexMount) + d, err := handleIndexMountDir(profile, dm, destDir, indexMount, mpiHostfile, log) + if err != nil { + return dwsv1alpha2.NewResourceError("could not handle index mount directory").WithError(err).WithFatal() + } + destDir = d + log.Info("Updated destination for index mount directory", "destDir", destDir, "dm.Spec.Destination.Path", dm.Spec.Destination.Path) } - destDir = d - log.Info("Updated destination for index mount directory", "destDir", destDir, "dm.Spec.Destination.Path", dm.Spec.Destination.Path) - } - // Create the destination directory - log.Info("Creating destination directory", "destinationDir", destDir, "indexMountDir", indexMount) - if err := createDestinationDir(destDir, dm.Spec.UserId, dm.Spec.GroupId, mpiHostfile, log); err != nil { - return dwsv1alpha2.NewResourceError("could not create destination directory").WithError(err).WithFatal() + // Create the destination directory + log.Info("Creating destination directory", "destinationDir", destDir, "indexMountDir", indexMount) + if err := createDestinationDir(profile, dm, destDir, mpiHostfile, log); err != nil { + return dwsv1alpha2.NewResourceError("could not create destination directory").WithError(err).WithFatal() + } } log.Info("Destination prepared", "dm.Spec.Destination", dm.Spec.Destination) @@ -707,7 +712,7 @@ func extractIndexMountDir(path, namespace string) (string, error) { // Given a destination directory and index mount directory, apply the necessary changes to the // destination directory and the DM's destination path to account for index mount directories -func handleIndexMountDir(destDir, indexMount string, dm *nnfv1alpha1.NnfDataMovement, mpiHostfile string, log logr.Logger) (string, error) { +func handleIndexMountDir(profile *nnfv1alpha1.NnfDataMovementProfile, dm *nnfv1alpha1.NnfDataMovement, destDir, indexMount, mpiHostfile string, log logr.Logger) (string, error) { // For cases where the root directory (e.g. $DW_JOB_my_workflow) is supplied, the path will end // in the index mount directory without a trailing slash. If that's the case, there's nothing @@ -723,11 +728,11 @@ func handleIndexMountDir(destDir, indexMount string, dm *nnfv1alpha1.NnfDataMove dmDest := idxMntDir // Get the source to see if it's a file - srcIsFile, err := isSourceAFile(dm.Spec.Source.Path, dm.Spec.UserId, dm.Spec.GroupId, mpiHostfile, log) + srcIsFile, err := isSourceAFile(profile, dm, mpiHostfile, log) if err != nil { return "", err } - destIsFile := isDestAFile(dm.Spec.Destination.Path, dm.Spec.UserId, dm.Spec.GroupId, mpiHostfile, log) + destIsFile := isDestAFile(profile, dm, mpiHostfile, log) log.Info("Checking source and dest types", "srcIsFile", srcIsFile, "destIsFile", destIsFile) // Account for file-file @@ -749,21 +754,19 @@ func handleIndexMountDir(destDir, indexMount string, dm *nnfv1alpha1.NnfDataMove // Determine the directory path to create based on the source and destination. // Returns the mkdir directory and error. -func getDestinationDir(dm *nnfv1alpha1.NnfDataMovement, mpiHostfile string, log logr.Logger) (string, error) { +func getDestinationDir(profile *nnfv1alpha1.NnfDataMovementProfile, dm *nnfv1alpha1.NnfDataMovement, mpiHostfile string, log logr.Logger) (string, error) { // Default to using the full path of dest - src := dm.Spec.Source.Path - dest := dm.Spec.Destination.Path - destDir := dest + destDir := dm.Spec.Destination.Path - srcIsFile, err := isSourceAFile(src, dm.Spec.UserId, dm.Spec.GroupId, mpiHostfile, log) + srcIsFile, err := isSourceAFile(profile, dm, mpiHostfile, log) if err != nil { return "", err } // Account for file-file data movement - we don't want the full path // ex: /path/to/a/file -> /path/to/a - if srcIsFile && isDestAFile(dest, dm.Spec.UserId, dm.Spec.GroupId, mpiHostfile, log) { - destDir = filepath.Dir(dest) + if srcIsFile && isDestAFile(profile, dm, mpiHostfile, log) { + destDir = filepath.Dir(dm.Spec.Destination.Path) } // We know it's a directory, so we don't care about the trailing slash @@ -771,63 +774,50 @@ func getDestinationDir(dm *nnfv1alpha1.NnfDataMovement, mpiHostfile string, log } // Use mpirun to run stat on a file as a given UID/GID by using `setpriv` -func mpiStat(path string, uid, gid uint32, mpiHostfile string, log logr.Logger) (string, error) { - // Use setpriv to stat the path with the specified UID/GID. Only run it on 1 host (ie. -n 1) - cmd := fmt.Sprintf("mpirun --allow-run-as-root -n 1 --hostfile %s -- setpriv --euid %d --egid %d --clear-groups stat --cached never -c '%%F' %s", - mpiHostfile, uid, gid, path) +func mpiStat(profile *nnfv1alpha1.NnfDataMovementProfile, path string, uid, gid uint32, mpiHostfile string, log logr.Logger) (string, error) { + cmd := buildStatCommand(uid, gid, profile.Data.StatCommand, mpiHostfile, path) output, err := command.Run(cmd, log) if err != nil { return output, fmt.Errorf("could not stat path ('%s'): %w", path, err) } - log.Info("mpiStat", "path", path, "output", output) + log.Info("mpiStat", "command", cmd, "path", path, "output", output) return output, nil } -// Use mpirun to check if a file exists -func mpiExists(path string, uid, gid uint32, mpiHostfile string, log logr.Logger) (bool, error) { - _, err := mpiStat(path, uid, gid, mpiHostfile, log) - if err != nil { - if strings.Contains(strings.ToLower(err.Error()), "no such file or directory") { - return false, nil - } - return false, err - } - - return true, nil -} - // Use mpirun to determine if a given path is a directory -func mpiIsDir(path string, uid, gid uint32, mpiHostfile string, log logr.Logger) (bool, error) { - output, err := mpiStat(path, uid, gid, mpiHostfile, log) +func mpiIsDir(profile *nnfv1alpha1.NnfDataMovementProfile, path string, uid, gid uint32, mpiHostfile string, log logr.Logger) (bool, error) { + output, err := mpiStat(profile, path, uid, gid, mpiHostfile, log) if err != nil { return false, err } if strings.Contains(strings.ToLower(output), "directory") { - log.Info("mpiIsDir", "directory", true) + log.Info("mpiIsDir", "path", path, "directory", true) return true, nil - } else { - log.Info("mpiIsDir", "directory", true) + } else if strings.Contains(strings.ToLower(output), "file") { + log.Info("mpiIsDir", "path", path, "directory", false) return false, nil + } else { + return false, fmt.Errorf("could not determine file type of path ('%s'): %s", path, output) } } // Check to see if the source path is a file. The source must exist and will result in error if it // does not. Do not use mpi in the test environment. -func isSourceAFile(src string, uid, gid uint32, mpiHostFile string, log logr.Logger) (bool, error) { +func isSourceAFile(profile *nnfv1alpha1.NnfDataMovementProfile, dm *nnfv1alpha1.NnfDataMovement, mpiHostFile string, log logr.Logger) (bool, error) { var isDir bool var err error if isTestEnv() { - sf, err := os.Stat(src) + sf, err := os.Stat(dm.Spec.Source.Path) if err != nil { return false, fmt.Errorf("source file does not exist: %w", err) } isDir = sf.IsDir() } else { - isDir, err = mpiIsDir(src, uid, gid, mpiHostFile, log) + isDir, err = mpiIsDir(profile, dm.Spec.Source.Path, dm.Spec.UserId, dm.Spec.GroupId, mpiHostFile, log) if err != nil { return false, err } @@ -839,9 +829,10 @@ func isSourceAFile(src string, uid, gid uint32, mpiHostFile string, log logr.Log // Check to see if the destination path is a file. If it exists, use stat to determine if it is a // file or a directory. If it doesn't exist, check for a trailing slash and make an assumption based // on that. -func isDestAFile(dest string, uid, gid uint32, mpiHostFile string, log logr.Logger) bool { +func isDestAFile(profile *nnfv1alpha1.NnfDataMovementProfile, dm *nnfv1alpha1.NnfDataMovement, mpiHostFile string, log logr.Logger) bool { isFile := false exists := true + dest := dm.Spec.Destination.Path // Attempt to the get the destination file. The error is not important since an assumption can // be made by checking if there is a trailing slash. @@ -853,7 +844,7 @@ func isDestAFile(dest string, uid, gid uint32, mpiHostFile string, log logr.Logg exists = false } } else { - isDir, err := mpiIsDir(dest, uid, gid, mpiHostFile, log) + isDir, err := mpiIsDir(profile, dest, dm.Spec.UserId, dm.Spec.GroupId, mpiHostFile, log) if err == nil { // file exists, so use mpiIsDir() result isFile = !isDir } else { @@ -870,17 +861,32 @@ func isDestAFile(dest string, uid, gid uint32, mpiHostFile string, log logr.Logg return isFile } -func createDestinationDir(dest string, uid, gid uint32, mpiHostfile string, log logr.Logger) error { +func createDestinationDir(profile *nnfv1alpha1.NnfDataMovementProfile, dm *nnfv1alpha1.NnfDataMovement, dest, mpiHostfile string, log logr.Logger) error { + + // Use mpirun to check if a file exists + mpiExists := func() (bool, error) { + _, err := mpiStat(profile, dest, dm.Spec.UserId, dm.Spec.GroupId, mpiHostfile, log) + if err != nil { + if strings.Contains(strings.ToLower(err.Error()), "no such file or directory") { + return false, nil + } + return false, err + } + + return true, nil + } + // Don't do anything if it already exists - if exists, err := mpiExists(dest, uid, gid, mpiHostfile, log); err != nil { + if exists, err := mpiExists(); err != nil { return err } else if exists { return nil } + // TODO mkdir command? // Use setpriv to create the directory with the specified UID/GID cmd := fmt.Sprintf("mpirun --allow-run-as-root --hostfile %s -- setpriv --euid %d --egid %d --clear-groups mkdir -p %s", - mpiHostfile, uid, gid, dest) + mpiHostfile, dm.Spec.UserId, dm.Spec.GroupId, dest) output, err := command.Run(cmd, log) if err != nil { return fmt.Errorf("data movement mkdir failed ('%s'): %w output: %s", cmd, err, output) diff --git a/internal/controller/datamovement_controller_test.go b/internal/controller/datamovement_controller_test.go index 9bf36ff8..7bddcba5 100644 --- a/internal/controller/datamovement_controller_test.go +++ b/internal/controller/datamovement_controller_test.go @@ -43,6 +43,7 @@ import ( "k8s.io/client-go/util/retry" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + "sigs.k8s.io/controller-runtime/pkg/log" ) // This is dumped into a temporary file and then ran as a bash script. @@ -800,7 +801,7 @@ var _ = Describe("Data Movement Test", func() { "mpirun --allow-run-as-root --hostfile /tmp/hostfile dcp --progress 1 --uid %d --gid %d --extra opts %s %s", expectedUid, expectedGid, srcPath, destPath) - cmd, err := buildDMCommand(context.TODO(), &profile, "/tmp/hostfile", &dm) + cmd, err := buildDMCommand(&profile, "/tmp/hostfile", &dm, log.FromContext(context.TODO())) Expect(err).ToNot(HaveOccurred()) Expect(strings.Join(cmd, " ")).Should(MatchRegexp(expectedCmdRegex)) }) @@ -902,7 +903,9 @@ var _ = Describe("Data Movement Test", func() { }, } - destDir, err := getDestinationDir(dm, "", logr.Logger{}) + dmProfile := &nnfv1alpha1.NnfDataMovementProfile{} + + destDir, err := getDestinationDir(dmProfile, dm, "", logr.Logger{}) destDir = strings.Replace(destDir, tmpDir, "", -1) // remove tmpdir from the path Expect(err).ToNot(HaveOccurred()) Expect(destDir).To(Equal(expected)) @@ -1008,7 +1011,9 @@ var _ = Describe("Data Movement Test", func() { }, } - newDestDir, err := handleIndexMountDir(destDir, idxMount, dm, "", logr.Logger{}) + dmProfile := &nnfv1alpha1.NnfDataMovementProfile{} + + newDestDir, err := handleIndexMountDir(dmProfile, dm, destDir, idxMount, "", logr.Logger{}) Expect(err).ToNot((HaveOccurred())) // Remove any tmpDir paths before verifying diff --git a/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfcontainerprofile_webhook.go b/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfcontainerprofile_webhook.go index c6b94805..31795fc5 100644 --- a/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfcontainerprofile_webhook.go +++ b/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfcontainerprofile_webhook.go @@ -1,5 +1,5 @@ /* - * Copyright 2023 Hewlett Packard Enterprise Development LP + * Copyright 2023-2024 Hewlett Packard Enterprise Development LP * Other additional copyright holders may be indicated within. * * The entirety of this work is licensed under the Apache License, @@ -36,12 +36,15 @@ import ( // log is for logging in this package. var nnfcontainerprofilelog = logf.Log.WithName("nnfcontainerprofile") +// SetupWebhookWithManager will setup the manager to manage the webhooks func (r *NnfContainerProfile) SetupWebhookWithManager(mgr ctrl.Manager) error { return ctrl.NewWebhookManagedBy(mgr). For(r). Complete() } +// NOTE: The 'path' attribute must follow a specific pattern and should not be modified directly here. +// Modifying the path for an invalid path can cause API server errors; failing to locate the webhook. //+kubebuilder:webhook:path=/validate-nnf-cray-hpe-com-v1alpha1-nnfcontainerprofile,mutating=false,failurePolicy=fail,sideEffects=None,groups=nnf.cray.hpe.com,resources=nnfcontainerprofiles,verbs=create;update,versions=v1alpha1,name=vnnfcontainerprofile.kb.io,admissionReviewVersions=v1 var _ webhook.Validator = &NnfContainerProfile{} diff --git a/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfdatamovementprofile_types.go b/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfdatamovementprofile_types.go index 5cad69d4..701181ac 100644 --- a/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfdatamovementprofile_types.go +++ b/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfdatamovementprofile_types.go @@ -82,6 +82,18 @@ type NnfDataMovementProfileData struct { // is issued. // +kubebuilder:default:=true CreateDestDir bool `json:"createDestDir"` + + // If CreateDestDir is true, then use StatCommand to perform the stat commands. + // Use setpriv to stat the path with the specified UID/GID. + // Available $VARS: + // HOSTFILE: hostfile that is created and used for mpirun. Contains a list of hosts and the + // slots/max_slots for each host. This hostfile is created at + // `/tmp//hostfile`. This is the same hostfile used as the one for Command. + // UID: User ID that is inherited from the Workflow + // GID: Group ID that is inherited from the Workflow + // PATH: Path to stat + // +kubebuilder:default:="mpirun --allow-run-as-root -np 1 --hostfile $HOSTFILE -- setpriv --euid $UID --egid $GID --clear-groups stat --cached never -c '%F' $PATH" + StatCommand string `json:"statCommand"` } // +kubebuilder:object:root=true diff --git a/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfdatamovementprofile_webhook.go b/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfdatamovementprofile_webhook.go index 55f785bf..7f39d845 100644 --- a/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfdatamovementprofile_webhook.go +++ b/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfdatamovementprofile_webhook.go @@ -41,6 +41,8 @@ func (r *NnfDataMovementProfile) SetupWebhookWithManager(mgr ctrl.Manager) error Complete() } +// NOTE: The 'path' attribute must follow a specific pattern and should not be modified directly here. +// Modifying the path for an invalid path can cause API server errors; failing to locate the webhook. // +kubebuilder:webhook:path=/validate-nnf-cray-hpe-com-v1alpha1-nnfdatamovementprofile,mutating=false,failurePolicy=fail,sideEffects=None,groups=nnf.cray.hpe.com,resources=nnfdatamovementprofiles,verbs=create;update,versions=v1alpha1,name=vnnfdatamovementprofile.kb.io,admissionReviewVersions=v1 var _ webhook.Validator = &NnfDataMovementProfile{} diff --git a/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfstorageprofile_webhook.go b/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfstorageprofile_webhook.go index 9ff9d03a..6e8cb43f 100644 --- a/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfstorageprofile_webhook.go +++ b/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfstorageprofile_webhook.go @@ -35,12 +35,15 @@ import ( // log is for logging in this package. var nnfstorageprofilelog = logf.Log.WithName("nnfstorageprofile") +// SetupWebhookWithManager will setup the manager to manage the webhooks func (r *NnfStorageProfile) SetupWebhookWithManager(mgr ctrl.Manager) error { return ctrl.NewWebhookManagedBy(mgr). For(r). Complete() } +// NOTE: The 'path' attribute must follow a specific pattern and should not be modified directly here. +// Modifying the path for an invalid path can cause API server errors; failing to locate the webhook. //+kubebuilder:webhook:path=/validate-nnf-cray-hpe-com-v1alpha1-nnfstorageprofile,mutating=false,failurePolicy=fail,sideEffects=None,groups=nnf.cray.hpe.com,resources=nnfstorageprofiles,verbs=create;update,versions=v1alpha1,name=vnnfstorageprofile.kb.io,admissionReviewVersions=v1 var _ webhook.Validator = &NnfStorageProfile{} diff --git a/vendor/github.com/NearNodeFlash/nnf-sos/config/crd/bases/nnf.cray.hpe.com_nnfdatamovementprofiles.yaml b/vendor/github.com/NearNodeFlash/nnf-sos/config/crd/bases/nnf.cray.hpe.com_nnfdatamovementprofiles.yaml index 28886fe1..1e426146 100644 --- a/vendor/github.com/NearNodeFlash/nnf-sos/config/crd/bases/nnf.cray.hpe.com_nnfdatamovementprofiles.yaml +++ b/vendor/github.com/NearNodeFlash/nnf-sos/config/crd/bases/nnf.cray.hpe.com_nnfdatamovementprofiles.yaml @@ -98,6 +98,21 @@ spec: slots in the hostfile. minimum: 0 type: integer + statCommand: + default: mpirun --allow-run-as-root -np 1 --hostfile $HOSTFILE -- + setpriv --euid $UID --egid $GID --clear-groups stat --cached never + -c '%F' $PATH + description: |- + If CreateDestDir is true, then use StatCommand to perform the stat commands. + Use setpriv to stat the path with the specified UID/GID. + Available $VARS: + HOSTFILE: hostfile that is created and used for mpirun. Contains a list of hosts and the + slots/max_slots for each host. This hostfile is created at + `/tmp//hostfile`. This is the same hostfile used as the one for Command. + UID: User ID that is inherited from the Workflow + GID: Group ID that is inherited from the Workflow + PATH: Path to stat + type: string storeStdout: default: false description: |- @@ -109,6 +124,7 @@ spec: - createDestDir - maxSlots - slots + - statCommand type: object kind: description: |- diff --git a/vendor/modules.txt b/vendor/modules.txt index 17822d46..3c2c43f2 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -10,7 +10,7 @@ github.com/NearNodeFlash/lustre-fs-operator/config/crd/bases # github.com/NearNodeFlash/nnf-ec v0.0.1-0.20240820195316-cb407b151cb4 ## explicit; go 1.19 github.com/NearNodeFlash/nnf-ec/pkg/rfsf/pkg/models -# github.com/NearNodeFlash/nnf-sos v0.0.1-0.20240821141947-f61076751e0f +# github.com/NearNodeFlash/nnf-sos v0.0.1-0.20240826132702-ccad8ac920b3 ## explicit; go 1.21 github.com/NearNodeFlash/nnf-sos/api/v1alpha1 github.com/NearNodeFlash/nnf-sos/config/crd/bases From 52b73d35c1c65c6cb9b1e5120d2a628ef1293f85 Mon Sep 17 00:00:00 2001 From: Blake Devcich <89158881+bdevcich@users.noreply.github.com> Date: Thu, 29 Aug 2024 12:23:40 -0500 Subject: [PATCH 2/6] Add mpirunOptions to Copy Offload API (#203) Applications like SCR need a way to add things like `-N` or `-n` to specific data movement requests. Adding `mpirunOptions` allows users to do that. This is a freeform field that will insert the options after `mpirun` appears in the `Command`. This change also makes the behavior `dcpOptions` to be consistent with `mpirunOptions`. Signed-off-by: Blake Devcich --- daemons/compute/api/datamovement.proto | 6 +- .../compute/client-go/api/datamovement.pb.go | 322 +++++++++--------- .../client-go/api/datamovement_grpc.pb.go | 2 +- daemons/compute/client-go/main.go | 24 +- daemons/compute/client-py/datamovement_pb2.py | 64 ++-- daemons/compute/copy-offload-api.html | 9 +- daemons/compute/lib-cpp/client.cc | 3 +- daemons/compute/lib-cpp/client.h | 2 +- .../compute/lib-cpp/example/client-example.cc | 2 +- .../compute/server/servers/server_default.go | 3 +- go.mod | 2 +- go.sum | 4 +- .../controller/datamovement_controller.go | 38 ++- .../datamovement_controller_test.go | 26 +- .../api/v1alpha1/nnf_datamovement_types.go | 5 +- .../v1alpha1/nnfdatamovementprofile_types.go | 4 +- ....cray.hpe.com_nnfdatamovementprofiles.yaml | 4 +- .../nnf.cray.hpe.com_nnfdatamovements.yaml | 4 + vendor/modules.txt | 2 +- 19 files changed, 294 insertions(+), 232 deletions(-) diff --git a/daemons/compute/api/datamovement.proto b/daemons/compute/api/datamovement.proto index 25513e8b..ccc1d07f 100644 --- a/daemons/compute/api/datamovement.proto +++ b/daemons/compute/api/datamovement.proto @@ -101,7 +101,7 @@ message DataMovementCreateRequest { // Extra options to pass to `dcp` if present in the Data Movement command. string dcpOptions = 5; - // If true, enable server-side logging of stdout when the command is successful. Failures output is always logged. + // If true, enable server-side logging of stdout when the command is successful. Failure output is always logged. bool logStdout = 6; // If true, store stdout in DataMovementStatusResponse.Message when the command is successful. Failure output is always contained in the message. @@ -120,6 +120,10 @@ message DataMovementCreateRequest { // server otherwise the data movement operation will be invalid. Empty will default to the // default profile. string profile = 10; + + // Extra options to pass to `mpirun` if present in the Data Movement command. + string mpirunOptions = 11; + } // The Data Movement Create Response to indicate the status of of the Data Movement Request. diff --git a/daemons/compute/client-go/api/datamovement.pb.go b/daemons/compute/client-go/api/datamovement.pb.go index 56f979b1..d05e3b0e 100644 --- a/daemons/compute/client-go/api/datamovement.pb.go +++ b/daemons/compute/client-go/api/datamovement.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v4.25.0 +// protoc-gen-go v1.34.2 +// protoc v5.27.1 // source: api/datamovement.proto package api @@ -527,7 +527,7 @@ type DataMovementCreateRequest struct { Dryrun bool `protobuf:"varint,4,opt,name=dryrun,proto3" json:"dryrun,omitempty"` // Extra options to pass to `dcp` if present in the Data Movement command. DcpOptions string `protobuf:"bytes,5,opt,name=dcpOptions,proto3" json:"dcpOptions,omitempty"` - // If true, enable server-side logging of stdout when the command is successful. Failures output is always logged. + // If true, enable server-side logging of stdout when the command is successful. Failure output is always logged. LogStdout bool `protobuf:"varint,6,opt,name=logStdout,proto3" json:"logStdout,omitempty"` // If true, store stdout in DataMovementStatusResponse.Message when the command is successful. Failure output is always contained in the message. StoreStdout bool `protobuf:"varint,7,opt,name=storeStdout,proto3" json:"storeStdout,omitempty"` @@ -542,6 +542,8 @@ type DataMovementCreateRequest struct { // server otherwise the data movement operation will be invalid. Empty will default to the // default profile. Profile string `protobuf:"bytes,10,opt,name=profile,proto3" json:"profile,omitempty"` + // Extra options to pass to `mpirun` if present in the Data Movement command. + MpirunOptions string `protobuf:"bytes,11,opt,name=mpirunOptions,proto3" json:"mpirunOptions,omitempty"` } func (x *DataMovementCreateRequest) Reset() { @@ -646,6 +648,13 @@ func (x *DataMovementCreateRequest) GetProfile() string { return "" } +func (x *DataMovementCreateRequest) GetMpirunOptions() string { + if x != nil { + return x.MpirunOptions + } + return "" +} + // The Data Movement Create Response to indicate the status of of the Data Movement Request. type DataMovementCreateResponse struct { state protoimpl.MessageState @@ -1233,7 +1242,7 @@ var file_api_datamovement_proto_rawDesc = []byte{ 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xd9, 0x02, 0x0a, 0x19, 0x44, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xff, 0x02, 0x0a, 0x19, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x61, 0x74, @@ -1255,150 +1264,153 @@ var file_api_datamovement_proto_rawDesc = []byte{ 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x6c, 0x6f, 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x53, 0x6c, 0x6f, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x22, 0xc1, 0x01, 0x0a, 0x1a, 0x44, 0x61, 0x74, 0x61, 0x4d, - 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x47, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x70, 0x69, 0x72, 0x75, 0x6e, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, + 0x70, 0x69, 0x72, 0x75, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xc1, 0x01, 0x0a, + 0x1a, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x47, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x22, 0x2e, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, + 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, + 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x02, + 0x22, 0x8f, 0x01, 0x0a, 0x19, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, + 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x10, + 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, + 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x57, 0x61, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x57, 0x61, 0x69, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x22, 0x91, 0x04, 0x0a, 0x1a, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x44, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x47, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x2e, 0x0a, 0x06, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, - 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, - 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x02, 0x22, 0x8f, 0x01, 0x0a, 0x19, 0x44, - 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, - 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x08, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, - 0x78, 0x57, 0x61, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0b, 0x6d, 0x61, 0x78, 0x57, 0x61, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x91, 0x04, 0x0a, - 0x1a, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, - 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x47, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x12, 0x4d, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, - 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x61, 0x0a, 0x05, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, - 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x41, 0x52, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, - 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, - 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x43, - 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x11, 0x0a, 0x0d, 0x55, - 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0x05, 0x22, 0x60, - 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, - 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, - 0x4e, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, - 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x0d, 0x0a, - 0x09, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, - 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x10, 0x05, - 0x22, 0x6d, 0x0a, 0x19, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, - 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x10, 0x0a, - 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, - 0xcb, 0x01, 0x0a, 0x1a, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x22, 0x4a, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x54, 0x5f, - 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x03, - 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x04, 0x22, 0x59, 0x0a, - 0x17, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, - 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x08, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x22, 0x2e, 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, - 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x04, 0x75, 0x69, 0x64, 0x73, 0x22, 0x6d, 0x0a, 0x19, 0x44, 0x61, 0x74, 0x61, - 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, - 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x08, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xbe, 0x01, 0x0a, 0x1a, 0x44, 0x61, 0x74, 0x61, + 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x4d, 0x0a, 0x0d, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, + 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, + 0x65, 0x22, 0x61, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, + 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x41, 0x52, 0x54, + 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, + 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, + 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x49, 0x4e, 0x47, 0x10, + 0x04, 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x10, 0x05, 0x22, 0x60, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, + 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x4e, + 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, + 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, + 0x44, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, + 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x53, 0x54, + 0x41, 0x54, 0x55, 0x53, 0x10, 0x05, 0x22, 0x6d, 0x0a, 0x19, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, + 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xcb, 0x01, 0x0a, 0x1a, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, + 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x4a, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0d, + 0x0a, 0x09, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, + 0x07, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x43, + 0x54, 0x49, 0x56, 0x45, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, + 0x4e, 0x10, 0x04, 0x22, 0x59, 0x0a, 0x17, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, + 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x22, 0x2e, + 0x0a, 0x18, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x69, + 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x75, 0x69, 0x64, 0x73, 0x22, 0x6d, + 0x0a, 0x19, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x61, + 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x08, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x10, 0x0a, 0x03, 0x75, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xbe, 0x01, + 0x0a, 0x1a, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x61, + 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, + 0x3d, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, + 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, + 0x55, 0x4e, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, + 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x32, 0xb0, + 0x04, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x07, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x06, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3d, 0x0a, 0x06, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, - 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x01, 0x12, - 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, - 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x32, 0xb0, 0x04, 0x0a, 0x09, 0x44, 0x61, 0x74, - 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x12, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, - 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x27, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, - 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x25, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, - 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x06, - 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x12, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x6e, 0x63, 0x65, - 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x57, 0x0a, 0x1d, 0x63, - 0x6f, 0x6d, 0x2e, 0x68, 0x70, 0x65, 0x2e, 0x63, 0x72, 0x61, 0x79, 0x2e, 0x6e, 0x6e, 0x66, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x11, 0x44, 0x61, - 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, - 0x01, 0x5a, 0x21, 0x6e, 0x6e, 0x66, 0x2e, 0x63, 0x72, 0x61, 0x79, 0x2e, 0x68, 0x70, 0x65, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2f, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x06, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x06, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x12, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x04, 0x4c, 0x69, 0x73, + 0x74, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, + 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x06, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x12, 0x27, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x42, 0x57, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x70, 0x65, 0x2e, 0x63, 0x72, 0x61, + 0x79, 0x2e, 0x6e, 0x6e, 0x66, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x42, 0x11, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x21, 0x6e, 0x6e, 0x66, 0x2e, 0x63, 0x72, 0x61, + 0x79, 0x2e, 0x68, 0x70, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x6d, 0x6f, + 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -1415,7 +1427,7 @@ func file_api_datamovement_proto_rawDescGZIP() []byte { var file_api_datamovement_proto_enumTypes = make([]protoimpl.EnumInfo, 5) var file_api_datamovement_proto_msgTypes = make([]protoimpl.MessageInfo, 13) -var file_api_datamovement_proto_goTypes = []interface{}{ +var file_api_datamovement_proto_goTypes = []any{ (DataMovementCreateResponse_Status)(0), // 0: datamovement.DataMovementCreateResponse.Status (DataMovementStatusResponse_State)(0), // 1: datamovement.DataMovementStatusResponse.State (DataMovementStatusResponse_Status)(0), // 2: datamovement.DataMovementStatusResponse.Status @@ -1473,7 +1485,7 @@ func file_api_datamovement_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_api_datamovement_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_api_datamovement_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*DataMovementVersionResponse); i { case 0: return &v.state @@ -1485,7 +1497,7 @@ func file_api_datamovement_proto_init() { return nil } } - file_api_datamovement_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_api_datamovement_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*DataMovementWorkflow); i { case 0: return &v.state @@ -1497,7 +1509,7 @@ func file_api_datamovement_proto_init() { return nil } } - file_api_datamovement_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_api_datamovement_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*DataMovementCommandStatus); i { case 0: return &v.state @@ -1509,7 +1521,7 @@ func file_api_datamovement_proto_init() { return nil } } - file_api_datamovement_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_api_datamovement_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*DataMovementCreateRequest); i { case 0: return &v.state @@ -1521,7 +1533,7 @@ func file_api_datamovement_proto_init() { return nil } } - file_api_datamovement_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_api_datamovement_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*DataMovementCreateResponse); i { case 0: return &v.state @@ -1533,7 +1545,7 @@ func file_api_datamovement_proto_init() { return nil } } - file_api_datamovement_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_api_datamovement_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*DataMovementStatusRequest); i { case 0: return &v.state @@ -1545,7 +1557,7 @@ func file_api_datamovement_proto_init() { return nil } } - file_api_datamovement_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_api_datamovement_proto_msgTypes[6].Exporter = func(v any, i int) any { switch v := v.(*DataMovementStatusResponse); i { case 0: return &v.state @@ -1557,7 +1569,7 @@ func file_api_datamovement_proto_init() { return nil } } - file_api_datamovement_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_api_datamovement_proto_msgTypes[7].Exporter = func(v any, i int) any { switch v := v.(*DataMovementDeleteRequest); i { case 0: return &v.state @@ -1569,7 +1581,7 @@ func file_api_datamovement_proto_init() { return nil } } - file_api_datamovement_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_api_datamovement_proto_msgTypes[8].Exporter = func(v any, i int) any { switch v := v.(*DataMovementDeleteResponse); i { case 0: return &v.state @@ -1581,7 +1593,7 @@ func file_api_datamovement_proto_init() { return nil } } - file_api_datamovement_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_api_datamovement_proto_msgTypes[9].Exporter = func(v any, i int) any { switch v := v.(*DataMovementListRequest); i { case 0: return &v.state @@ -1593,7 +1605,7 @@ func file_api_datamovement_proto_init() { return nil } } - file_api_datamovement_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_api_datamovement_proto_msgTypes[10].Exporter = func(v any, i int) any { switch v := v.(*DataMovementListResponse); i { case 0: return &v.state @@ -1605,7 +1617,7 @@ func file_api_datamovement_proto_init() { return nil } } - file_api_datamovement_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_api_datamovement_proto_msgTypes[11].Exporter = func(v any, i int) any { switch v := v.(*DataMovementCancelRequest); i { case 0: return &v.state @@ -1617,7 +1629,7 @@ func file_api_datamovement_proto_init() { return nil } } - file_api_datamovement_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_api_datamovement_proto_msgTypes[12].Exporter = func(v any, i int) any { switch v := v.(*DataMovementCancelResponse); i { case 0: return &v.state diff --git a/daemons/compute/client-go/api/datamovement_grpc.pb.go b/daemons/compute/client-go/api/datamovement_grpc.pb.go index 0bce46dd..f1701ff2 100644 --- a/daemons/compute/client-go/api/datamovement_grpc.pb.go +++ b/daemons/compute/client-go/api/datamovement_grpc.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.0 +// - protoc v5.27.1 // source: api/datamovement.proto package api diff --git a/daemons/compute/client-go/main.go b/daemons/compute/client-go/main.go index c4a9e60e..4fe64882 100644 --- a/daemons/compute/client-go/main.go +++ b/daemons/compute/client-go/main.go @@ -47,6 +47,7 @@ func main() { maxWaitTime := flag.Int64("max-wait-time", 0, "maximum time to wait for status completion, in seconds.") count := flag.Int("count", 1, "number of requests to create") cancelExpiryTime := flag.Duration("cancel", -time.Second, "duration after create to cancel request") + mpirunOptions := flag.String("mpirun-options", "", "extra options to provide to mpirun") dcpOptions := flag.String("dcp-options", "", "extra options to provide to dcp") logStdout := flag.Bool("log-stdout", false, "enable server-side logging of stdout on successful dm") storeStdout := flag.Bool("store-stdout", false, "store stdout in status message on successful dm") @@ -102,7 +103,7 @@ func main() { log.Printf("Creating request %d of %d...", i+1, *count) createResponse, err := createRequest(ctx, c, *workflow, *namespace, - *source, *destination, *dryrun, *dcpOptions, + *source, *destination, *dryrun, *mpirunOptions, *dcpOptions, *logStdout, *storeStdout, *slots, *maxSlots, *profile) if err != nil { @@ -220,7 +221,7 @@ func versionRequest(ctx context.Context, client pb.DataMoverClient) (*pb.DataMov } func createRequest(ctx context.Context, client pb.DataMoverClient, workflow, namespace, - source, destination string, dryrun bool, dcpOptions string, logStdout, storeStdout bool, + source, destination string, dryrun bool, mpirunOptions, dcpOptions string, logStdout, storeStdout bool, slots, maxSlots int, profile string) (*pb.DataMovementCreateResponse, error) { rsp, err := client.Create(ctx, &pb.DataMovementCreateRequest{ @@ -228,15 +229,16 @@ func createRequest(ctx context.Context, client pb.DataMoverClient, workflow, nam Name: workflow, Namespace: namespace, }, - Source: source, - Destination: destination, - Dryrun: dryrun, - DcpOptions: dcpOptions, - LogStdout: logStdout, - StoreStdout: storeStdout, - Slots: int32(slots), - MaxSlots: int32(maxSlots), - Profile: profile, + Source: source, + Destination: destination, + Dryrun: dryrun, + MpirunOptions: mpirunOptions, + DcpOptions: dcpOptions, + LogStdout: logStdout, + StoreStdout: storeStdout, + Slots: int32(slots), + MaxSlots: int32(maxSlots), + Profile: profile, }) if err != nil { diff --git a/daemons/compute/client-py/datamovement_pb2.py b/daemons/compute/client-py/datamovement_pb2.py index e779d0b8..225da86c 100644 --- a/daemons/compute/client-py/datamovement_pb2.py +++ b/daemons/compute/client-py/datamovement_pb2.py @@ -14,7 +14,7 @@ from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12\x64\x61tamovement.proto\x12\x0c\x64\x61tamovement\x1a\x1bgoogle/protobuf/empty.proto\"C\n\x1b\x44\x61taMovementVersionResponse\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x13\n\x0b\x61piVersions\x18\x02 \x03(\t\"7\n\x14\x44\x61taMovementWorkflow\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\tnamespace\x18\x02 \x01(\t\"\x81\x01\n\x19\x44\x61taMovementCommandStatus\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\t\x12\x10\n\x08progress\x18\x02 \x01(\x05\x12\x13\n\x0b\x65lapsedTime\x18\x03 \x01(\t\x12\x13\n\x0blastMessage\x18\x04 \x01(\t\x12\x17\n\x0flastMessageTime\x18\x05 \x01(\t\"\xf4\x01\n\x19\x44\x61taMovementCreateRequest\x12\x34\n\x08workflow\x18\x01 \x01(\x0b\x32\".datamovement.DataMovementWorkflow\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65stination\x18\x03 \x01(\t\x12\x0e\n\x06\x64ryrun\x18\x04 \x01(\x08\x12\x12\n\ndcpOptions\x18\x05 \x01(\t\x12\x11\n\tlogStdout\x18\x06 \x01(\x08\x12\x13\n\x0bstoreStdout\x18\x07 \x01(\x08\x12\r\n\x05slots\x18\x08 \x01(\x05\x12\x10\n\x08maxSlots\x18\t \x01(\x05\x12\x0f\n\x07profile\x18\n \x01(\t\"\xab\x01\n\x1a\x44\x61taMovementCreateResponse\x12\x0b\n\x03uid\x18\x01 \x01(\t\x12?\n\x06status\x18\x02 \x01(\x0e\x32/.datamovement.DataMovementCreateResponse.Status\x12\x0f\n\x07message\x18\x03 \x01(\t\".\n\x06Status\x12\x0b\n\x07SUCCESS\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\x12\x0b\n\x07INVALID\x10\x02\"s\n\x19\x44\x61taMovementStatusRequest\x12\x34\n\x08workflow\x18\x01 \x01(\x0b\x32\".datamovement.DataMovementWorkflow\x12\x0b\n\x03uid\x18\x02 \x01(\t\x12\x13\n\x0bmaxWaitTime\x18\x03 \x01(\x03\"\xd6\x03\n\x1a\x44\x61taMovementStatusResponse\x12=\n\x05state\x18\x01 \x01(\x0e\x32..datamovement.DataMovementStatusResponse.State\x12?\n\x06status\x18\x02 \x01(\x0e\x32/.datamovement.DataMovementStatusResponse.Status\x12\x0f\n\x07message\x18\x03 \x01(\t\x12>\n\rcommandStatus\x18\x04 \x01(\x0b\x32\'.datamovement.DataMovementCommandStatus\x12\x11\n\tstartTime\x18\x05 \x01(\t\x12\x0f\n\x07\x65ndTime\x18\x06 \x01(\t\"a\n\x05State\x12\x0b\n\x07PENDING\x10\x00\x12\x0c\n\x08STARTING\x10\x01\x12\x0b\n\x07RUNNING\x10\x02\x12\r\n\tCOMPLETED\x10\x03\x12\x0e\n\nCANCELLING\x10\x04\x12\x11\n\rUNKNOWN_STATE\x10\x05\"`\n\x06Status\x12\x0b\n\x07INVALID\x10\x00\x12\r\n\tNOT_FOUND\x10\x01\x12\x0b\n\x07SUCCESS\x10\x02\x12\n\n\x06\x46\x41ILED\x10\x03\x12\r\n\tCANCELLED\x10\x04\x12\x12\n\x0eUNKNOWN_STATUS\x10\x05\"^\n\x19\x44\x61taMovementDeleteRequest\x12\x34\n\x08workflow\x18\x01 \x01(\x0b\x32\".datamovement.DataMovementWorkflow\x12\x0b\n\x03uid\x18\x02 \x01(\t\"\xba\x01\n\x1a\x44\x61taMovementDeleteResponse\x12?\n\x06status\x18\x01 \x01(\x0e\x32/.datamovement.DataMovementDeleteResponse.Status\x12\x0f\n\x07message\x18\x02 \x01(\t\"J\n\x06Status\x12\x0b\n\x07INVALID\x10\x00\x12\r\n\tNOT_FOUND\x10\x01\x12\x0b\n\x07SUCCESS\x10\x02\x12\n\n\x06\x41\x43TIVE\x10\x03\x12\x0b\n\x07UNKNOWN\x10\x04\"O\n\x17\x44\x61taMovementListRequest\x12\x34\n\x08workflow\x18\x01 \x01(\x0b\x32\".datamovement.DataMovementWorkflow\"(\n\x18\x44\x61taMovementListResponse\x12\x0c\n\x04uids\x18\x01 \x03(\t\"^\n\x19\x44\x61taMovementCancelRequest\x12\x34\n\x08workflow\x18\x01 \x01(\x0b\x32\".datamovement.DataMovementWorkflow\x12\x0b\n\x03uid\x18\x02 \x01(\t\"\xad\x01\n\x1a\x44\x61taMovementCancelResponse\x12?\n\x06status\x18\x01 \x01(\x0e\x32/.datamovement.DataMovementCancelResponse.Status\x12\x0f\n\x07message\x18\x02 \x01(\t\"=\n\x06Status\x12\x0b\n\x07INVALID\x10\x00\x12\r\n\tNOT_FOUND\x10\x01\x12\x0b\n\x07SUCCESS\x10\x02\x12\n\n\x06\x46\x41ILED\x10\x03\x32\xb0\x04\n\tDataMover\x12N\n\x07Version\x12\x16.google.protobuf.Empty\x1a).datamovement.DataMovementVersionResponse\"\x00\x12]\n\x06\x43reate\x12\'.datamovement.DataMovementCreateRequest\x1a(.datamovement.DataMovementCreateResponse\"\x00\x12]\n\x06Status\x12\'.datamovement.DataMovementStatusRequest\x1a(.datamovement.DataMovementStatusResponse\"\x00\x12]\n\x06\x44\x65lete\x12\'.datamovement.DataMovementDeleteRequest\x1a(.datamovement.DataMovementDeleteResponse\"\x00\x12W\n\x04List\x12%.datamovement.DataMovementListRequest\x1a&.datamovement.DataMovementListResponse\"\x00\x12]\n\x06\x43\x61ncel\x12\'.datamovement.DataMovementCancelRequest\x1a(.datamovement.DataMovementCancelResponse\"\x00\x42W\n\x1d\x63om.hpe.cray.nnf.datamovementB\x11\x44\x61taMovementProtoP\x01Z!nnf.cray.hpe.com/datamovement/apib\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12\x64\x61tamovement.proto\x12\x0c\x64\x61tamovement\x1a\x1bgoogle/protobuf/empty.proto\"C\n\x1b\x44\x61taMovementVersionResponse\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x13\n\x0b\x61piVersions\x18\x02 \x03(\t\"7\n\x14\x44\x61taMovementWorkflow\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\tnamespace\x18\x02 \x01(\t\"\x81\x01\n\x19\x44\x61taMovementCommandStatus\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\t\x12\x10\n\x08progress\x18\x02 \x01(\x05\x12\x13\n\x0b\x65lapsedTime\x18\x03 \x01(\t\x12\x13\n\x0blastMessage\x18\x04 \x01(\t\x12\x17\n\x0flastMessageTime\x18\x05 \x01(\t\"\x8b\x02\n\x19\x44\x61taMovementCreateRequest\x12\x34\n\x08workflow\x18\x01 \x01(\x0b\x32\".datamovement.DataMovementWorkflow\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65stination\x18\x03 \x01(\t\x12\x0e\n\x06\x64ryrun\x18\x04 \x01(\x08\x12\x12\n\ndcpOptions\x18\x05 \x01(\t\x12\x11\n\tlogStdout\x18\x06 \x01(\x08\x12\x13\n\x0bstoreStdout\x18\x07 \x01(\x08\x12\r\n\x05slots\x18\x08 \x01(\x05\x12\x10\n\x08maxSlots\x18\t \x01(\x05\x12\x0f\n\x07profile\x18\n \x01(\t\x12\x15\n\rmpirunOptions\x18\x0b \x01(\t\"\xab\x01\n\x1a\x44\x61taMovementCreateResponse\x12\x0b\n\x03uid\x18\x01 \x01(\t\x12?\n\x06status\x18\x02 \x01(\x0e\x32/.datamovement.DataMovementCreateResponse.Status\x12\x0f\n\x07message\x18\x03 \x01(\t\".\n\x06Status\x12\x0b\n\x07SUCCESS\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\x12\x0b\n\x07INVALID\x10\x02\"s\n\x19\x44\x61taMovementStatusRequest\x12\x34\n\x08workflow\x18\x01 \x01(\x0b\x32\".datamovement.DataMovementWorkflow\x12\x0b\n\x03uid\x18\x02 \x01(\t\x12\x13\n\x0bmaxWaitTime\x18\x03 \x01(\x03\"\xd6\x03\n\x1a\x44\x61taMovementStatusResponse\x12=\n\x05state\x18\x01 \x01(\x0e\x32..datamovement.DataMovementStatusResponse.State\x12?\n\x06status\x18\x02 \x01(\x0e\x32/.datamovement.DataMovementStatusResponse.Status\x12\x0f\n\x07message\x18\x03 \x01(\t\x12>\n\rcommandStatus\x18\x04 \x01(\x0b\x32\'.datamovement.DataMovementCommandStatus\x12\x11\n\tstartTime\x18\x05 \x01(\t\x12\x0f\n\x07\x65ndTime\x18\x06 \x01(\t\"a\n\x05State\x12\x0b\n\x07PENDING\x10\x00\x12\x0c\n\x08STARTING\x10\x01\x12\x0b\n\x07RUNNING\x10\x02\x12\r\n\tCOMPLETED\x10\x03\x12\x0e\n\nCANCELLING\x10\x04\x12\x11\n\rUNKNOWN_STATE\x10\x05\"`\n\x06Status\x12\x0b\n\x07INVALID\x10\x00\x12\r\n\tNOT_FOUND\x10\x01\x12\x0b\n\x07SUCCESS\x10\x02\x12\n\n\x06\x46\x41ILED\x10\x03\x12\r\n\tCANCELLED\x10\x04\x12\x12\n\x0eUNKNOWN_STATUS\x10\x05\"^\n\x19\x44\x61taMovementDeleteRequest\x12\x34\n\x08workflow\x18\x01 \x01(\x0b\x32\".datamovement.DataMovementWorkflow\x12\x0b\n\x03uid\x18\x02 \x01(\t\"\xba\x01\n\x1a\x44\x61taMovementDeleteResponse\x12?\n\x06status\x18\x01 \x01(\x0e\x32/.datamovement.DataMovementDeleteResponse.Status\x12\x0f\n\x07message\x18\x02 \x01(\t\"J\n\x06Status\x12\x0b\n\x07INVALID\x10\x00\x12\r\n\tNOT_FOUND\x10\x01\x12\x0b\n\x07SUCCESS\x10\x02\x12\n\n\x06\x41\x43TIVE\x10\x03\x12\x0b\n\x07UNKNOWN\x10\x04\"O\n\x17\x44\x61taMovementListRequest\x12\x34\n\x08workflow\x18\x01 \x01(\x0b\x32\".datamovement.DataMovementWorkflow\"(\n\x18\x44\x61taMovementListResponse\x12\x0c\n\x04uids\x18\x01 \x03(\t\"^\n\x19\x44\x61taMovementCancelRequest\x12\x34\n\x08workflow\x18\x01 \x01(\x0b\x32\".datamovement.DataMovementWorkflow\x12\x0b\n\x03uid\x18\x02 \x01(\t\"\xad\x01\n\x1a\x44\x61taMovementCancelResponse\x12?\n\x06status\x18\x01 \x01(\x0e\x32/.datamovement.DataMovementCancelResponse.Status\x12\x0f\n\x07message\x18\x02 \x01(\t\"=\n\x06Status\x12\x0b\n\x07INVALID\x10\x00\x12\r\n\tNOT_FOUND\x10\x01\x12\x0b\n\x07SUCCESS\x10\x02\x12\n\n\x06\x46\x41ILED\x10\x03\x32\xb0\x04\n\tDataMover\x12N\n\x07Version\x12\x16.google.protobuf.Empty\x1a).datamovement.DataMovementVersionResponse\"\x00\x12]\n\x06\x43reate\x12\'.datamovement.DataMovementCreateRequest\x1a(.datamovement.DataMovementCreateResponse\"\x00\x12]\n\x06Status\x12\'.datamovement.DataMovementStatusRequest\x1a(.datamovement.DataMovementStatusResponse\"\x00\x12]\n\x06\x44\x65lete\x12\'.datamovement.DataMovementDeleteRequest\x1a(.datamovement.DataMovementDeleteResponse\"\x00\x12W\n\x04List\x12%.datamovement.DataMovementListRequest\x1a&.datamovement.DataMovementListResponse\"\x00\x12]\n\x06\x43\x61ncel\x12\'.datamovement.DataMovementCancelRequest\x1a(.datamovement.DataMovementCancelResponse\"\x00\x42W\n\x1d\x63om.hpe.cray.nnf.datamovementB\x11\x44\x61taMovementProtoP\x01Z!nnf.cray.hpe.com/datamovement/apib\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -29,35 +29,35 @@ _globals['_DATAMOVEMENTCOMMANDSTATUS']._serialized_start=192 _globals['_DATAMOVEMENTCOMMANDSTATUS']._serialized_end=321 _globals['_DATAMOVEMENTCREATEREQUEST']._serialized_start=324 - _globals['_DATAMOVEMENTCREATEREQUEST']._serialized_end=568 - _globals['_DATAMOVEMENTCREATERESPONSE']._serialized_start=571 - _globals['_DATAMOVEMENTCREATERESPONSE']._serialized_end=742 - _globals['_DATAMOVEMENTCREATERESPONSE_STATUS']._serialized_start=696 - _globals['_DATAMOVEMENTCREATERESPONSE_STATUS']._serialized_end=742 - _globals['_DATAMOVEMENTSTATUSREQUEST']._serialized_start=744 - _globals['_DATAMOVEMENTSTATUSREQUEST']._serialized_end=859 - _globals['_DATAMOVEMENTSTATUSRESPONSE']._serialized_start=862 - _globals['_DATAMOVEMENTSTATUSRESPONSE']._serialized_end=1332 - _globals['_DATAMOVEMENTSTATUSRESPONSE_STATE']._serialized_start=1137 - _globals['_DATAMOVEMENTSTATUSRESPONSE_STATE']._serialized_end=1234 - _globals['_DATAMOVEMENTSTATUSRESPONSE_STATUS']._serialized_start=1236 - _globals['_DATAMOVEMENTSTATUSRESPONSE_STATUS']._serialized_end=1332 - _globals['_DATAMOVEMENTDELETEREQUEST']._serialized_start=1334 - _globals['_DATAMOVEMENTDELETEREQUEST']._serialized_end=1428 - _globals['_DATAMOVEMENTDELETERESPONSE']._serialized_start=1431 - _globals['_DATAMOVEMENTDELETERESPONSE']._serialized_end=1617 - _globals['_DATAMOVEMENTDELETERESPONSE_STATUS']._serialized_start=1543 - _globals['_DATAMOVEMENTDELETERESPONSE_STATUS']._serialized_end=1617 - _globals['_DATAMOVEMENTLISTREQUEST']._serialized_start=1619 - _globals['_DATAMOVEMENTLISTREQUEST']._serialized_end=1698 - _globals['_DATAMOVEMENTLISTRESPONSE']._serialized_start=1700 - _globals['_DATAMOVEMENTLISTRESPONSE']._serialized_end=1740 - _globals['_DATAMOVEMENTCANCELREQUEST']._serialized_start=1742 - _globals['_DATAMOVEMENTCANCELREQUEST']._serialized_end=1836 - _globals['_DATAMOVEMENTCANCELRESPONSE']._serialized_start=1839 - _globals['_DATAMOVEMENTCANCELRESPONSE']._serialized_end=2012 - _globals['_DATAMOVEMENTCANCELRESPONSE_STATUS']._serialized_start=1236 - _globals['_DATAMOVEMENTCANCELRESPONSE_STATUS']._serialized_end=1297 - _globals['_DATAMOVER']._serialized_start=2015 - _globals['_DATAMOVER']._serialized_end=2575 + _globals['_DATAMOVEMENTCREATEREQUEST']._serialized_end=591 + _globals['_DATAMOVEMENTCREATERESPONSE']._serialized_start=594 + _globals['_DATAMOVEMENTCREATERESPONSE']._serialized_end=765 + _globals['_DATAMOVEMENTCREATERESPONSE_STATUS']._serialized_start=719 + _globals['_DATAMOVEMENTCREATERESPONSE_STATUS']._serialized_end=765 + _globals['_DATAMOVEMENTSTATUSREQUEST']._serialized_start=767 + _globals['_DATAMOVEMENTSTATUSREQUEST']._serialized_end=882 + _globals['_DATAMOVEMENTSTATUSRESPONSE']._serialized_start=885 + _globals['_DATAMOVEMENTSTATUSRESPONSE']._serialized_end=1355 + _globals['_DATAMOVEMENTSTATUSRESPONSE_STATE']._serialized_start=1160 + _globals['_DATAMOVEMENTSTATUSRESPONSE_STATE']._serialized_end=1257 + _globals['_DATAMOVEMENTSTATUSRESPONSE_STATUS']._serialized_start=1259 + _globals['_DATAMOVEMENTSTATUSRESPONSE_STATUS']._serialized_end=1355 + _globals['_DATAMOVEMENTDELETEREQUEST']._serialized_start=1357 + _globals['_DATAMOVEMENTDELETEREQUEST']._serialized_end=1451 + _globals['_DATAMOVEMENTDELETERESPONSE']._serialized_start=1454 + _globals['_DATAMOVEMENTDELETERESPONSE']._serialized_end=1640 + _globals['_DATAMOVEMENTDELETERESPONSE_STATUS']._serialized_start=1566 + _globals['_DATAMOVEMENTDELETERESPONSE_STATUS']._serialized_end=1640 + _globals['_DATAMOVEMENTLISTREQUEST']._serialized_start=1642 + _globals['_DATAMOVEMENTLISTREQUEST']._serialized_end=1721 + _globals['_DATAMOVEMENTLISTRESPONSE']._serialized_start=1723 + _globals['_DATAMOVEMENTLISTRESPONSE']._serialized_end=1763 + _globals['_DATAMOVEMENTCANCELREQUEST']._serialized_start=1765 + _globals['_DATAMOVEMENTCANCELREQUEST']._serialized_end=1859 + _globals['_DATAMOVEMENTCANCELRESPONSE']._serialized_start=1862 + _globals['_DATAMOVEMENTCANCELRESPONSE']._serialized_end=2035 + _globals['_DATAMOVEMENTCANCELRESPONSE_STATUS']._serialized_start=1259 + _globals['_DATAMOVEMENTCANCELRESPONSE_STATUS']._serialized_end=1320 + _globals['_DATAMOVER']._serialized_start=2038 + _globals['_DATAMOVER']._serialized_end=2598 # @@protoc_insertion_point(module_scope) diff --git a/daemons/compute/copy-offload-api.html b/daemons/compute/copy-offload-api.html index 61d14e64..5ab5748f 100644 --- a/daemons/compute/copy-offload-api.html +++ b/daemons/compute/copy-offload-api.html @@ -435,7 +435,7 @@

DataMovementCreateRequest

logStdout bool -

If true, enable server-side logging of stdout when the command is successful. Failures output is always logged.

+

If true, enable server-side logging of stdout when the command is successful. Failure output is always logged.

@@ -471,6 +471,13 @@

DataMovementCreateRequest

default profile.

+ + mpirunOptions + string + +

Extra options to pass to `mpirun` if present in the Data Movement command.

+ + diff --git a/daemons/compute/lib-cpp/client.cc b/daemons/compute/lib-cpp/client.cc index 9c28a014..d401fcd3 100644 --- a/daemons/compute/lib-cpp/client.cc +++ b/daemons/compute/lib-cpp/client.cc @@ -202,12 +202,13 @@ std::vector VersionResponse::apiversions() { return apiVersions; } -CreateRequest::CreateRequest(std::string source, std::string destination, bool dryrun, std::string dcpOptions, bool logStdout, bool storeStdout, int slots, int maxSlots, std::string profile) { +CreateRequest::CreateRequest(std::string source, std::string destination, bool dryrun, std::string mpirunOptions, std::string dcpOptions, bool logStdout, bool storeStdout, int slots, int maxSlots, std::string profile) { auto request = new datamovement::DataMovementCreateRequest(); request->set_source(source); request->set_destination(destination); request->set_dryrun(dryrun); + request->set_mpirunoptions(mpirunOptions); request->set_dcpoptions(dcpOptions); request->set_logstdout(logStdout); request->set_storestdout(storeStdout); diff --git a/daemons/compute/lib-cpp/client.h b/daemons/compute/lib-cpp/client.h index 081d35e5..909bac9b 100644 --- a/daemons/compute/lib-cpp/client.h +++ b/daemons/compute/lib-cpp/client.h @@ -113,7 +113,7 @@ class CommandStatus { class CreateRequest { public: - CreateRequest(std::string source, std::string destination, bool dryrun, std::string dcpOptions, bool logStdout, bool storeStdout, int slots, int maxSlots, std::string profile); + CreateRequest(std::string source, std::string destination, bool dryrun, std::string mpirunOptions, std::string dcpOptions, bool logStdout, bool storeStdout, int slots, int maxSlots, std::string profile); ~CreateRequest(); private: diff --git a/daemons/compute/lib-cpp/example/client-example.cc b/daemons/compute/lib-cpp/example/client-example.cc index c01b35f2..8f9ec74c 100644 --- a/daemons/compute/lib-cpp/example/client-example.cc +++ b/daemons/compute/lib-cpp/example/client-example.cc @@ -55,7 +55,7 @@ int main(int argc, char** argv) { { // Create an offload request - CreateRequest createRequest("YOUR-SOURCE", "YOUR-DESTINATION", false, "", false, false, -1, -1, ""); + CreateRequest createRequest("YOUR-SOURCE", "YOUR-DESTINATION", false, "", "", false, false, -1, -1, ""); CreateResponse createResponse; RPCStatus status = client.Create(workflow, createRequest, &createResponse); diff --git a/daemons/compute/server/servers/server_default.go b/daemons/compute/server/servers/server_default.go index 0f2134df..714735cd 100644 --- a/daemons/compute/server/servers/server_default.go +++ b/daemons/compute/server/servers/server_default.go @@ -401,7 +401,8 @@ func (s *defaultServer) Create(ctx context.Context, req *pb.DataMovementCreateRe func setUserConfig(req *pb.DataMovementCreateRequest, dm *nnfv1alpha1.NnfDataMovement) { dm.Spec.UserConfig = &nnfv1alpha1.NnfDataMovementConfig{} dm.Spec.UserConfig.Dryrun = req.Dryrun - dm.Spec.UserConfig.DCPOptions = req.DcpOptions + dm.Spec.UserConfig.MpirunOptions = req.MpirunOptions + dm.Spec.UserConfig.DcpOptions = req.DcpOptions dm.Spec.UserConfig.LogStdout = req.LogStdout dm.Spec.UserConfig.StoreStdout = req.StoreStdout diff --git a/go.mod b/go.mod index 279d5b27..93d4872b 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.21 require ( github.com/NearNodeFlash/lustre-fs-operator v0.0.1-0.20240820214524-99d5da17471d - github.com/NearNodeFlash/nnf-sos v0.0.1-0.20240826132702-ccad8ac920b3 + github.com/NearNodeFlash/nnf-sos v0.0.1-0.20240829170243-82ea5f6fcc2f github.com/onsi/ginkgo/v2 v2.17.1 github.com/onsi/gomega v1.32.0 github.com/prometheus/client_golang v1.16.0 diff --git a/go.sum b/go.sum index 8b5dcd64..6e3b884b 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ github.com/NearNodeFlash/lustre-fs-operator v0.0.1-0.20240820214524-99d5da17471d github.com/NearNodeFlash/lustre-fs-operator v0.0.1-0.20240820214524-99d5da17471d/go.mod h1:N5X1obpl0mBI0VoCJdQhv7cFXOC6g3VlXj712qWj0JE= github.com/NearNodeFlash/nnf-ec v0.0.1-0.20240820195316-cb407b151cb4 h1:cxUkRTnynEvCLbYL+d/FVyITLODO/goscivJLq5kipY= github.com/NearNodeFlash/nnf-ec v0.0.1-0.20240820195316-cb407b151cb4/go.mod h1:oxdwMqfttOF9dabJhqrWlirCnMk8/8eyLMwl+hducjk= -github.com/NearNodeFlash/nnf-sos v0.0.1-0.20240826132702-ccad8ac920b3 h1:Z3Rridh8oZPfonnWcwjOjtZtCgnP6l7F4GOkxh0r24c= -github.com/NearNodeFlash/nnf-sos v0.0.1-0.20240826132702-ccad8ac920b3/go.mod h1:t/xEK8ND+sTy3gvYEiCH6OOFxhQdRZgDVZQCHRbB+XU= +github.com/NearNodeFlash/nnf-sos v0.0.1-0.20240829170243-82ea5f6fcc2f h1:2IiUr70rfxfHYoc5beKXOlHaAnA1brgGBSG+S3BR8cM= +github.com/NearNodeFlash/nnf-sos v0.0.1-0.20240829170243-82ea5f6fcc2f/go.mod h1:t/xEK8ND+sTy3gvYEiCH6OOFxhQdRZgDVZQCHRbB+XU= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= diff --git a/internal/controller/datamovement_controller.go b/internal/controller/datamovement_controller.go index e60efcc4..1153c152 100644 --- a/internal/controller/datamovement_controller.go +++ b/internal/controller/datamovement_controller.go @@ -569,23 +569,33 @@ func buildDMCommand(profile *nnfv1alpha1.NnfDataMovementProfile, hostfile string // Allow the user to override settings if userConfig { + // Add extra mpirun options from the user + if len(dm.Spec.UserConfig.MpirunOptions) > 0 { + opts := dm.Spec.UserConfig.MpirunOptions + + // Insert the extra mpirun options after `mpirun` + idx := strings.Index(cmd, "mpirun") + if idx != -1 { + idx += len("mpirun") + cmd = cmd[:idx] + " " + opts + cmd[idx:] + } else { + log.Info("spec.config.mpirunOptions is set but `mpirun` is not in the DM command", + "command", profile.Data.Command, "MpirunOptions", opts) + } + } // Add extra DCP options from the user - if len(dm.Spec.UserConfig.DCPOptions) > 0 { - opts := dm.Spec.UserConfig.DCPOptions - - // Insert the extra dcp options before the src argument - if strings.Contains(cmd, "dcp") { - idx := strings.Index(cmd, dm.Spec.Source.Path) - if idx != -1 { - cmd = cmd[:idx] + opts + " " + cmd[idx:] - } else { - log.Info("spec.config.dpcOptions is set but no source path is found in the DM command", - "command", profile.Data.Command, "DCPOptions", opts) - } + if len(dm.Spec.UserConfig.DcpOptions) > 0 { + opts := dm.Spec.UserConfig.DcpOptions + + // Insert the extra dcp options after `dcp` + idx := strings.Index(cmd, "dcp") + if idx != -1 { + idx += len("dcp") + cmd = cmd[:idx] + " " + opts + cmd[idx:] } else { - log.Info("spec.config.dpcOptions is set but no dcp command found in the DM command", - "command", profile.Data.Command, "DCPOptions", opts) + log.Info("spec.config.dpcOptions is set but `dcp` is not found in the DM command", + "command", profile.Data.Command, "DcpOptions", opts) } } } diff --git a/internal/controller/datamovement_controller_test.go b/internal/controller/datamovement_controller_test.go index 7bddcba5..1062db9f 100644 --- a/internal/controller/datamovement_controller_test.go +++ b/internal/controller/datamovement_controller_test.go @@ -789,16 +789,34 @@ var _ = Describe("Data Movement Test", func() { }, } - When("DCPOptions are specified", func() { - It("should inject the extra options before the $SRC argument to dcp", func() { + When("MpirunOptions are specified", func() { + It("should inject the extra options after the `mpirun` command", func() { profile := nnfv1alpha1.NnfDataMovementProfile{} profile.Data.Command = defaultCommand dm.Spec.UserConfig = &nnfv1alpha1.NnfDataMovementConfig{ - DCPOptions: "--extra opts", + MpirunOptions: "--extra opts", } expectedCmdRegex := fmt.Sprintf( - "mpirun --allow-run-as-root --hostfile /tmp/hostfile dcp --progress 1 --uid %d --gid %d --extra opts %s %s", + "mpirun --extra opts --allow-run-as-root --hostfile /tmp/hostfile dcp --progress 1 --uid %d --gid %d %s %s", + expectedUid, expectedGid, srcPath, destPath) + + cmd, err := buildDMCommand(&profile, "/tmp/hostfile", &dm, log.FromContext(context.TODO())) + Expect(err).ToNot(HaveOccurred()) + Expect(strings.Join(cmd, " ")).Should(MatchRegexp(expectedCmdRegex)) + }) + }) + + When("DcpOptions are specified", func() { + It("should inject the extra options after the `dcp` command", func() { + profile := nnfv1alpha1.NnfDataMovementProfile{} + profile.Data.Command = defaultCommand + + dm.Spec.UserConfig = &nnfv1alpha1.NnfDataMovementConfig{ + DcpOptions: "--extra opts", + } + expectedCmdRegex := fmt.Sprintf( + "mpirun --allow-run-as-root --hostfile /tmp/hostfile dcp --extra opts --progress 1 --uid %d --gid %d %s %s", expectedUid, expectedGid, srcPath, destPath) cmd, err := buildDMCommand(&profile, "/tmp/hostfile", &dm, log.FromContext(context.TODO())) diff --git a/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnf_datamovement_types.go b/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnf_datamovement_types.go index a561ba9c..991dd487 100644 --- a/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnf_datamovement_types.go +++ b/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnf_datamovement_types.go @@ -91,8 +91,11 @@ type NnfDataMovementConfig struct { // +kubebuilder:default:=false Dryrun bool `json:"dryrun,omitempty"` + // Extra options to pass to the mpirun command (used to perform data movement). + MpirunOptions string `json:"mpirunOptions,omitempty"` + // Extra options to pass to the dcp command (used to perform data movement). - DCPOptions string `json:"dcpOptions,omitempty"` + DcpOptions string `json:"dcpOptions,omitempty"` // If true, enable the command's stdout to be saved in the log when the command completes // successfully. On failure, the output is always logged. diff --git a/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfdatamovementprofile_types.go b/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfdatamovementprofile_types.go index 701181ac..bfab0556 100644 --- a/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfdatamovementprofile_types.go +++ b/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfdatamovementprofile_types.go @@ -35,13 +35,13 @@ type NnfDataMovementProfileData struct { Pinned bool `json:"pinned,omitempty"` // Slots is the number of slots specified in the MPI hostfile. A value of 0 disables the use of - // slots in the hostfile. + // slots in the hostfile. The hostfile is used for both `statCommand` and `Command`. // +kubebuilder:default:=8 // +kubebuilder:validation:Minimum:=0 Slots int `json:"slots"` // MaxSlots is the number of max_slots specified in the MPI hostfile. A value of 0 disables the - // use of max_slots in the hostfile. + // use of max_slots in the hostfile. The hostfile is used for both `statCommand` and `Command`. // +kubebuilder:default:=0 // +kubebuilder:validation:Minimum:=0 MaxSlots int `json:"maxSlots"` diff --git a/vendor/github.com/NearNodeFlash/nnf-sos/config/crd/bases/nnf.cray.hpe.com_nnfdatamovementprofiles.yaml b/vendor/github.com/NearNodeFlash/nnf-sos/config/crd/bases/nnf.cray.hpe.com_nnfdatamovementprofiles.yaml index 1e426146..b7dd7751 100644 --- a/vendor/github.com/NearNodeFlash/nnf-sos/config/crd/bases/nnf.cray.hpe.com_nnfdatamovementprofiles.yaml +++ b/vendor/github.com/NearNodeFlash/nnf-sos/config/crd/bases/nnf.cray.hpe.com_nnfdatamovementprofiles.yaml @@ -75,7 +75,7 @@ spec: default: 0 description: |- MaxSlots is the number of max_slots specified in the MPI hostfile. A value of 0 disables the - use of max_slots in the hostfile. + use of max_slots in the hostfile. The hostfile is used for both `statCommand` and `Command`. minimum: 0 type: integer pinned: @@ -95,7 +95,7 @@ spec: default: 8 description: |- Slots is the number of slots specified in the MPI hostfile. A value of 0 disables the use of - slots in the hostfile. + slots in the hostfile. The hostfile is used for both `statCommand` and `Command`. minimum: 0 type: integer statCommand: diff --git a/vendor/github.com/NearNodeFlash/nnf-sos/config/crd/bases/nnf.cray.hpe.com_nnfdatamovements.yaml b/vendor/github.com/NearNodeFlash/nnf-sos/config/crd/bases/nnf.cray.hpe.com_nnfdatamovements.yaml index e9f001d7..fa67389e 100644 --- a/vendor/github.com/NearNodeFlash/nnf-sos/config/crd/bases/nnf.cray.hpe.com_nnfdatamovements.yaml +++ b/vendor/github.com/NearNodeFlash/nnf-sos/config/crd/bases/nnf.cray.hpe.com_nnfdatamovements.yaml @@ -249,6 +249,10 @@ spec: The number of max_slots specified in the MPI hostfile. A value of 0 disables the use of slots in the hostfile. Nil will defer to the value specified in the NnfDataMovementProfile. type: integer + mpirunOptions: + description: Extra options to pass to the mpirun command (used + to perform data movement). + type: string slots: description: |- The number of slots specified in the MPI hostfile. A value of 0 disables the use of slots in diff --git a/vendor/modules.txt b/vendor/modules.txt index 3c2c43f2..d6c7ef2e 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -10,7 +10,7 @@ github.com/NearNodeFlash/lustre-fs-operator/config/crd/bases # github.com/NearNodeFlash/nnf-ec v0.0.1-0.20240820195316-cb407b151cb4 ## explicit; go 1.19 github.com/NearNodeFlash/nnf-ec/pkg/rfsf/pkg/models -# github.com/NearNodeFlash/nnf-sos v0.0.1-0.20240826132702-ccad8ac920b3 +# github.com/NearNodeFlash/nnf-sos v0.0.1-0.20240829170243-82ea5f6fcc2f ## explicit; go 1.21 github.com/NearNodeFlash/nnf-sos/api/v1alpha1 github.com/NearNodeFlash/nnf-sos/config/crd/bases From 68e78562f9368f9c9e69fc9dba9d65702b2dccc0 Mon Sep 17 00:00:00 2001 From: Blake Devcich Date: Mon, 26 Aug 2024 11:43:17 -0500 Subject: [PATCH 3/6] Add env vars for QPS/Burst nnf-sos can do this, so can you! Signed-off-by: Blake Devcich --- cmd/main.go | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/cmd/main.go b/cmd/main.go index e9325e52..a532f82e 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -22,6 +22,7 @@ package main import ( "flag" "os" + "strconv" // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) // to ensure that exec-entrypoint and run can make use of them. @@ -92,7 +93,28 @@ func main() { dmCtrl.SetOptions(&options) - mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), options) + config := ctrl.GetConfigOrDie() + qpsString, found := os.LookupEnv("NNF_REST_CONFIG_QPS") + if found { + qps, err := strconv.ParseFloat(qpsString, 32) + if err != nil { + setupLog.Error(err, "invalid value for NNF_REST_CONFIG_QPS") + os.Exit(1) + } + config.QPS = float32(qps) + } + + burstString, found := os.LookupEnv("NNF_REST_CONFIG_BURST") + if found { + burst, err := strconv.Atoi(burstString) + if err != nil { + setupLog.Error(err, "invalid value for NNF_REST_CONFIG_BURST") + os.Exit(1) + } + config.Burst = burst + } + + mgr, err := ctrl.NewManager(config, options) if err != nil { setupLog.Error(err, "unable to start manager") os.Exit(1) From a8f6e90e6507b1ff46d6cd373ce07f7989619a31 Mon Sep 17 00:00:00 2001 From: matthew-richerson <82597529+matthew-richerson@users.noreply.github.com> Date: Fri, 30 Aug 2024 14:03:11 -0500 Subject: [PATCH 4/6] Re-vendor before release (#204) Get the latest nnf-sos Signed-off-by: Matt Richerson --- go.mod | 2 +- go.sum | 4 +- .../nnf-sos/api/v1alpha1/nnf_access_types.go | 9 +- .../api/v1alpha1/nnfcontainerprofile_types.go | 8 +- .../api/v1alpha1/nnfsystemstorage_types.go | 136 ++++++++++ .../api/v1alpha1/zz_generated.deepcopy.go | 117 ++++++++ .../bases/nnf.cray.hpe.com_nnfaccesses.yaml | 12 +- ...nnf.cray.hpe.com_nnfcontainerprofiles.yaml | 8 +- .../nnf.cray.hpe.com_nnfsystemstorages.yaml | 252 ++++++++++++++++++ vendor/modules.txt | 2 +- 10 files changed, 534 insertions(+), 16 deletions(-) create mode 100644 vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfsystemstorage_types.go create mode 100644 vendor/github.com/NearNodeFlash/nnf-sos/config/crd/bases/nnf.cray.hpe.com_nnfsystemstorages.yaml diff --git a/go.mod b/go.mod index 93d4872b..da1b40a7 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.21 require ( github.com/NearNodeFlash/lustre-fs-operator v0.0.1-0.20240820214524-99d5da17471d - github.com/NearNodeFlash/nnf-sos v0.0.1-0.20240829170243-82ea5f6fcc2f + github.com/NearNodeFlash/nnf-sos v0.0.1-0.20240829175731-8568b363d3d7 github.com/onsi/ginkgo/v2 v2.17.1 github.com/onsi/gomega v1.32.0 github.com/prometheus/client_golang v1.16.0 diff --git a/go.sum b/go.sum index 6e3b884b..d23022d0 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ github.com/NearNodeFlash/lustre-fs-operator v0.0.1-0.20240820214524-99d5da17471d github.com/NearNodeFlash/lustre-fs-operator v0.0.1-0.20240820214524-99d5da17471d/go.mod h1:N5X1obpl0mBI0VoCJdQhv7cFXOC6g3VlXj712qWj0JE= github.com/NearNodeFlash/nnf-ec v0.0.1-0.20240820195316-cb407b151cb4 h1:cxUkRTnynEvCLbYL+d/FVyITLODO/goscivJLq5kipY= github.com/NearNodeFlash/nnf-ec v0.0.1-0.20240820195316-cb407b151cb4/go.mod h1:oxdwMqfttOF9dabJhqrWlirCnMk8/8eyLMwl+hducjk= -github.com/NearNodeFlash/nnf-sos v0.0.1-0.20240829170243-82ea5f6fcc2f h1:2IiUr70rfxfHYoc5beKXOlHaAnA1brgGBSG+S3BR8cM= -github.com/NearNodeFlash/nnf-sos v0.0.1-0.20240829170243-82ea5f6fcc2f/go.mod h1:t/xEK8ND+sTy3gvYEiCH6OOFxhQdRZgDVZQCHRbB+XU= +github.com/NearNodeFlash/nnf-sos v0.0.1-0.20240829175731-8568b363d3d7 h1:vYwPkSO/7KjnHc2zg7mDyBdoTlMZ6YW+44txmemn8ls= +github.com/NearNodeFlash/nnf-sos v0.0.1-0.20240829175731-8568b363d3d7/go.mod h1:t/xEK8ND+sTy3gvYEiCH6OOFxhQdRZgDVZQCHRbB+XU= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= diff --git a/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnf_access_types.go b/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnf_access_types.go index 6c941275..2af57f9f 100644 --- a/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnf_access_types.go +++ b/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnf_access_types.go @@ -42,7 +42,8 @@ type NnfAccessSpec struct { // Target specifies which storage targets the client should mount // - single: Only one of the storage the client can access // - all: All of the storage the client can access - // +kubebuilder:validation:Enum=single;all + // - shared: Multiple clients access the same storage + // +kubebuilder:validation:Enum=single;all;shared Target string `json:"target"` // UserID for the new mount. Currently only used for raw @@ -58,8 +59,14 @@ type NnfAccessSpec struct { // MountPath for the storage target on the client MountPath string `json:"mountPath,omitempty"` + // MakeClientMounts determines whether the ClientMount resources are made, or if only + // the access list on the NnfNodeBlockStorage is updated + // +kubebuilder:default=true + MakeClientMounts bool `json:"makeClientMounts"` + // MountPathPrefix to mount the storage target on the client when there is // more than one mount on a client + MountPathPrefix string `json:"mountPathPrefix,omitempty"` // StorageReference is the NnfStorage reference diff --git a/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfcontainerprofile_types.go b/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfcontainerprofile_types.go index ad85f117..24898a07 100644 --- a/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfcontainerprofile_types.go +++ b/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfcontainerprofile_types.go @@ -42,15 +42,15 @@ type NnfContainerProfileData struct { // Containers are launched in the PreRun state. Allow this many seconds for the containers to // start before declaring an error to the workflow. - // Defaults to 60 if not set. A value of 0 disables this behavior. - // +kubebuilder:default:=60 + // Defaults to 300 if not set. A value of 0 disables this behavior. + // +kubebuilder:default:=300 // +kubebuilder:validation:Minimum:=0 PreRunTimeoutSeconds *int64 `json:"preRunTimeoutSeconds,omitempty"` // Containers are expected to complete in the PostRun State. Allow this many seconds for the // containers to exit before declaring an error the workflow. - // Defaults to 60 if not set. A value of 0 disables this behavior. - // +kubebuilder:default:=60 + // Defaults to 300 if not set. A value of 0 disables this behavior. + // +kubebuilder:default:=300 // +kubebuilder:validation:Minimum:=0 PostRunTimeoutSeconds *int64 `json:"postRunTimeoutSeconds,omitempty"` diff --git a/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfsystemstorage_types.go b/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfsystemstorage_types.go new file mode 100644 index 00000000..6eb37aff --- /dev/null +++ b/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/nnfsystemstorage_types.go @@ -0,0 +1,136 @@ +/* + * Copyright 2024 Hewlett Packard Enterprise Development LP + * Other additional copyright holders may be indicated within. + * + * The entirety of this work is licensed under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package v1alpha1 + +import ( + dwsv1alpha2 "github.com/DataWorkflowServices/dws/api/v1alpha2" + "github.com/DataWorkflowServices/dws/utils/updater" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +type NnfSystemStorageComputesTarget string + +const ( + ComputesTargetAll NnfSystemStorageComputesTarget = "all" + ComputesTargetEven NnfSystemStorageComputesTarget = "even" + ComputesTargetOdd NnfSystemStorageComputesTarget = "odd" + ComputesTargetPattern NnfSystemStorageComputesTarget = "pattern" +) + +// NnfSystemStorageSpec defines the desired state of NnfSystemStorage +type NnfSystemStorageSpec struct { + // SystemConfiguration is an object reference to the SystemConfiguration resource to use. If this + // field is empty, name: default namespace: default is used. + SystemConfiguration corev1.ObjectReference `json:"systemConfiguration,omitempty"` + + // ExludeRabbits is a list of Rabbits to exclude from the Rabbits in the SystemConfiguration + ExcludeRabbits []string `json:"excludeRabbits,omitempty"` + + // IncludeRabbits is a list of Rabbits to use rather than getting the list of Rabbits from the + // SystemConfiguration + IncludeRabbits []string `json:"includeRabbits,omitempty"` + + // ExcludeComputes is a list of compute nodes to exclude from the the compute nodes listed in the + // SystemConfiguration + ExcludeComputes []string `json:"excludeComputes,omitempty"` + + // IncludeComputes is a list of computes nodes to use rather than getting the list of compute nodes + // from the SystemConfiguration + IncludeComputes []string `json:"includeComputes,omitempty"` + + // ComputesTarget specifies which computes to make the storage accessible to + // +kubebuilder:validation:Enum=all;even;odd;pattern + // +kubebuilder:default:=all + ComputesTarget NnfSystemStorageComputesTarget `json:"computesTarget"` + + // ComputesPattern is a list of compute node indexes (0-15) to make the storage accessible to. This + // is only used if ComputesTarget is "pattern" + // +kubebuilder:validation:MaxItems=16 + // +kubebuilder:validation:items:Maximum=15 + // +kubebuilder:validation:items:Minimum=0 + ComputesPattern []int `json:"computesPattern,omitempty"` + + // Capacity is the allocation size on each Rabbit + // +kubebuilder:default:=1073741824 + Capacity int64 `json:"capacity"` + + // Type is the file system type to use for the storage allocation + // +kubebuilder:validation:Enum=raw;xfs;gfs2 + // +kubebuilder:default:=raw + Type string `json:"type"` + + // StorageProfile is an object reference to the storage profile to use + StorageProfile corev1.ObjectReference `json:"storageProfile"` + + // MakeClientMounts specifies whether to make ClientMount resources or just + // make the devices available to the client + // +kubebuilder:default:=false + MakeClientMounts bool `json:"makeClientMounts"` + + // ClientMountPath is an optional path for where to mount the file system on the computes + ClientMountPath string `json:"clientMountPath,omitempty"` +} + +// NnfSystemStorageStatus defines the observed state of NnfSystemStorage +type NnfSystemStorageStatus struct { + // Ready signifies whether all work has been completed + Ready bool `json:"ready"` + + dwsv1alpha2.ResourceError `json:",inline"` +} + +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status +// NnfSystemStorage is the Schema for the nnfsystemstorages API +type NnfSystemStorage struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec NnfSystemStorageSpec `json:"spec,omitempty"` + Status NnfSystemStorageStatus `json:"status,omitempty"` +} + +func (a *NnfSystemStorage) GetStatus() updater.Status[*NnfSystemStorageStatus] { + return &a.Status +} + +// +kubebuilder:object:root=true +// NnfSystemStorageList contains a list of NnfSystemStorage +type NnfSystemStorageList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []NnfSystemStorage `json:"items"` +} + +func (n *NnfSystemStorageList) GetObjectList() []client.Object { + objectList := []client.Object{} + + for i := range n.Items { + objectList = append(objectList, &n.Items[i]) + } + + return objectList +} + +func init() { + SchemeBuilder.Register(&NnfSystemStorage{}, &NnfSystemStorageList{}) +} diff --git a/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/zz_generated.deepcopy.go b/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/zz_generated.deepcopy.go index 58ab6ccb..045c2cb5 100644 --- a/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/github.com/NearNodeFlash/nnf-sos/api/v1alpha1/zz_generated.deepcopy.go @@ -1904,6 +1904,123 @@ func (in *NnfStorageStatus) DeepCopy() *NnfStorageStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NnfSystemStorage) DeepCopyInto(out *NnfSystemStorage) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NnfSystemStorage. +func (in *NnfSystemStorage) DeepCopy() *NnfSystemStorage { + if in == nil { + return nil + } + out := new(NnfSystemStorage) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *NnfSystemStorage) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NnfSystemStorageList) DeepCopyInto(out *NnfSystemStorageList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]NnfSystemStorage, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NnfSystemStorageList. +func (in *NnfSystemStorageList) DeepCopy() *NnfSystemStorageList { + if in == nil { + return nil + } + out := new(NnfSystemStorageList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *NnfSystemStorageList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NnfSystemStorageSpec) DeepCopyInto(out *NnfSystemStorageSpec) { + *out = *in + out.SystemConfiguration = in.SystemConfiguration + if in.ExcludeRabbits != nil { + in, out := &in.ExcludeRabbits, &out.ExcludeRabbits + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.IncludeRabbits != nil { + in, out := &in.IncludeRabbits, &out.IncludeRabbits + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.ExcludeComputes != nil { + in, out := &in.ExcludeComputes, &out.ExcludeComputes + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.IncludeComputes != nil { + in, out := &in.IncludeComputes, &out.IncludeComputes + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.ComputesPattern != nil { + in, out := &in.ComputesPattern, &out.ComputesPattern + *out = make([]int, len(*in)) + copy(*out, *in) + } + out.StorageProfile = in.StorageProfile +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NnfSystemStorageSpec. +func (in *NnfSystemStorageSpec) DeepCopy() *NnfSystemStorageSpec { + if in == nil { + return nil + } + out := new(NnfSystemStorageSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NnfSystemStorageStatus) DeepCopyInto(out *NnfSystemStorageStatus) { + *out = *in + in.ResourceError.DeepCopyInto(&out.ResourceError) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NnfSystemStorageStatus. +func (in *NnfSystemStorageStatus) DeepCopy() *NnfSystemStorageStatus { + if in == nil { + return nil + } + out := new(NnfSystemStorageStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *VarHandler) DeepCopyInto(out *VarHandler) { *out = *in diff --git a/vendor/github.com/NearNodeFlash/nnf-sos/config/crd/bases/nnf.cray.hpe.com_nnfaccesses.yaml b/vendor/github.com/NearNodeFlash/nnf-sos/config/crd/bases/nnf.cray.hpe.com_nnfaccesses.yaml index b9850324..4059f6fd 100644 --- a/vendor/github.com/NearNodeFlash/nnf-sos/config/crd/bases/nnf.cray.hpe.com_nnfaccesses.yaml +++ b/vendor/github.com/NearNodeFlash/nnf-sos/config/crd/bases/nnf.cray.hpe.com_nnfaccesses.yaml @@ -115,13 +115,16 @@ spec: description: GroupID for the new mount. Currently only used for raw format: int32 type: integer + makeClientMounts: + default: true + description: |- + MakeClientMounts determines whether the ClientMount resources are made, or if only + the access list on the NnfNodeBlockStorage is updated + type: boolean mountPath: description: MountPath for the storage target on the client type: string mountPathPrefix: - description: |- - MountPathPrefix to mount the storage target on the client when there is - more than one mount on a client type: string storageReference: description: StorageReference is the NnfStorage reference @@ -172,9 +175,11 @@ spec: Target specifies which storage targets the client should mount - single: Only one of the storage the client can access - all: All of the storage the client can access + - shared: Multiple clients access the same storage enum: - single - all + - shared type: string teardownState: allOf: @@ -201,6 +206,7 @@ spec: required: - desiredState - groupID + - makeClientMounts - storageReference - target - teardownState diff --git a/vendor/github.com/NearNodeFlash/nnf-sos/config/crd/bases/nnf.cray.hpe.com_nnfcontainerprofiles.yaml b/vendor/github.com/NearNodeFlash/nnf-sos/config/crd/bases/nnf.cray.hpe.com_nnfcontainerprofiles.yaml index 5493a423..5ab727d5 100644 --- a/vendor/github.com/NearNodeFlash/nnf-sos/config/crd/bases/nnf.cray.hpe.com_nnfcontainerprofiles.yaml +++ b/vendor/github.com/NearNodeFlash/nnf-sos/config/crd/bases/nnf.cray.hpe.com_nnfcontainerprofiles.yaml @@ -7630,20 +7630,20 @@ spec: description: Pinned is true if this instance is an immutable copy type: boolean postRunTimeoutSeconds: - default: 60 + default: 300 description: |- Containers are expected to complete in the PostRun State. Allow this many seconds for the containers to exit before declaring an error the workflow. - Defaults to 60 if not set. A value of 0 disables this behavior. + Defaults to 300 if not set. A value of 0 disables this behavior. format: int64 minimum: 0 type: integer preRunTimeoutSeconds: - default: 60 + default: 300 description: |- Containers are launched in the PreRun state. Allow this many seconds for the containers to start before declaring an error to the workflow. - Defaults to 60 if not set. A value of 0 disables this behavior. + Defaults to 300 if not set. A value of 0 disables this behavior. format: int64 minimum: 0 type: integer diff --git a/vendor/github.com/NearNodeFlash/nnf-sos/config/crd/bases/nnf.cray.hpe.com_nnfsystemstorages.yaml b/vendor/github.com/NearNodeFlash/nnf-sos/config/crd/bases/nnf.cray.hpe.com_nnfsystemstorages.yaml new file mode 100644 index 00000000..eb9f0595 --- /dev/null +++ b/vendor/github.com/NearNodeFlash/nnf-sos/config/crd/bases/nnf.cray.hpe.com_nnfsystemstorages.yaml @@ -0,0 +1,252 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.14.0 + name: nnfsystemstorages.nnf.cray.hpe.com +spec: + group: nnf.cray.hpe.com + names: + kind: NnfSystemStorage + listKind: NnfSystemStorageList + plural: nnfsystemstorages + singular: nnfsystemstorage + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + description: NnfSystemStorage is the Schema for the nnfsystemstorages API + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: NnfSystemStorageSpec defines the desired state of NnfSystemStorage + properties: + capacity: + default: 1073741824 + description: Capacity is the allocation size on each Rabbit + format: int64 + type: integer + clientMountPath: + description: ClientMountPath is an optional path for where to mount + the file system on the computes + type: string + computesPattern: + description: |- + ComputesPattern is a list of compute node indexes (0-15) to make the storage accessible to. This + is only used if ComputesTarget is "pattern" + items: + type: integer + maxItems: 16 + type: array + computesTarget: + default: all + description: ComputesTarget specifies which computes to make the storage + accessible to + enum: + - all + - even + - odd + - pattern + type: string + excludeComputes: + description: |- + ExcludeComputes is a list of compute nodes to exclude from the the compute nodes listed in the + SystemConfiguration + items: + type: string + type: array + excludeRabbits: + description: ExludeRabbits is a list of Rabbits to exclude from the + Rabbits in the SystemConfiguration + items: + type: string + type: array + includeComputes: + description: |- + IncludeComputes is a list of computes nodes to use rather than getting the list of compute nodes + from the SystemConfiguration + items: + type: string + type: array + includeRabbits: + description: |- + IncludeRabbits is a list of Rabbits to use rather than getting the list of Rabbits from the + SystemConfiguration + items: + type: string + type: array + makeClientMounts: + default: false + description: |- + MakeClientMounts specifies whether to make ClientMount resources or just + make the devices available to the client + type: boolean + storageProfile: + description: StorageProfile is an object reference to the storage + profile to use + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: |- + If referring to a piece of an object instead of an entire object, this string + should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. + For example, if the object reference is to a container within a pod, this would take on a value like: + "spec.containers{name}" (where "name" refers to the name of the container that triggered + the event) or if no container name is specified "spec.containers[2]" (container with + index 2 in this pod). This syntax is chosen only to have some well-defined way of + referencing a part of an object. + TODO: this design is not final and this field is subject to change in the future. + type: string + kind: + description: |- + Kind of the referent. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + type: string + namespace: + description: |- + Namespace of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/ + type: string + resourceVersion: + description: |- + Specific resourceVersion to which this reference is made, if any. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency + type: string + uid: + description: |- + UID of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids + type: string + type: object + x-kubernetes-map-type: atomic + systemConfiguration: + description: |- + SystemConfiguration is an object reference to the SystemConfiguration resource to use. If this + field is empty, name: default namespace: default is used. + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: |- + If referring to a piece of an object instead of an entire object, this string + should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. + For example, if the object reference is to a container within a pod, this would take on a value like: + "spec.containers{name}" (where "name" refers to the name of the container that triggered + the event) or if no container name is specified "spec.containers[2]" (container with + index 2 in this pod). This syntax is chosen only to have some well-defined way of + referencing a part of an object. + TODO: this design is not final and this field is subject to change in the future. + type: string + kind: + description: |- + Kind of the referent. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + name: + description: |- + Name of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + type: string + namespace: + description: |- + Namespace of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/ + type: string + resourceVersion: + description: |- + Specific resourceVersion to which this reference is made, if any. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency + type: string + uid: + description: |- + UID of the referent. + More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids + type: string + type: object + x-kubernetes-map-type: atomic + type: + default: raw + description: Type is the file system type to use for the storage allocation + enum: + - raw + - xfs + - gfs2 + type: string + required: + - capacity + - computesTarget + - makeClientMounts + - storageProfile + - type + type: object + status: + description: NnfSystemStorageStatus defines the observed state of NnfSystemStorage + properties: + error: + description: Error information + properties: + debugMessage: + description: Internal debug message for the error + type: string + severity: + description: |- + Indication of how severe the error is. Minor will likely succeed, Major may + succeed, and Fatal will never succeed. + enum: + - Minor + - Major + - Fatal + type: string + type: + description: Internal or user error + enum: + - Internal + - User + - WLM + type: string + userMessage: + description: Optional user facing message if the error is relevant + to an end user + type: string + required: + - debugMessage + - severity + - type + type: object + ready: + description: Ready signifies whether all work has been completed + type: boolean + required: + - ready + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/vendor/modules.txt b/vendor/modules.txt index d6c7ef2e..99c01ece 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -10,7 +10,7 @@ github.com/NearNodeFlash/lustre-fs-operator/config/crd/bases # github.com/NearNodeFlash/nnf-ec v0.0.1-0.20240820195316-cb407b151cb4 ## explicit; go 1.19 github.com/NearNodeFlash/nnf-ec/pkg/rfsf/pkg/models -# github.com/NearNodeFlash/nnf-sos v0.0.1-0.20240829170243-82ea5f6fcc2f +# github.com/NearNodeFlash/nnf-sos v0.0.1-0.20240829175731-8568b363d3d7 ## explicit; go 1.21 github.com/NearNodeFlash/nnf-sos/api/v1alpha1 github.com/NearNodeFlash/nnf-sos/config/crd/bases From 1fa66eeaf57256be41de567bca6a61c6d3867818 Mon Sep 17 00:00:00 2001 From: Matt Richerson Date: Fri, 30 Aug 2024 15:16:45 -0500 Subject: [PATCH 5/6] Update nnf-mfu release references Signed-off-by: Matt Richerson --- Dockerfile | 2 +- Makefile | 2 +- config/manager/kustomization.yaml | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 5f086b74..1e5a60b7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,7 +18,7 @@ # These ARGs must be before the first FROM. This allows them to be valid for # use in FROM instructions. ARG NNFMFU_TAG_BASE=ghcr.io/nearnodeflash/nnf-mfu -ARG NNFMFU_VERSION=0.1.1 +ARG NNFMFU_VERSION=0.1.2 # Build the manager binary FROM golang:1.21-alpine AS builder diff --git a/Makefile b/Makefile index 3e6750ce..95f26e55 100644 --- a/Makefile +++ b/Makefile @@ -50,7 +50,7 @@ IMAGE_TAG_BASE ?= ghcr.io/nearnodeflash/nnf-dm # The NNF-MFU container image to use in NNFContainerProfile resources. NNFMFU_TAG_BASE ?= ghcr.io/nearnodeflash/nnf-mfu -NNFMFU_VERSION ?= 0.1.1 +NNFMFU_VERSION ?= 0.1.2 CONTAINER_BUILDARGS=--build-arg NNFMFU_TAG_BASE=$(NNFMFU_TAG_BASE) --build-arg NNFMFU_VERSION=$(NNFMFU_VERSION) diff --git a/config/manager/kustomization.yaml b/config/manager/kustomization.yaml index d3246e28..7366a1df 100644 --- a/config/manager/kustomization.yaml +++ b/config/manager/kustomization.yaml @@ -18,5 +18,4 @@ images: newName: ghcr.io/nearnodeflash/nnf-dm newTag: 0.1.4 - name: nnf-mfu - newName: ghcr.io/nearnodeflash/nnf-mfu - newTag: 0.1.1 + newTag: 0.1.2 From e8c9f78315635ac778c91247bfe803874ecf8c26 Mon Sep 17 00:00:00 2001 From: Matt Richerson Date: Fri, 30 Aug 2024 15:16:45 -0500 Subject: [PATCH 6/6] Update own release references Signed-off-by: Matt Richerson --- config/manager/kustomization.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config/manager/kustomization.yaml b/config/manager/kustomization.yaml index 7366a1df..e665dd82 100644 --- a/config/manager/kustomization.yaml +++ b/config/manager/kustomization.yaml @@ -15,7 +15,6 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization images: - name: controller - newName: ghcr.io/nearnodeflash/nnf-dm - newTag: 0.1.4 + newTag: 0.1.5 - name: nnf-mfu newTag: 0.1.2