mirror of
https://github.com/open-policy-agent/opa.git
synced 2026-08-24 09:15:31 -06:00
ed61c850f5
The new `-b`/`--bundle` CLI options will accept a directory to be loaded as a bundle, or a file which will be loaded as a tarball. Closes: #1584 Signed-off-by: Patrick East <east.patrick@gmail.com>
98 lines
2.4 KiB
Go
98 lines
2.4 KiB
Go
// Copyright 2018 The OPA Authors. All rights reserved.
|
|
// Use of this source code is governed by an Apache2
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package cmd
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/open-policy-agent/opa/rego"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
var buildParams = struct {
|
|
outputFile string
|
|
debug bool
|
|
dataPaths repeatedStringFlag
|
|
ignore []string
|
|
bundlePaths repeatedStringFlag
|
|
}{}
|
|
|
|
var buildCommand = &cobra.Command{
|
|
Use: "build <query>",
|
|
Short: "Compile Rego policy queries",
|
|
Long: `Compile a Rego policy query into an executable for enforcement.
|
|
|
|
The 'build' command takes a policy query as input and compiles it into an
|
|
executable that can be loaded into an enforcement point and evaluated with
|
|
input values. By default, the build command produces WebAssembly (WASM)
|
|
executables.`,
|
|
PreRunE: func(Cmd *cobra.Command, args []string) error {
|
|
if len(args) == 0 {
|
|
return fmt.Errorf("specify query argument")
|
|
}
|
|
return nil
|
|
},
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
if err := build(args); err != nil {
|
|
fmt.Println("error:", err)
|
|
os.Exit(1)
|
|
}
|
|
},
|
|
}
|
|
|
|
func build(args []string) error {
|
|
|
|
ctx := context.Background()
|
|
|
|
f := loaderFilter{
|
|
Ignore: buildParams.ignore,
|
|
}
|
|
|
|
regoArgs := []func(*rego.Rego){
|
|
rego.Query(args[0]),
|
|
}
|
|
|
|
if buildParams.dataPaths.isFlagSet() {
|
|
regoArgs = append(regoArgs, rego.Load(buildParams.dataPaths.v, f.Apply))
|
|
}
|
|
|
|
if buildParams.bundlePaths.isFlagSet() {
|
|
for _, bundleDir := range buildParams.bundlePaths.v {
|
|
regoArgs = append(regoArgs, rego.LoadBundle(bundleDir))
|
|
}
|
|
}
|
|
|
|
if buildParams.debug {
|
|
regoArgs = append(regoArgs, rego.Dump(os.Stderr))
|
|
}
|
|
|
|
r := rego.New(regoArgs...)
|
|
cr, err := r.Compile(ctx, rego.CompilePartial(true))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
out, err := os.Create(buildParams.outputFile)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
defer out.Close()
|
|
|
|
_, err = out.Write(cr.Bytes)
|
|
return err
|
|
}
|
|
|
|
func init() {
|
|
buildCommand.Flags().StringVarP(&buildParams.outputFile, "output", "o", "policy.wasm", "set the filename of the compiled policy")
|
|
buildCommand.Flags().BoolVarP(&buildParams.debug, "debug", "D", false, "enable debug output")
|
|
buildCommand.Flags().VarP(&buildParams.dataPaths, "data", "d", "set data file(s) or directory path(s)")
|
|
buildCommand.Flags().VarP(&buildParams.bundlePaths, "bundle", "b", "set bundle file(s) or directory path(s)")
|
|
setIgnore(buildCommand.Flags(), &buildParams.ignore)
|
|
RootCommand.AddCommand(buildCommand)
|
|
}
|