From 06a85708b1a4fc103dcb72b3d631d8bbfc89729f Mon Sep 17 00:00:00 2001 From: Dayuan Date: Fri, 7 Jun 2024 16:39:29 +0800 Subject: [PATCH] feat: automatically download kusion modules in the `mod add` (#1150) --- pkg/cmd/mod/add.go | 24 +++++++++++++------ pkg/cmd/mod/add_test.go | 14 +---------- .../api/generate/generator/generator.go | 1 + 3 files changed, 19 insertions(+), 20 deletions(-) diff --git a/pkg/cmd/mod/add.go b/pkg/cmd/mod/add.go index d0250932..a391f1e8 100644 --- a/pkg/cmd/mod/add.go +++ b/pkg/cmd/mod/add.go @@ -3,12 +3,14 @@ package mod import ( "fmt" "net/url" + "runtime" "strings" "github.com/spf13/cobra" "k8s.io/cli-runtime/pkg/genericiooptions" "k8s.io/kubectl/pkg/util/templates" - "kcl-lang.io/kpm/pkg/api" + "kcl-lang.io/kpm/pkg/client" + "kcl-lang.io/kpm/pkg/downloader" pkg "kcl-lang.io/kpm/pkg/package" "kusionstack.io/kusion/pkg/cmd/meta" @@ -64,13 +66,20 @@ func (o *AddOptions) Run() error { if stack == nil { return fmt.Errorf("cannot find stack with empty name") } - kclPkg, err := api.GetKclPackage(stack.Path) + + cli, err := client.NewKpmClient() + if err != nil { + return err + } + cli.DepDownloader = downloader.NewOciDownloader(runtime.GOOS + "/" + runtime.GOARCH) + + kclPkg, err := cli.LoadPkgFromPath(stack.Path) if err != nil { return err } - dependencies := kclPkg.GetDependenciesInModFile() + dependencies := kclPkg.ModFile.Dependencies.Deps if dependencies == nil { - dependencies = &pkg.Dependencies{Deps: make(map[string]pkg.Dependency)} + dependencies = make(map[string]pkg.Dependency) } // path example: oci://ghcr.io/kusionstack/service @@ -83,7 +92,7 @@ func (o *AddOptions) Run() error { return fmt.Errorf("invalid module path: %s", m.Path) } - dependencies.Deps[o.ModuleName] = pkg.Dependency{ + dependencies[o.ModuleName] = pkg.Dependency{ Name: o.ModuleName, FullName: o.ModuleName + "_" + m.Version, Version: m.Version, @@ -96,11 +105,12 @@ func (o *AddOptions) Run() error { }, } - // Save the dependencies to the kcl.mod file - err = kclPkg.StoreModFile() + // update kcl.mod and download dependencies + err = cli.UpdateDeps(kclPkg) if err != nil { return err } + return nil } diff --git a/pkg/cmd/mod/add_test.go b/pkg/cmd/mod/add_test.go index c382e51d..4df3dc56 100644 --- a/pkg/cmd/mod/add_test.go +++ b/pkg/cmd/mod/add_test.go @@ -1,12 +1,10 @@ package mod import ( - "math/rand" "testing" "github.com/stretchr/testify/assert" "k8s.io/cli-runtime/pkg/genericiooptions" - "kcl-lang.io/kpm/pkg/api" v1 "kusionstack.io/kusion/pkg/apis/api.kusion.io/v1" "kusionstack.io/kusion/pkg/cmd/meta" @@ -60,12 +58,6 @@ func TestAddOptions_Run(t *testing.T) { }) t.Run("ValidModuleAddition", func(t *testing.T) { - b := make([]byte, 4) - letter := "abcdefghijklmnopqrstuvwxyz" - for i := range b { - b[i] = letter[rand.Intn(len(letter))] - } - o := &AddOptions{ MetaOptions: meta.MetaOptions{ RefStack: &v1.Stack{ @@ -76,7 +68,7 @@ func TestAddOptions_Run(t *testing.T) { Modules: v1.ModuleConfigs{ "service": { Path: "oci://ghcr.io/kusionstack/service", - Version: string(b), + Version: "0.1.0", }, }, }, @@ -86,9 +78,5 @@ func TestAddOptions_Run(t *testing.T) { } err := o.Run() assert.NoError(t, err) - kclPkg, err := api.GetKclPackage(o.RefStack.Path) - assert.NoError(t, err) - file := kclPkg.GetDependenciesInModFile() - assert.Equal(t, file.Deps["service"].Version, string(b)) }) } diff --git a/pkg/engine/api/generate/generator/generator.go b/pkg/engine/api/generate/generator/generator.go index 7ae769e9..2ab9c73b 100644 --- a/pkg/engine/api/generate/generator/generator.go +++ b/pkg/engine/api/generate/generator/generator.go @@ -115,6 +115,7 @@ func CopyDependentModules(workDir string) error { dest = fmt.Sprintf("%s.exe", dest) } // copy the module binary to the $KUSION_HOME modules directory + // todo: replace with symlink err = io.CopyFile(source, dest) if err == nil { // mark the dest file as executable