Load Order

How policies are loaded by Stein#

To understand how stein loads policy files and recognizes them is very important for writing and applying policies to the files effectively. stein apply requires always one or more arguments only. It assumes the config file paths such as YAML, JSON and so on.

The path may have a hierarchical structure. In Stein, when a path with a hierarchical structure is given as arguments, stein recognizes the HCL file in .policy directory placed in the path included in that path as a policy to be applied.

Let's see a concrete example.

_examples
|-- .policy/
|   |-- config.hcl
|   |-- functions.hcl
|   |-- rules.hcl
|   `-- variables.hcl
|-- manifests/
|   |-- .policy/
|   |   |-- functions.hcl
|   |   `-- rules.hcl
|   `-- microservices/
|       |-- x-echo-jp/
|       |   `-- development/
|       |       |-- Deployment/
|       |       |   |-- redis-master.yaml
|       |       |   |-- test.yaml
|       |       |   `-- test.yml
|       |       |-- PodDisruptionBudget/
|       |       |   `-- pdb.yaml
|       |       `-- Service/
|       |           `-- service.yaml
|       `-- x-gateway-jp/
|           `-- development/
|               `-- Deployment/
|                   `-- test.yaml
`-- spinnaker/
    |-- .policy/
    |   `-- functions.hcl
    `-- x-echo-jp/
        `-- development/
            `-- deploy-to-dev-v2.yaml

There are some Kubernetes YAML with hierarchical structure and some policies here.

In this case, stein recognizes these HCL files as the policy to be applied to the arguments if _examples/manifests/microservices/x-echo-jp/development/Deployment/test.yaml is given as arguments of stein:

  • _examples/.policy/*.hcl
  • _examples/manifests/.policy/*.hcl

This is because given argument file contains _examples/ and _examples/manifests.

That is, all YAML files located in _examples/manifests/ is applied with _examples/.policy/*.hcl and _examples/manifests/.policy/*.hcl.

On the other hand, all YAML files located in _examples/spinnaker/ is applied with _examples/.policy/*.hcl and _examples/spinnaker/.policy/*.hcl.

So, you can control the policy to apply by appropriately creating the directory and placing the YAML files and .policy directory there.

In addition, if you want to apply policies placed in places that have no relation to given arguments, you can control by environment variable or apply flag.

export STEIN_POLICY=/path/to/policy
stein apply deployment.yaml

# or

stein apply -policy /path/to/policy deployment.yaml

Also STEIN_POLICY (-policy) can take multiple values separated by a comma, also can take directories and files:

STEIN_POLICY=root-policy/,another-policy/special.hcl
# -> these files are applied, besides ".policy/*.hcl" included in given arguments
#    root-policy/*.hcl
#    another-policy/special.hcl