Skip to content

Commit

Permalink
feat: getting workspace when running kusion build (#653)
Browse files Browse the repository at this point in the history
* feat: getting workspace when running kusion build

* fix: do some upgrading job

* fix: update e2e test
  • Loading branch information
healthjyk committed Dec 7, 2023
1 parent df5aa5a commit cc705cc
Show file tree
Hide file tree
Showing 7 changed files with 247 additions and 28 deletions.
6 changes: 4 additions & 2 deletions pkg/cmd/build/builders/appconfig_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@ import (
"kusionstack.io/kusion/pkg/apis/intent"
"kusionstack.io/kusion/pkg/apis/project"
"kusionstack.io/kusion/pkg/apis/stack"
"kusionstack.io/kusion/pkg/apis/workspace"
"kusionstack.io/kusion/pkg/modules"
"kusionstack.io/kusion/pkg/modules/generators"
"kusionstack.io/kusion/pkg/modules/inputs"
)

type AppsConfigBuilder struct {
Apps map[string]inputs.AppConfiguration
Apps map[string]inputs.AppConfiguration
Workspace *workspace.Workspace
}

func (acg *AppsConfigBuilder) Build(
Expand All @@ -24,7 +26,7 @@ func (acg *AppsConfigBuilder) Build(

var gfs []modules.NewGeneratorFunc
err := modules.ForeachOrdered(acg.Apps, func(appName string, app inputs.AppConfiguration) error {
gfs = append(gfs, generators.NewAppConfigurationGeneratorFunc(project, stack, appName, &app))
gfs = append(gfs, generators.NewAppConfigurationGeneratorFunc(project, stack, appName, &app, acg.Workspace))
return nil
})
if err != nil {
Expand Down
36 changes: 36 additions & 0 deletions pkg/cmd/build/builders/appconfig_builder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (

"kusionstack.io/kusion/pkg/apis/project"
"kusionstack.io/kusion/pkg/apis/stack"
"kusionstack.io/kusion/pkg/apis/workspace"
appmodel "kusionstack.io/kusion/pkg/modules/inputs"
"kusionstack.io/kusion/pkg/modules/inputs/workload"
"kusionstack.io/kusion/pkg/modules/inputs/workload/network"
Expand All @@ -19,6 +20,7 @@ func TestAppsConfigBuilder_Build(t *testing.T) {
Apps: map[string]appmodel.AppConfiguration{
appName: *app,
},
Workspace: buildMockWorkspace(),
}

intent, err := acg.Build(&Options{}, p, s)
Expand Down Expand Up @@ -48,6 +50,40 @@ func buildMockApp() (string, *appmodel.AppConfiguration) {
}
}

func buildMockWorkspace() *workspace.Workspace {
return &workspace.Workspace{
Name: "test",
Modules: workspace.ModuleConfigs{
"database": {
"default": {
"type": "aws",
"version": "5.7",
"instanceType": "db.t3.micro",
},
"smallClass": {
"instanceType": "db.t3.small",
"projectSelector": []any{"foo", "bar"},
},
},
"port": {
"default": {
"type": "aws",
},
},
},
Runtimes: &workspace.RuntimeConfigs{
Kubernetes: &workspace.KubernetesConfig{
KubeConfig: "/etc/kubeconfig.yaml",
},
},
Backends: &workspace.BackendConfigs{
Local: &workspace.LocalFileConfig{
Path: "/etc/.kusion",
},
},
}
}

func buildMockProjectAndStack() (*project.Project, *stack.Stack) {
p := &project.Project{
Configuration: project.Configuration{
Expand Down
27 changes: 24 additions & 3 deletions pkg/cmd/build/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,13 @@ import (
"kusionstack.io/kusion/pkg/apis/intent"
"kusionstack.io/kusion/pkg/apis/project"
"kusionstack.io/kusion/pkg/apis/stack"
apisworkspace "kusionstack.io/kusion/pkg/apis/workspace"
"kusionstack.io/kusion/pkg/cmd/build/builders"
"kusionstack.io/kusion/pkg/cmd/build/builders/kcl"
"kusionstack.io/kusion/pkg/modules/inputs"

"kusionstack.io/kusion/pkg/log"
"kusionstack.io/kusion/pkg/modules/inputs"
"kusionstack.io/kusion/pkg/util/pretty"
workspace "kusionstack.io/kusion/pkg/workspace"
)

func IntentWithSpinner(o *builders.Options, project *project.Project, stack *stack.Stack) (*intent.Intent, error) {
Expand Down Expand Up @@ -78,7 +79,14 @@ func Intent(o *builders.Options, p *project.Project, s *stack.Stack) (*intent.In
if err != nil {
return nil, err
}
builder = &builders.AppsConfigBuilder{Apps: appConfigs}
ws, err := getWorkspace(s.GetName())
if err != nil {
return nil, err
}
builder = &builders.AppsConfigBuilder{
Apps: appConfigs,
Workspace: ws,
}
default:
return nil, fmt.Errorf("unknow generator type:%s", bt)
}
Expand Down Expand Up @@ -117,6 +125,19 @@ func buildAppConfigs(o *builders.Options, stack *stack.Stack) (map[string]inputs
return appConfigs, nil
}

func getWorkspace(stackName string) (*apisworkspace.Workspace, error) {
wsOperator, err := workspace.NewDefaultOperator()
if err != nil {
return nil, fmt.Errorf("new workspace operator failed, %w", err)
}
// stack name should be same as the workspace name
ws, err := wsOperator.GetWorkspace(stackName)
if err != nil {
return nil, fmt.Errorf("get workspace %s failed, %w", stackName, err)
}
return ws, nil
}

func IntentFromFile(filePath string) (*intent.Intent, error) {
b, err := os.ReadFile(filePath)
if err != nil {
Expand Down
79 changes: 64 additions & 15 deletions pkg/cmd/build/util_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"kusionstack.io/kusion/pkg/apis/intent"
"kusionstack.io/kusion/pkg/apis/project"
"kusionstack.io/kusion/pkg/apis/stack"
"kusionstack.io/kusion/pkg/apis/workspace"
"kusionstack.io/kusion/pkg/cmd/build/builders"
"kusionstack.io/kusion/pkg/cmd/build/builders/kcl"
appconfigmodel "kusionstack.io/kusion/pkg/modules/inputs"
Expand Down Expand Up @@ -117,6 +118,38 @@ resources:
},
},
}

ws = &workspace.Workspace{
Name: "default",
Modules: workspace.ModuleConfigs{
"database": {
"default": {
"type": "aws",
"version": "5.7",
"instanceType": "db.t3.micro",
},
"smallClass": {
"instanceType": "db.t3.small",
"projectSelector": []any{"foo", "bar"},
},
},
"port": {
"default": {
"type": "aws",
},
},
},
Runtimes: &workspace.RuntimeConfigs{
Kubernetes: &workspace.KubernetesConfig{
KubeConfig: "/etc/kubeconfig.yaml",
},
},
Backends: &workspace.BackendConfigs{
Local: &workspace.LocalFileConfig{
Path: "/etc/.kusion",
},
},
}
)

func TestBuildIntentFromFile(t *testing.T) {
Expand Down Expand Up @@ -172,7 +205,7 @@ func TestBuildIntent(t *testing.T) {
o *builders.Options
project *project.Project
stack *stack.Stack
mocker *mockey.MockBuilder
mockers []*mockey.MockBuilder
}
tests := []struct {
name string
Expand All @@ -185,17 +218,18 @@ func TestBuildIntent(t *testing.T) {
o *builders.Options
project *project.Project
stack *stack.Stack
mocker *mockey.MockBuilder
mockers []*mockey.MockBuilder
}{
o: &builders.Options{Arguments: map[string]string{}},
project: &project.Project{
Configuration: project.Configuration{
Name: "default",
},
}, stack: &stack.Stack{},
mocker: mockey.Mock(kcl.Run).Return(&kcl.CompileResult{
Documents: []kclgo.KCLResult{apcMap},
}, nil),
mockers: []*mockey.MockBuilder{
mockey.Mock(kcl.Run).Return(&kcl.CompileResult{Documents: []kclgo.KCLResult{apcMap}}, nil),
mockey.Mock(getWorkspace).Return(ws, nil),
},
},
want: intentModel3,
},
Expand All @@ -204,7 +238,7 @@ func TestBuildIntent(t *testing.T) {
o *builders.Options
project *project.Project
stack *stack.Stack
mocker *mockey.MockBuilder
mockers []*mockey.MockBuilder
}{
o: &builders.Options{},
project: &project.Project{
Expand All @@ -214,8 +248,10 @@ func TestBuildIntent(t *testing.T) {
},
},
},
stack: &stack.Stack{},
mocker: mockey.Mock((*kcl.Builder).Build).Return(nil, nil),
stack: &stack.Stack{},
mockers: []*mockey.MockBuilder{
mockey.Mock((*kcl.Builder).Build).Return(nil, nil),
},
},
want: nil,
},
Expand All @@ -224,7 +260,7 @@ func TestBuildIntent(t *testing.T) {
o *builders.Options
project *project.Project
stack *stack.Stack
mocker *mockey.MockBuilder
mockers []*mockey.MockBuilder
}{
o: &builders.Options{Arguments: map[string]string{}},
project: &project.Project{
Expand All @@ -235,19 +271,32 @@ func TestBuildIntent(t *testing.T) {
},
},
},
stack: &stack.Stack{},
mocker: mockey.Mock(kcl.Run).Return(&kcl.CompileResult{
Documents: []kclgo.KCLResult{apcMap},
}, nil),
stack: &stack.Stack{
Configuration: stack.Configuration{
Name: "default",
},
},
mockers: []*mockey.MockBuilder{
mockey.Mock(kcl.Run).Return(&kcl.CompileResult{Documents: []kclgo.KCLResult{apcMap}}, nil),
mockey.Mock(getWorkspace).Return(ws, nil),
},
},
want: intentModel3,
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
m := tt.args.mocker.Build()
defer m.UnPatch()
var mList []*mockey.Mocker
for _, mocker := range tt.args.mockers {
m := mocker.Build()
mList = append(mList, m)
}
defer func() {
for _, m := range mList {
m.UnPatch()
}
}()

got, err := Intent(tt.args.o, tt.args.project, tt.args.stack)
if (err != nil) != tt.wantErr {
Expand Down
20 changes: 17 additions & 3 deletions pkg/modules/generators/app_configurations_generator.go
Original file line number Diff line number Diff line change
@@ -1,33 +1,38 @@
package generators

import (
"errors"
"fmt"

"kusionstack.io/kusion/pkg/apis/intent"
"kusionstack.io/kusion/pkg/apis/project"
"kusionstack.io/kusion/pkg/apis/stack"
workspaceapi "kusionstack.io/kusion/pkg/apis/workspace"
"kusionstack.io/kusion/pkg/modules"
"kusionstack.io/kusion/pkg/modules/generators/accessories/database"
accessories "kusionstack.io/kusion/pkg/modules/generators/accessories/database"
"kusionstack.io/kusion/pkg/modules/generators/monitoring"
"kusionstack.io/kusion/pkg/modules/generators/trait"
"kusionstack.io/kusion/pkg/modules/generators/workload"
"kusionstack.io/kusion/pkg/modules/inputs"
patmonitoring "kusionstack.io/kusion/pkg/modules/patchers/monitoring"
pattrait "kusionstack.io/kusion/pkg/modules/patchers/trait"
"kusionstack.io/kusion/pkg/workspace"
)

type appConfigurationGenerator struct {
project *project.Project
stack *stack.Stack
appName string
app *inputs.AppConfiguration
ws *workspaceapi.Workspace
}

func NewAppConfigurationGenerator(
project *project.Project,
stack *stack.Stack,
app *inputs.AppConfiguration,
appName string,
app *inputs.AppConfiguration,
ws *workspaceapi.Workspace,
) (modules.Generator, error) {
if len(project.Name) == 0 {
return nil, fmt.Errorf("project name must not be empty")
Expand All @@ -41,11 +46,19 @@ func NewAppConfigurationGenerator(
return nil, fmt.Errorf("can not find app configuration when generating the Intent")
}

if ws == nil {
return nil, errors.New("workspace must not be empty") // AppConfiguration asks for non-empty workspace
}
if err := workspace.ValidateWorkspace(ws); err != nil {
return nil, fmt.Errorf("invalid config of workspace %s, %w", stack.GetName(), err)
}

return &appConfigurationGenerator{
project: project,
stack: stack,
appName: appName,
app: app,
ws: ws,
}, nil
}

Expand All @@ -54,9 +67,10 @@ func NewAppConfigurationGeneratorFunc(
stack *stack.Stack,
appName string,
app *inputs.AppConfiguration,
ws *workspaceapi.Workspace,
) modules.NewGeneratorFunc {
return func() (modules.Generator, error) {
return NewAppConfigurationGenerator(project, stack, app, appName)
return NewAppConfigurationGenerator(project, stack, appName, app, ws)
}
}

Expand Down
Loading

0 comments on commit cc705cc

Please sign in to comment.