From d09fa12b09debe76fc4d3796f67fd8be3f0fdddf Mon Sep 17 00:00:00 2001 From: TonyAdo <71679464+adohe@users.noreply.github.com> Date: Fri, 22 Dec 2023 17:19:02 +0800 Subject: [PATCH] refactor: use api types in status and core pkg (#719) --- pkg/apis/core/v1/intent.go | 9 ++ pkg/apis/core/v1/resource.go | 51 +++++++++ pkg/apis/intent/intent.go | 10 -- pkg/apis/intent/resource.go | 88 --------------- pkg/apis/{internal => status}/group.go | 2 +- pkg/apis/status/status.go | 79 -------------- pkg/apis/{internal => status}/v1/types.go | 0 pkg/cmd/apply/options.go | 16 +-- pkg/cmd/apply/options_test.go | 23 ++-- pkg/cmd/build/builders/appconfig_builder.go | 7 +- pkg/cmd/build/builders/builder.go | 5 +- pkg/cmd/build/builders/kcl/kcl_builder.go | 13 ++- .../build/builders/kcl/kcl_builder_test.go | 5 +- pkg/cmd/build/builders/kcl/util.go | 4 +- pkg/cmd/build/options_test.go | 13 ++- pkg/cmd/build/util.go | 13 ++- pkg/cmd/build/util_test.go | 17 ++- pkg/cmd/destroy/options.go | 13 ++- pkg/cmd/destroy/options_test.go | 21 ++-- pkg/cmd/preview/options.go | 15 ++- pkg/cmd/preview/options_test.go | 19 ++-- pkg/engine/operation/apply.go | 44 ++++---- pkg/engine/operation/apply_test.go | 33 +++--- pkg/engine/operation/destory.go | 22 ++-- pkg/engine/operation/destory_test.go | 21 ++-- pkg/engine/operation/diff.go | 4 +- pkg/engine/operation/graph/executable_node.go | 4 +- pkg/engine/operation/graph/node.go | 8 +- pkg/engine/operation/graph/resource_node.go | 100 +++++++++--------- .../operation/graph/resource_node_test.go | 24 ++--- pkg/engine/operation/models/change.go | 5 +- pkg/engine/operation/models/change_test.go | 51 +++++---- .../operation/models/operation_context.go | 27 +++-- .../parser/delete_resource_parser.go | 22 ++-- .../parser/delete_resource_parser_test.go | 4 +- pkg/engine/operation/parser/parser.go | 24 ++--- pkg/engine/operation/parser/spec_parser.go | 20 ++-- .../operation/parser/spec_parser_test.go | 4 +- pkg/engine/operation/preview.go | 30 +++--- pkg/engine/operation/preview_test.go | 51 +++++---- pkg/engine/operation/watch.go | 6 +- pkg/engine/operation/watch_test.go | 16 +-- pkg/engine/runtime/init/init.go | 24 ++--- pkg/engine/runtime/init/init_test.go | 12 +-- .../runtime/kubernetes/kubeops/config.go | 6 +- .../runtime/kubernetes/kubeops/config_test.go | 4 +- .../runtime/kubernetes/kubernetes_runtime.go | 58 +++++----- .../kubernetes/kubernetes_runtime_test.go | 12 +-- pkg/engine/runtime/runtime.go | 37 ++++--- .../runtime/terraform/terraform_runtime.go | 44 ++++---- .../terraform/terraform_runtime_test.go | 3 +- pkg/engine/runtime/terraform/tfops/state.go | 8 +- .../runtime/terraform/tfops/state_test.go | 6 +- .../runtime/terraform/tfops/workspace.go | 8 +- .../runtime/terraform/tfops/workspace_test.go | 11 +- pkg/engine/states/remote/mysql/mysql_state.go | 4 +- pkg/engine/states/state.go | 6 +- pkg/engine/states/state_test.go | 32 +++--- .../accessories/database/alicloud_rds.go | 10 +- .../accessories/database/alicloud_rds_test.go | 9 +- .../accessories/database/aws_rds.go | 10 +- .../accessories/database/aws_rds_test.go | 7 +- .../database/database_generator.go | 11 +- .../database/database_generator_test.go | 19 ++-- .../accessories/database/local_database.go | 20 ++-- .../database/local_database_test.go | 11 +- .../app_configurations_generator.go | 25 +++-- .../app_configurations_generator_test.go | 5 +- .../monitoring/monitoring_generator.go | 9 +- .../monitoring/monitoring_generator_test.go | 13 ++- pkg/modules/generators/namespace_generator.go | 7 +- .../generators/namespace_generator_test.go | 31 +++--- .../generators/ordered_resources_generator.go | 16 +-- .../ordered_resources_generator_test.go | 18 ++-- .../generators/trait/ops_rule_generator.go | 5 +- .../trait/ops_rule_generator_test.go | 17 ++- .../generators/workload/job_generator.go | 11 +- .../generators/workload/job_generator_test.go | 3 +- .../workload/network/ports_generator.go | 8 +- .../workload/network/ports_generator_test.go | 8 +- .../workload/secret/secret_generator.go | 7 +- .../workload/secret/secret_generator_test.go | 3 +- .../generators/workload/service_generator.go | 9 +- .../workload/service_generator_test.go | 7 +- .../generators/workload/workload_generator.go | 5 +- .../workload/workload_generator_test.go | 3 +- .../patchers/monitoring/monitoring_patcher.go | 3 +- .../monitoring/monitoring_patcher_test.go | 7 +- .../patchers/trait/ops_rule_patcher.go | 4 +- .../patchers/trait/ops_rule_patcher_test.go | 8 +- pkg/modules/types.go | 6 +- pkg/modules/util.go | 29 +++-- pkg/modules/util_test.go | 57 +++++----- 93 files changed, 737 insertions(+), 902 deletions(-) create mode 100644 pkg/apis/core/v1/resource.go delete mode 100644 pkg/apis/intent/intent.go delete mode 100644 pkg/apis/intent/resource.go rename pkg/apis/{internal => status}/group.go (70%) delete mode 100644 pkg/apis/status/status.go rename pkg/apis/{internal => status}/v1/types.go (100%) diff --git a/pkg/apis/core/v1/intent.go b/pkg/apis/core/v1/intent.go index 402332fd..b11ac112 100644 --- a/pkg/apis/core/v1/intent.go +++ b/pkg/apis/core/v1/intent.go @@ -7,6 +7,15 @@ const ( Terraform Type = "Terraform" ) +const ( + // ResourceExtensionGVK is the key for resource extension, which is used to + // store the GVK of the resource. + ResourceExtensionGVK = "GVK" + // ResourceExtensionKubeConfig is the key for resource extension, which is used + // to indicate the path of kubeConfig for Kubernetes type resource. + ResourceExtensionKubeConfig = "kubeConfig" +) + // Intent describes the desired state how the infrastructure should look like: which workload to run, // the load-balancer setup, the location of the database schema, and so on. Based on that information, // the Kusion engine takes care of updating the production state to match the Intent. diff --git a/pkg/apis/core/v1/resource.go b/pkg/apis/core/v1/resource.go new file mode 100644 index 00000000..905d9a99 --- /dev/null +++ b/pkg/apis/core/v1/resource.go @@ -0,0 +1,51 @@ +package v1 + +import "encoding/json" + +func (r *Resource) ResourceKey() string { + return r.ID +} + +// DeepCopy return a copy of resource +func (r *Resource) DeepCopy() *Resource { + var out Resource + data, err := json.Marshal(r) + if err != nil { + panic(err) + } + _ = json.Unmarshal(data, &out) + return &out +} + +func (rs Resources) Index() map[string]*Resource { + m := make(map[string]*Resource) + for i := range rs { + m[rs[i].ResourceKey()] = &rs[i] + } + return m +} + +// GVKIndex returns a map of GVK to resources, for now, only Kubernetes resources. +func (rs Resources) GVKIndex() map[string][]*Resource { + m := make(map[string][]*Resource) + for i := range rs { + resource := &rs[i] + if resource.Type != Kubernetes { + continue + } + gvk := resource.Extensions[ResourceExtensionGVK].(string) + m[gvk] = append(m[gvk], resource) + } + return m +} + +func (rs Resources) Len() int { return len(rs) } +func (rs Resources) Swap(i, j int) { rs[i], rs[j] = rs[j], rs[i] } +func (rs Resources) Less(i, j int) bool { + switch { + case rs[i].ID != rs[j].ID: + return rs[i].ID < rs[j].ID + default: + return false + } +} diff --git a/pkg/apis/intent/intent.go b/pkg/apis/intent/intent.go deleted file mode 100644 index 49c68616..00000000 --- a/pkg/apis/intent/intent.go +++ /dev/null @@ -1,10 +0,0 @@ -package intent - -// Intent represents the operational intentions that you aim to deliver using Kusion. -// These intentions are expected to contain all components throughout the software development lifecycle (SDLC), -// including resources (workload, database, load balancer, etc.), dependencies, and policies. The Kusion module generators are responsible -// for converting all AppConfigurations and environment configurations into the Intent. -// Once the Intent is generated, the Kusion Engine takes charge of updating the actual infrastructures to match the Intent. -type Intent struct { - Resources Resources `json:"resources" yaml:"resources"` -} diff --git a/pkg/apis/intent/resource.go b/pkg/apis/intent/resource.go deleted file mode 100644 index bcde1c5d..00000000 --- a/pkg/apis/intent/resource.go +++ /dev/null @@ -1,88 +0,0 @@ -package intent - -import "encoding/json" - -type Type string - -const ( - Kubernetes Type = "Kubernetes" - Terraform Type = "Terraform" -) - -const ( - // ResourceExtensionGVK is the key for resource extension, which is used to - // store the GVK of the resource. - ResourceExtensionGVK = "GVK" - // ResourceExtensionKubeConfig is the key for resource extension, which is used - // to indicate the path of kubeConfig for Kubernetes type resource. - ResourceExtensionKubeConfig = "kubeConfig" -) - -type Resources []Resource - -type Resource struct { - // ID is the unique key of this resource in the whole State. - // ApiVersion:Kind:Namespace:Name is an idiomatic way for Kubernetes resources. - // providerNamespace:providerName:resourceType:resourceName for Terraform resources - ID string `json:"id" yaml:"id"` - - // Type represents all Runtimes we supported like Kubernetes and Terraform - Type Type `json:"type" yaml:"type"` - - // Attributes represents all specified attributes of this resource - Attributes map[string]interface{} `json:"attributes" yaml:"attributes"` - - // DependsOn contains all resources this resource depends on - DependsOn []string `json:"dependsOn,omitempty" yaml:"dependsOn,omitempty"` - - // Extensions specifies arbitrary metadata of this resource - Extensions map[string]interface{} `json:"extensions,omitempty" yaml:"extensions,omitempty"` -} - -func (r *Resource) ResourceKey() string { - return r.ID -} - -// DeepCopy return a copy of resource -func (r *Resource) DeepCopy() *Resource { - var out Resource - data, err := json.Marshal(r) - if err != nil { - panic(err) - } - _ = json.Unmarshal(data, &out) - return &out -} - -func (rs Resources) Index() map[string]*Resource { - m := make(map[string]*Resource) - for i := range rs { - m[rs[i].ResourceKey()] = &rs[i] - } - return m -} - -// GVKIndex returns a map of GVK to resources, for now, only Kubernetes resources. -func (rs Resources) GVKIndex() map[string][]*Resource { - m := make(map[string][]*Resource) - for i := range rs { - resource := &rs[i] - if resource.Type != Kubernetes { - continue - } - gvk := resource.Extensions[ResourceExtensionGVK].(string) - m[gvk] = append(m[gvk], resource) - } - return m -} - -func (rs Resources) Len() int { return len(rs) } -func (rs Resources) Swap(i, j int) { rs[i], rs[j] = rs[j], rs[i] } -func (rs Resources) Less(i, j int) bool { - switch { - case rs[i].ID != rs[j].ID: - return rs[i].ID < rs[j].ID - default: - return false - } -} diff --git a/pkg/apis/internal/group.go b/pkg/apis/status/group.go similarity index 70% rename from pkg/apis/internal/group.go rename to pkg/apis/status/group.go index 67465196..1f998bae 100644 --- a/pkg/apis/internal/group.go +++ b/pkg/apis/status/group.go @@ -1,3 +1,3 @@ -package internal +package status const Group = "internal.kusionstack.io" diff --git a/pkg/apis/status/status.go b/pkg/apis/status/status.go deleted file mode 100644 index 8276f1e5..00000000 --- a/pkg/apis/status/status.go +++ /dev/null @@ -1,79 +0,0 @@ -package status - -import ( - "fmt" -) - -type ( - Kind string - Code string -) - -const ( - Error Kind = "ERROR" - Warning Kind = "WARNING" - Info Kind = "INFO" -) - -const ( - Unknown Code = "UNKNOWN" - Unavailable Code = "UNAVAILABLE" - Unimplemented Code = "UNIMPLEMENTED" - Canceled Code = "CANCELED" - InvalidArgument Code = "INVALID_ARGUMENT" - NotFound Code = "NOTFOUND" - AlreadyExists Code = "ALREADY_EXISTS" - PermissionDenied Code = "PERMISSION_DENIED" - Internal Code = "INTERNAL" - Unauthenticated Code = "UNAUTHENTICATED" - IllegalManifest Code = "ILLEGAL_MANIFEST" -) - -type Status interface { - Kind() Kind - Code() Code - Message() string - String() string -} - -type BaseStatus struct { - kind Kind - code Code - message string -} - -func (b *BaseStatus) Kind() Kind { - return b.kind -} - -func (b *BaseStatus) Code() Code { - return b.code -} - -func (b *BaseStatus) Message() string { - return b.message -} - -func (b *BaseStatus) String() string { - return fmt.Sprintf("Kind: %s, Code: %s, Message: %s", b.kind, b.code, b.message) -} - -func IsErr(s Status) bool { - return s != nil && s.Kind() == Error -} - -func NewBaseStatus(kind Kind, code Code, message string) *BaseStatus { - return &BaseStatus{kind: kind, code: code, message: message} -} - -func NewErrorStatus(err error) *BaseStatus { - return &BaseStatus{kind: Error, code: Internal, message: err.Error()} -} - -func NewErrorStatusWithCode(code Code, err error) *BaseStatus { - return &BaseStatus{kind: Error, code: code, message: err.Error()} -} - -func NewErrorStatusWithMsg(code Code, msg string) *BaseStatus { - return &BaseStatus{kind: Error, code: code, message: msg} -} diff --git a/pkg/apis/internal/v1/types.go b/pkg/apis/status/v1/types.go similarity index 100% rename from pkg/apis/internal/v1/types.go rename to pkg/apis/status/v1/types.go diff --git a/pkg/cmd/apply/options.go b/pkg/cmd/apply/options.go index fb615af6..eae7feba 100644 --- a/pkg/cmd/apply/options.go +++ b/pkg/cmd/apply/options.go @@ -10,8 +10,8 @@ import ( "github.com/AlecAivazis/survey/v2" "github.com/pterm/pterm" - "kusionstack.io/kusion/pkg/apis/intent" - "kusionstack.io/kusion/pkg/apis/status" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" + v1 "kusionstack.io/kusion/pkg/apis/status/v1" "kusionstack.io/kusion/pkg/cmd/build" cmdintent "kusionstack.io/kusion/pkg/cmd/build/builders" previewcmd "kusionstack.io/kusion/pkg/cmd/preview" @@ -75,7 +75,7 @@ func (o *Options) Run() error { } // Generate Intent - var sp *intent.Intent + var sp *apiv1.Intent if o.IntentFile != "" { sp, err = build.IntentFromFile(o.IntentFile) } else { @@ -187,7 +187,7 @@ func (o *Options) Run() error { func Apply( o *Options, storage states.StateStorage, - planResources *intent.Intent, + planResources *apiv1.Intent, changes *opsmodels.Changes, out io.Writer, ) error { @@ -294,7 +294,7 @@ func Apply( Intent: planResources, }, }) - if status.IsErr(st) { + if v1.IsErr(st) { return fmt.Errorf("apply failed, status:\n%v", st) } } @@ -323,7 +323,7 @@ func Apply( // } func Watch( o *Options, - planResources *intent.Intent, + planResources *apiv1.Intent, changes *opsmodels.Changes, ) error { if o.DryRun { @@ -332,7 +332,7 @@ func Watch( } // Filter out unchanged resources - toBeWatched := intent.Resources{} + toBeWatched := apiv1.Resources{} for _, res := range planResources.Resources { if changes.ChangeOrder.ChangeSteps[res.ResourceKey()].Action != opsmodels.UnChanged { toBeWatched = append(toBeWatched, res) @@ -345,7 +345,7 @@ func Watch( Request: opsmodels.Request{ Project: changes.Project(), Stack: changes.Stack(), - Intent: &intent.Intent{Resources: toBeWatched}, + Intent: &apiv1.Intent{Resources: toBeWatched}, }, }); err != nil { return err diff --git a/pkg/cmd/apply/options_test.go b/pkg/cmd/apply/options_test.go index 044e3e31..656b2bc7 100644 --- a/pkg/cmd/apply/options_test.go +++ b/pkg/cmd/apply/options_test.go @@ -13,8 +13,7 @@ import ( "github.com/stretchr/testify/assert" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" - "kusionstack.io/kusion/pkg/apis/status" + v1 "kusionstack.io/kusion/pkg/apis/status/v1" "kusionstack.io/kusion/pkg/cmd/build" "kusionstack.io/kusion/pkg/cmd/build/builders" "kusionstack.io/kusion/pkg/engine" @@ -78,8 +77,8 @@ func mockPatchBuildIntent() *mockey.Mocker { o *builders.Options, project *apiv1.Project, stack *apiv1.Stack, - ) (*intent.Intent, error) { - return &intent.Intent{Resources: []intent.Resource{sa1, sa2, sa3}}, nil + ) (*apiv1.Intent, error) { + return &apiv1.Intent{Resources: []apiv1.Resource{sa1, sa2, sa3}}, nil }).Build() } @@ -129,7 +128,7 @@ func mockPatchOperationPreview() *mockey.Mocker { return mockey.Mock((*operation.PreviewOperation).Preview).To(func( *operation.PreviewOperation, *operation.PreviewRequest, - ) (rsp *operation.PreviewResponse, s status.Status) { + ) (rsp *operation.PreviewResponse, s v1.Status) { return &operation.PreviewResponse{ Order: &opsmodels.ChangeOrder{ StepKeys: []string{sa1.ID, sa2.ID, sa3.ID}, @@ -167,8 +166,8 @@ var ( sa3 = newSA("sa3") ) -func newSA(name string) intent.Resource { - return intent.Resource{ +func newSA(name string) apiv1.Resource { + return apiv1.Resource{ ID: engine.BuildID(apiVersion, kind, namespace, name), Type: "Kubernetes", Attributes: map[string]interface{}{ @@ -185,7 +184,7 @@ func newSA(name string) intent.Resource { func Test_apply(t *testing.T) { stateStorage := &local.FileSystemState{Path: filepath.Join("", local.KusionStateFileFile)} mockey.PatchConvey("dry run", t, func() { - planResources := &intent.Intent{Resources: []intent.Resource{sa1}} + planResources := &apiv1.Intent{Resources: []apiv1.Resource{sa1}} order := &opsmodels.ChangeOrder{ StepKeys: []string{sa1.ID}, ChangeSteps: map[string]*opsmodels.ChangeStep{ @@ -205,7 +204,7 @@ func Test_apply(t *testing.T) { mockey.PatchConvey("apply success", t, func() { mockOperationApply(opsmodels.Success) o := NewApplyOptions() - planResources := &intent.Intent{Resources: []intent.Resource{sa1, sa2}} + planResources := &apiv1.Intent{Resources: []apiv1.Resource{sa1, sa2}} order := &opsmodels.ChangeOrder{ StepKeys: []string{sa1.ID, sa2.ID}, ChangeSteps: map[string]*opsmodels.ChangeStep{ @@ -230,7 +229,7 @@ func Test_apply(t *testing.T) { mockOperationApply(opsmodels.Failed) o := NewApplyOptions() - planResources := &intent.Intent{Resources: []intent.Resource{sa1}} + planResources := &apiv1.Intent{Resources: []apiv1.Resource{sa1}} order := &opsmodels.ChangeOrder{ StepKeys: []string{sa1.ID}, ChangeSteps: map[string]*opsmodels.ChangeStep{ @@ -250,7 +249,7 @@ func Test_apply(t *testing.T) { func mockOperationApply(res opsmodels.OpResult) { mockey.Mock((*operation.ApplyOperation).Apply).To( - func(o *operation.ApplyOperation, request *operation.ApplyRequest) (*operation.ApplyResponse, status.Status) { + func(o *operation.ApplyOperation, request *operation.ApplyRequest) (*operation.ApplyResponse, v1.Status) { var err error if res == opsmodels.Failed { err = errors.New("mock error") @@ -270,7 +269,7 @@ func mockOperationApply(res opsmodels.OpResult) { } close(o.MsgCh) if res == opsmodels.Failed { - return nil, status.NewErrorStatus(err) + return nil, v1.NewErrorStatus(err) } return &operation.ApplyResponse{}, nil }).Build() diff --git a/pkg/cmd/build/builders/appconfig_builder.go b/pkg/cmd/build/builders/appconfig_builder.go index d35137df..8a5caf2c 100644 --- a/pkg/cmd/build/builders/appconfig_builder.go +++ b/pkg/cmd/build/builders/appconfig_builder.go @@ -2,7 +2,6 @@ package builders import ( "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/modules" "kusionstack.io/kusion/pkg/modules/generators" "kusionstack.io/kusion/pkg/modules/inputs" @@ -17,9 +16,9 @@ func (acg *AppsConfigBuilder) Build( _ *Options, project *v1.Project, stack *v1.Stack, -) (*intent.Intent, error) { - i := &intent.Intent{ - Resources: []intent.Resource{}, +) (*v1.Intent, error) { + i := &v1.Intent{ + Resources: []v1.Resource{}, } var gfs []modules.NewGeneratorFunc diff --git a/pkg/cmd/build/builders/builder.go b/pkg/cmd/build/builders/builder.go index 0fa5abff..f144ed00 100644 --- a/pkg/cmd/build/builders/builder.go +++ b/pkg/cmd/build/builders/builder.go @@ -1,15 +1,14 @@ package builders import ( - v1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" + "kusionstack.io/kusion/pkg/apis/core/v1" ) // Builder represents a method to build an Intent. Typically, it is implemented by the AppConfigureBuilder, // but we have designed it as an interface to allow for more general usage. Any struct that implements this interface // is considered a Builder and can be integrated into the Kusion workflow. type Builder interface { - Build(o *Options, project *v1.Project, stack *v1.Stack) (*intent.Intent, error) + Build(o *Options, project *v1.Project, stack *v1.Stack) (*v1.Intent, error) } type Options struct { diff --git a/pkg/cmd/build/builders/kcl/kcl_builder.go b/pkg/cmd/build/builders/kcl/kcl_builder.go index 22b8cd63..4ee2e57a 100644 --- a/pkg/cmd/build/builders/kcl/kcl_builder.go +++ b/pkg/cmd/build/builders/kcl/kcl_builder.go @@ -16,8 +16,7 @@ import ( "kcl-lang.io/kpm/pkg/api" "kcl-lang.io/kpm/pkg/opt" - v1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" + "kusionstack.io/kusion/pkg/apis/core/v1" "kusionstack.io/kusion/pkg/cmd/build/builders" "kusionstack.io/kusion/pkg/cmd/build/builders/crd" "kusionstack.io/kusion/pkg/cmd/build/builders/kcl/rest" @@ -51,7 +50,7 @@ func EnableRPC() bool { return !enableRest } -func (g *Builder) Build(o *builders.Options, _ *v1.Project, stack *v1.Stack) (*intent.Intent, error) { +func (g *Builder) Build(o *builders.Options, _ *v1.Project, stack *v1.Stack) (*v1.Intent, error) { compileResult, err := Run(o, stack) if err != nil { return nil, err @@ -258,8 +257,8 @@ func Overwrite(fileName string, overrides []string) (bool, error) { return kcl.OverrideFile(fileName, overrides, []string{}) } -func KCLResult2Intent(kclResults []kcl.KCLResult) (*intent.Intent, error) { - resources := make([]intent.Resource, len(kclResults)) +func KCLResult2Intent(kclResults []kcl.KCLResult) (*v1.Intent, error) { + resources := make([]v1.Resource, len(kclResults)) for i, result := range kclResults { // Marshal kcl result to bytes @@ -276,12 +275,12 @@ func KCLResult2Intent(kclResults []kcl.KCLResult) (*intent.Intent, error) { log.Infof("convert kcl result to resource: %s", msg) // Parse json data as models.Resource - var item intent.Resource + var item v1.Resource if err = json.Unmarshal(bytes, &item); err != nil { return nil, err } resources[i] = item } - return &intent.Intent{Resources: resources}, nil + return &v1.Intent{Resources: resources}, nil } diff --git a/pkg/cmd/build/builders/kcl/kcl_builder_test.go b/pkg/cmd/build/builders/kcl/kcl_builder_test.go index fbd57610..35c44aa2 100644 --- a/pkg/cmd/build/builders/kcl/kcl_builder_test.go +++ b/pkg/cmd/build/builders/kcl/kcl_builder_test.go @@ -12,7 +12,6 @@ import ( "kcl-lang.io/kcl-go/pkg/spec/gpyrpc" "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/cmd/build/builders" "kusionstack.io/kusion/pkg/cmd/build/builders/kcl/rest" ) @@ -50,14 +49,14 @@ func TestGenerateIntent(t *testing.T) { tests := []struct { name string args args - want *intent.Intent + want *v1.Intent wantErr bool prefunc func() }{ { name: "success", args: testArgs, - want: &intent.Intent{Resources: []intent.Resource{}}, + want: &v1.Intent{Resources: []v1.Resource{}}, wantErr: false, prefunc: func() { mockRunFiles(nil) }, }, diff --git a/pkg/cmd/build/builders/kcl/util.go b/pkg/cmd/build/builders/kcl/util.go index aa4381cc..262338f5 100644 --- a/pkg/cmd/build/builders/kcl/util.go +++ b/pkg/cmd/build/builders/kcl/util.go @@ -7,7 +7,7 @@ import ( "gopkg.in/yaml.v3" - "kusionstack.io/kusion/pkg/apis/intent" + "kusionstack.io/kusion/pkg/apis/core/v1" "kusionstack.io/kusion/pkg/engine" "kusionstack.io/kusion/pkg/log" "kusionstack.io/kusion/pkg/util/io" @@ -94,7 +94,7 @@ func k8sResource2ResourceMap(resource map[string]interface{}) (map[string]interf return map[string]interface{}{ ID: engine.BuildID(apiVersion, kind, metadataNamespace, metadataName), - Type: intent.Kubernetes, + Type: v1.Kubernetes, Attributes: resource, }, nil } diff --git a/pkg/cmd/build/options_test.go b/pkg/cmd/build/options_test.go index fe581b9f..1948f77d 100644 --- a/pkg/cmd/build/options_test.go +++ b/pkg/cmd/build/options_test.go @@ -10,7 +10,6 @@ import ( "github.com/stretchr/testify/assert" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/cmd/build/builders" "kusionstack.io/kusion/pkg/engine" "kusionstack.io/kusion/pkg/project" @@ -119,8 +118,8 @@ func TestCompileOptions_Run(t *testing.T) { }) } -func newSA(name string) intent.Resource { - return intent.Resource{ +func newSA(name string) apiv1.Resource { + return apiv1.Resource{ ID: engine.BuildID(apiVersion, kind, namespace, name), Type: "Kubernetes", Attributes: map[string]interface{}{ @@ -155,8 +154,8 @@ func mockGenerateIntent() *mockey.Mocker { o *builders.Options, project *apiv1.Project, stack *apiv1.Stack, - ) (*intent.Intent, error) { - return &intent.Intent{Resources: []intent.Resource{sa1, sa2, sa3}}, nil + ) (*apiv1.Intent, error) { + return &apiv1.Intent{Resources: []apiv1.Resource{sa1, sa2, sa3}}, nil }).Build() } @@ -165,8 +164,8 @@ func mockGenerateIntentFail() *mockey.Mocker { o *builders.Options, project *apiv1.Project, stack *apiv1.Stack, - ) (*intent.Intent, error) { - return &intent.Intent{Resources: []intent.Resource{sa1, sa2, sa3}}, errTest + ) (*apiv1.Intent, error) { + return &apiv1.Intent{Resources: []apiv1.Resource{sa1, sa2, sa3}}, errTest }).Build() } diff --git a/pkg/cmd/build/util.go b/pkg/cmd/build/util.go index 0e2d4d12..dc60bc76 100644 --- a/pkg/cmd/build/util.go +++ b/pkg/cmd/build/util.go @@ -12,17 +12,16 @@ import ( "gopkg.in/yaml.v2" yamlv3 "gopkg.in/yaml.v3" - v1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" + "kusionstack.io/kusion/pkg/apis/core/v1" "kusionstack.io/kusion/pkg/cmd/build/builders" "kusionstack.io/kusion/pkg/cmd/build/builders/kcl" "kusionstack.io/kusion/pkg/log" "kusionstack.io/kusion/pkg/modules/inputs" "kusionstack.io/kusion/pkg/util/pretty" - workspace "kusionstack.io/kusion/pkg/workspace" + "kusionstack.io/kusion/pkg/workspace" ) -func IntentWithSpinner(o *builders.Options, project *v1.Project, stack *v1.Stack) (*intent.Intent, error) { +func IntentWithSpinner(o *builders.Options, project *v1.Project, stack *v1.Stack) (*v1.Intent, error) { var sp *pterm.SpinnerPrinter if o.NoStyle { fmt.Printf("Generating Intent in the Stack %s...\n", stack.Name) @@ -55,7 +54,7 @@ func IntentWithSpinner(o *builders.Options, project *v1.Project, stack *v1.Stack return i, nil } -func Intent(o *builders.Options, p *v1.Project, s *v1.Stack) (*intent.Intent, error) { +func Intent(o *builders.Options, p *v1.Project, s *v1.Stack) (*v1.Intent, error) { // Choose the generator var builder builders.Builder pg := p.Generator @@ -123,7 +122,7 @@ func buildAppConfigs(o *builders.Options, stack *v1.Stack) (map[string]inputs.Ap return appConfigs, nil } -func IntentFromFile(filePath string) (*intent.Intent, error) { +func IntentFromFile(filePath string) (*v1.Intent, error) { b, err := os.ReadFile(filePath) if err != nil { return nil, err @@ -134,7 +133,7 @@ func IntentFromFile(filePath string) (*intent.Intent, error) { // The use of yaml.v2 and yaml.v3 should be unified in the future. decoder := yamlv3.NewDecoder(bytes.NewBuffer(b)) decoder.KnownFields(true) - i := &intent.Intent{} + i := &v1.Intent{} if err = decoder.Decode(i); err != nil && err != io.EOF { return nil, fmt.Errorf("failed to parse the intent file, please check if the file content is valid") } diff --git a/pkg/cmd/build/util_test.go b/pkg/cmd/build/util_test.go index 694b8e89..fe4cad36 100644 --- a/pkg/cmd/build/util_test.go +++ b/pkg/cmd/build/util_test.go @@ -11,7 +11,6 @@ import ( kclgo "kcl-lang.io/kcl-go" "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/cmd/build/builders" "kusionstack.io/kusion/pkg/cmd/build/builders/kcl" appconfigmodel "kusionstack.io/kusion/pkg/modules/inputs" @@ -32,8 +31,8 @@ resources: spec: {} status: {} ` - intentModel1 = &intent.Intent{ - Resources: []intent.Resource{ + intentModel1 = &v1.Intent{ + Resources: []v1.Resource{ { ID: "v1:Namespace:default", Type: "Kubernetes", @@ -69,8 +68,8 @@ resources: name: kube-system ` - intentModel2 = &intent.Intent{ - Resources: []intent.Resource{ + intentModel2 = &v1.Intent{ + Resources: []v1.Resource{ { ID: "v1:Namespace:default", Type: "Kubernetes", @@ -96,8 +95,8 @@ resources: }, } - intentModel3 = &intent.Intent{ - Resources: []intent.Resource{ + intentModel3 = &v1.Intent{ + Resources: []v1.Resource{ { ID: "v1:Namespace:default", Type: "Kubernetes", @@ -159,7 +158,7 @@ func TestBuildIntentFromFile(t *testing.T) { name string path string content string - want *intent.Intent + want *v1.Intent wantErr bool }{ { @@ -212,7 +211,7 @@ func TestBuildIntent(t *testing.T) { tests := []struct { name string args args - want *intent.Intent + want *v1.Intent wantErr bool }{ { diff --git a/pkg/cmd/destroy/options.go b/pkg/cmd/destroy/options.go index c808def7..a2f7717f 100644 --- a/pkg/cmd/destroy/options.go +++ b/pkg/cmd/destroy/options.go @@ -10,8 +10,7 @@ import ( "github.com/pterm/pterm" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" - "kusionstack.io/kusion/pkg/apis/status" + v1 "kusionstack.io/kusion/pkg/apis/status/v1" "kusionstack.io/kusion/pkg/cmd/build" "kusionstack.io/kusion/pkg/engine/backend" "kusionstack.io/kusion/pkg/engine/operation" @@ -88,7 +87,7 @@ func (o *Options) Run() error { } // Compute changes for preview - i := &intent.Intent{Resources: destroyResources} + i := &apiv1.Intent{Resources: destroyResources} changes, err := o.preview(i, project, stack, stateStorage) if err != nil { return err @@ -134,7 +133,7 @@ func (o *Options) Run() error { } func (o *Options) preview( - planResources *intent.Intent, project *apiv1.Project, + planResources *apiv1.Intent, project *apiv1.Project, stack *apiv1.Stack, stateStorage states.StateStorage, ) (*opsmodels.Changes, error) { log.Info("Start compute preview changes ...") @@ -159,14 +158,14 @@ func (o *Options) preview( Intent: planResources, }, }) - if status.IsErr(s) { + if v1.IsErr(s) { return nil, fmt.Errorf("preview failed, status: %v", s) } return opsmodels.NewChanges(project, stack, rsp.Order), nil } -func (o *Options) destroy(planResources *intent.Intent, changes *opsmodels.Changes, stateStorage states.StateStorage) error { +func (o *Options) destroy(planResources *apiv1.Intent, changes *opsmodels.Changes, stateStorage states.StateStorage) error { do := &operation.DestroyOperation{ Operation: opsmodels.Operation{ Stack: changes.Stack(), @@ -251,7 +250,7 @@ func (o *Options) destroy(planResources *intent.Intent, changes *opsmodels.Chang Intent: planResources, }, }) - if status.IsErr(st) { + if v1.IsErr(st) { return fmt.Errorf("destroy failed, status: %v", st) } diff --git a/pkg/cmd/destroy/options_test.go b/pkg/cmd/destroy/options_test.go index 6d0b2766..e7a958c2 100644 --- a/pkg/cmd/destroy/options_test.go +++ b/pkg/cmd/destroy/options_test.go @@ -12,8 +12,7 @@ import ( "github.com/stretchr/testify/assert" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" - "kusionstack.io/kusion/pkg/apis/status" + v1 "kusionstack.io/kusion/pkg/apis/status/v1" "kusionstack.io/kusion/pkg/engine" "kusionstack.io/kusion/pkg/engine/operation" opsmodels "kusionstack.io/kusion/pkg/engine/operation/models" @@ -85,7 +84,7 @@ func mockGetLatestState() { f *local.FileSystemState, query *states.StateQuery, ) (*states.State, error) { - return &states.State{Resources: []intent.Resource{sa1}}, nil + return &states.State{Resources: []apiv1.Resource{sa1}}, nil }).Build() } @@ -96,7 +95,7 @@ func Test_preview(t *testing.T) { o := NewDestroyOptions() stateStorage := &local.FileSystemState{Path: filepath.Join(o.WorkDir, local.KusionStateFileFile)} - _, err := o.preview(&intent.Intent{Resources: []intent.Resource{sa1}}, p, s, stateStorage) + _, err := o.preview(&apiv1.Intent{Resources: []apiv1.Resource{sa1}}, p, s, stateStorage) assert.Nil(t, err) }) } @@ -145,7 +144,7 @@ func (f *fakerRuntime) Watch(ctx context.Context, request *runtime.WatchRequest) func mockOperationPreview() { mockey.Mock((*operation.PreviewOperation).Preview).To( - func(*operation.PreviewOperation, *operation.PreviewRequest) (rsp *operation.PreviewResponse, s status.Status) { + func(*operation.PreviewOperation, *operation.PreviewRequest) (rsp *operation.PreviewResponse, s v1.Status) { return &operation.PreviewResponse{ Order: &opsmodels.ChangeOrder{ StepKeys: []string{sa1.ID}, @@ -173,8 +172,8 @@ var ( sa2 = newSA("sa2") ) -func newSA(name string) intent.Resource { - return intent.Resource{ +func newSA(name string) apiv1.Resource { + return apiv1.Resource{ ID: engine.BuildID(apiVersion, kind, namespace, name), Type: "Kubernetes", Attributes: map[string]interface{}{ @@ -194,7 +193,7 @@ func Test_destroy(t *testing.T) { mockOperationDestroy(opsmodels.Success) o := NewDestroyOptions() - planResources := &intent.Intent{Resources: []intent.Resource{sa2}} + planResources := &apiv1.Intent{Resources: []apiv1.Resource{sa2}} order := &opsmodels.ChangeOrder{ StepKeys: []string{sa1.ID, sa2.ID}, ChangeSteps: map[string]*opsmodels.ChangeStep{ @@ -222,7 +221,7 @@ func Test_destroy(t *testing.T) { mockOperationDestroy(opsmodels.Failed) o := NewDestroyOptions() - planResources := &intent.Intent{Resources: []intent.Resource{sa1}} + planResources := &apiv1.Intent{Resources: []apiv1.Resource{sa1}} order := &opsmodels.ChangeOrder{ StepKeys: []string{sa1.ID}, ChangeSteps: map[string]*opsmodels.ChangeStep{ @@ -243,7 +242,7 @@ func Test_destroy(t *testing.T) { func mockOperationDestroy(res opsmodels.OpResult) { mockey.Mock((*operation.DestroyOperation).Destroy).To( - func(o *operation.DestroyOperation, request *operation.DestroyRequest) status.Status { + func(o *operation.DestroyOperation, request *operation.DestroyRequest) v1.Status { var err error if res == opsmodels.Failed { err = errors.New("mock error") @@ -263,7 +262,7 @@ func mockOperationDestroy(res opsmodels.OpResult) { } close(o.MsgCh) if res == opsmodels.Failed { - return status.NewErrorStatus(err) + return v1.NewErrorStatus(err) } return nil }).Build() diff --git a/pkg/cmd/preview/options.go b/pkg/cmd/preview/options.go index 2939648c..cb40d251 100644 --- a/pkg/cmd/preview/options.go +++ b/pkg/cmd/preview/options.go @@ -10,9 +10,8 @@ import ( "github.com/pkg/errors" - "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" - "kusionstack.io/kusion/pkg/apis/status" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" + v1 "kusionstack.io/kusion/pkg/apis/status/v1" "kusionstack.io/kusion/pkg/cmd/build" "kusionstack.io/kusion/pkg/cmd/build/builders" "kusionstack.io/kusion/pkg/engine/backend" @@ -136,7 +135,7 @@ func (o *Options) Run() error { } // Generate Intent - var sp *intent.Intent + var sp *apiv1.Intent if o.IntentFile != "" { sp, err = build.IntentFromFile(o.IntentFile) } else if o.Output == jsonOutput { @@ -228,9 +227,9 @@ func (o *Options) Run() error { func Preview( o *Options, storage states.StateStorage, - planResources *intent.Intent, - project *v1.Project, - stack *v1.Stack, + planResources *apiv1.Intent, + project *apiv1.Project, + stack *apiv1.Stack, ) (*opsmodels.Changes, error) { log.Info("Start compute preview changes ...") @@ -259,7 +258,7 @@ func Preview( Cluster: cluster, }, }) - if status.IsErr(s) { + if v1.IsErr(s) { return nil, fmt.Errorf("preview failed.\n%s", s.String()) } diff --git a/pkg/cmd/preview/options_test.go b/pkg/cmd/preview/options_test.go index 0522ef53..729b72d7 100644 --- a/pkg/cmd/preview/options_test.go +++ b/pkg/cmd/preview/options_test.go @@ -11,8 +11,7 @@ import ( "github.com/stretchr/testify/require" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" - "kusionstack.io/kusion/pkg/apis/status" + v1 "kusionstack.io/kusion/pkg/apis/status/v1" "kusionstack.io/kusion/pkg/cmd/build" "kusionstack.io/kusion/pkg/cmd/build/builders" "kusionstack.io/kusion/pkg/engine" @@ -48,7 +47,7 @@ func Test_preview(t *testing.T) { defer m.UnPatch() o := NewPreviewOptions() - _, err := Preview(o, stateStorage, &intent.Intent{Resources: []intent.Resource{sa1, sa2, sa3}}, p, s) + _, err := Preview(o, stateStorage, &apiv1.Intent{Resources: []apiv1.Resource{sa1, sa2, sa3}}, p, s) assert.Nil(t, err) }) } @@ -182,7 +181,7 @@ func mockOperationPreview() *mockey.Mocker { return mockey.Mock((*operation.PreviewOperation).Preview).To(func( *operation.PreviewOperation, *operation.PreviewRequest, - ) (rsp *operation.PreviewResponse, s status.Status) { + ) (rsp *operation.PreviewResponse, s v1.Status) { return &operation.PreviewResponse{ Order: &opsmodels.ChangeOrder{ StepKeys: []string{sa1.ID, sa2.ID, sa3.ID}, @@ -208,8 +207,8 @@ func mockOperationPreview() *mockey.Mocker { }).Build() } -func newSA(name string) intent.Resource { - return intent.Resource{ +func newSA(name string) apiv1.Resource { + return apiv1.Resource{ ID: engine.BuildID(apiVersion, kind, namespace, name), Type: "Kubernetes", Attributes: map[string]interface{}{ @@ -236,8 +235,8 @@ func mockBuildIntent() *mockey.Mocker { o *builders.Options, project *apiv1.Project, stack *apiv1.Stack, - ) (*intent.Intent, error) { - return &intent.Intent{Resources: []intent.Resource{sa1, sa2, sa3}}, nil + ) (*apiv1.Intent, error) { + return &apiv1.Intent{Resources: []apiv1.Resource{sa1, sa2, sa3}}, nil }).Build() } @@ -246,8 +245,8 @@ func mockPatchBuildIntentWithSpinner() *mockey.Mocker { o *builders.Options, project *apiv1.Project, stack *apiv1.Stack, - ) (*intent.Intent, error) { - return &intent.Intent{Resources: []intent.Resource{sa1, sa2, sa3}}, nil + ) (*apiv1.Intent, error) { + return &apiv1.Intent{Resources: []apiv1.Resource{sa1, sa2, sa3}}, nil }).Build() } diff --git a/pkg/engine/operation/apply.go b/pkg/engine/operation/apply.go index 10daea3a..1ea05038 100644 --- a/pkg/engine/operation/apply.go +++ b/pkg/engine/operation/apply.go @@ -5,8 +5,8 @@ import ( "fmt" "sync" - "kusionstack.io/kusion/pkg/apis/intent" - "kusionstack.io/kusion/pkg/apis/status" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" + v1 "kusionstack.io/kusion/pkg/apis/status/v1" "kusionstack.io/kusion/pkg/engine/operation/graph" opsmodels "kusionstack.io/kusion/pkg/engine/operation/models" "kusionstack.io/kusion/pkg/engine/operation/parser" @@ -29,18 +29,18 @@ type ApplyResponse struct { State *states.State } -func NewApplyGraph(m *intent.Intent, priorState *states.State) (*dag.AcyclicGraph, status.Status) { +func NewApplyGraph(m *apiv1.Intent, priorState *states.State) (*dag.AcyclicGraph, v1.Status) { intentParser := parser.NewIntentParser(m) g := &dag.AcyclicGraph{} g.Add(&graph.RootNode{}) s := intentParser.Parse(g) - if status.IsErr(s) { + if v1.IsErr(s) { return nil, s } deleteResourceParser := parser.NewDeleteResourceParser(priorState.Resources) s = deleteResourceParser.Parse(g) - if status.IsErr(s) { + if v1.IsErr(s) { return nil, s } @@ -52,7 +52,7 @@ func NewApplyGraph(m *intent.Intent, priorState *states.State) (*dag.AcyclicGrap // 1. parse resources and their relationship to build a DAG and should take care of those resources that will be deleted // 2. walk this DAG and execute all graph nodes concurrently, besides the entire process should follow dependencies in this DAG // 3. during the execution of each node, it will invoke different runtime according to the resource type -func (ao *ApplyOperation) Apply(request *ApplyRequest) (rsp *ApplyResponse, st status.Status) { +func (ao *ApplyOperation) Apply(request *ApplyRequest) (rsp *ApplyResponse, st v1.Status) { log.Infof("engine: Apply start!") o := ao.Operation @@ -64,16 +64,16 @@ func (ao *ApplyOperation) Apply(request *ApplyRequest) (rsp *ApplyResponse, st s switch x := e.(type) { case string: - st = status.NewErrorStatus(fmt.Errorf("apply panic:%s", e)) + st = v1.NewErrorStatus(fmt.Errorf("apply panic:%s", e)) case error: - st = status.NewErrorStatus(x) + st = v1.NewErrorStatus(x) default: - st = status.NewErrorStatusWithCode(status.Unknown, errors.New("unknown panic")) + st = v1.NewErrorStatusWithCode(v1.Unknown, errors.New("unknown panic")) } } }() - if st = validateRequest(&request.Request); status.IsErr(st) { + if st = validateRequest(&request.Request); v1.IsErr(st) { return nil, st } @@ -81,7 +81,7 @@ func (ao *ApplyOperation) Apply(request *ApplyRequest) (rsp *ApplyResponse, st s priorState, resultState := o.InitStates(&request.Request) priorStateResourceIndex := priorState.Resources.Index() // copy priorStateResourceIndex into a new map - stateResourceIndex := map[string]*intent.Resource{} + stateResourceIndex := map[string]*apiv1.Resource{} for k, v := range priorStateResourceIndex { stateResourceIndex[k] = v } @@ -89,14 +89,14 @@ func (ao *ApplyOperation) Apply(request *ApplyRequest) (rsp *ApplyResponse, st s resources := request.Intent.Resources resources = append(resources, priorState.Resources...) runtimesMap, s := runtimeinit.Runtimes(resources) - if status.IsErr(s) { + if v1.IsErr(s) { return nil, s } o.RuntimeMap = runtimesMap // 2. build & walk DAG applyGraph, s := NewApplyGraph(request.Intent, priorState) - if status.IsErr(s) { + if v1.IsErr(s) { return nil, s } log.Infof("Apply Graph:\n%s", applyGraph.String()) @@ -105,7 +105,7 @@ func (ao *ApplyOperation) Apply(request *ApplyRequest) (rsp *ApplyResponse, st s Operation: opsmodels.Operation{ OperationType: opsmodels.Apply, StateStorage: o.StateStorage, - CtxResourceIndex: map[string]*intent.Resource{}, + CtxResourceIndex: map[string]*apiv1.Resource{}, PriorStateResourceIndex: priorStateResourceIndex, StateResourceIndex: stateResourceIndex, RuntimeMap: o.RuntimeMap, @@ -121,7 +121,7 @@ func (ao *ApplyOperation) Apply(request *ApplyRequest) (rsp *ApplyResponse, st s w.Update(applyGraph) // Wait if diags := w.Wait(); diags.HasErrors() { - st = status.NewErrorStatus(diags.Err()) + st = v1.NewErrorStatus(diags.Err()) return nil, st } @@ -129,7 +129,7 @@ func (ao *ApplyOperation) Apply(request *ApplyRequest) (rsp *ApplyResponse, st s } func (ao *ApplyOperation) applyWalkFun(v dag.Vertex) (diags tfdiags.Diagnostics) { - var s status.Status + var s v1.Status if v == nil { return nil } @@ -140,7 +140,7 @@ func (ao *ApplyOperation) applyWalkFun(v dag.Vertex) (diags tfdiags.Diagnostics) o.MsgCh <- opsmodels.Message{ResourceID: rn.Hashcode().(string)} s = node.Execute(o) - if status.IsErr(s) { + if v1.IsErr(s) { o.MsgCh <- opsmodels.Message{ ResourceID: rn.Hashcode().(string), OpResult: opsmodels.Failed, OpErr: fmt.Errorf("node execte failed, status:\n%v", s), @@ -158,14 +158,14 @@ func (ao *ApplyOperation) applyWalkFun(v dag.Vertex) (diags tfdiags.Diagnostics) return diags } -func validateRequest(request *opsmodels.Request) status.Status { - var s status.Status +func validateRequest(request *opsmodels.Request) v1.Status { + var s v1.Status if request == nil { - return status.NewErrorStatusWithMsg(status.InvalidArgument, "request is nil") + return v1.NewErrorStatusWithMsg(v1.InvalidArgument, "request is nil") } if request.Intent == nil { - return status.NewErrorStatusWithMsg(status.InvalidArgument, + return v1.NewErrorStatusWithMsg(v1.InvalidArgument, "request.Intent is empty. If you want to delete all resources, please use command 'destroy'") } resourceKeyMap := make(map[string]bool) @@ -173,7 +173,7 @@ func validateRequest(request *opsmodels.Request) status.Status { for _, resource := range request.Intent.Resources { key := resource.ResourceKey() if _, ok := resourceKeyMap[key]; ok { - return status.NewErrorStatusWithMsg(status.InvalidArgument, fmt.Sprintf("Duplicate resource:%s in request.", key)) + return v1.NewErrorStatusWithMsg(v1.InvalidArgument, fmt.Sprintf("Duplicate resource:%s in request.", key)) } resourceKeyMap[key] = true } diff --git a/pkg/engine/operation/apply_test.go b/pkg/engine/operation/apply_test.go index ee215896..486d9bb9 100644 --- a/pkg/engine/operation/apply_test.go +++ b/pkg/engine/operation/apply_test.go @@ -11,8 +11,7 @@ import ( "github.com/stretchr/testify/assert" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" - "kusionstack.io/kusion/pkg/apis/status" + v1 "kusionstack.io/kusion/pkg/apis/status/v1" "kusionstack.io/kusion/pkg/engine/operation/graph" opsmodels "kusionstack.io/kusion/pkg/engine/operation/models" "kusionstack.io/kusion/pkg/engine/runtime" @@ -29,21 +28,21 @@ func Test_validateRequest(t *testing.T) { tests := []struct { name string args args - want status.Status + want v1.Status }{ { name: "t1", args: args{ request: &opsmodels.Request{}, }, - want: status.NewErrorStatusWithMsg(status.InvalidArgument, + want: v1.NewErrorStatusWithMsg(v1.InvalidArgument, "request.Intent is empty. If you want to delete all resources, please use command 'destroy'"), }, { name: "t2", args: args{ request: &opsmodels.Request{ - Intent: &intent.Intent{Resources: []intent.Resource{}}, + Intent: &apiv1.Intent{Resources: []apiv1.Resource{}}, }, }, want: nil, @@ -62,11 +61,11 @@ func TestOperation_Apply(t *testing.T) { type fields struct { OperationType opsmodels.OperationType StateStorage states.StateStorage - CtxResourceIndex map[string]*intent.Resource - PriorStateResourceIndex map[string]*intent.Resource - StateResourceIndex map[string]*intent.Resource + CtxResourceIndex map[string]*apiv1.Resource + PriorStateResourceIndex map[string]*apiv1.Resource + StateResourceIndex map[string]*apiv1.Resource Order *opsmodels.ChangeOrder - RuntimeMap map[intent.Type]runtime.Runtime + RuntimeMap map[apiv1.Type]runtime.Runtime Stack *apiv1.Stack MsgCh chan opsmodels.Message resultState *states.State @@ -77,7 +76,7 @@ func TestOperation_Apply(t *testing.T) { } const Jack = "jack" - mf := &intent.Intent{Resources: []intent.Resource{ + mf := &apiv1.Intent{Resources: []apiv1.Resource{ { ID: Jack, Type: runtime.Kubernetes, @@ -97,7 +96,7 @@ func TestOperation_Apply(t *testing.T) { KusionVersion: "", Serial: 1, Operator: "faker", - Resources: []intent.Resource{ + Resources: []apiv1.Resource{ { ID: Jack, Type: runtime.Kubernetes, @@ -124,14 +123,14 @@ func TestOperation_Apply(t *testing.T) { fields fields args args wantRsp *ApplyResponse - wantSt status.Status + wantSt v1.Status }{ { name: "apply test", fields: fields{ OperationType: opsmodels.Apply, StateStorage: &local.FileSystemState{Path: filepath.Join("test_data", local.KusionStateFileFile)}, - RuntimeMap: map[intent.Type]runtime.Runtime{runtime.Kubernetes: &kubernetes.KubernetesRuntime{}}, + RuntimeMap: map[apiv1.Type]runtime.Runtime{runtime.Kubernetes: &kubernetes.KubernetesRuntime{}}, MsgCh: make(chan opsmodels.Message, 5), }, args: args{applyRequest: &ApplyRequest{opsmodels.Request{ @@ -165,14 +164,14 @@ func TestOperation_Apply(t *testing.T) { Operation: *o, } - mockey.Mock((*graph.ResourceNode).Execute).To(func(rn *graph.ResourceNode, operation *opsmodels.Operation) status.Status { + mockey.Mock((*graph.ResourceNode).Execute).To(func(rn *graph.ResourceNode, operation *opsmodels.Operation) v1.Status { o.ResultState = rs return nil }).Build() mockey.Mock(runtimeinit.Runtimes).To(func( - resources intent.Resources, - ) (map[intent.Type]runtime.Runtime, status.Status) { - return map[intent.Type]runtime.Runtime{runtime.Kubernetes: &kubernetes.KubernetesRuntime{}}, nil + resources apiv1.Resources, + ) (map[apiv1.Type]runtime.Runtime, v1.Status) { + return map[apiv1.Type]runtime.Runtime{runtime.Kubernetes: &kubernetes.KubernetesRuntime{}}, nil }).Build() gotRsp, gotSt := ao.Apply(tt.args.applyRequest) diff --git a/pkg/engine/operation/destory.go b/pkg/engine/operation/destory.go index 0e654250..e4296a27 100644 --- a/pkg/engine/operation/destory.go +++ b/pkg/engine/operation/destory.go @@ -3,8 +3,8 @@ package operation import ( "sync" - "kusionstack.io/kusion/pkg/apis/intent" - "kusionstack.io/kusion/pkg/apis/status" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" + v1 "kusionstack.io/kusion/pkg/apis/status/v1" "kusionstack.io/kusion/pkg/engine/operation/graph" opsmodels "kusionstack.io/kusion/pkg/engine/operation/models" "kusionstack.io/kusion/pkg/engine/operation/parser" @@ -21,12 +21,12 @@ type DestroyRequest struct { opsmodels.Request `json:",inline" yaml:",inline"` } -func NewDestroyGraph(resource intent.Resources) (*dag.AcyclicGraph, status.Status) { +func NewDestroyGraph(resource apiv1.Resources) (*dag.AcyclicGraph, v1.Status) { ag := &dag.AcyclicGraph{} ag.Add(&graph.RootNode{}) deleteResourceParser := parser.NewDeleteResourceParser(resource) s := deleteResourceParser.Parse(ag) - if status.IsErr(s) { + if v1.IsErr(s) { return nil, s } @@ -35,11 +35,11 @@ func NewDestroyGraph(resource intent.Resources) (*dag.AcyclicGraph, status.Statu // Destroy will delete all resources in this request. The whole process is similar to the operation Apply, // but every node's execution is deleting the resource. -func (do *DestroyOperation) Destroy(request *DestroyRequest) (st status.Status) { +func (do *DestroyOperation) Destroy(request *DestroyRequest) (st v1.Status) { o := do.Operation defer close(o.MsgCh) - if st = validateRequest(&request.Request); status.IsErr(st) { + if st = validateRequest(&request.Request); v1.IsErr(st) { return st } @@ -47,7 +47,7 @@ func (do *DestroyOperation) Destroy(request *DestroyRequest) (st status.Status) priorState, resultState := o.InitStates(&request.Request) priorStateResourceIndex := priorState.Resources.Index() // copy priorStateResourceIndex into a new map - stateResourceIndex := map[string]*intent.Resource{} + stateResourceIndex := map[string]*apiv1.Resource{} for k, v := range priorStateResourceIndex { stateResourceIndex[k] = v } @@ -55,14 +55,14 @@ func (do *DestroyOperation) Destroy(request *DestroyRequest) (st status.Status) // only destroy resources we have recorded resources := priorState.Resources runtimesMap, s := runtimeinit.Runtimes(resources) - if status.IsErr(s) { + if v1.IsErr(s) { return s } o.RuntimeMap = runtimesMap // 2. build & walk DAG destroyGraph, s := NewDestroyGraph(resources) - if status.IsErr(s) { + if v1.IsErr(s) { return s } @@ -70,7 +70,7 @@ func (do *DestroyOperation) Destroy(request *DestroyRequest) (st status.Status) Operation: opsmodels.Operation{ OperationType: opsmodels.Destroy, StateStorage: o.StateStorage, - CtxResourceIndex: map[string]*intent.Resource{}, + CtxResourceIndex: map[string]*apiv1.Resource{}, PriorStateResourceIndex: priorStateResourceIndex, StateResourceIndex: stateResourceIndex, RuntimeMap: o.RuntimeMap, @@ -85,7 +85,7 @@ func (do *DestroyOperation) Destroy(request *DestroyRequest) (st status.Status) w.Update(destroyGraph) // Wait if diags := w.Wait(); diags.HasErrors() { - st = status.NewErrorStatus(diags.Err()) + st = v1.NewErrorStatus(diags.Err()) return st } return nil diff --git a/pkg/engine/operation/destory_test.go b/pkg/engine/operation/destory_test.go index 864b4608..45f0f2c0 100644 --- a/pkg/engine/operation/destory_test.go +++ b/pkg/engine/operation/destory_test.go @@ -11,8 +11,7 @@ import ( "github.com/stretchr/testify/assert" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" - "kusionstack.io/kusion/pkg/apis/status" + v1 "kusionstack.io/kusion/pkg/apis/status/v1" "kusionstack.io/kusion/pkg/engine/operation/graph" opsmodels "kusionstack.io/kusion/pkg/engine/operation/models" "kusionstack.io/kusion/pkg/engine/runtime" @@ -37,7 +36,7 @@ func TestOperation_Destroy(t *testing.T) { Stacks: []*apiv1.Stack{s}, } - resourceState := intent.Resource{ + resourceState := apiv1.Resource{ ID: "id1", Type: runtime.Kubernetes, Attributes: map[string]interface{}{ @@ -45,12 +44,12 @@ func TestOperation_Destroy(t *testing.T) { }, DependsOn: nil, } - mf := &intent.Intent{Resources: []intent.Resource{resourceState}} + mf := &apiv1.Intent{Resources: []apiv1.Resource{resourceState}} o := &DestroyOperation{ opsmodels.Operation{ OperationType: opsmodels.Destroy, StateStorage: &local.FileSystemState{Path: filepath.Join("test_data", local.KusionStateFileFile)}, - RuntimeMap: map[intent.Type]runtime.Runtime{runtime.Kubernetes: &kubernetes.KubernetesRuntime{}}, + RuntimeMap: map[apiv1.Type]runtime.Runtime{runtime.Kubernetes: &kubernetes.KubernetesRuntime{}}, }, } r := &DestroyRequest{ @@ -64,14 +63,14 @@ func TestOperation_Destroy(t *testing.T) { } mockey.PatchConvey("destroy success", t, func() { - mockey.Mock((*graph.ResourceNode).Execute).To(func(rn *graph.ResourceNode, operation *opsmodels.Operation) status.Status { + mockey.Mock((*graph.ResourceNode).Execute).To(func(rn *graph.ResourceNode, operation *opsmodels.Operation) v1.Status { return nil }).Build() mockey.Mock(mockey.GetMethod(local.NewFileSystemState(), "GetLatestState")).To(func( f *local.FileSystemState, query *states.StateQuery, ) (*states.State, error) { - return &states.State{Resources: []intent.Resource{resourceState}}, nil + return &states.State{Resources: []apiv1.Resource{resourceState}}, nil }).Build() mockey.Mock(kubernetes.NewKubernetesRuntime).To(func() (runtime.Runtime, error) { return &fakerRuntime{}, nil @@ -84,14 +83,14 @@ func TestOperation_Destroy(t *testing.T) { }) mockey.PatchConvey("destroy failed", t, func() { - mockey.Mock((*graph.ResourceNode).Execute).To(func(rn *graph.ResourceNode, operation *opsmodels.Operation) status.Status { - return status.NewErrorStatus(errors.New("mock error")) + mockey.Mock((*graph.ResourceNode).Execute).To(func(rn *graph.ResourceNode, operation *opsmodels.Operation) v1.Status { + return v1.NewErrorStatus(errors.New("mock error")) }).Build() mockey.Mock(mockey.GetMethod(local.NewFileSystemState(), "GetLatestState")).To(func( f *local.FileSystemState, query *states.StateQuery, ) (*states.State, error) { - return &states.State{Resources: []intent.Resource{resourceState}}, nil + return &states.State{Resources: []apiv1.Resource{resourceState}}, nil }).Build() mockey.Mock(kubernetes.NewKubernetesRuntime).To(func() (runtime.Runtime, error) { return &fakerRuntime{}, nil @@ -100,7 +99,7 @@ func TestOperation_Destroy(t *testing.T) { o.MsgCh = make(chan opsmodels.Message, 1) go readMsgCh(o.MsgCh) st := o.Destroy(r) - assert.True(t, status.IsErr(st)) + assert.True(t, v1.IsErr(st)) }) } diff --git a/pkg/engine/operation/diff.go b/pkg/engine/operation/diff.go index 4d73b235..3f04897f 100644 --- a/pkg/engine/operation/diff.go +++ b/pkg/engine/operation/diff.go @@ -3,7 +3,7 @@ package operation import ( "github.com/pkg/errors" - "kusionstack.io/kusion/pkg/apis/intent" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" opsmodels "kusionstack.io/kusion/pkg/engine/operation/models" "kusionstack.io/kusion/pkg/engine/states" "kusionstack.io/kusion/pkg/log" @@ -54,7 +54,7 @@ func (d *Diff) Diff(request *DiffRequest) (string, error) { return DiffWithRequestResourceAndState(plan, latestState) } -func DiffWithRequestResourceAndState(plan *intent.Intent, latest *states.State) (string, error) { +func DiffWithRequestResourceAndState(plan *apiv1.Intent, latest *states.State) (string, error) { planString := jsonutil.MustMarshal2String(plan.Resources) var report *dyff.Report var err error diff --git a/pkg/engine/operation/graph/executable_node.go b/pkg/engine/operation/graph/executable_node.go index d040940f..cc5f2e43 100644 --- a/pkg/engine/operation/graph/executable_node.go +++ b/pkg/engine/operation/graph/executable_node.go @@ -1,10 +1,10 @@ package graph import ( - "kusionstack.io/kusion/pkg/apis/status" + v1 "kusionstack.io/kusion/pkg/apis/status/v1" opsmodels "kusionstack.io/kusion/pkg/engine/operation/models" ) type ExecutableNode interface { - Execute(operation *opsmodels.Operation) status.Status + Execute(operation *opsmodels.Operation) v1.Status } diff --git a/pkg/engine/operation/graph/node.go b/pkg/engine/operation/graph/node.go index 092b80d8..6fcea280 100644 --- a/pkg/engine/operation/graph/node.go +++ b/pkg/engine/operation/graph/node.go @@ -1,16 +1,14 @@ package graph -import ( - "kusionstack.io/kusion/pkg/apis/status" -) +import v1 "kusionstack.io/kusion/pkg/apis/status/v1" type baseNode struct { ID string } -func NewBaseNode(id string) (*baseNode, status.Status) { +func NewBaseNode(id string) (*baseNode, v1.Status) { if id == "" { - return nil, status.NewErrorStatusWithMsg(status.InvalidArgument, "node id can not be nil") + return nil, v1.NewErrorStatusWithMsg(v1.InvalidArgument, "node id can not be nil") } return &baseNode{ID: id}, nil } diff --git a/pkg/engine/operation/graph/resource_node.go b/pkg/engine/operation/graph/resource_node.go index 4bcbdb64..63cabeaa 100644 --- a/pkg/engine/operation/graph/resource_node.go +++ b/pkg/engine/operation/graph/resource_node.go @@ -7,8 +7,8 @@ import ( "reflect" "strings" - "kusionstack.io/kusion/pkg/apis/intent" - "kusionstack.io/kusion/pkg/apis/status" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" + v1 "kusionstack.io/kusion/pkg/apis/status/v1" opsmodels "kusionstack.io/kusion/pkg/engine/operation/models" "kusionstack.io/kusion/pkg/engine/runtime" "kusionstack.io/kusion/pkg/log" @@ -20,7 +20,7 @@ import ( type ResourceNode struct { *baseNode Action opsmodels.ActionType - resource *intent.Resource + resource *apiv1.Resource } var _ ExecutableNode = (*ResourceNode)(nil) @@ -29,10 +29,10 @@ const ( ImplicitRefPrefix = "$kusion_path." ) -func (rn *ResourceNode) PreExecute(o *opsmodels.Operation) status.Status { +func (rn *ResourceNode) PreExecute(o *opsmodels.Operation) v1.Status { value := reflect.ValueOf(rn.resource.Attributes) var replaced reflect.Value - var s status.Status + var s v1.Status switch o.OperationType { case opsmodels.ApplyPreview: @@ -48,7 +48,7 @@ func (rn *ResourceNode) PreExecute(o *opsmodels.Operation) status.Status { default: return nil } - if status.IsErr(s) { + if v1.IsErr(s) { return s } if !replaced.IsZero() { @@ -57,7 +57,7 @@ func (rn *ResourceNode) PreExecute(o *opsmodels.Operation) status.Status { return nil } -func (rn *ResourceNode) Execute(operation *opsmodels.Operation) (s status.Status) { +func (rn *ResourceNode) Execute(operation *opsmodels.Operation) (s v1.Status) { log.Debugf("executing resource node:%s", rn.ID) defer func() { @@ -75,23 +75,23 @@ func (rn *ResourceNode) Execute(operation *opsmodels.Operation) (s status.Status default: err = errors.New("unknown panic") } - s = status.NewErrorStatus(err) + s = v1.NewErrorStatus(err) } }() - if s = rn.PreExecute(operation); status.IsErr(s) { + if s = rn.PreExecute(operation); v1.IsErr(s) { return s } // init 3-way diff data planedResource, priorResource, liveResource, s := rn.initThreeWayDiffData(operation) - if status.IsErr(s) { + if v1.IsErr(s) { return s } // compute action type dryRunResource, s := rn.computeActionType(operation, planedResource, priorResource, liveResource) - if status.IsErr(s) { + if v1.IsErr(s) { return s } @@ -101,15 +101,15 @@ func (rn *ResourceNode) Execute(operation *opsmodels.Operation) (s status.Status key := rn.resource.ResourceKey() // refresh resource index in operation to make sure other resource node can get the latest index if e := operation.RefreshResourceIndex(key, dryRunResource, rn.Action); e != nil { - return status.NewErrorStatus(e) + return v1.NewErrorStatus(e) } updateChangeOrder(operation, rn, liveResource, dryRunResource) case opsmodels.Apply, opsmodels.Destroy: - if s = rn.applyResource(operation, priorResource, planedResource, liveResource); status.IsErr(s) { + if s = rn.applyResource(operation, priorResource, planedResource, liveResource); v1.IsErr(s) { return s } default: - return status.NewErrorStatus(fmt.Errorf("unknown operation: %v", operation.OperationType)) + return v1.NewErrorStatus(fmt.Errorf("unknown operation: %v", operation.OperationType)) } return nil @@ -119,10 +119,10 @@ func (rn *ResourceNode) Execute(operation *opsmodels.Operation) (s status.Status // dryRunResource is a middle result during the process of computing ActionType. We will use it to perform live diff latter func (rn *ResourceNode) computeActionType( operation *opsmodels.Operation, - planedResource *intent.Resource, - priorResource *intent.Resource, - liveResource *intent.Resource, -) (*intent.Resource, status.Status) { + planedResource *apiv1.Resource, + priorResource *apiv1.Resource, + liveResource *apiv1.Resource, +) (*apiv1.Resource, v1.Status) { dryRunResource := planedResource switch operation.OperationType { case opsmodels.Destroy, opsmodels.DestroyPreview: @@ -140,7 +140,7 @@ func (rn *ResourceNode) computeActionType( Stack: operation.Stack, DryRun: true, }) - if status.IsErr(dryRunResp.Status) { + if v1.IsErr(dryRunResp.Status) { return nil, dryRunResp.Status } dryRunResource = dryRunResp.Resource @@ -152,7 +152,7 @@ func (rn *ResourceNode) computeActionType( } report, err := diff.ToReport(liveResource, dryRunResource) if err != nil { - return nil, status.NewErrorStatus(err) + return nil, v1.NewErrorStatus(err) } if len(report.Diffs) == 0 { rn.Action = opsmodels.UnChanged @@ -161,12 +161,12 @@ func (rn *ResourceNode) computeActionType( } } default: - return nil, status.NewErrorStatus(fmt.Errorf("unknown operation: %v", operation.OperationType)) + return nil, v1.NewErrorStatus(fmt.Errorf("unknown operation: %v", operation.OperationType)) } return dryRunResource, nil } -func (rn *ResourceNode) initThreeWayDiffData(operation *opsmodels.Operation) (*intent.Resource, *intent.Resource, *intent.Resource, status.Status) { +func (rn *ResourceNode) initThreeWayDiffData(operation *opsmodels.Operation) (*apiv1.Resource, *apiv1.Resource, *apiv1.Resource, v1.Status) { // 1. prepare planed resource that we want to execute planedResource := rn.resource // When a resource is deleted in Intent but exists in PriorState, @@ -189,7 +189,7 @@ func (rn *ResourceNode) initThreeWayDiffData(operation *opsmodels.Operation) (*i response := operation.RuntimeMap[resourceType].Read(context.Background(), readRequest) liveResource := response.Resource s := response.Status - if status.IsErr(s) { + if v1.IsErr(s) { return nil, nil, nil, s } return planedResource, priorResource, liveResource, nil @@ -214,12 +214,12 @@ func removeNestedField(obj interface{}, fields ...string) { } } -func (rn *ResourceNode) applyResource(operation *opsmodels.Operation, prior, planed, live *intent.Resource) status.Status { +func (rn *ResourceNode) applyResource(operation *opsmodels.Operation, prior, planed, live *apiv1.Resource) v1.Status { log.Infof("operation:%v, prior:%v, plan:%v, live:%v", rn.Action, jsonutil.Marshal2String(prior), jsonutil.Marshal2String(planed), jsonutil.Marshal2String(live)) - var res *intent.Resource - var s status.Status + var res *apiv1.Resource + var s v1.Status resourceType := rn.resource.Type rt := operation.RuntimeMap[resourceType] @@ -247,16 +247,16 @@ func (rn *ResourceNode) applyResource(operation *opsmodels.Operation, prior, pla res = prior } } - if status.IsErr(s) { + if v1.IsErr(s) { return s } key := rn.resource.ResourceKey() if e := operation.RefreshResourceIndex(key, res, rn.Action); e != nil { - return status.NewErrorStatus(e) + return v1.NewErrorStatus(e) } if e := operation.UpdateState(operation.StateResourceIndex); e != nil { - return status.NewErrorStatus(e) + return v1.NewErrorStatus(e) } // print apply resource success msg @@ -264,13 +264,13 @@ func (rn *ResourceNode) applyResource(operation *opsmodels.Operation, prior, pla return nil } -func (rn *ResourceNode) State() *intent.Resource { +func (rn *ResourceNode) State() *apiv1.Resource { return rn.resource } -func NewResourceNode(key string, state *intent.Resource, action opsmodels.ActionType) (*ResourceNode, status.Status) { +func NewResourceNode(key string, state *apiv1.Resource, action opsmodels.ActionType) (*ResourceNode, v1.Status) { node, s := NewBaseNode(key) - if status.IsErr(s) { + if v1.IsErr(s) { return nil, s } return &ResourceNode{baseNode: node, Action: action, resource: state}, nil @@ -295,36 +295,36 @@ func updateChangeOrder(ops *opsmodels.Operation, rn *ResourceNode, plan, live in order.ChangeSteps[rn.ID] = opsmodels.NewChangeStep(rn.ID, rn.Action, plan, live) } -func ReplaceSecretRef(v reflect.Value) ([]string, reflect.Value, status.Status) { +func ReplaceSecretRef(v reflect.Value) ([]string, reflect.Value, v1.Status) { return ReplaceRef(v, nil, nil) } -var MustImplicitReplaceFun = func(resourceIndex map[string]*intent.Resource, refPath string) (reflect.Value, status.Status) { +var MustImplicitReplaceFun = func(resourceIndex map[string]*apiv1.Resource, refPath string) (reflect.Value, v1.Status) { return implicitReplaceFun(true, resourceIndex, refPath) } -var OptionalImplicitReplaceFun = func(resourceIndex map[string]*intent.Resource, refPath string) (reflect.Value, status.Status) { +var OptionalImplicitReplaceFun = func(resourceIndex map[string]*apiv1.Resource, refPath string) (reflect.Value, v1.Status) { return implicitReplaceFun(false, resourceIndex, refPath) } // implicitReplaceFun will replace implicit dependency references. If force is true, this function will return an error when replace references failed var implicitReplaceFun = func( force bool, - resourceIndex map[string]*intent.Resource, + resourceIndex map[string]*apiv1.Resource, refPath string, -) (reflect.Value, status.Status) { +) (reflect.Value, v1.Status) { const Sep = "." split := strings.Split(refPath, Sep) key := split[0] priorState := resourceIndex[key] if priorState == nil { msg := fmt.Sprintf("can't find resource by key:%s when replacing %s", key, refPath) - return reflect.Value{}, status.NewErrorStatusWithMsg(status.IllegalManifest, msg) + return reflect.Value{}, v1.NewErrorStatusWithMsg(v1.IllegalManifest, msg) } attributes := priorState.Attributes if attributes == nil { msg := fmt.Sprintf("attributes is nil in resource:%s", key) - return reflect.Value{}, status.NewErrorStatusWithMsg(status.IllegalManifest, msg) + return reflect.Value{}, v1.NewErrorStatusWithMsg(v1.IllegalManifest, msg) } var valueMap interface{} valueMap = attributes @@ -335,7 +335,7 @@ var implicitReplaceFun = func( if force { // only throw errors when force replacing operations like apply msg := fmt.Sprintf("can't find specified value in resource:%s by ref:%s", key, refPath) - return reflect.Value{}, status.NewErrorStatusWithMsg(status.IllegalManifest, msg) + return reflect.Value{}, v1.NewErrorStatusWithMsg(v1.IllegalManifest, msg) } else { break } @@ -348,20 +348,20 @@ var implicitReplaceFun = func( func ReplaceImplicitRef( v reflect.Value, - resourceIndex map[string]*intent.Resource, - replaceFun func(map[string]*intent.Resource, string) (reflect.Value, status.Status), -) ([]string, reflect.Value, status.Status) { + resourceIndex map[string]*apiv1.Resource, + replaceFun func(map[string]*apiv1.Resource, string) (reflect.Value, v1.Status), +) ([]string, reflect.Value, v1.Status) { return ReplaceRef(v, resourceIndex, replaceFun) } func ReplaceRef( v reflect.Value, - resourceIndex map[string]*intent.Resource, - repImplDepFunc func(map[string]*intent.Resource, string) (reflect.Value, status.Status), -) ([]string, reflect.Value, status.Status) { + resourceIndex map[string]*apiv1.Resource, + repImplDepFunc func(map[string]*apiv1.Resource, string) (reflect.Value, v1.Status), +) ([]string, reflect.Value, v1.Status) { var result []string if !v.IsValid() { - return nil, v, status.NewErrorStatusWithMsg(status.InvalidArgument, "invalid implicit reference") + return nil, v, v1.NewErrorStatusWithMsg(v1.InvalidArgument, "invalid implicit reference") } switch v.Type().Kind() { @@ -382,7 +382,7 @@ func ReplaceRef( log.Infof("add implicit ref:%s", split[0]) // replace ref with actual value tv, s := repImplDepFunc(resourceIndex, ref) - if status.IsErr(s) { + if v1.IsErr(s) { return nil, v, s } v = tv @@ -397,7 +397,7 @@ func ReplaceRef( for i := 0; i < v.Len(); i++ { ref, tv, s := ReplaceRef(v.Index(i), resourceIndex, repImplDepFunc) - if status.IsErr(s) { + if v1.IsErr(s) { return nil, tv, s } vs = reflect.Append(vs, tv) @@ -415,7 +415,7 @@ func ReplaceRef( iter := v.MapRange() for iter.Next() { ref, tv, s := ReplaceRef(iter.Value(), resourceIndex, repImplDepFunc) - if status.IsErr(s) { + if v1.IsErr(s) { return nil, tv, s } if ref != nil { diff --git a/pkg/engine/operation/graph/resource_node_test.go b/pkg/engine/operation/graph/resource_node_test.go index b63929ad..52104a26 100644 --- a/pkg/engine/operation/graph/resource_node_test.go +++ b/pkg/engine/operation/graph/resource_node_test.go @@ -8,8 +8,8 @@ import ( "github.com/bytedance/mockey" "github.com/stretchr/testify/assert" - "kusionstack.io/kusion/pkg/apis/intent" - "kusionstack.io/kusion/pkg/apis/status" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" + v1 "kusionstack.io/kusion/pkg/apis/status/v1" opsmodels "kusionstack.io/kusion/pkg/engine/operation/models" "kusionstack.io/kusion/pkg/engine/runtime" "kusionstack.io/kusion/pkg/engine/runtime/kubernetes" @@ -22,7 +22,7 @@ func TestResourceNode_Execute(t *testing.T) { type fields struct { BaseNode baseNode Action opsmodels.ActionType - state *intent.Resource + state *apiv1.Resource } type args struct { operation opsmodels.Operation @@ -31,7 +31,7 @@ func TestResourceNode_Execute(t *testing.T) { const Jack = "jack" const Pony = "pony" const Eric = "eric" - mf := &intent.Intent{Resources: []intent.Resource{ + mf := &apiv1.Intent{Resources: []apiv1.Resource{ { ID: Pony, Type: runtime.Kubernetes, @@ -60,12 +60,12 @@ func TestResourceNode_Execute(t *testing.T) { }, }} - priorStateResourceIndex := map[string]*intent.Resource{} + priorStateResourceIndex := map[string]*apiv1.Resource{} for i, resource := range mf.Resources { priorStateResourceIndex[resource.ResourceKey()] = &mf.Resources[i] } - newResourceState := &intent.Resource{ + newResourceState := &apiv1.Resource{ ID: Eric, Type: runtime.Kubernetes, Attributes: map[string]interface{}{ @@ -74,7 +74,7 @@ func TestResourceNode_Execute(t *testing.T) { DependsOn: []string{Pony}, } - illegalResourceState := &intent.Resource{ + illegalResourceState := &apiv1.Resource{ ID: Eric, Type: runtime.Kubernetes, Attributes: map[string]interface{}{ @@ -90,7 +90,7 @@ func TestResourceNode_Execute(t *testing.T) { name string fields fields args args - want status.Status + want v1.Status }{ { name: "update", @@ -109,7 +109,7 @@ func TestResourceNode_Execute(t *testing.T) { MsgCh: make(chan opsmodels.Message), ResultState: states.NewState(), Lock: &sync.Mutex{}, - RuntimeMap: map[intent.Type]runtime.Runtime{runtime.Kubernetes: &kubernetes.KubernetesRuntime{}}, + RuntimeMap: map[apiv1.Type]runtime.Runtime{runtime.Kubernetes: &kubernetes.KubernetesRuntime{}}, }}, want: nil, }, @@ -129,7 +129,7 @@ func TestResourceNode_Execute(t *testing.T) { MsgCh: make(chan opsmodels.Message), ResultState: states.NewState(), Lock: &sync.Mutex{}, - RuntimeMap: map[intent.Type]runtime.Runtime{runtime.Kubernetes: &kubernetes.KubernetesRuntime{}}, + RuntimeMap: map[apiv1.Type]runtime.Runtime{runtime.Kubernetes: &kubernetes.KubernetesRuntime{}}, }}, want: nil, }, @@ -149,9 +149,9 @@ func TestResourceNode_Execute(t *testing.T) { MsgCh: make(chan opsmodels.Message), ResultState: states.NewState(), Lock: &sync.Mutex{}, - RuntimeMap: map[intent.Type]runtime.Runtime{runtime.Kubernetes: &kubernetes.KubernetesRuntime{}}, + RuntimeMap: map[apiv1.Type]runtime.Runtime{runtime.Kubernetes: &kubernetes.KubernetesRuntime{}}, }}, - want: status.NewErrorStatusWithMsg(status.IllegalManifest, "can't find specified value in resource:jack by ref:jack.notExist"), + want: v1.NewErrorStatusWithMsg(v1.IllegalManifest, "can't find specified value in resource:jack by ref:jack.notExist"), }, } for _, tt := range tests { diff --git a/pkg/engine/operation/models/change.go b/pkg/engine/operation/models/change.go index 88f1cf46..45b359ac 100644 --- a/pkg/engine/operation/models/change.go +++ b/pkg/engine/operation/models/change.go @@ -10,7 +10,6 @@ import ( "github.com/pterm/pterm" "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/log" "kusionstack.io/kusion/pkg/util/diff" "kusionstack.io/kusion/pkg/util/pretty" @@ -236,8 +235,8 @@ func (o *ChangeOrder) OutputDiff(target string) { } } -func buildResourceStateMap(rs []*intent.Resource) map[string]*intent.Resource { - rMap := make(map[string]*intent.Resource) +func buildResourceStateMap(rs []*v1.Resource) map[string]*v1.Resource { + rMap := make(map[string]*v1.Resource) if len(rs) == 0 { return rMap } diff --git a/pkg/engine/operation/models/change_test.go b/pkg/engine/operation/models/change_test.go index 80d8259c..1ced1645 100644 --- a/pkg/engine/operation/models/change_test.go +++ b/pkg/engine/operation/models/change_test.go @@ -7,8 +7,7 @@ import ( "github.com/stretchr/testify/assert" - "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" "kusionstack.io/kusion/pkg/util/pretty" ) @@ -149,8 +148,8 @@ func TestChangeStep_Diff(t *testing.T) { func TestChanges_Get(t *testing.T) { type fields struct { order *ChangeOrder - project *v1.Project - stack *v1.Stack + project *apiv1.Project + stack *apiv1.Stack } type args struct { key string @@ -193,8 +192,8 @@ func TestChanges_Get(t *testing.T) { func TestChanges_Values(t *testing.T) { type fields struct { order *ChangeOrder - project *v1.Project - stack *v1.Stack + project *apiv1.Project + stack *apiv1.Stack } type args struct { filters []ChangeStepFilterFunc @@ -275,25 +274,25 @@ func TestChanges_Values(t *testing.T) { func TestChanges_Stack(t *testing.T) { type fields struct { order *ChangeOrder - project *v1.Project - stack *v1.Stack + project *apiv1.Project + stack *apiv1.Stack } tests := []struct { name string fields fields - want *v1.Stack + want *apiv1.Stack }{ { name: "t1", fields: fields{ order: &ChangeOrder{StepKeys: []string{}, ChangeSteps: map[string]*ChangeStep{}}, - project: &v1.Project{}, - stack: &v1.Stack{ + project: &apiv1.Project{}, + stack: &apiv1.Stack{ Name: "test-name", Path: "test-path", }, }, - want: &v1.Stack{ + want: &apiv1.Stack{ Name: "test-name", Path: "test-path", }, @@ -316,23 +315,23 @@ func TestChanges_Stack(t *testing.T) { func TestChanges_Project(t *testing.T) { type fields struct { order *ChangeOrder - project *v1.Project - stack *v1.Stack + project *apiv1.Project + stack *apiv1.Stack } tests := []struct { name string fields fields - want *v1.Project + want *apiv1.Project }{ { name: "t1", fields: fields{ - project: &v1.Project{ + project: &apiv1.Project{ Name: "test-name", Path: "test-path", }, }, - want: &v1.Project{ + want: &apiv1.Project{ Name: "test-name", Path: "test-path", }, @@ -351,8 +350,8 @@ func TestChanges_Project(t *testing.T) { func TestChanges_Diffs(t *testing.T) { type fields struct { order *ChangeOrder - project *v1.Project - stack *v1.Stack + project *apiv1.Project + stack *apiv1.Stack } tests := []struct { name string @@ -393,8 +392,8 @@ func TestChanges_Diffs(t *testing.T) { func TestChanges_Preview(t *testing.T) { type fields struct { order *ChangeOrder - project *v1.Project - stack *v1.Stack + project *apiv1.Project + stack *apiv1.Stack } tests := []struct { name string @@ -409,7 +408,7 @@ func TestChanges_Preview(t *testing.T) { "test-key": TestChangeStepOpCreate, }, }, - stack: &v1.Stack{ + stack: &apiv1.Stack{ Name: "test-name", }, }, @@ -429,19 +428,19 @@ func TestChanges_Preview(t *testing.T) { func Test_buildResourceStateMap(t *testing.T) { type args struct { - rs []*intent.Resource + rs []*apiv1.Resource } tests := []struct { name string args args - want map[string]*intent.Resource + want map[string]*apiv1.Resource }{ { name: "t1", args: args{ - rs: []*intent.Resource{}, + rs: []*apiv1.Resource{}, }, - want: map[string]*intent.Resource{}, + want: map[string]*apiv1.Resource{}, }, } for _, tt := range tests { diff --git a/pkg/engine/operation/models/operation_context.go b/pkg/engine/operation/models/operation_context.go index 3b65791d..91951248 100644 --- a/pkg/engine/operation/models/operation_context.go +++ b/pkg/engine/operation/models/operation_context.go @@ -7,7 +7,6 @@ import ( "github.com/jinzhu/copier" "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/engine/runtime" "kusionstack.io/kusion/pkg/engine/states" "kusionstack.io/kusion/pkg/log" @@ -24,13 +23,13 @@ type Operation struct { StateStorage states.StateStorage // CtxResourceIndex represents resources updated by this operation - CtxResourceIndex map[string]*intent.Resource + CtxResourceIndex map[string]*v1.Resource // PriorStateResourceIndex represents resource state saved during the last operation - PriorStateResourceIndex map[string]*intent.Resource + PriorStateResourceIndex map[string]*v1.Resource // StateResourceIndex represents resources that will be saved in states.StateStorage - StateResourceIndex map[string]*intent.Resource + StateResourceIndex map[string]*v1.Resource // IgnoreFields will be ignored in preview stage IgnoreFields []string @@ -39,7 +38,7 @@ type Operation struct { ChangeOrder *ChangeOrder // RuntimeMap contains all infrastructure runtimes involved this operation. The key of this map is the Runtime type - RuntimeMap map[intent.Type]runtime.Runtime + RuntimeMap map[v1.Type]runtime.Runtime // Stack contains info about where this command is invoked Stack *v1.Stack @@ -62,12 +61,12 @@ type Message struct { } type Request struct { - Tenant string `json:"tenant"` - Project *v1.Project `json:"project"` - Stack *v1.Stack `json:"stack"` - Cluster string `json:"cluster"` - Operator string `json:"operator"` - Intent *intent.Intent `json:"intent"` + Tenant string `json:"tenant"` + Project *v1.Project `json:"project"` + Stack *v1.Stack `json:"stack"` + Cluster string `json:"cluster"` + Operator string `json:"operator"` + Intent *v1.Intent `json:"intent"` } type OpResult string @@ -80,7 +79,7 @@ const ( ) // RefreshResourceIndex refresh resources in CtxResourceIndex & StateResourceIndex -func (o *Operation) RefreshResourceIndex(resourceKey string, resource *intent.Resource, actionType ActionType) error { +func (o *Operation) RefreshResourceIndex(resourceKey string, resource *v1.Resource, actionType ActionType) error { o.Lock.Lock() defer o.Lock.Unlock() @@ -122,7 +121,7 @@ func (o *Operation) InitStates(request *Request) (*states.State, *states.State) return latestState, resultState } -func (o *Operation) UpdateState(resourceIndex map[string]*intent.Resource) error { +func (o *Operation) UpdateState(resourceIndex map[string]*v1.Resource) error { o.Lock.Lock() defer o.Lock.Unlock() @@ -130,7 +129,7 @@ func (o *Operation) UpdateState(resourceIndex map[string]*intent.Resource) error state.Serial += 1 state.Resources = nil - res := make([]intent.Resource, 0, len(resourceIndex)) + res := make([]v1.Resource, 0, len(resourceIndex)) for key := range resourceIndex { // {key -> nil} represents Deleted action if resourceIndex[key] == nil { diff --git a/pkg/engine/operation/parser/delete_resource_parser.go b/pkg/engine/operation/parser/delete_resource_parser.go index a7ed8d03..43a250b9 100644 --- a/pkg/engine/operation/parser/delete_resource_parser.go +++ b/pkg/engine/operation/parser/delete_resource_parser.go @@ -3,8 +3,8 @@ package parser import ( "fmt" - "kusionstack.io/kusion/pkg/apis/intent" - "kusionstack.io/kusion/pkg/apis/status" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" + v1 "kusionstack.io/kusion/pkg/apis/status/v1" "kusionstack.io/kusion/pkg/engine/operation/graph" opsmodels "kusionstack.io/kusion/pkg/engine/operation/models" "kusionstack.io/kusion/pkg/log" @@ -14,18 +14,18 @@ import ( ) type DeleteResourceParser struct { - resources intent.Resources + resources apiv1.Resources } -func NewDeleteResourceParser(resources intent.Resources) *DeleteResourceParser { +func NewDeleteResourceParser(resources apiv1.Resources) *DeleteResourceParser { return &DeleteResourceParser{resources: resources} } -func (d *DeleteResourceParser) Parse(g *dag.AcyclicGraph) (s status.Status) { +func (d *DeleteResourceParser) Parse(g *dag.AcyclicGraph) (s v1.Status) { util.CheckNotNil(g, "graph is nil") if len(g.Vertices()) == 0 { log.Infof("no vertices in dag when parsing deleted resources. dag:%s", json.Marshal2String(g)) - return status.NewErrorStatusWithMsg(status.InvalidArgument, "no vertices in dag when parsing deleted resources") + return v1.NewErrorStatusWithMsg(v1.InvalidArgument, "no vertices in dag when parsing deleted resources") } manifestGraphMap := make(map[string]interface{}) @@ -50,7 +50,7 @@ func (d *DeleteResourceParser) Parse(g *dag.AcyclicGraph) (s status.Status) { for key, resource := range resourceIndex { rn, s := graph.NewResourceNode(key, resourceIndex[key], opsmodels.Delete) - if status.IsErr(s) { + if v1.IsErr(s) { return s } rnID := rn.Hashcode().(string) @@ -61,7 +61,7 @@ func (d *DeleteResourceParser) Parse(g *dag.AcyclicGraph) (s status.Status) { for _, v := range priorDependsOn[rnID] { if manifestGraphMap[v] != nil { msg := fmt.Sprintf("%s dependson %s, cannot delete resource %s", v, rnID, rnID) - return status.NewErrorStatusWithMsg(status.Internal, msg) + return v1.NewErrorStatusWithMsg(v1.Internal, msg) } } g.Add(rn) @@ -70,19 +70,19 @@ func (d *DeleteResourceParser) Parse(g *dag.AcyclicGraph) (s status.Status) { // compute implicit and explicate dependencies refNodeKeys, s := updateDependencies(resource) - if status.IsErr(s) { + if v1.IsErr(s) { return s } // always get the latest vertex in the g. rn = GetVertex(g, rn).(*graph.ResourceNode) s = LinkRefNodes(g, refNodeKeys, resourceIndex, rn, opsmodels.Delete, manifestGraphMap) - if status.IsErr(s) { + if v1.IsErr(s) { return s } } if err = g.Validate(); err != nil { - return status.NewErrorStatusWithMsg(status.IllegalManifest, "Found circle dependency in models."+err.Error()) + return v1.NewErrorStatusWithMsg(v1.IllegalManifest, "Found circle dependency in models."+err.Error()) } g.TransitiveReduction() return s diff --git a/pkg/engine/operation/parser/delete_resource_parser_test.go b/pkg/engine/operation/parser/delete_resource_parser_test.go index f123b098..0315f7a9 100644 --- a/pkg/engine/operation/parser/delete_resource_parser_test.go +++ b/pkg/engine/operation/parser/delete_resource_parser_test.go @@ -4,7 +4,7 @@ import ( "strings" "testing" - "kusionstack.io/kusion/pkg/apis/intent" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" "kusionstack.io/kusion/pkg/engine/operation/graph" "kusionstack.io/kusion/third_party/terraform/dag" ) @@ -14,7 +14,7 @@ func TestDeleteResourceParser_Parse(t *testing.T) { const VSwitch = "vswitch" const VSecutiry = "vsecurity" const Instance = "instance" - resources := []intent.Resource{ + resources := []apiv1.Resource{ { ID: VPC, diff --git a/pkg/engine/operation/parser/parser.go b/pkg/engine/operation/parser/parser.go index 5dd815ff..b035f088 100644 --- a/pkg/engine/operation/parser/parser.go +++ b/pkg/engine/operation/parser/parser.go @@ -4,31 +4,31 @@ import ( "fmt" "reflect" - "kusionstack.io/kusion/pkg/apis/intent" - "kusionstack.io/kusion/pkg/apis/status" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" + v1 "kusionstack.io/kusion/pkg/apis/status/v1" "kusionstack.io/kusion/pkg/engine/operation/graph" opsmodels "kusionstack.io/kusion/pkg/engine/operation/models" "kusionstack.io/kusion/third_party/terraform/dag" ) type Parser interface { - Parse(dag *dag.AcyclicGraph) status.Status + Parse(dag *dag.AcyclicGraph) v1.Status } -func updateDependencies(resource *intent.Resource) ([]string, status.Status) { +func updateDependencies(resource *apiv1.Resource) ([]string, v1.Status) { // handle explicate dependency refNodeKeys := resource.DependsOn // handle implicit dependency v := reflect.ValueOf(resource.Attributes) implicitRefKeys, _, s := graph.ReplaceImplicitRef(v, nil, func( - res map[string]*intent.Resource, + res map[string]*apiv1.Resource, ref string, - ) (reflect.Value, status.Status) { + ) (reflect.Value, v1.Status) { // don't replace anything when parsing dependencies return reflect.ValueOf(ref), nil }) - if status.IsErr(s) { + if v1.IsErr(s) { return nil, s } refNodeKeys = append(refNodeKeys, implicitRefKeys...) @@ -42,25 +42,25 @@ func updateDependencies(resource *intent.Resource) ([]string, status.Status) { func LinkRefNodes( ag *dag.AcyclicGraph, refNodeKeys []string, - resourceIndex map[string]*intent.Resource, + resourceIndex map[string]*apiv1.Resource, rn dag.Vertex, defaultAction opsmodels.ActionType, manifestGraphMap map[string]interface{}, -) status.Status { +) v1.Status { if len(refNodeKeys) == 0 { return nil } for _, parentKey := range refNodeKeys { if resourceIndex[parentKey] == nil { - return status.NewErrorStatusWithMsg(status.IllegalManifest, + return v1.NewErrorStatusWithMsg(v1.IllegalManifest, fmt.Sprintf("can't find resource by key:%s in models or state.", parentKey)) } parentNode, s := graph.NewResourceNode(parentKey, resourceIndex[parentKey], defaultAction) - if status.IsErr(s) { + if v1.IsErr(s) { return s } baseNode, s := graph.NewBaseNode(parentKey) - if status.IsErr(s) { + if v1.IsErr(s) { return s } diff --git a/pkg/engine/operation/parser/spec_parser.go b/pkg/engine/operation/parser/spec_parser.go index 990c89bb..afa84a3b 100644 --- a/pkg/engine/operation/parser/spec_parser.go +++ b/pkg/engine/operation/parser/spec_parser.go @@ -3,8 +3,8 @@ package parser import ( "fmt" - "kusionstack.io/kusion/pkg/apis/intent" - "kusionstack.io/kusion/pkg/apis/status" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" + v1 "kusionstack.io/kusion/pkg/apis/status/v1" "kusionstack.io/kusion/pkg/engine/operation/graph" opsmodels "kusionstack.io/kusion/pkg/engine/operation/models" "kusionstack.io/kusion/pkg/util" @@ -13,22 +13,22 @@ import ( ) type IntentParser struct { - intent *intent.Intent + intent *apiv1.Intent } -func NewIntentParser(i *intent.Intent) *IntentParser { +func NewIntentParser(i *apiv1.Intent) *IntentParser { return &IntentParser{intent: i} } var _ Parser = (*IntentParser)(nil) -func (m *IntentParser) Parse(g *dag.AcyclicGraph) (s status.Status) { +func (m *IntentParser) Parse(g *dag.AcyclicGraph) (s v1.Status) { util.CheckNotNil(g, "dag is nil") i := m.intent util.CheckNotNil(i, "models is nil") if i.Resources == nil { sprintf := fmt.Sprintf("no resources in models:%s", json.Marshal2String(i)) - return status.NewBaseStatus(status.Warning, status.NotFound, sprintf) + return v1.NewBaseStatus(v1.Warning, v1.NotFound, sprintf) } root, err := g.Root() @@ -37,7 +37,7 @@ func (m *IntentParser) Parse(g *dag.AcyclicGraph) (s status.Status) { resourceIndex := i.Resources.Index() for key, resource := range resourceIndex { rn, s := graph.NewResourceNode(key, resourceIndex[key], opsmodels.Update) - if status.IsErr(s) { + if v1.IsErr(s) { return s } @@ -53,19 +53,19 @@ func (m *IntentParser) Parse(g *dag.AcyclicGraph) (s status.Status) { // compute implicit and explicate dependencies refNodeKeys, s := updateDependencies(resource) - if status.IsErr(s) { + if v1.IsErr(s) { return s } // linkRefNodes s = LinkRefNodes(g, refNodeKeys, resourceIndex, rn, opsmodels.Update, nil) - if status.IsErr(s) { + if v1.IsErr(s) { return s } } if err = g.Validate(); err != nil { - return status.NewErrorStatusWithMsg(status.IllegalManifest, "Found circle dependency in models:"+err.Error()) + return v1.NewErrorStatusWithMsg(v1.IllegalManifest, "Found circle dependency in models:"+err.Error()) } g.TransitiveReduction() return s diff --git a/pkg/engine/operation/parser/spec_parser_test.go b/pkg/engine/operation/parser/spec_parser_test.go index e5ac8e18..5ead5708 100644 --- a/pkg/engine/operation/parser/spec_parser_test.go +++ b/pkg/engine/operation/parser/spec_parser_test.go @@ -4,7 +4,7 @@ import ( "strings" "testing" - "kusionstack.io/kusion/pkg/apis/intent" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" "kusionstack.io/kusion/pkg/engine/operation/graph" "kusionstack.io/kusion/third_party/terraform/dag" ) @@ -13,7 +13,7 @@ func TestSpecParser_Parse(t *testing.T) { const Jack = "jack" const Pony = "pony" const Eric = "eric" - mf := &intent.Intent{Resources: []intent.Resource{ + mf := &apiv1.Intent{Resources: []apiv1.Resource{ { ID: Pony, diff --git a/pkg/engine/operation/preview.go b/pkg/engine/operation/preview.go index e5b5dfc7..2c9beb15 100644 --- a/pkg/engine/operation/preview.go +++ b/pkg/engine/operation/preview.go @@ -5,8 +5,8 @@ import ( "fmt" "sync" - "kusionstack.io/kusion/pkg/apis/intent" - "kusionstack.io/kusion/pkg/apis/status" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" + v1 "kusionstack.io/kusion/pkg/apis/status/v1" "kusionstack.io/kusion/pkg/engine/operation/graph" opsmodels "kusionstack.io/kusion/pkg/engine/operation/models" runtimeinit "kusionstack.io/kusion/pkg/engine/runtime/init" @@ -30,7 +30,7 @@ type PreviewResponse struct { // Preview compute all changes between resources in request and the actual infrastructure. // The whole process is similar to the operation Apply, but the execution of each node is mocked and will not actually invoke the Runtime -func (po *PreviewOperation) Preview(request *PreviewRequest) (rsp *PreviewResponse, s status.Status) { +func (po *PreviewOperation) Preview(request *PreviewRequest) (rsp *PreviewResponse, s v1.Status) { o := po.Operation defer func() { @@ -39,22 +39,22 @@ func (po *PreviewOperation) Preview(request *PreviewRequest) (rsp *PreviewRespon switch x := e.(type) { case string: - s = status.NewErrorStatus(fmt.Errorf("preview panic:%s", e)) + s = v1.NewErrorStatus(fmt.Errorf("preview panic:%s", e)) case error: - s = status.NewErrorStatus(x) + s = v1.NewErrorStatus(x) default: - s = status.NewErrorStatus(errors.New("unknown panic")) + s = v1.NewErrorStatus(errors.New("unknown panic")) } } }() - if s := validateRequest(&request.Request); status.IsErr(s) { + if s := validateRequest(&request.Request); v1.IsErr(s) { return nil, s } var ( priorState, resultState *states.State - priorStateResourceIndex map[string]*intent.Resource + priorStateResourceIndex map[string]*apiv1.Resource ag *dag.AcyclicGraph ) @@ -65,7 +65,7 @@ func (po *PreviewOperation) Preview(request *PreviewRequest) (rsp *PreviewRespon resources := request.Intent.Resources resources = append(resources, priorState.Resources...) runtimesMap, s := runtimeinit.Runtimes(resources) - if status.IsErr(s) { + if v1.IsErr(s) { return nil, s } o.RuntimeMap = runtimesMap @@ -79,11 +79,11 @@ func (po *PreviewOperation) Preview(request *PreviewRequest) (rsp *PreviewRespon priorStateResourceIndex = resources.Index() ag, s = NewDestroyGraph(resources) } - if status.IsErr(s) { + if v1.IsErr(s) { return nil, s } // copy priorStateResourceIndex into a new map - stateResourceIndex := map[string]*intent.Resource{} + stateResourceIndex := map[string]*apiv1.Resource{} for k, v := range priorStateResourceIndex { stateResourceIndex[k] = v } @@ -95,7 +95,7 @@ func (po *PreviewOperation) Preview(request *PreviewRequest) (rsp *PreviewRespon Operation: opsmodels.Operation{ OperationType: o.OperationType, StateStorage: o.StateStorage, - CtxResourceIndex: map[string]*intent.Resource{}, + CtxResourceIndex: map[string]*apiv1.Resource{}, PriorStateResourceIndex: priorStateResourceIndex, StateResourceIndex: stateResourceIndex, IgnoreFields: o.IgnoreFields, @@ -111,21 +111,21 @@ func (po *PreviewOperation) Preview(request *PreviewRequest) (rsp *PreviewRespon w.Update(ag) // Wait if diags := w.Wait(); diags.HasErrors() { - return nil, status.NewErrorStatus(diags.Err()) + return nil, v1.NewErrorStatus(diags.Err()) } return &PreviewResponse{Order: previewOperation.ChangeOrder}, nil } func (po *PreviewOperation) previewWalkFun(v dag.Vertex) (diags tfdiags.Diagnostics) { - var s status.Status + var s v1.Status if v == nil { return nil } if node, ok := v.(graph.ExecutableNode); ok { s = node.Execute(&po.Operation) - if status.IsErr(s) { + if v1.IsErr(s) { diags = diags.Append(fmt.Errorf("preview failed.\n%v", s)) return diags } diff --git a/pkg/engine/operation/preview_test.go b/pkg/engine/operation/preview_test.go index 667490ac..2731bf51 100644 --- a/pkg/engine/operation/preview_test.go +++ b/pkg/engine/operation/preview_test.go @@ -10,8 +10,7 @@ import ( "github.com/bytedance/mockey" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" - "kusionstack.io/kusion/pkg/apis/status" + v1 "kusionstack.io/kusion/pkg/apis/status/v1" opsmodels "kusionstack.io/kusion/pkg/engine/operation/models" "kusionstack.io/kusion/pkg/engine/runtime" runtimeinit "kusionstack.io/kusion/pkg/engine/runtime/init" @@ -32,12 +31,12 @@ var ( "type": "NodePort", }, } - FakeResourceState = intent.Resource{ + FakeResourceState = apiv1.Resource{ ID: "fake-id", Type: runtime.Kubernetes, Attributes: FakeService, } - FakeResourceState2 = intent.Resource{ + FakeResourceState2 = apiv1.Resource{ ID: "fake-id-2", Type: runtime.Kubernetes, Attributes: FakeService, @@ -89,11 +88,11 @@ func TestOperation_Preview(t *testing.T) { type fields struct { OperationType opsmodels.OperationType StateStorage states.StateStorage - CtxResourceIndex map[string]*intent.Resource - PriorStateResourceIndex map[string]*intent.Resource - StateResourceIndex map[string]*intent.Resource + CtxResourceIndex map[string]*apiv1.Resource + PriorStateResourceIndex map[string]*apiv1.Resource + StateResourceIndex map[string]*apiv1.Resource Order *opsmodels.ChangeOrder - RuntimeMap map[intent.Type]runtime.Runtime + RuntimeMap map[apiv1.Type]runtime.Runtime MsgCh chan opsmodels.Message resultState *states.State lock *sync.Mutex @@ -115,13 +114,13 @@ func TestOperation_Preview(t *testing.T) { fields fields args args wantRsp *PreviewResponse - wantS status.Status + wantS v1.Status }{ { name: "success-when-apply", fields: fields{ OperationType: opsmodels.ApplyPreview, - RuntimeMap: map[intent.Type]runtime.Runtime{runtime.Kubernetes: &fakePreviewRuntime{}}, + RuntimeMap: map[apiv1.Type]runtime.Runtime{runtime.Kubernetes: &fakePreviewRuntime{}}, StateStorage: &local.FileSystemState{Path: local.KusionStateFileFile}, Order: &opsmodels.ChangeOrder{StepKeys: []string{}, ChangeSteps: map[string]*opsmodels.ChangeStep{}}, }, @@ -132,8 +131,8 @@ func TestOperation_Preview(t *testing.T) { Stack: s, Project: p, Operator: "fake-operator", - Intent: &intent.Intent{ - Resources: []intent.Resource{ + Intent: &apiv1.Intent{ + Resources: []apiv1.Resource{ FakeResourceState, }, }, @@ -147,7 +146,7 @@ func TestOperation_Preview(t *testing.T) { "fake-id": { ID: "fake-id", Action: opsmodels.Create, - From: (*intent.Resource)(nil), + From: (*apiv1.Resource)(nil), To: &FakeResourceState, }, }, @@ -159,7 +158,7 @@ func TestOperation_Preview(t *testing.T) { name: "success-when-destroy", fields: fields{ OperationType: opsmodels.DestroyPreview, - RuntimeMap: map[intent.Type]runtime.Runtime{runtime.Kubernetes: &fakePreviewRuntime{}}, + RuntimeMap: map[apiv1.Type]runtime.Runtime{runtime.Kubernetes: &fakePreviewRuntime{}}, StateStorage: &local.FileSystemState{Path: local.KusionStateFileFile}, Order: &opsmodels.ChangeOrder{}, }, @@ -170,8 +169,8 @@ func TestOperation_Preview(t *testing.T) { Stack: s, Project: p, Operator: "fake-operator", - Intent: &intent.Intent{ - Resources: []intent.Resource{ + Intent: &apiv1.Intent{ + Resources: []apiv1.Resource{ FakeResourceState2, }, }, @@ -186,7 +185,7 @@ func TestOperation_Preview(t *testing.T) { ID: "fake-id-2", Action: opsmodels.Delete, From: &FakeResourceState2, - To: (*intent.Resource)(nil), + To: (*apiv1.Resource)(nil), }, }, }, @@ -197,7 +196,7 @@ func TestOperation_Preview(t *testing.T) { name: "fail-because-empty-models", fields: fields{ OperationType: opsmodels.ApplyPreview, - RuntimeMap: map[intent.Type]runtime.Runtime{runtime.Kubernetes: &fakePreviewRuntime{}}, + RuntimeMap: map[apiv1.Type]runtime.Runtime{runtime.Kubernetes: &fakePreviewRuntime{}}, StateStorage: &local.FileSystemState{Path: local.KusionStateFileFile}, Order: &opsmodels.ChangeOrder{}, }, @@ -209,13 +208,13 @@ func TestOperation_Preview(t *testing.T) { }, }, wantRsp: nil, - wantS: status.NewErrorStatusWithMsg(status.InvalidArgument, "request.Intent is empty. If you want to delete all resources, please use command 'destroy'"), + wantS: v1.NewErrorStatusWithMsg(v1.InvalidArgument, "request.Intent is empty. If you want to delete all resources, please use command 'destroy'"), }, { name: "fail-because-nonexistent-id", fields: fields{ OperationType: opsmodels.ApplyPreview, - RuntimeMap: map[intent.Type]runtime.Runtime{runtime.Kubernetes: &fakePreviewRuntime{}}, + RuntimeMap: map[apiv1.Type]runtime.Runtime{runtime.Kubernetes: &fakePreviewRuntime{}}, StateStorage: &local.FileSystemState{Path: local.KusionStateFileFile}, Order: &opsmodels.ChangeOrder{}, }, @@ -226,8 +225,8 @@ func TestOperation_Preview(t *testing.T) { Stack: s, Project: p, Operator: "fake-operator", - Intent: &intent.Intent{ - Resources: []intent.Resource{ + Intent: &apiv1.Intent{ + Resources: []apiv1.Resource{ { ID: "fake-id", Type: runtime.Kubernetes, @@ -240,7 +239,7 @@ func TestOperation_Preview(t *testing.T) { }, }, wantRsp: nil, - wantS: status.NewErrorStatusWithMsg(status.IllegalManifest, "can't find resource by key:nonexistent-id in models or state."), + wantS: v1.NewErrorStatusWithMsg(v1.IllegalManifest, "can't find resource by key:nonexistent-id in models or state."), }, } for _, tt := range tests { @@ -261,9 +260,9 @@ func TestOperation_Preview(t *testing.T) { } mockey.Mock(runtimeinit.Runtimes).To(func( - resources intent.Resources, - ) (map[intent.Type]runtime.Runtime, status.Status) { - return map[intent.Type]runtime.Runtime{runtime.Kubernetes: &fakePreviewRuntime{}}, nil + resources apiv1.Resources, + ) (map[apiv1.Type]runtime.Runtime, v1.Status) { + return map[apiv1.Type]runtime.Runtime{runtime.Kubernetes: &fakePreviewRuntime{}}, nil }).Build() gotRsp, gotS := o.Preview(tt.args.request) if !reflect.DeepEqual(gotRsp, tt.wantRsp) { diff --git a/pkg/engine/operation/watch.go b/pkg/engine/operation/watch.go index 57ef971a..d7065842 100644 --- a/pkg/engine/operation/watch.go +++ b/pkg/engine/operation/watch.go @@ -12,7 +12,7 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" k8swatch "k8s.io/apimachinery/pkg/watch" - "kusionstack.io/kusion/pkg/apis/status" + v1 "kusionstack.io/kusion/pkg/apis/status/v1" "kusionstack.io/kusion/pkg/engine" opsmodels "kusionstack.io/kusion/pkg/engine/operation/models" "kusionstack.io/kusion/pkg/engine/printers" @@ -37,7 +37,7 @@ func (wo *WatchOperation) Watch(req *WatchRequest) error { // init runtimes resources := req.Intent.Resources runtimes, s := runtimeinit.Runtimes(resources) - if status.IsErr(s) { + if v1.IsErr(s) { return errors.New(s.Message()) } wo.RuntimeMap = runtimes @@ -60,7 +60,7 @@ func (wo *WatchOperation) Watch(req *WatchRequest) error { log.Debug("unsupported resource type: %s", t) continue } - if status.IsErr(resp.Status) { + if v1.IsErr(resp.Status) { return fmt.Errorf(resp.Status.String()) } diff --git a/pkg/engine/operation/watch_test.go b/pkg/engine/operation/watch_test.go index 7781345c..708c27b0 100644 --- a/pkg/engine/operation/watch_test.go +++ b/pkg/engine/operation/watch_test.go @@ -9,8 +9,8 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" k8sWatch "k8s.io/apimachinery/pkg/watch" - "kusionstack.io/kusion/pkg/apis/intent" - "kusionstack.io/kusion/pkg/apis/status" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" + v1 "kusionstack.io/kusion/pkg/apis/status/v1" opsmodels "kusionstack.io/kusion/pkg/engine/operation/models" "kusionstack.io/kusion/pkg/engine/runtime" runtimeinit "kusionstack.io/kusion/pkg/engine/runtime/init" @@ -20,8 +20,8 @@ func TestWatchOperation_Watch(t *testing.T) { mockey.PatchConvey("test watch operation: watch", t, func() { req := &WatchRequest{ Request: opsmodels.Request{ - Intent: &intent.Intent{ - Resources: intent.Resources{ + Intent: &apiv1.Intent{ + Resources: apiv1.Resources{ { ID: "apps/v1:Deployment:foo:bar", Type: runtime.Kubernetes, @@ -32,11 +32,11 @@ func TestWatchOperation_Watch(t *testing.T) { }, } mockey.Mock(runtimeinit.Runtimes).To(func( - resources intent.Resources, - ) (map[intent.Type]runtime.Runtime, status.Status) { - return map[intent.Type]runtime.Runtime{runtime.Kubernetes: fooRuntime}, nil + resources apiv1.Resources, + ) (map[apiv1.Type]runtime.Runtime, v1.Status) { + return map[apiv1.Type]runtime.Runtime{runtime.Kubernetes: fooRuntime}, nil }).Build() - wo := &WatchOperation{opsmodels.Operation{RuntimeMap: map[intent.Type]runtime.Runtime{runtime.Kubernetes: fooRuntime}}} + wo := &WatchOperation{opsmodels.Operation{RuntimeMap: map[apiv1.Type]runtime.Runtime{runtime.Kubernetes: fooRuntime}}} err := wo.Watch(req) assert.Nil(t, err) }) diff --git a/pkg/engine/runtime/init/init.go b/pkg/engine/runtime/init/init.go index f9d388d6..8f7576d2 100644 --- a/pkg/engine/runtime/init/init.go +++ b/pkg/engine/runtime/init/init.go @@ -4,24 +4,24 @@ import ( "fmt" "reflect" - "kusionstack.io/kusion/pkg/apis/intent" - "kusionstack.io/kusion/pkg/apis/status" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" + v1 "kusionstack.io/kusion/pkg/apis/status/v1" "kusionstack.io/kusion/pkg/engine/runtime" "kusionstack.io/kusion/pkg/engine/runtime/kubernetes" "kusionstack.io/kusion/pkg/engine/runtime/kubernetes/kubeops" "kusionstack.io/kusion/pkg/engine/runtime/terraform" ) -var SupportRuntimes = map[intent.Type]InitFn{ +var SupportRuntimes = map[apiv1.Type]InitFn{ runtime.Kubernetes: kubernetes.NewKubernetesRuntime, runtime.Terraform: terraform.NewTerraformRuntime, } // InitFn runtime init func -type InitFn func(resource *intent.Resource) (runtime.Runtime, error) +type InitFn func(resource *apiv1.Resource) (runtime.Runtime, error) -func Runtimes(resources intent.Resources) (map[intent.Type]runtime.Runtime, status.Status) { - runtimesMap := map[intent.Type]runtime.Runtime{} +func Runtimes(resources apiv1.Resources) (map[apiv1.Type]runtime.Runtime, v1.Status) { + runtimesMap := map[apiv1.Type]runtime.Runtime{} if resources == nil { return runtimesMap, nil } @@ -34,7 +34,7 @@ func Runtimes(resources intent.Resources) (map[intent.Type]runtime.Runtime, stat if runtimesMap[rt] == nil { r, err := SupportRuntimes[rt](&resource) if err != nil { - return nil, status.NewErrorStatus(fmt.Errorf("init %s runtime failed. %w", rt, err)) + return nil, v1.NewErrorStatus(fmt.Errorf("init %s runtime failed. %w", rt, err)) } runtimesMap[rt] = r } @@ -42,21 +42,21 @@ func Runtimes(resources intent.Resources) (map[intent.Type]runtime.Runtime, stat return runtimesMap, nil } -func validResources(resources intent.Resources) status.Status { +func validResources(resources apiv1.Resources) v1.Status { var kubeConfig string for _, resource := range resources { rt := resource.Type if rt == "" { - return status.NewErrorStatusWithCode(status.IllegalManifest, fmt.Errorf("no resource type in resource: %v", resource.ID)) + return v1.NewErrorStatusWithCode(v1.IllegalManifest, fmt.Errorf("no resource type in resource: %v", resource.ID)) } if SupportRuntimes[rt] == nil { - return status.NewErrorStatusWithCode(status.IllegalManifest, fmt.Errorf("unknown resource type: %s. Currently supported resource types are: %v", + return v1.NewErrorStatusWithCode(v1.IllegalManifest, fmt.Errorf("unknown resource type: %s. Currently supported resource types are: %v", rt, reflect.ValueOf(SupportRuntimes).MapKeys())) } - if rt == intent.Kubernetes { + if rt == apiv1.Kubernetes { config := kubeops.GetKubeConfig(&resource) if kubeConfig != "" && kubeConfig != config { - return status.NewErrorStatusWithCode(status.IllegalManifest, fmt.Errorf("different kubeConfig in different resources")) + return v1.NewErrorStatusWithCode(v1.IllegalManifest, fmt.Errorf("different kubeConfig in different resources")) } if kubeConfig == "" { kubeConfig = config diff --git a/pkg/engine/runtime/init/init_test.go b/pkg/engine/runtime/init/init_test.go index 3da9db1e..cb58931c 100644 --- a/pkg/engine/runtime/init/init_test.go +++ b/pkg/engine/runtime/init/init_test.go @@ -5,19 +5,19 @@ import ( "github.com/stretchr/testify/assert" - "kusionstack.io/kusion/pkg/apis/intent" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" ) func TestValidResources(t *testing.T) { testcases := []struct { name string success bool - resources intent.Resources + resources apiv1.Resources }{ { name: "valid resources", success: true, - resources: []intent.Resource{ + resources: []apiv1.Resource{ { ID: "mock-id", Type: "Kubernetes", @@ -33,7 +33,7 @@ func TestValidResources(t *testing.T) { { name: "invalid resources empty type", success: false, - resources: []intent.Resource{ + resources: []apiv1.Resource{ { ID: "mock-id", Type: "", @@ -49,7 +49,7 @@ func TestValidResources(t *testing.T) { { name: "invalid resources unsupported type", success: false, - resources: []intent.Resource{ + resources: []apiv1.Resource{ { ID: "mock-id", Type: "Unsupported", @@ -65,7 +65,7 @@ func TestValidResources(t *testing.T) { { name: "invalid resources multiple kubeConfig", success: false, - resources: []intent.Resource{ + resources: []apiv1.Resource{ { ID: "mock-id", Type: "Kubernetes", diff --git a/pkg/engine/runtime/kubernetes/kubeops/config.go b/pkg/engine/runtime/kubernetes/kubeops/config.go index b39165f6..d90109c3 100644 --- a/pkg/engine/runtime/kubernetes/kubeops/config.go +++ b/pkg/engine/runtime/kubernetes/kubeops/config.go @@ -6,7 +6,7 @@ import ( "k8s.io/client-go/util/homedir" - "kusionstack.io/kusion/pkg/apis/intent" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" ) const ( @@ -24,12 +24,12 @@ var ( // 1. If $KUBECONFIG environment variable is set, then it is used. // 2. If not, and the `kubeConfig` in resource extensions is set, then it is used. // 3. Otherwise, ${HOME}/.kube/config is used. -func GetKubeConfig(resource *intent.Resource) string { +func GetKubeConfig(resource *apiv1.Resource) string { if kubeConfigFile := os.Getenv(RecommendedConfigPathEnvVar); kubeConfigFile != "" { return kubeConfigFile } if resource != nil { - kubeConfig, ok := resource.Extensions[intent.ResourceExtensionKubeConfig].(string) + kubeConfig, ok := resource.Extensions[apiv1.ResourceExtensionKubeConfig].(string) if ok && kubeConfig != "" { kubeConfigFile, _ := filepath.Abs(kubeConfig) if kubeConfigFile != "" { diff --git a/pkg/engine/runtime/kubernetes/kubeops/config_test.go b/pkg/engine/runtime/kubernetes/kubeops/config_test.go index e917dff7..c707520b 100644 --- a/pkg/engine/runtime/kubernetes/kubeops/config_test.go +++ b/pkg/engine/runtime/kubernetes/kubeops/config_test.go @@ -7,7 +7,7 @@ import ( "github.com/bytedance/mockey" "github.com/stretchr/testify/assert" - "kusionstack.io/kusion/pkg/apis/intent" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" ) func mockGetenv(result string) { @@ -17,7 +17,7 @@ func mockGetenv(result string) { } func TestGetKubeConfig(t *testing.T) { - resource := &intent.Resource{ + resource := &apiv1.Resource{ Extensions: map[string]any{ "kubeConfig": "/home/test/kubeconfig", }, diff --git a/pkg/engine/runtime/kubernetes/kubernetes_runtime.go b/pkg/engine/runtime/kubernetes/kubernetes_runtime.go index 39a1d18b..6d67b3c2 100644 --- a/pkg/engine/runtime/kubernetes/kubernetes_runtime.go +++ b/pkg/engine/runtime/kubernetes/kubernetes_runtime.go @@ -25,8 +25,8 @@ import ( "k8s.io/client-go/tools/clientcmd" "sigs.k8s.io/controller-runtime/pkg/client/apiutil" - "kusionstack.io/kusion/pkg/apis/intent" - "kusionstack.io/kusion/pkg/apis/status" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" + v1 "kusionstack.io/kusion/pkg/apis/status/v1" "kusionstack.io/kusion/pkg/engine" "kusionstack.io/kusion/pkg/engine/printers/convertor" "kusionstack.io/kusion/pkg/engine/runtime" @@ -43,7 +43,7 @@ type KubernetesRuntime struct { } // NewKubernetesRuntime create a new KubernetesRuntime -func NewKubernetesRuntime(resource *intent.Resource) (runtime.Runtime, error) { +func NewKubernetesRuntime(resource *apiv1.Resource) (runtime.Runtime, error) { client, mapper, err := getKubernetesClient(resource) if err != nil { return nil, err @@ -62,18 +62,18 @@ func (k *KubernetesRuntime) Apply(ctx context.Context, request *runtime.ApplyReq // Don`t consider delete case, so plan state must be not empty if planState == nil { - return &runtime.ApplyResponse{Status: status.NewErrorStatus(errors.New("plan state is nil"))} + return &runtime.ApplyResponse{Status: v1.NewErrorStatus(errors.New("plan state is nil"))} } // Get kubernetes Resource interface from plan state planObj, resource, err := k.buildKubernetesResourceByState(planState) if err != nil { - return &runtime.ApplyResponse{Status: status.NewErrorStatus(err)} + return &runtime.ApplyResponse{Status: v1.NewErrorStatus(err)} } // Get live state response := k.Read(ctx, &runtime.ReadRequest{PlanResource: planState}) - if status.IsErr(response.Status) { + if v1.IsErr(response.Status) { return &runtime.ApplyResponse{Status: response.Status} } liveState := response.Resource @@ -94,7 +94,7 @@ func (k *KubernetesRuntime) Apply(ctx context.Context, request *runtime.ApplyReq // Create 3-way merge patch body patchBody, err := jsonmergepatch.CreateThreeWayJSONMergePatch([]byte(original), []byte(modified), []byte(current)) if err != nil { - return &runtime.ApplyResponse{Status: status.NewErrorStatus(err)} + return &runtime.ApplyResponse{Status: v1.NewErrorStatus(err)} } // Final result, dry-run to diff, otherwise to save in states @@ -128,13 +128,13 @@ func (k *KubernetesRuntime) Apply(ctx context.Context, request *runtime.ApplyReq // Merge 3-way patch mergedPatch, err := jsonpatch.MergePatch([]byte(current), patchBody) if err != nil { - return &runtime.ApplyResponse{Status: status.NewErrorStatus(err)} + return &runtime.ApplyResponse{Status: v1.NewErrorStatus(err)} } // Unmarshall and return res = &unstructured.Unstructured{} if err = res.UnmarshalJSON(mergedPatch); err != nil { - return &runtime.ApplyResponse{Status: status.NewErrorStatus(err)} + return &runtime.ApplyResponse{Status: v1.NewErrorStatus(err)} } } } @@ -147,13 +147,13 @@ func (k *KubernetesRuntime) Apply(ctx context.Context, request *runtime.ApplyReq _, err = resource.Patch(ctx, planObj.GetName(), types.MergePatchType, patchBody, metav1.PatchOptions{FieldManager: "kusion"}) } if err != nil { - return &runtime.ApplyResponse{Status: status.NewErrorStatus(err)} + return &runtime.ApplyResponse{Status: v1.NewErrorStatus(err)} } // Save modified res = planObj } - return &runtime.ApplyResponse{Resource: &intent.Resource{ + return &runtime.ApplyResponse{Resource: &apiv1.Resource{ ID: planState.ResourceKey(), Type: planState.Type, Attributes: res.Object, @@ -170,7 +170,7 @@ func (k *KubernetesRuntime) Read(ctx context.Context, request *runtime.ReadReque } // Validate if requestResource == nil { - return &runtime.ReadResponse{Status: status.NewErrorStatus(errors.New("can not read k8s resource with empty body"))} + return &runtime.ReadResponse{Status: v1.NewErrorStatus(errors.New("can not read k8s resource with empty body"))} } // Get resource by attribute @@ -181,7 +181,7 @@ func (k *KubernetesRuntime) Read(ctx context.Context, request *runtime.ReadReque log.Infof("%v, ignore", err) return &runtime.ReadResponse{} } - return &runtime.ReadResponse{Status: status.NewErrorStatus(err)} + return &runtime.ReadResponse{Status: v1.NewErrorStatus(err)} } // Read resource @@ -191,10 +191,10 @@ func (k *KubernetesRuntime) Read(ctx context.Context, request *runtime.ReadReque log.Infof("%s not found, ignore", requestResource.ResourceKey()) return &runtime.ReadResponse{} } - return &runtime.ReadResponse{Status: status.NewErrorStatus(err)} + return &runtime.ReadResponse{Status: v1.NewErrorStatus(err)} } - return &runtime.ReadResponse{Resource: &intent.Resource{ + return &runtime.ReadResponse{Resource: &apiv1.Resource{ ID: requestResource.ResourceKey(), Type: requestResource.Type, Attributes: v.Object, @@ -210,7 +210,7 @@ func (k *KubernetesRuntime) Import(ctx context.Context, request *runtime.ImportR Stack: request.Stack, }) - if status.IsErr(response.Status) { + if v1.IsErr(response.Status) { return &runtime.ImportResponse{ Resource: nil, Status: response.Status, @@ -223,7 +223,7 @@ func (k *KubernetesRuntime) Import(ctx context.Context, request *runtime.ImportR if len(lastApplied) != 0 { err := ur.UnmarshalJSON([]byte(lastApplied)) if err != nil { - return &runtime.ImportResponse{Status: status.NewErrorStatusWithCode(status.IllegalManifest, err)} + return &runtime.ImportResponse{Status: v1.NewErrorStatusWithCode(v1.IllegalManifest, err)} } } else { // normalize resources @@ -231,7 +231,7 @@ func (k *KubernetesRuntime) Import(ctx context.Context, request *runtime.ImportR if err := normalizeService(ur); err != nil { return &runtime.ImportResponse{ Resource: nil, - Status: status.NewErrorStatusWithCode(status.IllegalManifest, err), + Status: v1.NewErrorStatusWithCode(v1.IllegalManifest, err), } } } @@ -280,13 +280,13 @@ func (k *KubernetesRuntime) Delete(ctx context.Context, request *runtime.DeleteR requestResource := request.Resource // Validate if requestResource == nil { - return &runtime.DeleteResponse{Status: status.NewErrorStatus(errors.New("requestResource is nil"))} + return &runtime.DeleteResponse{Status: v1.NewErrorStatus(errors.New("requestResource is nil"))} } // Get Resource by attribute obj, resource, err := k.buildKubernetesResourceByState(requestResource) if err != nil { - return &runtime.DeleteResponse{Status: status.NewErrorStatus(err)} + return &runtime.DeleteResponse{Status: v1.NewErrorStatus(err)} } // Delete Resource @@ -296,7 +296,7 @@ func (k *KubernetesRuntime) Delete(ctx context.Context, request *runtime.DeleteR log.Infof("%s not found, ignore", requestResource.ResourceKey()) return &runtime.DeleteResponse{} } - return &runtime.DeleteResponse{Status: status.NewErrorStatus(err)} + return &runtime.DeleteResponse{Status: v1.NewErrorStatus(err)} } return &runtime.DeleteResponse{} @@ -305,18 +305,18 @@ func (k *KubernetesRuntime) Delete(ctx context.Context, request *runtime.DeleteR // Watch kubernetes resource by client-go func (k *KubernetesRuntime) Watch(ctx context.Context, request *runtime.WatchRequest) *runtime.WatchResponse { if request == nil || request.Resource == nil { - return &runtime.WatchResponse{Status: status.NewErrorStatus(errors.New("requestResource is nil"))} + return &runtime.WatchResponse{Status: v1.NewErrorStatus(errors.New("requestResource is nil"))} } reqObj, resource, err := k.buildKubernetesResourceByState(request.Resource) if err != nil { - return &runtime.WatchResponse{Status: status.NewErrorStatus(err)} + return &runtime.WatchResponse{Status: v1.NewErrorStatus(err)} } // Root watcher w, err := resource.Watch(ctx, metav1.ListOptions{}) if err != nil { - return &runtime.WatchResponse{Status: status.NewErrorStatus(err)} + return &runtime.WatchResponse{Status: v1.NewErrorStatus(err)} } rootCh := doWatch(ctx, w, func(watched *unstructured.Unstructured) bool { return watched.GetName() == reqObj.GetName() @@ -336,14 +336,14 @@ func (k *KubernetesRuntime) Watch(ctx context.Context, request *runtime.WatchReq namedGVK := getNamedGVK(reqObj.GroupVersionKind()) ch, dependent, err := k.WatchByRelation(ctx, reqObj, namedGVK, namedBy) if err != nil { - return &runtime.WatchResponse{Status: status.NewErrorStatus(err)} + return &runtime.WatchResponse{Status: v1.NewErrorStatus(err)} } watchers.Insert(engine.BuildIDForKubernetes(dependent), ch) } else { // Watch EndpointSlice dependentGVK := getDependentGVK(reqObj.GroupVersionKind()) ch, dependent, err := k.WatchByRelation(ctx, reqObj, dependentGVK, ownedBy) if err != nil { - return &runtime.WatchResponse{Status: status.NewErrorStatus(err)} + return &runtime.WatchResponse{Status: v1.NewErrorStatus(err)} } watchers.Insert(engine.BuildIDForKubernetes(dependent), ch) } @@ -355,7 +355,7 @@ func (k *KubernetesRuntime) Watch(ctx context.Context, request *runtime.WatchReq for !dependentGVK.Empty() { ch, dependent, err := k.WatchByRelation(ctx, owner, dependentGVK, ownedBy) if err != nil { - return &runtime.WatchResponse{Status: status.NewErrorStatus(err)} + return &runtime.WatchResponse{Status: v1.NewErrorStatus(err)} } if dependent == nil { @@ -375,7 +375,7 @@ func (k *KubernetesRuntime) Watch(ctx context.Context, request *runtime.WatchReq } // getKubernetesClient get kubernetes client -func getKubernetesClient(resource *intent.Resource) (dynamic.Interface, meta.RESTMapper, error) { +func getKubernetesClient(resource *apiv1.Resource) (dynamic.Interface, meta.RESTMapper, error) { // build config cfg, err := clientcmd.BuildConfigFromFlags("", kubeops.GetKubeConfig(resource)) if err != nil { @@ -402,7 +402,7 @@ func getKubernetesClient(resource *intent.Resource) (dynamic.Interface, meta.RES } // buildKubernetesResourceByState get resource by attribute -func (k *KubernetesRuntime) buildKubernetesResourceByState(resourceState *intent.Resource) (*unstructured.Unstructured, dynamic.ResourceInterface, error) { +func (k *KubernetesRuntime) buildKubernetesResourceByState(resourceState *apiv1.Resource) (*unstructured.Unstructured, dynamic.ResourceInterface, error) { // Convert interface{} to unstructured rYaml, err := yamlv2.Marshal(resourceState.Attributes) if err != nil { diff --git a/pkg/engine/runtime/kubernetes/kubernetes_runtime_test.go b/pkg/engine/runtime/kubernetes/kubernetes_runtime_test.go index 4854d1da..2e9e89f2 100644 --- a/pkg/engine/runtime/kubernetes/kubernetes_runtime_test.go +++ b/pkg/engine/runtime/kubernetes/kubernetes_runtime_test.go @@ -13,14 +13,14 @@ import ( "github.com/bytedance/mockey" yamlv3 "gopkg.in/yaml.v3" - "kusionstack.io/kusion/pkg/apis/intent" + "kusionstack.io/kusion/pkg/apis/core/v1" "kusionstack.io/kusion/pkg/engine/runtime" jsonutil "kusionstack.io/kusion/pkg/util/json" ) func TestKubernetesRuntime_Import(t *testing.T) { planServiceYaml, _ := os.ReadFile("testdata/plan_service.yaml") - planSvc := &intent.Resource{} + planSvc := &apiv1.Resource{} yamlv3.Unmarshal(planServiceYaml, planSvc) lastAppliedYaml, _ := os.ReadFile("testdata/live_service_with_last_applied_annotation.yaml") @@ -54,7 +54,7 @@ func TestKubernetesRuntime_Import(t *testing.T) { }{ctx: context.Background(), request: &runtime.ImportRequest{ PlanResource: planSvc, }}, want: &runtime.ImportResponse{ - Resource: &intent.Resource{ + Resource: &v1.Resource{ ID: planSvc.ResourceKey(), Type: planSvc.Type, Attributes: svcObj, @@ -69,7 +69,7 @@ func TestKubernetesRuntime_Import(t *testing.T) { PlanResource: planSvc, }, }, want: &runtime.ImportResponse{ - Resource: &intent.Resource{ + Resource: &v1.Resource{ ID: planSvc.ResourceKey(), Type: planSvc.Type, Attributes: liveSvcImpObj, @@ -87,7 +87,7 @@ func TestKubernetesRuntime_Import(t *testing.T) { ctx context.Context, request *runtime.ReadRequest, ) *runtime.ReadResponse { - return &runtime.ReadResponse{Resource: &intent.Resource{ + return &runtime.ReadResponse{Resource: &v1.Resource{ ID: planSvc.ResourceKey(), Type: planSvc.Type, Attributes: lastAppliedObj, @@ -109,7 +109,7 @@ func TestKubernetesRuntime_Import(t *testing.T) { ctx context.Context, request *runtime.ReadRequest, ) *runtime.ReadResponse { - return &runtime.ReadResponse{Resource: &intent.Resource{ + return &runtime.ReadResponse{Resource: &v1.Resource{ ID: planSvc.ResourceKey(), Type: planSvc.Type, Attributes: liveSvcObj, diff --git a/pkg/engine/runtime/runtime.go b/pkg/engine/runtime/runtime.go index b90e7b36..f5b0fd88 100644 --- a/pkg/engine/runtime/runtime.go +++ b/pkg/engine/runtime/runtime.go @@ -6,13 +6,12 @@ import ( "k8s.io/apimachinery/pkg/watch" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" - "kusionstack.io/kusion/pkg/apis/status" + v1 "kusionstack.io/kusion/pkg/apis/status/v1" ) const ( - Kubernetes intent.Type = "Kubernetes" - Terraform intent.Type = "Terraform" + Kubernetes apiv1.Type = "Kubernetes" + Terraform apiv1.Type = "Terraform" ) // Runtime represents an actual infrastructure runtime managed by Kusion and every runtime implements this interface can be orchestrated @@ -44,10 +43,10 @@ type Runtime interface { type ApplyRequest struct { // PriorResource is the last applied resource saved in state storage - PriorResource *intent.Resource + PriorResource *apiv1.Resource // PlanResource is the resource we want to apply in this request - PlanResource *intent.Resource + PlanResource *apiv1.Resource // Stack contains info about where this command is invoked Stack *apiv1.Stack @@ -58,18 +57,18 @@ type ApplyRequest struct { type ApplyResponse struct { // Resource is the result returned by Runtime - Resource *intent.Resource + Resource *apiv1.Resource // Status contains messages will show to users - Status status.Status + Status v1.Status } type ReadRequest struct { // PriorResource is the last applied resource saved in state storage - PriorResource *intent.Resource + PriorResource *apiv1.Resource // PlanResource is the resource we want to apply in this request - PlanResource *intent.Resource + PlanResource *apiv1.Resource // Stack contains info about where this command is invoked Stack *apiv1.Stack @@ -77,15 +76,15 @@ type ReadRequest struct { type ReadResponse struct { // Resource is the result read from the actual infra - Resource *intent.Resource + Resource *apiv1.Resource // Status contains messages will show to users - Status status.Status + Status v1.Status } type ImportRequest struct { // PlanResource is the resource we want to apply in this request - PlanResource *intent.Resource + PlanResource *apiv1.Resource // Stack contains info about where this command is invoked Stack *apiv1.Stack @@ -93,15 +92,15 @@ type ImportRequest struct { type ImportResponse struct { // Resource is the result returned by Runtime - Resource *intent.Resource + Resource *apiv1.Resource // Status contains messages will show to users - Status status.Status + Status v1.Status } type DeleteRequest struct { // Resource represents the resource we want to delete from the actual infra - Resource *intent.Resource + Resource *apiv1.Resource // Stack contains info about where this command is invoked Stack *apiv1.Stack @@ -109,19 +108,19 @@ type DeleteRequest struct { type DeleteResponse struct { // Status contains messages will show to users - Status status.Status + Status v1.Status } type WatchRequest struct { // Resource represents the resource we want to watch from the actual infra - Resource *intent.Resource + Resource *apiv1.Resource } type WatchResponse struct { Watchers *SequentialWatchers // Status contains messages will show to users - Status status.Status + Status v1.Status } type SequentialWatchers struct { diff --git a/pkg/engine/runtime/terraform/terraform_runtime.go b/pkg/engine/runtime/terraform/terraform_runtime.go index ac81391d..e503aab6 100644 --- a/pkg/engine/runtime/terraform/terraform_runtime.go +++ b/pkg/engine/runtime/terraform/terraform_runtime.go @@ -8,8 +8,8 @@ import ( "github.com/spf13/afero" - "kusionstack.io/kusion/pkg/apis/intent" - "kusionstack.io/kusion/pkg/apis/status" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" + v1 "kusionstack.io/kusion/pkg/apis/status/v1" "kusionstack.io/kusion/pkg/engine/runtime" "kusionstack.io/kusion/pkg/engine/runtime/terraform/tfops" "kusionstack.io/kusion/pkg/log" @@ -22,7 +22,7 @@ type TerraformRuntime struct { mu *sync.Mutex } -func NewTerraformRuntime(_ *intent.Resource) (runtime.Runtime, error) { +func NewTerraformRuntime(_ *apiv1.Resource) (runtime.Runtime, error) { fs := afero.Afero{Fs: afero.NewOsFs()} ws := tfops.NewWorkSpace(fs) TFRuntime := &TerraformRuntime{ @@ -45,17 +45,17 @@ func (t *TerraformRuntime) Apply(ctx context.Context, request *runtime.ApplyRequ t.WorkSpace.SetResource(plan) if err := t.WorkSpace.WriteHCL(); err != nil { - return &runtime.ApplyResponse{Resource: nil, Status: status.NewErrorStatus(err)} + return &runtime.ApplyResponse{Resource: nil, Status: v1.NewErrorStatus(err)} } _, err := os.Stat(filepath.Join(tfCacheDir, tfops.LockHCLFile)) if err != nil { if os.IsNotExist(err) { if err := t.WorkSpace.InitWorkSpace(ctx); err != nil { - return &runtime.ApplyResponse{Resource: nil, Status: status.NewErrorStatus(err)} + return &runtime.ApplyResponse{Resource: nil, Status: v1.NewErrorStatus(err)} } } else { - return &runtime.ApplyResponse{Resource: nil, Status: status.NewErrorStatus(err)} + return &runtime.ApplyResponse{Resource: nil, Status: v1.NewErrorStatus(err)} } } @@ -63,16 +63,16 @@ func (t *TerraformRuntime) Apply(ctx context.Context, request *runtime.ApplyRequ if request.DryRun { pr, err := t.WorkSpace.Plan(ctx) if err != nil { - return &runtime.ApplyResponse{Resource: nil, Status: status.NewErrorStatus(err)} + return &runtime.ApplyResponse{Resource: nil, Status: v1.NewErrorStatus(err)} } module := pr.PlannedValues.RootModule if len(module.Resources) == 0 { log.Debugf("no resource found in terraform plan file") - return &runtime.ApplyResponse{Resource: &intent.Resource{}, Status: nil} + return &runtime.ApplyResponse{Resource: &apiv1.Resource{}, Status: nil} } return &runtime.ApplyResponse{ - Resource: &intent.Resource{ + Resource: &apiv1.Resource{ ID: plan.ID, Type: plan.Type, Attributes: module.Resources[0].AttributeValues, @@ -85,19 +85,19 @@ func (t *TerraformRuntime) Apply(ctx context.Context, request *runtime.ApplyRequ tfstate, err := t.WorkSpace.Apply(ctx) if err != nil { - return &runtime.ApplyResponse{Resource: nil, Status: status.NewErrorStatus(err)} + return &runtime.ApplyResponse{Resource: nil, Status: v1.NewErrorStatus(err)} } // get terraform provider version providerAddr, err := t.WorkSpace.GetProvider() if err != nil { - return &runtime.ApplyResponse{Resource: nil, Status: status.NewErrorStatus(err)} + return &runtime.ApplyResponse{Resource: nil, Status: v1.NewErrorStatus(err)} } r := tfops.ConvertTFState(tfstate, providerAddr) return &runtime.ApplyResponse{ - Resource: &intent.Resource{ + Resource: &apiv1.Resource{ ID: plan.ID, Type: plan.Type, Attributes: r.Attributes, @@ -121,7 +121,7 @@ func (t *TerraformRuntime) Read(ctx context.Context, request *runtime.ReadReques // We only need to refresh the tf.state files and return the latest resources state in this method. // Most fields in attributes in resources aren't necessary for the command `terraform apply -refresh-only` and will make errors // if fields copied from kusion_state.json but read-only in main.tf.json - planResource = &intent.Resource{ + planResource = &apiv1.Resource{ ID: priorResource.ID, Type: priorResource.Type, Attributes: nil, @@ -143,27 +143,27 @@ func (t *TerraformRuntime) Read(ctx context.Context, request *runtime.ReadReques t.WorkSpace.SetResource(planResource) if err := t.WorkSpace.WriteHCL(); err != nil { - return &runtime.ReadResponse{Resource: nil, Status: status.NewErrorStatus(err)} + return &runtime.ReadResponse{Resource: nil, Status: v1.NewErrorStatus(err)} } _, err := os.Stat(filepath.Join(tfCacheDir, tfops.LockHCLFile)) if err != nil { if os.IsNotExist(err) { if err := t.WorkSpace.InitWorkSpace(ctx); err != nil { - return &runtime.ReadResponse{Resource: nil, Status: status.NewErrorStatus(err)} + return &runtime.ReadResponse{Resource: nil, Status: v1.NewErrorStatus(err)} } } else { - return &runtime.ReadResponse{Resource: nil, Status: status.NewErrorStatus(err)} + return &runtime.ReadResponse{Resource: nil, Status: v1.NewErrorStatus(err)} } } // priorResource overwrite tfstate in workspace if err = t.WorkSpace.WriteTFState(priorResource); err != nil { - return &runtime.ReadResponse{Resource: nil, Status: status.NewErrorStatus(err)} + return &runtime.ReadResponse{Resource: nil, Status: v1.NewErrorStatus(err)} } tfstate, err = t.WorkSpace.RefreshOnly(ctx) if err != nil { - return &runtime.ReadResponse{Resource: nil, Status: status.NewErrorStatus(err)} + return &runtime.ReadResponse{Resource: nil, Status: v1.NewErrorStatus(err)} } if tfstate == nil || tfstate.Values == nil { @@ -173,12 +173,12 @@ func (t *TerraformRuntime) Read(ctx context.Context, request *runtime.ReadReques // get terraform provider addr providerAddr, err := t.WorkSpace.GetProvider() if err != nil { - return &runtime.ReadResponse{Resource: nil, Status: status.NewErrorStatus(err)} + return &runtime.ReadResponse{Resource: nil, Status: v1.NewErrorStatus(err)} } r := tfops.ConvertTFState(tfstate, providerAddr) return &runtime.ReadResponse{ - Resource: &intent.Resource{ + Resource: &apiv1.Resource{ ID: planResource.ID, Type: planResource.Type, Attributes: r.Attributes, @@ -206,13 +206,13 @@ func (t *TerraformRuntime) Delete(ctx context.Context, request *runtime.DeleteRe t.WorkSpace.SetCacheDir(tfCacheDir) t.WorkSpace.SetResource(request.Resource) if err := t.WorkSpace.Destroy(ctx); err != nil { - return &runtime.DeleteResponse{Status: status.NewErrorStatus(err)} + return &runtime.DeleteResponse{Status: v1.NewErrorStatus(err)} } // delete tf directory after destroy operation is success err := os.RemoveAll(tfCacheDir) if err != nil { - return &runtime.DeleteResponse{Status: status.NewErrorStatus(err)} + return &runtime.DeleteResponse{Status: v1.NewErrorStatus(err)} } return &runtime.DeleteResponse{Status: nil} } diff --git a/pkg/engine/runtime/terraform/terraform_runtime_test.go b/pkg/engine/runtime/terraform/terraform_runtime_test.go index 7ac9f2b0..2409fbc1 100644 --- a/pkg/engine/runtime/terraform/terraform_runtime_test.go +++ b/pkg/engine/runtime/terraform/terraform_runtime_test.go @@ -14,12 +14,11 @@ import ( "github.com/stretchr/testify/assert" "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/engine/runtime" "kusionstack.io/kusion/pkg/engine/runtime/terraform/tfops" ) -var testResource = intent.Resource{ +var testResource = v1.Resource{ ID: "hashicorp:local:local_file:kusion_example", Type: "Terraform", Attributes: map[string]interface{}{ diff --git a/pkg/engine/runtime/terraform/tfops/state.go b/pkg/engine/runtime/terraform/tfops/state.go index 6b6c6238..d0f7ebf0 100644 --- a/pkg/engine/runtime/terraform/tfops/state.go +++ b/pkg/engine/runtime/terraform/tfops/state.go @@ -5,7 +5,7 @@ import ( "github.com/zclconf/go-cty/cty" - "kusionstack.io/kusion/pkg/apis/intent" + "kusionstack.io/kusion/pkg/apis/core/v1" ) // StateRepresentation is the top-level representation of the json format of a terraform @@ -108,16 +108,16 @@ type resource struct { type attributeValues map[string]interface{} // ConvertTFState convert Terraform State to kusion State -func ConvertTFState(tfState *StateRepresentation, providerAddr string) intent.Resource { +func ConvertTFState(tfState *StateRepresentation, providerAddr string) v1.Resource { if tfState == nil || tfState.Values == nil { - return intent.Resource{} + return v1.Resource{} } // terraform runtime execute single node tResource := tfState.Values.RootModule.Resources[0] extension := make(map[string]interface{}) extension["resourceType"] = tResource.Type extension["provider"] = providerAddr - r := intent.Resource{ + r := v1.Resource{ ID: tResource.Name, Type: "Terraform", Attributes: tResource.AttributeValues, diff --git a/pkg/engine/runtime/terraform/tfops/state_test.go b/pkg/engine/runtime/terraform/tfops/state_test.go index c42b7307..8c8c7a18 100644 --- a/pkg/engine/runtime/terraform/tfops/state_test.go +++ b/pkg/engine/runtime/terraform/tfops/state_test.go @@ -5,7 +5,7 @@ import ( "github.com/google/go-cmp/cmp" - "kusionstack.io/kusion/pkg/apis/intent" + "kusionstack.io/kusion/pkg/apis/core/v1" ) var providerAddr = "registry.terraform.io/hashicorp/local/2.2.3" @@ -13,7 +13,7 @@ var providerAddr = "registry.terraform.io/hashicorp/local/2.2.3" func TestConvertTFState(t *testing.T) { tests := map[string]struct { args StateRepresentation - want intent.Resource + want v1.Resource }{ "success": { args: StateRepresentation{ @@ -40,7 +40,7 @@ func TestConvertTFState(t *testing.T) { }, }, }, - want: intent.Resource{ + want: v1.Resource{ ID: "test", Type: "Terraform", Attributes: map[string]interface{}{ diff --git a/pkg/engine/runtime/terraform/tfops/workspace.go b/pkg/engine/runtime/terraform/tfops/workspace.go index 8254ce8d..a23c1bf8 100644 --- a/pkg/engine/runtime/terraform/tfops/workspace.go +++ b/pkg/engine/runtime/terraform/tfops/workspace.go @@ -16,7 +16,7 @@ import ( "github.com/hashicorp/hcl/v2/hclparse" "github.com/spf13/afero" - "kusionstack.io/kusion/pkg/apis/intent" + "kusionstack.io/kusion/pkg/apis/core/v1" "kusionstack.io/kusion/pkg/log" "kusionstack.io/kusion/pkg/util/io" jsonutil "kusionstack.io/kusion/pkg/util/json" @@ -40,14 +40,14 @@ const ( var envTFLog = fmt.Sprintf("%s=%s", envLog, tfDebugLOG) type WorkSpace struct { - resource *intent.Resource + resource *v1.Resource fs afero.Afero stackDir string tfCacheDir string } // SetResource set workspace resource -func (w *WorkSpace) SetResource(resource *intent.Resource) { +func (w *WorkSpace) SetResource(resource *v1.Resource) { w.resource = resource } @@ -122,7 +122,7 @@ func (w *WorkSpace) WriteHCL() error { } // WriteTFState writes StateRepresentation to the file, this function is for terraform apply refresh only -func (w *WorkSpace) WriteTFState(priorState *intent.Resource) error { +func (w *WorkSpace) WriteTFState(priorState *v1.Resource) error { provider := strings.Split(priorState.Extensions["provider"].(string), "/") resourceNames := strings.Split(w.resource.ResourceKey(), ":") if len(resourceNames) < 4 { diff --git a/pkg/engine/runtime/terraform/tfops/workspace_test.go b/pkg/engine/runtime/terraform/tfops/workspace_test.go index 191a7aec..7b04ec8d 100644 --- a/pkg/engine/runtime/terraform/tfops/workspace_test.go +++ b/pkg/engine/runtime/terraform/tfops/workspace_test.go @@ -16,13 +16,12 @@ import ( "github.com/spf13/afero" "github.com/zclconf/go-cty/cty" - "kusionstack.io/kusion/pkg/apis/intent" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" jsonutil "kusionstack.io/kusion/pkg/util/json" - // jsonutil "kusionstack.io/kusion/pkg/util/json" ) var ( - resourceTest = intent.Resource{ + resourceTest = apiv1.Resource{ ID: "hashicorp:local:local_file:kusion_example", Type: "Terraform", Attributes: map[string]interface{}{ @@ -302,7 +301,7 @@ func mockProviderAddr() { func TestWorkSpace_Plan(t *testing.T) { type fields struct { - resource *intent.Resource + resource *apiv1.Resource fs afero.Afero stackDir string tfCacheDir string @@ -320,7 +319,7 @@ func TestWorkSpace_Plan(t *testing.T) { { name: "plan", fields: struct { - resource *intent.Resource + resource *apiv1.Resource fs afero.Afero stackDir string tfCacheDir string @@ -353,7 +352,7 @@ func TestWorkSpace_Plan(t *testing.T) { func TestWorkSpace_ShowPlan(t *testing.T) { type fields struct { - resource *intent.Resource + resource *apiv1.Resource fs afero.Afero stackDir string tfCacheDir string diff --git a/pkg/engine/states/remote/mysql/mysql_state.go b/pkg/engine/states/remote/mysql/mysql_state.go index bed0c01f..6c4b1cdd 100644 --- a/pkg/engine/states/remote/mysql/mysql_state.go +++ b/pkg/engine/states/remote/mysql/mysql_state.go @@ -12,7 +12,7 @@ import ( "github.com/jinzhu/copier" "gopkg.in/yaml.v3" - "kusionstack.io/kusion/pkg/apis/intent" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" "kusionstack.io/kusion/pkg/engine/dal/mapper" "kusionstack.io/kusion/pkg/engine/states" "kusionstack.io/kusion/pkg/log" @@ -90,7 +90,7 @@ func (s *MysqlState) GetLatestState(q *states.StateQuery) (*states.State, error) } func do2Bo(dbState *mapper.StateDO) *states.State { - var resStateList []intent.Resource + var resStateList []apiv1.Resource // JSON is a subset of YAML. Please check FileSystemState.GetLatestState for detail explanation parseErr := yaml.Unmarshal([]byte(dbState.Resources), &resStateList) diff --git a/pkg/engine/states/state.go b/pkg/engine/states/state.go index 5a918f6a..0656fd58 100644 --- a/pkg/engine/states/state.go +++ b/pkg/engine/states/state.go @@ -3,7 +3,7 @@ package states import ( "time" - "kusionstack.io/kusion/pkg/apis/intent" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" "kusionstack.io/kusion/pkg/version" ) @@ -64,7 +64,7 @@ type State struct { Operator string `json:"operator,omitempty" yaml:"operator,omitempty"` // Resources records all resources in this operation - Resources intent.Resources `json:"resources" yaml:"resources"` + Resources apiv1.Resources `json:"resources" yaml:"resources"` // CreateTime is the time State is created CreateTime time.Time `json:"createTime" yaml:"createTime"` @@ -77,7 +77,7 @@ func NewState() *State { s := &State{ KusionVersion: version.ReleaseVersion(), Version: 1, - Resources: []intent.Resource{}, + Resources: []apiv1.Resource{}, } return s } diff --git a/pkg/engine/states/state_test.go b/pkg/engine/states/state_test.go index 078bd1e6..782a8f58 100644 --- a/pkg/engine/states/state_test.go +++ b/pkg/engine/states/state_test.go @@ -4,7 +4,7 @@ import ( "reflect" "testing" - "kusionstack.io/kusion/pkg/apis/intent" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" "kusionstack.io/kusion/pkg/version" ) @@ -18,7 +18,7 @@ func TestNewState(t *testing.T) { want: &State{ KusionVersion: version.ReleaseVersion(), Version: 1, - Resources: []intent.Resource{}, + Resources: []apiv1.Resource{}, }, }, } @@ -35,12 +35,12 @@ func TestResourceKey(t *testing.T) { tests := []struct { name string want string - resourceState *intent.Resource + resourceState *apiv1.Resource }{ { name: "t1", want: "kusion_test", - resourceState: &intent.Resource{ + resourceState: &apiv1.Resource{ ID: "kusion_test", Attributes: nil, }, @@ -59,17 +59,17 @@ func TestResourceKey(t *testing.T) { func TestResources_Index(t *testing.T) { tests := []struct { name string - rs intent.Resources - want map[string]*intent.Resource + rs apiv1.Resources + want map[string]*apiv1.Resource }{ { name: "t1", - rs: []intent.Resource{ + rs: []apiv1.Resource{ { ID: "a", }, }, - want: map[string]*intent.Resource{ + want: map[string]*apiv1.Resource{ "a": { ID: "a", }, @@ -89,12 +89,12 @@ func TestResources_Index(t *testing.T) { func TestResources_Len(t *testing.T) { tests := []struct { name string - rs intent.Resources + rs apiv1.Resources want int }{ { name: "t1", - rs: []intent.Resource{ + rs: []apiv1.Resource{ { ID: "c", }, @@ -118,12 +118,12 @@ func TestResources_Swap(t *testing.T) { } tests := []struct { name string - rs intent.Resources + rs apiv1.Resources args args }{ { name: "t1", - rs: []intent.Resource{ + rs: []apiv1.Resource{ { ID: "test", }, @@ -145,13 +145,13 @@ func TestResources_Less(t *testing.T) { } tests := []struct { name string - rs intent.Resources + rs apiv1.Resources args args want bool }{ { name: "t1", - rs: []intent.Resource{ + rs: []apiv1.Resource{ { ID: "a", }, @@ -164,7 +164,7 @@ func TestResources_Less(t *testing.T) { }, { name: "t2", - rs: []intent.Resource{ + rs: []apiv1.Resource{ { ID: "a", }, @@ -177,7 +177,7 @@ func TestResources_Less(t *testing.T) { }, { name: "t3", - rs: []intent.Resource{ + rs: []apiv1.Resource{ { ID: "a", }, diff --git a/pkg/modules/generators/accessories/database/alicloud_rds.go b/pkg/modules/generators/accessories/database/alicloud_rds.go index 9b5f285f..dbcb0967 100644 --- a/pkg/modules/generators/accessories/database/alicloud_rds.go +++ b/pkg/modules/generators/accessories/database/alicloud_rds.go @@ -7,7 +7,7 @@ import ( v1 "k8s.io/api/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" "kusionstack.io/kusion/pkg/modules" "kusionstack.io/kusion/pkg/modules/inputs" "kusionstack.io/kusion/pkg/modules/inputs/accessories/database" @@ -32,7 +32,7 @@ type alicloudServerlessConfig struct { MinCapacity int `yaml:"min_capacity,omitempty" json:"min_capacity,omitempty"` } -func (g *databaseGenerator) generateAlicloudResources(db *database.Database, spec *intent.Intent) (*v1.Secret, error) { +func (g *databaseGenerator) generateAlicloudResources(db *database.Database, spec *apiv1.Intent) (*v1.Secret, error) { // Set the terraform random and alicloud provider. randomProvider := &inputs.Provider{} if err := randomProvider.SetString(randomProviderURL); err != nil { @@ -90,7 +90,7 @@ func (g *databaseGenerator) generateAlicloudDBInstance( region string, provider *inputs.Provider, db *database.Database, -) (string, intent.Resource) { +) (string, apiv1.Resource) { dbAttrs := map[string]interface{}{ "category": db.Category, "engine": db.Engine, @@ -132,7 +132,7 @@ func (g *databaseGenerator) generateAlicloudDBInstance( func (g *databaseGenerator) generateAlicloudDBConnection( dbInstanceID, region string, provider *inputs.Provider, -) (string, intent.Resource) { +) (string, apiv1.Resource) { dbConnectionAttrs := map[string]interface{}{ "instance_id": modules.KusionPathDependency(dbInstanceID, "id"), } @@ -147,7 +147,7 @@ func (g *databaseGenerator) generateAlicloudDBConnection( func (g *databaseGenerator) generateAlicloudRDSAccount( accountName, randomPasswordID, dbInstanceID, region string, provider *inputs.Provider, db *database.Database, -) intent.Resource { +) apiv1.Resource { rdsAccountAttrs := map[string]interface{}{ "account_name": accountName, "account_password": modules.KusionPathDependency(randomPasswordID, "result"), diff --git a/pkg/modules/generators/accessories/database/alicloud_rds_test.go b/pkg/modules/generators/accessories/database/alicloud_rds_test.go index 105ca2c4..49d4427a 100644 --- a/pkg/modules/generators/accessories/database/alicloud_rds_test.go +++ b/pkg/modules/generators/accessories/database/alicloud_rds_test.go @@ -8,7 +8,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/modules/inputs" "kusionstack.io/kusion/pkg/modules/inputs/accessories/database" "kusionstack.io/kusion/pkg/modules/inputs/workload" @@ -46,7 +45,7 @@ func TestGenerateAlicloudResources(t *testing.T) { } alicloudProviderRegion = "cn-beijing" - spec := &intent.Intent{} + spec := &apiv1.Intent{} secret, err := generator.generateAlicloudResources(database, spec) hostAddress := "$kusion_path.aliyun:alicloud:alicloud_db_instance:testapp.connection_string" @@ -109,7 +108,7 @@ func TestGenerateAlicloudDBInstance(t *testing.T) { alicloudDBInstanceID, r := generator.generateAlicloudDBInstance(alicloudProviderRegion, alicloudProvider, database) expectedAlicloudDBInstanceID := "aliyun:alicloud:alicloud_db_instance:testapp" - expectedRes := intent.Resource{ + expectedRes := apiv1.Resource{ ID: "aliyun:alicloud:alicloud_db_instance:testapp", Type: "Terraform", Attributes: map[string]interface{}{ @@ -182,7 +181,7 @@ func TestGenerateAlicloudDBConnection(t *testing.T) { dbInstanceID := "aliyun:alicloud:alicloud_db_instance:testapp" alicloudDBConnectionID, r := generator.generateAlicloudDBConnection(dbInstanceID, alicloudProviderRegion, alicloudProvider) expectedAlicloudDBConnectionID := "aliyun:alicloud:alicloud_db_connection:testapp" - expectedRes := intent.Resource{ + expectedRes := apiv1.Resource{ ID: "aliyun:alicloud:alicloud_db_connection:testapp", Type: "Terraform", Attributes: map[string]interface{}{ @@ -241,7 +240,7 @@ func TestGenerateAlicloudRDSAccount(t *testing.T) { alicloudDBInstanceID := "aliyun:alicloud:alicloud_db_instance:testapp" r := generator.generateAlicloudRDSAccount(accountName, randomPasswordID, alicloudDBInstanceID, alicloudProviderRegion, alicloudProvider, database) - expectedRes := intent.Resource{ + expectedRes := apiv1.Resource{ ID: "aliyun:alicloud:alicloud_rds_account:testapp", Type: "Terraform", Attributes: map[string]interface{}{ diff --git a/pkg/modules/generators/accessories/database/aws_rds.go b/pkg/modules/generators/accessories/database/aws_rds.go index 1ee8ec86..c4803a0d 100644 --- a/pkg/modules/generators/accessories/database/aws_rds.go +++ b/pkg/modules/generators/accessories/database/aws_rds.go @@ -6,7 +6,7 @@ import ( v1 "k8s.io/api/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" "kusionstack.io/kusion/pkg/modules" "kusionstack.io/kusion/pkg/modules/inputs" "kusionstack.io/kusion/pkg/modules/inputs/accessories/database" @@ -35,7 +35,7 @@ type awsSecurityGroupTraffic struct { ToPort int `yaml:"to_port" json:"to_port"` } -func (g *databaseGenerator) generateAWSResources(db *database.Database, spec *intent.Intent) (*v1.Secret, error) { +func (g *databaseGenerator) generateAWSResources(db *database.Database, spec *apiv1.Intent) (*v1.Secret, error) { // Set the terraform random and aws provider. randomProvider := &inputs.Provider{} if err := randomProvider.SetString(randomProviderURL); err != nil { @@ -85,12 +85,12 @@ func (g *databaseGenerator) generateAWSSecurityGroup( provider *inputs.Provider, region string, db *database.Database, -) (string, intent.Resource, error) { +) (string, apiv1.Resource, error) { // SecurityIPs should be in the format of IP address or Classes Inter-Domain // Routing (CIDR) mode. for _, ip := range db.SecurityIPs { if !isIPAddress(ip) && !isCIDR(ip) { - return "", intent.Resource{}, fmt.Errorf("illegal security ip format: %v", ip) + return "", apiv1.Resource{}, fmt.Errorf("illegal security ip format: %v", ip) } } @@ -124,7 +124,7 @@ func (g *databaseGenerator) generateAWSSecurityGroup( func (g *databaseGenerator) generateAWSDBInstance( region, awsSecurityGroupID, randomPasswordID string, provider *inputs.Provider, db *database.Database, -) (string, intent.Resource) { +) (string, apiv1.Resource) { dbAttrs := map[string]interface{}{ "allocated_storage": db.Size, "engine": db.Engine, diff --git a/pkg/modules/generators/accessories/database/aws_rds_test.go b/pkg/modules/generators/accessories/database/aws_rds_test.go index efebe064..41fad6a2 100644 --- a/pkg/modules/generators/accessories/database/aws_rds_test.go +++ b/pkg/modules/generators/accessories/database/aws_rds_test.go @@ -8,7 +8,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/modules/inputs" "kusionstack.io/kusion/pkg/modules/inputs/accessories/database" "kusionstack.io/kusion/pkg/modules/inputs/workload" @@ -40,7 +39,7 @@ func TestGenerateAWSResources(t *testing.T) { } awsProviderRegion = "us-east-1" - spec := &intent.Intent{} + spec := &apiv1.Intent{} secret, err := generator.generateAWSResources(database, spec) hostAddress := "$kusion_path.hashicorp:aws:aws_db_instance:testapp.address" @@ -98,7 +97,7 @@ func TestGenerateAWSSecurityGroup(t *testing.T) { var cidrBlocks []string awsSecurityGroupID, r, err := generator.generateAWSSecurityGroup(awsProvider, awsProviderRegion, database) expectedAWSSecurityGroupID := "hashicorp:aws:aws_security_group:testapp-db" - expectedRes := intent.Resource{ + expectedRes := apiv1.Resource{ ID: "hashicorp:aws:aws_security_group:testapp-db", Type: "Terraform", Attributes: map[string]interface{}{ @@ -167,7 +166,7 @@ func TestGenerateAWSDBInstance(t *testing.T) { awsDBInstanceID, r := generator.generateAWSDBInstance(awsProviderRegion, awsSecurityGroupID, randomPasswordID, awsProvider, database) expectedAWSDBInstanceID := "hashicorp:aws:aws_db_instance:testapp" - expectedRes := intent.Resource{ + expectedRes := apiv1.Resource{ ID: "hashicorp:aws:aws_db_instance:testapp", Type: "Terraform", Attributes: map[string]interface{}{ diff --git a/pkg/modules/generators/accessories/database/database_generator.go b/pkg/modules/generators/accessories/database/database_generator.go index 9e127a75..e161ea7b 100644 --- a/pkg/modules/generators/accessories/database/database_generator.go +++ b/pkg/modules/generators/accessories/database/database_generator.go @@ -10,7 +10,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/modules" "kusionstack.io/kusion/pkg/modules/inputs" "kusionstack.io/kusion/pkg/modules/inputs/accessories/database" @@ -66,9 +65,9 @@ func NewDatabaseGeneratorFunc( } } -func (g *databaseGenerator) Generate(spec *intent.Intent) error { +func (g *databaseGenerator) Generate(spec *apiv1.Intent) error { if spec.Resources == nil { - spec.Resources = make(intent.Resources, 0) + spec.Resources = make(apiv1.Resources, 0) } // Skip rendering for empty database instance. @@ -132,7 +131,7 @@ func (g *databaseGenerator) injectSecret(secret *v1.Secret) error { return nil } -func (g *databaseGenerator) generateTFRandomPassword(provider *inputs.Provider) (string, intent.Resource) { +func (g *databaseGenerator) generateTFRandomPassword(provider *inputs.Provider) (string, apiv1.Resource) { pswAttrs := map[string]interface{}{ "length": 16, "special": true, @@ -145,7 +144,7 @@ func (g *databaseGenerator) generateTFRandomPassword(provider *inputs.Provider) return id, modules.TerraformResource(id, nil, pswAttrs, pvdExts) } -func (g *databaseGenerator) generateDBSecret(hostAddress, username, password string, spec *intent.Intent) (*v1.Secret, error) { +func (g *databaseGenerator) generateDBSecret(hostAddress, username, password string, spec *apiv1.Intent) (*v1.Secret, error) { // Create the data map of k8s secret storing the database host address, username // and password. data := make(map[string]string) @@ -167,7 +166,7 @@ func (g *databaseGenerator) generateDBSecret(hostAddress, username, password str } return secret, modules.AppendToIntent( - intent.Kubernetes, + apiv1.Kubernetes, modules.KubernetesResourceID(secret.TypeMeta, secret.ObjectMeta), spec, secret, diff --git a/pkg/modules/generators/accessories/database/database_generator_test.go b/pkg/modules/generators/accessories/database/database_generator_test.go index abb5422d..bb8cdb85 100644 --- a/pkg/modules/generators/accessories/database/database_generator_test.go +++ b/pkg/modules/generators/accessories/database/database_generator_test.go @@ -9,7 +9,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/modules/inputs" "kusionstack.io/kusion/pkg/modules/inputs/accessories/database" "kusionstack.io/kusion/pkg/modules/inputs/workload" @@ -52,14 +51,14 @@ func TestGenerate(t *testing.T) { generator, _ := NewDatabaseGenerator(project, stack, appName, workload, database) awsProviderRegion = "us-east-1" - spec := &intent.Intent{} + spec := &apiv1.Intent{} err := generator.Generate(spec) var providerMeta map[string]interface{} var cidrBlocks []string - expectedSpec := &intent.Intent{ - Resources: intent.Resources{ - intent.Resource{ + expectedSpec := &apiv1.Intent{ + Resources: apiv1.Resources{ + apiv1.Resource{ ID: "hashicorp:random:random_password:testapp-db", Type: "Terraform", Attributes: map[string]interface{}{ @@ -73,7 +72,7 @@ func TestGenerate(t *testing.T) { "resourceType": "random_password", }, }, - intent.Resource{ + apiv1.Resource{ ID: "hashicorp:aws:aws_security_group:testapp-db", Type: "Terraform", Attributes: map[string]interface{}{ @@ -102,7 +101,7 @@ func TestGenerate(t *testing.T) { "resourceType": "aws_security_group", }, }, - intent.Resource{ + apiv1.Resource{ ID: "hashicorp:aws:aws_db_instance:testapp", Type: "Terraform", Attributes: map[string]interface{}{ @@ -127,7 +126,7 @@ func TestGenerate(t *testing.T) { "resourceType": "aws_db_instance", }, }, - intent.Resource{ + apiv1.Resource{ ID: "v1:Secret:testproject:testapp-db", Type: "Kubernetes", Attributes: map[string]interface{}{ @@ -255,7 +254,7 @@ func TestGenerateTFRandomPassword(t *testing.T) { var providerMeta map[string]interface{} id, res := generator.generateTFRandomPassword(randomProvider) expectedID := "hashicorp:random:random_password:testapp-db" - expectedRes := intent.Resource{ + expectedRes := apiv1.Resource{ ID: "hashicorp:random:random_password:testapp-db", Type: "Terraform", Attributes: map[string]interface{}{ @@ -292,7 +291,7 @@ func TestGenerateDBSeret(t *testing.T) { database: database, } - spec := &intent.Intent{} + spec := &apiv1.Intent{} hostAddress := "$kusion_path.hashicorp:aws:aws_db_instance:testapp.address" username := database.Username password := "$kusion_path.hashicorp:random:random_password:testapp-db.result" diff --git a/pkg/modules/generators/accessories/database/local_database.go b/pkg/modules/generators/accessories/database/local_database.go index b66a26e4..99a4e418 100644 --- a/pkg/modules/generators/accessories/database/local_database.go +++ b/pkg/modules/generators/accessories/database/local_database.go @@ -12,7 +12,7 @@ import ( "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "kusionstack.io/kusion/pkg/apis/intent" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" "kusionstack.io/kusion/pkg/modules" "kusionstack.io/kusion/pkg/modules/inputs/accessories/database" ) @@ -26,7 +26,7 @@ var ( localMatchLabels = map[string]string{"accessory": localDatabaseName} ) -func (g *databaseGenerator) generateLocalResources(db *database.Database, spec *intent.Intent) (*v1.Secret, error) { +func (g *databaseGenerator) generateLocalResources(db *database.Database, spec *apiv1.Intent) (*v1.Secret, error) { // Build k8s secret for local database's random password. password, err := g.generateLocalSecret(spec) if err != nil { @@ -52,7 +52,7 @@ func (g *databaseGenerator) generateLocalResources(db *database.Database, spec * return g.generateDBSecret(hostAddress, db.Username, password, spec) } -func (g *databaseGenerator) generateLocalSecret(spec *intent.Intent) (string, error) { +func (g *databaseGenerator) generateLocalSecret(spec *apiv1.Intent) (string, error) { password := g.generateLocalPassword(16) data := make(map[string]string) @@ -73,14 +73,14 @@ func (g *databaseGenerator) generateLocalSecret(spec *intent.Intent) (string, er // Fixme: return $kusion_path with `stringData.password` of local database secret id. return password, modules.AppendToIntent( - intent.Kubernetes, + apiv1.Kubernetes, secID, spec, secret, ) } -func (g *databaseGenerator) generateLocalPVC(db *database.Database, spec *intent.Intent) error { +func (g *databaseGenerator) generateLocalPVC(db *database.Database, spec *apiv1.Intent) error { // Create the k8s pvc with the storage size of `db.Size`. pvc := &v1.PersistentVolumeClaim{ TypeMeta: metav1.TypeMeta{ @@ -105,14 +105,14 @@ func (g *databaseGenerator) generateLocalPVC(db *database.Database, spec *intent } return modules.AppendToIntent( - intent.Kubernetes, + apiv1.Kubernetes, modules.KubernetesResourceID(pvc.TypeMeta, pvc.ObjectMeta), spec, pvc, ) } -func (g *databaseGenerator) generateLocalDeployment(db *database.Database, spec *intent.Intent) error { +func (g *databaseGenerator) generateLocalDeployment(db *database.Database, spec *apiv1.Intent) error { // Prepare the pod spec for specific local database. podSpec, err := g.generateLocalPodSpec(db) if err != nil { @@ -143,14 +143,14 @@ func (g *databaseGenerator) generateLocalDeployment(db *database.Database, spec } return modules.AppendToIntent( - intent.Kubernetes, + apiv1.Kubernetes, modules.KubernetesResourceID(deployment.TypeMeta, deployment.ObjectMeta), spec, deployment, ) } -func (g *databaseGenerator) generateLocalService(db *database.Database, spec *intent.Intent) (string, error) { +func (g *databaseGenerator) generateLocalService(db *database.Database, spec *apiv1.Intent) (string, error) { // Prepare the service port for specific local database. svcPort, err := g.generateLocalSvcPort(db) if err != nil { @@ -177,7 +177,7 @@ func (g *databaseGenerator) generateLocalService(db *database.Database, spec *in } return svcName, modules.AppendToIntent( - intent.Kubernetes, + apiv1.Kubernetes, modules.KubernetesResourceID(service.TypeMeta, service.ObjectMeta), spec, service, diff --git a/pkg/modules/generators/accessories/database/local_database_test.go b/pkg/modules/generators/accessories/database/local_database_test.go index 35b29a69..bb746b1e 100644 --- a/pkg/modules/generators/accessories/database/local_database_test.go +++ b/pkg/modules/generators/accessories/database/local_database_test.go @@ -8,7 +8,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/modules/inputs/accessories/database" "kusionstack.io/kusion/pkg/modules/inputs/workload" ) @@ -37,7 +36,7 @@ func TestGenerateLocalResources(t *testing.T) { database: database, } - spec := &intent.Intent{} + spec := &apiv1.Intent{} secret, err := generator.generateLocalResources(database, spec) hostAddress := "testapp-db-local-service" @@ -87,7 +86,7 @@ func TestGenerateLocalSecret(t *testing.T) { database: database, } - spec := &intent.Intent{} + spec := &apiv1.Intent{} password, err := generator.generateLocalSecret(spec) expectedPassword := generator.generateLocalPassword(16) @@ -119,7 +118,7 @@ func TestGenerateLocalPVC(t *testing.T) { database: database, } - spec := &intent.Intent{} + spec := &apiv1.Intent{} err := generator.generateLocalPVC(database, spec) assert.NoError(t, err) @@ -149,7 +148,7 @@ func TestGenerateLocalDeployment(t *testing.T) { database: database, } - spec := &intent.Intent{} + spec := &apiv1.Intent{} err := generator.generateLocalDeployment(database, spec) assert.NoError(t, err) @@ -179,7 +178,7 @@ func TestGenerateLocalService(t *testing.T) { database: database, } - spec := &intent.Intent{} + spec := &apiv1.Intent{} svcName, err := generator.generateLocalService(database, spec) expectedSvcName := "testapp-db-local-service" diff --git a/pkg/modules/generators/app_configurations_generator.go b/pkg/modules/generators/app_configurations_generator.go index 51dbea29..7186d52d 100644 --- a/pkg/modules/generators/app_configurations_generator.go +++ b/pkg/modules/generators/app_configurations_generator.go @@ -4,8 +4,7 @@ import ( "errors" "fmt" - "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" "kusionstack.io/kusion/pkg/modules" accessories "kusionstack.io/kusion/pkg/modules/generators/accessories/database" "kusionstack.io/kusion/pkg/modules/generators/monitoring" @@ -18,19 +17,19 @@ import ( ) type appConfigurationGenerator struct { - project *v1.Project - stack *v1.Stack + project *apiv1.Project + stack *apiv1.Stack appName string app *inputs.AppConfiguration - ws *v1.Workspace + ws *apiv1.Workspace } func NewAppConfigurationGenerator( - project *v1.Project, - stack *v1.Stack, + project *apiv1.Project, + stack *apiv1.Stack, appName string, app *inputs.AppConfiguration, - ws *v1.Workspace, + ws *apiv1.Workspace, ) (modules.Generator, error) { if len(project.Name) == 0 { return nil, fmt.Errorf("project name must not be empty") @@ -61,20 +60,20 @@ func NewAppConfigurationGenerator( } func NewAppConfigurationGeneratorFunc( - project *v1.Project, - stack *v1.Stack, + project *apiv1.Project, + stack *apiv1.Stack, appName string, app *inputs.AppConfiguration, - ws *v1.Workspace, + ws *apiv1.Workspace, ) modules.NewGeneratorFunc { return func() (modules.Generator, error) { return NewAppConfigurationGenerator(project, stack, appName, app, ws) } } -func (g *appConfigurationGenerator) Generate(i *intent.Intent) error { +func (g *appConfigurationGenerator) Generate(i *apiv1.Intent) error { if i.Resources == nil { - i.Resources = make(intent.Resources, 0) + i.Resources = make(apiv1.Resources, 0) } // retrieve the module configs of the specified project diff --git a/pkg/modules/generators/app_configurations_generator_test.go b/pkg/modules/generators/app_configurations_generator_test.go index 1dadc976..cf606ffc 100644 --- a/pkg/modules/generators/app_configurations_generator_test.go +++ b/pkg/modules/generators/app_configurations_generator_test.go @@ -6,7 +6,6 @@ import ( "github.com/stretchr/testify/assert" "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" appmodel "kusionstack.io/kusion/pkg/modules/inputs" "kusionstack.io/kusion/pkg/modules/inputs/workload" "kusionstack.io/kusion/pkg/modules/inputs/workload/network" @@ -25,8 +24,8 @@ func TestAppConfigurationGenerator_Generate(t *testing.T) { ws: ws, } - spec := &intent.Intent{ - Resources: []intent.Resource{}, + spec := &v1.Intent{ + Resources: []v1.Resource{}, } err := g.Generate(spec) diff --git a/pkg/modules/generators/monitoring/monitoring_generator.go b/pkg/modules/generators/monitoring/monitoring_generator.go index f0bae84b..75748753 100644 --- a/pkg/modules/generators/monitoring/monitoring_generator.go +++ b/pkg/modules/generators/monitoring/monitoring_generator.go @@ -7,7 +7,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/modules" "kusionstack.io/kusion/pkg/modules/inputs/monitoring" ) @@ -47,9 +46,9 @@ func NewMonitoringGeneratorFunc( } } -func (g *monitoringGenerator) Generate(spec *intent.Intent) error { +func (g *monitoringGenerator) Generate(spec *apiv1.Intent) error { if spec.Resources == nil { - spec.Resources = make(intent.Resources, 0) + spec.Resources = make(apiv1.Resources, 0) } // If Prometheus runs as an operator, it relies on Custom Resources to @@ -91,7 +90,7 @@ func (g *monitoringGenerator) Generate(spec *intent.Intent) error { }, } err := modules.AppendToIntent( - intent.Kubernetes, + apiv1.Kubernetes, modules.KubernetesResourceID(serviceMonitor.TypeMeta, serviceMonitor.ObjectMeta), spec, serviceMonitor, @@ -124,7 +123,7 @@ func (g *monitoringGenerator) Generate(spec *intent.Intent) error { } err := modules.AppendToIntent( - intent.Kubernetes, + apiv1.Kubernetes, modules.KubernetesResourceID(podMonitor.TypeMeta, podMonitor.ObjectMeta), spec, podMonitor, diff --git a/pkg/modules/generators/monitoring/monitoring_generator_test.go b/pkg/modules/generators/monitoring/monitoring_generator_test.go index 02977a59..1109eebc 100644 --- a/pkg/modules/generators/monitoring/monitoring_generator_test.go +++ b/pkg/modules/generators/monitoring/monitoring_generator_test.go @@ -9,7 +9,6 @@ import ( "github.com/stretchr/testify/require" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/modules/inputs/monitoring" ) @@ -20,14 +19,14 @@ type Fields struct { } type Args struct { - spec *intent.Intent + spec *apiv1.Intent } type TestCase struct { name string fields Fields args Args - want *intent.Intent + want *apiv1.Intent wantErr bool } @@ -47,9 +46,9 @@ func BuildMonitoringTestCase( monitorKind = "PodMonitor" endpointType = "podMetricsEndpoints" } - expectedResources := make([]intent.Resource, 0) + expectedResources := make([]apiv1.Resource, 0) if operatorMode { - expectedResources = []intent.Resource{ + expectedResources = []apiv1.Resource{ { ID: fmt.Sprintf("monitoring.coreos.com/v1:%s:%s:%s-%s-monitor", monitorKind, projectName, appName, strings.ToLower(string(monitorType))), Type: "Kubernetes", @@ -110,9 +109,9 @@ func BuildMonitoringTestCase( appName: appName, }, args: Args{ - spec: &intent.Intent{}, + spec: &apiv1.Intent{}, }, - want: &intent.Intent{ + want: &apiv1.Intent{ Resources: expectedResources, }, wantErr: false, diff --git a/pkg/modules/generators/namespace_generator.go b/pkg/modules/generators/namespace_generator.go index a8f19d0b..45fa2d88 100644 --- a/pkg/modules/generators/namespace_generator.go +++ b/pkg/modules/generators/namespace_generator.go @@ -7,7 +7,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/modules" "kusionstack.io/kusion/pkg/workspace" ) @@ -38,9 +37,9 @@ func NewNamespaceGeneratorFunc(projectName string, workspace *apiv1.Workspace) m } } -func (g *namespaceGenerator) Generate(i *intent.Intent) error { +func (g *namespaceGenerator) Generate(i *apiv1.Intent) error { if i.Resources == nil { - i.Resources = make(intent.Resources, 0) + i.Resources = make(apiv1.Resources, 0) } ns := &corev1.Namespace{ @@ -59,7 +58,7 @@ func (g *namespaceGenerator) Generate(i *intent.Intent) error { } } - return modules.AppendToIntent(intent.Kubernetes, id, i, ns) + return modules.AppendToIntent(apiv1.Kubernetes, id, i, ns) } // getName obtains the name for this Namespace using the following precedence diff --git a/pkg/modules/generators/namespace_generator_test.go b/pkg/modules/generators/namespace_generator_test.go index 679cb7e2..dda2400c 100644 --- a/pkg/modules/generators/namespace_generator_test.go +++ b/pkg/modules/generators/namespace_generator_test.go @@ -5,23 +5,22 @@ import ( "github.com/stretchr/testify/require" - "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" ) func Test_namespaceGenerator_Generate(t *testing.T) { type fields struct { projectName string - moduleInputs map[string]v1.GenericConfig + moduleInputs map[string]apiv1.GenericConfig } type args struct { - intent *intent.Intent + intent *apiv1.Intent } tests := []struct { name string fields fields args args - want *intent.Intent + want *apiv1.Intent wantErr bool }{ { @@ -30,10 +29,10 @@ func Test_namespaceGenerator_Generate(t *testing.T) { projectName: "fake-project", }, args: args{ - intent: &intent.Intent{}, + intent: &apiv1.Intent{}, }, - want: &intent.Intent{ - Resources: []intent.Resource{ + want: &apiv1.Intent{ + Resources: []apiv1.Resource{ { ID: "v1:Namespace:fake-project", Type: "Kubernetes", @@ -60,17 +59,17 @@ func Test_namespaceGenerator_Generate(t *testing.T) { name: "customize_namespace", fields: fields{ projectName: "beep", - moduleInputs: map[string]v1.GenericConfig{ + moduleInputs: map[string]apiv1.GenericConfig{ "namespace": { "name": "foo", }, }, }, args: args{ - intent: &intent.Intent{}, + intent: &apiv1.Intent{}, }, - want: &intent.Intent{ - Resources: []intent.Resource{ + want: &apiv1.Intent{ + Resources: []apiv1.Resource{ { ID: "v1:Namespace:foo", Type: "Kubernetes", @@ -97,17 +96,17 @@ func Test_namespaceGenerator_Generate(t *testing.T) { name: "mismatch_module_input", fields: fields{ projectName: "beep", - moduleInputs: map[string]v1.GenericConfig{ + moduleInputs: map[string]apiv1.GenericConfig{ "namespace": { "type": "foo", }, }, }, args: args{ - intent: &intent.Intent{}, + intent: &apiv1.Intent{}, }, - want: &intent.Intent{ - Resources: []intent.Resource{ + want: &apiv1.Intent{ + Resources: []apiv1.Resource{ { ID: "v1:Namespace:beep", Type: "Kubernetes", diff --git a/pkg/modules/generators/ordered_resources_generator.go b/pkg/modules/generators/ordered_resources_generator.go index 633def49..8b58c45c 100644 --- a/pkg/modules/generators/ordered_resources_generator.go +++ b/pkg/modules/generators/ordered_resources_generator.go @@ -3,7 +3,7 @@ package generators import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "kusionstack.io/kusion/pkg/apis/intent" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" "kusionstack.io/kusion/pkg/engine/runtime" "kusionstack.io/kusion/pkg/modules" ) @@ -60,9 +60,9 @@ func NewOrderedResourcesGeneratorFunc(multipleOrderedKinds ...[]string) modules. } // Generate inject the dependsOn of resources in a specified order. -func (g *orderedResourcesGenerator) Generate(itt *intent.Intent) error { +func (g *orderedResourcesGenerator) Generate(itt *apiv1.Intent) error { if itt.Resources == nil { - itt.Resources = make(intent.Resources, 0) + itt.Resources = make(apiv1.Resources, 0) } for i := 0; i < len(itt.Resources); i++ { @@ -79,7 +79,7 @@ func (g *orderedResourcesGenerator) Generate(itt *intent.Intent) error { return nil } -type resource intent.Resource +type resource apiv1.Resource // kubernetesKind returns the kubernetes kind of the given resource. func (r resource) kubernetesKind() string { @@ -89,7 +89,7 @@ func (r resource) kubernetesKind() string { } // injectDependsOn injects all dependsOn relationships for the given resource and dependent kinds. -func (r *resource) injectDependsOn(orderedKinds []string, rs []intent.Resource) { +func (r *resource) injectDependsOn(orderedKinds []string, rs []apiv1.Resource) { kinds := r.findDependKinds(orderedKinds) for _, kind := range kinds { drs := findDependResources(kind, rs) @@ -98,7 +98,7 @@ func (r *resource) injectDependsOn(orderedKinds []string, rs []intent.Resource) } // appendDependsOn injects dependsOn relationships for the given resource and dependent resources. -func (r *resource) appendDependsOn(dependResources []*intent.Resource) { +func (r *resource) appendDependsOn(dependResources []*apiv1.Resource) { for _, dr := range dependResources { r.DependsOn = append(r.DependsOn, dr.ID) } @@ -118,8 +118,8 @@ func (r *resource) findDependKinds(orderedKinds []string) []string { } // findDependResources returns the dependent resources of the specified kind. -func findDependResources(dependKind string, rs []intent.Resource) []*intent.Resource { - var dependResources []*intent.Resource +func findDependResources(dependKind string, rs []apiv1.Resource) []*apiv1.Resource { + var dependResources []*apiv1.Resource for i := 0; i < len(rs); i++ { if resource(rs[i]).kubernetesKind() == dependKind { dependResources = append(dependResources, &rs[i]) diff --git a/pkg/modules/generators/ordered_resources_generator_test.go b/pkg/modules/generators/ordered_resources_generator_test.go index 901c9c87..00ae0aea 100644 --- a/pkg/modules/generators/ordered_resources_generator_test.go +++ b/pkg/modules/generators/ordered_resources_generator_test.go @@ -5,7 +5,7 @@ import ( "github.com/stretchr/testify/assert" - "kusionstack.io/kusion/pkg/apis/intent" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" "kusionstack.io/kusion/pkg/engine/runtime" ) @@ -46,9 +46,9 @@ var ( "name": "foo", }, } - genOldSpec = func() *intent.Intent { - return &intent.Intent{ - Resources: intent.Resources{ + genOldSpec = func() *apiv1.Intent { + return &apiv1.Intent{ + Resources: apiv1.Resources{ { ID: "apps/v1:Deployment:foo:bar", Type: runtime.Kubernetes, @@ -67,9 +67,9 @@ var ( }, } } - genNewSpec = func() *intent.Intent { - return &intent.Intent{ - Resources: intent.Resources{ + genNewSpec = func() *apiv1.Intent { + return &apiv1.Intent{ + Resources: apiv1.Resources{ { ID: "apps/v1:Deployment:foo:bar", Type: runtime.Kubernetes, @@ -123,7 +123,7 @@ func TestInjectAllDependsOn(t *testing.T) { dependKinds := []string{"Namespace"} expected := []string{"v1:Namespace:foo"} - actual := resource([]intent.Resource(spec.Resources)[0]) + actual := resource([]apiv1.Resource(spec.Resources)[0]) actual.injectDependsOn(dependKinds, spec.Resources) assert.Equal(t, expected, actual.DependsOn) @@ -166,7 +166,7 @@ func TestFindDependResources(t *testing.T) { dependKind := "Namespace" resources := genOldSpec().Resources - expected := []*intent.Resource{ + expected := []*apiv1.Resource{ { ID: "v1:Namespace:foo", Type: runtime.Kubernetes, diff --git a/pkg/modules/generators/trait/ops_rule_generator.go b/pkg/modules/generators/trait/ops_rule_generator.go index f51b7027..a1f777b8 100644 --- a/pkg/modules/generators/trait/ops_rule_generator.go +++ b/pkg/modules/generators/trait/ops_rule_generator.go @@ -6,7 +6,6 @@ import ( "kusionstack.io/kube-api/apps/v1alpha1" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/modules" appmodule "kusionstack.io/kusion/pkg/modules/inputs" "kusionstack.io/kusion/pkg/modules/inputs/workload" @@ -44,7 +43,7 @@ func NewOpsRuleGeneratorFunc( } } -func (g *opsRuleGenerator) Generate(spec *intent.Intent) error { +func (g *opsRuleGenerator) Generate(spec *apiv1.Intent) error { if g.app.OpsRule == nil { return nil } @@ -81,7 +80,7 @@ func (g *opsRuleGenerator) Generate(spec *intent.Intent) error { }, }, } - return modules.AppendToIntent(intent.Kubernetes, modules.KubernetesResourceID(resource.TypeMeta, resource.ObjectMeta), spec, resource) + return modules.AppendToIntent(apiv1.Kubernetes, modules.KubernetesResourceID(resource.TypeMeta, resource.ObjectMeta), spec, resource) } return nil } diff --git a/pkg/modules/generators/trait/ops_rule_generator_test.go b/pkg/modules/generators/trait/ops_rule_generator_test.go index 78aba56d..0f4b317e 100644 --- a/pkg/modules/generators/trait/ops_rule_generator_test.go +++ b/pkg/modules/generators/trait/ops_rule_generator_test.go @@ -6,7 +6,6 @@ import ( "github.com/stretchr/testify/require" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" appmodule "kusionstack.io/kusion/pkg/modules/inputs" "kusionstack.io/kusion/pkg/modules/inputs/trait" "kusionstack.io/kusion/pkg/modules/inputs/workload" @@ -20,7 +19,7 @@ func Test_opsRuleGenerator_Generate(t *testing.T) { app *appmodule.AppConfiguration } type args struct { - spec *intent.Intent + spec *apiv1.Intent } project := &apiv1.Project{ Name: "default", @@ -34,7 +33,7 @@ func Test_opsRuleGenerator_Generate(t *testing.T) { fields fields args args wantErr bool - exp *intent.Intent + exp *apiv1.Intent }{ { name: "test Job", @@ -54,10 +53,10 @@ func Test_opsRuleGenerator_Generate(t *testing.T) { }, }, args: args{ - spec: &intent.Intent{}, + spec: &apiv1.Intent{}, }, wantErr: false, - exp: &intent.Intent{}, + exp: &apiv1.Intent{}, }, { name: "test CollaSet", @@ -80,12 +79,12 @@ func Test_opsRuleGenerator_Generate(t *testing.T) { }, }, args: args{ - spec: &intent.Intent{}, + spec: &apiv1.Intent{}, }, wantErr: false, - exp: &intent.Intent{ - Resources: intent.Resources{ - intent.Resource{ + exp: &apiv1.Intent{ + Resources: apiv1.Resources{ + apiv1.Resource{ ID: "apps.kusionstack.io/v1alpha1:PodTransitionRule:default:default-dev-foo", Type: "Kubernetes", Attributes: map[string]interface{}{ diff --git a/pkg/modules/generators/workload/job_generator.go b/pkg/modules/generators/workload/job_generator.go index e5d3ee17..070bf83f 100644 --- a/pkg/modules/generators/workload/job_generator.go +++ b/pkg/modules/generators/workload/job_generator.go @@ -8,7 +8,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/modules" "kusionstack.io/kusion/pkg/modules/inputs/workload" ) @@ -49,14 +48,14 @@ func NewJobGeneratorFunc( } } -func (g *jobGenerator) Generate(spec *intent.Intent) error { +func (g *jobGenerator) Generate(spec *apiv1.Intent) error { job := g.job if job == nil { return nil } if spec.Resources == nil { - spec.Resources = make(intent.Resources, 0) + spec.Resources = make(apiv1.Resources, 0) } if err := completeBaseWorkload(&g.job.Base, g.jobConfig); err != nil { @@ -86,7 +85,7 @@ func (g *jobGenerator) Generate(spec *intent.Intent) error { cmObj := cm cmObj.Namespace = g.project.Name if err = modules.AppendToIntent( - intent.Kubernetes, + apiv1.Kubernetes, modules.KubernetesResourceID(cmObj.TypeMeta, cmObj.ObjectMeta), spec, &cmObj, @@ -123,7 +122,7 @@ func (g *jobGenerator) Generate(spec *intent.Intent) error { }, Spec: jobSpec, } - return modules.AppendToIntent(intent.Kubernetes, modules.KubernetesResourceID(resource.TypeMeta, resource.ObjectMeta), spec, resource) + return modules.AppendToIntent(apiv1.Kubernetes, modules.KubernetesResourceID(resource.TypeMeta, resource.ObjectMeta), spec, resource) } resource := &batchv1.CronJob{ @@ -139,5 +138,5 @@ func (g *jobGenerator) Generate(spec *intent.Intent) error { Schedule: job.Schedule, }, } - return modules.AppendToIntent(intent.Kubernetes, modules.KubernetesResourceID(resource.TypeMeta, resource.ObjectMeta), spec, resource) + return modules.AppendToIntent(apiv1.Kubernetes, modules.KubernetesResourceID(resource.TypeMeta, resource.ObjectMeta), spec, resource) } diff --git a/pkg/modules/generators/workload/job_generator_test.go b/pkg/modules/generators/workload/job_generator_test.go index 05c907e9..77e6112d 100644 --- a/pkg/modules/generators/workload/job_generator_test.go +++ b/pkg/modules/generators/workload/job_generator_test.go @@ -7,7 +7,6 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/modules" "kusionstack.io/kusion/pkg/modules/inputs/workload" ) @@ -96,7 +95,7 @@ func TestJobGenerator_Generate(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { generator, _ := NewJobGenerator(tc.expectedProject, tc.expectedStack, tc.expectedAppName, tc.expectedJob, tc.expectedJobConfig) - spec := &intent.Intent{} + spec := &apiv1.Intent{} err := generator.Generate(spec) assert.NoError(t, err, "Error should be nil") diff --git a/pkg/modules/generators/workload/network/ports_generator.go b/pkg/modules/generators/workload/network/ports_generator.go index ae66bc68..c7e43c20 100644 --- a/pkg/modules/generators/workload/network/ports_generator.go +++ b/pkg/modules/generators/workload/network/ports_generator.go @@ -9,7 +9,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" - "kusionstack.io/kusion/pkg/apis/intent" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" "kusionstack.io/kusion/pkg/modules" "kusionstack.io/kusion/pkg/modules/inputs/workload/network" ) @@ -89,7 +89,7 @@ func NewPortsGeneratorFunc( } // Generate renders k8s ClusterIP or LoadBalancer service from the portsGenerator. -func (g *portsGenerator) Generate(spec *intent.Intent) error { +func (g *portsGenerator) Generate(spec *apiv1.Intent) error { privatePorts, publicPorts := splitPorts(g.ports) if len(privatePorts) != 0 { svc := g.generateK8sSvc(false, privatePorts) @@ -261,7 +261,7 @@ func toSvcPorts(name string, ports []network.Port) []v1.ServicePort { return svcPorts } -func appendToSpec(spec *intent.Intent, svc *v1.Service) error { +func appendToSpec(spec *apiv1.Intent, svc *v1.Service) error { id := modules.KubernetesResourceID(svc.TypeMeta, svc.ObjectMeta) - return modules.AppendToIntent(intent.Kubernetes, id, spec, svc) + return modules.AppendToIntent(apiv1.Kubernetes, id, spec, svc) } diff --git a/pkg/modules/generators/workload/network/ports_generator_test.go b/pkg/modules/generators/workload/network/ports_generator_test.go index 39c8f649..7ab62755 100644 --- a/pkg/modules/generators/workload/network/ports_generator_test.go +++ b/pkg/modules/generators/workload/network/ports_generator_test.go @@ -9,7 +9,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/intstr" - "kusionstack.io/kusion/pkg/apis/intent" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" "kusionstack.io/kusion/pkg/modules/inputs/workload/network" ) @@ -81,7 +81,7 @@ func TestPortsGenerator_Generate(t *testing.T) { portsGenerator } type args struct { - spec *intent.Intent + spec *apiv1.Intent } tests := []struct { @@ -126,9 +126,9 @@ func TestPortsGenerator_Generate(t *testing.T) { }, }, args: struct { - spec *intent.Intent + spec *apiv1.Intent }{ - spec: &intent.Intent{}, + spec: &apiv1.Intent{}, }, wantErr: false, }, diff --git a/pkg/modules/generators/workload/secret/secret_generator.go b/pkg/modules/generators/workload/secret/secret_generator.go index 9a630cdf..10766554 100644 --- a/pkg/modules/generators/workload/secret/secret_generator.go +++ b/pkg/modules/generators/workload/secret/secret_generator.go @@ -8,7 +8,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/modules" "kusionstack.io/kusion/pkg/modules/inputs/workload" ) @@ -41,9 +40,9 @@ func NewSecretGeneratorFunc( } } -func (g *secretGenerator) Generate(spec *intent.Intent) error { +func (g *secretGenerator) Generate(spec *apiv1.Intent) error { if spec.Resources == nil { - spec.Resources = make(intent.Resources, 0) + spec.Resources = make(apiv1.Resources, 0) } for secretName, secretRef := range g.secrets { @@ -54,7 +53,7 @@ func (g *secretGenerator) Generate(spec *intent.Intent) error { resourceID := modules.KubernetesResourceID(secret.TypeMeta, secret.ObjectMeta) err = modules.AppendToIntent( - intent.Kubernetes, + apiv1.Kubernetes, resourceID, spec, secret, diff --git a/pkg/modules/generators/workload/secret/secret_generator_test.go b/pkg/modules/generators/workload/secret/secret_generator_test.go index 6c1910ab..20af65e7 100644 --- a/pkg/modules/generators/workload/secret/secret_generator_test.go +++ b/pkg/modules/generators/workload/secret/secret_generator_test.go @@ -6,7 +6,6 @@ import ( "github.com/stretchr/testify/require" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/modules/inputs/workload" ) @@ -82,7 +81,7 @@ func TestGenerateSecret(t *testing.T) { Data: test.secretData, }, } - intent := &intent.Intent{} + intent := &apiv1.Intent{} generator, _ := NewSecretGenerator(project, secrets) err := generator.Generate(intent) if test.expectErr == "" { diff --git a/pkg/modules/generators/workload/service_generator.go b/pkg/modules/generators/workload/service_generator.go index fc76f840..179b375f 100644 --- a/pkg/modules/generators/workload/service_generator.go +++ b/pkg/modules/generators/workload/service_generator.go @@ -10,7 +10,6 @@ import ( "kusionstack.io/kube-api/apps/v1alpha1" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/modules" "kusionstack.io/kusion/pkg/modules/inputs/workload" "kusionstack.io/kusion/pkg/workspace" @@ -70,7 +69,7 @@ func NewWorkloadServiceGeneratorFunc( } // Generate generates a service workload resource to the given spec. -func (g *workloadServiceGenerator) Generate(spec *intent.Intent) error { +func (g *workloadServiceGenerator) Generate(spec *apiv1.Intent) error { service := g.service if service == nil { return nil @@ -78,7 +77,7 @@ func (g *workloadServiceGenerator) Generate(spec *intent.Intent) error { // Create an empty resource slice if it doesn't exist yet. if spec.Resources == nil { - spec.Resources = make(intent.Resources, 0) + spec.Resources = make(apiv1.Resources, 0) } if err := completeServiceInput(g.service, g.serviceConfig); err != nil { @@ -99,7 +98,7 @@ func (g *workloadServiceGenerator) Generate(spec *intent.Intent) error { cmObj := cm cmObj.Namespace = g.project.Name if err = modules.AppendToIntent( - intent.Kubernetes, + apiv1.Kubernetes, modules.KubernetesResourceID(cmObj.TypeMeta, cmObj.ObjectMeta), spec, &cmObj, @@ -167,7 +166,7 @@ func (g *workloadServiceGenerator) Generate(spec *intent.Intent) error { } // Add the Deployment resource to the spec. - if err = modules.AppendToIntent(intent.Kubernetes, modules.KubernetesResourceID(typeMeta, objectMeta), spec, resource); err != nil { + if err = modules.AppendToIntent(apiv1.Kubernetes, modules.KubernetesResourceID(typeMeta, objectMeta), spec, resource); err != nil { return err } diff --git a/pkg/modules/generators/workload/service_generator_test.go b/pkg/modules/generators/workload/service_generator_test.go index 1184afe9..3fedd789 100644 --- a/pkg/modules/generators/workload/service_generator_test.go +++ b/pkg/modules/generators/workload/service_generator_test.go @@ -9,7 +9,6 @@ import ( "gopkg.in/yaml.v3" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/modules/inputs/workload" "kusionstack.io/kusion/pkg/modules/inputs/workload/container" "kusionstack.io/kusion/pkg/modules/inputs/workload/network" @@ -170,7 +169,7 @@ status: {} serviceConfig apiv1.GenericConfig } type args struct { - spec *intent.Intent + spec *apiv1.Intent } tests := []struct { @@ -226,7 +225,7 @@ status: {} }, }, args: args{ - spec: &intent.Intent{}, + spec: &apiv1.Intent{}, }, wantErr: false, want: []string{cm, cs, csSvc}, @@ -273,7 +272,7 @@ status: {} }, }, args: args{ - spec: &intent.Intent{}, + spec: &apiv1.Intent{}, }, wantErr: false, want: []string{cm, deploy, deploySvc}, diff --git a/pkg/modules/generators/workload/workload_generator.go b/pkg/modules/generators/workload/workload_generator.go index 2774c12a..7e4aec7d 100644 --- a/pkg/modules/generators/workload/workload_generator.go +++ b/pkg/modules/generators/workload/workload_generator.go @@ -16,7 +16,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/modules" "kusionstack.io/kusion/pkg/modules/generators/workload/secret" "kusionstack.io/kusion/pkg/modules/inputs/workload" @@ -65,9 +64,9 @@ func NewWorkloadGeneratorFunc( } } -func (g *workloadGenerator) Generate(spec *intent.Intent) error { +func (g *workloadGenerator) Generate(spec *apiv1.Intent) error { if spec.Resources == nil { - spec.Resources = make(intent.Resources, 0) + spec.Resources = make(apiv1.Resources, 0) } if g.workload != nil { diff --git a/pkg/modules/generators/workload/workload_generator_test.go b/pkg/modules/generators/workload/workload_generator_test.go index 012d4075..3d61e852 100644 --- a/pkg/modules/generators/workload/workload_generator_test.go +++ b/pkg/modules/generators/workload/workload_generator_test.go @@ -8,7 +8,6 @@ import ( "gopkg.in/yaml.v2" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/modules" "kusionstack.io/kusion/pkg/modules/inputs/workload" "kusionstack.io/kusion/pkg/modules/inputs/workload/container" @@ -135,7 +134,7 @@ func TestWorkloadGenerator_Generate(t *testing.T) { } actualGenerator, _ := NewWorkloadGenerator(expectedProject, expectedStack, expectedAppName, tc.expectedWorkload, expectedModuleConfigs) - spec := &intent.Intent{} + spec := &apiv1.Intent{} err := actualGenerator.Generate(spec) assert.NoError(t, err, "Error should be nil") assert.NotNil(t, spec.Resources, "Resources should not be nil") diff --git a/pkg/modules/patchers/monitoring/monitoring_patcher.go b/pkg/modules/patchers/monitoring/monitoring_patcher.go index a8c5f0e4..23f75220 100644 --- a/pkg/modules/patchers/monitoring/monitoring_patcher.go +++ b/pkg/modules/patchers/monitoring/monitoring_patcher.go @@ -6,7 +6,6 @@ import ( "kusionstack.io/kube-api/apps/v1alpha1" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/modules" modelsapp "kusionstack.io/kusion/pkg/modules/inputs" ) @@ -34,7 +33,7 @@ func NewMonitoringPatcherFunc(appName string, app *modelsapp.AppConfiguration, p } // Patch implements Patcher interface. -func (p *monitoringPatcher) Patch(resources map[string][]*intent.Resource) error { +func (p *monitoringPatcher) Patch(resources map[string][]*apiv1.Resource) error { if p.app.Monitoring == nil || p.project.Prometheus == nil { return nil } diff --git a/pkg/modules/patchers/monitoring/monitoring_patcher_test.go b/pkg/modules/patchers/monitoring/monitoring_patcher_test.go index be799dba..f73852a6 100644 --- a/pkg/modules/patchers/monitoring/monitoring_patcher_test.go +++ b/pkg/modules/patchers/monitoring/monitoring_patcher_test.go @@ -10,15 +10,14 @@ import ( "k8s.io/apimachinery/pkg/runtime" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/modules" modelsapp "kusionstack.io/kusion/pkg/modules/inputs" "kusionstack.io/kusion/pkg/modules/inputs/monitoring" ) func Test_monitoringPatcher_Patch(t *testing.T) { - i := &intent.Intent{} - err := modules.AppendToIntent(intent.Kubernetes, "id", i, buildMockDeployment()) + i := &apiv1.Intent{} + err := modules.AppendToIntent(apiv1.Kubernetes, "id", i, buildMockDeployment()) if err != nil { t.Fatal(err) } @@ -29,7 +28,7 @@ func Test_monitoringPatcher_Patch(t *testing.T) { project *apiv1.Project } type args struct { - resources map[string][]*intent.Resource + resources map[string][]*apiv1.Resource } tests := []struct { name string diff --git a/pkg/modules/patchers/trait/ops_rule_patcher.go b/pkg/modules/patchers/trait/ops_rule_patcher.go index 012b8c01..9f2af928 100644 --- a/pkg/modules/patchers/trait/ops_rule_patcher.go +++ b/pkg/modules/patchers/trait/ops_rule_patcher.go @@ -4,7 +4,7 @@ import ( appsv1 "k8s.io/api/apps/v1" "k8s.io/apimachinery/pkg/util/intstr" - "kusionstack.io/kusion/pkg/apis/intent" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" "kusionstack.io/kusion/pkg/modules" modelsapp "kusionstack.io/kusion/pkg/modules/inputs" ) @@ -28,7 +28,7 @@ func NewOpsRulePatcher(app *modelsapp.AppConfiguration) (modules.Patcher, error) } // Patch implements Patcher interface. -func (p *opsRulePatcher) Patch(resources map[string][]*intent.Resource) error { +func (p *opsRulePatcher) Patch(resources map[string][]*apiv1.Resource) error { if p.app.OpsRule == nil { return nil } diff --git a/pkg/modules/patchers/trait/ops_rule_patcher_test.go b/pkg/modules/patchers/trait/ops_rule_patcher_test.go index 5a57ede3..83b957d8 100644 --- a/pkg/modules/patchers/trait/ops_rule_patcher_test.go +++ b/pkg/modules/patchers/trait/ops_rule_patcher_test.go @@ -9,15 +9,15 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/intstr" - "kusionstack.io/kusion/pkg/apis/intent" + apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" "kusionstack.io/kusion/pkg/modules" modelsapp "kusionstack.io/kusion/pkg/modules/inputs" "kusionstack.io/kusion/pkg/modules/inputs/trait" ) func Test_opsRulePatcher_Patch(t *testing.T) { - i := &intent.Intent{} - err := modules.AppendToIntent(intent.Kubernetes, "id", i, buildMockDeployment()) + i := &apiv1.Intent{} + err := modules.AppendToIntent(apiv1.Kubernetes, "id", i, buildMockDeployment()) if err != nil { t.Fatal(err) } @@ -26,7 +26,7 @@ func Test_opsRulePatcher_Patch(t *testing.T) { app *modelsapp.AppConfiguration } type args struct { - resources map[string][]*intent.Resource + resources map[string][]*apiv1.Resource } tests := []struct { name string diff --git a/pkg/modules/types.go b/pkg/modules/types.go index 62a6931f..c955fc38 100644 --- a/pkg/modules/types.go +++ b/pkg/modules/types.go @@ -3,7 +3,7 @@ package modules import ( appsv1 "k8s.io/api/apps/v1" - "kusionstack.io/kusion/pkg/apis/intent" + "kusionstack.io/kusion/pkg/apis/core/v1" ) // GVKDeployment is the GroupVersionKind of Deployment @@ -11,12 +11,12 @@ var GVKDeployment = appsv1.SchemeGroupVersion.WithKind("Deployment").String() // Generator is the interface that wraps the Generate method. type Generator interface { - Generate(intent *intent.Intent) error + Generate(intent *v1.Intent) error } // Patcher is the interface that wraps the Patch method. type Patcher interface { - Patch(resources map[string][]*intent.Resource) error + Patch(resources map[string][]*v1.Resource) error } // NewGeneratorFunc is a function that returns a Generator. diff --git a/pkg/modules/util.go b/pkg/modules/util.go index edf6e967..11be8cea 100644 --- a/pkg/modules/util.go +++ b/pkg/modules/util.go @@ -8,7 +8,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" "kusionstack.io/kusion/pkg/modules/inputs" "kusionstack.io/kusion/pkg/workspace" ) @@ -29,7 +28,7 @@ func CallGeneratorFuncs(newGenerators ...NewGeneratorFunc) ([]Generator, error) // CallGenerators calls the Generate method of each Generator instance // returned by the given NewGeneratorFuncs. -func CallGenerators(i *intent.Intent, newGenerators ...NewGeneratorFunc) error { +func CallGenerators(i *apiv1.Intent, newGenerators ...NewGeneratorFunc) error { gs, err := CallGeneratorFuncs(newGenerators...) if err != nil { return err @@ -44,7 +43,7 @@ func CallGenerators(i *intent.Intent, newGenerators ...NewGeneratorFunc) error { // CallPatchers calls the Patch method of each Generator instance // returned by the given NewPatcherFuncs. -func CallPatchers(resources map[string][]*intent.Resource, newPatchers ...NewPatcherFunc) error { +func CallPatchers(resources map[string][]*apiv1.Resource, newPatchers ...NewPatcherFunc) error { ps := make([]Patcher, 0, len(newPatchers)) for _, newPatcher := range newPatchers { if p, err := newPatcher(); err != nil { @@ -122,10 +121,10 @@ func KubernetesResourceID(typeMeta metav1.TypeMeta, objectMeta metav1.ObjectMeta } // TerraformResource returns the Terraform resource in the form of Intent.Resource -func TerraformResource(id string, dependsOn []string, attrs, exts map[string]interface{}) intent.Resource { - return intent.Resource{ +func TerraformResource(id string, dependsOn []string, attrs, exts map[string]interface{}) apiv1.Resource { + return apiv1.Resource{ ID: id, - Type: intent.Terraform, + Type: apiv1.Terraform, Attributes: attrs, DependsOn: dependsOn, Extensions: exts, @@ -156,9 +155,9 @@ func KusionPathDependency(id, name string) string { } // AppendToIntent adds a Kubernetes resource to the Intent resources slice. -func AppendToIntent(resourceType intent.Type, resourceID string, i *intent.Intent, resource any) error { +func AppendToIntent(resourceType apiv1.Type, resourceID string, i *apiv1.Intent, resource any) error { // this function is only used for Kubernetes resources - if resourceType != intent.Kubernetes { + if resourceType != apiv1.Kubernetes { return errors.New("AppendToIntent is only used for Kubernetes resources") } @@ -167,13 +166,13 @@ func AppendToIntent(resourceType intent.Type, resourceID string, i *intent.Inten if err != nil { return err } - r := intent.Resource{ + r := apiv1.Resource{ ID: resourceID, Type: resourceType, Attributes: unstructured, DependsOn: nil, Extensions: map[string]any{ - intent.ResourceExtensionGVK: gvk, + apiv1.ResourceExtensionGVK: gvk, }, } i.Resources = append(i.Resources, r) @@ -194,7 +193,7 @@ func UniqueAppLabels(projectName, appName string) map[string]string { } // PatchResource patches the resource with the given patch. -func PatchResource[T any](resources map[string][]*intent.Resource, gvk string, patchFunc func(*T) error) error { +func PatchResource[T any](resources map[string][]*apiv1.Resource, gvk string, patchFunc func(*T) error) error { var obj T for _, r := range resources[gvk] { // convert unstructured to typed object @@ -218,18 +217,18 @@ func PatchResource[T any](resources map[string][]*intent.Resource, gvk string, p // AddKubeConfigIf adds kubeConfig from workspace to extensions of Kubernetes type resource in intent. // If there is already has kubeConfig in extensions, use the kubeConfig in extensions. -func AddKubeConfigIf(i *intent.Intent, ws *apiv1.Workspace) { +func AddKubeConfigIf(i *apiv1.Intent, ws *apiv1.Workspace) { config := workspace.GetKubernetesConfig(ws.Runtimes) if config == nil || config.KubeConfig == "" { return } for n, resource := range i.Resources { - if resource.Type == intent.Kubernetes { + if resource.Type == apiv1.Kubernetes { if resource.Extensions == nil { i.Resources[n].Extensions = make(map[string]any) } - if extensionsKubeConfig, ok := resource.Extensions[intent.ResourceExtensionKubeConfig]; !ok || extensionsKubeConfig == "" { - i.Resources[n].Extensions[intent.ResourceExtensionKubeConfig] = config.KubeConfig + if extensionsKubeConfig, ok := resource.Extensions[apiv1.ResourceExtensionKubeConfig]; !ok || extensionsKubeConfig == "" { + i.Resources[n].Extensions[apiv1.ResourceExtensionKubeConfig] = config.KubeConfig } } } diff --git a/pkg/modules/util_test.go b/pkg/modules/util_test.go index 5eb24c75..9dd40080 100644 --- a/pkg/modules/util_test.go +++ b/pkg/modules/util_test.go @@ -8,36 +8,35 @@ import ( v1 "k8s.io/apimachinery/pkg/apis/meta/v1" apiv1 "kusionstack.io/kusion/pkg/apis/core/v1" - "kusionstack.io/kusion/pkg/apis/intent" ) type mockGenerator struct { - GenerateFunc func(intent *intent.Intent) error + GenerateFunc func(intent *apiv1.Intent) error } -func (m *mockGenerator) Generate(i *intent.Intent) error { +func (m *mockGenerator) Generate(i *apiv1.Intent) error { return m.GenerateFunc(i) } type mockPatcher struct { - PatchFunc func(resources map[string][]*intent.Resource) error + PatchFunc func(resources map[string][]*apiv1.Resource) error } -func (m *mockPatcher) Patch(resources map[string][]*intent.Resource) error { +func (m *mockPatcher) Patch(resources map[string][]*apiv1.Resource) error { return m.PatchFunc(resources) } func TestCallGenerators(t *testing.T) { - i := &intent.Intent{} + i := &apiv1.Intent{} var ( generator1 Generator = &mockGenerator{ - GenerateFunc: func(intent *intent.Intent) error { + GenerateFunc: func(intent *apiv1.Intent) error { return nil }, } generator2 Generator = &mockGenerator{ - GenerateFunc: func(intent *intent.Intent) error { + GenerateFunc: func(intent *apiv1.Intent) error { return assert.AnError }, } @@ -53,12 +52,12 @@ func TestCallGenerators(t *testing.T) { func TestCallPatchers(t *testing.T) { var ( patcher1 Patcher = &mockPatcher{ - PatchFunc: func(resources map[string][]*intent.Resource) error { + PatchFunc: func(resources map[string][]*apiv1.Resource) error { return nil }, } patcher2 Patcher = &mockPatcher{ - PatchFunc: func(resources map[string][]*intent.Resource) error { + PatchFunc: func(resources map[string][]*apiv1.Resource) error { return assert.AnError }, } @@ -153,8 +152,8 @@ func TestKubernetesResourceID(t *testing.T) { } func TestAppendToIntent(t *testing.T) { - i := &intent.Intent{} - resource := &intent.Resource{ + i := &apiv1.Intent{} + resource := &apiv1.Resource{ ID: "v1:Namespace:fake-project", Type: "Kubernetes", Attributes: map[string]interface{}{ @@ -181,14 +180,14 @@ func TestAppendToIntent(t *testing.T) { }, } - err := AppendToIntent(intent.Kubernetes, resource.ID, i, ns) + err := AppendToIntent(apiv1.Kubernetes, resource.ID, i, ns) assert.NoError(t, err) assert.Len(t, i.Resources, 1) assert.Equal(t, resource.ID, i.Resources[0].ID) assert.Equal(t, resource.Type, i.Resources[0].Type) assert.Equal(t, resource.Attributes, i.Resources[0].Attributes) - assert.Equal(t, ns.GroupVersionKind().String(), i.Resources[0].Extensions[intent.ResourceExtensionGVK]) + assert.Equal(t, ns.GroupVersionKind().String(), i.Resources[0].Extensions[apiv1.ResourceExtensionGVK]) } func TestUniqueAppName(t *testing.T) { @@ -217,7 +216,7 @@ func TestUniqueAppLabels(t *testing.T) { } func TestPatchResource(t *testing.T) { - resources := map[string][]*intent.Resource{ + resources := map[string][]*apiv1.Resource{ "/v1, Kind=Namespace": { { ID: "v1:Namespace:default", @@ -257,14 +256,14 @@ func TestAddKubeConfigIf(t *testing.T) { testcases := []struct { name string ws *apiv1.Workspace - i *intent.Intent - expectedIntent *intent.Intent + i *apiv1.Intent + expectedIntent *apiv1.Intent }{ { name: "empty workspace runtime config", ws: &apiv1.Workspace{Name: "dev"}, - i: &intent.Intent{ - Resources: intent.Resources{ + i: &apiv1.Intent{ + Resources: apiv1.Resources{ { ID: "mock-id-1", Type: "Kubernetes", @@ -275,8 +274,8 @@ func TestAddKubeConfigIf(t *testing.T) { }, }, }, - expectedIntent: &intent.Intent{ - Resources: intent.Resources{ + expectedIntent: &apiv1.Intent{ + Resources: apiv1.Resources{ { ID: "mock-id-1", Type: "Kubernetes", @@ -296,8 +295,8 @@ func TestAddKubeConfigIf(t *testing.T) { Kubernetes: &apiv1.KubernetesConfig{}, }, }, - i: &intent.Intent{ - Resources: intent.Resources{ + i: &apiv1.Intent{ + Resources: apiv1.Resources{ { ID: "mock-id-1", Type: "Kubernetes", @@ -308,8 +307,8 @@ func TestAddKubeConfigIf(t *testing.T) { }, }, }, - expectedIntent: &intent.Intent{ - Resources: intent.Resources{ + expectedIntent: &apiv1.Intent{ + Resources: apiv1.Resources{ { ID: "mock-id-1", Type: "Kubernetes", @@ -331,8 +330,8 @@ func TestAddKubeConfigIf(t *testing.T) { }, }, }, - i: &intent.Intent{ - Resources: intent.Resources{ + i: &apiv1.Intent{ + Resources: apiv1.Resources{ { ID: "mock-id-1", Type: "Kubernetes", @@ -381,8 +380,8 @@ func TestAddKubeConfigIf(t *testing.T) { }, }, }, - expectedIntent: &intent.Intent{ - Resources: intent.Resources{ + expectedIntent: &apiv1.Intent{ + Resources: apiv1.Resources{ { ID: "mock-id-1", Type: "Kubernetes",