From 56e7589f751aa4bd65786a858b7730b51857b110 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Wed, 8 Oct 2025 14:19:57 -0400 Subject: [PATCH 1/3] reload version partitioning --- cli/README.md | 2 +- cli/module_build.go | 8 ++++---- cli/module_reload.go | 1 + 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/cli/README.md b/cli/README.md index 0b253bb405a..f4601008477 100644 --- a/cli/README.md +++ b/cli/README.md @@ -45,5 +45,5 @@ go build -o /opt/homebrew/bin/viam cli/viam/main.go Then afterwards reset your homebrew installation with: ```sh -brew link --overwrite viam +brew unlink viam && brew link --overwrite viam ``` diff --git a/cli/module_build.go b/cli/module_build.go index 2f516e5ece8..4f2d09b7f39 100644 --- a/cli/module_build.go +++ b/cli/module_build.go @@ -721,7 +721,7 @@ func (c *viamClient) ensureModuleRegisteredInCloud(ctx *cli.Context, moduleID mo } // moduleCloudReload triggers a cloud build and then reloads the specified module with that build. -func (c *viamClient) moduleCloudReload(ctx *cli.Context, args reloadModuleArgs, platform string) (string, error) { +func (c *viamClient) moduleCloudReload(ctx *cli.Context, args reloadModuleArgs, platform string, partID string) (string, error) { manifest, err := loadManifest(args.Module) if err != nil { return "", err @@ -755,13 +755,13 @@ func (c *viamClient) moduleCloudReload(ctx *cli.Context, args reloadModuleArgs, // Upload a package with the bundled local dev code. Note that "reload" is a sentinel // value for hot reloading modules. App expects it; don't change without making a // complimentary update to the app repo - resp, err := c.uploadPackage(org.GetId(), reloadVersion, reloadVersion, "module", archivePath, nil) + resp, err := c.uploadPackage(org.GetId(), moduleID.name, reloadSourceVersion, "module", archivePath, nil) if err != nil { return "", err } // get package URL for downloading purposes - packageURL, err := c.getPackageDownloadURL(org.GetId(), reloadVersion, reloadVersion, "module") + packageURL, err := c.getPackageDownloadURL(org.GetId(), moduleID.name, reloadSourceVersion, "module") if err != nil { return "", err } @@ -912,7 +912,7 @@ func reloadModuleAction(c *cli.Context, vc *viamClient, args reloadModuleArgs, l err = moduleBuildLocalAction(c, manifest, environment) buildPath = manifest.Build.Path } else { - buildPath, err = vc.moduleCloudReload(c, args, platform) + buildPath, err = vc.moduleCloudReload(c, args, platform, partID) } if err != nil { return err diff --git a/cli/module_reload.go b/cli/module_reload.go index f9c4c635f74..8c2920c80cd 100644 --- a/cli/module_reload.go +++ b/cli/module_reload.go @@ -19,6 +19,7 @@ import ( ) const reloadVersion = "reload" +const reloadSourceVersion = "reload-source" // ModuleMap is a type alias to indicate where a map represents a module config. // We don't convert to rdkConfig.Module because it can get out of date with what's in the db. From 7d6fd658dae78881f597c595d502b9c768d5a46f Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Wed, 8 Oct 2025 16:23:28 -0400 Subject: [PATCH 2/3] update logic to include part-id --- cli/module_build.go | 20 +++++++++++++------- cli/module_reload.go | 4 ++-- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/cli/module_build.go b/cli/module_build.go index 4f2d09b7f39..a0e9f28b9ad 100644 --- a/cli/module_build.go +++ b/cli/module_build.go @@ -755,13 +755,14 @@ func (c *viamClient) moduleCloudReload(ctx *cli.Context, args reloadModuleArgs, // Upload a package with the bundled local dev code. Note that "reload" is a sentinel // value for hot reloading modules. App expects it; don't change without making a // complimentary update to the app repo - resp, err := c.uploadPackage(org.GetId(), moduleID.name, reloadSourceVersion, "module", archivePath, nil) + reloadSourceVersionFormatted := getReloadVersion(reloadSourceVersionPrefix, partID) + resp, err := c.uploadPackage(org.GetId(), moduleID.name, reloadSourceVersionFormatted, "module", archivePath, nil) if err != nil { return "", err } // get package URL for downloading purposes - packageURL, err := c.getPackageDownloadURL(org.GetId(), moduleID.name, reloadSourceVersion, "module") + packageURL, err := c.getPackageDownloadURL(org.GetId(), moduleID.name, reloadSourceVersionFormatted, "module") if err != nil { return "", err } @@ -778,9 +779,10 @@ func (c *viamClient) moduleCloudReload(ctx *cli.Context, args reloadModuleArgs, // TODO (RSDK-11692) - passing org ID in the ref field and `resp.Version` (which is actually an object ID) // in the token field is pretty hacky, let's fix it up infof(c.c.App.Writer, "Creating a new cloud build and swapping it onto the requested machine part. This may take a few minutes...") + reloadVersionFormatted := getReloadVersion(reloadVersionPrefix, partID) buildArgs := moduleBuildStartArgs{ Module: args.Module, - Version: reloadVersion, + Version: reloadVersionFormatted, Workdir: args.Workdir, Ref: org.GetId(), Platforms: []string{platform}, @@ -812,17 +814,17 @@ func (c *viamClient) moduleCloudReload(ctx *cli.Context, args reloadModuleArgs, downloadArgs := downloadModuleFlags{ ID: id, - Version: reloadVersion, + Version: reloadVersionFormatted, Platform: platform, } // delete the package now that the build is complete _, err = c.packageClient.DeletePackage( ctx.Context, - &v1.DeletePackageRequest{Id: resp.GetId(), Version: reloadVersion, Type: v1.PackageType_PACKAGE_TYPE_MODULE}, + &v1.DeletePackageRequest{Id: resp.GetId(), Version: reloadSourceVersionFormatted, Type: v1.PackageType_PACKAGE_TYPE_MODULE}, ) if err != nil { - warningf(ctx.App.Writer, "failed to delete package: %s", err.Error()) + warningf(ctx.App.Writer, "failed to delete reload source code package: %s", err.Error()) } // delete the archive we created @@ -853,6 +855,10 @@ func ReloadModuleAction(c *cli.Context, args reloadModuleArgs) error { return reloadModuleAction(c, vc, args, logger) } +func getReloadVersion(versionPrefix string, partID string) string { + return versionPrefix + "-" + partID +} + // reloadModuleAction is the testable inner reload logic. func reloadModuleAction(c *cli.Context, vc *viamClient, args reloadModuleArgs, logger logging.Logger) error { // TODO(RSDK-9727) it'd be nice for this to be a method on a viam client rather than taking one as an arg @@ -943,7 +949,7 @@ func reloadModuleAction(c *cli.Context, vc *viamClient, args reloadModuleArgs, l dest := reloadingDestination(c, manifest) err = vc.copyFilesToFqdn( part.Part.Fqdn, globalArgs.Debug, false, false, []string{buildPath}, - dest, logging.NewLogger(reloadVersion), args.NoProgress) + dest, logging.NewLogger(reloadVersionPrefix), args.NoProgress) if err != nil { if s, ok := status.FromError(err); ok && s.Code() == codes.PermissionDenied { warningf(c.App.ErrWriter, "RDK couldn't write to the default file copy destination. "+ diff --git a/cli/module_reload.go b/cli/module_reload.go index 8c2920c80cd..4c5f2d3ccd4 100644 --- a/cli/module_reload.go +++ b/cli/module_reload.go @@ -18,8 +18,8 @@ import ( rutils "go.viam.com/rdk/utils" ) -const reloadVersion = "reload" -const reloadSourceVersion = "reload-source" +const reloadVersionPrefix = "reload" +const reloadSourceVersionPrefix = "reload-source" // ModuleMap is a type alias to indicate where a map represents a module config. // We don't convert to rdkConfig.Module because it can get out of date with what's in the db. From c41e09d58179aa1c62f3b7d109c941b14376776f Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Wed, 8 Oct 2025 17:17:16 -0400 Subject: [PATCH 3/3] make lint --- cli/module_build.go | 4 ++-- cli/module_reload.go | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/cli/module_build.go b/cli/module_build.go index a0e9f28b9ad..cc945491905 100644 --- a/cli/module_build.go +++ b/cli/module_build.go @@ -721,7 +721,7 @@ func (c *viamClient) ensureModuleRegisteredInCloud(ctx *cli.Context, moduleID mo } // moduleCloudReload triggers a cloud build and then reloads the specified module with that build. -func (c *viamClient) moduleCloudReload(ctx *cli.Context, args reloadModuleArgs, platform string, partID string) (string, error) { +func (c *viamClient) moduleCloudReload(ctx *cli.Context, args reloadModuleArgs, platform, partID string) (string, error) { manifest, err := loadManifest(args.Module) if err != nil { return "", err @@ -855,7 +855,7 @@ func ReloadModuleAction(c *cli.Context, args reloadModuleArgs) error { return reloadModuleAction(c, vc, args, logger) } -func getReloadVersion(versionPrefix string, partID string) string { +func getReloadVersion(versionPrefix, partID string) string { return versionPrefix + "-" + partID } diff --git a/cli/module_reload.go b/cli/module_reload.go index 4c5f2d3ccd4..9ea0dfdb2ea 100644 --- a/cli/module_reload.go +++ b/cli/module_reload.go @@ -18,8 +18,10 @@ import ( rutils "go.viam.com/rdk/utils" ) -const reloadVersionPrefix = "reload" -const reloadSourceVersionPrefix = "reload-source" +const ( + reloadVersionPrefix = "reload" + reloadSourceVersionPrefix = "reload-source" +) // ModuleMap is a type alias to indicate where a map represents a module config. // We don't convert to rdkConfig.Module because it can get out of date with what's in the db.