---
# System prepended metadata

title: Central dysnix/helmfiles
tags: [design, helm, helmfile, dysnix, whitepaper]

---


# Central dysnix/helmfiles
###### tags: `dysnix` `helmfile` `helm` `design` `whitepaper`

Aim of this project is to provide a stable slice of helmfile/helm backed and tested release lists which can be deployed by users/clients.

## Enduser repo hierarchy 

We suggest the bellow layout for end-user repositories, well it's not fixed though. The only non-movable part here is the `helmfiles/` directory which either a cloned copy into or a submodule link to [dysnix/helmfiles](https://github.com/dysnix/helmfiles) repository (the actual user's repository layout is up to user).  

```
## User's repository layout
├── helmfiles
│   └── releases
│       ├── aws-lb-controller
│       ├── nginx-ingress
│       │   └── presets
│       │       ├── aws.yaml
│       │       ├── azure.yaml
│       │       └── gcp.yaml
│       ├── ...
│
├── helmfile.yaml
```

The current approach defines **local usage only** of dysnix helmfiles.

## Principals not to deviate from

### Presets must not require environment `-e` to be provided

This is a "no go"

```
helmfile -e [aws,gcp,azure; default: default] helmfile.yaml
```

Environment reserved for an end-user control.

### Preset values must be under `preset.`

```yaml
preset:
  limit_cpu: 250m
  limit_memory: 0.5Gi
```

### Preset values must provide generic and consistent values settings between helmfiles/releases

See the above example with `limit_*`. Specifically if we've chosen to use `limit_*` it has to be used through all presets in all releases. Thus we should have end-to-end list of **common** settings defined. 

### Helmfiles should be included using path directive

```yaml
helmfiles:
- path: helmfiles/release/ingress-nginx/helmfile.yaml
  values:
    ...
```

### List of control ("root") value parameters should be reserved

```yaml
values:
- preset:
    limit_cpu: 250m
    limit_memory: 0.5Gi
 
  release:
    name: xxx
    chart: xxx
    version: yyy
  ...
```

### No forcing of the release base parameters

A "no go":

```yaml
- name: ingress-nginx
  chart: ingress-ingress/ingress-nginx
  version: 3.30.0
  namespace: ingress-nginx
  createNamespace: true
```

### Define preset chooser with override example

Define how to choose presets, for example:

```yaml
helmfiles:
- path: helmfiles/release/ingress-nginx/helmfile.yaml
  values:
    - helmfile/presets/ingress-nginx/gcp.yaml
    - preset:
        limit_cpu: 300m
```

### Define the way how to pass release parameters

```yaml
- path: helmfiles/release/ingress-nginx/helmfile.yaml
  values:
    - helmfile/presets/ingress-nginx/gcp.yaml
    - values:
        - myvaluefile.yaml.gotmpl
        - hello: world
    - set:
        ...
    - valuesTemplate:
        ...
```

Basically we need to expose the whole release parameters interface same as in helmfile.
