Skip to content

Commit

Permalink
Merge pull request #50 from KusionStack/dayuan
Browse files Browse the repository at this point in the history
engine: upgrade manifest to spec
  • Loading branch information
SparkYuan committed May 26, 2022
2 parents 28a545b + a91e254 commit 28b4f93
Show file tree
Hide file tree
Showing 37 changed files with 299 additions and 313 deletions.
2 changes: 0 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,6 @@ require (
github.com/mattn/go-colorable v0.1.11 // indirect
github.com/mitchellh/go-wordwrap v1.0.1 // indirect
github.com/mitchellh/hashstructure v1.0.0
github.com/onsi/ginkgo v1.14.1
github.com/onsi/gomega v1.10.2
github.com/pkg/errors v0.9.1
github.com/pterm/pterm v0.12.41
github.com/pulumi/pulumi/sdk/v3 v3.24.0
Expand Down
4 changes: 2 additions & 2 deletions pkg/compile/compile.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import (

"kusionstack.io/kusion/pkg/compile/rest"
"kusionstack.io/kusion/pkg/engine"
"kusionstack.io/kusion/pkg/engine/manifest"
"kusionstack.io/kusion/pkg/engine/models"
"kusionstack.io/kusion/pkg/log"
"kusionstack.io/kusion/pkg/projectstack"
jsonUtil "kusionstack.io/kusion/pkg/util/json"
Expand All @@ -40,7 +40,7 @@ func EnableRPC() bool {

func CompileWithSpinner(workDir string, filenames, settings, arguments, overrides []string,
stack *projectstack.Stack,
) (*manifest.Manifest, *pterm.SpinnerPrinter, error) {
) (*models.Spec, *pterm.SpinnerPrinter, error) {
// Spinner
sp := &pretty.SpinnerT

Expand Down
11 changes: 5 additions & 6 deletions pkg/engine/kcl.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,15 @@ import (
"github.com/pkg/errors"
kcl "kusionstack.io/kclvm-go"

"kusionstack.io/kusion/pkg/engine/manifest"
"kusionstack.io/kusion/pkg/engine/states"
"kusionstack.io/kusion/pkg/engine/models"
"kusionstack.io/kusion/pkg/log"
jsonUtil "kusionstack.io/kusion/pkg/util/json"
)

const MaxLogLength = 3751

func ConvertKCLResult2Resources(resourceYAMLs []kcl.KCLResult) (*manifest.Manifest, error) {
resources := []states.ResourceState{}
func ConvertKCLResult2Resources(resourceYAMLs []kcl.KCLResult) (*models.Spec, error) {
resources := []models.Resource{}

for _, resourcesYamlMap := range resourceYAMLs {
// Convert kcl result to yaml string
Expand All @@ -37,7 +36,7 @@ func ConvertKCLResult2Resources(resourceYAMLs []kcl.KCLResult) (*manifest.Manife
}

// Parse yaml string as Resource
item := &states.ResourceState{}
item := &models.Resource{}
err = yamlv3.Unmarshal(yamlByte, item)
if err != nil {
return nil, err
Expand All @@ -54,5 +53,5 @@ func ConvertKCLResult2Resources(resourceYAMLs []kcl.KCLResult) (*manifest.Manife
resources = append(resources, *item)
}

return &manifest.Manifest{Resources: resources}, nil
return &models.Spec{Resources: resources}, nil
}
8 changes: 0 additions & 8 deletions pkg/engine/manifest/manifest.go

This file was deleted.

45 changes: 45 additions & 0 deletions pkg/engine/models/resource.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package models

type Type string

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 of Kubernetes resources.
ID string `json:"id"`

// Type represents all Runtimes we supported
Type Type `json:"type"`

// Attributes represents all specified attributes of this resource
Attributes map[string]interface{} `json:"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"`
}

func (r *Resource) ResourceKey() string {
return r.ID
}

func (rs Resources) Index() map[string]*Resource {
m := make(map[string]*Resource)
for i := range rs {
m[rs[i].ResourceKey()] = &rs[i]
}
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
}
}
6 changes: 6 additions & 0 deletions pkg/engine/models/spec.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package models

// Spec represent the KCL compile result
type Spec struct {
Resources Resources `json:"resources"`
}
8 changes: 4 additions & 4 deletions pkg/engine/operation/apply.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
"github.com/hashicorp/terraform/dag"
"github.com/hashicorp/terraform/tfdiags"

"kusionstack.io/kusion/pkg/engine/manifest"
"kusionstack.io/kusion/pkg/engine/models"
"kusionstack.io/kusion/pkg/engine/states"
"kusionstack.io/kusion/pkg/log"
"kusionstack.io/kusion/pkg/status"
Expand All @@ -26,7 +26,7 @@ type ApplyResponse struct {
State *states.State
}

func NewApplyGraph(m *manifest.Manifest, priorState *states.State) (*dag.AcyclicGraph, status.Status) {
func NewApplyGraph(m *models.Spec, priorState *states.State) (*dag.AcyclicGraph, status.Status) {
manifestParser := NewManifestParser(m)
graph := &dag.AcyclicGraph{}
graph.Add(&RootNode{})
Expand Down Expand Up @@ -83,7 +83,7 @@ func (o *Operation) Apply(request *ApplyRequest) (rsp *ApplyResponse, st status.
Operation: Operation{
OperationType: Apply,
StateStorage: o.StateStorage,
CtxResourceIndex: map[string]*states.ResourceState{},
CtxResourceIndex: map[string]*models.Resource{},
PriorStateResourceIndex: priorStateResourceIndex,
StateResourceIndex: priorStateResourceIndex,
Runtime: o.Runtime,
Expand Down Expand Up @@ -155,7 +155,7 @@ func validateRequest(request *Request) status.Status {
}
if request.Manifest == nil {
return status.NewErrorStatusWithMsg(status.InvalidArgument,
"request.Manifest is empty. If you want to delete all resources, please use command 'destroy'")
"request.Spec is empty. If you want to delete all resources, please use command 'destroy'")
}
resourceKeyMap := make(map[string]bool)

Expand Down
22 changes: 10 additions & 12 deletions pkg/engine/operation/apply_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import (
_ "github.com/go-sql-driver/mysql"
"github.com/stretchr/testify/assert"

"kusionstack.io/kusion/pkg/engine/manifest"
"kusionstack.io/kusion/pkg/engine/models"
"kusionstack.io/kusion/pkg/engine/runtime"
"kusionstack.io/kusion/pkg/engine/states"
"kusionstack.io/kusion/pkg/status"
Expand All @@ -34,13 +34,13 @@ func Test_validateRequest(t *testing.T) {
request: &Request{},
},
want: status.NewErrorStatusWithMsg(status.InvalidArgument,
"request.Manifest is empty. If you want to delete all resources, please use command 'destroy'"),
"request.Spec is empty. If you want to delete all resources, please use command 'destroy'"),
},
{
name: "t2",
args: args{
request: &Request{
Manifest: &manifest.Manifest{Resources: []states.ResourceState{}},
Manifest: &models.Spec{Resources: []models.Resource{}},
},
},
want: nil,
Expand All @@ -59,9 +59,9 @@ func TestOperation_Apply(t *testing.T) {
type fields struct {
OperationType Type
StateStorage states.StateStorage
CtxResourceIndex map[string]*states.ResourceState
PriorStateResourceIndex map[string]*states.ResourceState
StateResourceIndex map[string]*states.ResourceState
CtxResourceIndex map[string]*models.Resource
PriorStateResourceIndex map[string]*models.Resource
StateResourceIndex map[string]*models.Resource
Order *ChangeOrder
Runtime runtime.Runtime
MsgCh chan Message
Expand All @@ -73,10 +73,9 @@ func TestOperation_Apply(t *testing.T) {
}

const Jack = "jack"
mf := &manifest.Manifest{Resources: []states.ResourceState{
mf := &models.Spec{Resources: []models.Resource{
{
ID: Jack,
Mode: states.Managed,
ID: Jack,
Attributes: map[string]interface{}{
"a": "b",
},
Expand All @@ -93,10 +92,9 @@ func TestOperation_Apply(t *testing.T) {
KusionVersion: "",
Serial: 1,
Operator: "faker",
Resources: []states.ResourceState{
Resources: []models.Resource{
{
ID: Jack,
Mode: states.Managed,
ID: Jack,
Attributes: map[string]interface{}{
"a": "b",
},
Expand Down
7 changes: 4 additions & 3 deletions pkg/engine/operation/change.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@ import (
"fmt"
"strings"

"kusionstack.io/kusion/pkg/engine/models"

"github.com/AlecAivazis/survey/v2"
"github.com/pterm/pterm"

"kusionstack.io/kusion/pkg/engine/states"
"kusionstack.io/kusion/pkg/log"
"kusionstack.io/kusion/pkg/projectstack"
"kusionstack.io/kusion/pkg/util/diff"
Expand Down Expand Up @@ -219,8 +220,8 @@ func (o *ChangeOrder) OutputDiff(target string) {
}
}

func buildResourceStateMap(rs []*states.ResourceState) map[string]*states.ResourceState {
rMap := make(map[string]*states.ResourceState)
func buildResourceStateMap(rs []*models.Resource) map[string]*models.Resource {
rMap := make(map[string]*models.Resource)
if len(rs) == 0 {
return rMap
}
Expand Down
11 changes: 6 additions & 5 deletions pkg/engine/operation/change_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ import (
"reflect"
"testing"

"kusionstack.io/kusion/pkg/engine/states"
"kusionstack.io/kusion/pkg/engine/models"

"kusionstack.io/kusion/pkg/projectstack"
"kusionstack.io/kusion/pkg/util/pretty"
)
Expand Down Expand Up @@ -492,19 +493,19 @@ func TestChanges_Preview(t *testing.T) {

func Test_buildResourceStateMap(t *testing.T) {
type args struct {
rs []*states.ResourceState
rs []*models.Resource
}
tests := []struct {
name string
args args
want map[string]*states.ResourceState
want map[string]*models.Resource
}{
{
name: "t1",
args: args{
rs: []*states.ResourceState{},
rs: []*models.Resource{},
},
want: map[string]*states.ResourceState{},
want: map[string]*models.Resource{},
},
}
for _, tt := range tests {
Expand Down
11 changes: 6 additions & 5 deletions pkg/engine/operation/delete_resource_parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ package operation
import (
"fmt"

"kusionstack.io/kusion/pkg/engine/states"
"kusionstack.io/kusion/pkg/engine/models"

"kusionstack.io/kusion/pkg/log"
"kusionstack.io/kusion/pkg/status"
"kusionstack.io/kusion/pkg/util"
Expand All @@ -13,10 +14,10 @@ import (
)

type DeleteResourceParser struct {
resources states.Resources
resources models.Resources
}

func NewDeleteResourceParser(resources states.Resources) *DeleteResourceParser {
func NewDeleteResourceParser(resources models.Resources) *DeleteResourceParser {
return &DeleteResourceParser{resources: resources}
}

Expand Down Expand Up @@ -52,7 +53,7 @@ func (d *DeleteResourceParser) Parse(graph *dag.AcyclicGraph) (s status.Status)
rnID := rn.Hashcode().(string)

if !graph.HasVertex(rn) && manifestGraphMap[rnID] == nil {
log.Infof("resource:%v not found in manifest. Mark as delete node", key)
log.Infof("resource:%v not found in models. Mark as delete node", key)
// we cannot delete this node if any node dependsOn this node
for _, v := range priorDependsOn[rnID] {
if manifestGraphMap[v] != nil {
Expand All @@ -72,7 +73,7 @@ func (d *DeleteResourceParser) Parse(graph *dag.AcyclicGraph) (s status.Status)
}
}
if err = graph.Validate(); err != nil {
return status.NewErrorStatusWithMsg(status.IllegalManifest, "Found circle dependency in manifest."+err.Error())
return status.NewErrorStatusWithMsg(status.IllegalManifest, "Found circle dependency in models."+err.Error())
}
graph.TransitiveReduction()
return s
Expand Down
22 changes: 11 additions & 11 deletions pkg/engine/operation/delete_resource_parser_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,44 +4,44 @@ import (
"strings"
"testing"

"github.com/hashicorp/terraform/dag"
"kusionstack.io/kusion/pkg/engine/models"

"kusionstack.io/kusion/pkg/engine/states"
"github.com/hashicorp/terraform/dag"
)

func TestDeleteResourceParser_Parse(t *testing.T) {
const VPC = "vpc"
const VSwitch = "vswitch"
const VSecutiry = "vsecurity"
const Instance = "instance"
resources := []states.ResourceState{
resources := []models.Resource{
{
ID: VPC,
Mode: states.Managed,
ID: VPC,

Attributes: map[string]interface{}{
"c": "d",
},
DependsOn: nil,
},
{
ID: VSwitch,
Mode: states.Managed,
ID: VSwitch,

Attributes: map[string]interface{}{
"a": "c",
},
DependsOn: []string{VPC},
},
{
ID: VSecutiry,
Mode: states.Managed,
ID: VSecutiry,

Attributes: map[string]interface{}{
"a": "b",
},
DependsOn: []string{VSwitch},
},
{
ID: Instance,
Mode: states.Managed,
ID: Instance,

Attributes: map[string]interface{}{
"a": "b",
},
Expand Down
Loading

0 comments on commit 28b4f93

Please sign in to comment.