From d78795d5604d374394bedb81721ff570530dd955 Mon Sep 17 00:00:00 2001 From: Dominik Przybyl Date: Tue, 3 Oct 2023 16:35:57 +0200 Subject: [PATCH 1/3] added package copy --- cmd/aem/package.go | 38 ++++++++++++++++++++++++++++++++++++++ pkg/package.go | 11 +++++++++++ pkg/package_manager.go | 18 ++++++++++++++++++ 3 files changed, 67 insertions(+) diff --git a/cmd/aem/package.go b/cmd/aem/package.go index a2d02433..d82bff21 100644 --- a/cmd/aem/package.go +++ b/cmd/aem/package.go @@ -29,6 +29,7 @@ func (c *CLI) pkgCmd() *cobra.Command { cmd.AddCommand(c.pkgDownloadCmd()) cmd.AddCommand(c.pkgBuildCmd()) cmd.AddCommand(c.pkgFindCmd()) + cmd.AddCommand(c.pkgCopyCmd()) return cmd } @@ -669,3 +670,40 @@ func (c *CLI) pkgDownloadCmd() *cobra.Command { pkgDefineDownloadFlags(cmd) return cmd } + +func (c *CLI) pkgCopyCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "copy", + Aliases: []string{"cp"}, + Short: "Copy package to another instance", + Run: func(cmd *cobra.Command, args []string) { + instance, err := c.aem.InstanceManager().One() + if err != nil { + c.Error(err) + return + } + targetInstance, err := determineContentTargetInstance(cmd, c.aem.InstanceManager()) + if err != nil { + c.Error(err) + return + } + p, err := pkgPIDByFlags(cmd, *instance) + if err != nil { + c.Error(err) + return + } + if err := p.Copy(targetInstance); err != nil { + c.Error(err) + return + } + c.Changed("package copied") + }, + } + cmd.Flags().StringP("instance-target-url", "u", "", "Destination instance URL") + cmd.Flags().StringP("instance-target-id", "i", "", "Destination instance ID") + cmd.MarkFlagsOneRequired("instance-target-url", "instance-target-id") + cmd.Flags().String("pid", "", "ID (group:name:version)'") + cmd.Flags().String("path", "", "Remote repository path") + cmd.MarkFlagsOneRequired("pid", "path") + return cmd +} diff --git a/pkg/package.go b/pkg/package.go index e82c21f3..64ed30d6 100644 --- a/pkg/package.go +++ b/pkg/package.go @@ -235,3 +235,14 @@ func (p Package) DownloadWithChanged(localFile string) (bool, error) { } return false, nil } + +func (p Package) Copy(destInstance *Instance) error { + state, err := p.State() + if err != nil { + return err + } + if !state.Exists { + return fmt.Errorf("%s > package '%s' cannot be copied as it does not exist", p.manager.instance.ID(), p.PID.String()) + } + return p.manager.Copy(state.Data.Path, destInstance) +} diff --git a/pkg/package_manager.go b/pkg/package_manager.go index c72e7c9b..866cd6cd 100644 --- a/pkg/package_manager.go +++ b/pkg/package_manager.go @@ -207,6 +207,24 @@ func (pm *PackageManager) Create(opts PackageCreateOpts) (string, error) { return status.Path, nil } +func (pm *PackageManager) Copy(remotePath string, destInstance *Instance) error { + var localPath = pathx.RandomFileName(pm.tmpDir(), "pkg_copy", ".zip") + defer func() { + _ = pathx.DeleteIfExists(localPath) + }() + if err := pm.Download(remotePath, localPath); err != nil { + return err + } + destRemotePath, err := destInstance.PackageManager().Upload(localPath) + if err != nil { + return err + } + if err := destInstance.PackageManager().Install(destRemotePath); err != nil { + return err + } + return nil +} + func (pm *PackageManager) tmpDir() string { return pm.instance.manager.aem.baseOpts.TmpDir } From a39d542654f02849cb8fc22639607f5a6b2a7f3c Mon Sep 17 00:00:00 2001 From: Dominik Przybyl Date: Wed, 4 Oct 2023 10:18:34 +0200 Subject: [PATCH 2/3] added idempotency to package copy --- cmd/aem/package.go | 24 ++++++++++++++++++++++-- pkg/package.go | 18 ++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/cmd/aem/package.go b/cmd/aem/package.go index d82bff21..32281639 100644 --- a/cmd/aem/package.go +++ b/cmd/aem/package.go @@ -692,11 +692,30 @@ func (c *CLI) pkgCopyCmd() *cobra.Command { c.Error(err) return } - if err := p.Copy(targetInstance); err != nil { + force, _ := cmd.Flags().GetBool("force") + changed := false + if force { + err = p.Copy(targetInstance) + changed = true + } else { + changed, err = p.CopyWithChanged(targetInstance) + } + if err != nil { c.Error(err) return } - c.Changed("package copied") + if err := c.aem.InstanceManager().AwaitStartedOne(*targetInstance); err != nil { + c.Error(err) + return + } + c.SetOutput("package", p) + c.SetOutput("instance", instance) + c.SetOutput("targetInstance", targetInstance) + if changed { + c.Changed("package copied") + } else { + c.Ok("package already copied (up-to-date)") + } }, } cmd.Flags().StringP("instance-target-url", "u", "", "Destination instance URL") @@ -705,5 +724,6 @@ func (c *CLI) pkgCopyCmd() *cobra.Command { cmd.Flags().String("pid", "", "ID (group:name:version)'") cmd.Flags().String("path", "", "Remote repository path") cmd.MarkFlagsOneRequired("pid", "path") + cmd.Flags().BoolP("force", "f", false, "Copy even when already copied") return cmd } diff --git a/pkg/package.go b/pkg/package.go index 64ed30d6..e0e64190 100644 --- a/pkg/package.go +++ b/pkg/package.go @@ -246,3 +246,21 @@ func (p Package) Copy(destInstance *Instance) error { } return p.manager.Copy(state.Data.Path, destInstance) } + +func (p Package) CopyWithChanged(destInstance *Instance) (bool, error) { + state, err := p.State() + if err != nil { + return false, err + } + if !state.Exists { + return false, fmt.Errorf("%s > package '%s' cannot be copied as it does not exist", p.manager.instance.ID(), p.PID.String()) + } + destItem, err := destInstance.PackageManager().Find(state.PID) + if err != nil { + return false, err + } + if destItem != nil { + return false, nil + } + return true, p.manager.Copy(state.Data.Path, destInstance) +} From 9dd1cbfe97fa16ff3ac5cf0482aa393c5e8d54a1 Mon Sep 17 00:00:00 2001 From: Dominik Przybyl Date: Wed, 4 Oct 2023 11:27:44 +0200 Subject: [PATCH 3/3] added determineTargetInstance function to package.go --- cmd/aem/package.go | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/cmd/aem/package.go b/cmd/aem/package.go index 32281639..f4348762 100644 --- a/cmd/aem/package.go +++ b/cmd/aem/package.go @@ -682,7 +682,7 @@ func (c *CLI) pkgCopyCmd() *cobra.Command { c.Error(err) return } - targetInstance, err := determineContentTargetInstance(cmd, c.aem.InstanceManager()) + targetInstance, err := determineTargetInstance(cmd, c.aem.InstanceManager()) if err != nil { c.Error(err) return @@ -727,3 +727,19 @@ func (c *CLI) pkgCopyCmd() *cobra.Command { cmd.Flags().BoolP("force", "f", false, "Copy even when already copied") return cmd } + +func determineTargetInstance(cmd *cobra.Command, instanceManager *pkg.InstanceManager) (*pkg.Instance, error) { + var instance *pkg.Instance + url, _ := cmd.Flags().GetString("instance-target-url") + if url != "" { + instance, _ = instanceManager.NewByIDAndURL("remote_adhoc_target", url) + } + id, _ := cmd.Flags().GetString("instance-target-id") + if id != "" { + instance = instanceManager.NewByID(id) + } + if instance == nil { + return nil, fmt.Errorf("missing 'instance-target-url' or 'instance-target-id'") + } + return instance, nil +}