Skip to content

Commit b78d157

Browse files
committed
refactor: use options pattern to instantiate tests (open-policy-agent#2949)
1 parent 69da15d commit b78d157

File tree

2 files changed

+71
-32
lines changed

2 files changed

+71
-32
lines changed

cmd/gator/test/test.go

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -88,19 +88,34 @@ func run(_ *cobra.Command, _ []string) {
8888
cmdutils.ErrFatalf("no input data identified")
8989
}
9090

91-
responses, err := test.Test(unstrucs, test.Opts{
92-
IncludeTrace: flagIncludeTrace,
93-
GatherStats: flagGatherStats,
94-
UseK8sCEL: flagEnableK8sCel,
95-
Verbose: flagVerbose,
96-
})
91+
var printBuf bytes.Buffer
92+
93+
var opts []test.Opt
94+
if flagIncludeTrace {
95+
opts = append(opts, test.WithTrace())
96+
}
97+
if flagGatherStats {
98+
opts = append(opts, test.WithGatherStats())
99+
}
100+
if flagEnableK8sCel {
101+
opts = append(opts, test.WithK8sCEL(flagGatherStats))
102+
}
103+
if flagVerbose {
104+
opts = append(opts, test.WithPrintHook(&printBuf))
105+
}
106+
107+
responses, err := test.Test(unstrucs, opts...)
97108
if err != nil {
98109
cmdutils.ErrFatalf("auditing objects: %v", err)
99110
}
100111
results := responses.Results()
101112

102113
fmt.Print(formatOutput(flagOutput, results, responses.StatsEntries))
103114

115+
if printBuf.Len() > 0 {
116+
fmt.Printf("\n%s\n", printBuf.String())
117+
}
118+
104119
// Whether or not we return non-zero depends on whether we have a `deny`
105120
// enforcementAction on one of the violated constraints
106121
exitCode := 0

pkg/gator/test/test.go

Lines changed: 50 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package test
33
import (
44
"context"
55
"fmt"
6-
"os"
6+
"io"
77

88
"github.com/open-policy-agent/frameworks/constraint/pkg/apis"
99
constraintclient "github.com/open-policy-agent/frameworks/constraint/pkg/client"
@@ -40,20 +40,28 @@ type Opts struct {
4040
Verbose bool
4141
}
4242

43-
func Test(objs []*unstructured.Unstructured, tOpts Opts) (*GatorResponses, error) {
43+
type Opt func() ([]constraintclient.Opt, []rego.Arg, error)
44+
45+
func Test(objs []*unstructured.Unstructured, opts ...Opt) (*GatorResponses, error) {
4446
args := []constraintclient.Opt{constraintclient.Targets(&target.K8sValidationTarget{})}
45-
if tOpts.UseK8sCEL {
46-
k8sDriver, err := makeK8sCELDriver(tOpts)
47+
48+
driverArgs := []rego.Arg{}
49+
50+
for _, opt := range opts {
51+
extraArgs, extraDriverArgs, err := opt()
4752
if err != nil {
48-
return nil, fmt.Errorf("creating K8s native driver: %w", err)
53+
return nil, err
4954
}
50-
args = append(args, constraintclient.Driver(k8sDriver))
55+
56+
args = append(args, extraArgs...)
57+
driverArgs = append(driverArgs, extraDriverArgs...)
5158
}
5259

53-
driver, err := makeRegoDriver(tOpts)
60+
driver, err := rego.New(driverArgs...)
5461
if err != nil {
5562
return nil, fmt.Errorf("creating Rego driver: %w", err)
5663
}
64+
5765
args = append(args, constraintclient.Driver(driver), constraintclient.EnforcementPoints(util.GatorEnforcementPoint))
5866

5967
client, err := constraintclient.NewClient(args...)
@@ -179,30 +187,46 @@ func Test(objs []*unstructured.Unstructured, tOpts Opts) (*GatorResponses, error
179187
return responses, nil
180188
}
181189

182-
func makeRegoDriver(tOpts Opts) (*rego.Driver, error) {
183-
var args []rego.Arg
184-
if tOpts.GatherStats {
185-
args = append(args, rego.GatherStats())
186-
}
187-
if tOpts.IncludeTrace {
188-
args = append(args, rego.Tracing(tOpts.IncludeTrace))
190+
func WithGatherStats() Opt {
191+
return func() ([]constraintclient.Opt, []rego.Arg, error) {
192+
return []constraintclient.Opt{}, []rego.Arg{
193+
rego.GatherStats(),
194+
}, nil
189195
}
190-
if tOpts.Verbose {
191-
args = append(args,
192-
rego.PrintEnabled(tOpts.Verbose),
193-
rego.PrintHook(gator.NewPrintHook(os.Stdout)),
194-
)
196+
}
197+
198+
func WithTrace() Opt {
199+
return func() ([]constraintclient.Opt, []rego.Arg, error) {
200+
return []constraintclient.Opt{}, []rego.Arg{
201+
rego.Tracing(true),
202+
}, nil
195203
}
204+
}
196205

197-
return rego.New(args...)
206+
func WithPrintHook(w io.Writer) Opt {
207+
return func() ([]constraintclient.Opt, []rego.Arg, error) {
208+
return []constraintclient.Opt{}, []rego.Arg{
209+
rego.PrintEnabled(true),
210+
rego.PrintHook(gator.NewPrintHook(w)),
211+
}, nil
212+
}
198213
}
199214

200-
func makeK8sCELDriver(tOpts Opts) (*k8scel.Driver, error) {
201-
var args []k8scel.Arg
215+
func WithK8sCEL(gatherStats bool) Opt {
216+
return func() ([]constraintclient.Opt, []rego.Arg, error) {
217+
var args []k8scel.Arg
202218

203-
if tOpts.GatherStats {
204-
args = append(args, k8scel.GatherStats())
205-
}
219+
if gatherStats {
220+
args = append(args, k8scel.GatherStats())
221+
}
206222

207-
return k8scel.New(args...)
223+
k8sDriver, err := k8scel.New(args...)
224+
if err != nil {
225+
return []constraintclient.Opt{}, []rego.Arg{}, fmt.Errorf("creating K8s native driver: %w", err)
226+
}
227+
228+
return []constraintclient.Opt{
229+
constraintclient.Driver(k8sDriver),
230+
}, []rego.Arg{}, nil
231+
}
208232
}

0 commit comments

Comments
 (0)