* fix
* fix
* some more
* somefixs
* whops
* initial structure
* finish up configmap
* secret class
* runtest secret
* move files arround
* ignore
* make clear on call template that need root context
* imagePullSecret (minus targetSelector)
* move out of the way
* clean up comment
* deployment basic spec
* daemonset basic spec
* statefulset spec
* split file
* docs
* update values
* job spec
* job docs
* cronJob basic spec
* job in cron test
* add common version
* podsepc
* whoopsis
* selectorlabels and pod metadata
* job and cron pod metadata
* update docs
* consistent order
* get ready for pod
* first targetSelector
* remove todo
* update docs
* add hostnet and enableservicelinks
* update selector logic
* update docs
* add tests for restartpolicy
* schedulerName
* priorityclassname
* hostname
* termperiodsec
* nodeselector
* add fail case
* host aliases
* dns policy
* dns config
* tolerations
* serviceaccoutn class, spawner, saname selector
* add pod todo
* update some tests
* add runtimeclassname
* controllers -> workload and plurar to singular
* require at least 1 primary on enabled SAs
* fix script
* remove wrong comment
* update naming scheme
* update rbac values ref
* rbac docs
* rbac's
* append short name, for future use
* update comments
* initial service wireframe
* shorten line
* simplify labels and update tests
* service selectors
* simplify error messages
* finish clusterIP type
* loadbalancer
* noedport
* externalname
* external ip
* update service
* fix highlighting
* session affinity
* add comment
* update comments
* service ports
* fix indentation
* externalname can have no ports
* fixup externalIP
* add pvc class and spawner and tests
* add nfs and emptyDir vols
* example
* extend docs a bit
* not create pvc if existing claim is set
* helm... you are dumb really. how this fixes an unrelated test
* add configmap
* add secret vol
* add pvc vol
* add hostpath
* finish volumes
* initial podsec
* podsec context with some todo's to check
* automatic sysctls
* remove todo
* update doc struct
* split docs
* split service docs
* initial container plumbing
* fix tests
* fix test
* rename to class
* command and args
* termination
* add lifecycle
* int value from tpl
* another case
* fix service protocol tpl
* update readme
* ports
* update todo
* cleanup values a bit
* only add sysctl when port is bellow 1024
* whops, thats a different range
* update avlue
* move some old docs to the "to be deleted" dir
* externalinteface validation
* update an error message and apply externalinterface annotations to workloads
* external interfaces
* TZ - TIMEZONE
* update rdoc
* reduce code duple
* device vol type
* initial certificate plumbing
* update comments
* finish secret creation of certificate
* cert dosc
* volumeMounts
* scale certs
* doc
* add tests for volMounts
* values updates
* update todo
* add test case
* remove some todo
* update todos
* vct
* remove tdoo
* restore default
* rename function
* make selectorlabels a bit better
* trim
* some cleanup
* update some ci values
* update ci
* rollingup defaults
* rename dir
* fix nil pointers
* check the same strategy var
* whops
* fix tests
* typo
* not a good day for copy paste
* move check
* move another check
* fix some tests for upcoming probes
* one mroe
* split docs
* add default probes for `main` and docs
* add probes and some ci testruns
* whops
* fix an edge case
* add an error for edge case
* runtests
* runtest updaets
* update
* check if podvalues exist first
* force types
* force only one of the 2
* quote labels and annotaions values
* job/cron have auto gen selectors
* remove false test
* fix maxsureg
* fix end
* different fix
* fix some tests
* fix rollUp
* try to fix 3.9.4 helm
* move file to helpers
* use capital types in probes and lifecycle
* Revert "use capital types in probes and lifecycle"
This reverts commit 380ebd5f1f.
* typo
* use lowercase for protocol everywhere
* rbac runtest
* prune old
* add resources
* add resources
* fix rbc
* fix sa naming in pod
* fix test
* 44 suppl group on gpu
* remove todo
* extract function in another file
* whops
* add securityContext implementation
* add fail cases
* add rest of the tests
* remove todo
* envFrom
* minify
* env list
* add env
* add envdupe check tests
* add fixed envs
* replace containers with callers
* add callers
* add initContainer
* add init run test
* reset default test val
* add name tests
* add some more tests
* rename
* validate workload type only if enabled
* lint fix for 3.9.4
* add tpl on init enabled
* whops
* fix init
* echo
* echo
* args...
* list
* comment out disabled persistences
* fix some typos and improve resources `requests` requirement
* improve docs a bit
* require name,description,version,type
* add some wording regarding what Helm Template column means
* add title as requirement
* remove scheduler
* remove priority class name
* remove nfs + externalIP
* remove LB
* remove STS & VCT
* fix a test
* remove nodeselector
* remove DS
* remove pvc
* remove todo
* conditionally print the type, as we might want to use the template to select all objects inthe chart
* add some docs
* docs for notes
* add `tls.` in the certificate secret, according to k8s docs
* add some basic docs around the rest of the options
* clean values.yaml
* catch an edge case
* remove externalName
* set autmountSA on SA to false
* add note about the automountSA
iX Official Catalog
A curated collection of TrueNAS SCALE enhanced Helm charts.
TrueNAS SCALE Chart Structure
A TrueNAS SCALE chart repository differs slightly in directory structure from upstream repos in that it includes an app version directory.
A TrueNAS SCALE chart also has three additional files an app-readme.md file that provides a high level overview display in the TrueNAS SCALE UI and a questions.yaml file defining questions to prompt the user with and an item.yaml file outlining item specific details.
There are 2 directories charts and test, each representing a train. Chart releases created from catalog items in a specific train cannot be moved to another train. Currently only the charts train can be used inside the UI.
charts/ix-chart/<chart version>/
app-readme.md # TrueNAS SCALE Specific: Readme file for display in TrueNAS SCALE UI
charts/ # Directory containing dependency charts
Chart.yaml # Required Helm chart information file
questions.yaml # TrueNAS SCALE Specific: File containing questions for TrueNAS SCALE UI
README.md # Optional: Helm Readme file (will be rendered in TrueNAS SCALE UI as well)
templates/ # A directory of templates that, when combined with values.yml will generate K8s YAML
values.yaml # The default configuration values for this chart
See the upstream Helm chart developer reference for a complete walk through of developing charts.
To convert an upstream chart to take advantage of TrueNAS SCALE enhanced UX, first create an item.yaml file.
This file among other catalog item information provides a list of categories that this chart fits into. This helps users navigate and filtering when browsing the catalog UI.
$ cat charts/ix-chart/item.yaml
categories:
- generic
icon_url: "http://ix_url"
After that create app-readme.md file.
$ cat charts/ix-chart/<chart version>/app-readme.md
# iX-Chart
iX-chart is a chart designed to let user deploy a docker image in a TrueNAS SCALE kubernetes cluster.
It provides a mechanism to specify workload type, add external host interfaces in the pods, configure volumes and allocate host resources to the workload.
Then add a questions.yaml file to prompt the user for something.
groups:
- name: "Container Images"
description: "Image to be used for container"
questions:
- variable: image
label: "Docker Image"
description: "Docker Image Details"
group: "Container Images"
schema:
type: dict
required: true
attrs:
- variable: repository
description: "Docker image repository"
label: "Image repository"
schema:
type: string
required: true
- variable: tag
description: "Tag to use for specified image"
label: "Image Tag"
schema:
type: string
default: "latest"
- variable: pullPolicy
description: "Docker Image Pull Policy"
label: "Image Pull Policy"
schema:
type: string
default: "IfNotPresent"
enum:
- value: "IfNotPresent"
description: "Only pull image if not present on host"
- value: "Always"
description: "Always pull image even if present on host"
- value: "Never"
description: "Never pull image even if it's not present on host"
The above will prompt the user with 2 text fields and a dropdown in the UI getting details for image configuration in a helm chart.
Question Variable Reference
| Variable | Type | Required | Description |
|---|---|---|---|
| variable | string | true | define the variable name specified in the values.yamlfile. |
| label | string | true | define the UI label. |
| description | string | false | specify the description of the variable. |
| group | string | false | group questions by input value. |
| schema | dictionary | true | specify schema details for the variable |
| schema.type | string | true | specify type of value for variable (current supported types are string, int, boolean, path, hostpath, list, dict, ipaddr, and cron). |
| schema.required | bool | false | define if the variable is required or not (true \ false), defaults to false |
| schema.default | object | false | specify the default value. |
| schema.min_length | int | false | min character length for string type variable. |
| schema.max_length | int | false | max character length for string type variable. |
| schema.min | int | false | min integer length. |
| schema.max | int | false | max integer length. |
| schema.enum | []dictionary | false | specify the options when the variable type is string, for example, enum: - value: "RollingUpdate" description: "Create new pods and then kill old ones" - value: "Recreate" description: "Kill existing pods before creating new ones" |
| schema.valid_chars | string | false | regular expression for input chars validation. |
| schema.subquestions | []subquestion | false | add an array of subquestions. |
| schema.show_if | string | false | show current variable if condition specified is true, for example show_if: [["workloadType", "=", "CronJob"]] |
| schema.show_subquestions_if | string | false | show subquestions if is true or equal to one of the options. for example show_subquestion_if: "static". system will convert this to the filters format specifid for shcema.show_if automatically. |
| schema.attrs | []variables | false | specified when schema.type is dictionary to declare attributes allowed in the dictionary. |
| schema.items | []variables | false | specified when schema.type is list to declare attributes allowed in the list. |
| schema.private | bool | false | specified for declaring information sensitive fields. |
| schema.null | bool | false | specifies if the value for the variable can be null. defaults to false. |
subquestions: subquestions[] cannot contain subquestions or show_subquestions_if keys, but all other keys in the above table are supported. Also variables having schema.type list do not support subquestions.
There are some novel cases where we would like to provide ability to configure / manage resources for workloads with getting some data from system dynamically. So a chart can specify certain actions to be performed by the system for a variable by defining a reference. An example better illustrates this concept:
- variable: volume
label: "Volume"
schema:
type: dict
$ref:
- "normalize/ixVolume"
attrs:
- variable: mountPath
label: "Mount Path"
description: "Path where the volume will be mounted inside the pod"
schema:
type: path
required: true
- variable: datasetName
label: "Dataset Name"
schema:
type: string
required: true
In the above variable we define a $ref in schema which specifies that the system should take some action for normalising the value specified for the variable.
In this specific case, ix_volume is a concept introduced where we recommend using a volume which we are able to rollback automatically on chart release rollback. In essence,
it is just a hostPath volume for which the system automatically creates the dataset specified.
We have following types of actions supported in $ref right now:
- definitions
- normalize
For (1), system will automatically update schema for a particular definition. For example,
- variable: hostInterface
description: "Please specify host interface"
label: "Host Interface"
schema:
type: string
required: true
$ref:
- "definitions/interface"
System will automatically populate available interfaces for the user based on what interfaces are available on the system.
For (2), system will normalize values or perform some actions as discussed above.