diff --git a/lang/gapi/gapi.go b/lang/gapi/gapi.go index 16bb4602..3a12733b 100644 --- a/lang/gapi/gapi.go +++ b/lang/gapi/gapi.go @@ -49,6 +49,7 @@ import ( "github.com/purpleidea/mgmt/lang/interfaces" "github.com/purpleidea/mgmt/lang/interpolate" "github.com/purpleidea/mgmt/lang/parser" + "github.com/purpleidea/mgmt/lang/types" "github.com/purpleidea/mgmt/lang/unification" "github.com/purpleidea/mgmt/pgraph" "github.com/purpleidea/mgmt/util" @@ -287,11 +288,12 @@ func (obj *GAPI) Cli(info *gapi.Info) (*gapi.Deploy, error) { return nil, errwrap.Wrapf(err, "could not get default solver") } unifier := &unification.Unifier{ - AST: iast, - Solver: solver, - Strategy: unificationStrategy, - Debug: debug, - Logf: unificationLogf, + AST: iast, + Solver: solver, + Strategy: unificationStrategy, + UnifiedState: types.NewUnifiedState(), + Debug: debug, + Logf: unificationLogf, } startTime := time.Now() unifyErr := unifier.Unify(context.TODO()) diff --git a/lang/interpret_test.go b/lang/interpret_test.go index 03854b52..d24a4ccf 100644 --- a/lang/interpret_test.go +++ b/lang/interpret_test.go @@ -60,6 +60,7 @@ import ( "github.com/purpleidea/mgmt/lang/interpolate" "github.com/purpleidea/mgmt/lang/interpret" "github.com/purpleidea/mgmt/lang/parser" + "github.com/purpleidea/mgmt/lang/types" "github.com/purpleidea/mgmt/lang/unification" "github.com/purpleidea/mgmt/pgraph" "github.com/purpleidea/mgmt/util" @@ -465,10 +466,11 @@ func TestAstFunc1(t *testing.T) { return } unifier := &unification.Unifier{ - AST: iast, - Solver: solver, - Debug: testing.Verbose(), - Logf: xlogf, + AST: iast, + Solver: solver, + UnifiedState: types.NewUnifiedState(), + Debug: testing.Verbose(), + Logf: xlogf, } err = unifier.Unify(context.TODO()) if (!fail || !failUnify) && err != nil { @@ -1041,10 +1043,11 @@ func TestAstFunc2(t *testing.T) { return } unifier := &unification.Unifier{ - AST: iast, - Solver: solver, - Debug: testing.Verbose(), - Logf: xlogf, + AST: iast, + Solver: solver, + UnifiedState: types.NewUnifiedState(), + Debug: testing.Verbose(), + Logf: xlogf, } err = unifier.Unify(context.TODO()) if (!fail || !failUnify) && err != nil { @@ -1849,10 +1852,11 @@ func TestAstFunc3(t *testing.T) { return } unifier := &unification.Unifier{ - AST: iast, - Solver: solver, - Debug: testing.Verbose(), - Logf: xlogf, + AST: iast, + Solver: solver, + UnifiedState: types.NewUnifiedState(), + Debug: testing.Verbose(), + Logf: xlogf, } err = unifier.Unify(context.TODO()) if (!fail || !failUnify) && err != nil { diff --git a/lang/lang.go b/lang/lang.go index 4f0d1e63..7a537161 100644 --- a/lang/lang.go +++ b/lang/lang.go @@ -49,6 +49,7 @@ import ( "github.com/purpleidea/mgmt/lang/interpolate" "github.com/purpleidea/mgmt/lang/interpret" "github.com/purpleidea/mgmt/lang/parser" + "github.com/purpleidea/mgmt/lang/types" "github.com/purpleidea/mgmt/lang/unification" _ "github.com/purpleidea/mgmt/lang/unification/solvers" // import so the solvers register "github.com/purpleidea/mgmt/pgraph" @@ -258,11 +259,12 @@ func (obj *Lang) Init(ctx context.Context) error { return errwrap.Wrapf(err, "could not get default solver") } unifier := &unification.Unifier{ - AST: obj.ast, - Solver: solver, - Strategy: obj.Data.UnificationStrategy, - Debug: obj.Debug, - Logf: logf, + AST: obj.ast, + Solver: solver, + Strategy: obj.Data.UnificationStrategy, + UnifiedState: types.NewUnifiedState(), + Debug: obj.Debug, + Logf: logf, } timing = time.Now() // NOTE: This is the "real" Unify that runs. (This is not for deploy.) diff --git a/lang/unification/interfaces.go b/lang/unification/interfaces.go index 9109b1ac..42738ab4 100644 --- a/lang/unification/interfaces.go +++ b/lang/unification/interfaces.go @@ -59,6 +59,9 @@ type Init struct { // overall cleaner unification algorithm in place. Strategy map[string]string + // UnifiedState stores a common representation of our unification vars. + UnifiedState *types.UnifiedState + Debug bool Logf func(format string, v ...interface{}) } diff --git a/lang/unification/solvers/unification_test.go b/lang/unification/solvers/unification_test.go index a7d9a65c..5da18aad 100644 --- a/lang/unification/solvers/unification_test.go +++ b/lang/unification/solvers/unification_test.go @@ -861,10 +861,11 @@ func TestUnification1(t *testing.T) { return } unifier := &unification.Unifier{ - AST: xast, - Solver: solver, - Debug: debug, - Logf: logf, + AST: xast, + Solver: solver, + UnifiedState: types.NewUnifiedState(), + Debug: debug, + Logf: logf, } err = unifier.Unify(context.TODO()) diff --git a/lang/unification/unification.go b/lang/unification/unification.go index b7f8b1a7..1e68c05d 100644 --- a/lang/unification/unification.go +++ b/lang/unification/unification.go @@ -38,6 +38,7 @@ import ( "strings" "github.com/purpleidea/mgmt/lang/interfaces" + "github.com/purpleidea/mgmt/lang/types" ) // Unifier holds all the data that the Unify function will need for it to run. @@ -52,6 +53,9 @@ type Unifier struct { // overall cleaner unification algorithm in place. Strategy map[string]string + // UnifiedState stores a common representation of our unification vars. + UnifiedState *types.UnifiedState + Debug bool Logf func(format string, v ...interface{}) } @@ -75,14 +79,18 @@ func (obj *Unifier) Unify(ctx context.Context) error { if obj.Solver == nil { return fmt.Errorf("the Solver is missing") } + if obj.UnifiedState == nil { + return fmt.Errorf("the UnifiedState table is missing") + } if obj.Logf == nil { return fmt.Errorf("the Logf function is missing") } init := &Init{ - Strategy: obj.Strategy, - Logf: obj.Logf, - Debug: obj.Debug, + Strategy: obj.Strategy, + UnifiedState: obj.UnifiedState, + Logf: obj.Logf, + Debug: obj.Debug, } if err := obj.Solver.Init(init); err != nil { return err