func Run()

in internal/policygen/policygen.go [49:133]


func Run(ctx context.Context, rn runner.Runner, args *RunArgs) error {
	var err error
	configPath, err := fileutil.Expand(args.ConfigPath)
	if err != nil {
		return fmt.Errorf("normalize path %q: %v", args.ConfigPath, err)
	}

	c, err := loadConfig(configPath)
	if err != nil {
		return fmt.Errorf("load config: %v", err)
	}

	compat, err := version.IsCompatible(c.Version)
	if err != nil {
		return err
	}
	if !compat {
		return fmt.Errorf("binary version %v incompatible with template version constraint %v in %v", cmd.Version, c.Version, configPath)
	}

	var statePaths []string
	for _, p := range args.StatePaths {
		p, err = fileutil.Expand(p)
		if err != nil {
			return fmt.Errorf("normalize path %q: %v", p, err)
		}
		statePaths = append(statePaths, p)
	}

	outputPath, err := fileutil.Expand(args.OutputPath)
	if err != nil {
		return fmt.Errorf("normalize path %q: %v", args.OutputPath, err)
	}

	cacheDir, err := ioutil.TempDir("", "")
	if err != nil {
		return err
	}
	defer os.RemoveAll(cacheDir)

	pp, err := fileutil.Fetch(c.TemplateDir, filepath.Dir(args.ConfigPath), cacheDir)
	if err != nil {
		return fmt.Errorf("resolve policy template path: %v", err)
	}
	c.TemplateDir = pp

	tmpDir, err := ioutil.TempDir("", "")
	if err != nil {
		return err
	}
	defer os.RemoveAll(tmpDir)

	// Policy Library templates are released in a backwards compatible way, and old templates will be
	// kept in the repository as well, so it's relatively safe to pull from 'master' branch all the time.
	tp, err := fileutil.Fetch("github.com/forseti-security/policy-library?ref=master", "", cacheDir)
	if err != nil {
		return fmt.Errorf("fetch policy templates and utils: %v", err)
	}

	if err := copy.Copy(filepath.Join(tp, "policies"), filepath.Join(tmpDir, forsetiOutputRoot, "policies")); err != nil {
		return err
	}

	if err := copy.Copy(filepath.Join(tp, "lib"), filepath.Join(tmpDir, forsetiOutputRoot, "lib")); err != nil {
		return err
	}

	if err := generateForsetiPolicies(ctx, rn, statePaths, filepath.Join(tmpDir, forsetiOutputRoot, "policies", "constraints"), c); err != nil {
		return fmt.Errorf("generate Forseti policies: %v", err)
	}

	if err := licenseutil.AddLicense(tmpDir); err != nil {
		return fmt.Errorf("add license header: %v", err)
	}

	if err := hcl.FormatDir(rn, tmpDir); err != nil {
		return fmt.Errorf("hcl format: %v", err)
	}

	if err := os.MkdirAll(outputPath, 0755); err != nil {
		return fmt.Errorf("mkdir %q: %v", outputPath, err)
	}

	return copy.Copy(tmpDir, outputPath)
}