diff --git a/scale-catalog-template/.github/workflows/PR_testing.yaml b/scale-catalog-template/.github/workflows/PR_testing.yaml
new file mode 100644
index 00000000..001e3c06
--- /dev/null
+++ b/scale-catalog-template/.github/workflows/PR_testing.yaml
@@ -0,0 +1,36 @@
+name: "Apps: Test PR"
+
+on: [pull_request]
+
+jobs:
+ test-apps:
+ runs-on: ubuntu-latest
+ container:
+ image: ixsystems/catalog_validation:latest
+
+ steps:
+ - name: Install Helm
+ run: /bin/bash -c "curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash"
+
+ - name: Checkout
+ uses: actions/checkout@v2
+ with:
+ fetch-depth: 0
+
+ - name: Fetch base branch history
+ run: git fetch origin master:master
+
+ - name: Setup catalog validation
+ run: |
+ sudo apt update > /dev/null 2>&1
+ sudo apt install -y python3-all-dev python3-pip python3-setuptools > /dev/null 2>&1
+ git clone https://github.com/truenas/catalog_validation
+ sudo pip3 install --disable-pip-version-check --exists-action w -r catalog_validation/requirements.txt > /dev/null 2>&1
+ sudo pip3 install -U catalog_validation/.
+
+ - name: Validate catalog format
+ run: |
+ /bin/bash -c "PWD=${pwd}; /usr/local/bin/catalog_validate validate --path $PWD"
+
+ - name: Validate changed charts
+ run: /bin/bash -c "PWD=${pwd}; sudo /usr/local/bin/charts_validate deploy --path $PWD"
\ No newline at end of file
diff --git a/scale-catalog-template/.github/workflows/Push_testing.yaml b/scale-catalog-template/.github/workflows/Push_testing.yaml
new file mode 100644
index 00000000..47d58ac7
--- /dev/null
+++ b/scale-catalog-template/.github/workflows/Push_testing.yaml
@@ -0,0 +1,17 @@
+name: "Apps: Test Push"
+
+on: [push]
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ container:
+ image: ixsystems/catalog_validation:latest
+
+ steps:
+ - uses: actions/checkout@v1
+ name: Checkout
+
+ - name: Validate catalog format
+ run: |
+ /bin/bash -c "PWD=${pwd}; /usr/local/bin/catalog_validate validate --path $PWD"
\ No newline at end of file
diff --git a/scale-catalog-template/.gitignore b/scale-catalog-template/.gitignore
new file mode 100644
index 00000000..cf607c2b
--- /dev/null
+++ b/scale-catalog-template/.gitignore
@@ -0,0 +1,47 @@
+*.pyc
+*.swp
+*.mo
+*.o
+*.iso
+__pycache__
+*.xml
+*.pyc
+.cache
+.pytest_cache
+config.py
+auto_config.py
+.DS_Store
+.idea/
+.vscode/
+# IDE resources
+.vscode
+.idea
+.devcontainer/
+Gemfile.lock
+.ignore/
+/docs/api/_build/
+/docs/userguide/_build/
+/gui/local_settings.py
+gui/static/
+/FreeBSD/
+/filtered-patches/
+/os-base/
+/pbi/
+/sbin/
+src/middlewared/build/
+src/middlewared/dist/
+src/middlewared/middlewared.egg-info/
+.git-repo-setting
+nas_source/
+webui/node_modules/
+webui/dll/
+webui/dist/
+npm-debug.log
+tests/artifacts/
+tests/test-report.txt
+tests/test-report.xml
+private_values.yaml
+temp/
+library/common-test/charts/
+.cr-release-packages/
+library/common-test/chart.lock
diff --git a/scale-catalog-template/.helmdocsignore b/scale-catalog-template/.helmdocsignore
new file mode 100644
index 00000000..e69de29b
diff --git a/scale-catalog-template/LICENSE b/scale-catalog-template/LICENSE
new file mode 100644
index 00000000..178aba7d
--- /dev/null
+++ b/scale-catalog-template/LICENSE
@@ -0,0 +1,25 @@
+BSD 2-Clause License
+
+Copyright (c) 2021, TrueCharts
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/scale-catalog-template/charts/syncthing/3.1.5/CONFIG.md b/scale-catalog-template/charts/syncthing/3.1.5/CONFIG.md
new file mode 100644
index 00000000..6d760c18
--- /dev/null
+++ b/scale-catalog-template/charts/syncthing/3.1.5/CONFIG.md
@@ -0,0 +1,8 @@
+# Configuration Options
+
+##### Connecting to other apps
+If you need to connect this App to other Apps on TrueNAS SCALE, please refer to our "Linking Apps Together" guide:
+https://truecharts.org/manual/linking/
+
+##### Available config options
+In the future this page is going to contain an automated list of options available in the installation/edit UI.
diff --git a/scale-catalog-template/charts/syncthing/3.1.5/Chart.lock b/scale-catalog-template/charts/syncthing/3.1.5/Chart.lock
new file mode 100644
index 00000000..21034bcf
--- /dev/null
+++ b/scale-catalog-template/charts/syncthing/3.1.5/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+digest: sha256:ea66c36be2fa73e56bc33f7e89af9ce338cdfbed0b347484888e87228b825015
+generated: "2021-05-06T13:29:42.632316521Z"
diff --git a/scale-catalog-template/charts/syncthing/3.1.5/Chart.yaml b/scale-catalog-template/charts/syncthing/3.1.5/Chart.yaml
new file mode 100644
index 00000000..f6f7c3bf
--- /dev/null
+++ b/scale-catalog-template/charts/syncthing/3.1.5/Chart.yaml
@@ -0,0 +1,30 @@
+apiVersion: v2
+kubeVersion: ">=1.16.0-0"
+name: syncthing
+version: 3.1.5
+# upstream_version:
+appVersion: "auto"
+description: P2P file synchronization application
+type: application
+deprecated: false
+home: https://github.com/truecharts/apps/tree/master/stable/syncthing
+icon: https://raw.githubusercontent.com/syncthing/syncthing/main/assets/logo-128.png
+keywords:
+ - syncthing
+sources:
+ - https://syncthing.net/
+ - https://github.com/syncthing/syncthing
+ - https://hub.docker.com/r/syncthing/syncthing
+dependencies:
+ - name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+ # condition:
+maintainers:
+ - name: TrueCharts
+ email: info@truecharts.org
+ url: truecharts.org
+ - name: luuknieuwdorp
+ email: luuk@nieuwdorp.me
+ url: nieuwdorp.me
+# annotations:
diff --git a/scale-catalog-template/charts/syncthing/3.1.5/README.md b/scale-catalog-template/charts/syncthing/3.1.5/README.md
new file mode 100644
index 00000000..fdc91d9c
--- /dev/null
+++ b/scale-catalog-template/charts/syncthing/3.1.5/README.md
@@ -0,0 +1,55 @@
+# Introduction
+
+![Version: 3.1.5](https://img.shields.io/badge/Version-3.1.5-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: auto](https://img.shields.io/badge/AppVersion-auto-informational?style=flat-square)
+
+P2P file synchronization application
+
+TrueCharts are designed to be installed as TrueNAS SCALE app only. We can not guarantee this charts works as a stand-alone helm installation.
+**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/apps/issues/new/choose)**
+
+## Source Code
+
+*
+*
+*
+
+## Requirements
+
+Kubernetes: `>=1.16.0-0`
+
+## Dependencies
+
+| Repository | Name | Version |
+|------------|------|---------|
+| https://truecharts.org/ | common | 3.5.5 |
+
+## Installing the Chart
+
+To install the chart with the release name `syncthing`
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Click "Install" for this specific Apps
+- Fill out the configuration form
+
+## Uninstalling the Chart
+
+To uninstall the `syncthing` deployment
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Go to "Installed Apps"
+- Expand the menu in the top-right corner of this App
+- Click "Remove" for this specific Apps
+
+The command removes all the Kubernetes components associated with the chart **including storage volumes** _(Except hostPath Storage)_ and deletes the release.
+
+## Support
+
+- See the [Wiki](https://truecharts.org)
+- Open a [issue](https://github.com/truecharts/apps/issues/new/choose)
+- Ask a [question](https://github.com/truecharts/apps/discussions)
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
+All Rights Reserved - The TrueCharts Project
diff --git a/scale-catalog-template/charts/syncthing/3.1.5/app-readme.md b/scale-catalog-template/charts/syncthing/3.1.5/app-readme.md
new file mode 100644
index 00000000..7eaa0780
--- /dev/null
+++ b/scale-catalog-template/charts/syncthing/3.1.5/app-readme.md
@@ -0,0 +1,3 @@
+P2P file synchronization application
+This App is supplied by TrueCharts, for more information please visit https://truecharts.org
+P2P file synchronization application
diff --git a/scale-catalog-template/charts/syncthing/3.1.5/charts/common-3.5.5.tgz b/scale-catalog-template/charts/syncthing/3.1.5/charts/common-3.5.5.tgz
new file mode 100644
index 00000000..d01688bb
Binary files /dev/null and b/scale-catalog-template/charts/syncthing/3.1.5/charts/common-3.5.5.tgz differ
diff --git a/scale-catalog-template/charts/syncthing/3.1.5/ix_values.yaml b/scale-catalog-template/charts/syncthing/3.1.5/ix_values.yaml
new file mode 100644
index 00000000..2c38d653
--- /dev/null
+++ b/scale-catalog-template/charts/syncthing/3.1.5/ix_values.yaml
@@ -0,0 +1,15 @@
+##
+# This file contains Values.yaml content that gets added to the output of questions.yaml
+# It's ONLY meant for content that the user is NOT expected to change.
+# Example: Everything under "image" is not included in questions.yaml but is included here.
+##
+
+image:
+ repository: syncthing/syncthing
+ pullPolicy: IfNotPresent
+ tag: 1.16
+
+##
+# Most other defaults are set in questions.yaml
+# For other options please refer to the wiki, default_values.yaml or the common library chart
+##
diff --git a/scale-catalog-template/charts/syncthing/3.1.5/questions.yaml b/scale-catalog-template/charts/syncthing/3.1.5/questions.yaml
new file mode 100644
index 00000000..9110b80d
--- /dev/null
+++ b/scale-catalog-template/charts/syncthing/3.1.5/questions.yaml
@@ -0,0 +1,418 @@
+groups:
+ - name: "Container Image"
+ description: "Image to be used for container"
+ - name: "Workload Configuration"
+ description: "Configure workload deployment"
+ - name: "Configuration"
+ description: "additional container configuration"
+ - name: "Networking"
+ description: "Configure / service for container"
+ - name: "Storage"
+ description: "Persist and share data that is separate from the lifecycle of the container"
+ - name: "Resources and Devices"
+ description: "Specify resources/devices to be allocated to workload"
+ - name: "Reverse Proxy Configuration"
+ description: "Reverse Proxy configuration"
+ - name: "Advanced"
+ description: "Advanced Configuration"
+ - name: "WARNING"
+ description: "WARNING"
+portals:
+ web_portal:
+ protocols:
+ - "$kubernetes-resource_configmap_portal_protocol"
+ host:
+ - "$kubernetes-resource_configmap_portal_host"
+ ports:
+ - "$kubernetes-resource_configmap_portal_port"
+questions:
+ - variable: portal
+ group: "Container Image"
+ label: "Configure Portal Button"
+ schema:
+ type: dict
+ hidden: true
+ attrs:
+ - variable: enabled
+ label: "Enable"
+ description: "enable the portal button"
+ schema:
+ hidden: true
+ editable: false
+ type: boolean
+ default: true
+ # Update Policy
+ - variable: strategyType
+ group: "Container Image"
+ label: "Update Strategy"
+ schema:
+ type: string
+ default: "Recreate"
+ enum:
+ - value: "RollingUpdate"
+ description: "Create new pods and then kill old ones"
+ - value: "Recreate"
+ description: "Kill existing pods before creating new ones"
+
+ # Configure Enviroment Variables
+ - variable: environmentVariables
+ label: "Image environment"
+ group: "Configuration"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: environmentVariable
+ label: "Environment Variable"
+ schema:
+ type: dict
+ attrs:
+ - variable: name
+ label: "Name"
+ schema:
+ type: string
+ - variable: value
+ label: "Value"
+ schema:
+ type: string
+
+ # Enable Host Networking
+ - variable: hostNetwork
+ group: "Networking"
+ label: "Enable Host Networking"
+ schema:
+ type: boolean
+ default: false
+ - variable: services
+ group: "Networking"
+ label: "Configure Service"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "Main service"
+ description: "The Primary service on which the healthcheck runs, often the webUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: false
+ enum:
+ - value: HTTP
+ description: "HTTP"
+ - value: "HTTPS"
+ description: "HTTPS"
+ - variable: port
+ label: "Container port"
+ schema:
+ type: int
+ default: 8384
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 8384
+ editable: false
+ hidden: true
+ # - variable: nodePort
+ # label: "Host nodePort to expose to (optional)"
+ # description: "Only gets used when nodePort is selected"
+ # schema:
+ # type: int
+ # min: 9000
+ # max: 65535
+ # default: 36024
+ # required: true
+## TrueCharts Specific
+ - variable: persistence
+ label: "Integrated Persistent Storage"
+ group: "Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: config
+ label: "App Config Storage"
+ description: "Stores the Application Configuration."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: "/var/syncthing"
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "100Gi"
+ - variable: customStorage
+ label: "Custom app storage"
+ group: "Storage"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: volumeMount
+ label: "Custom Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enabled"
+ schema:
+ type: boolean
+ default: true
+ required: true
+ hidden: true
+ editable: false
+ - variable: setPermissions
+ label: "Automatic Permissions"
+ description: "Automatically set permissions on install"
+ schema:
+ type: boolean
+ default: true
+ hidden: false
+ - variable: readOnly
+ label: "Mount as ReadOnly"
+ description: "prevent any write from being done to the mounted volume"
+ schema:
+ type: boolean
+ default: false
+ hidden: false
+ - variable: emptyDir
+ label: "emptyDir"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ editable: false
+ - variable: mountPath
+ label: "Mount Path"
+ description: "Path to mount inside the pod"
+ schema:
+ type: path
+ required: true
+ default: ""
+ editable: true
+ - variable: hostPath
+ label: "Host Path"
+ schema:
+ type: hostpath
+ required: true
+ - variable: ingress
+ label: ""
+ group: "Reverse Proxy Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "WebUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: certType
+ label: "Select Reverse-Proxy Type"
+ schema:
+ type: string
+ default: "disabled"
+ enum:
+ - value: "disabled"
+ description: "Disabled"
+ - value: ""
+ description: "No Encryption/TLS/Certificates"
+ - value: "selfsigned"
+ description: "Self-Signed Certificate"
+ - value: "ixcert"
+ description: "TrueNAS SCALE Certificate"
+ - variable: type
+ label: "Reverse Proxy Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: true
+ editable: false
+ required: true
+ - variable: serviceName
+ label: "Service name to proxy to"
+ schema:
+ hidden: true
+ editable: false
+ type: string
+ default: ""
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: "websecure"
+ required: true
+ enum:
+ - value: "websecure"
+ description: "Websecure: HTTPS/TLS port 443"
+ - variable: hosts
+ label: "Hosts"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: list
+ default: []
+ items:
+ - variable: host
+ label: "Host"
+ schema:
+ type: dict
+ attrs:
+ - variable: host
+ label: "Domain Name"
+ required: true
+ schema:
+ type: string
+ - variable: path
+ label: "path"
+ schema:
+ type: string
+ required: true
+ hidden: true
+ default: "/"
+ - variable: certificate
+ label: "Select TrueNAS SCALE Certificate"
+ schema:
+ type: int
+ show_if: [["certType", "=", "ixcert"]]
+ $ref:
+ - "definitions/certificate"
+ - variable: authForwardURL
+ label: "Forward Authentication URL"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: ""
+ # Enable privileged
+ - variable: securityContext
+ group: "Advanced"
+ label: "Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: privileged
+ label: "Enable privileged mode for Common-Chart based charts"
+ schema:
+ type: boolean
+ default: false
+ # Set Pod Security Policy
+ - variable: podSecurityContext
+ group: "Advanced"
+ label: "Pod Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: runAsNonRoot
+ label: "runAsNonRoot"
+ schema:
+ type: boolean
+ default: true
+ - variable: runAsUser
+ label: "runAsUser"
+ description: "The UserID of the user running the application"
+ schema:
+ type: int
+ default: 568
+ - variable: runAsGroup
+ label: "runAsGroup"
+ description: The groupID this App of the user running the application"
+ schema:
+ type: int
+ default: 568
+ - variable: supplementalGroups
+ label: "supplementalGroups"
+ description: "Additional groups this App needs access to"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: Group
+ label: "Group"
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroup
+ label: "fsGroup"
+ description: "The group that should own ALL storage."
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroupChangePolicy
+ label: "When should we take ownership?"
+ schema:
+ type: string
+ default: "OnRootMismatch"
+ enum:
+ - value: "OnRootMismatch"
+ description: "OnRootMismatch"
+ - value: "Always"
+ description: "Always"
diff --git a/scale-catalog-template/charts/syncthing/3.1.5/templates/common.yaml b/scale-catalog-template/charts/syncthing/3.1.5/templates/common.yaml
new file mode 100644
index 00000000..a6613c2c
--- /dev/null
+++ b/scale-catalog-template/charts/syncthing/3.1.5/templates/common.yaml
@@ -0,0 +1 @@
+{{ include "common.all" . }}
diff --git a/scale-catalog-template/charts/syncthing/3.1.5/test_values.yaml b/scale-catalog-template/charts/syncthing/3.1.5/test_values.yaml
new file mode 100644
index 00000000..b0677868
--- /dev/null
+++ b/scale-catalog-template/charts/syncthing/3.1.5/test_values.yaml
@@ -0,0 +1,23 @@
+# Default values for Syncthing.
+
+image:
+ repository: syncthing/syncthing
+ pullPolicy: IfNotPresent
+ tag: 1.16
+
+strategy:
+ type: Recreate
+
+services:
+ main:
+ port:
+ port: 8384
+
+persistence:
+ config:
+ enabled: true
+ emptyDir: true
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ storageClass: ""
+ mountPath: "/var/syncthing/"
diff --git a/scale-catalog-template/charts/syncthing/3.1.5/values.yaml b/scale-catalog-template/charts/syncthing/3.1.5/values.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/scale-catalog-template/charts/syncthing/item.yaml b/scale-catalog-template/charts/syncthing/item.yaml
new file mode 100644
index 00000000..62634b42
--- /dev/null
+++ b/scale-catalog-template/charts/syncthing/item.yaml
@@ -0,0 +1,3 @@
+categories:
+ - media
+icon_url: https://raw.githubusercontent.com/syncthing/syncthing/main/assets/logo-128.png
diff --git a/scale-catalog-template/docs/README.md b/scale-catalog-template/docs/README.md
new file mode 100644
index 00000000..cbc3147c
--- /dev/null
+++ b/scale-catalog-template/docs/README.md
@@ -0,0 +1,13 @@
+# catalog_template
+Use this to start your own Basic TrueNAS SCALE Catalog
+
+It contains:
+
+- Base folder structure
+- Basic required files
+- 3 example Trains (charts, stable and test)
+- 1 example app in each train (each based on TrueCharts)
+- 1 library train (which is not processed by CI
+- 1 example library (common)
+- Basic CI to test PR's and catalog-health
+- docs folder (ignored by testing) with readme.md file
diff --git a/scale-catalog-template/features_capability.json b/scale-catalog-template/features_capability.json
new file mode 100644
index 00000000..14b386c7
--- /dev/null
+++ b/scale-catalog-template/features_capability.json
@@ -0,0 +1,42 @@
+{
+ "normalize/interfaceConfiguration": {
+ "stable": {"min": "20.12-ALPHA"},
+ "nightlies": {"min": "20.10-MASTER-somever"}
+ },
+ "normalize/ixVolume": {
+ "stable": {"min": "20.12-ALPHA"},
+ "nightlies": {"min": "20.10-MASTER-somever"}
+ },
+ "definitions/interface": {
+ "stable": {"min": "20.12-ALPHA"},
+ "nightlies": {"min": "20.10-MASTER-somever"}
+ },
+ "definitions/gpuConfiguration": {
+ "stable": {"min": "20.12-ALPHA"},
+ "nightlies": {"min": "20.10-MASTER-somever"}
+ },
+ "definitions/timezone": {
+ "stable": {"min": "20.12-ALPHA"},
+ "nightlies": {"min": "20.12-MASTER"}
+ },
+ "definitions/nodeIP": {
+ "stable": {"min": "20.12-ALPHA"},
+ "nightlies": {"min": "20.12-MASTER"}
+ },
+ "definitions/certificate": {
+ "stable": {"min": "21.04-ALPHA"},
+ "nightlies": {"min": "21.02-MASTER"}
+ },
+ "definitions/certificateAuthority": {
+ "stable": {"min": "21.04-ALPHA"},
+ "nightlies": {"min": "21.02-MASTER"}
+ },
+ "validations/containerImage": {
+ "stable": {"min": "21.06-BETA"},
+ "nightlies": {"min": "21.04-MASTER"}
+ },
+ "validations/nodePort": {
+ "stable": {"min": "21.04-ALPHA"},
+ "nightlies": {"min": "21.04-MASTER"}
+ }
+}
diff --git a/scale-catalog-template/library/common/.helmignore b/scale-catalog-template/library/common/.helmignore
new file mode 100644
index 00000000..0e8a0eb3
--- /dev/null
+++ b/scale-catalog-template/library/common/.helmignore
@@ -0,0 +1,23 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*.orig
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/scale-catalog-template/library/common/Chart.yaml b/scale-catalog-template/library/common/Chart.yaml
new file mode 100644
index 00000000..67d13c13
--- /dev/null
+++ b/scale-catalog-template/library/common/Chart.yaml
@@ -0,0 +1,26 @@
+apiVersion: v2
+kubeVersion: ">=1.16.0-0"
+name: common
+version: 3.5.5
+# upstream_version:
+appVersion: none
+description: Function library for TrueCharts
+type: library
+deprecated: false
+home: https://github.com/truecharts/apps/tree/master/common
+icon: https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png
+keywords:
+ - truecharts
+ - library-chart
+ - common
+sources:
+ - https://github.com/truecharts/apps/tree/master/library/common
+# dependencies:
+maintainers:
+ - name: TrueCharts
+ email: info@truecharts.org
+ url: truecharts.org
+ - name: Ornias1993
+ email: kjeld@schouten-lebbing.nl
+ url: truecharts.org
+# annotations:
diff --git a/scale-catalog-template/library/common/README.md b/scale-catalog-template/library/common/README.md
new file mode 100644
index 00000000..7b8dbf3c
--- /dev/null
+++ b/scale-catalog-template/library/common/README.md
@@ -0,0 +1,151 @@
+# common
+
+![Version: 1.3.0](https://img.shields.io/badge/Version-1.3.0-informational?style=flat-square) ![Type: library](https://img.shields.io/badge/Type-library-informational?style=flat-square)
+
+Function library for TrueCharts
+
+**Homepage:**
+
+## Maintainers
+
+| Name | Email | Url |
+| ---- | ------ | --- |
+| truecharts | | |
+
+## Requirements
+
+Kubernetes: `>=1.16.0-0`
+
+## Values
+
+| Key | Type | Default | Description |
+|-----|------|---------|-------------|
+| PGID | int | `568` | |
+| PUID | int | `568` | |
+| UMASK | string | `"002"` | |
+| additionalContainers | list | `[]` | |
+| additionalVolumeMounts | list | `[]` | |
+| additionalVolumes | list | `[]` | |
+| addons.codeserver.args[0] | string | `"--auth"` | |
+| addons.codeserver.args[1] | string | `"none"` | |
+| addons.codeserver.enabled | bool | `false` | |
+| addons.codeserver.env | object | `{}` | |
+| addons.codeserver.image.pullPolicy | string | `"IfNotPresent"` | |
+| addons.codeserver.image.repository | string | `"codercom/code-server"` | |
+| addons.codeserver.image.tag | string | `"3.7.4"` | |
+| addons.codeserver.ingress.annotations | object | `{}` | |
+| addons.codeserver.ingress.enabled | bool | `false` | |
+| addons.codeserver.ingress.hosts[0].host | string | `"code.chart-example.local"` | |
+| addons.codeserver.ingress.hosts[0].paths[0].path | string | `"/"` | |
+| addons.codeserver.ingress.hosts[0].paths[0].pathType | string | `"Prefix"` | |
+| addons.codeserver.ingress.labels | object | `{}` | |
+| addons.codeserver.ingress.nameSuffix | string | `"codeserver"` | |
+| addons.codeserver.ingress.tls | list | `[]` | |
+| addons.codeserver.securityContext.runAsUser | int | `0` | |
+| addons.codeserver.service.annotations | object | `{}` | |
+| addons.codeserver.service.enabled | bool | `true` | |
+| addons.codeserver.service.labels | object | `{}` | |
+| addons.codeserver.service.port.name | string | `"codeserver"` | |
+| addons.codeserver.service.port.port | int | `12321` | |
+| addons.codeserver.service.port.protocol | string | `"TCP"` | |
+| addons.codeserver.service.port.targetPort | string | `"codeserver"` | |
+| addons.codeserver.service.type | string | `"ClusterIP"` | |
+| addons.codeserver.volumeMounts | list | `[]` | |
+| addons.codeserver.workingDir | string | `""` | |
+| addons.vpn.additionalVolumeMounts | list | `[]` | |
+| addons.vpn.configFile | string | `nil` | |
+| addons.vpn.enabled | bool | `false` | |
+| addons.vpn.env | object | `{}` | |
+| addons.vpn.livenessProbe | object | `{}` | |
+| addons.vpn.networkPolicy.egress | string | `nil` | |
+| addons.vpn.networkPolicy.enabled | bool | `false` | |
+| addons.vpn.openvpn.auth | string | `nil` | |
+| addons.vpn.openvpn.authSecret | string | `nil` | |
+| addons.vpn.openvpn.image.pullPolicy | string | `"IfNotPresent"` | |
+| addons.vpn.openvpn.image.repository | string | `"dperson/openvpn-client"` | |
+| addons.vpn.openvpn.image.tag | string | `"latest"` | |
+| addons.vpn.scripts.down | string | `nil` | |
+| addons.vpn.scripts.up | string | `nil` | |
+| addons.vpn.securityContext.capabilities.add[0] | string | `"NET_ADMIN"` | |
+| addons.vpn.securityContext.capabilities.add[1] | string | `"SYS_MODULE"` | |
+| addons.vpn.type | string | `"openvpn"` | |
+| addons.vpn.wireguard.image.pullPolicy | string | `"IfNotPresent"` | |
+| addons.vpn.wireguard.image.repository | string | `"k8sathome/wireguard"` | |
+| addons.vpn.wireguard.image.tag | string | `"1.0.20200827"` | |
+| affinity | object | `{}` | |
+| args | list | `[]` | |
+| command | list | `[]` | |
+| controllerAnnotations | object | `{}` | |
+| controllerLabels | object | `{}` | |
+| controllerType | string | `"deployment"` | |
+| dnsPolicy | string | `"ClusterFirst"` | |
+| enableServiceLinks | bool | `true` | |
+| env | object | `{}` | |
+| envFrom | list | `[]` | |
+| envTpl | object | `{}` | |
+| envValueFrom | object | `{}` | |
+| fixMountPermissions | bool | `true` | |
+| fullnameOverride | string | `""` | |
+| hostAliases | list | `[]` | |
+| hostNetwork | bool | `false` | |
+| ingress.additionalIngresses | list | `[]` | |
+| ingress.annotations | object | `{}` | |
+| ingress.enabled | bool | `false` | |
+| ingress.hosts[0].host | string | `"chart-example.local"` | |
+| ingress.hosts[0].paths[0].path | string | `"/"` | |
+| ingress.hosts[0].paths[0].pathType | string | `"Prefix"` | |
+| ingress.labels | object | `{}` | |
+| ingress.tls | list | `[]` | |
+| initContainers | list | `[]` | |
+| nameOverride | string | `""` | |
+| nodeSelector | object | `{}` | |
+| persistence.config.accessMode | string | `"ReadWriteOnce"` | |
+| persistence.config.enabled | bool | `false` | |
+| persistence.config.mountPath | string | `"/config"` | |
+| persistence.config.size | string | `"1Gi"` | |
+| persistence.config.skipuninstall | bool | `false` | |
+| persistence.shared.emptyDir | bool | `true` | |
+| persistence.shared.enabled | bool | `false` | |
+| persistence.shared.mountPath | string | `"/shared"` | |
+| podAnnotations | object | `{}` | |
+| podSecurityContext | object | `{}` | |
+| probes.liveness.custom | bool | `false` | |
+| probes.liveness.enabled | bool | `true` | |
+| probes.liveness.spec.failureThreshold | int | `5` | |
+| probes.liveness.spec.initialDelaySeconds | int | `30` | |
+| probes.liveness.spec.periodSeconds | int | `10` | |
+| probes.liveness.spec.timeoutSeconds | int | `10` | |
+| probes.readiness.custom | bool | `false` | |
+| probes.readiness.enabled | bool | `true` | |
+| probes.readiness.spec.failureThreshold | int | `5` | |
+| probes.readiness.spec.initialDelaySeconds | int | `30` | |
+| probes.readiness.spec.periodSeconds | int | `10` | |
+| probes.readiness.spec.timeoutSeconds | int | `10` | |
+| probes.startup.custom | bool | `false` | |
+| probes.startup.enabled | bool | `true` | |
+| probes.startup.spec.failureThreshold | int | `30` | |
+| probes.startup.spec.initialDelaySeconds | int | `5` | |
+| probes.startup.spec.periodSeconds | int | `10` | |
+| probes.startup.spec.timeoutSeconds | int | `10` | |
+| replicas | int | `1` | |
+| resources | object | `{}` | |
+| securityContext | object | `{}` | |
+| service.additionalPorts | list | `[]` | |
+| service.additionalServices | list | `[]` | |
+| service.annotations | object | `{}` | |
+| service.enabled | bool | `true` | |
+| service.labels | object | `{}` | |
+| service.port.name | string | `nil` | |
+| service.port.port | string | `nil` | |
+| service.port.protocol | string | `"TCP"` | |
+| service.port.targetPort | string | `nil` | |
+| service.type | string | `"ClusterIP"` | |
+| serviceAccount.annotations | object | `{}` | |
+| serviceAccount.create | bool | `false` | |
+| serviceAccount.name | string | `""` | |
+| strategy.type | string | `"RollingUpdate"` | |
+| tolerations | list | `[]` | |
+| volumeClaimTemplates | list | `[]` | |
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
diff --git a/scale-catalog-template/library/common/templates/_all.tpl b/scale-catalog-template/library/common/templates/_all.tpl
new file mode 100644
index 00000000..9bb0b3ea
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/_all.tpl
@@ -0,0 +1,27 @@
+{{/*
+Main entrypoint for the common library chart. It will render all underlying templates based on the provided values.
+*/}}
+{{- define "common.all" -}}
+ {{- /* Merge the local chart values and the common chart defaults */ -}}
+ {{- include "common.values.setup" . }}
+
+ {{- /* Build the templates */ -}}
+ {{- include "common.pvc" . }}
+ {{- print "---" | nindent 0 -}}
+ {{- if .Values.serviceAccount.create -}}
+ {{- include "common.serviceAccount" . }}
+ {{- print "---" | nindent 0 -}}
+ {{- end -}}
+ {{- if eq .Values.controllerType "deployment" }}
+ {{- include "common.deployment" . | nindent 0 }}
+ {{ else if eq .Values.controllerType "daemonset" }}
+ {{- include "common.daemonset" . | nindent 0 }}
+ {{ else if eq .Values.controllerType "statefulset" }}
+ {{- include "common.statefulset" . | nindent 0 }}
+ {{- end -}}
+ {{ include "common.services" . | nindent 0 }}
+ {{ include "common.ingress" . | nindent 0 }}
+ {{ include "common.resources.portal" . | nindent 0 }}
+ {{ include "common.storage.permissions" . | nindent 0 }}
+
+{{- end -}}
diff --git a/scale-catalog-template/library/common/templates/_daemonset.tpl b/scale-catalog-template/library/common/templates/_daemonset.tpl
new file mode 100644
index 00000000..91bb0a4f
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/_daemonset.tpl
@@ -0,0 +1,52 @@
+{{/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+`SPDX-License-Identifier: Apache-2.0`
+
+This file is considered to be modified by the TrueCharts Project.
+*/}}
+
+
+{{/*
+This template serves as the blueprint for the DaemonSet objects that are created
+within the common library.
+*/}}
+{{- define "common.daemonset" -}}
+apiVersion: {{ include "common.capabilities.daemonset.apiVersion" . }}
+kind: DaemonSet
+metadata:
+ name: {{ include "common.names.fullname" . }}
+ labels:
+ {{- include "common.labels" . | nindent 4 }}
+ {{- with .Values.controllerLabels }}
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+ {{- with .Values.controllerAnnotations }}
+ annotations:
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+spec:
+ selector:
+ matchLabels:
+ {{- include "common.labels.selectorLabels" . | nindent 6 }}
+ template:
+ metadata:
+ {{- with .Values.podAnnotations }}
+ annotations:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ labels:
+ {{- include "common.labels.selectorLabels" . | nindent 8 }}
+ spec:
+ {{- include "common.controller.pod" . | nindent 6 }}
+{{- end }}
diff --git a/scale-catalog-template/library/common/templates/_deployment.tpl b/scale-catalog-template/library/common/templates/_deployment.tpl
new file mode 100644
index 00000000..caa94643
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/_deployment.tpl
@@ -0,0 +1,56 @@
+{{/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+`SPDX-License-Identifier: Apache-2.0`
+
+This file is considered to be modified by the TrueCharts Project.
+*/}}
+
+{{/*
+This template serves as the blueprint for the Deployment objects that are created
+within the common library.
+*/}}
+{{- define "common.deployment" -}}
+apiVersion: {{ include "common.capabilities.deployment.apiVersion" . }}
+kind: Deployment
+metadata:
+ name: {{ include "common.names.fullname" . }}
+ labels:
+ {{- include "common.labels" . | nindent 4 }}
+ {{- with .Values.controllerLabels }}
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+ {{- with .Values.controllerAnnotations }}
+ annotations:
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+spec:
+ replicas: {{ .Values.replicas }}
+ {{- with .Values.strategy }}
+ strategy:
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+ selector:
+ matchLabels:
+ {{- include "common.labels.selectorLabels" . | nindent 6 }}
+ template:
+ metadata:
+ {{- with .Values.podAnnotations }}
+ annotations:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ labels:
+ {{- include "common.labels.selectorLabels" . | nindent 8 }}
+ spec:
+ {{- include "common.controller.pod" . | nindent 6 }}
+{{- end }}
diff --git a/scale-catalog-template/library/common/templates/_ingress.tpl b/scale-catalog-template/library/common/templates/_ingress.tpl
new file mode 100644
index 00000000..b329c09c
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/_ingress.tpl
@@ -0,0 +1,122 @@
+{{/*
+Renders the Ingress objects required by the chart by returning a concatinated list
+of the main Ingress and any additionalIngresses.
+*/}}
+{{- define "common.ingress" -}}
+ {{- /* Generate named ingresses as required */ -}}
+ {{- range $name, $ingress := .Values.ingress }}
+ {{- $certType := $ingress.certType | default "disabled" -}}
+ {{- $enabled := $ingress.enabled | default false -}}
+ {{- if or ( ne $certType "disabled" ) ( $ingress.enabled ) -}}
+ {{- print ("---") | nindent 0 -}}
+ {{- $ingressValues := $ingress -}}
+
+ {{/* set defaults */}}
+ {{- if and (not $ingressValues.nameSuffix) ( ne $name "main" ) -}}
+ {{- $_ := set $ingressValues "nameSuffix" $name -}}
+ {{ end -}}
+
+ {{- $_ := set $ "ObjectValues" (dict "ingress" $ingressValues) -}}
+ {{- if not $ingressValues.type -}}
+ {{- $_ := set $ingressValues "type" "HTTP" -}}
+ {{ end -}}
+ {{- if not $ingressValues.certType -}}
+ {{- $_ := set $ingressValues "certType" "" -}}
+ {{ end -}}
+
+ {{- if or ( eq $ingressValues.type "TCP" ) ( eq $ingressValues.type "UDP" ) ( eq $ingressValues.type "HTTP-IR" ) -}}
+ {{- include "common.classes.ingressRoute" $ -}}
+ {{- else -}}
+ {{- include "common.classes.ingress" $ -}}
+ {{ end -}}
+
+ {{- if eq $ingressValues.certType "ixcert" -}}
+ {{- $_ := set $ "ObjectValues" (dict "certHolder" $ingressValues) -}}
+ {{- print ("---") | nindent 0 -}}
+ {{- include "common.resources.cert.secret" $ }}
+ {{ end -}}
+ {{- end }}
+ {{- end }}
+
+
+ {{- /* Generate additional ingresses as required */ -}}
+ {{- range $index, $additionalIngress := .Values.additionalIngress }}
+ {{- $certType := $additionalIngress.certType | default "disabled" -}}
+ {{- if or ( ne $certType "disabled" ) ( $additionalIngress.enabled ) -}}
+ {{- print ("---") | nindent 0 -}}
+ {{- $ingressValues := $additionalIngress -}}
+
+ {{/* set defaults */}}
+ {{- $name := $index -}}
+ {{- if $ingressValues.name -}}
+ {{- $name := $ingressValues.name -}}
+ {{- end }}
+
+ {{- if or (not $ingressValues.nameSuffix) ( ne ( $name | quote ) "main" ) -}}
+ {{- $_ := set $ingressValues "nameSuffix" $name -}}
+ {{ end -}}
+ {{- $_ := set $ "ObjectValues" (dict "ingress" $ingressValues) -}}
+ {{- if not $ingressValues.type -}}
+ {{- $_ := set $ingressValues "type" "HTTP" -}}
+ {{ end -}}
+ {{- if not $ingressValues.certType -}}
+ {{- $_ := set $ingressValues "certType" "" -}}
+ {{ end -}}
+
+ {{- if or ( eq $ingressValues.type "TCP" ) ( eq $ingressValues.type "UDP" ) ( eq $ingressValues.type "HTTP-IR" ) -}}
+ {{- include "common.classes.ingressRoute" $ -}}
+ {{- else -}}
+ {{- include "common.classes.ingress" $ -}}
+ {{ end -}}
+
+ {{- if eq $ingressValues.certType "ixcert" -}}
+ {{- $_ := set $ "ObjectValues" (dict "certHolder" $ingressValues) -}}
+ {{- print ("---") | nindent 0 -}}
+ {{- include "common.resources.cert.secret" $ }}
+ {{ end -}}
+ {{- end }}
+ {{- end }}
+
+ {{- /* Generate externalService ingresses as required */ -}}
+ {{- range $index, $externalService := .Values.externalServices }}
+ {{- $certType := $externalService.certType | default "disabled" -}}
+ {{- if or ( ne $certType "disabled" ) ( $externalService.enabled ) -}}
+ {{- print ("---") | nindent 0 -}}
+ {{- $ingressValues := $externalService -}}
+
+ {{/* set defaults */}}
+ {{- $name := $index -}}
+ {{- if $ingressValues.name -}}
+ {{- $name := $ingressValues.name -}}
+ {{- end }}
+ {{- $name = printf "%v-%v" "external" $name -}}
+
+ {{- if or (not $ingressValues.nameSuffix) -}}
+ {{- $_ := set $ingressValues "nameSuffix" $name -}}
+ {{ end -}}
+ {{- $_ := set $ "ObjectValues" (dict "ingress" $ingressValues) -}}
+ {{- if not $ingressValues.type -}}
+ {{- $_ := set $ingressValues "type" "HTTP" -}}
+ {{ end -}}
+ {{- if not $ingressValues.certType -}}
+ {{- $_ := set $ingressValues "certType" "" -}}
+ {{ end -}}
+
+ {{- if or ( eq $ingressValues.type "TCP" ) ( eq $ingressValues.type "UDP" ) ( eq $ingressValues.type "HTTP-IR" ) -}}
+ {{- include "common.classes.ingressRoute" $ -}}
+ {{- else -}}
+ {{- include "common.classes.ingress" $ -}}
+ {{ end -}}
+
+ {{- print ("---") | nindent 0 -}}
+ {{- include "common.classes.externalService" $ }}
+
+ {{- if eq $ingressValues.certType "ixcert" -}}
+ {{- $_ := set $ "ObjectValues" (dict "certHolder" $ingressValues) -}}
+ {{- print ("---") | nindent 0 -}}
+ {{- include "common.resources.cert.secret" $ }}
+ {{ end -}}
+ {{- end }}
+ {{- end }}
+
+{{- end }}
diff --git a/scale-catalog-template/library/common/templates/_pvc.tpl b/scale-catalog-template/library/common/templates/_pvc.tpl
new file mode 100644
index 00000000..1e00d3e4
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/_pvc.tpl
@@ -0,0 +1,36 @@
+{{/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+`SPDX-License-Identifier: Apache-2.0`
+
+This file is considered to be modified by the TrueCharts Project.
+*/}}
+
+{{/*
+Renders the PersistentVolumeClaim objects required by the chart by returning a concatinated list
+of all the entries of the persistence key.
+*/}}
+{{- define "common.pvc" -}}
+ {{- /* Generate pvc as required */ -}}
+ {{- range $index, $PVC := .Values.persistence }}
+ {{- if and $PVC.enabled (not (or $PVC.emptyDir $PVC.existingClaim)) -}}
+ {{- $persistenceValues := $PVC -}}
+ {{- if not $persistenceValues.nameSuffix -}}
+ {{- $_ := set $persistenceValues "nameSuffix" $index -}}
+ {{- end -}}
+ {{- $_ := set $ "ObjectValues" (dict "persistence" $persistenceValues) -}}
+ {{- print ("---") | nindent 0 -}}
+ {{- include "common.classes.pvc" $ -}}
+ {{- end }}
+ {{- end }}
+{{- end }}
diff --git a/scale-catalog-template/library/common/templates/_serviceaccount.tpl b/scale-catalog-template/library/common/templates/_serviceaccount.tpl
new file mode 100644
index 00000000..a8c0e790
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/_serviceaccount.tpl
@@ -0,0 +1,15 @@
+{{/*
+The ServiceAccount object to be created.
+*/}}
+{{- define "common.serviceAccount" -}}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+ name: {{ include "common.names.serviceAccountName" . }}
+ labels:
+ {{- include "common.labels" . | nindent 4 }}
+ {{- with .Values.serviceAccount.annotations }}
+ annotations:
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+{{- end }}
diff --git a/scale-catalog-template/library/common/templates/_services.tpl b/scale-catalog-template/library/common/templates/_services.tpl
new file mode 100644
index 00000000..9e72e9d0
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/_services.tpl
@@ -0,0 +1,46 @@
+{{/*
+Renders the Service objects required by the chart by returning a concatinated list
+of the main Service and any additionalServices.
+*/}}
+{{- define "common.services" -}}
+ {{- if .Values.services -}}
+ {{- /* Add dict of primary services */ -}}
+ {{- range $name, $service := .Values.services }}
+ {{- if or ( $service.enabled ) ( eq $name "main" ) -}}
+ {{- print ("---") | nindent 0 -}}
+ {{- print ("\n") | nindent 0 -}}
+ {{- $serviceValues := $service -}}
+
+ {{- /* Dont add name suffix for primary service named "main" */ -}}
+ {{- if and (not $serviceValues.nameSuffix) ( ne $name "main" ) -}}
+ {{- $_ := set $serviceValues "nameSuffix" $name -}}
+ {{ end -}}
+ {{- $_ := set $ "ObjectValues" (dict "service" $serviceValues) -}}
+ {{- include "common.classes.service" $ -}}
+ {{- end }}
+ {{- end }}
+ {{- end }}
+
+
+ {{- if .Values.additionalServices -}}
+ {{- /* Generate additional services as required */ -}}
+ {{- range $index, $extraService := .Values.additionalServices }}
+ {{- if $extraService.enabled -}}
+ {{- print ("---") | nindent 0 -}}
+ {{- $serviceValues := $extraService -}}
+
+ {{- $name := $index -}}
+ {{- if $serviceValues.name -}}
+ {{- $name := $serviceValues.name -}}
+ {{- end }}
+
+ {{- /* Dont add name suffix for primary service named "main" */ -}}
+ {{- if and (not $serviceValues.nameSuffix) ( ne ( $name | quote ) "main" ) -}}
+ {{- $_ := set $serviceValues "nameSuffix" $name -}}
+ {{ end -}}
+ {{- $_ := set $ "ObjectValues" (dict "service" $serviceValues) -}}
+ {{- include "common.classes.service" $ -}}
+ {{- end }}
+ {{- end }}
+ {{- end }}
+{{- end }}
diff --git a/scale-catalog-template/library/common/templates/_statefulset.tpl b/scale-catalog-template/library/common/templates/_statefulset.tpl
new file mode 100644
index 00000000..3b7915b3
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/_statefulset.tpl
@@ -0,0 +1,71 @@
+{{/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+`SPDX-License-Identifier: Apache-2.0`
+
+This file is considered to be modified by the TrueCharts Project.
+*/}}
+
+{{/*
+This template serves as the blueprint for the StatefulSet objects that are created
+within the common library.
+*/}}
+{{- define "common.statefulset" -}}
+apiVersion: {{ include "common.capabilities.statefulset.apiVersion" . }}
+kind: StatefulSet
+metadata:
+ name: {{ include "common.names.fullname" . }}
+ labels:
+ {{- include "common.labels" . | nindent 4 }}
+ {{- with .Values.controllerLabels }}
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+ {{- with .Values.controllerAnnotations }}
+ annotations:
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+spec:
+ replicas: {{ .Values.replicas }}
+ {{- with .Values.strategy }}
+ updateStrategy:
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+ selector:
+ matchLabels:
+ {{- include "common.labels.selectorLabels" . | nindent 6 }}
+ serviceName: {{ include "common.names.fullname" . }}
+ template:
+ metadata:
+ {{- with .Values.podAnnotations }}
+ annotations:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ labels:
+ {{- include "common.labels.selectorLabels" . | nindent 8 }}
+ spec:
+ {{- include "common.controller.pod" . | nindent 6 }}
+ volumeClaimTemplates:
+ {{- range $index, $vct := .Values.volumeClaimTemplates }}
+ - metadata:
+ name: {{ $vct.name }}
+ spec:
+ accessModes:
+ - {{ required (printf "accessMode is required for vCT %v" $vct.name) $vct.accessMode | quote }}
+ resources:
+ requests:
+ storage: {{ required (printf "size is required for PVC %v" $vct.name) $vct.size | quote }}
+ {{- if $vct.storageClass }}
+ storageClassName: {{ if (eq "-" $vct.storageClass) }}""{{- else }}{{ $vct.storageClass | quote }}{{- end }}
+ {{- end }}
+{{- end }}
+{{- end }}
diff --git a/scale-catalog-template/library/common/templates/classes/_pvc.tpl b/scale-catalog-template/library/common/templates/classes/_pvc.tpl
new file mode 100644
index 00000000..5799ae0a
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/classes/_pvc.tpl
@@ -0,0 +1,62 @@
+{{/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+`SPDX-License-Identifier: Apache-2.0`
+
+This file is considered to be modified by the TrueCharts Project.
+*/}}
+
+{{/*
+This template serves as a blueprint for all PersistentVolumeClaim objects that are created
+within the common library.
+*/}}
+{{- define "common.classes.pvc" -}}
+{{- $values := .Values.persistence -}}
+{{- if hasKey . "ObjectValues" -}}
+ {{- with .ObjectValues.persistence -}}
+ {{- $values = . -}}
+ {{- end -}}
+{{ end -}}
+{{- $pvcName := include "common.names.fullname" . -}}
+{{- if hasKey $values "nameOverride" -}}
+ {{- $pvcName = $values.nameOverride -}}
+{{- else if hasKey $values "nameSuffix" -}}
+ {{- $pvcName = printf "%v-%v" $pvcName $values.nameSuffix -}}
+{{ end -}}
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+ name: {{ $pvcName }}
+ {{- if or $values.skipuninstall $values.annotations }}
+ annotations:
+ {{- if $values.skipuninstall }}
+ "helm.sh/resource-policy": keep
+ {{- end }}
+ {{- with $values.annotations }}
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+ {{- end }}
+ labels:
+ {{- include "common.labels" . | nindent 4 }}
+spec:
+ accessModes:
+ - {{ required (printf "accessMode is required for PVC %v" $pvcName) $values.accessMode | quote }}
+ resources:
+ requests:
+ storage: {{ required (printf "size is required for PVC %v" $pvcName) $values.size | quote }}
+ {{- if $values.storageClass }}
+ storageClassName: {{ include "common.storage.class" . }}
+ {{- else }}
+ storageClassName: {{ ( printf "%v-%v" "ix-storage-class" .Release.Name ) }}
+ {{- end }}
+{{- end -}}
diff --git a/scale-catalog-template/library/common/templates/classes/_service.tpl b/scale-catalog-template/library/common/templates/classes/_service.tpl
new file mode 100644
index 00000000..c8243072
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/classes/_service.tpl
@@ -0,0 +1,99 @@
+{{/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+`SPDX-License-Identifier: Apache-2.0`
+
+This file is considered to be modified by the TrueCharts Project.
+*/}}
+
+{{/*
+This template serves as a blueprint for all Service objects that are created
+within the common library.
+*/}}
+{{- define "common.classes.service" -}}
+{{- $values := .Values.services.main -}}
+{{- if hasKey . "ObjectValues" -}}
+ {{- with .ObjectValues.service -}}
+ {{- $values = . -}}
+ {{- end -}}
+{{ end -}}
+
+{{- $serviceName := include "common.names.fullname" . -}}
+
+
+{{- if hasKey $values "nameSuffix" -}}
+ {{- $serviceName = printf "%v-%v" $serviceName $values.nameSuffix -}}
+{{ end -}}
+{{- $svcType := $values.type | default "" -}}
+
+{{- $portProtocol := $values.port.protocol -}}
+{{- if or ( eq $values.port.protocol "HTTP" ) ( eq $values.port.protocol "HTTPS" ) ( eq $values.port.protocol "TCP" ) -}}
+{{- $portProtocol = "TCP" -}}
+{{- else if eq $values.port.protocol "UDP" }}
+{{- $portProtocol = "UDP" -}}
+{{- end }}
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ $serviceName }}
+ labels:
+ {{- include "common.labels" . | nindent 4 }}
+ {{- if $values.labels }}
+ {{ toYaml $values.labels | nindent 4 }}
+ {{- end }}
+ annotations:
+ {{- if eq $values.port.protocol "HTTPS" }}
+ traefik.ingress.kubernetes.io/service.serversscheme: https
+ {{- end }}
+ {{- with $values.annotations }}
+ {{ toYaml . | nindent 4 }}
+ {{- end }}
+spec:
+ {{- if (or (eq $svcType "ClusterIP") (empty $svcType)) }}
+ type: ClusterIP
+ {{- if $values.clusterIP }}
+ clusterIP: {{ $values.clusterIP }}
+ {{end}}
+ {{- else if eq $svcType "LoadBalancer" }}
+ type: {{ $svcType }}
+ {{- if $values.loadBalancerIP }}
+ loadBalancerIP: {{ $values.loadBalancerIP }}
+ {{- end }}
+ {{- if $values.externalTrafficPolicy }}
+ externalTrafficPolicy: {{ $values.externalTrafficPolicy }}
+ {{- end }}
+ {{- if $values.loadBalancerSourceRanges }}
+ loadBalancerSourceRanges:
+ {{ toYaml $values.loadBalancerSourceRanges | nindent 4 }}
+ {{- end -}}
+ {{- else }}
+ type: {{ $svcType }}
+ {{- end }}
+ {{- if $values.sessionAffinity }}
+ sessionAffinity: {{ $values.sessionAffinity }}
+ {{- if $values.sessionAffinityConfig }}
+ sessionAffinityConfig:
+ {{ toYaml $values.sessionAffinityConfig | nindent 4 }}
+ {{- end -}}
+ {{- end }}
+ {{- with $values.externalIPs }}
+ externalIPs:
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+ {{- if $values.publishNotReadyAddresses }}
+ publishNotReadyAddresses: {{ $values.publishNotReadyAddresses }}
+ {{- end }}
+ {{- include "common.classes.service.ports" (dict "svcType" $svcType "values" $values ) | trim | nindent 2 }}
+ selector:
+ {{- include "common.labels.selectorLabels" . | nindent 4 }}
+{{- end }}
diff --git a/scale-catalog-template/library/common/templates/classes/_service_ports.tpl b/scale-catalog-template/library/common/templates/classes/_service_ports.tpl
new file mode 100644
index 00000000..859c3ff5
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/classes/_service_ports.tpl
@@ -0,0 +1,47 @@
+{{/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+`SPDX-License-Identifier: Apache-2.0`
+
+This file is considered to be modified by the TrueCharts Project.
+*/}}
+
+{{/*
+Render all the ports and additionalPorts for a Service object.
+*/}}
+{{- define "common.classes.service.ports" -}}
+ {{- $ports := list -}}
+ {{- $values := .values -}}
+ {{- $ports = mustAppend $ports $values.port -}}
+ {{- range $_ := $values.additionalPorts -}}
+ {{- $ports = mustAppend $ports . -}}
+ {{- end }}
+ {{- if $ports -}}
+ ports:
+ {{- range $_ := $ports }}
+ {{- $protocol := "" -}}
+ {{- if or ( eq .protocol "HTTP" ) ( eq .protocol "HTTPS" ) }}
+ {{- $protocol = "TCP" -}}
+ {{- else }}
+ {{- $protocol = .protocol | default "TCP" -}}
+ {{- end }}
+ - port: {{ .port }}
+ targetPort: {{ .targetPort | default .name | default "http" }}
+ protocol: {{ $protocol | default "TCP" }}
+ name: {{ .name | default "http" }}
+ {{- if (and (eq $.svcType "NodePort") (not (empty .nodePort))) }}
+ nodePort: {{ .nodePort }}
+ {{ end }}
+ {{- end -}}
+ {{- end -}}
+{{- end }}
diff --git a/scale-catalog-template/library/common/templates/classes/ingress/_externalService.tpl b/scale-catalog-template/library/common/templates/classes/ingress/_externalService.tpl
new file mode 100644
index 00000000..a2aedaf5
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/classes/ingress/_externalService.tpl
@@ -0,0 +1,63 @@
+{{- define "common.classes.externalService" -}}
+{{- $serviceName := include "common.names.fullname" . -}}
+{{- $values := .Values -}}
+{{- $svcPort := 80 }}
+{{- $ingressService := $.Values }}
+{{- if hasKey . "ObjectValues" -}}
+ {{- with .ObjectValues.ingress -}}
+ {{- $values = . -}}
+ {{- end -}}
+{{ end -}}
+
+{{- if hasKey $values "nameSuffix" -}}
+ {{- $serviceName = printf "%v-%v" $serviceName $values.nameSuffix -}}
+{{ end -}}
+
+{{- $svcName := $values.serviceName | default $serviceName -}}
+
+{{- if $values.servicePort }}
+ {{- $svcPort = $values.servicePort -}}
+{{- end }}
+
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ $svcName }}
+ labels:
+ {{- include "common.labels" . | nindent 4 }}
+ annotations:
+ {{- if eq ( $values.serviceType | default "" ) "HTTPS" }}
+ traefik.ingress.kubernetes.io/service.serversscheme: https
+ {{- end }}
+ {{- with $values.annotations }}
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+spec:
+ ports:
+{{- if eq $values.type "UDP"}}
+ - protocol: UDP
+ port: {{ $values.servicePort }}
+ targetPort: {{ $values.servicePort }}
+{{- else }}
+ - protocol: TCP
+ port: {{ $values.servicePort }}
+ targetPort: {{ $values.servicePort }}
+{{- end }}
+---
+apiVersion: v1
+kind: Endpoints
+metadata:
+ name: {{ $svcName }}
+ labels:
+ {{- include "common.labels" . | nindent 4 }}
+ annotations:
+ {{- with $values.annotations }}
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+subsets:
+ - addresses:
+ - ip: {{ $values.serviceTarget }}
+ ports:
+ - port: {{ $values.servicePort }}
+
+{{- end }}
diff --git a/scale-catalog-template/library/common/templates/classes/ingress/_ingress.tpl b/scale-catalog-template/library/common/templates/classes/ingress/_ingress.tpl
new file mode 100644
index 00000000..3552f79d
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/classes/ingress/_ingress.tpl
@@ -0,0 +1,148 @@
+{{/*
+This template serves as a blueprint for all Ingress objects that are created
+within the common library.
+*/}}
+{{- define "common.classes.ingress" -}}
+{{- $ingressName := include "common.names.fullname" . -}}
+{{- $values := .Values -}}
+{{- $svcPort := 80 -}}
+{{- $portProtocol := "" -}}
+{{- $ingressService := $.Values -}}
+{{- if hasKey . "ObjectValues" -}}
+ {{- with .ObjectValues.ingress -}}
+ {{- $values = . -}}
+ {{- end -}}
+{{ end -}}
+
+
+{{- if hasKey $values "nameSuffix" -}}
+ {{- $ingressName = printf "%v-%v" $ingressName $values.nameSuffix -}}
+ {{- if not $values.servicePort }}
+ {{- $ingressService := index $.Values.services ( $values.nameSuffix | quote ) }}
+ {{- if $ingressService.enabled }}
+ {{- $svcPort = $ingressService.port.port -}}
+ {{- $portProtocol = $ingressService.port.protocol | default "" }}
+ {{- else if $.Values.services.main.enabled }}
+ {{- $svcPort = $.Values.services.main.port.port -}}
+ {{- $portProtocol = $.Values.services.main.port.protocol | default "" -}}
+ {{ end -}}
+ {{ end -}}
+{{- else if and ( $.Values.services.main.enabled ) ( not $values.servicePort ) }}
+ {{- $svcPort = $.Values.services.main.port.port -}}
+ {{- $portProtocol = $.Values.services.main.port.protocol | default "" -}}
+{{ end -}}
+
+{{- $authForwardName := ( printf "%v-%v" $ingressName "auth-forward" ) -}}
+
+{{- $svcName := $values.serviceName | default $ingressName -}}
+
+{{- if $values.dynamicServiceName }}
+ {{- $dynamicServiceName := printf "%v-%v" .Release.Name $values.dynamicServiceName -}}
+ {{- $svcName = $dynamicServiceName -}}
+{{- end }}
+
+{{- if $values.servicePort }}
+ {{- $svcPort = $values.servicePort -}}
+{{- end }}
+
+{{- if $values.serviceType }}
+ {{- $portProtocol = $values.serviceType -}}
+{{- end }}
+
+apiVersion: {{ include "common.capabilities.ingress.apiVersion" . }}
+kind: Ingress
+metadata:
+ name: {{ $ingressName }}
+ labels:
+ {{- include "common.labels" . | nindent 4 }}
+ annotations:
+ {{- if eq $portProtocol "HTTPS" }}
+ traefik.ingress.kubernetes.io/service.serversscheme: https
+ {{- end }}
+ traefik.ingress.kubernetes.io/router.entrypoints: {{ $values.entrypoint | default "websecure" }}
+ traefik.ingress.kubernetes.io/router.middlewares: traefik-middlewares-chain-public@kubernetescrd{{ if $values.authForwardURL }},{{ printf "%v-%v@%v" .Release.Namespace $authForwardName "kubernetescrd" }}{{ end }}
+ {{- with $values.annotations }}
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+spec:
+ {{- if eq (include "common.capabilities.ingress.apiVersion" $) "networking.k8s.io/v1" }}
+ {{- if $values.ingressClassName }}
+ ingressClassName: {{ $values.ingressClassName }}
+ {{- end }}
+ {{- end }}
+ {{- if or ( eq $values.certType "selfsigned") (eq $values.certType "ixcert") }}
+ tls:
+ - hosts:
+ {{- if $values.host}}
+ - {{ $values.host | quote }}
+ {{- else }}
+ {{- range $values.hosts }}
+ - {{ .host | quote }}
+ {{- end }}
+ {{- end }}
+ {{- if eq $values.certType "ixcert" }}
+ secretName: {{ $ingressName }}
+ {{- end }}
+ {{- end }}
+ rules:
+ {{- if $values.host }}
+ - host: {{ $values.host | quote }}
+ http:
+ paths:
+ - path: {{ $values.path | default "/" }}
+ {{- if eq (include "common.capabilities.ingress.apiVersion" $) "networking.k8s.io/v1" }}
+ pathType: Prefix
+ {{- end }}
+ backend:
+ {{- if eq (include "common.capabilities.ingress.apiVersion" $) "networking.k8s.io/v1" }}
+ service:
+ name: {{ $svcName }}
+ port:
+ number: {{ $svcPort }}
+ {{- else }}
+ serviceName: {{ $svcName }}
+ servicePort: {{ $svcPort }}
+ {{- end }}
+ {{- end }}
+ {{- range $values.hosts }}
+ - host: {{ .host | quote }}
+ http:
+ paths:
+ - path: {{ .path | default "/" }}
+ {{- if eq (include "common.capabilities.ingress.apiVersion" $) "networking.k8s.io/v1" }}
+ pathType: Prefix
+ {{- end }}
+ backend:
+ {{- if eq (include "common.capabilities.ingress.apiVersion" $) "networking.k8s.io/v1" }}
+ service:
+ name: {{ $svcName }}
+ port:
+ number: {{ $svcPort }}
+ {{- else }}
+ serviceName: {{ $svcName }}
+ servicePort: {{ $svcPort }}
+ {{- end }}
+ {{- end }}
+
+{{- if $values.authForwardURL }}
+
+---
+
+apiVersion: traefik.containo.us/v1alpha1
+kind: Middleware
+metadata:
+ name: {{ $authForwardName }}
+spec:
+ forwardAuth:
+ address: {{ $values.authForwardURL | quote }}
+ tls:
+ insecureSkipVerify: true
+ trustForwardHeader: true
+ authResponseHeaders:
+ - Remote-User
+ - Remote-Groups
+ - Remote-Name
+ - Remote-Email
+{{- end }}
+
+{{- end }}
diff --git a/scale-catalog-template/library/common/templates/classes/ingress/_ingressRoute.tpl b/scale-catalog-template/library/common/templates/classes/ingress/_ingressRoute.tpl
new file mode 100644
index 00000000..a44fe553
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/classes/ingress/_ingressRoute.tpl
@@ -0,0 +1,127 @@
+{{/*
+This template serves as a blueprint for all ingressRoute objects that are created
+within the common library.
+*/}}
+{{- define "common.classes.ingressRoute" -}}
+{{- $ingressName := include "common.names.fullname" . -}}
+{{- $values := .Values -}}
+{{- $svcPort := 80 }}
+{{- $portProtocol := "" }}
+{{- $ingressService := $.Values }}
+{{- if hasKey . "ObjectValues" -}}
+ {{- with .ObjectValues.ingress -}}
+ {{- $values = . -}}
+ {{- end -}}
+{{ end -}}
+
+{{- if hasKey $values "nameSuffix" -}}
+ {{- $ingressName = printf "%v-%v" $ingressName $values.nameSuffix -}}
+ {{- if and ( $.Values.services ) ( not $values.servicePort ) }}
+ {{- $ingressService := index $.Values.services ( $values.nameSuffix | quote) }}
+ {{- $svcPort = $ingressService.port.port }}
+ {{- $portProtocol = $ingressService.port.protocol | default "" }}
+ {{ end -}}
+{{- else if and ( $.Values.services ) ( not $values.servicePort ) }}
+ {{- $svcPort = $.Values.services.main.port.port }}
+ {{- $portProtocol = $.Values.services.main.port.protocol | default "" }}
+{{ end -}}
+
+{{- $authForwardName := ( printf "%v-%v" $ingressName "auth-forward" ) -}}
+
+{{- $svcName := $values.serviceName | default $ingressName -}}
+
+{{- if $values.servicePort }}
+ {{- $svcPort = $values.servicePort }}
+{{- end }}
+
+{{- if $values.serviceType }}
+ {{- $portProtocol = $values.serviceType }}
+{{- end }}
+
+apiVersion: traefik.containo.us/v1alpha1
+{{- if eq $values.type "UDP" }}
+kind: IngressRouteUDP
+{{- else if eq $values.type "TCP" }}
+kind: IngressRouteTCP
+{{- else }}
+kind: IngressRoute
+{{- end }}
+metadata:
+ name: {{ $ingressName }}
+ labels:
+ {{- include "common.labels" . | nindent 4 }}
+ annotations:
+ {{- with $values.annotations }}
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+spec:
+ entryPoints:
+ - {{ $values.entrypoint }}
+ routes:
+ {{- if eq $values.type "UDP" }}
+ - services:
+ - name: {{ $svcName }}
+ port: {{ $svcPort }}
+ weight: 10
+ {{- else if eq $values.type "TCP" }}
+ - match: HostSNI(`*`)
+ services:
+ - name: {{ $svcName }}
+ port: {{ $svcPort }}
+ weight: 10
+ terminationDelay: 400
+ {{- else }}
+ - kind: Rule
+ match: Host(`{{ (index $values.hosts 0).host }}`) && PathPrefix(`{{ (index $values.hosts 0).path | default "/" }}`)
+ services:
+ - name: {{ $svcName }}
+ {{- if $values.serviceKind }}
+ kind: {{ $values.serviceKind }}
+ {{- else }}
+ port: {{ $svcPort }}
+ {{- end }}
+ middlewares:
+ - name: traefik-middlewares-chain-public@kubernetescrd
+ {{- if $values.authForwardURL }}
+ - name: "{{ printf "%v-%v@%v" .Release.Namespace $authForwardName "kubernetescrd" }}"
+ {{- end }}
+ {{- end }}
+
+{{- if not ( eq $values.type "UDP" ) }}
+{{- if or ( eq $values.certType "selfsigned") (eq $values.certType "ixcert") }}
+ tls:
+ domains:
+ - main: {{ (index $values.hosts 0).host }}
+ sans:
+ {{- range $values.hosts }}
+ - {{ .host | quote }}
+ {{- end }}
+ {{- if eq $values.certType "ixcert" }}
+ secretName: {{ $ingressName }}
+ {{- end }}
+ passthrough: false
+
+{{- end }}
+{{- end }}
+
+{{- if $values.authForwardURL }}
+---
+
+apiVersion: traefik.containo.us/v1alpha1
+kind: Middleware
+metadata:
+ name: {{ $authForwardName }}
+spec:
+ forwardAuth:
+ address: {{ $values.authForwardURL | quote }}
+ tls:
+ insecureSkipVerify: true
+ trustForwardHeader: true
+ authResponseHeaders:
+ - Remote-User
+ - Remote-Groups
+ - Remote-Name
+ - Remote-Email
+
+{{- end }}
+{{- end }}
diff --git a/scale-catalog-template/library/common/templates/lib/chart/_capabilities.tpl b/scale-catalog-template/library/common/templates/lib/chart/_capabilities.tpl
new file mode 100644
index 00000000..37ff7d74
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/lib/chart/_capabilities.tpl
@@ -0,0 +1,146 @@
+{{/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+`SPDX-License-Identifier: Apache-2.0`
+
+This file is considered to be modified by the TrueCharts Project.
+*/}}
+
+{{/*
+Return the appropriate apiVersion for DaemonSet objects.
+*/}}
+{{- define "common.capabilities.daemonset.apiVersion" -}}
+{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}}
+{{- print "extensions/v1beta1" -}}
+{{- else -}}
+{{- print "apps/v1" -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Waiting on https://github.com/helm/helm/pull/8608
+{{- define "common.capabilities.daemonset.apiVersion" -}}
+{{- if .Capabilities.APIVersions.Has "apps/v1/DaemonSet" -}}
+{{- print "apps/v1" -}}
+{{- else -}}
+{{- print "extensions/v1beta1" -}}
+{{- end -}}
+{{- end -}}
+*/}}
+
+{{/*
+Return the appropriate apiVersion for Deployment objects.
+*/}}
+{{- define "common.capabilities.deployment.apiVersion" -}}
+{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}}
+{{- print "extensions/v1beta1" -}}
+{{- else -}}
+{{- print "apps/v1" -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Waiting on https://github.com/helm/helm/pull/8608
+{{- define "common.capabilities.deployment.apiVersion" -}}
+{{- if .Capabilities.APIVersions.Has "apps/v1/Deployment" -}}
+{{- print "apps/v1" -}}
+{{- else -}}
+{{- print "extensions/v1beta1" -}}
+{{- end -}}
+{{- end -}}
+*/}}
+
+{{/*
+Return the appropriate apiVersion for StatefulSet objects.
+*/}}
+{{- define "common.capabilities.statefulset.apiVersion" -}}
+{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}}
+{{- print "apps/v1beta1" -}}
+{{- else -}}
+{{- print "apps/v1" -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Waiting on https://github.com/helm/helm/pull/8608
+{{- define "common.capabilities.statefulset.apiVersion" -}}
+{{- if .Capabilities.APIVersions.Has "apps/v1/StatefulSet" -}}
+{{- print "apps/v1" -}}
+{{- else -}}
+{{- print "apps/v1beta1" -}}
+{{- end -}}
+{{- end -}}
+*/}}
+
+{{/*
+Return the appropriate apiVersion for Ingress objects.
+*/}}
+
+{{- define "common.capabilities.ingress.apiVersion" -}}
+{{- if .Values.ingress.apiVersion -}}
+{{- .Values.ingress.apiVersion -}}
+{{- else if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}}
+{{- print "extensions/v1beta1" -}}
+{{- else if semverCompare "<1.19-0" .Capabilities.KubeVersion.GitVersion -}}
+{{- print "networking.k8s.io/v1beta1" -}}
+{{- else -}}
+{{- print "networking.k8s.io/v1" -}}
+{{- end }}
+{{- end -}}
+
+{{/*
+Waiting on https://github.com/helm/helm/pull/8608
+{{- define "common.capabilities.ingress.apiVersion" -}}
+{{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1/Ingress" -}}
+{{- print "networking.k8s.io/v1" -}}
+{{- else if .Capabilities.APIVersions.Has "networking.k8s.io/v1beta1/Ingress" -}}
+{{- print "networking.k8s.io/v1beta1" -}}
+{{- else -}}
+{{- print "extensions/v1beta1" -}}
+{{- end }}
+{{- end -}}
+*/}}
+
+{{/*
+Return the appropriate apiVersion for RBAC resources.
+*/}}
+{{- define "common.capabilities.rbac.apiVersion" -}}
+{{- if semverCompare "<1.17-0" (include "common.capabilities.kubeVersion" .) -}}
+{{- print "rbac.authorization.k8s.io/v1beta1" -}}
+{{- else -}}
+{{- print "rbac.authorization.k8s.io/v1" -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return the appropriate apiVersion for CRDs.
+*/}}
+{{- define "common.capabilities.crd.apiVersion" -}}
+{{- if semverCompare "<1.19-0" (include "common.capabilities.kubeVersion" .) -}}
+{{- print "apiextensions.k8s.io/v1beta1" -}}
+{{- else -}}
+{{- print "apiextensions.k8s.io/v1" -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Returns true if the used Helm version is 3.3+.
+A way to check the used Helm version was not introduced until version 3.3.0 with .Capabilities.HelmVersion, which contains an additional "{}}" structure.
+This check is introduced as a regexMatch instead of {{ if .Capabilities.HelmVersion }} because checking for the key HelmVersion in <3.3 results in a "interface not found" error.
+**To be removed when the catalog's minimun Helm version is 3.3**
+*/}}
+{{- define "common.capabilities.supportsHelmVersion" -}}
+{{- if regexMatch "{(v[0-9])*[^}]*}}$" (.Capabilities | toString ) }}
+ {{- true -}}
+{{- end -}}
+{{- end -}}
diff --git a/scale-catalog-template/library/common/templates/lib/chart/_errors.tpl b/scale-catalog-template/library/common/templates/lib/chart/_errors.tpl
new file mode 100644
index 00000000..2985af44
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/lib/chart/_errors.tpl
@@ -0,0 +1,38 @@
+{{/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+`SPDX-License-Identifier: Apache-2.0`
+
+This file is considered to be modified by the TrueCharts Project.
+*/}}
+
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Through error when upgrading using empty passwords values that must not be empty.
+
+Usage:
+{{- $validationError00 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password00" "secret" "secretName" "field" "password-00") -}}
+{{- $validationError01 := include "common.validations.values.single.empty" (dict "valueKey" "path.to.password01" "secret" "secretName" "field" "password-01") -}}
+{{ include "common.errors.upgrade.passwords.empty" (dict "validationErrors" (list $validationError00 $validationError01) "context" $) }}
+
+Required password params:
+ - validationErrors - String - Required. List of validation strings to be return, if it is empty it won't throw error.
+ - context - Context - Required. Parent context.
+*/}}
+{{- define "common.errors.upgrade.passwords.empty" -}}
+ {{- $validationErrors := join "" .validationErrors -}}
+ {{- if and $validationErrors .context.Release.IsUpgrade -}}
+ {{- $errorString := "\nPASSWORDS ERROR: you must provide your current passwords when upgrade the release%s" -}}
+ {{- printf $errorString $validationErrors | fail -}}
+ {{- end -}}
+{{- end -}}
diff --git a/scale-catalog-template/library/common/templates/lib/chart/_images.tpl b/scale-catalog-template/library/common/templates/lib/chart/_images.tpl
new file mode 100644
index 00000000..12c8ea13
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/lib/chart/_images.tpl
@@ -0,0 +1,65 @@
+{{/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+`SPDX-License-Identifier: Apache-2.0`
+
+This file is considered to be modified by the TrueCharts Project.
+*/}}
+
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Return the proper image name
+{{ include "common.images.image" ( dict "imageRoot" .Values.path.to.the.image "global" $) }}
+*/}}
+{{- define "common.images.image" -}}
+{{- $registryName := .imageRoot.registry -}}
+{{- $repositoryName := .imageRoot.repository -}}
+{{- $tag := .imageRoot.tag | toString -}}
+{{- if .global }}
+ {{- if .global.imageRegistry }}
+ {{- $registryName = .global.imageRegistry -}}
+ {{- end -}}
+{{- end -}}
+{{- if $registryName }}
+{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
+{{- else -}}
+{{- printf "%s:%s" $repositoryName $tag -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return the proper Docker Image Registry Secret Names
+{{ include "common.images.pullSecrets" ( dict "images" (list .Values.path.to.the.image1, .Values.path.to.the.image2) "global" .Values.global) }}
+*/}}
+{{- define "common.images.pullSecrets" -}}
+ {{- $pullSecrets := list }}
+
+ {{- if .global }}
+ {{- range .global.imagePullSecrets -}}
+ {{- $pullSecrets = append $pullSecrets . -}}
+ {{- end -}}
+ {{- end -}}
+
+ {{- range .images -}}
+ {{- range .pullSecrets -}}
+ {{- $pullSecrets = append $pullSecrets . -}}
+ {{- end -}}
+ {{- end -}}
+
+ {{- if (not (empty $pullSecrets)) }}
+imagePullSecrets:
+ {{- range $pullSecrets }}
+ - name: {{ . }}
+ {{- end }}
+ {{- end }}
+{{- end -}}
diff --git a/scale-catalog-template/library/common/templates/lib/chart/_labels.tpl b/scale-catalog-template/library/common/templates/lib/chart/_labels.tpl
new file mode 100644
index 00000000..b5be0514
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/lib/chart/_labels.tpl
@@ -0,0 +1,55 @@
+{{/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+`SPDX-License-Identifier: Apache-2.0`
+
+This file is considered to be modified by the TrueCharts Project.
+*/}}
+
+{{/*
+Common labels shared across objects.
+*/}}
+{{- define "common.labels" -}}
+helm.sh/chart: {{ include "common.names.chart" . }}
+{{ include "common.labels.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end }}
+
+{{/*
+Selector labels shared across objects.
+*/}}
+{{- define "common.labels.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "common.names.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end }}
+
+
+## Bitnami Compatibility links
+
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Kubernetes standard labels
+*/}}
+{{- define "common.labels.standard" -}}
+{{ include "common.labels" . }}
+{{- end -}}
+
+{{/*
+Labels to use on deploy.spec.selector.matchLabels and svc.spec.selector
+*/}}
+{{- define "common.labels.matchLabels" -}}
+{{ include "common.labels.selectorLabels" . }}
+{{- end -}}
diff --git a/scale-catalog-template/library/common/templates/lib/chart/_names.tpl b/scale-catalog-template/library/common/templates/lib/chart/_names.tpl
new file mode 100644
index 00000000..41273d69
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/lib/chart/_names.tpl
@@ -0,0 +1,62 @@
+{{/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+`SPDX-License-Identifier: Apache-2.0`
+
+This file is considered to be modified by the TrueCharts Project.
+*/}}
+
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "common.names.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "common.names.fullname" -}}
+{{- if .Values.fullnameOverride -}}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- $name := default .Chart.Name .Values.nameOverride -}}
+{{- if contains $name .Release.Name -}}
+{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "common.names.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Create the name of the ServiceAccount to use.
+*/}}
+{{- define "common.names.serviceAccountName" -}}
+{{- if .Values.serviceAccount.create }}
+ {{- default (include "common.names.fullname" .) .Values.serviceAccount.name }}
+{{- else }}
+ {{- default "default" .Values.serviceAccount.name }}
+{{- end }}
+{{- end }}
diff --git a/scale-catalog-template/library/common/templates/lib/chart/_utils.tpl b/scale-catalog-template/library/common/templates/lib/chart/_utils.tpl
new file mode 100644
index 00000000..c8cec118
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/lib/chart/_utils.tpl
@@ -0,0 +1,80 @@
+{{/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+`SPDX-License-Identifier: Apache-2.0`
+
+This file is considered to be modified by the TrueCharts Project.
+*/}}
+
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Print instructions to get a secret value.
+Usage:
+{{ include "common.utils.secret.getvalue" (dict "secret" "secret-name" "field" "secret-value-field" "context" $) }}
+*/}}
+{{- define "common.utils.secret.getvalue" -}}
+{{- $varname := include "common.utils.fieldToEnvVar" . -}}
+export {{ $varname }}=$(kubectl get secret --namespace {{ .context.Release.Namespace | quote }} {{ .secret }} -o jsonpath="{.data.{{ .field }}}" | base64 --decode)
+{{- end -}}
+
+{{/*
+Build env var name given a field
+Usage:
+{{ include "common.utils.fieldToEnvVar" dict "field" "my-password" }}
+*/}}
+{{- define "common.utils.fieldToEnvVar" -}}
+ {{- $fieldNameSplit := splitList "-" .field -}}
+ {{- $upperCaseFieldNameSplit := list -}}
+
+ {{- range $fieldNameSplit -}}
+ {{- $upperCaseFieldNameSplit = append $upperCaseFieldNameSplit ( upper . ) -}}
+ {{- end -}}
+
+ {{ join "_" $upperCaseFieldNameSplit }}
+{{- end -}}
+
+{{/*
+Gets a value from .Values given
+Usage:
+{{ include "common.utils.getValueFromKey" (dict "key" "path.to.key" "context" $) }}
+*/}}
+{{- define "common.utils.getValueFromKey" -}}
+{{- $splitKey := splitList "." .key -}}
+{{- $value := "" -}}
+{{- $latestObj := $.context.Values -}}
+{{- range $splitKey -}}
+ {{- if not $latestObj -}}
+ {{- printf "please review the entire path of '%s' exists in values" $.key | fail -}}
+ {{- end -}}
+ {{- $value = ( index $latestObj . ) -}}
+ {{- $latestObj = $value -}}
+{{- end -}}
+{{- printf "%v" (default "" $value) -}}
+{{- end -}}
+
+{{/*
+Returns first .Values key with a defined value or first of the list if all non-defined
+Usage:
+{{ include "common.utils.getKeyFromList" (dict "keys" (list "path.to.key1" "path.to.key2") "context" $) }}
+*/}}
+{{- define "common.utils.getKeyFromList" -}}
+{{- $key := first .keys -}}
+{{- $reverseKeys := reverse .keys }}
+{{- range $reverseKeys }}
+ {{- $value := include "common.utils.getValueFromKey" (dict "key" . "context" $.context ) }}
+ {{- if $value -}}
+ {{- $key = . }}
+ {{- end -}}
+{{- end -}}
+{{- printf "%s" $key -}}
+{{- end -}}
diff --git a/scale-catalog-template/library/common/templates/lib/chart/_values.tpl b/scale-catalog-template/library/common/templates/lib/chart/_values.tpl
new file mode 100644
index 00000000..af6b4658
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/lib/chart/_values.tpl
@@ -0,0 +1,29 @@
+{{/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+`SPDX-License-Identifier: Apache-2.0`
+
+This file is considered to be modified by the TrueCharts Project.
+*/}}
+
+{{/*
+Merge the local chart values and the common chart defaults.
+*/}}
+{{- define "common.values.setup" -}}
+ {{- if .Values.common -}}
+ {{- $defaultValues := deepCopy .Values.common -}}
+ {{- $userValues := deepCopy (omit .Values "common") -}}
+ {{- $mergedValues := mustMergeOverwrite $defaultValues $userValues -}}
+ {{- $_ := set . "Values" (deepCopy $mergedValues) -}}
+ {{- end }}
+{{- end }}
diff --git a/scale-catalog-template/library/common/templates/lib/controller/_container.tpl b/scale-catalog-template/library/common/templates/lib/controller/_container.tpl
new file mode 100644
index 00000000..cdd777ab
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/lib/controller/_container.tpl
@@ -0,0 +1,92 @@
+{{/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+`SPDX-License-Identifier: Apache-2.0`
+
+This file is considered to be modified by the TrueCharts Project.
+*/}}
+
+
+{{- /*
+The main container included in the controller.
+*/ -}}
+{{- define "common.controller.mainContainer" -}}
+- name: {{ include "common.names.fullname" . }}
+ image: "{{ include "common.images.image" (dict "imageRoot" .Values.image "global" .Values.global) }}"
+ imagePullPolicy: {{ .Values.image.pullPolicy }}
+ {{- with .Values.command }}
+ command: {{ . }}
+ {{- end }}
+ {{- with .Values.args }}
+ args: {{ . }}
+ {{- end }}
+ {{- with .Values.securityContext }}
+ securityContext:
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+ env:
+ - name: PUID
+ value: {{ .Values.PUID | quote }}
+ - name: PGID
+ value: {{ .Values.PGID | quote }}
+ - name: UMASK
+ value: {{ .Values.UMASK | quote }}
+ {{- if .Values.timezone }}
+ - name: TZ
+ value: {{ .Values.timezone | quote }}
+ {{- end }}
+ {{- if or .Values.env .Values.envTpl .Values.envValueFrom .Values.envVariable .Values.environmentVariables }}
+ {{- range $envVariable := .Values.environmentVariables }}
+ {{- if and $envVariable.name $envVariable.value }}
+ - name: {{ $envVariable.name }}
+ value: {{ $envVariable.value | quote }}
+ {{- else }}
+ {{- fail "Please specify name/value for environment variable" }}
+ {{- end }}
+ {{- end}}
+ {{- range $key, $value := .Values.env }}
+ - name: {{ $key }}
+ value: {{ $value | quote }}
+ {{- end }}
+ {{- range $key, $value := .Values.envTpl }}
+ - name: {{ $key }}
+ value: {{ tpl $value $ | quote }}
+ {{- end }}
+ {{- range $key, $value := .Values.envValueFrom }}
+ - name: {{ $key }}
+ valueFrom:
+ {{- $value | toYaml | nindent 8 }}
+ {{- end }}
+ {{- end }}
+ {{- with .Values.envFrom }}
+ envFrom:
+ {{- toYaml . | nindent 12 }}
+ {{- end }}
+ {{- include "common.controller.ports" . | trim | nindent 2 }}
+
+ {{- with (include "common.controller.volumeMounts" . | trim) }}
+ volumeMounts:
+ {{- . | nindent 2 }}
+ {{- end }}
+
+
+ {{- include "common.controller.probes" . | nindent 2 }}
+ resources:
+ {{- with .Values.resources }}
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+ {{- if and .Values.gpuConfiguration }}
+ limits:
+ {{- toYaml .Values.gpuConfiguration | nindent 6 }}
+ {{- end }}
+{{- end -}}
diff --git a/scale-catalog-template/library/common/templates/lib/controller/_pod.tpl b/scale-catalog-template/library/common/templates/lib/controller/_pod.tpl
new file mode 100644
index 00000000..90196a4b
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/lib/controller/_pod.tpl
@@ -0,0 +1,69 @@
+{{- /*
+The pod definition included in the controller.
+*/ -}}
+{{- define "common.controller.pod" -}}
+{{- with .Values.imagePullSecrets }}
+imagePullSecrets:
+ {{- toYaml . | nindent 2 }}
+{{- end }}
+serviceAccountName: {{ include "common.names.serviceAccountName" . }}
+{{- with .Values.podSecurityContext }}
+securityContext:
+ {{- toYaml . | nindent 2 }}
+{{- end }}
+{{- with .Values.priorityClassName }}
+priorityClassName: {{ . }}
+{{- end }}
+{{- with .Values.schedulerName }}
+schedulerName: {{ . }}
+{{- end }}
+{{- with .Values.hostNetwork }}
+hostNetwork: {{ . }}
+{{- end }}
+{{- with .Values.hostname }}
+hostname: {{ . }}
+{{- end }}
+{{- if .Values.dnsPolicy }}
+{{- with .Values.dnsPolicy }}
+dnsPolicy: {{ . }}
+{{- end }}
+{{- else if .Values.hostNetwork }}
+dnsPolicy: "ClusterFirstWithHostNet"
+{{- else }}
+dnsPolicy: ClusterFirst
+{{- end }}
+{{- with .Values.dnsConfig }}
+dnsConfig:
+ {{- toYaml . | nindent 2 }}
+{{- end }}
+enableServiceLinks: {{ .Values.enableServiceLinks }}
+{{- with .Values.initContainers }}
+initContainers:
+ {{- toYaml . | nindent 2 }}
+{{- end }}
+containers:
+ {{- include "common.controller.mainContainer" . | nindent 0 }}
+ {{- with .Values.additionalContainers }}
+ {{- toYaml . | nindent 0 }}
+ {{- end }}
+{{- with (include "common.controller.volumes" . | trim) }}
+volumes:
+ {{- . | nindent 0 }}
+{{- end }}
+{{- with .Values.hostAliases }}
+hostAliases:
+{{- toYaml . | nindent 2 }}
+{{- end }}
+{{- with .Values.nodeSelector }}
+nodeSelector:
+ {{- toYaml . | nindent 2 }}
+{{- end }}
+{{- with .Values.affinity }}
+affinity:
+ {{- toYaml . | nindent 2 }}
+{{- end }}
+{{- with .Values.tolerations }}
+tolerations:
+ {{- toYaml . | nindent 2 }}
+{{- end }}
+{{- end -}}
diff --git a/scale-catalog-template/library/common/templates/lib/controller/_ports.tpl b/scale-catalog-template/library/common/templates/lib/controller/_ports.tpl
new file mode 100644
index 00000000..528b233d
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/lib/controller/_ports.tpl
@@ -0,0 +1,76 @@
+{{/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+`SPDX-License-Identifier: Apache-2.0`
+
+This file is considered to be modified by the TrueCharts Project.
+*/}}
+
+
+{{/*
+Ports included by the controller.
+*/}}
+{{- define "common.controller.ports" -}}
+{{- $ports := list -}}
+ {{/* append the ports for each appAdditionalService - TrueCharts */}}
+ {{- if $.Values.services -}}
+ {{- range $name, $_ := $.Values.services }}
+ {{- if or ( .enabled ) ( eq $name "main" ) -}}
+ {{- if eq $name "main" -}}
+ {{- $_ := set .port "name" (default "http" .port.name) -}}
+ {{- else if kindIs "string" $name -}}
+ {{- $_ := set .port "name" (default .port.name | default $name) -}}
+ {{- else -}}
+ {{- $_ := set .port "name" (required "Missing port.name" .port.name) -}}
+ {{- end -}}
+ {{- $ports = mustAppend $ports .port -}}
+ {{- range $_ := .additionalPorts -}}
+ {{/* append the additonalPorts for each additional service */}}
+ {{- $ports = mustAppend $ports . -}}
+ {{- end }}
+ {{- end }}
+ {{- end }}
+ {{- end }}
+
+ {{- if $.Values.additionalServices -}}
+ {{- range $_ := $.Values.additionalServices }}
+ {{- if .enabled -}}
+ {{- $_ := set .port "name" (required "Missing port.name" .port.name) -}}
+ {{- $ports = mustAppend $ports .port -}}
+ {{- range $_ := .additionalPorts -}}
+ {{/* append the additonalPorts for each additional service */}}
+ {{- $ports = mustAppend $ports . -}}
+ {{- end }}
+ {{- end }}
+ {{- end }}
+ {{- end }}
+
+{{/* export/render the list of ports */}}
+{{- if $ports -}}
+ports:
+{{- range $_ := $ports }}
+{{- $protocol := "" -}}
+{{- if or ( eq .protocol "HTTP" ) ( eq .protocol "HTTPS" ) }}
+ {{- $protocol = "TCP" -}}
+{{- else }}
+ {{- $protocol = .protocol | default "TCP" -}}
+{{- end }}
+- name: {{ required "The port's 'name' is not defined" .name }}
+ {{- if and .targetPort (kindIs "string" .targetPort) }}
+ {{- fail (printf "Our charts do not support named ports for targetPort. (port name %s, targetPort %s)" .name .targetPort) }}
+ {{- end }}
+ containerPort: {{ .targetPort | default .port }}
+ protocol: {{ $protocol | default "TCP" }}
+{{- end -}}
+{{- end -}}
+{{- end -}}
diff --git a/scale-catalog-template/library/common/templates/lib/controller/_probes.tpl b/scale-catalog-template/library/common/templates/lib/controller/_probes.tpl
new file mode 100644
index 00000000..47d33442
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/lib/controller/_probes.tpl
@@ -0,0 +1,41 @@
+{{/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+`SPDX-License-Identifier: Apache-2.0`
+
+This file is considered to be modified by the TrueCharts Project.
+*/}}
+
+
+{{/*
+Probes selection logic.
+*/}}
+{{- define "common.controller.probes" -}}
+{{- $svcPort := .Values.services.main.port.name -}}
+{{- range $probeName, $probe := .Values.probes }}
+ {{- if $probe.enabled -}}
+ {{- "" | nindent 0 }}
+ {{- $probeName }}Probe:
+ {{- if $probe.custom -}}
+ {{- $probe.spec | toYaml | nindent 2 }}
+ {{- else }}
+ {{- "tcpSocket:" | nindent 2 }}
+ {{- printf "port: %v" $svcPort | nindent 4 }}
+ {{- printf "initialDelaySeconds: %v" $probe.spec.initialDelaySeconds | nindent 2 }}
+ {{- printf "failureThreshold: %v" $probe.spec.failureThreshold | nindent 2 }}
+ {{- printf "timeoutSeconds: %v" $probe.spec.timeoutSeconds | nindent 2 }}
+ {{- printf "periodSeconds: %v" $probe.spec.periodSeconds | nindent 2 }}
+ {{- end }}
+ {{- end }}
+{{- end }}
+{{- end }}
diff --git a/scale-catalog-template/library/common/templates/lib/controller/_volumeMounts.tpl b/scale-catalog-template/library/common/templates/lib/controller/_volumeMounts.tpl
new file mode 100644
index 00000000..e69903e0
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/lib/controller/_volumeMounts.tpl
@@ -0,0 +1,62 @@
+
+{{/*
+Volumes included by the controller.
+*/}}
+{{- define "common.controller.volumeMounts" -}}
+{{- range $index, $PVC := .Values.persistence }}
+{{- if and ( $PVC.enabled ) ( $PVC.mountPath ) }}
+- mountPath: {{ $PVC.mountPath }}
+ name: {{ $index }}
+{{- if $PVC.subPath }}
+ subPath: {{ $PVC.subPath }}
+{{- end }}
+{{- end }}
+{{- end }}
+
+
+{{ range $name, $dmm := .Values.deviceMounts }}
+{{- if $dmm.enabled -}}
+{{ if $dmm.name }}
+ {{ $name = $dmm.name }}
+{{ end }}
+- name: devicemount-{{ $name }}
+ mountPath: {{ $dmm.devicePath }}
+ {{ if $dmm.subPath }}
+ subPath: {{ $dmm.subPath }}
+ {{ end }}
+{{- end -}}
+{{ end }}
+
+{{ range $name, $csm := .Values.customStorage }}
+{{- if $csm.enabled -}}
+{{ if $csm.name }}
+ {{ $name = $csm.name }}
+{{ end }}
+- name: customstorage-{{ $name }}
+ mountPath: {{ $csm.mountPath }}
+ {{ if $csm.subPath }}
+ subPath: {{ $csm.subPath }}
+ {{ end }}
+ {{ if $csm.readOnly }}
+ readOnly: {{ $csm.readOnly }}
+ {{ end }}
+{{- end -}}
+{{ end }}
+
+
+{{- if .Values.additionalVolumeMounts }}
+ {{- toYaml .Values.additionalVolumeMounts | nindent 0 }}
+{{- end }}
+
+
+{{- if eq .Values.controllerType "statefulset" }}
+{{- range $index, $vct := .Values.volumeClaimTemplates }}
+- mountPath: {{ $vct.mountPath }}
+ name: {{ $vct.name }}
+{{- if $vct.subPath }}
+ subPath: {{ $vct.subPath }}
+{{- end }}
+{{- end }}
+{{- end }}
+
+{{- end -}}
diff --git a/scale-catalog-template/library/common/templates/lib/controller/_volumes.tpl b/scale-catalog-template/library/common/templates/lib/controller/_volumes.tpl
new file mode 100644
index 00000000..49403cfa
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/lib/controller/_volumes.tpl
@@ -0,0 +1,84 @@
+{{/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+`SPDX-License-Identifier: Apache-2.0`
+
+This file is considered to be modified by the TrueCharts Project.
+*/}}
+
+
+{{/*
+Volumes included by the controller.
+*/}}
+{{- define "common.controller.volumes" -}}
+{{- range $index, $persistence := .Values.persistence }}
+{{- if $persistence.enabled }}
+- name: {{ $index }}
+{{- if $persistence.existingClaim }}
+{{- /* Always prefer an existingClaim if that is set */}}
+ persistentVolumeClaim:
+ claimName: {{ $persistence.existingClaim }}
+{{- else -}}
+ {{- if $persistence.emptyDir -}}
+ {{- /* Always prefer an emptyDir next if that is set */}}
+ emptyDir: {}
+ {{- else -}}
+ {{- /* Otherwise refer to the PVC name */}}
+ persistentVolumeClaim:
+ {{- if $persistence.nameOverride }}
+ claimName: {{ $persistence.nameOverride }}
+ {{- else if $persistence.nameSuffix }}
+ claimName: {{ printf "%s-%s" (include "common.names.fullname" $) $persistence.nameSuffix }}
+ {{- else }}
+ claimName: {{ printf "%s-%s" (include "common.names.fullname" $) $index }}
+ {{- end }}
+ {{- end }}
+{{- end }}
+{{- end }}
+{{- end }}
+
+{{- range $name, $dm := .Values.deviceMounts -}}
+{{ if $dm.enabled }}
+{{ if $dm.name }}
+{{ $name = $dm.name }}
+{{ end }}
+- name: devicemount-{{ $name }}
+ {{ if $dm.emptyDir }}
+ emptyDir: {}
+ {{- else -}}
+ hostPath:
+ path: {{ required "hostPath not set" $dm.devicePath }}
+ {{ end }}
+{{ end }}
+{{- end -}}
+
+{{- range $name, $cs := .Values.customStorage -}}
+{{ if $cs.enabled }}
+{{ if $cs.name }}
+{{ $name = $cs.name }}
+{{ end }}
+- name: customstorage-{{ $name }}
+ {{ if $cs.emptyDir }}
+ emptyDir: {}
+ {{- else -}}
+ hostPath:
+ path: {{ required "hostPath not set" $cs.hostPath }}
+ {{ end }}
+{{ end }}
+{{- end -}}
+
+
+{{- if .Values.additionalVolumes }}
+ {{- toYaml .Values.additionalVolumes | nindent 0 }}
+{{- end }}
+{{- end -}}
diff --git a/scale-catalog-template/library/common/templates/lib/resources/_certHelpers.tpl b/scale-catalog-template/library/common/templates/lib/resources/_certHelpers.tpl
new file mode 100644
index 00000000..d2b07a9b
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/lib/resources/_certHelpers.tpl
@@ -0,0 +1,32 @@
+{{/*
+Retrieve true/false if certificate is configured
+*/}}
+{{- define "common.resources.cert.available" -}}
+{{- if .ObjectValues.certHolder.certificate -}}
+{{- $values := (. | mustDeepCopy) -}}
+{{- $_ := set $values "commonCertOptions" (dict "certKeyName" $values.ObjectValues.certHolder.certificate) -}}
+{{- template "common.resources.cert_present" $values -}}
+{{- else -}}
+{{- false -}}
+{{- end -}}
+{{- end -}}
+
+
+{{/*
+Retrieve public key of certificate
+*/}}
+{{- define "common.resources.cert.publicKey" -}}
+{{- $values := (. | mustDeepCopy) -}}
+{{- $_ := set $values "commonCertOptions" (dict "certKeyName" $values.ObjectValues.certHolder.certificate "publicKey" true) -}}
+{{ include "common.resources.cert" $values }}
+{{- end -}}
+
+
+{{/*
+Retrieve private key of certificate
+*/}}
+{{- define "common.resources.cert.privateKey" -}}
+{{- $values := (. | mustDeepCopy) -}}
+{{- $_ := set $values "commonCertOptions" (dict "certKeyName" $values.ObjectValues.certHolder.certificate) -}}
+{{ include "common.resources.cert" $values }}
+{{- end -}}
diff --git a/scale-catalog-template/library/common/templates/lib/resources/_certSecret.yaml b/scale-catalog-template/library/common/templates/lib/resources/_certSecret.yaml
new file mode 100644
index 00000000..2409ae70
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/lib/resources/_certSecret.yaml
@@ -0,0 +1,25 @@
+{{- define "common.resources.cert.secret" -}}
+
+
+{{- $secretName := include "common.names.fullname" . -}}
+
+{{- if .ObjectValues.certHolder -}}
+ {{- if hasKey .ObjectValues.certHolder "nameSuffix" -}}
+ {{- $secretName = printf "%v-%v" $secretName .ObjectValues.certHolder.nameSuffix -}}
+ {{ end -}}
+{{ else }}
+ {{- $_ := set $ "ObjectValues" (dict "certHolder" .Values) -}}
+{{ end -}}
+
+{{- if eq (include "common.resources.cert.available" $ ) "true" -}}
+apiVersion: v1
+kind: Secret
+metadata:
+ name: {{ $secretName }}
+ labels: {{ include "common.labels" . | nindent 4 }}
+type: kubernetes.io/tls
+data:
+ tls.crt: {{ (include "common.resources.cert.publicKey" $ ) | toString | b64enc | quote }}
+ tls.key: {{ (include "common.resources.cert.privateKey" $ ) | toString | b64enc | quote }}
+{{- end -}}
+{{- end -}}
diff --git a/scale-catalog-template/library/common/templates/lib/resources/_certs.tpl b/scale-catalog-template/library/common/templates/lib/resources/_certs.tpl
new file mode 100644
index 00000000..91c525ab
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/lib/resources/_certs.tpl
@@ -0,0 +1,24 @@
+{{/*
+Retrieve true/false if certificate is available in ixCertificates
+*/}}
+{{- define "common.resources.cert_present" -}}
+{{- $values := . -}}
+{{- hasKey $values.Values.ixCertificates ($values.commonCertOptions.certKeyName | toString) -}}
+{{- end -}}
+
+
+{{/*
+Retrieve certificate from variable name
+*/}}
+{{- define "common.resources.cert" -}}
+{{- $values := . -}}
+{{- $certKey := ($values.commonCertOptions.certKeyName | toString) -}}
+{{- if hasKey $values.Values.ixCertificates $certKey -}}
+{{- $cert := get $values.Values.ixCertificates $certKey -}}
+{{- if $values.commonCertOptions.publicKey -}}
+{{ $cert.certificate }}
+{{- else -}}
+{{ $cert.privatekey }}
+{{- end -}}
+{{- end -}}
+{{- end -}}
diff --git a/scale-catalog-template/library/common/templates/lib/resources/_portal_config.tpl b/scale-catalog-template/library/common/templates/lib/resources/_portal_config.tpl
new file mode 100644
index 00000000..d92961a0
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/lib/resources/_portal_config.tpl
@@ -0,0 +1,64 @@
+{{- define "common.resources.portal" -}}
+
+{{- if .Values.portal }}
+{{- if .Values.portal.enabled }}
+{{- $host := "$node_ip" }}
+{{- $port := 443 }}
+{{- $protocol := "https" }}
+{{- $portProtocol := "" }}
+
+{{- if hasKey .Values "ingress" }}
+ {{- if hasKey .Values.ingress "main" -}}
+ {{- if .Values.ingress.main.host }}
+ {{- $host = .Values.ingress.main.host }}
+ {{- else }}
+ {{- range .Values.ingress.main.hosts }}
+ {{- $host = ( .host | quote ) }}
+ {{- end }}
+ {{- end }}
+ {{- end }}
+{{- end }}
+
+{{- if and ( .Values.portal.ingressPort ) ( ne $host "$node_ip" ) }}
+ {{- $port = .Values.portal.ingressPort }}
+{{- else if and ( eq $host "$node_ip" ) ( hasKey .Values "services" ) }}
+ {{- if hasKey .Values.services "main" }}
+ {{- if and (hasKey .Values.services.main.port "nodePort" ) ( eq .Values.services.main.type "NodePort" ) }}
+ {{- $port = .Values.services.main.port.nodePort }}
+ {{- if or ( eq .Values.services.main.port.protocol "HTTP" ) ( eq .Values.services.main.port.protocol "HTTPS" ) }}
+ {{- $portProtocol = .Values.services.main.port.protocol }}
+ {{- end }}
+ {{- end }}
+ {{- end }}
+{{- end }}
+
+{{- if and ( $portProtocol ) ( eq $host "$node_ip" ) }}
+ {{- $protocol = $portProtocol }}
+{{- else if and ( ne $host "$node_ip" ) }}
+ {{- if .Values.ingress.main.certType }}
+ {{- if eq .Values.ingress.main.certType "" }}
+ {{- $protocol = "http" }}
+ {{- end }}
+ {{- end }}
+{{- end }}
+
+{{- if and ( .Values.portal.host ) ( eq $host "$node_ip" ) }}
+ {{- $host = .Values.portal.host }}
+{{- end }}
+
+---
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: portal
+ labels: {{ include "common.labels" . | nindent 4 }}
+data:
+ protocol: {{ $protocol }}
+ host: {{ $host }}
+ port: {{ $port | quote }}
+ url: {{ printf "%v%v%v%v%v" $protocol "://" $host ":" $port }}
+
+{{- end }}
+{{- end }}
+{{- end -}}
diff --git a/scale-catalog-template/library/common/templates/lib/storage/_mountPermissions.tpl b/scale-catalog-template/library/common/templates/lib/storage/_mountPermissions.tpl
new file mode 100644
index 00000000..323d2a33
--- /dev/null
+++ b/scale-catalog-template/library/common/templates/lib/storage/_mountPermissions.tpl
@@ -0,0 +1,77 @@
+{{/*
+This template serves as the blueprint for the mountPermissions job that is run
+before chart installation.
+*/}}
+{{- define "common.storage.permissions" -}}
+{{- if .Values.fixMountPermissions }}
+
+
+{{- $jobName := include "common.names.fullname" . -}}
+{{- $values := .Values -}}
+
+
+{{- print "---" | nindent 0 -}}
+
+apiVersion: batch/v1
+kind: Job
+metadata:
+ name: {{ $jobName }}-autopermissions
+ labels:
+ {{- include "common.labels" . | nindent 4 }}
+ annotations:
+ "helm.sh/hook": pre-install,pre-upgrade
+ "helm.sh/hook-weight": "-10"
+ "helm.sh/hook-delete-policy": hook-succeeded,hook-failed,before-hook-creation
+spec:
+ template:
+ metadata:
+ spec:
+ restartPolicy: Never
+ containers:
+ - name: set-mount-permissions
+ image: "alpine:3.3"
+ command:
+ - /bin/sh
+ - -c
+ - | {{ range $index, $cs := .Values.customStorage}}{{ if and $cs.enabled $cs.setPermissions}}
+ chown -R {{ if eq $values.podSecurityContext.runAsNonRoot false }}{{ print $values.PUID }}{{ else }}{{ print $values.podSecurityContext.runAsUser }}{{ end }}:{{ print $values.podSecurityContext.fsGroup }} {{ print $cs.mountPath }}{{ end }}{{ end }}
+ #args:
+ #
+ #securityContext:
+ #
+ volumeMounts:
+ {{ range $name, $csm := .Values.customStorage }}
+ {{- if $csm.enabled -}}
+ {{- if $csm.setPermissions -}}
+ {{ if $csm.name }}
+ {{ $name = $csm.name }}
+ {{ end }}
+ - name: customstorage-{{ $name }}
+ mountPath: {{ $csm.mountPath }}
+ {{ if $csm.subPath }}
+ subPath: {{ $csm.subPath }}
+ {{ end }}
+ {{- end -}}
+ {{- end -}}
+ {{ end }}
+ volumes:
+ {{- range $name, $cs := .Values.customStorage -}}
+ {{ if $cs.enabled }}
+ {{ if $cs.setPermissions }}
+ {{ if $cs.name }}
+ {{ $name = $cs.name }}
+ {{ end }}
+ - name: customstorage-{{ $name }}
+ {{ if $cs.emptyDir }}
+ emptyDir: {}
+ {{- else -}}
+ hostPath:
+ path: {{ required "hostPath not set" $cs.hostPath }}
+ {{ end }}
+ {{ end }}
+ {{ end }}
+ {{- end -}}
+
+
+{{- end }}
+{{- end }}
diff --git a/scale-catalog-template/library/common/values.yaml b/scale-catalog-template/library/common/values.yaml
new file mode 100644
index 00000000..9b15e127
--- /dev/null
+++ b/scale-catalog-template/library/common/values.yaml
@@ -0,0 +1,314 @@
+# type: options are deployment, daemonset or statefulset
+controllerType: deployment
+# Set annotations on the deployment/statefulset/daemonset
+controllerAnnotations: {}
+# Set labels on the deployment/statefulset/daemonset
+controllerLabels: {}
+
+replicas: 1
+strategy:
+ ## For Deployments, valid values are Recreate and RollingUpdate
+ ## For StatefulSets, valid values are OnDelete and RollingUpdate
+ ## DaemonSets ignore this
+ type: RollingUpdate
+
+# Override the default command
+command: []
+# Override the default args
+args: []
+
+nameOverride: ""
+fullnameOverride: ""
+
+# Set annotations on the pod
+podAnnotations: {}
+
+serviceAccount:
+ # Specifies whether a service account should be created
+ create: false
+ # Annotations to add to the service account
+ annotations: {}
+ # The name of the service account to use.
+ # If not set and create is true, a name is generated using the fullname template
+ name: ""
+
+
+env: {}
+ # TZ: UTC
+
+## Variables with values set from templates, example
+## With a release name of: demo, the example env value will be: demo-admin
+envTpl: {}
+ # TEMPLATE_VALUE: "{{ .Release.Name }}-admin"
+
+## Variables with values from (for example) the Downward API
+## See https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/
+envValueFrom: {}
+ # NODE_NAME:
+ # fieldRef:
+ # fieldPath: spec.nodeName
+
+envFrom: []
+# - configMapRef:
+# name: config-map-name
+# - secretRef:
+# name: secret-name
+
+# Custom priority class for different treatment by the scheduler
+# priorityClassName: system-node-critical
+
+# Allow specifying a custom scheduler name
+# schedulerName: awkward-dangerous-scheduler
+
+# Allow specifying explicit hostname setting
+# hostname:
+
+# When using hostNetwork make sure you set dnsPolicy to ClusterFirstWithHostNet
+hostNetwork: false
+
+## Default get based on hostNetwork setting
+# dnsPolicy: ClusterFirst
+
+# Optional DNS settings, configuring the ndots option may resolve
+# nslookup issues on some Kubernetes setups.
+# dnsConfig:
+# options:
+# - name: ndots
+# value: "1"
+
+# Enable/disable the generation of environment variables for services.
+# See https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/#accessing-the-service
+# for more information.
+enableServiceLinks: true
+
+# Configure the Security Context for the Pod
+podSecurityContext:
+ runAsNonRoot: true
+ runAsUser: 568
+ runAsGroup: 568
+ fsGroup: 568
+ fsGroupChangePolicy: "OnRootMismatch"
+
+# Configure the Security Context for the main container
+securityContext: {}
+
+
+initContainers: []
+
+additionalContainers: []
+
+## Probes configuration
+probes:
+ liveness:
+ enabled: true
+ ## Set this to true if you wish to specify your own livenessProbe
+ custom: false
+ ## The spec field contains the values for the default livenessProbe.
+ ## If you selected custom: true, this field holds the definition of the livenessProbe.
+ spec:
+ initialDelaySeconds: 0
+ periodSeconds: 10
+ timeoutSeconds: 10
+ failureThreshold: 5
+
+ readiness:
+ enabled: true
+ ## Set this to true if you wish to specify your own readinessProbe
+ custom: false
+ ## The spec field contains the values for the default readinessProbe.
+ ## If you selected custom: true, this field holds the definition of the readinessProbe.
+ spec:
+ initialDelaySeconds: 0
+ periodSeconds: 10
+ timeoutSeconds: 10
+ failureThreshold: 5
+
+ startup:
+ enabled: true
+ ## Set this to true if you wish to specify your own startupProbe
+ custom: false
+ ## The spec field contains the values for the default startupProbe.
+ ## If you selected custom: true, this field holds the definition of the startupProbe.
+ spec:
+ initialDelaySeconds: 0
+ timeoutSeconds: 10
+ ## This means it has a maximum of 5*30=150 seconds to start up before it fails
+ periodSeconds: 10
+ failureThreshold: 30
+
+services:
+ main:
+ enabled: true
+ type: ClusterIP
+ ## Specify the default port information
+ port:
+ port:
+ ## name defaults to http
+ name:
+ protocol: TCP
+ ## Specify a service targetPort if you wish to differ the service port from the application port.
+ ## If targetPort is specified, this port number is used in the container definition instead of
+ ## service.port.port. Therefore named ports are not supported for this field.
+ targetPort:
+ ## Specify the nodePort value for the LoadBalancer and NodePort service types.
+ ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
+ ##
+ # nodePort:
+ additionalPorts: []
+
+ ## Provide any additional annotations which may be required. This can be used to
+ ## set the LoadBalancer service type to internal only.
+ ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#internal-load-balancer
+ ##
+ annotations: {}
+ labels: {}
+
+additionalServices: []
+# - enabled: false
+# nameSuffix: api
+# type: ClusterIP
+# # Specify the default port information
+# port:
+# port:
+# # name defaults to http
+# name:
+# protocol: TCP
+# # targetPort defaults to http
+# targetPort:
+# # nodePort:
+# additionalPorts: []
+# annotations: {}
+# labels: {}
+
+# ingress:
+# main:
+# enabled: false
+# # Used when including ingress using {{ include "common.ingress" . }}
+# type: "HTTP"
+# entrypoint: "websecure"
+# certType: ""
+# ## Optional: defaults to IngressName
+# serviceName: ""
+# ## Optional: Almost never needed
+# serviceKind: ""
+# ## Optional: defaults to either service port
+# servicePort: 80
+# annotations: {}
+# # kubernetes.io/ingress.class: nginx
+# # kubernetes.io/tls-acme: "true"
+# labels: {}
+# hosts:
+# - host: chart-example.local
+# path: /
+# additionalIngresses: []
+# - enabled: false
+# nameSuffix: "api"
+# annotations: {}
+# # kubernetes.io/ingress.class: nginx
+# # kubernetes.io/tls-acme: "true"
+# labels: {}
+# hosts:
+# - host: chart-example.local
+# paths:
+# - path: /api
+# # Ignored if not kubeVersion >= 1.14-0
+# pathType: Prefix
+# tls: []
+# # - secretName: chart-example-tls
+# # hosts:
+# # - chart-example.local
+
+persistence:
+ config:
+ enabled: false
+ mountPath: /config
+ ## configuration data Persistent Volume Storage Class
+ ## If defined, storageClassName:
+ ## If set to "-", storageClassName: "", which disables dynamic provisioning
+ ## If undefined (the default) or set to null, no storageClassName spec is
+ ## set, choosing the default provisioner. (gp2 on AWS, standard on
+ ## GKE, AWS & OpenStack)
+ ##
+ # storageClass: "-"
+ ##
+ ## If you want to reuse an existing claim, you can pass the name of the PVC using
+ ## the existingClaim variable
+ # existingClaim: your-claim
+ # subPath: some-subpath
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ ## Set to true to retain the PVC upon helm uninstall
+ skipuninstall: false
+
+ # Create an emptyDir volume to share between all containers
+ shared:
+ enabled: false
+ emptyDir: true
+ mountPath: /shared
+
+additionalVolumes: []
+
+additionalVolumeMounts: []
+
+volumeClaimTemplates: []
+# Used in statefulset to create individual disks for each instance
+# - name: data
+# mountPath: /data
+# accessMode: "ReadWriteOnce"
+# size: 1Gi
+# - name: backup
+# mountPath: /backup
+# subPath: theSubPath
+# accessMode: "ReadWriteOnce"
+# size: 2Gi
+# storageClass: cheap-storage-class
+
+nodeSelector: {}
+
+affinity: {}
+
+tolerations: []
+
+hostAliases: []
+# Use hostAliases to add custom entries to /etc/hosts - mapping IP addresses to hostnames.
+# ref: https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/
+# - ip: "192.168.1.100"
+# hostnames:
+# - "example.com"
+# - "www.example.com"
+
+resources: {}
+# We usually recommend not to specify default resources and to leave this as a conscious
+# choice for the user. This also increases chances charts run on environments with little
+# resources, such as Minikube. If you do want to specify resources, uncomment the following
+# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
+# limits:
+# cpu: 100m
+# memory: 128Mi
+# requests:
+# cpu: 100m
+# memory: 128Mi
+
+## TrueCharts Specific
+
+PUID: 568
+PGID: 568
+UMASK: "002"
+fixMountPermissions: true
+
+# deviceMounts:
+# config:
+# enabled: false
+# emptyDir: false
+# hostPath: "/config"
+# setPermissions: true
+
+# customStorage:
+# - name: "data"
+# enabled: false
+# emptyDir: false
+# mountPath: "/data"
+# subPath: some-subpath
+# hostPath: ""
+# readOnly: false
+# setPermissions: true
diff --git a/scale-catalog-template/stable/jackett/3.1.5/CONFIG.md b/scale-catalog-template/stable/jackett/3.1.5/CONFIG.md
new file mode 100644
index 00000000..6d760c18
--- /dev/null
+++ b/scale-catalog-template/stable/jackett/3.1.5/CONFIG.md
@@ -0,0 +1,8 @@
+# Configuration Options
+
+##### Connecting to other apps
+If you need to connect this App to other Apps on TrueNAS SCALE, please refer to our "Linking Apps Together" guide:
+https://truecharts.org/manual/linking/
+
+##### Available config options
+In the future this page is going to contain an automated list of options available in the installation/edit UI.
diff --git a/scale-catalog-template/stable/jackett/3.1.5/Chart.lock b/scale-catalog-template/stable/jackett/3.1.5/Chart.lock
new file mode 100644
index 00000000..a225c6db
--- /dev/null
+++ b/scale-catalog-template/stable/jackett/3.1.5/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+digest: sha256:ea66c36be2fa73e56bc33f7e89af9ce338cdfbed0b347484888e87228b825015
+generated: "2021-05-06T13:29:38.578257131Z"
diff --git a/scale-catalog-template/stable/jackett/3.1.5/Chart.yaml b/scale-catalog-template/stable/jackett/3.1.5/Chart.yaml
new file mode 100644
index 00000000..e29da188
--- /dev/null
+++ b/scale-catalog-template/stable/jackett/3.1.5/Chart.yaml
@@ -0,0 +1,33 @@
+apiVersion: v2
+kubeVersion: ">=1.16.0-0"
+name: jackett
+version: 3.1.5
+upstream_version: 7.0.1
+appVersion: "auto"
+description: API Support for your favorite torrent trackers.
+type: application
+deprecated: false
+home: https://github.com/truecharts/apps/tree/master/stable/jackett
+icon: https://truecharts.org/_static/img/jackett-icon.png
+keywords:
+ - jackett
+ - torrent
+ - usenet
+sources:
+ - https://github.com/truecharts/apps/tree/master/stable/jackett
+ - https://github.com/k8s-at-home/charts/tree/master/charts/jackett
+ - https://github.com/Jackett/Jackett
+ - https://hub.docker.com/r/linuxserver/jackett
+dependencies:
+ - name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+ # condition:
+maintainers:
+ - name: TrueCharts
+ email: info@truecharts.org
+ url: truecharts.org
+ - name: Ornias1993
+ email: kjeld@schouten-lebbing.nl
+ url: truecharts.org
+# annotations:
diff --git a/scale-catalog-template/stable/jackett/3.1.5/README.md b/scale-catalog-template/stable/jackett/3.1.5/README.md
new file mode 100644
index 00000000..88c3c913
--- /dev/null
+++ b/scale-catalog-template/stable/jackett/3.1.5/README.md
@@ -0,0 +1,56 @@
+# Introduction
+
+![Version: 3.1.5](https://img.shields.io/badge/Version-3.1.5-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: auto](https://img.shields.io/badge/AppVersion-auto-informational?style=flat-square)
+
+API Support for your favorite torrent trackers.
+
+TrueCharts are designed to be installed as TrueNAS SCALE app only. We can not guarantee this charts works as a stand-alone helm installation.
+**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/apps/issues/new/choose)**
+
+## Source Code
+
+*
+*
+*
+*
+
+## Requirements
+
+Kubernetes: `>=1.16.0-0`
+
+## Dependencies
+
+| Repository | Name | Version |
+|------------|------|---------|
+| https://truecharts.org/ | common | 3.5.5 |
+
+## Installing the Chart
+
+To install the chart with the release name `jackett`
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Click "Install" for this specific Apps
+- Fill out the configuration form
+
+## Uninstalling the Chart
+
+To uninstall the `jackett` deployment
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Go to "Installed Apps"
+- Expand the menu in the top-right corner of this App
+- Click "Remove" for this specific Apps
+
+The command removes all the Kubernetes components associated with the chart **including storage volumes** _(Except hostPath Storage)_ and deletes the release.
+
+## Support
+
+- See the [Wiki](https://truecharts.org)
+- Open a [issue](https://github.com/truecharts/apps/issues/new/choose)
+- Ask a [question](https://github.com/truecharts/apps/discussions)
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
+All Rights Reserved - The TrueCharts Project
diff --git a/scale-catalog-template/stable/jackett/3.1.5/app-readme.md b/scale-catalog-template/stable/jackett/3.1.5/app-readme.md
new file mode 100644
index 00000000..7e8f54af
--- /dev/null
+++ b/scale-catalog-template/stable/jackett/3.1.5/app-readme.md
@@ -0,0 +1,3 @@
+API Support for your favorite torrent trackers.
+This App is supplied by TrueCharts, for more information please visit https://truecharts.org
+API Support for your favorite torrent trackers.
diff --git a/scale-catalog-template/stable/jackett/3.1.5/charts/common-3.5.5.tgz b/scale-catalog-template/stable/jackett/3.1.5/charts/common-3.5.5.tgz
new file mode 100644
index 00000000..d01688bb
Binary files /dev/null and b/scale-catalog-template/stable/jackett/3.1.5/charts/common-3.5.5.tgz differ
diff --git a/scale-catalog-template/stable/jackett/3.1.5/ix_values.yaml b/scale-catalog-template/stable/jackett/3.1.5/ix_values.yaml
new file mode 100644
index 00000000..99acca3a
--- /dev/null
+++ b/scale-catalog-template/stable/jackett/3.1.5/ix_values.yaml
@@ -0,0 +1,15 @@
+##
+# This file contains Values.yaml content that gets added to the output of questions.yaml
+# It's ONLY meant for content that the user is NOT expected to change.
+# Example: Everything under "image" is not included in questions.yaml but is included here.
+##
+
+image:
+ repository: ghcr.io/truecharts/jackett
+ pullPolicy: IfNotPresent
+ tag: v0.17.1011
+
+##
+# Most other defaults are set in questions.yaml
+# For other options please refer to the wiki, default_values.yaml or the common library chart
+##
diff --git a/scale-catalog-template/stable/jackett/3.1.5/questions.yaml b/scale-catalog-template/stable/jackett/3.1.5/questions.yaml
new file mode 100644
index 00000000..6de48d7f
--- /dev/null
+++ b/scale-catalog-template/stable/jackett/3.1.5/questions.yaml
@@ -0,0 +1,434 @@
+groups:
+ - name: "Container Image"
+ description: "Image to be used for container"
+ - name: "Workload Configuration"
+ description: "Configure workload deployment"
+ - name: "Configuration"
+ description: "additional container configuration"
+ - name: "Networking"
+ description: "Configure / service for container"
+ - name: "Storage"
+ description: "Persist and share data that is separate from the lifecycle of the container"
+ - name: "Resources and Devices"
+ description: "Specify resources/devices to be allocated to workload"
+ - name: "Reverse Proxy Configuration"
+ description: "Reverse Proxy configuration"
+ - name: "Advanced"
+ description: "Advanced Configuration"
+ - name: "WARNING"
+ description: "WARNING"
+portals:
+ web_portal:
+ protocols:
+ - "$kubernetes-resource_configmap_portal_protocol"
+ host:
+ - "$kubernetes-resource_configmap_portal_host"
+ ports:
+ - "$kubernetes-resource_configmap_portal_port"
+questions:
+ - variable: portal
+ group: "Container Image"
+ label: "Configure Portal Button"
+ schema:
+ type: dict
+ hidden: true
+ attrs:
+ - variable: enabled
+ label: "Enable"
+ description: "enable the portal button"
+ schema:
+ hidden: true
+ editable: false
+ type: boolean
+ default: true
+ # Update Policy
+ - variable: strategyType
+ group: "Container Image"
+ label: "Update Strategy"
+ schema:
+ type: string
+ default: "Recreate"
+ enum:
+ - value: "RollingUpdate"
+ description: "Create new pods and then kill old ones"
+ - value: "Recreate"
+ description: "Kill existing pods before creating new ones"
+ # Configure Time Zone
+ - variable: timezone
+ group: "Container Image"
+ label: "Timezone"
+ schema:
+ type: string
+ default: "Etc/UTC"
+ $ref:
+ - "definitions/timezone"
+
+ # Configure Enviroment Variables
+ - variable: environmentVariables
+ label: "Image environment"
+ group: "Configuration"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: environmentVariable
+ label: "Environment Variable"
+ schema:
+ type: dict
+ attrs:
+ - variable: name
+ label: "Name"
+ schema:
+ type: string
+ - variable: value
+ label: "Value"
+ schema:
+ type: string
+ # Enable Host Networking
+ - variable: hostNetwork
+ group: "Networking"
+ label: "Enable Host Networking"
+ schema:
+ type: boolean
+ default: false
+ - variable: services
+ group: "Networking"
+ label: "Configure Service"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "Main service"
+ description: "The Primary service on which the healthcheck runs, often the webUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: false
+ enum:
+ - value: HTTP
+ description: "HTTP"
+ - value: "HTTPS"
+ description: "HTTPS"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 9117
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 9117
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36009
+ required: true
+## TrueCharts Specific
+ - variable: persistence
+ label: "Integrated Persistent Storage"
+ group: "Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: config
+ label: "App Config Storage"
+ description: "Stores the Application Configuration."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: "/config"
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "100Gi"
+ - variable: customStorage
+ label: "Custom app storage"
+ group: "Storage"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: volumeMount
+ label: "Custom Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enabled"
+ schema:
+ type: boolean
+ default: true
+ required: true
+ hidden: true
+ editable: false
+ - variable: setPermissions
+ label: "Automatic Permissions"
+ description: "Automatically set permissions on install"
+ schema:
+ type: boolean
+ default: true
+ hidden: false
+ - variable: readOnly
+ label: "Mount as ReadOnly"
+ description: "prevent any write from being done to the mounted volume"
+ schema:
+ type: boolean
+ default: false
+ hidden: false
+ - variable: emptyDir
+ label: "emptyDir"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ editable: false
+ - variable: mountPath
+ label: "Mount Path"
+ description: "Path to mount inside the pod"
+ schema:
+ type: path
+ required: true
+ default: ""
+ editable: true
+ - variable: hostPath
+ label: "Host Path"
+ schema:
+ type: hostpath
+ required: true
+ - variable: ingress
+ label: ""
+ group: "Reverse Proxy Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "WebUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: certType
+ label: "Select Reverse-Proxy Type"
+ schema:
+ type: string
+ default: "disabled"
+ enum:
+ - value: "disabled"
+ description: "Disabled"
+ - value: ""
+ description: "No Encryption/TLS/Certificates"
+ - value: "selfsigned"
+ description: "Self-Signed Certificate"
+ - value: "ixcert"
+ description: "TrueNAS SCALE Certificate"
+ - variable: type
+ label: "Reverse Proxy Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: true
+ editable: false
+ required: true
+ - variable: serviceName
+ label: "Service name to proxy to"
+ schema:
+ hidden: true
+ editable: false
+ type: string
+ default: ""
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: "websecure"
+ required: true
+ enum:
+ - value: "websecure"
+ description: "Websecure: HTTPS/TLS port 443"
+ - variable: hosts
+ label: "Hosts"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: list
+ default: []
+ items:
+ - variable: host
+ label: "Host"
+ schema:
+ type: dict
+ attrs:
+ - variable: host
+ label: "Domain Name"
+ required: true
+ schema:
+ type: string
+ - variable: path
+ label: "path"
+ schema:
+ type: string
+ required: true
+ hidden: true
+ default: "/"
+ - variable: certificate
+ label: "Select TrueNAS SCALE Certificate"
+ schema:
+ type: int
+ show_if: [["certType", "=", "ixcert"]]
+ $ref:
+ - "definitions/certificate"
+ - variable: authForwardURL
+ label: "Forward Authentication URL"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: ""
+
+ - variable: UMASK
+ group: "Advanced"
+ label: "UMASK"
+ description: "Sets the UMASK env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: string
+ default: "002"
+ # Enable privileged
+ - variable: securityContext
+ group: "Advanced"
+ label: "Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: privileged
+ label: "Enable privileged mode for Common-Chart based charts"
+ schema:
+ type: boolean
+ default: false
+ # Set Pod Security Policy
+ - variable: podSecurityContext
+ group: "Advanced"
+ label: "Pod Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: runAsNonRoot
+ label: "runAsNonRoot"
+ schema:
+ type: boolean
+ default: true
+ - variable: runAsUser
+ label: "runAsUser"
+ description: "The UserID of the user running the application"
+ schema:
+ type: int
+ default: 568
+ - variable: runAsGroup
+ label: "runAsGroup"
+ description: The groupID this App of the user running the application"
+ schema:
+ type: int
+ default: 568
+ - variable: supplementalGroups
+ label: "supplementalGroups"
+ description: "Additional groups this App needs access to"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: Group
+ label: "Group"
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroup
+ label: "fsGroup"
+ description: "The group that should own ALL storage."
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroupChangePolicy
+ label: "When should we take ownership?"
+ schema:
+ type: string
+ default: "OnRootMismatch"
+ enum:
+ - value: "OnRootMismatch"
+ description: "OnRootMismatch"
+ - value: "Always"
+ description: "Always"
diff --git a/scale-catalog-template/stable/jackett/3.1.5/templates/common.yaml b/scale-catalog-template/stable/jackett/3.1.5/templates/common.yaml
new file mode 100644
index 00000000..a6613c2c
--- /dev/null
+++ b/scale-catalog-template/stable/jackett/3.1.5/templates/common.yaml
@@ -0,0 +1 @@
+{{ include "common.all" . }}
diff --git a/scale-catalog-template/stable/jackett/3.1.5/test_values.yaml b/scale-catalog-template/stable/jackett/3.1.5/test_values.yaml
new file mode 100644
index 00000000..77ee8243
--- /dev/null
+++ b/scale-catalog-template/stable/jackett/3.1.5/test_values.yaml
@@ -0,0 +1,46 @@
+# Default values for Jackett.
+
+image:
+ repository: ghcr.io/truecharts/jackett
+ pullPolicy: IfNotPresent
+ tag: v0.17.1011
+
+strategy:
+ type: Recreate
+
+
+services:
+ main:
+ enabled: true
+ port:
+ port: 9117
+
+env: {}
+ # TZ: UTC
+ # PUID: 1001
+ # PGID: 1001
+
+
+persistence:
+ config:
+ enabled: true
+ mountPath: "/config"
+ emptyDir: true
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ storageClass: ""
+
+
+## TrueCharts Values
+
+ingress:
+ main:
+ enabled: true
+ # Used when including ingress using {{ include "common.ingress" . }}
+ type: "HTTP"
+ entrypoint: "websecure"
+ certType: ""
+ annotations: {}
+ hosts:
+ - host: chart-example.local
+ path: /
diff --git a/scale-catalog-template/stable/jackett/3.1.5/values.yaml b/scale-catalog-template/stable/jackett/3.1.5/values.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/scale-catalog-template/stable/jackett/item.yaml b/scale-catalog-template/stable/jackett/item.yaml
new file mode 100644
index 00000000..8d747307
--- /dev/null
+++ b/scale-catalog-template/stable/jackett/item.yaml
@@ -0,0 +1,3 @@
+categories:
+ - media
+icon_url: https://truecharts.org/_static/img/jackett-icon.png
diff --git a/scale-catalog-template/test/appdaemon/0.1.3/CONFIG.md b/scale-catalog-template/test/appdaemon/0.1.3/CONFIG.md
new file mode 100644
index 00000000..6d760c18
--- /dev/null
+++ b/scale-catalog-template/test/appdaemon/0.1.3/CONFIG.md
@@ -0,0 +1,8 @@
+# Configuration Options
+
+##### Connecting to other apps
+If you need to connect this App to other Apps on TrueNAS SCALE, please refer to our "Linking Apps Together" guide:
+https://truecharts.org/manual/linking/
+
+##### Available config options
+In the future this page is going to contain an automated list of options available in the installation/edit UI.
diff --git a/scale-catalog-template/test/appdaemon/0.1.3/Chart.lock b/scale-catalog-template/test/appdaemon/0.1.3/Chart.lock
new file mode 100644
index 00000000..acfc21b3
--- /dev/null
+++ b/scale-catalog-template/test/appdaemon/0.1.3/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+digest: sha256:ea66c36be2fa73e56bc33f7e89af9ce338cdfbed0b347484888e87228b825015
+generated: "2021-05-06T13:29:46.438162658Z"
diff --git a/scale-catalog-template/test/appdaemon/0.1.3/Chart.yaml b/scale-catalog-template/test/appdaemon/0.1.3/Chart.yaml
new file mode 100644
index 00000000..b542ea4e
--- /dev/null
+++ b/scale-catalog-template/test/appdaemon/0.1.3/Chart.yaml
@@ -0,0 +1,26 @@
+apiVersion: v2
+kubeVersion: ">=1.16.0-0"
+name: appdaemon
+version: 0.1.3
+appVersion: v4.0.8
+description: AppDaemon is a loosely coupled, multithreaded, sandboxed python execution environment for writing automation apps for Home Assistant home automation software. It also provides a configurable dashboard (HADashboard) suitable for wall mounted tablets.
+type: application
+deprecated: false
+home: https://github.com/truecharts/apps/tree/master/incubator/appdaemon
+icon: https://github.com/hassio-addons/addon-appdaemon/blob/main/appdaemon/icon.png?raw=true
+keywords:
+ - appdaemon
+ - homeautomation
+sources:
+ - https://github.com/AppDaemon/appdaemon
+dependencies:
+ - name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+maintainers:
+ - name: TrueCharts
+ email: info@truecharts.org
+ url: truecharts.org
+ - name: warllo54
+ email: 20650065+warllo54@users.noreply.github.com
+ url: truecharts.org
diff --git a/scale-catalog-template/test/appdaemon/0.1.3/README.md b/scale-catalog-template/test/appdaemon/0.1.3/README.md
new file mode 100644
index 00000000..ac652fbf
--- /dev/null
+++ b/scale-catalog-template/test/appdaemon/0.1.3/README.md
@@ -0,0 +1,53 @@
+# Introduction
+
+![Version: 0.1.3](https://img.shields.io/badge/Version-0.1.3-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: v4.0.8](https://img.shields.io/badge/AppVersion-v4.0.8-informational?style=flat-square)
+
+AppDaemon is a loosely coupled, multithreaded, sandboxed python execution environment for writing automation apps for Home Assistant home automation software. It also provides a configurable dashboard (HADashboard) suitable for wall mounted tablets.
+
+TrueCharts are designed to be installed as TrueNAS SCALE app only. We can not guarantee this charts works as a stand-alone helm installation.
+**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/apps/issues/new/choose)**
+
+## Source Code
+
+*
+
+## Requirements
+
+Kubernetes: `>=1.16.0-0`
+
+## Dependencies
+
+| Repository | Name | Version |
+|------------|------|---------|
+| https://truecharts.org/ | common | 3.5.5 |
+
+## Installing the Chart
+
+To install the chart with the release name `appdaemon`
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Click "Install" for this specific Apps
+- Fill out the configuration form
+
+## Uninstalling the Chart
+
+To uninstall the `appdaemon` deployment
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Go to "Installed Apps"
+- Expand the menu in the top-right corner of this App
+- Click "Remove" for this specific Apps
+
+The command removes all the Kubernetes components associated with the chart **including storage volumes** _(Except hostPath Storage)_ and deletes the release.
+
+## Support
+
+- See the [Wiki](https://truecharts.org)
+- Open a [issue](https://github.com/truecharts/apps/issues/new/choose)
+- Ask a [question](https://github.com/truecharts/apps/discussions)
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
+All Rights Reserved - The TrueCharts Project
diff --git a/scale-catalog-template/test/appdaemon/0.1.3/app-readme.md b/scale-catalog-template/test/appdaemon/0.1.3/app-readme.md
new file mode 100644
index 00000000..b948120c
--- /dev/null
+++ b/scale-catalog-template/test/appdaemon/0.1.3/app-readme.md
@@ -0,0 +1,3 @@
+AppDaemon is a loosely coupled, multithreaded, sandboxed python execution environment for writing automation apps for Home Assistant home automation software. It also provides a configurable dashboard (HADashboard) suitable for wall mounted tablets.
+This App is supplied by TrueCharts, for more information please visit https://truecharts.org
+AppDaemon is a loosely coupled, multithreaded, sandboxed python execution environment for writing automation apps for Home Assistant home automation software. It also provides a configurable dashboard (HADashboard) suitable for wall mounted tablets.
diff --git a/scale-catalog-template/test/appdaemon/0.1.3/charts/common-3.5.5.tgz b/scale-catalog-template/test/appdaemon/0.1.3/charts/common-3.5.5.tgz
new file mode 100644
index 00000000..d01688bb
Binary files /dev/null and b/scale-catalog-template/test/appdaemon/0.1.3/charts/common-3.5.5.tgz differ
diff --git a/scale-catalog-template/test/appdaemon/0.1.3/ix_values.yaml b/scale-catalog-template/test/appdaemon/0.1.3/ix_values.yaml
new file mode 100644
index 00000000..ef02d27c
--- /dev/null
+++ b/scale-catalog-template/test/appdaemon/0.1.3/ix_values.yaml
@@ -0,0 +1,16 @@
+##
+# This file contains Values.yaml content that gets added to the output of questions.yaml
+# It's ONLY meant for content that the user is NOT expected to change.
+# Example: Everything under "image" is not included in questions.yaml but is included here.
+##
+
+image:
+ repository: acockburn/appdaemon
+ pullPolicy: IfNotPresent
+ tag: "4.0.8"
+
+
+##
+# Most other defaults are set in questions.yaml
+# For other options please refer to the wiki, default_values.yaml or the common library chart
+##
diff --git a/scale-catalog-template/test/appdaemon/0.1.3/questions.yaml b/scale-catalog-template/test/appdaemon/0.1.3/questions.yaml
new file mode 100644
index 00000000..eae94631
--- /dev/null
+++ b/scale-catalog-template/test/appdaemon/0.1.3/questions.yaml
@@ -0,0 +1,431 @@
+groups:
+ - name: "Container Image"
+ description: "Image to be used for container"
+ - name: "Workload Configuration"
+ description: "Configure workload deployment"
+ - name: "Configuration"
+ description: "additional container configuration"
+ - name: "Networking"
+ description: "Configure / service for container"
+ - name: "Storage"
+ description: "Persist and share data that is separate from the lifecycle of the container"
+ - name: "Resources and Devices"
+ description: "Specify resources/devices to be allocated to workload"
+ - name: "Reverse Proxy Configuration"
+ description: "Reverse Proxy configuration"
+ - name: "Advanced"
+ description: "Advanced Configuration"
+ - name: "WARNING"
+ description: "WARNING"
+portals:
+ web_portal:
+ protocols:
+ - "$kubernetes-resource_configmap_portal_protocol"
+ host:
+ - "$kubernetes-resource_configmap_portal_host"
+ ports:
+ - "$kubernetes-resource_configmap_portal_port"
+questions:
+ - variable: portal
+ group: "Container Image"
+ label: "Configure Portal Button"
+ schema:
+ type: dict
+ hidden: true
+ attrs:
+ - variable: enabled
+ label: "Enable"
+ description: "enable the portal button"
+ schema:
+ hidden: true
+ editable: false
+ type: boolean
+ default: true
+
+ # Update Policy
+ - variable: strategyType
+ group: "Container Image"
+ label: "Update Strategy"
+ schema:
+ type: string
+ default: "Recreate"
+ enum:
+ - value: "RollingUpdate"
+ description: "Create new pods and then kill old ones"
+ - value: "Recreate"
+ description: "Kill existing pods before creating new ones"
+ # Configure Time Zone
+ - variable: timezone
+ group: "Container Image"
+ label: "Timezone"
+ schema:
+ type: string
+ default: "Etc/UTC"
+ $ref:
+ - "definitions/timezone"
+
+ # Docker specific env
+ - variable: env
+ group: "Configuration"
+ label: "Image Environment"
+ schema:
+ type: dict
+ attrs:
+ - variable: HA_URL
+ label: "HA URL"
+ description: "Your HomeAssistant URL"
+ schema:
+ type: string
+ default: ""
+ required: true
+ - variable: TOKEN
+ label: "HA Token"
+ description: "Your HomeAssistant Token"
+ schema:
+ type: string
+ default: ""
+ required: true
+ - variable: DASH_URL
+ label: "Dashboard URL"
+ description: "URL of your appdaemon dashboard"
+ schema:
+ type: string
+ default: ""
+ required: true
+ - variable: LATITUDE
+ label: "Latitude"
+ description: "Latitude of your home assistant instance"
+ schema:
+ type: int
+ default: 0
+ required: true
+ - variable: LONGITUDE
+ label: "Longitude"
+ description: "Longitude of your home assistant instance"
+ schema:
+ type: int
+ default: 0
+ required: true
+ - variable: ELEVATION
+ label: "Elevation"
+ description: "Longitude of your home assistant instance"
+ schema:
+ type: int
+ default: 0
+ required: true
+
+
+ # Configure Enviroment Variables
+ - variable: environmentVariables
+ label: "Image environment"
+ group: "Configuration"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: environmentVariable
+ label: "Environment Variable"
+ schema:
+ type: dict
+ attrs:
+ - variable: name
+ label: "Name"
+ schema:
+ type: string
+ - variable: value
+ label: "Value"
+ schema:
+ type: string
+
+ # Enable Host Networking
+ - variable: hostNetwork
+ group: "Networking"
+ label: "Enable Host Networking"
+ schema:
+ type: boolean
+ default: false
+ - variable: services
+ group: "Networking"
+ label: "Configure Service"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "Main service"
+ description: "The Primary service on which the healthcheck runs, often the webUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: false
+ enum:
+ - value: HTTP
+ description: "HTTP"
+ - value: "HTTPS"
+ description: "HTTPS"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 5050
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 51050
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36052
+ required: true
+## TrueCharts Specific
+
+ - variable: customStorage
+ label: "Custom app storage"
+ group: "Storage"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: volumeMount
+ label: "Custom Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enabled"
+ schema:
+ type: boolean
+ default: true
+ required: true
+ hidden: true
+ editable: false
+ - variable: setPermissions
+ label: "Automatic Permissions"
+ description: "Automatically set permissions on install"
+ schema:
+ type: boolean
+ default: true
+ hidden: false
+ - variable: readOnly
+ label: "Mount as ReadOnly"
+ description: "prevent any write from being done to the mounted volume"
+ schema:
+ type: boolean
+ default: false
+ hidden: false
+ - variable: emptyDir
+ label: "emptyDir"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ editable: false
+ - variable: mountPath
+ label: "Mount Path"
+ description: "Path to mount inside the pod"
+ schema:
+ type: path
+ required: true
+ default: ""
+ editable: true
+ - variable: hostPath
+ label: "Host Path"
+ schema:
+ type: hostpath
+ required: true
+
+ - variable: ingress
+ label: ""
+ group: "Reverse Proxy Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "WebUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: certType
+ label: "Select Reverse-Proxy Type"
+ schema:
+ type: string
+ default: "selfsigned"
+ enum:
+ - value: "disabled"
+ description: "Disabled"
+ - value: ""
+ description: "No Encryption/TLS/Certificates"
+ - value: "selfsigned"
+ description: "Self-Signed Certificate"
+ - value: "ixcert"
+ description: "TrueNAS SCALE Certificate"
+ - variable: type
+ label: "Reverse Proxy Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: true
+ editable: false
+ required: true
+ - variable: serviceName
+ label: "Service name to proxy to"
+ schema:
+ hidden: true
+ editable: false
+ type: string
+ default: ""
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: "websecure"
+ required: true
+ enum:
+ - value: "websecure"
+ description: "Websecure: HTTPS/TLS port 443"
+ - variable: hosts
+ label: "Hosts"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: list
+ default: []
+ items:
+ - variable: host
+ label: "Host"
+ schema:
+ type: dict
+ attrs:
+ - variable: host
+ label: "Domain Name"
+ required: true
+ schema:
+ type: string
+ - variable: path
+ label: "path"
+ schema:
+ type: string
+ required: true
+ hidden: true
+ default: "/"
+ - variable: certificate
+ label: "Select TrueNAS SCALE Certificate"
+ schema:
+ type: int
+ show_if: [["certType", "=", "ixcert"]]
+ $ref:
+ - "definitions/certificate"
+ - variable: authForwardURL
+ label: "Forward Authentication URL"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: ""
+
+ - variable: UMASK
+ group: "Advanced"
+ label: "UMASK"
+ description: "Sets the UMASK env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: string
+ default: "002"
+ # Enable privileged
+ - variable: securityContext
+ group: "Advanced"
+ label: "Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: privileged
+ label: "Enable privileged mode for Common-Chart based charts"
+ schema:
+ type: boolean
+ default: false
+ # Set Pod Security Policy
+ - variable: podSecurityContext
+ group: "Advanced"
+ label: "Pod Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: runAsNonRoot
+ label: "runAsNonRoot"
+ schema:
+ type: boolean
+ default: true
+ - variable: runAsUser
+ label: "runAsUser"
+ description: "The UserID of the user running the application"
+ schema:
+ type: int
+ default: 568
+ - variable: runAsGroup
+ label: "runAsGroup"
+ description: The groupID this App of the user running the application"
+ schema:
+ type: int
+ default: 568
+ - variable: supplementalGroups
+ label: "supplementalGroups"
+ description: "Additional groups this App needs access to"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: Group
+ label: "Group"
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroup
+ label: "fsGroup"
+ description: "The group that should own ALL storage."
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroupChangePolicy
+ label: "When should we take ownership?"
+ schema:
+ type: string
+ default: "OnRootMismatch"
+ enum:
+ - value: "OnRootMismatch"
+ description: "OnRootMismatch"
+ - value: "Always"
+ description: "Always"
diff --git a/scale-catalog-template/test/appdaemon/0.1.3/templates/common.yaml b/scale-catalog-template/test/appdaemon/0.1.3/templates/common.yaml
new file mode 100644
index 00000000..a6613c2c
--- /dev/null
+++ b/scale-catalog-template/test/appdaemon/0.1.3/templates/common.yaml
@@ -0,0 +1 @@
+{{ include "common.all" . }}
diff --git a/scale-catalog-template/test/appdaemon/0.1.3/test_values.yaml b/scale-catalog-template/test/appdaemon/0.1.3/test_values.yaml
new file mode 100644
index 00000000..031febf0
--- /dev/null
+++ b/scale-catalog-template/test/appdaemon/0.1.3/test_values.yaml
@@ -0,0 +1,40 @@
+image:
+ repository: ghcr.io/truecharts/appdaemon
+ pullPolicy: IfNotPresent
+ tag: "v4.0.8"
+
+strategy:
+ type: Recreate
+
+# Configure the Security Context for the Pod
+podSecurityContext:
+ runAsNonRoot: true
+ runAsUser: 568
+ runAsGroup: 568
+ fsGroup: 568
+
+timezone: "America/Chicago"
+
+env:
+ LATITUDE: 46
+ LONGITUDE: -94
+ ELEVATION: 1217
+ DASH_URL: "http://0.0.0.0:5050"
+
+services:
+ main:
+ port:
+ port: 5050
+ tcp:
+ enabled: true
+ type: ClusterIP
+ port:
+ port: 51050
+ protocol: TCP
+ targetPort: 51050
+
+customStorage:
+ - name: config
+ enabled: true
+ mountPath: /conf
+ emptyDir: true
diff --git a/scale-catalog-template/test/appdaemon/0.1.3/values.yaml b/scale-catalog-template/test/appdaemon/0.1.3/values.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/scale-catalog-template/test/appdaemon/item.yaml b/scale-catalog-template/test/appdaemon/item.yaml
new file mode 100644
index 00000000..4f0aa859
--- /dev/null
+++ b/scale-catalog-template/test/appdaemon/item.yaml
@@ -0,0 +1,3 @@
+categories:
+ - utilities
+icon_url: https://github.com/hassio-addons/addon-appdaemon/blob/main/appdaemon/logo.png?raw=true
diff --git a/scale-catalog-template/test/bazarr/3.1.5/CONFIG.md b/scale-catalog-template/test/bazarr/3.1.5/CONFIG.md
new file mode 100644
index 00000000..6d760c18
--- /dev/null
+++ b/scale-catalog-template/test/bazarr/3.1.5/CONFIG.md
@@ -0,0 +1,8 @@
+# Configuration Options
+
+##### Connecting to other apps
+If you need to connect this App to other Apps on TrueNAS SCALE, please refer to our "Linking Apps Together" guide:
+https://truecharts.org/manual/linking/
+
+##### Available config options
+In the future this page is going to contain an automated list of options available in the installation/edit UI.
diff --git a/scale-catalog-template/test/bazarr/3.1.5/Chart.lock b/scale-catalog-template/test/bazarr/3.1.5/Chart.lock
new file mode 100644
index 00000000..ecc7d8d0
--- /dev/null
+++ b/scale-catalog-template/test/bazarr/3.1.5/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+digest: sha256:ea66c36be2fa73e56bc33f7e89af9ce338cdfbed0b347484888e87228b825015
+generated: "2021-05-06T13:29:46.949866373Z"
diff --git a/scale-catalog-template/test/bazarr/3.1.5/Chart.yaml b/scale-catalog-template/test/bazarr/3.1.5/Chart.yaml
new file mode 100644
index 00000000..0737efb2
--- /dev/null
+++ b/scale-catalog-template/test/bazarr/3.1.5/Chart.yaml
@@ -0,0 +1,36 @@
+apiVersion: v2
+kubeVersion: ">=1.16.0-0"
+name: bazarr
+version: 3.1.5
+upstream_version: 5.2.1
+appVersion: "auto"
+description: Bazarr is a companion application to Bazarr and Radarr. It manages and downloads subtitles based on your requirements
+type: application
+deprecated: false
+home: https://github.com/truecharts/apps/tree/master/incubator/bazarr
+icon: https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/bazarr.png
+keywords:
+ - bazarr
+ - radarr
+ - bazarr
+ - subtitles
+ - usenet
+ - torrent
+sources:
+ - https://github.com/truecharts/apps/tree/master/incubator/bazarr
+ - https://github.com/k8s-at-home/charts/tree/master/charts/bazarr
+ - https://github.com/Bazarr/Bazarr
+ - https://hub.docker.com/r/linuxserver/bazarr
+dependencies:
+ - name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+ # condition:
+maintainers:
+ - name: TrueCharts
+ email: info@truecharts.org
+ url: truecharts.org
+ - name: Ornias1993
+ email: kjeld@schouten-lebbing.nl
+ url: truecharts.org
+# annotations:
diff --git a/scale-catalog-template/test/bazarr/3.1.5/README.md b/scale-catalog-template/test/bazarr/3.1.5/README.md
new file mode 100644
index 00000000..97a3c184
--- /dev/null
+++ b/scale-catalog-template/test/bazarr/3.1.5/README.md
@@ -0,0 +1,56 @@
+# Introduction
+
+![Version: 3.1.5](https://img.shields.io/badge/Version-3.1.5-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: auto](https://img.shields.io/badge/AppVersion-auto-informational?style=flat-square)
+
+Bazarr is a companion application to Bazarr and Radarr. It manages and downloads subtitles based on your requirements
+
+TrueCharts are designed to be installed as TrueNAS SCALE app only. We can not guarantee this charts works as a stand-alone helm installation.
+**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/apps/issues/new/choose)**
+
+## Source Code
+
+*
+*
+*
+*
+
+## Requirements
+
+Kubernetes: `>=1.16.0-0`
+
+## Dependencies
+
+| Repository | Name | Version |
+|------------|------|---------|
+| https://truecharts.org/ | common | 3.5.5 |
+
+## Installing the Chart
+
+To install the chart with the release name `bazarr`
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Click "Install" for this specific Apps
+- Fill out the configuration form
+
+## Uninstalling the Chart
+
+To uninstall the `bazarr` deployment
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Go to "Installed Apps"
+- Expand the menu in the top-right corner of this App
+- Click "Remove" for this specific Apps
+
+The command removes all the Kubernetes components associated with the chart **including storage volumes** _(Except hostPath Storage)_ and deletes the release.
+
+## Support
+
+- See the [Wiki](https://truecharts.org)
+- Open a [issue](https://github.com/truecharts/apps/issues/new/choose)
+- Ask a [question](https://github.com/truecharts/apps/discussions)
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
+All Rights Reserved - The TrueCharts Project
diff --git a/scale-catalog-template/test/bazarr/3.1.5/app-readme.md b/scale-catalog-template/test/bazarr/3.1.5/app-readme.md
new file mode 100644
index 00000000..2d112915
--- /dev/null
+++ b/scale-catalog-template/test/bazarr/3.1.5/app-readme.md
@@ -0,0 +1,3 @@
+Bazarr is a companion application to Bazarr and Radarr. It manages and downloads subtitles based on your requirements
+This App is supplied by TrueCharts, for more information please visit https://truecharts.org
+Bazarr is a companion application to Bazarr and Radarr. It manages and downloads subtitles based on your requirements
diff --git a/scale-catalog-template/test/bazarr/3.1.5/charts/common-3.5.5.tgz b/scale-catalog-template/test/bazarr/3.1.5/charts/common-3.5.5.tgz
new file mode 100644
index 00000000..d01688bb
Binary files /dev/null and b/scale-catalog-template/test/bazarr/3.1.5/charts/common-3.5.5.tgz differ
diff --git a/scale-catalog-template/test/bazarr/3.1.5/ix_values.yaml b/scale-catalog-template/test/bazarr/3.1.5/ix_values.yaml
new file mode 100644
index 00000000..e6a02921
--- /dev/null
+++ b/scale-catalog-template/test/bazarr/3.1.5/ix_values.yaml
@@ -0,0 +1,15 @@
+##
+# This file contains Values.yaml content that gets added to the output of questions.yaml
+# It's ONLY meant for content that the user is NOT expected to change.
+# Example: Everything under "image" is not included in questions.yaml but is included here.
+##
+
+image:
+ repository: ghcr.io/truecharts/bazarr
+ pullPolicy: IfNotPresent
+ tag: v0.9.3-beta.9
+
+##
+# Most other defaults are set in questions.yaml
+# For other options please refer to the wiki, default_values.yaml or the common library chart
+##
diff --git a/scale-catalog-template/test/bazarr/3.1.5/questions.yaml b/scale-catalog-template/test/bazarr/3.1.5/questions.yaml
new file mode 100644
index 00000000..3ed15945
--- /dev/null
+++ b/scale-catalog-template/test/bazarr/3.1.5/questions.yaml
@@ -0,0 +1,436 @@
+groups:
+ - name: "Container Image"
+ description: "Image to be used for container"
+ - name: "Workload Configuration"
+ description: "Configure workload deployment"
+ - name: "Configuration"
+ description: "additional container configuration"
+ - name: "Networking"
+ description: "Configure / service for container"
+ - name: "Storage"
+ description: "Persist and share data that is separate from the lifecycle of the container"
+ - name: "Resources and Devices"
+ description: "Specify resources/devices to be allocated to workload"
+ - name: "Reverse Proxy Configuration"
+ description: "Reverse Proxy configuration"
+ - name: "Advanced"
+ description: "Advanced Configuration"
+ - name: "WARNING"
+ description: "WARNING"
+portals:
+ web_portal:
+ protocols:
+ - "$kubernetes-resource_configmap_portal_protocol"
+ host:
+ - "$kubernetes-resource_configmap_portal_host"
+ ports:
+ - "$kubernetes-resource_configmap_portal_port"
+questions:
+ - variable: portal
+ group: "Container Image"
+ label: "Configure Portal Button"
+ schema:
+ type: dict
+ hidden: true
+ attrs:
+ - variable: enabled
+ label: "Enable"
+ description: "enable the portal button"
+ schema:
+ hidden: true
+ editable: false
+ type: boolean
+ default: true
+
+ # Update Policy
+ - variable: strategyType
+ group: "Container Image"
+ label: "Update Strategy"
+ schema:
+ type: string
+ default: "Recreate"
+ enum:
+ - value: "RollingUpdate"
+ description: "Create new pods and then kill old ones"
+ - value: "Recreate"
+ description: "Kill existing pods before creating new ones"
+ # Configure Time Zone
+ - variable: timezone
+ group: "Container Image"
+ label: "Timezone"
+ schema:
+ type: string
+ default: "Etc/UTC"
+ $ref:
+ - "definitions/timezone"
+
+ # Configure Enviroment Variables
+ - variable: environmentVariables
+ label: "Image environment"
+ group: "Configuration"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: environmentVariable
+ label: "Environment Variable"
+ schema:
+ type: dict
+ attrs:
+ - variable: name
+ label: "Name"
+ schema:
+ type: string
+ - variable: value
+ label: "Value"
+ schema:
+ type: string
+ # Enable Host Networking
+ - variable: hostNetwork
+ group: "Networking"
+ label: "Enable Host Networking"
+ schema:
+ type: boolean
+ default: false
+ - variable: services
+ group: "Networking"
+ label: "Configure Service"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "Main service"
+ description: "The Primary service on which the healthcheck runs, often the webUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: false
+ enum:
+ - value: HTTP
+ description: "HTTP"
+ - value: "HTTPS"
+ description: "HTTPS"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 6767
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 6767
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36025
+ required: true
+## TrueCharts Specific
+ - variable: persistence
+ label: "Integrated Persistent Storage"
+ description: "Websocket Service"
+ group: "Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: config
+ label: "App Config Storage"
+ description: "Stores the Application Configuration."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: "/config"
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "100Gi"
+ - variable: customStorage
+ label: "Custom app storage"
+ group: "Storage"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: volumeMount
+ label: "Custom Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enabled"
+ schema:
+ type: boolean
+ default: true
+ required: true
+ hidden: true
+ editable: false
+ - variable: setPermissions
+ label: "Automatic Permissions"
+ description: "Automatically set permissions on install"
+ schema:
+ type: boolean
+ default: true
+ hidden: false
+ - variable: readOnly
+ label: "Mount as ReadOnly"
+ description: "prevent any write from being done to the mounted volume"
+ schema:
+ type: boolean
+ default: false
+ hidden: false
+ - variable: emptyDir
+ label: "emptyDir"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ editable: false
+ - variable: mountPath
+ label: "Mount Path"
+ description: "Path to mount inside the pod"
+ schema:
+ type: path
+ required: true
+ default: ""
+ editable: true
+ - variable: hostPath
+ label: "Host Path"
+ schema:
+ type: hostpath
+ required: true
+ - variable: ingress
+ label: ""
+ group: "Reverse Proxy Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "WebUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: certType
+ label: "Select Reverse-Proxy Type"
+ schema:
+ type: string
+ default: "disabled"
+ enum:
+ - value: "disabled"
+ description: "Disabled"
+ - value: ""
+ description: "No Encryption/TLS/Certificates"
+ - value: "selfsigned"
+ description: "Self-Signed Certificate"
+ - value: "ixcert"
+ description: "TrueNAS SCALE Certificate"
+ - variable: type
+ label: "Reverse Proxy Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: true
+ editable: false
+ required: true
+ - variable: serviceName
+ label: "Service name to proxy to"
+ schema:
+ hidden: true
+ editable: false
+ type: string
+ default: ""
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: "websecure"
+ required: true
+ enum:
+ - value: "websecure"
+ description: "Websecure: HTTPS/TLS port 443"
+ - variable: hosts
+ label: "Hosts"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: list
+ default: []
+ items:
+ - variable: host
+ label: "Host"
+ schema:
+ type: dict
+ attrs:
+ - variable: host
+ label: "Domain Name"
+ required: true
+ schema:
+ type: string
+ - variable: path
+ label: "path"
+ schema:
+ type: string
+ required: true
+ hidden: true
+ default: "/"
+ - variable: certificate
+ label: "Select TrueNAS SCALE Certificate"
+ schema:
+ type: int
+ show_if: [["certType", "=", "ixcert"]]
+ $ref:
+ - "definitions/certificate"
+ - variable: authForwardURL
+ label: "Forward Authentication URL"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: ""
+
+ - variable: UMASK
+ group: "Advanced"
+ label: "UMASK"
+ description: "Sets the UMASK env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: string
+ default: "002"
+ # Enable privileged
+ - variable: securityContext
+ group: "Advanced"
+ label: "Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: privileged
+ label: "Enable privileged mode for Common-Chart based charts"
+ schema:
+ type: boolean
+ default: false
+ # Set Pod Security Policy
+ - variable: podSecurityContext
+ group: "Advanced"
+ label: "Pod Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: runAsNonRoot
+ label: "runAsNonRoot"
+ schema:
+ type: boolean
+ default: true
+ - variable: runAsUser
+ label: "runAsUser"
+ description: "The UserID of the user running the application"
+ schema:
+ type: int
+ default: 568
+ - variable: runAsGroup
+ label: "runAsGroup"
+ description: The groupID this App of the user running the application"
+ schema:
+ type: int
+ default: 568
+ - variable: supplementalGroups
+ label: "supplementalGroups"
+ description: "Additional groups this App needs access to"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: Group
+ label: "Group"
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroup
+ label: "fsGroup"
+ description: "The group that should own ALL storage."
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroupChangePolicy
+ label: "When should we take ownership?"
+ schema:
+ type: string
+ default: "OnRootMismatch"
+ enum:
+ - value: "OnRootMismatch"
+ description: "OnRootMismatch"
+ - value: "Always"
+ description: "Always"
diff --git a/scale-catalog-template/test/bazarr/3.1.5/templates/common.yaml b/scale-catalog-template/test/bazarr/3.1.5/templates/common.yaml
new file mode 100644
index 00000000..a6613c2c
--- /dev/null
+++ b/scale-catalog-template/test/bazarr/3.1.5/templates/common.yaml
@@ -0,0 +1 @@
+{{ include "common.all" . }}
diff --git a/scale-catalog-template/test/bazarr/3.1.5/test_values.yaml b/scale-catalog-template/test/bazarr/3.1.5/test_values.yaml
new file mode 100644
index 00000000..6994e190
--- /dev/null
+++ b/scale-catalog-template/test/bazarr/3.1.5/test_values.yaml
@@ -0,0 +1,28 @@
+# Default values for Bazarr.
+
+image:
+ repository: ghcr.io/truecharts/bazarr
+ pullPolicy: IfNotPresent
+ tag: v0.9.3-beta.9
+
+strategy:
+ type: Recreate
+
+services:
+ main:
+ port:
+ port: 6767
+
+env: {}
+ # TZ: UTC
+ # PUID: 1001
+ # PGID: 1001
+
+persistence:
+ config:
+ enabled: true
+ mountPath: "/config"
+ emptyDir: true
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ storageClass: ""
diff --git a/scale-catalog-template/test/bazarr/3.1.5/values.yaml b/scale-catalog-template/test/bazarr/3.1.5/values.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/scale-catalog-template/test/bazarr/item.yaml b/scale-catalog-template/test/bazarr/item.yaml
new file mode 100644
index 00000000..06f251b3
--- /dev/null
+++ b/scale-catalog-template/test/bazarr/item.yaml
@@ -0,0 +1,3 @@
+categories:
+ - media
+icon_url: https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/bazarr.png
diff --git a/scale-catalog-template/test/calibre-web/3.1.5/CONFIG.md b/scale-catalog-template/test/calibre-web/3.1.5/CONFIG.md
new file mode 100644
index 00000000..6d760c18
--- /dev/null
+++ b/scale-catalog-template/test/calibre-web/3.1.5/CONFIG.md
@@ -0,0 +1,8 @@
+# Configuration Options
+
+##### Connecting to other apps
+If you need to connect this App to other Apps on TrueNAS SCALE, please refer to our "Linking Apps Together" guide:
+https://truecharts.org/manual/linking/
+
+##### Available config options
+In the future this page is going to contain an automated list of options available in the installation/edit UI.
diff --git a/scale-catalog-template/test/calibre-web/3.1.5/Chart.lock b/scale-catalog-template/test/calibre-web/3.1.5/Chart.lock
new file mode 100644
index 00000000..dcf93a0d
--- /dev/null
+++ b/scale-catalog-template/test/calibre-web/3.1.5/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+digest: sha256:ea66c36be2fa73e56bc33f7e89af9ce338cdfbed0b347484888e87228b825015
+generated: "2021-05-06T13:29:47.41843612Z"
diff --git a/scale-catalog-template/test/calibre-web/3.1.5/Chart.yaml b/scale-catalog-template/test/calibre-web/3.1.5/Chart.yaml
new file mode 100644
index 00000000..aa7b65d1
--- /dev/null
+++ b/scale-catalog-template/test/calibre-web/3.1.5/Chart.yaml
@@ -0,0 +1,30 @@
+apiVersion: v2
+kubeVersion: ">=1.16.0-0"
+name: calibre-web
+version: 3.1.5
+upstream_version: 4.3.1
+appVersion: "auto"
+description: Calibre-Web is a web app providing a clean interface for browsing, reading and downloading eBooks using an existing Calibre database.
+type: application
+deprecated: false
+home: https://github.com/truecharts/apps/tree/master/incubator/calibre-web
+icon: https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/calibre-web-icon.png
+keywords:
+ - calibre-web
+ - calibre
+ - ebook
+sources:
+ - https://github.com/truecharts/apps/tree/master/incubator/calibre-web
+ - https://github.com/k8s-at-home/charts/tree/master/charts/calibre-web
+ - https://hub.docker.com/r/linuxserver/calibre-web/
+ - https://github.com/janeczku/calibre-web
+dependencies:
+ - name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+ # condition:
+maintainers:
+ - name: TrueCharts
+ email: info@truecharts.org
+ url: truecharts.org
+# annotations:
diff --git a/scale-catalog-template/test/calibre-web/3.1.5/README.md b/scale-catalog-template/test/calibre-web/3.1.5/README.md
new file mode 100644
index 00000000..f0442d6f
--- /dev/null
+++ b/scale-catalog-template/test/calibre-web/3.1.5/README.md
@@ -0,0 +1,56 @@
+# Introduction
+
+![Version: 3.1.5](https://img.shields.io/badge/Version-3.1.5-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: auto](https://img.shields.io/badge/AppVersion-auto-informational?style=flat-square)
+
+Calibre-Web is a web app providing a clean interface for browsing, reading and downloading eBooks using an existing Calibre database.
+
+TrueCharts are designed to be installed as TrueNAS SCALE app only. We can not guarantee this charts works as a stand-alone helm installation.
+**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/apps/issues/new/choose)**
+
+## Source Code
+
+*
+*
+*
+*
+
+## Requirements
+
+Kubernetes: `>=1.16.0-0`
+
+## Dependencies
+
+| Repository | Name | Version |
+|------------|------|---------|
+| https://truecharts.org/ | common | 3.5.5 |
+
+## Installing the Chart
+
+To install the chart with the release name `calibre-web`
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Click "Install" for this specific Apps
+- Fill out the configuration form
+
+## Uninstalling the Chart
+
+To uninstall the `calibre-web` deployment
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Go to "Installed Apps"
+- Expand the menu in the top-right corner of this App
+- Click "Remove" for this specific Apps
+
+The command removes all the Kubernetes components associated with the chart **including storage volumes** _(Except hostPath Storage)_ and deletes the release.
+
+## Support
+
+- See the [Wiki](https://truecharts.org)
+- Open a [issue](https://github.com/truecharts/apps/issues/new/choose)
+- Ask a [question](https://github.com/truecharts/apps/discussions)
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
+All Rights Reserved - The TrueCharts Project
diff --git a/scale-catalog-template/test/calibre-web/3.1.5/app-readme.md b/scale-catalog-template/test/calibre-web/3.1.5/app-readme.md
new file mode 100644
index 00000000..6c20a1a3
--- /dev/null
+++ b/scale-catalog-template/test/calibre-web/3.1.5/app-readme.md
@@ -0,0 +1,3 @@
+Calibre-Web is a web app providing a clean interface for browsing, reading and downloading eBooks using an existing Calibre database.
+This App is supplied by TrueCharts, for more information please visit https://truecharts.org
+Calibre-Web is a web app providing a clean interface for browsing, reading and downloading eBooks using an existing Calibre database.
diff --git a/scale-catalog-template/test/calibre-web/3.1.5/charts/common-3.5.5.tgz b/scale-catalog-template/test/calibre-web/3.1.5/charts/common-3.5.5.tgz
new file mode 100644
index 00000000..d01688bb
Binary files /dev/null and b/scale-catalog-template/test/calibre-web/3.1.5/charts/common-3.5.5.tgz differ
diff --git a/scale-catalog-template/test/calibre-web/3.1.5/ix_values.yaml b/scale-catalog-template/test/calibre-web/3.1.5/ix_values.yaml
new file mode 100644
index 00000000..5e42c4a5
--- /dev/null
+++ b/scale-catalog-template/test/calibre-web/3.1.5/ix_values.yaml
@@ -0,0 +1,16 @@
+##
+# This file contains Values.yaml content that gets added to the output of questions.yaml
+# It's ONLY meant for content that the user is NOT expected to change.
+# Example: Everything under "image" is not included in questions.yaml but is included here.
+##
+
+image:
+ repository: linuxserver/calibre-web
+ pullPolicy: IfNotPresent
+ tag: version-0.6.11
+
+
+##
+# Most other defaults are set in questions.yaml
+# For other options please refer to the wiki, default_values.yaml or the common library chart
+##
diff --git a/scale-catalog-template/test/calibre-web/3.1.5/questions.yaml b/scale-catalog-template/test/calibre-web/3.1.5/questions.yaml
new file mode 100644
index 00000000..9039761f
--- /dev/null
+++ b/scale-catalog-template/test/calibre-web/3.1.5/questions.yaml
@@ -0,0 +1,449 @@
+groups:
+ - name: "Container Image"
+ description: "Image to be used for container"
+ - name: "Workload Configuration"
+ description: "Configure workload deployment"
+ - name: "Configuration"
+ description: "additional container configuration"
+ - name: "Networking"
+ description: "Configure / service for container"
+ - name: "Storage"
+ description: "Persist and share data that is separate from the lifecycle of the container"
+ - name: "Resources and Devices"
+ description: "Specify resources/devices to be allocated to workload"
+ - name: "Reverse Proxy Configuration"
+ description: "Reverse Proxy configuration"
+ - name: "Advanced"
+ description: "Advanced Configuration"
+ - name: "WARNING"
+ description: "WARNING"
+portals:
+ web_portal:
+ protocols:
+ - "$kubernetes-resource_configmap_portal_protocol"
+ host:
+ - "$kubernetes-resource_configmap_portal_host"
+ ports:
+ - "$kubernetes-resource_configmap_portal_port"
+questions:
+ - variable: portal
+ group: "Container Image"
+ label: "Configure Portal Button"
+ schema:
+ type: dict
+ hidden: true
+ attrs:
+ - variable: enabled
+ label: "Enable"
+ description: "enable the portal button"
+ schema:
+ hidden: true
+ editable: false
+ type: boolean
+ default: true
+ # Update Policy
+ - variable: strategyType
+ group: "Container Image"
+ label: "Update Strategy"
+ schema:
+ type: string
+ default: "Recreate"
+ enum:
+ - value: "RollingUpdate"
+ description: "Create new pods and then kill old ones"
+ - value: "Recreate"
+ description: "Kill existing pods before creating new ones"
+ # Configure Time Zone
+ - variable: timezone
+ group: "Container Image"
+ label: "Timezone"
+ schema:
+ type: string
+ default: "Etc/UTC"
+ $ref:
+ - "definitions/timezone"
+
+ # Configure Enviroment Variables
+ - variable: environmentVariables
+ label: "Image environment"
+ group: "Configuration"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: environmentVariable
+ label: "Environment Variable"
+ schema:
+ type: dict
+ attrs:
+ - variable: name
+ label: "Name"
+ schema:
+ type: string
+ - variable: value
+ label: "Value"
+ schema:
+ type: string
+ # Enable Host Networking
+ - variable: hostNetwork
+ group: "Networking"
+ label: "Enable Host Networking"
+ schema:
+ type: boolean
+ default: false
+ - variable: services
+ group: "Networking"
+ label: "Configure Service"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "Main service"
+ description: "The Primary service on which the healthcheck runs, often the webUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: false
+ enum:
+ - value: HTTP
+ description: "HTTP"
+ - value: "HTTPS"
+ description: "HTTPS"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 8083
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 8083
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36015
+ required: true
+## TrueCharts Specific
+ - variable: persistence
+ label: "Integrated Persistent Storage"
+ description: "Websocket Service"
+ group: "Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: config
+ label: "App Config Storage"
+ description: "Stores the Application Configuration."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: "/config"
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "100Gi"
+ - variable: customStorage
+ label: "Custom app storage"
+ group: "Storage"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: volumeMount
+ label: "Custom Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enabled"
+ schema:
+ type: boolean
+ default: true
+ required: true
+ hidden: true
+ editable: false
+ - variable: setPermissions
+ label: "Automatic Permissions"
+ description: "Automatically set permissions on install"
+ schema:
+ type: boolean
+ default: true
+ hidden: false
+ - variable: readOnly
+ label: "Mount as ReadOnly"
+ description: "prevent any write from being done to the mounted volume"
+ schema:
+ type: boolean
+ default: false
+ hidden: false
+ - variable: emptyDir
+ label: "emptyDir"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ editable: false
+ - variable: mountPath
+ label: "Mount Path"
+ description: "Path to mount inside the pod"
+ schema:
+ type: path
+ required: true
+ default: ""
+ editable: true
+ - variable: hostPath
+ label: "Host Path"
+ schema:
+ type: hostpath
+ required: true
+ - variable: ingress
+ label: ""
+ group: "Reverse Proxy Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "WebUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: certType
+ label: "Select Reverse-Proxy Type"
+ schema:
+ type: string
+ default: "disabled"
+ enum:
+ - value: "disabled"
+ description: "Disabled"
+ - value: ""
+ description: "No Encryption/TLS/Certificates"
+ - value: "selfsigned"
+ description: "Self-Signed Certificate"
+ - value: "ixcert"
+ description: "TrueNAS SCALE Certificate"
+ - variable: type
+ label: "Reverse Proxy Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: true
+ editable: false
+ required: true
+ - variable: serviceName
+ label: "Service name to proxy to"
+ schema:
+ hidden: true
+ editable: false
+ type: string
+ default: ""
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: "websecure"
+ required: true
+ enum:
+ - value: "websecure"
+ description: "Websecure: HTTPS/TLS port 443"
+ - variable: hosts
+ label: "Hosts"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: list
+ default: []
+ items:
+ - variable: host
+ label: "Host"
+ schema:
+ type: dict
+ attrs:
+ - variable: host
+ label: "Domain Name"
+ required: true
+ schema:
+ type: string
+ - variable: path
+ label: "path"
+ schema:
+ type: string
+ required: true
+ hidden: true
+ default: "/"
+ - variable: certificate
+ label: "Select TrueNAS SCALE Certificate"
+ schema:
+ type: int
+ show_if: [["certType", "=", "ixcert"]]
+ $ref:
+ - "definitions/certificate"
+ - variable: authForwardURL
+ label: "Forward Authentication URL"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: ""
+ - variable: PUID
+ group: "Advanced"
+ label: "PUID"
+ description: "Sets the PUID env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: int
+ default: 568
+
+ - variable: PGID
+ group: "Advanced"
+ label: "PGID"
+ description: "Sets the PGID env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: int
+ default: 568
+ - variable: UMASK
+ group: "Advanced"
+ label: "UMASK"
+ description: "Sets the UMASK env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: string
+ default: "002"
+ # Enable privileged
+ - variable: securityContext
+ group: "Advanced"
+ label: "Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: privileged
+ label: "Enable privileged mode for Common-Chart based charts"
+ schema:
+ type: boolean
+ default: false
+ # Set Pod Security Policy
+ - variable: podSecurityContext
+ group: "Advanced"
+ label: "Pod Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: runAsNonRoot
+ label: "runAsNonRoot"
+ schema:
+ type: boolean
+ default: false
+ - variable: runAsUser
+ label: "runAsUser"
+ description: "The UserID of the user running the application"
+ schema:
+ type: int
+ default: 0
+ - variable: runAsGroup
+ label: "runAsGroup"
+ description: The groupID this App of the user running the application"
+ schema:
+ type: int
+ default: 0
+ - variable: supplementalGroups
+ label: "supplementalGroups"
+ description: "Additional groups this App needs access to"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: Group
+ label: "Group"
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroup
+ label: "fsGroup"
+ description: "The group that should own ALL storage."
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroupChangePolicy
+ label: "When should we take ownership?"
+ schema:
+ type: string
+ default: "OnRootMismatch"
+ enum:
+ - value: "OnRootMismatch"
+ description: "OnRootMismatch"
+ - value: "Always"
+ description: "Always"
diff --git a/scale-catalog-template/test/calibre-web/3.1.5/templates/common.yaml b/scale-catalog-template/test/calibre-web/3.1.5/templates/common.yaml
new file mode 100644
index 00000000..a6613c2c
--- /dev/null
+++ b/scale-catalog-template/test/calibre-web/3.1.5/templates/common.yaml
@@ -0,0 +1 @@
+{{ include "common.all" . }}
diff --git a/scale-catalog-template/test/calibre-web/3.1.5/test_values.yaml b/scale-catalog-template/test/calibre-web/3.1.5/test_values.yaml
new file mode 100644
index 00000000..5e2636af
--- /dev/null
+++ b/scale-catalog-template/test/calibre-web/3.1.5/test_values.yaml
@@ -0,0 +1,37 @@
+# Default values for Calibre-Web.
+
+image:
+ repository: linuxserver/calibre-web
+ pullPolicy: IfNotPresent
+ tag: version-0.6.11
+
+strategy:
+ type: Recreate
+
+# Configure the Security Context for the Pod
+podSecurityContext:
+ runAsNonRoot: false
+ runAsUser: 0
+ runAsGroup: 0
+ fsGroup: 0
+
+services:
+ main:
+ port:
+ port: 8083
+
+env: {}
+ # TZ:
+ # PUID:
+ # PGID:
+ # UMASK:
+ # DOCKER_MODS:
+
+persistence:
+ config:
+ enabled: true
+ mountPath: "/config"
+ emptyDir: true
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ storageClass: ""
diff --git a/scale-catalog-template/test/calibre-web/3.1.5/values.yaml b/scale-catalog-template/test/calibre-web/3.1.5/values.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/scale-catalog-template/test/calibre-web/item.yaml b/scale-catalog-template/test/calibre-web/item.yaml
new file mode 100644
index 00000000..73a1a5a7
--- /dev/null
+++ b/scale-catalog-template/test/calibre-web/item.yaml
@@ -0,0 +1,3 @@
+categories:
+ - media
+icon_url: https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/calibre-web-icon.png
diff --git a/scale-catalog-template/test/deluge/3.1.5/CONFIG.md b/scale-catalog-template/test/deluge/3.1.5/CONFIG.md
new file mode 100644
index 00000000..6d760c18
--- /dev/null
+++ b/scale-catalog-template/test/deluge/3.1.5/CONFIG.md
@@ -0,0 +1,8 @@
+# Configuration Options
+
+##### Connecting to other apps
+If you need to connect this App to other Apps on TrueNAS SCALE, please refer to our "Linking Apps Together" guide:
+https://truecharts.org/manual/linking/
+
+##### Available config options
+In the future this page is going to contain an automated list of options available in the installation/edit UI.
diff --git a/scale-catalog-template/test/deluge/3.1.5/Chart.lock b/scale-catalog-template/test/deluge/3.1.5/Chart.lock
new file mode 100644
index 00000000..319c29a1
--- /dev/null
+++ b/scale-catalog-template/test/deluge/3.1.5/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+digest: sha256:ea66c36be2fa73e56bc33f7e89af9ce338cdfbed0b347484888e87228b825015
+generated: "2021-05-06T13:29:47.885553069Z"
diff --git a/scale-catalog-template/test/deluge/3.1.5/Chart.yaml b/scale-catalog-template/test/deluge/3.1.5/Chart.yaml
new file mode 100644
index 00000000..d2f93d61
--- /dev/null
+++ b/scale-catalog-template/test/deluge/3.1.5/Chart.yaml
@@ -0,0 +1,28 @@
+apiVersion: v2
+kubeVersion: ">=1.16.0-0"
+name: deluge
+version: 3.1.5
+# upstream_version:
+appVersion: "auto"
+description: Deluge App for TrueNAS SCALE
+type: application
+deprecated: false
+home: https://github.com/truecharts/apps/tree/master/incubator/deluge
+icon: https://avatars2.githubusercontent.com/u/6733935?v=3&s=200
+keywords:
+ - transmission
+ - torrent
+ - usenet
+sources:
+ - https://github.com/truecharts/apps/tree/master/incubator/deluge
+ - https://github.com/deluge-torrent/deluge
+dependencies:
+ - name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+ # condition:
+maintainers:
+ - name: TrueCharts
+ email: info@truecharts.org
+ url: truecharts.org
+# annotations:
diff --git a/scale-catalog-template/test/deluge/3.1.5/README.md b/scale-catalog-template/test/deluge/3.1.5/README.md
new file mode 100644
index 00000000..bfcbb4e5
--- /dev/null
+++ b/scale-catalog-template/test/deluge/3.1.5/README.md
@@ -0,0 +1,54 @@
+# Introduction
+
+![Version: 3.1.5](https://img.shields.io/badge/Version-3.1.5-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: auto](https://img.shields.io/badge/AppVersion-auto-informational?style=flat-square)
+
+Deluge App for TrueNAS SCALE
+
+TrueCharts are designed to be installed as TrueNAS SCALE app only. We can not guarantee this charts works as a stand-alone helm installation.
+**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/apps/issues/new/choose)**
+
+## Source Code
+
+*
+*
+
+## Requirements
+
+Kubernetes: `>=1.16.0-0`
+
+## Dependencies
+
+| Repository | Name | Version |
+|------------|------|---------|
+| https://truecharts.org/ | common | 3.5.5 |
+
+## Installing the Chart
+
+To install the chart with the release name `deluge`
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Click "Install" for this specific Apps
+- Fill out the configuration form
+
+## Uninstalling the Chart
+
+To uninstall the `deluge` deployment
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Go to "Installed Apps"
+- Expand the menu in the top-right corner of this App
+- Click "Remove" for this specific Apps
+
+The command removes all the Kubernetes components associated with the chart **including storage volumes** _(Except hostPath Storage)_ and deletes the release.
+
+## Support
+
+- See the [Wiki](https://truecharts.org)
+- Open a [issue](https://github.com/truecharts/apps/issues/new/choose)
+- Ask a [question](https://github.com/truecharts/apps/discussions)
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
+All Rights Reserved - The TrueCharts Project
diff --git a/scale-catalog-template/test/deluge/3.1.5/app-readme.md b/scale-catalog-template/test/deluge/3.1.5/app-readme.md
new file mode 100644
index 00000000..0bce0f81
--- /dev/null
+++ b/scale-catalog-template/test/deluge/3.1.5/app-readme.md
@@ -0,0 +1,3 @@
+Deluge App for TrueNAS SCALE
+This App is supplied by TrueCharts, for more information please visit https://truecharts.org
+Deluge App for TrueNAS SCALE
diff --git a/scale-catalog-template/test/deluge/3.1.5/charts/common-3.5.5.tgz b/scale-catalog-template/test/deluge/3.1.5/charts/common-3.5.5.tgz
new file mode 100644
index 00000000..d01688bb
Binary files /dev/null and b/scale-catalog-template/test/deluge/3.1.5/charts/common-3.5.5.tgz differ
diff --git a/scale-catalog-template/test/deluge/3.1.5/ix_values.yaml b/scale-catalog-template/test/deluge/3.1.5/ix_values.yaml
new file mode 100644
index 00000000..14051dce
--- /dev/null
+++ b/scale-catalog-template/test/deluge/3.1.5/ix_values.yaml
@@ -0,0 +1,16 @@
+##
+# This file contains Values.yaml content that gets added to the output of questions.yaml
+# It's ONLY meant for content that the user is NOT expected to change.
+# Example: Everything under "image" is not included in questions.yaml but is included here.
+##
+
+image:
+ repository: linuxserver/deluge
+ pullPolicy: IfNotPresent
+ tag: version-2.0.3-2201906121747ubuntu18.04.1
+
+
+##
+# Most other defaults are set in questions.yaml
+# For other options please refer to the wiki, default_values.yaml or the common library chart
+##
diff --git a/scale-catalog-template/test/deluge/3.1.5/questions.yaml b/scale-catalog-template/test/deluge/3.1.5/questions.yaml
new file mode 100644
index 00000000..d4db5c6e
--- /dev/null
+++ b/scale-catalog-template/test/deluge/3.1.5/questions.yaml
@@ -0,0 +1,571 @@
+groups:
+ - name: "Container Image"
+ description: "Image to be used for container"
+ - name: "Workload Configuration"
+ description: "Configure workload deployment"
+ - name: "Configuration"
+ description: "additional container configuration"
+ - name: "Networking"
+ description: "Configure / service for container"
+ - name: "Storage"
+ description: "Persist and share data that is separate from the lifecycle of the container"
+ - name: "Resources and Devices"
+ description: "Specify resources/devices to be allocated to workload"
+ - name: "Reverse Proxy Configuration"
+ description: "Reverse Proxy configuration"
+ - name: "Advanced"
+ description: "Advanced Configuration"
+portals:
+ web_portal:
+ protocols:
+ - "$kubernetes-resource_configmap_portal_protocol"
+ host:
+ - "$kubernetes-resource_configmap_portal_host"
+ ports:
+ - "$kubernetes-resource_configmap_portal_port"
+questions:
+## Portal Button
+ - variable: portal
+ group: "Container Image"
+ label: "Configure Portal Button"
+ schema:
+ type: dict
+ hidden: true
+ attrs:
+ - variable: enabled
+ label: "Enable"
+ description: "enable the portal button"
+ schema:
+ hidden: true
+ editable: false
+ type: boolean
+ default: true
+## Update Policy
+ - variable: strategyType
+ group: "Container Image"
+ label: "Update Strategy"
+ schema:
+ type: string
+ default: "Recreate"
+ enum:
+ - value: "RollingUpdate"
+ description: "Create new pods and then kill old ones"
+ - value: "Recreate"
+ description: "Kill existing pods before creating new ones"
+## Configure Time Zone
+ - variable: timezone
+ group: "Container Image"
+ label: "Timezone"
+ schema:
+ type: string
+ default: "Australia/Hobart"
+ $ref:
+ - "definitions/timezone"
+
+## Configure Enviroment Variables
+ - variable: environmentVariables
+ label: "Image environment"
+ group: "Configuration"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: environmentVariable
+ label: "Environment Variable"
+ schema:
+ type: dict
+ attrs:
+ - variable: name
+ label: "Name"
+ schema:
+ type: string
+ - variable: value
+ label: "Value"
+ schema:
+ type: string
+## Enable Host Network
+ - variable: hostNetwork
+ group: "Networking"
+ label: "Enable Host Network"
+ schema:
+ type: boolean
+ default: false
+ - variable: persistence
+ label: "Integrated Persistent Storage"
+ description: "Websocket Service"
+ group: "Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: config
+ label: "App Config Storage"
+ description: "Stores the Application Configuration."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: "/config"
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "100Gi"
+ - variable: customStorage
+ label: "Custom app storage"
+ group: "Storage"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: volumeMount
+ label: "Custom Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enabled"
+ schema:
+ type: boolean
+ default: true
+ required: true
+ hidden: true
+ editable: false
+ - variable: setPermissions
+ label: "Automatic Permissions"
+ description: "Automatically set permissions on install"
+ schema:
+ type: boolean
+ default: true
+ hidden: false
+ - variable: readOnly
+ label: "Mount as ReadOnly"
+ description: "prevent any write from being done to the mounted volume"
+ schema:
+ type: boolean
+ default: false
+ hidden: false
+ - variable: emptyDir
+ label: "emptyDir"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ editable: false
+ - variable: mountPath
+ label: "Mount Path"
+ description: "Path to mount inside the pod"
+ schema:
+ type: path
+ required: true
+ default: ""
+ editable: true
+ - variable: hostPath
+ label: "Host Path"
+ schema:
+ type: hostpath
+ required: true
+ - variable: services
+ group: "Networking"
+ label: "Configure Service"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "Main service"
+ description: "The Primary service on which the healthcheck runs, often the webUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: false
+ enum:
+ - value: HTTP
+ description: "HTTP"
+ - value: "HTTPS"
+ description: "HTTPS"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 8112
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 8112
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36026
+ required: true
+ - variable: tcp
+ label: ""
+ description: "TCP port for Torrent Connections"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable TCP port for Torrent Connections"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: name
+ label: "port name"
+ schema:
+ type: string
+ default: "torrent-tcp"
+ hidden: true
+ - variable: protocol
+ label: "Protocol"
+ schema:
+ type: string
+ default: "TCP"
+ hidden: true
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 51413
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "container targetport"
+ schema:
+ type: int
+ default: 51413
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "Node Port to expose"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 51413
+ required: false
+ - variable: udp
+ label: ""
+ description: "UDP port for Torrent Connections"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable UDP port for Torrent Connections"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: name
+ label: "port name"
+ schema:
+ type: string
+ default: "torrent-udp"
+ hidden: true
+ - variable: protocol
+ label: "Protocol"
+ schema:
+ type: string
+ default: "UDP"
+ hidden: true
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 51413
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "container targetport"
+ schema:
+ type: int
+ default: 51413
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "Node Port to expose"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 51413
+ required: false
+
+## Ingres
+ - variable: ingress
+ label: ""
+ group: "Reverse Proxy Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "WebUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: certType
+ label: "Select Reverse-Proxy Type"
+ schema:
+ type: string
+ default: "disabled"
+ enum:
+ - value: "disabled"
+ description: "Disabled"
+ - value: ""
+ description: "No Encryption/TLS/Certificates"
+ - value: "selfsigned"
+ description: "Self-Signed Certificate"
+ - value: "ixcert"
+ description: "TrueNAS SCALE Certificate"
+ - variable: type
+ label: "Reverse Proxy Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: true
+ editable: false
+ required: true
+ - variable: serviceName
+ label: "Service name to proxy to"
+ schema:
+ hidden: true
+ editable: false
+ type: string
+ default: ""
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: "websecure"
+ required: true
+ enum:
+ - value: "websecure"
+ description: "Websecure: HTTPS/TLS port 443"
+ - variable: hosts
+ label: "Hosts"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: list
+ default: []
+ items:
+ - variable: host
+ label: "Host"
+ schema:
+ type: dict
+ attrs:
+ - variable: host
+ label: "Domain Name"
+ required: true
+ schema:
+ type: string
+ - variable: path
+ label: "path"
+ schema:
+ type: string
+ required: true
+ hidden: true
+ default: "/"
+ - variable: certificate
+ label: "Select TrueNAS SCALE Certificate"
+ schema:
+ type: int
+ show_if: [["certType", "=", "ixcert"]]
+ $ref:
+ - "definitions/certificate"
+ - variable: authForwardURL
+ label: "Forward Authentication URL"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: ""
+ - variable: PUID
+ group: "Advanced"
+ label: "PUID"
+ description: "Sets the PUID env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: int
+ default: 568
+
+ - variable: PGID
+ group: "Advanced"
+ label: "PGID"
+ description: "Sets the PGID env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: int
+ default: 568
+ - variable: UMASK
+ group: "Advanced"
+ label: "UMASK"
+ description: "Sets the UMASK env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: string
+ default: "002"
+ # Enable privileged
+ - variable: securityContext
+ group: "Advanced"
+ label: "Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: privileged
+ label: "Enable privileged mode for Common-Chart based charts"
+ schema:
+ type: boolean
+ default: false
+ # Set Pod Security Policy
+ - variable: podSecurityContext
+ group: "Advanced"
+ label: "Pod Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: runAsNonRoot
+ label: "runAsNonRoot"
+ schema:
+ type: boolean
+ default: false
+ - variable: runAsUser
+ label: "runAsUser"
+ description: "The UserID of the user running the application"
+ schema:
+ type: int
+ default: 0
+ - variable: runAsGroup
+ label: "runAsGroup"
+ description: The groupID this App of the user running the application"
+ schema:
+ type: int
+ default: 0
+ - variable: supplementalGroups
+ label: "supplementalGroups"
+ description: "Additional groups this App needs access to"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: Group
+ label: "Group"
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroup
+ label: "fsGroup"
+ description: "The group that should own ALL storage."
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroupChangePolicy
+ label: "When should we take ownership?"
+ schema:
+ type: string
+ default: "OnRootMismatch"
+ enum:
+ - value: "OnRootMismatch"
+ description: "OnRootMismatch"
+ - value: "Always"
+ description: "Always"
diff --git a/scale-catalog-template/test/deluge/3.1.5/templates/common.yaml b/scale-catalog-template/test/deluge/3.1.5/templates/common.yaml
new file mode 100644
index 00000000..a6613c2c
--- /dev/null
+++ b/scale-catalog-template/test/deluge/3.1.5/templates/common.yaml
@@ -0,0 +1 @@
+{{ include "common.all" . }}
diff --git a/scale-catalog-template/test/deluge/3.1.5/test_values.yaml b/scale-catalog-template/test/deluge/3.1.5/test_values.yaml
new file mode 100644
index 00000000..127213f2
--- /dev/null
+++ b/scale-catalog-template/test/deluge/3.1.5/test_values.yaml
@@ -0,0 +1,44 @@
+# Default values for deluge.
+
+image:
+ repository: linuxserver/deluge
+ pullPolicy: IfNotPresent
+ tag: version-2.0.3-2201906121747ubuntu18.04.1
+
+strategy:
+ type: Recreate
+
+# Configure the Security Context for the Pod
+podSecurityContext:
+ runAsNonRoot: false
+ runAsUser: 0
+ runAsGroup: 0
+ fsGroup: 0
+
+services:
+ main:
+ port:
+ port: 8112
+ tcp:
+ enabled: true
+ type: ClusterIP
+ port:
+ port: 51413
+ protocol: TCP
+ targetPort: 51413
+ udp:
+ enabled: true
+ type: ClusterIP
+ port:
+ port: 51413
+ protocol: UDP
+ targetPort: 51413
+
+persistence:
+ config:
+ enabled: true
+ mountPath: "/config"
+ emptyDir: true
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ storageClass: ""
diff --git a/scale-catalog-template/test/deluge/3.1.5/values.yaml b/scale-catalog-template/test/deluge/3.1.5/values.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/scale-catalog-template/test/deluge/item.yaml b/scale-catalog-template/test/deluge/item.yaml
new file mode 100644
index 00000000..0a1a793e
--- /dev/null
+++ b/scale-catalog-template/test/deluge/item.yaml
@@ -0,0 +1,3 @@
+categories:
+ - media
+icon_url: https://avatars2.githubusercontent.com/u/6733935?v=3&s=200
diff --git a/scale-catalog-template/test/fireflyiii/1.0.1/CONFIG.md b/scale-catalog-template/test/fireflyiii/1.0.1/CONFIG.md
new file mode 100644
index 00000000..6d760c18
--- /dev/null
+++ b/scale-catalog-template/test/fireflyiii/1.0.1/CONFIG.md
@@ -0,0 +1,8 @@
+# Configuration Options
+
+##### Connecting to other apps
+If you need to connect this App to other Apps on TrueNAS SCALE, please refer to our "Linking Apps Together" guide:
+https://truecharts.org/manual/linking/
+
+##### Available config options
+In the future this page is going to contain an automated list of options available in the installation/edit UI.
diff --git a/scale-catalog-template/test/fireflyiii/1.0.1/Chart.lock b/scale-catalog-template/test/fireflyiii/1.0.1/Chart.lock
new file mode 100644
index 00000000..49f381fc
--- /dev/null
+++ b/scale-catalog-template/test/fireflyiii/1.0.1/Chart.lock
@@ -0,0 +1,9 @@
+dependencies:
+- name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+- name: postgresql
+ repository: https://charts.bitnami.com/bitnami
+ version: 10.4.2
+digest: sha256:feb1c5155f10c340b5a984ce39eb7c532c938ac71287bfa65398ef3fe458c902
+generated: "2021-05-06T13:29:51.104635038Z"
diff --git a/scale-catalog-template/test/fireflyiii/1.0.1/Chart.yaml b/scale-catalog-template/test/fireflyiii/1.0.1/Chart.yaml
new file mode 100644
index 00000000..9ece33f5
--- /dev/null
+++ b/scale-catalog-template/test/fireflyiii/1.0.1/Chart.yaml
@@ -0,0 +1,30 @@
+apiVersion: v2
+kubeVersion: ">=1.16.0-0"
+name: fireflyiii
+version: 1.0.1
+appVersion: "auto"
+description: A free and open source personal finance manager
+type: application
+deprecated: false
+home: https://github.com/firefly-iii/firefly-iii/
+icon: https://www.firefly-iii.org/assets/logo/color.png
+keywords:
+ - fireflyiii
+ - finacial
+sources:
+ - https://github.com/firefly-iii/firefly-iii/
+dependencies:
+ - name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+ - name: postgresql
+ version: 10.4.2
+ repository: https://charts.bitnami.com/bitnami
+ condition: postgresql.enabled
+maintainers:
+ - name: TrueCharts
+ email: info@truecharts.org
+ url: truecharts.org
+ - name: warllo54
+ email: 20650065+warllo54@users.noreply.github.com
+ url: truecharts.org
diff --git a/scale-catalog-template/test/fireflyiii/1.0.1/README.md b/scale-catalog-template/test/fireflyiii/1.0.1/README.md
new file mode 100644
index 00000000..8e87f22a
--- /dev/null
+++ b/scale-catalog-template/test/fireflyiii/1.0.1/README.md
@@ -0,0 +1,54 @@
+# Introduction
+
+![Version: 1.0.1](https://img.shields.io/badge/Version-1.0.1-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: auto](https://img.shields.io/badge/AppVersion-auto-informational?style=flat-square)
+
+A free and open source personal finance manager
+
+TrueCharts are designed to be installed as TrueNAS SCALE app only. We can not guarantee this charts works as a stand-alone helm installation.
+**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/apps/issues/new/choose)**
+
+## Source Code
+
+*
+
+## Requirements
+
+Kubernetes: `>=1.16.0-0`
+
+## Dependencies
+
+| Repository | Name | Version |
+|------------|------|---------|
+| https://charts.bitnami.com/bitnami | postgresql | 10.4.2 |
+| https://truecharts.org/ | common | 3.5.5 |
+
+## Installing the Chart
+
+To install the chart with the release name `fireflyiii`
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Click "Install" for this specific Apps
+- Fill out the configuration form
+
+## Uninstalling the Chart
+
+To uninstall the `fireflyiii` deployment
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Go to "Installed Apps"
+- Expand the menu in the top-right corner of this App
+- Click "Remove" for this specific Apps
+
+The command removes all the Kubernetes components associated with the chart **including storage volumes** _(Except hostPath Storage)_ and deletes the release.
+
+## Support
+
+- See the [Wiki](https://truecharts.org)
+- Open a [issue](https://github.com/truecharts/apps/issues/new/choose)
+- Ask a [question](https://github.com/truecharts/apps/discussions)
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
+All Rights Reserved - The TrueCharts Project
diff --git a/scale-catalog-template/test/fireflyiii/1.0.1/app-readme.md b/scale-catalog-template/test/fireflyiii/1.0.1/app-readme.md
new file mode 100644
index 00000000..15307675
--- /dev/null
+++ b/scale-catalog-template/test/fireflyiii/1.0.1/app-readme.md
@@ -0,0 +1,3 @@
+A free and open source personal finance manager
+This App is supplied by TrueCharts, for more information please visit https://truecharts.org
+A free and open source personal finance manager
diff --git a/scale-catalog-template/test/fireflyiii/1.0.1/charts/common-3.5.5.tgz b/scale-catalog-template/test/fireflyiii/1.0.1/charts/common-3.5.5.tgz
new file mode 100644
index 00000000..d01688bb
Binary files /dev/null and b/scale-catalog-template/test/fireflyiii/1.0.1/charts/common-3.5.5.tgz differ
diff --git a/scale-catalog-template/test/fireflyiii/1.0.1/charts/postgresql-10.4.2.tgz b/scale-catalog-template/test/fireflyiii/1.0.1/charts/postgresql-10.4.2.tgz
new file mode 100644
index 00000000..1067fe42
Binary files /dev/null and b/scale-catalog-template/test/fireflyiii/1.0.1/charts/postgresql-10.4.2.tgz differ
diff --git a/scale-catalog-template/test/fireflyiii/1.0.1/ix_values.yaml b/scale-catalog-template/test/fireflyiii/1.0.1/ix_values.yaml
new file mode 100644
index 00000000..ee3a8213
--- /dev/null
+++ b/scale-catalog-template/test/fireflyiii/1.0.1/ix_values.yaml
@@ -0,0 +1,41 @@
+##
+# This file contains Values.yaml content that gets added to the output of questions.yaml
+# It's ONLY meant for content that the user is NOT expected to change.
+# Example: Everything under "image" is not included in questions.yaml but is included here.
+##
+
+image:
+ repository: jc5x/firefly-iii
+ pullPolicy: IfNotPresent
+ tag: latest
+
+env:
+ DB_USERNAME: fireflyiii
+ DB_DATABASE: fireflyiii
+ DB_CONNECTION: pgsql
+ DB_PORT: 5432
+
+envValueFrom:
+ DB_HOST:
+ secretKeyRef:
+ name: dbcreds
+ key: postgresql_host
+ DB_PASSWORD:
+ secretKeyRef:
+ name: dbcreds
+ key: postgresql-password
+
+# Enabled postgres
+# ... for more options see https://github.com/bitnami/charts/tree/master/bitnami/postgresql
+postgresql:
+ enabled: true
+ postgresqlUsername: fireflyiii
+ postgresqlDatabase: fireflyiii
+ existingSecret: dbcreds
+ persistence:
+ enabled: true
+ existingClaim: db
+##
+# Most other defaults are set in questions.yaml
+# For other options please refer to the wiki, default_values.yaml or the common library chart
+##
diff --git a/scale-catalog-template/test/fireflyiii/1.0.1/questions.yaml b/scale-catalog-template/test/fireflyiii/1.0.1/questions.yaml
new file mode 100644
index 00000000..f2ebe1aa
--- /dev/null
+++ b/scale-catalog-template/test/fireflyiii/1.0.1/questions.yaml
@@ -0,0 +1,562 @@
+groups:
+ - name: "Container Image"
+ description: "Image to be used for container"
+ - name: "Workload Configuration"
+ description: "Configure workload deployment"
+ - name: "Configuration"
+ description: "additional container configuration"
+ - name: "Networking"
+ description: "Configure / service for container"
+ - name: "Storage"
+ description: "Persist and share data that is separate from the lifecycle of the container"
+ - name: "Resources and Devices"
+ description: "Specify resources/devices to be allocated to workload"
+ - name: "Reverse Proxy Configuration"
+ description: "Reverse Proxy configuration"
+ - name: "Advanced"
+ description: "Advanced Configuration"
+ - name: "WARNING"
+ description: "WARNING"
+portals:
+ web_portal:
+ protocols:
+ - "$kubernetes-resource_configmap_portal_protocol"
+ host:
+ - "$kubernetes-resource_configmap_portal_host"
+ ports:
+ - "$kubernetes-resource_configmap_portal_port"
+questions:
+ - variable: portal
+ group: "Container Image"
+ label: "Configure Portal Button"
+ schema:
+ type: dict
+ hidden: true
+ attrs:
+ - variable: enabled
+ label: "Enable"
+ description: "enable the portal button"
+ schema:
+ hidden: true
+ editable: false
+ type: boolean
+ default: true
+ # Update Policy
+ - variable: strategyType
+ group: "Container Image"
+ label: "Update Strategy"
+ schema:
+ type: string
+ default: "Recreate"
+ enum:
+ - value: "RollingUpdate"
+ description: "Create new pods and then kill old ones"
+ - value: "Recreate"
+ description: "Kill existing pods before creating new ones"
+ # Configure Time Zone
+ - variable: timezone
+ group: "Container Image"
+ label: "Timezone"
+ schema:
+ type: string
+ default: "Etc/UTC"
+ $ref:
+ - "definitions/timezone"
+ # Configure Enviroment Variables
+ - variable: environmentVariables
+ label: "Image environment"
+ group: "Configuration"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: environmentVariable
+ label: "Environment Variable"
+ schema:
+ type: dict
+ attrs:
+ - variable: name
+ label: "Name"
+ schema:
+ type: string
+ - variable: value
+ label: "Value"
+ schema:
+ type: string
+
+ # Docker specific env
+ - variable: env
+ group: "Configuration"
+ label: "Image Environment"
+ schema:
+ type: dict
+ attrs:
+ - variable: APP_KEY
+ label: "App Key"
+ description: "Your unique 32 application character key"
+ schema:
+ type: string
+ default: ""
+ required: true
+
+ # Enable Host Networking
+ - variable: hostNetwork
+ group: "Networking"
+ label: "Enable Host Networking"
+ schema:
+ type: boolean
+ default: false
+ - variable: services
+ group: "Networking"
+ label: "Configure Service"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "Main service"
+ description: "The Primary service on which the healthcheck runs, often the webUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: false
+ enum:
+ - value: HTTP
+ description: "HTTP"
+ - value: "HTTPS"
+ description: "HTTPS"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 8080
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 51080
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36048
+ required: true
+
+## TrueCharts Specific
+ - variable: persistence
+ label: "Integrated Persistent Storage"
+ description: "Websocket Service"
+ group: "Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: data
+ label: "App Config Storage"
+ description: "Stores the Application Configuration."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: "/data"
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "100Gi"
+ - variable: db
+ label: "Database Storage"
+ description: "Stores the Application database."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: nameOverride
+ label: "Override PVC Name (advanced)"
+ description: "Forces a certain name for the PVC"
+ schema:
+ type: string
+ default: "db"
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: ""
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "100Gi"
+ - variable: dbbackup
+ label: "Database Backup Storage"
+ description: "Stores the Application database backups."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: ""
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "100Gi"
+ - variable: customStorage
+ label: "Custom app storage"
+ group: "Storage"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: volumeMount
+ label: "Custom Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enabled"
+ schema:
+ type: boolean
+ default: true
+ required: true
+ hidden: true
+ editable: false
+ - variable: setPermissions
+ label: "Automatic Permissions"
+ description: "Automatically set permissions on install"
+ schema:
+ type: boolean
+ default: true
+ hidden: false
+ - variable: readOnly
+ label: "Mount as ReadOnly"
+ description: "prevent any write from being done to the mounted volume"
+ schema:
+ type: boolean
+ default: false
+ hidden: false
+ - variable: emptyDir
+ label: "emptyDir"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ editable: false
+ - variable: mountPath
+ label: "Mount Path"
+ description: "Path to mount inside the pod"
+ schema:
+ type: path
+ required: true
+ default: ""
+ editable: true
+ - variable: hostPath
+ label: "Host Path"
+ schema:
+ type: hostpath
+ required: true
+ - variable: ingress
+ label: ""
+ group: "Reverse Proxy Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "WebUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: certType
+ label: "Select Reverse-Proxy Type"
+ schema:
+ type: string
+ default: "disabled"
+ enum:
+ - value: "disabled"
+ description: "Disabled"
+ - value: ""
+ description: "No Encryption/TLS/Certificates"
+ - value: "selfsigned"
+ description: "Self-Signed Certificate"
+ - value: "ixcert"
+ description: "TrueNAS SCALE Certificate"
+ - variable: type
+ label: "Reverse Proxy Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: true
+ editable: false
+ required: true
+ - variable: serviceName
+ label: "Service name to proxy to"
+ schema:
+ hidden: true
+ editable: false
+ type: string
+ default: ""
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: "websecure"
+ required: true
+ enum:
+ - value: "websecure"
+ description: "Websecure: HTTPS/TLS port 443"
+ - variable: hosts
+ label: "Hosts"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: list
+ default: []
+ items:
+ - variable: host
+ label: "Host"
+ schema:
+ type: dict
+ attrs:
+ - variable: host
+ label: "Domain Name"
+ required: true
+ schema:
+ type: string
+ - variable: path
+ label: "path"
+ schema:
+ type: string
+ required: true
+ hidden: true
+ default: "/"
+ - variable: certificate
+ label: "Select TrueNAS SCALE Certificate"
+ schema:
+ type: int
+ show_if: [["certType", "=", "ixcert"]]
+ $ref:
+ - "definitions/certificate"
+ - variable: authForwardURL
+ label: "Forward Authentication URL"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: ""
+
+ - variable: UMASK
+ group: "Advanced"
+ label: "UMASK"
+ description: "Sets the UMASK env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: string
+ default: "002"
+ # Enable privileged
+ - variable: securityContext
+ group: "Advanced"
+ label: "Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: privileged
+ label: "Enable privileged mode for Common-Chart based charts"
+ schema:
+ type: boolean
+ default: false
+ # Set Pod Security Policy
+ - variable: podSecurityContext
+ group: "Advanced"
+ label: "Pod Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: runAsNonRoot
+ label: "runAsNonRoot"
+ schema:
+ type: boolean
+ default: false
+ - variable: runAsUser
+ label: "runAsUser"
+ description: "The UserID of the user running the application"
+ schema:
+ type: int
+ default: 0
+ - variable: runAsGroup
+ label: "runAsGroup"
+ description: The groupID this App of the user running the application"
+ schema:
+ type: int
+ default: 0
+ - variable: supplementalGroups
+ label: "supplementalGroups"
+ description: "Additional groups this App needs access to"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: Group
+ label: "Group"
+ schema:
+ type: int
+ default: 0
+ - variable: fsGroup
+ label: "fsGroup"
+ description: "The group that should own ALL storage."
+ schema:
+ type: int
+ default: 0
+ - variable: fsGroupChangePolicy
+ label: "When should we take ownership?"
+ schema:
+ type: string
+ default: "OnRootMismatch"
+ enum:
+ - value: "OnRootMismatch"
+ description: "OnRootMismatch"
+ - value: "Always"
+ description: "Always"
diff --git a/scale-catalog-template/test/fireflyiii/1.0.1/templates/common.yaml b/scale-catalog-template/test/fireflyiii/1.0.1/templates/common.yaml
new file mode 100644
index 00000000..64e027ac
--- /dev/null
+++ b/scale-catalog-template/test/fireflyiii/1.0.1/templates/common.yaml
@@ -0,0 +1,5 @@
+{{/* Make sure all variables are set properly */}}
+{{- include "common.values.setup" . }}
+
+{{/* Render the templates */}}
+{{ include "common.all" . }}
diff --git a/scale-catalog-template/test/fireflyiii/1.0.1/templates/secrets.yaml b/scale-catalog-template/test/fireflyiii/1.0.1/templates/secrets.yaml
new file mode 100644
index 00000000..2227b0eb
--- /dev/null
+++ b/scale-catalog-template/test/fireflyiii/1.0.1/templates/secrets.yaml
@@ -0,0 +1,21 @@
+apiVersion: v1
+kind: Secret
+metadata:
+ labels:
+ {{- include "common.labels" . | nindent 4 }}
+ name: dbcreds
+{{- $previous := lookup "v1" "Secret" .Release.Namespace "dbcreds" }}
+{{- $dbPass := "" }}
+data:
+{{- if $previous }}
+ {{- $dbPass = ( index $previous.data "postgresql-password" ) | b64dec }}
+ postgresql-password: {{ ( index $previous.data "postgresql-password" ) }}
+ postgresql-postgres-password: {{ ( index $previous.data "postgresql-postgres-password" ) }}
+{{- else }}
+ {{- $dbPass = randAlphaNum 50 }}
+ postgresql-password: {{ $dbPass | b64enc | quote }}
+ postgresql-postgres-password: {{ randAlphaNum 50 | b64enc | quote }}
+{{- end }}
+ url: {{ ( printf "%v%v:%v@%v-%v:%v/%v" "postgresql://" .Values.postgresql.postgresqlUsername $dbPass .Release.Name "postgresql" "5432" .Values.postgresql.postgresqlDatabase ) | b64enc | quote }}
+ postgresql_host: {{ ( printf "%v-%v" .Release.Name "postgresql" ) | b64enc | quote }}
+type: Opaque
diff --git a/scale-catalog-template/test/fireflyiii/1.0.1/test_values.yaml b/scale-catalog-template/test/fireflyiii/1.0.1/test_values.yaml
new file mode 100644
index 00000000..7c5ca267
--- /dev/null
+++ b/scale-catalog-template/test/fireflyiii/1.0.1/test_values.yaml
@@ -0,0 +1,78 @@
+# Default values for Bitwarden.
+
+image:
+ repository: jc5x/firefly-iii
+ pullPolicy: IfNotPresent
+ tag: latest
+
+strategy:
+ type: Recreate
+
+podSecurityContext:
+ runAsNonRoot: false
+ runAsUser: 0
+ runAsGroup: 0
+ fsGroup: 0
+
+services:
+ main:
+ port:
+ port: 8080
+ tcp:
+ enabled: true
+ type: ClusterIP
+ port:
+ port: 51080
+ protocol: TCP
+ targetPort: 51080
+
+env:
+ DB_USERNAME: firefly
+ DB_DATABASE: firefly
+ DB_CONNECTION: pgsql
+ DB_PORT: 5432
+ APP_Key: AGcfkCUS233ZWmBXztYbdyCs2u7kkz55
+
+envValueFrom:
+ DB_HOST:
+ secretKeyRef:
+ name: dbcreds
+ key: url
+ DB_PASSWORD:
+ secretKeyRef:
+ name: dbcreds
+ key: postgresql-password
+
+persistence:
+ data:
+ enabled: true
+ mountPath: "/var/www/html/storage/upload"
+ emptyDir: true
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ storageClass: ""
+ db:
+ nameOverride: "db"
+ enabled: true
+ emptyDir: true
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ storageClass: ""
+ dbbackup:
+ enabled: true
+ emptyDir: true
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ storageClass: ""
+
+
+# Enabled postgres
+# ... for more options see https://github.com/bitnami/charts/tree/master/bitnami/postgresql
+postgresql:
+ enabled: true
+ postgresqlUsername: firefly
+ postgresqlDatabase: firefly
+ existingSecret: dbcreds
+ persistence:
+ enabled: false
+ existingClaim: db
diff --git a/scale-catalog-template/test/fireflyiii/1.0.1/values.yaml b/scale-catalog-template/test/fireflyiii/1.0.1/values.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/scale-catalog-template/test/fireflyiii/item.yaml b/scale-catalog-template/test/fireflyiii/item.yaml
new file mode 100644
index 00000000..1cbbc68a
--- /dev/null
+++ b/scale-catalog-template/test/fireflyiii/item.yaml
@@ -0,0 +1,3 @@
+categories:
+ - finacial
+icon_url: https://www.firefly-iii.org/assets/logo/color.png
diff --git a/scale-catalog-template/test/freshrss/3.1.5/CONFIG.md b/scale-catalog-template/test/freshrss/3.1.5/CONFIG.md
new file mode 100644
index 00000000..6d760c18
--- /dev/null
+++ b/scale-catalog-template/test/freshrss/3.1.5/CONFIG.md
@@ -0,0 +1,8 @@
+# Configuration Options
+
+##### Connecting to other apps
+If you need to connect this App to other Apps on TrueNAS SCALE, please refer to our "Linking Apps Together" guide:
+https://truecharts.org/manual/linking/
+
+##### Available config options
+In the future this page is going to contain an automated list of options available in the installation/edit UI.
diff --git a/scale-catalog-template/test/freshrss/3.1.5/Chart.lock b/scale-catalog-template/test/freshrss/3.1.5/Chart.lock
new file mode 100644
index 00000000..0d2e642f
--- /dev/null
+++ b/scale-catalog-template/test/freshrss/3.1.5/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+digest: sha256:ea66c36be2fa73e56bc33f7e89af9ce338cdfbed0b347484888e87228b825015
+generated: "2021-05-06T13:29:54.451281697Z"
diff --git a/scale-catalog-template/test/freshrss/3.1.5/Chart.yaml b/scale-catalog-template/test/freshrss/3.1.5/Chart.yaml
new file mode 100644
index 00000000..89a2f7d6
--- /dev/null
+++ b/scale-catalog-template/test/freshrss/3.1.5/Chart.yaml
@@ -0,0 +1,29 @@
+apiVersion: v2
+kubeVersion: ">=1.16.0-0"
+name: freshrss
+version: 3.1.5
+upstream_version: 2.3.1
+appVersion: "auto"
+description: FreshRSS is a self-hosted RSS feed aggregator
+type: application
+deprecated: false
+home: https://github.com/truecharts/apps/tree/master/incubator/freshrss
+icon: https://github.com/FreshRSS/FreshRSS/blob/master/docs/img/FreshRSS-logo.png?raw=true
+keywords:
+ - freshrss
+ - rss
+sources:
+ - https://github.com/truecharts/apps/tree/master/incubator/freshrss
+ - https://github.com/k8s-at-home/charts/tree/master/charts/freshrss
+ - https://github.com/FreshRSS/FreshRSS
+ - https://hub.docker.com/r/linuxserver/freshrss
+dependencies:
+ - name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+ # condition:
+maintainers:
+ - name: TrueCharts
+ email: info@truecharts.org
+ url: truecharts.org
+# annotations:
diff --git a/scale-catalog-template/test/freshrss/3.1.5/README.md b/scale-catalog-template/test/freshrss/3.1.5/README.md
new file mode 100644
index 00000000..b8d65a65
--- /dev/null
+++ b/scale-catalog-template/test/freshrss/3.1.5/README.md
@@ -0,0 +1,56 @@
+# Introduction
+
+![Version: 3.1.5](https://img.shields.io/badge/Version-3.1.5-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: auto](https://img.shields.io/badge/AppVersion-auto-informational?style=flat-square)
+
+FreshRSS is a self-hosted RSS feed aggregator
+
+TrueCharts are designed to be installed as TrueNAS SCALE app only. We can not guarantee this charts works as a stand-alone helm installation.
+**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/apps/issues/new/choose)**
+
+## Source Code
+
+*
+*
+*
+*
+
+## Requirements
+
+Kubernetes: `>=1.16.0-0`
+
+## Dependencies
+
+| Repository | Name | Version |
+|------------|------|---------|
+| https://truecharts.org/ | common | 3.5.5 |
+
+## Installing the Chart
+
+To install the chart with the release name `freshrss`
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Click "Install" for this specific Apps
+- Fill out the configuration form
+
+## Uninstalling the Chart
+
+To uninstall the `freshrss` deployment
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Go to "Installed Apps"
+- Expand the menu in the top-right corner of this App
+- Click "Remove" for this specific Apps
+
+The command removes all the Kubernetes components associated with the chart **including storage volumes** _(Except hostPath Storage)_ and deletes the release.
+
+## Support
+
+- See the [Wiki](https://truecharts.org)
+- Open a [issue](https://github.com/truecharts/apps/issues/new/choose)
+- Ask a [question](https://github.com/truecharts/apps/discussions)
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
+All Rights Reserved - The TrueCharts Project
diff --git a/scale-catalog-template/test/freshrss/3.1.5/app-readme.md b/scale-catalog-template/test/freshrss/3.1.5/app-readme.md
new file mode 100644
index 00000000..7d8a844b
--- /dev/null
+++ b/scale-catalog-template/test/freshrss/3.1.5/app-readme.md
@@ -0,0 +1,3 @@
+FreshRSS is a self-hosted RSS feed aggregator
+This App is supplied by TrueCharts, for more information please visit https://truecharts.org
+FreshRSS is a self-hosted RSS feed aggregator
diff --git a/scale-catalog-template/test/freshrss/3.1.5/charts/common-3.5.5.tgz b/scale-catalog-template/test/freshrss/3.1.5/charts/common-3.5.5.tgz
new file mode 100644
index 00000000..d01688bb
Binary files /dev/null and b/scale-catalog-template/test/freshrss/3.1.5/charts/common-3.5.5.tgz differ
diff --git a/scale-catalog-template/test/freshrss/3.1.5/ix_values.yaml b/scale-catalog-template/test/freshrss/3.1.5/ix_values.yaml
new file mode 100644
index 00000000..9de79c78
--- /dev/null
+++ b/scale-catalog-template/test/freshrss/3.1.5/ix_values.yaml
@@ -0,0 +1,16 @@
+##
+# This file contains Values.yaml content that gets added to the output of questions.yaml
+# It's ONLY meant for content that the user is NOT expected to change.
+# Example: Everything under "image" is not included in questions.yaml but is included here.
+##
+
+image:
+ repository: linuxserver/freshrss
+ pullPolicy: IfNotPresent
+ tag: version-1.18.0
+
+
+##
+# Most other defaults are set in questions.yaml
+# For other options please refer to the wiki, default_values.yaml or the common library chart
+##
diff --git a/scale-catalog-template/test/freshrss/3.1.5/questions.yaml b/scale-catalog-template/test/freshrss/3.1.5/questions.yaml
new file mode 100644
index 00000000..ffb0a95d
--- /dev/null
+++ b/scale-catalog-template/test/freshrss/3.1.5/questions.yaml
@@ -0,0 +1,451 @@
+groups:
+ - name: "Container Image"
+ description: "Image to be used for container"
+ - name: "Workload Configuration"
+ description: "Configure workload deployment"
+ - name: "Configuration"
+ description: "additional container configuration"
+ - name: "Networking"
+ description: "Configure / service for container"
+ - name: "Storage"
+ description: "Persist and share data that is separate from the lifecycle of the container"
+ - name: "Resources and Devices"
+ description: "Specify resources/devices to be allocated to workload"
+ - name: "Reverse Proxy Configuration"
+ description: "Reverse Proxy configuration"
+ - name: "Advanced"
+ description: "Advanced Configuration"
+ - name: "WARNING"
+ description: "WARNING"
+portals:
+ web_portal:
+ protocols:
+ - "$kubernetes-resource_configmap_portal_protocol"
+ host:
+ - "$kubernetes-resource_configmap_portal_host"
+ ports:
+ - "$kubernetes-resource_configmap_portal_port"
+questions:
+ - variable: portal
+ group: "Container Image"
+ label: "Configure Portal Button"
+ schema:
+ type: dict
+ hidden: true
+ attrs:
+ - variable: enabled
+ label: "Enable"
+ description: "enable the portal button"
+ schema:
+ hidden: true
+ editable: false
+ type: boolean
+ default: true
+
+ # Update Policy
+ - variable: strategyType
+ group: "Container Image"
+ label: "Update Strategy"
+ schema:
+ type: string
+ default: "Recreate"
+ enum:
+ - value: "RollingUpdate"
+ description: "Create new pods and then kill old ones"
+ - value: "Recreate"
+ description: "Kill existing pods before creating new ones"
+ # Configure Time Zone
+ - variable: timezone
+ group: "Container Image"
+ label: "Timezone"
+ schema:
+ type: string
+ default: "Etc/UTC"
+ $ref:
+ - "definitions/timezone"
+
+ # Configure Enviroment Variables
+ - variable: environmentVariables
+ label: "Image environment"
+ group: "Configuration"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: environmentVariable
+ label: "Environment Variable"
+ schema:
+ type: dict
+ attrs:
+ - variable: name
+ label: "Name"
+ schema:
+ type: string
+ - variable: value
+ label: "Value"
+ schema:
+ type: string
+ # Enable Host Networking
+ - variable: hostNetwork
+ group: "Networking"
+ label: "Enable Host Networking"
+ schema:
+ type: boolean
+ default: false
+ - variable: services
+ group: "Networking"
+ label: "Configure Service"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "Main service"
+ description: "The Primary service on which the healthcheck runs, often the webUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: false
+ enum:
+ - value: HTTP
+ description: "HTTP"
+ - value: "HTTPS"
+ description: "HTTPS"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 80
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 80
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36029
+ required: true
+## TrueCharts Specific
+ - variable: persistence
+ label: "Integrated Persistent Storage"
+ description: "Websocket Service"
+ group: "Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: config
+ label: "App Config Storage"
+ description: "Stores the Application Configuration."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: "/config"
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "100Gi"
+
+ - variable: customStorage
+ label: "Custom app storage"
+ group: "Storage"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: volumeMount
+ label: "Custom Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enabled"
+ schema:
+ type: boolean
+ default: true
+ required: true
+ hidden: true
+ editable: false
+ - variable: setPermissions
+ label: "Automatic Permissions"
+ description: "Automatically set permissions on install"
+ schema:
+ type: boolean
+ default: true
+ hidden: false
+ - variable: readOnly
+ label: "Mount as ReadOnly"
+ description: "prevent any write from being done to the mounted volume"
+ schema:
+ type: boolean
+ default: false
+ hidden: false
+ - variable: emptyDir
+ label: "emptyDir"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ editable: false
+ - variable: mountPath
+ label: "Mount Path"
+ description: "Path to mount inside the pod"
+ schema:
+ type: path
+ required: true
+ default: ""
+ editable: true
+ - variable: hostPath
+ label: "Host Path"
+ schema:
+ type: hostpath
+ required: true
+ - variable: ingress
+ label: ""
+ group: "Reverse Proxy Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "WebUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: certType
+ label: "Select Reverse-Proxy Type"
+ schema:
+ type: string
+ default: "disabled"
+ enum:
+ - value: "disabled"
+ description: "Disabled"
+ - value: ""
+ description: "No Encryption/TLS/Certificates"
+ - value: "selfsigned"
+ description: "Self-Signed Certificate"
+ - value: "ixcert"
+ description: "TrueNAS SCALE Certificate"
+ - variable: type
+ label: "Reverse Proxy Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: true
+ editable: false
+ required: true
+ - variable: serviceName
+ label: "Service name to proxy to"
+ schema:
+ hidden: true
+ editable: false
+ type: string
+ default: ""
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: "websecure"
+ required: true
+ enum:
+ - value: "websecure"
+ description: "Websecure: HTTPS/TLS port 443"
+ - variable: hosts
+ label: "Hosts"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: list
+ default: []
+ items:
+ - variable: host
+ label: "Host"
+ schema:
+ type: dict
+ attrs:
+ - variable: host
+ label: "Domain Name"
+ required: true
+ schema:
+ type: string
+ - variable: path
+ label: "path"
+ schema:
+ type: string
+ required: true
+ hidden: true
+ default: "/"
+ - variable: certificate
+ label: "Select TrueNAS SCALE Certificate"
+ schema:
+ type: int
+ show_if: [["certType", "=", "ixcert"]]
+ $ref:
+ - "definitions/certificate"
+ - variable: authForwardURL
+ label: "Forward Authentication URL"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: ""
+ - variable: PUID
+ group: "Advanced"
+ label: "PUID"
+ description: "Sets the PUID env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: int
+ default: 568
+
+ - variable: PGID
+ group: "Advanced"
+ label: "PGID"
+ description: "Sets the PGID env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: int
+ default: 568
+ - variable: UMASK
+ group: "Advanced"
+ label: "UMASK"
+ description: "Sets the UMASK env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: string
+ default: "002"
+ # Enable privileged
+ - variable: securityContext
+ group: "Advanced"
+ label: "Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: privileged
+ label: "Enable privileged mode for Common-Chart based charts"
+ schema:
+ type: boolean
+ default: false
+ # Set Pod Security Policy
+ - variable: podSecurityContext
+ group: "Advanced"
+ label: "Pod Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: runAsNonRoot
+ label: "runAsNonRoot"
+ schema:
+ type: boolean
+ default: false
+ - variable: runAsUser
+ label: "runAsUser"
+ description: "The UserID of the user running the application"
+ schema:
+ type: int
+ default: 0
+ - variable: runAsGroup
+ label: "runAsGroup"
+ description: The groupID this App of the user running the application"
+ schema:
+ type: int
+ default: 0
+ - variable: supplementalGroups
+ label: "supplementalGroups"
+ description: "Additional groups this App needs access to"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: Group
+ label: "Group"
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroup
+ label: "fsGroup"
+ description: "The group that should own ALL storage."
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroupChangePolicy
+ label: "When should we take ownership?"
+ schema:
+ type: string
+ default: "OnRootMismatch"
+ enum:
+ - value: "OnRootMismatch"
+ description: "OnRootMismatch"
+ - value: "Always"
+ description: "Always"
diff --git a/scale-catalog-template/test/freshrss/3.1.5/templates/common.yaml b/scale-catalog-template/test/freshrss/3.1.5/templates/common.yaml
new file mode 100644
index 00000000..a6613c2c
--- /dev/null
+++ b/scale-catalog-template/test/freshrss/3.1.5/templates/common.yaml
@@ -0,0 +1 @@
+{{ include "common.all" . }}
diff --git a/scale-catalog-template/test/freshrss/3.1.5/test_values.yaml b/scale-catalog-template/test/freshrss/3.1.5/test_values.yaml
new file mode 100644
index 00000000..4c31242e
--- /dev/null
+++ b/scale-catalog-template/test/freshrss/3.1.5/test_values.yaml
@@ -0,0 +1,35 @@
+# Default values for FreshRSS.
+
+image:
+ repository: linuxserver/freshrss
+ pullPolicy: IfNotPresent
+ tag: version-1.18.0
+
+strategy:
+ type: Recreate
+
+# Configure the Security Context for the Pod
+podSecurityContext:
+ runAsNonRoot: false
+ runAsUser: 0
+ runAsGroup: 0
+ fsGroup: 0
+
+services:
+ main:
+ port:
+ port: 80
+
+env: {}
+ # TZ: UTC
+ # PUID: 1001
+ # PGID: 1001
+
+persistence:
+ config:
+ enabled: true
+ mountPath: "/config"
+ emptyDir: true
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ storageClass: ""
diff --git a/scale-catalog-template/test/freshrss/3.1.5/values.yaml b/scale-catalog-template/test/freshrss/3.1.5/values.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/scale-catalog-template/test/freshrss/item.yaml b/scale-catalog-template/test/freshrss/item.yaml
new file mode 100644
index 00000000..b77c41d4
--- /dev/null
+++ b/scale-catalog-template/test/freshrss/item.yaml
@@ -0,0 +1,3 @@
+categories:
+ - media
+icon_url: https://github.com/FreshRSS/FreshRSS/blob/master/docs/img/FreshRSS-logo.png?raw=true
diff --git a/scale-catalog-template/test/gaps/3.1.5/CONFIG.md b/scale-catalog-template/test/gaps/3.1.5/CONFIG.md
new file mode 100644
index 00000000..6d760c18
--- /dev/null
+++ b/scale-catalog-template/test/gaps/3.1.5/CONFIG.md
@@ -0,0 +1,8 @@
+# Configuration Options
+
+##### Connecting to other apps
+If you need to connect this App to other Apps on TrueNAS SCALE, please refer to our "Linking Apps Together" guide:
+https://truecharts.org/manual/linking/
+
+##### Available config options
+In the future this page is going to contain an automated list of options available in the installation/edit UI.
diff --git a/scale-catalog-template/test/gaps/3.1.5/Chart.lock b/scale-catalog-template/test/gaps/3.1.5/Chart.lock
new file mode 100644
index 00000000..f4952b7c
--- /dev/null
+++ b/scale-catalog-template/test/gaps/3.1.5/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+digest: sha256:ea66c36be2fa73e56bc33f7e89af9ce338cdfbed0b347484888e87228b825015
+generated: "2021-05-06T13:29:54.917308943Z"
diff --git a/scale-catalog-template/test/gaps/3.1.5/Chart.yaml b/scale-catalog-template/test/gaps/3.1.5/Chart.yaml
new file mode 100644
index 00000000..8e4a8f97
--- /dev/null
+++ b/scale-catalog-template/test/gaps/3.1.5/Chart.yaml
@@ -0,0 +1,29 @@
+apiVersion: v2
+kubeVersion: ">=1.16.0-0"
+name: gaps
+version: 3.1.5
+upstream_version: 1.1.1
+appVersion: "auto"
+description: Gaps searches through your Plex Server or local folders for all movies, then queries for known movies in the same collection.
+type: application
+deprecated: false
+home: https://github.com/truecharts/apps/tree/master/incubator/gaps
+icon: https://raw.githubusercontent.com/JasonHHouse/gaps/master/images/Final-Black.png
+keywords:
+ - gaps
+ - plex
+ - plex-media-server
+sources:
+ - https://github.com/truecharts/apps/tree/master/incubator/gaps
+ - https://github.com/k8s-at-home/charts/tree/master/charts/gaps
+ - https://github.com/JasonHHouse/gaps
+dependencies:
+ - name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+ # condition:
+maintainers:
+ - name: TrueCharts
+ email: info@truecharts.org
+ url: truecharts.org
+# annotations:
diff --git a/scale-catalog-template/test/gaps/3.1.5/README.md b/scale-catalog-template/test/gaps/3.1.5/README.md
new file mode 100644
index 00000000..c5ab0643
--- /dev/null
+++ b/scale-catalog-template/test/gaps/3.1.5/README.md
@@ -0,0 +1,55 @@
+# Introduction
+
+![Version: 3.1.5](https://img.shields.io/badge/Version-3.1.5-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: auto](https://img.shields.io/badge/AppVersion-auto-informational?style=flat-square)
+
+Gaps searches through your Plex Server or local folders for all movies, then queries for known movies in the same collection.
+
+TrueCharts are designed to be installed as TrueNAS SCALE app only. We can not guarantee this charts works as a stand-alone helm installation.
+**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/apps/issues/new/choose)**
+
+## Source Code
+
+*
+*
+*
+
+## Requirements
+
+Kubernetes: `>=1.16.0-0`
+
+## Dependencies
+
+| Repository | Name | Version |
+|------------|------|---------|
+| https://truecharts.org/ | common | 3.5.5 |
+
+## Installing the Chart
+
+To install the chart with the release name `gaps`
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Click "Install" for this specific Apps
+- Fill out the configuration form
+
+## Uninstalling the Chart
+
+To uninstall the `gaps` deployment
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Go to "Installed Apps"
+- Expand the menu in the top-right corner of this App
+- Click "Remove" for this specific Apps
+
+The command removes all the Kubernetes components associated with the chart **including storage volumes** _(Except hostPath Storage)_ and deletes the release.
+
+## Support
+
+- See the [Wiki](https://truecharts.org)
+- Open a [issue](https://github.com/truecharts/apps/issues/new/choose)
+- Ask a [question](https://github.com/truecharts/apps/discussions)
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
+All Rights Reserved - The TrueCharts Project
diff --git a/scale-catalog-template/test/gaps/3.1.5/app-readme.md b/scale-catalog-template/test/gaps/3.1.5/app-readme.md
new file mode 100644
index 00000000..25aa9e69
--- /dev/null
+++ b/scale-catalog-template/test/gaps/3.1.5/app-readme.md
@@ -0,0 +1,3 @@
+Gaps searches through your Plex Server or local folders for all movies, then queries for known movies in the same collection.
+This App is supplied by TrueCharts, for more information please visit https://truecharts.org
+Gaps searches through your Plex Server or local folders for all movies, then queries for known movies in the same collection.
diff --git a/scale-catalog-template/test/gaps/3.1.5/charts/common-3.5.5.tgz b/scale-catalog-template/test/gaps/3.1.5/charts/common-3.5.5.tgz
new file mode 100644
index 00000000..d01688bb
Binary files /dev/null and b/scale-catalog-template/test/gaps/3.1.5/charts/common-3.5.5.tgz differ
diff --git a/scale-catalog-template/test/gaps/3.1.5/ix_values.yaml b/scale-catalog-template/test/gaps/3.1.5/ix_values.yaml
new file mode 100644
index 00000000..d1117766
--- /dev/null
+++ b/scale-catalog-template/test/gaps/3.1.5/ix_values.yaml
@@ -0,0 +1,15 @@
+##
+# This file contains Values.yaml content that gets added to the output of questions.yaml
+# It's ONLY meant for content that the user is NOT expected to change.
+# Example: Everything under "image" is not included in questions.yaml but is included here.
+##
+
+image:
+ repository: housewrecker/gaps
+ pullPolicy: IfNotPresent
+ tag: v0.8.8
+
+##
+# Most other defaults are set in questions.yaml
+# For other options please refer to the wiki, default_values.yaml or the common library chart
+##
diff --git a/scale-catalog-template/test/gaps/3.1.5/questions.yaml b/scale-catalog-template/test/gaps/3.1.5/questions.yaml
new file mode 100644
index 00000000..7447b505
--- /dev/null
+++ b/scale-catalog-template/test/gaps/3.1.5/questions.yaml
@@ -0,0 +1,437 @@
+groups:
+ - name: "Container Image"
+ description: "Image to be used for container"
+ - name: "Workload Configuration"
+ description: "Configure workload deployment"
+ - name: "Configuration"
+ description: "additional container configuration"
+ - name: "Networking"
+ description: "Configure / service for container"
+ - name: "Storage"
+ description: "Persist and share data that is separate from the lifecycle of the container"
+ - name: "Resources and Devices"
+ description: "Specify resources/devices to be allocated to workload"
+ - name: "Reverse Proxy Configuration"
+ description: "Reverse Proxy configuration"
+ - name: "Advanced"
+ description: "Advanced Configuration"
+ - name: "WARNING"
+ description: "WARNING"
+portals:
+ web_portal:
+ protocols:
+ - "$kubernetes-resource_configmap_portal_protocol"
+ host:
+ - "$kubernetes-resource_configmap_portal_host"
+ ports:
+ - "$kubernetes-resource_configmap_portal_port"
+questions:
+ - variable: portal
+ group: "Container Image"
+ label: "Configure Portal Button"
+ schema:
+ type: dict
+ hidden: true
+ attrs:
+ - variable: enabled
+ label: "Enable"
+ description: "enable the portal button"
+ schema:
+ hidden: true
+ editable: false
+ type: boolean
+ default: true
+
+ # Update Policy
+ - variable: strategyType
+ group: "Container Image"
+ label: "Update Strategy"
+ schema:
+ type: string
+ default: "Recreate"
+ enum:
+ - value: "RollingUpdate"
+ description: "Create new pods and then kill old ones"
+ - value: "Recreate"
+ description: "Kill existing pods before creating new ones"
+ # Configure Time Zone
+ - variable: timezone
+ group: "Container Image"
+ label: "Timezone"
+ schema:
+ type: string
+ default: "Etc/UTC"
+ $ref:
+ - "definitions/timezone"
+
+ # Configure Enviroment Variables
+ - variable: environmentVariables
+ label: "Image environment"
+ group: "Configuration"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: environmentVariable
+ label: "Environment Variable"
+ schema:
+ type: dict
+ attrs:
+ - variable: name
+ label: "Name"
+ schema:
+ type: string
+ - variable: value
+ label: "Value"
+ schema:
+ type: string
+ # Enable Host Networking
+ - variable: hostNetwork
+ group: "Networking"
+ label: "Enable Host Networking"
+ schema:
+ type: boolean
+ default: false
+ - variable: services
+ group: "Networking"
+ label: "Configure Service"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "Main service"
+ description: "The Primary service on which the healthcheck runs, often the webUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: false
+ enum:
+ - value: HTTP
+ description: "HTTP"
+ - value: "HTTPS"
+ description: "HTTPS"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 8484
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 8484
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36030
+ required: true
+ - variable: persistence
+ label: "Integrated Persistent Storage"
+ description: "Websocket Service"
+ group: "Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: data
+ label: "App Config Storage"
+ description: "Stores the Application Configuration."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: "/usr/data"
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "100Gi"
+
+
+ - variable: customStorage
+ label: "Custom app storage"
+ group: "Storage"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: volumeMount
+ label: "Custom Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enabled"
+ schema:
+ type: boolean
+ default: true
+ required: true
+ hidden: true
+ editable: false
+ - variable: setPermissions
+ label: "Automatic Permissions"
+ description: "Automatically set permissions on install"
+ schema:
+ type: boolean
+ default: true
+ hidden: false
+ - variable: readOnly
+ label: "Mount as ReadOnly"
+ description: "prevent any write from being done to the mounted volume"
+ schema:
+ type: boolean
+ default: false
+ hidden: false
+ - variable: emptyDir
+ label: "emptyDir"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ editable: false
+ - variable: mountPath
+ label: "Mount Path"
+ description: "Path to mount inside the pod"
+ schema:
+ type: path
+ required: true
+ default: ""
+ editable: true
+ - variable: hostPath
+ label: "Host Path"
+ schema:
+ type: hostpath
+ required: true
+ - variable: ingress
+ label: ""
+ group: "Reverse Proxy Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "WebUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: certType
+ label: "Select Reverse-Proxy Type"
+ schema:
+ type: string
+ default: "disabled"
+ enum:
+ - value: "disabled"
+ description: "Disabled"
+ - value: ""
+ description: "No Encryption/TLS/Certificates"
+ - value: "selfsigned"
+ description: "Self-Signed Certificate"
+ - value: "ixcert"
+ description: "TrueNAS SCALE Certificate"
+ - variable: type
+ label: "Reverse Proxy Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: true
+ editable: false
+ required: true
+ - variable: serviceName
+ label: "Service name to proxy to"
+ schema:
+ hidden: true
+ editable: false
+ type: string
+ default: ""
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: "websecure"
+ required: true
+ enum:
+ - value: "websecure"
+ description: "Websecure: HTTPS/TLS port 443"
+ - variable: hosts
+ label: "Hosts"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: list
+ default: []
+ items:
+ - variable: host
+ label: "Host"
+ schema:
+ type: dict
+ attrs:
+ - variable: host
+ label: "Domain Name"
+ required: true
+ schema:
+ type: string
+ - variable: path
+ label: "path"
+ schema:
+ type: string
+ required: true
+ hidden: true
+ default: "/"
+ - variable: certificate
+ label: "Select TrueNAS SCALE Certificate"
+ schema:
+ type: int
+ show_if: [["certType", "=", "ixcert"]]
+ $ref:
+ - "definitions/certificate"
+ - variable: authForwardURL
+ label: "Forward Authentication URL"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: ""
+
+ - variable: UMASK
+ group: "Advanced"
+ label: "UMASK"
+ description: "Sets the UMASK env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: string
+ default: "002"
+ # Enable privileged
+ - variable: securityContext
+ group: "Advanced"
+ label: "Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: privileged
+ label: "Enable privileged mode for Common-Chart based charts"
+ schema:
+ type: boolean
+ default: false
+ # Set Pod Security Policy
+ - variable: podSecurityContext
+ group: "Advanced"
+ label: "Pod Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: runAsNonRoot
+ label: "runAsNonRoot"
+ schema:
+ type: boolean
+ default: true
+ - variable: runAsUser
+ label: "runAsUser"
+ description: "The UserID of the user running the application"
+ schema:
+ type: int
+ default: 568
+ - variable: runAsGroup
+ label: "runAsGroup"
+ description: The groupID this App of the user running the application"
+ schema:
+ type: int
+ default: 568
+ - variable: supplementalGroups
+ label: "supplementalGroups"
+ description: "Additional groups this App needs access to"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: Group
+ label: "Group"
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroup
+ label: "fsGroup"
+ description: "The group that should own ALL storage."
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroupChangePolicy
+ label: "When should we take ownership?"
+ schema:
+ type: string
+ default: "OnRootMismatch"
+ enum:
+ - value: "OnRootMismatch"
+ description: "OnRootMismatch"
+ - value: "Always"
+ description: "Always"
diff --git a/scale-catalog-template/test/gaps/3.1.5/templates/common.yaml b/scale-catalog-template/test/gaps/3.1.5/templates/common.yaml
new file mode 100644
index 00000000..a6613c2c
--- /dev/null
+++ b/scale-catalog-template/test/gaps/3.1.5/templates/common.yaml
@@ -0,0 +1 @@
+{{ include "common.all" . }}
diff --git a/scale-catalog-template/test/gaps/3.1.5/test_values.yaml b/scale-catalog-template/test/gaps/3.1.5/test_values.yaml
new file mode 100644
index 00000000..ed003b80
--- /dev/null
+++ b/scale-catalog-template/test/gaps/3.1.5/test_values.yaml
@@ -0,0 +1,26 @@
+# Default values for Gaps.
+
+image:
+ repository: housewrecker/gaps
+ pullPolicy: IfNotPresent
+ tag: v0.8.8
+
+strategy:
+ type: Recreate
+
+services:
+ main:
+ port:
+ port: 8484
+
+env: {}
+ # TZ: UTC
+
+persistence:
+ data:
+ enabled: true
+ mountPath: "/usr/data"
+ emptyDir: true
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ storageClass: ""
diff --git a/scale-catalog-template/test/gaps/3.1.5/values.yaml b/scale-catalog-template/test/gaps/3.1.5/values.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/scale-catalog-template/test/gaps/item.yaml b/scale-catalog-template/test/gaps/item.yaml
new file mode 100644
index 00000000..5fe657ea
--- /dev/null
+++ b/scale-catalog-template/test/gaps/item.yaml
@@ -0,0 +1,3 @@
+categories:
+ - media
+icon_url: https://raw.githubusercontent.com/JasonHHouse/gaps/master/images/Final-Black.png
diff --git a/scale-catalog-template/test/grocy/3.1.5/CONFIG.md b/scale-catalog-template/test/grocy/3.1.5/CONFIG.md
new file mode 100644
index 00000000..6d760c18
--- /dev/null
+++ b/scale-catalog-template/test/grocy/3.1.5/CONFIG.md
@@ -0,0 +1,8 @@
+# Configuration Options
+
+##### Connecting to other apps
+If you need to connect this App to other Apps on TrueNAS SCALE, please refer to our "Linking Apps Together" guide:
+https://truecharts.org/manual/linking/
+
+##### Available config options
+In the future this page is going to contain an automated list of options available in the installation/edit UI.
diff --git a/scale-catalog-template/test/grocy/3.1.5/Chart.lock b/scale-catalog-template/test/grocy/3.1.5/Chart.lock
new file mode 100644
index 00000000..68e5cfd9
--- /dev/null
+++ b/scale-catalog-template/test/grocy/3.1.5/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+digest: sha256:ea66c36be2fa73e56bc33f7e89af9ce338cdfbed0b347484888e87228b825015
+generated: "2021-05-06T13:29:55.353851311Z"
diff --git a/scale-catalog-template/test/grocy/3.1.5/Chart.yaml b/scale-catalog-template/test/grocy/3.1.5/Chart.yaml
new file mode 100644
index 00000000..c0b86fc5
--- /dev/null
+++ b/scale-catalog-template/test/grocy/3.1.5/Chart.yaml
@@ -0,0 +1,27 @@
+apiVersion: v2
+kubeVersion: ">=1.16.0-0"
+name: grocy
+version: 3.1.5
+upstream_version: 4.3.1
+appVersion: "auto"
+description: ERP beyond your fridge - grocy is a web-based self-hosted groceries & household management solution for your home
+type: application
+deprecated: false
+home: https://github.com/truecharts/apps/tree/master/incubator/grocy
+icon: https://github.com/grocy/grocy/raw/master/public/img/appicons/mstile-150x150.png
+keywords:
+ - grocy
+sources:
+ - https://github.com/truecharts/apps/tree/master/incubator/grocy
+ - https://github.com/k8s-at-home/charts/tree/master/charts/grocy
+ - https://github.com/grocy/grocy
+dependencies:
+ - name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+ # condition:
+maintainers:
+ - name: TrueCharts
+ email: info@truecharts.org
+ url: truecharts.org
+# annotations:
diff --git a/scale-catalog-template/test/grocy/3.1.5/README.md b/scale-catalog-template/test/grocy/3.1.5/README.md
new file mode 100644
index 00000000..48ea0db9
--- /dev/null
+++ b/scale-catalog-template/test/grocy/3.1.5/README.md
@@ -0,0 +1,55 @@
+# Introduction
+
+![Version: 3.1.5](https://img.shields.io/badge/Version-3.1.5-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: auto](https://img.shields.io/badge/AppVersion-auto-informational?style=flat-square)
+
+ERP beyond your fridge - grocy is a web-based self-hosted groceries & household management solution for your home
+
+TrueCharts are designed to be installed as TrueNAS SCALE app only. We can not guarantee this charts works as a stand-alone helm installation.
+**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/apps/issues/new/choose)**
+
+## Source Code
+
+*
+*
+*
+
+## Requirements
+
+Kubernetes: `>=1.16.0-0`
+
+## Dependencies
+
+| Repository | Name | Version |
+|------------|------|---------|
+| https://truecharts.org/ | common | 3.5.5 |
+
+## Installing the Chart
+
+To install the chart with the release name `grocy`
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Click "Install" for this specific Apps
+- Fill out the configuration form
+
+## Uninstalling the Chart
+
+To uninstall the `grocy` deployment
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Go to "Installed Apps"
+- Expand the menu in the top-right corner of this App
+- Click "Remove" for this specific Apps
+
+The command removes all the Kubernetes components associated with the chart **including storage volumes** _(Except hostPath Storage)_ and deletes the release.
+
+## Support
+
+- See the [Wiki](https://truecharts.org)
+- Open a [issue](https://github.com/truecharts/apps/issues/new/choose)
+- Ask a [question](https://github.com/truecharts/apps/discussions)
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
+All Rights Reserved - The TrueCharts Project
diff --git a/scale-catalog-template/test/grocy/3.1.5/app-readme.md b/scale-catalog-template/test/grocy/3.1.5/app-readme.md
new file mode 100644
index 00000000..e0fe6314
--- /dev/null
+++ b/scale-catalog-template/test/grocy/3.1.5/app-readme.md
@@ -0,0 +1,3 @@
+ERP beyond your fridge - grocy is a web-based self-hosted groceries & household management solution for your home
+This App is supplied by TrueCharts, for more information please visit https://truecharts.org
+ERP beyond your fridge - grocy is a web-based self-hosted groceries & household management solution for your home
diff --git a/scale-catalog-template/test/grocy/3.1.5/charts/common-3.5.5.tgz b/scale-catalog-template/test/grocy/3.1.5/charts/common-3.5.5.tgz
new file mode 100644
index 00000000..d01688bb
Binary files /dev/null and b/scale-catalog-template/test/grocy/3.1.5/charts/common-3.5.5.tgz differ
diff --git a/scale-catalog-template/test/grocy/3.1.5/ix_values.yaml b/scale-catalog-template/test/grocy/3.1.5/ix_values.yaml
new file mode 100644
index 00000000..06ee1e3d
--- /dev/null
+++ b/scale-catalog-template/test/grocy/3.1.5/ix_values.yaml
@@ -0,0 +1,16 @@
+##
+# This file contains Values.yaml content that gets added to the output of questions.yaml
+# It's ONLY meant for content that the user is NOT expected to change.
+# Example: Everything under "image" is not included in questions.yaml but is included here.
+##
+
+image:
+ repository: linuxserver/grocy
+ tag: version-v2.7.1
+ pullPolicy: IfNotPresent
+
+
+##
+# Most other defaults are set in questions.yaml
+# For other options please refer to the wiki, default_values.yaml or the common library chart
+##
diff --git a/scale-catalog-template/test/grocy/3.1.5/questions.yaml b/scale-catalog-template/test/grocy/3.1.5/questions.yaml
new file mode 100644
index 00000000..a0354443
--- /dev/null
+++ b/scale-catalog-template/test/grocy/3.1.5/questions.yaml
@@ -0,0 +1,449 @@
+groups:
+ - name: "Container Image"
+ description: "Image to be used for container"
+ - name: "Workload Configuration"
+ description: "Configure workload deployment"
+ - name: "Configuration"
+ description: "additional container configuration"
+ - name: "Networking"
+ description: "Configure / service for container"
+ - name: "Storage"
+ description: "Persist and share data that is separate from the lifecycle of the container"
+ - name: "Resources and Devices"
+ description: "Specify resources/devices to be allocated to workload"
+ - name: "Reverse Proxy Configuration"
+ description: "Reverse Proxy configuration"
+ - name: "Advanced"
+ description: "Advanced Configuration"
+ - name: "WARNING"
+ description: "WARNING"
+portals:
+ web_portal:
+ protocols:
+ - "$kubernetes-resource_configmap_portal_protocol"
+ host:
+ - "$kubernetes-resource_configmap_portal_host"
+ ports:
+ - "$kubernetes-resource_configmap_portal_port"
+questions:
+ - variable: portal
+ group: "Container Image"
+ label: "Configure Portal Button"
+ schema:
+ type: dict
+ hidden: true
+ attrs:
+ - variable: enabled
+ label: "Enable"
+ description: "enable the portal button"
+ schema:
+ hidden: true
+ editable: false
+ type: boolean
+ default: true
+
+ # Update Policy
+ - variable: strategyType
+ group: "Container Image"
+ label: "Update Strategy"
+ schema:
+ type: string
+ default: "Recreate"
+ enum:
+ - value: "RollingUpdate"
+ description: "Create new pods and then kill old ones"
+ - value: "Recreate"
+ description: "Kill existing pods before creating new ones"
+ # Configure Time Zone
+ - variable: timezone
+ group: "Container Image"
+ label: "Timezone"
+ schema:
+ type: string
+ default: "Etc/UTC"
+ $ref:
+ - "definitions/timezone"
+
+ # Configure Enviroment Variables
+ - variable: environmentVariables
+ label: "Image environment"
+ group: "Configuration"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: environmentVariable
+ label: "Environment Variable"
+ schema:
+ type: dict
+ attrs:
+ - variable: name
+ label: "Name"
+ schema:
+ type: string
+ - variable: value
+ label: "Value"
+ schema:
+ type: string
+ # Enable Host Networking
+ - variable: hostNetwork
+ group: "Networking"
+ label: "Enable Host Networking"
+ schema:
+ type: boolean
+ default: false
+ - variable: services
+ group: "Networking"
+ label: "Configure Service"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "Main service"
+ description: "The Primary service on which the healthcheck runs, often the webUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: false
+ enum:
+ - value: HTTP
+ description: "HTTP"
+ - value: "HTTPS"
+ description: "HTTPS"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 80
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 80
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36031
+ required: true
+ - variable: persistence
+ label: "Integrated Persistent Storage"
+ description: "Websocket Service"
+ group: "Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: config
+ label: "App Config Storage"
+ description: "Stores the Application Configuration."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: "/config"
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "100Gi"
+ - variable: customStorage
+ label: "Custom app storage"
+ group: "Storage"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: volumeMount
+ label: "Custom Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enabled"
+ schema:
+ type: boolean
+ default: true
+ required: true
+ hidden: true
+ editable: false
+ - variable: setPermissions
+ label: "Automatic Permissions"
+ description: "Automatically set permissions on install"
+ schema:
+ type: boolean
+ default: true
+ hidden: false
+ - variable: readOnly
+ label: "Mount as ReadOnly"
+ description: "prevent any write from being done to the mounted volume"
+ schema:
+ type: boolean
+ default: false
+ hidden: false
+ - variable: emptyDir
+ label: "emptyDir"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ editable: false
+ - variable: mountPath
+ label: "Mount Path"
+ description: "Path to mount inside the pod"
+ schema:
+ type: path
+ required: true
+ default: ""
+ editable: true
+ - variable: hostPath
+ label: "Host Path"
+ schema:
+ type: hostpath
+ required: true
+ - variable: ingress
+ label: ""
+ group: "Reverse Proxy Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "WebUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: certType
+ label: "Select Reverse-Proxy Type"
+ schema:
+ type: string
+ default: "disabled"
+ enum:
+ - value: "disabled"
+ description: "Disabled"
+ - value: ""
+ description: "No Encryption/TLS/Certificates"
+ - value: "selfsigned"
+ description: "Self-Signed Certificate"
+ - value: "ixcert"
+ description: "TrueNAS SCALE Certificate"
+ - variable: type
+ label: "Reverse Proxy Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: true
+ editable: false
+ required: true
+ - variable: serviceName
+ label: "Service name to proxy to"
+ schema:
+ hidden: true
+ editable: false
+ type: string
+ default: ""
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: "websecure"
+ required: true
+ enum:
+ - value: "websecure"
+ description: "Websecure: HTTPS/TLS port 443"
+ - variable: hosts
+ label: "Hosts"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: list
+ default: []
+ items:
+ - variable: host
+ label: "Host"
+ schema:
+ type: dict
+ attrs:
+ - variable: host
+ label: "Domain Name"
+ required: true
+ schema:
+ type: string
+ - variable: path
+ label: "path"
+ schema:
+ type: string
+ required: true
+ hidden: true
+ default: "/"
+ - variable: certificate
+ label: "Select TrueNAS SCALE Certificate"
+ schema:
+ type: int
+ show_if: [["certType", "=", "ixcert"]]
+ $ref:
+ - "definitions/certificate"
+ - variable: authForwardURL
+ label: "Forward Authentication URL"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: ""
+ - variable: PUID
+ group: "Advanced"
+ label: "PUID"
+ description: "Sets the PUID env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: int
+ default: 568
+
+ - variable: PGID
+ group: "Advanced"
+ label: "PGID"
+ description: "Sets the PGID env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: int
+ default: 568
+ - variable: UMASK
+ group: "Advanced"
+ label: "UMASK"
+ description: "Sets the UMASK env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: string
+ default: "002"
+ # Enable privileged
+ - variable: securityContext
+ group: "Advanced"
+ label: "Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: privileged
+ label: "Enable privileged mode for Common-Chart based charts"
+ schema:
+ type: boolean
+ default: false
+ # Set Pod Security Policy
+ - variable: podSecurityContext
+ group: "Advanced"
+ label: "Pod Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: runAsNonRoot
+ label: "runAsNonRoot"
+ schema:
+ type: boolean
+ default: false
+ - variable: runAsUser
+ label: "runAsUser"
+ description: "The UserID of the user running the application"
+ schema:
+ type: int
+ default: 0
+ - variable: runAsGroup
+ label: "runAsGroup"
+ description: The groupID this App of the user running the application"
+ schema:
+ type: int
+ default: 0
+ - variable: supplementalGroups
+ label: "supplementalGroups"
+ description: "Additional groups this App needs access to"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: Group
+ label: "Group"
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroup
+ label: "fsGroup"
+ description: "The group that should own ALL storage."
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroupChangePolicy
+ label: "When should we take ownership?"
+ schema:
+ type: string
+ default: "OnRootMismatch"
+ enum:
+ - value: "OnRootMismatch"
+ description: "OnRootMismatch"
+ - value: "Always"
+ description: "Always"
diff --git a/scale-catalog-template/test/grocy/3.1.5/templates/common.yaml b/scale-catalog-template/test/grocy/3.1.5/templates/common.yaml
new file mode 100644
index 00000000..a6613c2c
--- /dev/null
+++ b/scale-catalog-template/test/grocy/3.1.5/templates/common.yaml
@@ -0,0 +1 @@
+{{ include "common.all" . }}
diff --git a/scale-catalog-template/test/grocy/3.1.5/test_values.yaml b/scale-catalog-template/test/grocy/3.1.5/test_values.yaml
new file mode 100644
index 00000000..a6a2a176
--- /dev/null
+++ b/scale-catalog-template/test/grocy/3.1.5/test_values.yaml
@@ -0,0 +1,35 @@
+# Default values for grocy.
+
+image:
+ repository: linuxserver/grocy
+ tag: version-v2.7.1
+ pullPolicy: IfNotPresent
+
+strategy:
+ type: Recreate
+
+# Configure the Security Context for the Pod
+podSecurityContext:
+ runAsNonRoot: false
+ runAsUser: 0
+ runAsGroup: 0
+ fsGroup: 0
+
+services:
+ main:
+ port:
+ port: 80
+
+env: {}
+ # TZ:
+ # PUID:
+ # PGID:
+
+persistence:
+ config:
+ enabled: true
+ mountPath: "/config"
+ emptyDir: true
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ storageClass: ""
diff --git a/scale-catalog-template/test/grocy/3.1.5/values.yaml b/scale-catalog-template/test/grocy/3.1.5/values.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/scale-catalog-template/test/grocy/item.yaml b/scale-catalog-template/test/grocy/item.yaml
new file mode 100644
index 00000000..fccd77cd
--- /dev/null
+++ b/scale-catalog-template/test/grocy/item.yaml
@@ -0,0 +1,3 @@
+categories:
+ - Home-Automation
+icon_url: https://github.com/grocy/grocy/raw/master/public/img/appicons/mstile-150x150.png
diff --git a/scale-catalog-template/test/heimdall/3.1.5/CONFIG.md b/scale-catalog-template/test/heimdall/3.1.5/CONFIG.md
new file mode 100644
index 00000000..6d760c18
--- /dev/null
+++ b/scale-catalog-template/test/heimdall/3.1.5/CONFIG.md
@@ -0,0 +1,8 @@
+# Configuration Options
+
+##### Connecting to other apps
+If you need to connect this App to other Apps on TrueNAS SCALE, please refer to our "Linking Apps Together" guide:
+https://truecharts.org/manual/linking/
+
+##### Available config options
+In the future this page is going to contain an automated list of options available in the installation/edit UI.
diff --git a/scale-catalog-template/test/heimdall/3.1.5/Chart.lock b/scale-catalog-template/test/heimdall/3.1.5/Chart.lock
new file mode 100644
index 00000000..cacfa930
--- /dev/null
+++ b/scale-catalog-template/test/heimdall/3.1.5/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+digest: sha256:ea66c36be2fa73e56bc33f7e89af9ce338cdfbed0b347484888e87228b825015
+generated: "2021-05-06T13:29:55.828605151Z"
diff --git a/scale-catalog-template/test/heimdall/3.1.5/Chart.yaml b/scale-catalog-template/test/heimdall/3.1.5/Chart.yaml
new file mode 100644
index 00000000..518e04c3
--- /dev/null
+++ b/scale-catalog-template/test/heimdall/3.1.5/Chart.yaml
@@ -0,0 +1,26 @@
+apiVersion: v2
+kubeVersion: ">=1.16.0-0"
+name: heimdall
+version: 3.1.5
+upstream_version: 4.1.1
+appVersion: "auto"
+description: An Application dashboard and launcher
+type: application
+deprecated: false
+home: https://github.com/truecharts/apps/tree/master/incubator/heimdall
+icon: https://i.imgur.com/mM4tcO5.png
+keywords:
+ - heimdall
+sources:
+ - https://github.com/truecharts/apps/tree/master/incubator/heimdall
+ - https://github.com/k8s-at-home/charts/tree/master/charts/heimdall
+dependencies:
+ - name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+ # condition:
+maintainers:
+ - name: TrueCharts
+ email: info@truecharts.org
+ url: truecharts.org
+# annotations:
diff --git a/scale-catalog-template/test/heimdall/3.1.5/README.md b/scale-catalog-template/test/heimdall/3.1.5/README.md
new file mode 100644
index 00000000..d7c114c3
--- /dev/null
+++ b/scale-catalog-template/test/heimdall/3.1.5/README.md
@@ -0,0 +1,54 @@
+# Introduction
+
+![Version: 3.1.5](https://img.shields.io/badge/Version-3.1.5-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: auto](https://img.shields.io/badge/AppVersion-auto-informational?style=flat-square)
+
+An Application dashboard and launcher
+
+TrueCharts are designed to be installed as TrueNAS SCALE app only. We can not guarantee this charts works as a stand-alone helm installation.
+**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/apps/issues/new/choose)**
+
+## Source Code
+
+*
+*
+
+## Requirements
+
+Kubernetes: `>=1.16.0-0`
+
+## Dependencies
+
+| Repository | Name | Version |
+|------------|------|---------|
+| https://truecharts.org/ | common | 3.5.5 |
+
+## Installing the Chart
+
+To install the chart with the release name `heimdall`
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Click "Install" for this specific Apps
+- Fill out the configuration form
+
+## Uninstalling the Chart
+
+To uninstall the `heimdall` deployment
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Go to "Installed Apps"
+- Expand the menu in the top-right corner of this App
+- Click "Remove" for this specific Apps
+
+The command removes all the Kubernetes components associated with the chart **including storage volumes** _(Except hostPath Storage)_ and deletes the release.
+
+## Support
+
+- See the [Wiki](https://truecharts.org)
+- Open a [issue](https://github.com/truecharts/apps/issues/new/choose)
+- Ask a [question](https://github.com/truecharts/apps/discussions)
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
+All Rights Reserved - The TrueCharts Project
diff --git a/scale-catalog-template/test/heimdall/3.1.5/app-readme.md b/scale-catalog-template/test/heimdall/3.1.5/app-readme.md
new file mode 100644
index 00000000..3fb24ea7
--- /dev/null
+++ b/scale-catalog-template/test/heimdall/3.1.5/app-readme.md
@@ -0,0 +1,3 @@
+An Application dashboard and launcher
+This App is supplied by TrueCharts, for more information please visit https://truecharts.org
+An Application dashboard and launcher
diff --git a/scale-catalog-template/test/heimdall/3.1.5/charts/common-3.5.5.tgz b/scale-catalog-template/test/heimdall/3.1.5/charts/common-3.5.5.tgz
new file mode 100644
index 00000000..d01688bb
Binary files /dev/null and b/scale-catalog-template/test/heimdall/3.1.5/charts/common-3.5.5.tgz differ
diff --git a/scale-catalog-template/test/heimdall/3.1.5/ix_values.yaml b/scale-catalog-template/test/heimdall/3.1.5/ix_values.yaml
new file mode 100644
index 00000000..bdcc3ce0
--- /dev/null
+++ b/scale-catalog-template/test/heimdall/3.1.5/ix_values.yaml
@@ -0,0 +1,16 @@
+##
+# This file contains Values.yaml content that gets added to the output of questions.yaml
+# It's ONLY meant for content that the user is NOT expected to change.
+# Example: Everything under "image" is not included in questions.yaml but is included here.
+##
+
+image:
+ repository: linuxserver/heimdall
+ tag: version-2.2.2
+ pullPolicy: IfNotPresent
+
+
+##
+# Most other defaults are set in questions.yaml
+# For other options please refer to the wiki, default_values.yaml or the common library chart
+##
diff --git a/scale-catalog-template/test/heimdall/3.1.5/questions.yaml b/scale-catalog-template/test/heimdall/3.1.5/questions.yaml
new file mode 100644
index 00000000..58181732
--- /dev/null
+++ b/scale-catalog-template/test/heimdall/3.1.5/questions.yaml
@@ -0,0 +1,450 @@
+groups:
+ - name: "Container Image"
+ description: "Image to be used for container"
+ - name: "Workload Configuration"
+ description: "Configure workload deployment"
+ - name: "Configuration"
+ description: "additional container configuration"
+ - name: "Networking"
+ description: "Configure / service for container"
+ - name: "Storage"
+ description: "Persist and share data that is separate from the lifecycle of the container"
+ - name: "Resources and Devices"
+ description: "Specify resources/devices to be allocated to workload"
+ - name: "Reverse Proxy Configuration"
+ description: "Reverse Proxy configuration"
+ - name: "Advanced"
+ description: "Advanced Configuration"
+ - name: "WARNING"
+ description: "WARNING"
+portals:
+ web_portal:
+ protocols:
+ - "$kubernetes-resource_configmap_portal_protocol"
+ host:
+ - "$kubernetes-resource_configmap_portal_host"
+ ports:
+ - "$kubernetes-resource_configmap_portal_port"
+questions:
+ - variable: portal
+ group: "Container Image"
+ label: "Configure Portal Button"
+ schema:
+ type: dict
+ hidden: true
+ attrs:
+ - variable: enabled
+ label: "Enable"
+ description: "enable the portal button"
+ schema:
+ hidden: true
+ editable: false
+ type: boolean
+ default: true
+
+ # Update Policy
+ - variable: strategyType
+ group: "Container Image"
+ label: "Update Strategy"
+ schema:
+ type: string
+ default: "Recreate"
+ enum:
+ - value: "RollingUpdate"
+ description: "Create new pods and then kill old ones"
+ - value: "Recreate"
+ description: "Kill existing pods before creating new ones"
+ # Configure Time Zone
+ - variable: timezone
+ group: "Container Image"
+ label: "Timezone"
+ schema:
+ type: string
+ default: "Etc/UTC"
+ $ref:
+ - "definitions/timezone"
+
+ # Configure Enviroment Variables
+ - variable: environmentVariables
+ label: "Image environment"
+ group: "Configuration"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: environmentVariable
+ label: "Environment Variable"
+ schema:
+ type: dict
+ attrs:
+ - variable: name
+ label: "Name"
+ schema:
+ type: string
+ - variable: value
+ label: "Value"
+ schema:
+ type: string
+ # Enable Host Networking
+ - variable: hostNetwork
+ group: "Networking"
+ label: "Enable Host Networking"
+ schema:
+ type: boolean
+ default: false
+ - variable: services
+ group: "Networking"
+ label: "Configure Service"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "Main service"
+ description: "The Primary service on which the healthcheck runs, often the webUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: false
+ enum:
+ - value: HTTP
+ description: "HTTP"
+ - value: "HTTPS"
+ description: "HTTPS"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 80
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 80
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36033
+ required: true
+## TrueCharts Specific
+ - variable: persistence
+ label: "Integrated Persistent Storage"
+ description: "Websocket Service"
+ group: "Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: config
+ label: "App Config Storage"
+ description: "Stores the Application Configuration."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: "/config"
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "100Gi"
+ - variable: customStorage
+ label: "Custom app storage"
+ group: "Storage"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: volumeMount
+ label: "Custom Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enabled"
+ schema:
+ type: boolean
+ default: true
+ required: true
+ hidden: true
+ editable: false
+ - variable: setPermissions
+ label: "Automatic Permissions"
+ description: "Automatically set permissions on install"
+ schema:
+ type: boolean
+ default: true
+ hidden: false
+ - variable: readOnly
+ label: "Mount as ReadOnly"
+ description: "prevent any write from being done to the mounted volume"
+ schema:
+ type: boolean
+ default: false
+ hidden: false
+ - variable: emptyDir
+ label: "emptyDir"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ editable: false
+ - variable: mountPath
+ label: "Mount Path"
+ description: "Path to mount inside the pod"
+ schema:
+ type: path
+ required: true
+ default: ""
+ editable: true
+ - variable: hostPath
+ label: "Host Path"
+ schema:
+ type: hostpath
+ required: true
+ - variable: ingress
+ label: ""
+ group: "Reverse Proxy Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "WebUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: certType
+ label: "Select Reverse-Proxy Type"
+ schema:
+ type: string
+ default: "disabled"
+ enum:
+ - value: "disabled"
+ description: "Disabled"
+ - value: ""
+ description: "No Encryption/TLS/Certificates"
+ - value: "selfsigned"
+ description: "Self-Signed Certificate"
+ - value: "ixcert"
+ description: "TrueNAS SCALE Certificate"
+ - variable: type
+ label: "Reverse Proxy Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: true
+ editable: false
+ required: true
+ - variable: serviceName
+ label: "Service name to proxy to"
+ schema:
+ hidden: true
+ editable: false
+ type: string
+ default: ""
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: "websecure"
+ required: true
+ enum:
+ - value: "websecure"
+ description: "Websecure: HTTPS/TLS port 443"
+ - variable: hosts
+ label: "Hosts"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: list
+ default: []
+ items:
+ - variable: host
+ label: "Host"
+ schema:
+ type: dict
+ attrs:
+ - variable: host
+ label: "Domain Name"
+ required: true
+ schema:
+ type: string
+ - variable: path
+ label: "path"
+ schema:
+ type: string
+ required: true
+ hidden: true
+ default: "/"
+ - variable: certificate
+ label: "Select TrueNAS SCALE Certificate"
+ schema:
+ type: int
+ show_if: [["certType", "=", "ixcert"]]
+ $ref:
+ - "definitions/certificate"
+ - variable: authForwardURL
+ label: "Forward Authentication URL"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: ""
+ - variable: PUID
+ group: "Advanced"
+ label: "PUID"
+ description: "Sets the PUID env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: int
+ default: 568
+
+ - variable: PGID
+ group: "Advanced"
+ label: "PGID"
+ description: "Sets the PGID env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: int
+ default: 568
+ - variable: UMASK
+ group: "Advanced"
+ label: "UMASK"
+ description: "Sets the UMASK env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: string
+ default: "002"
+ # Enable privileged
+ - variable: securityContext
+ group: "Advanced"
+ label: "Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: privileged
+ label: "Enable privileged mode for Common-Chart based charts"
+ schema:
+ type: boolean
+ default: false
+ # Set Pod Security Policy
+ - variable: podSecurityContext
+ group: "Advanced"
+ label: "Pod Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: runAsNonRoot
+ label: "runAsNonRoot"
+ schema:
+ type: boolean
+ default: false
+ - variable: runAsUser
+ label: "runAsUser"
+ description: "The UserID of the user running the application"
+ schema:
+ type: int
+ default: 0
+ - variable: runAsGroup
+ label: "runAsGroup"
+ description: The groupID this App of the user running the application"
+ schema:
+ type: int
+ default: 0
+ - variable: supplementalGroups
+ label: "supplementalGroups"
+ description: "Additional groups this App needs access to"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: Group
+ label: "Group"
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroup
+ label: "fsGroup"
+ description: "The group that should own ALL storage."
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroupChangePolicy
+ label: "When should we take ownership?"
+ schema:
+ type: string
+ default: "OnRootMismatch"
+ enum:
+ - value: "OnRootMismatch"
+ description: "OnRootMismatch"
+ - value: "Always"
+ description: "Always"
diff --git a/scale-catalog-template/test/heimdall/3.1.5/templates/common.yaml b/scale-catalog-template/test/heimdall/3.1.5/templates/common.yaml
new file mode 100644
index 00000000..a6613c2c
--- /dev/null
+++ b/scale-catalog-template/test/heimdall/3.1.5/templates/common.yaml
@@ -0,0 +1 @@
+{{ include "common.all" . }}
diff --git a/scale-catalog-template/test/heimdall/3.1.5/test_values.yaml b/scale-catalog-template/test/heimdall/3.1.5/test_values.yaml
new file mode 100644
index 00000000..ae76faf7
--- /dev/null
+++ b/scale-catalog-template/test/heimdall/3.1.5/test_values.yaml
@@ -0,0 +1,39 @@
+# Default values for grocy.
+
+image:
+ repository: linuxserver/heimdall
+ tag: version-2.2.2
+ pullPolicy: IfNotPresent
+
+strategy:
+ type: Recreate
+
+# Configure the Security Context for the Pod
+podSecurityContext:
+ runAsNonRoot: false
+ runAsUser: 0
+ runAsGroup: 0
+ fsGroup: 0
+
+services:
+ main:
+ port:
+ port: 80
+
+env: {}
+ # TZ:
+ # PUID:
+ # PGID:
+
+probes:
+ startup:
+ enabled: true
+
+persistence:
+ config:
+ enabled: true
+ mountPath: "/config"
+ emptyDir: true
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ storageClass: ""
diff --git a/scale-catalog-template/test/heimdall/3.1.5/values.yaml b/scale-catalog-template/test/heimdall/3.1.5/values.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/scale-catalog-template/test/heimdall/item.yaml b/scale-catalog-template/test/heimdall/item.yaml
new file mode 100644
index 00000000..6caccc75
--- /dev/null
+++ b/scale-catalog-template/test/heimdall/item.yaml
@@ -0,0 +1,3 @@
+categories:
+ - organizers
+icon_url: https://i.imgur.com/mM4tcO5.png
diff --git a/scale-catalog-template/test/lazylibrarian/3.1.5/CONFIG.md b/scale-catalog-template/test/lazylibrarian/3.1.5/CONFIG.md
new file mode 100644
index 00000000..6d760c18
--- /dev/null
+++ b/scale-catalog-template/test/lazylibrarian/3.1.5/CONFIG.md
@@ -0,0 +1,8 @@
+# Configuration Options
+
+##### Connecting to other apps
+If you need to connect this App to other Apps on TrueNAS SCALE, please refer to our "Linking Apps Together" guide:
+https://truecharts.org/manual/linking/
+
+##### Available config options
+In the future this page is going to contain an automated list of options available in the installation/edit UI.
diff --git a/scale-catalog-template/test/lazylibrarian/3.1.5/Chart.lock b/scale-catalog-template/test/lazylibrarian/3.1.5/Chart.lock
new file mode 100644
index 00000000..65292a03
--- /dev/null
+++ b/scale-catalog-template/test/lazylibrarian/3.1.5/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+digest: sha256:ea66c36be2fa73e56bc33f7e89af9ce338cdfbed0b347484888e87228b825015
+generated: "2021-05-06T13:29:56.313756383Z"
diff --git a/scale-catalog-template/test/lazylibrarian/3.1.5/Chart.yaml b/scale-catalog-template/test/lazylibrarian/3.1.5/Chart.yaml
new file mode 100644
index 00000000..94eca5a2
--- /dev/null
+++ b/scale-catalog-template/test/lazylibrarian/3.1.5/Chart.yaml
@@ -0,0 +1,32 @@
+apiVersion: v2
+kubeVersion: ">=1.16.0-0"
+name: lazylibrarian
+version: 3.1.5
+upstream_version: 2.1.0
+appVersion: "latest"
+description: Get all your books, like series with Sonarr...
+type: application
+deprecated: false
+home: https://github.com/truecharts/apps/tree/master/incubator/lazylibrarian
+icon: https://lazylibrarian.gitlab.io/logo.svg
+keywords:
+ - lazylibrarian
+ - ebooks
+sources:
+ - https://github.com/truecharts/apps/tree/master/incubator/lazylibrarian
+ - https://github.com/k8s-at-home/charts/tree/master/charts/lazylibrarian
+ - https://gitlab.com/LazyLibrarian/LazyLibrarian.git
+ - https://lazylibrarian.gitlab.io
+dependencies:
+ - name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+ # condition:
+maintainers:
+ - name: TrueCharts
+ email: info@truecharts.org
+ url: truecharts.org
+ - name: Ornias1993
+ email: kjeld@schouten-lebbing.nl
+ url: truecharts.org
+# annotations:
diff --git a/scale-catalog-template/test/lazylibrarian/3.1.5/README.md b/scale-catalog-template/test/lazylibrarian/3.1.5/README.md
new file mode 100644
index 00000000..56385ef9
--- /dev/null
+++ b/scale-catalog-template/test/lazylibrarian/3.1.5/README.md
@@ -0,0 +1,56 @@
+# Introduction
+
+![Version: 3.1.5](https://img.shields.io/badge/Version-3.1.5-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: latest](https://img.shields.io/badge/AppVersion-latest-informational?style=flat-square)
+
+Get all your books, like series with Sonarr...
+
+TrueCharts are designed to be installed as TrueNAS SCALE app only. We can not guarantee this charts works as a stand-alone helm installation.
+**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/apps/issues/new/choose)**
+
+## Source Code
+
+*
+*
+*
+*
+
+## Requirements
+
+Kubernetes: `>=1.16.0-0`
+
+## Dependencies
+
+| Repository | Name | Version |
+|------------|------|---------|
+| https://truecharts.org/ | common | 3.5.5 |
+
+## Installing the Chart
+
+To install the chart with the release name `lazylibrarian`
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Click "Install" for this specific Apps
+- Fill out the configuration form
+
+## Uninstalling the Chart
+
+To uninstall the `lazylibrarian` deployment
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Go to "Installed Apps"
+- Expand the menu in the top-right corner of this App
+- Click "Remove" for this specific Apps
+
+The command removes all the Kubernetes components associated with the chart **including storage volumes** _(Except hostPath Storage)_ and deletes the release.
+
+## Support
+
+- See the [Wiki](https://truecharts.org)
+- Open a [issue](https://github.com/truecharts/apps/issues/new/choose)
+- Ask a [question](https://github.com/truecharts/apps/discussions)
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
+All Rights Reserved - The TrueCharts Project
diff --git a/scale-catalog-template/test/lazylibrarian/3.1.5/app-readme.md b/scale-catalog-template/test/lazylibrarian/3.1.5/app-readme.md
new file mode 100644
index 00000000..c67c1844
--- /dev/null
+++ b/scale-catalog-template/test/lazylibrarian/3.1.5/app-readme.md
@@ -0,0 +1,3 @@
+Get all your books, like series with Sonarr...
+This App is supplied by TrueCharts, for more information please visit https://truecharts.org
+Get all your books, like series with Sonarr...
diff --git a/scale-catalog-template/test/lazylibrarian/3.1.5/charts/common-3.5.5.tgz b/scale-catalog-template/test/lazylibrarian/3.1.5/charts/common-3.5.5.tgz
new file mode 100644
index 00000000..d01688bb
Binary files /dev/null and b/scale-catalog-template/test/lazylibrarian/3.1.5/charts/common-3.5.5.tgz differ
diff --git a/scale-catalog-template/test/lazylibrarian/3.1.5/ix_values.yaml b/scale-catalog-template/test/lazylibrarian/3.1.5/ix_values.yaml
new file mode 100644
index 00000000..553b98db
--- /dev/null
+++ b/scale-catalog-template/test/lazylibrarian/3.1.5/ix_values.yaml
@@ -0,0 +1,16 @@
+##
+# This file contains Values.yaml content that gets added to the output of questions.yaml
+# It's ONLY meant for content that the user is NOT expected to change.
+# Example: Everything under "image" is not included in questions.yaml but is included here.
+##
+
+image:
+ repository: linuxserver/lazylibrarian
+ pullPolicy: IfNotPresent
+ tag: latest
+
+
+##
+# Most other defaults are set in questions.yaml
+# For other options please refer to the wiki, default_values.yaml or the common library chart
+##
diff --git a/scale-catalog-template/test/lazylibrarian/3.1.5/questions.yaml b/scale-catalog-template/test/lazylibrarian/3.1.5/questions.yaml
new file mode 100644
index 00000000..248cf4c9
--- /dev/null
+++ b/scale-catalog-template/test/lazylibrarian/3.1.5/questions.yaml
@@ -0,0 +1,451 @@
+groups:
+ - name: "Container Image"
+ description: "Image to be used for container"
+ - name: "Workload Configuration"
+ description: "Configure workload deployment"
+ - name: "Configuration"
+ description: "additional container configuration"
+ - name: "Networking"
+ description: "Configure / service for container"
+ - name: "Storage"
+ description: "Persist and share data that is separate from the lifecycle of the container"
+ - name: "Resources and Devices"
+ description: "Specify resources/devices to be allocated to workload"
+ - name: "Reverse Proxy Configuration"
+ description: "Reverse Proxy configuration"
+ - name: "Advanced"
+ description: "Advanced Configuration"
+ - name: "WARNING"
+ description: "WARNING"
+portals:
+ web_portal:
+ protocols:
+ - "$kubernetes-resource_configmap_portal_protocol"
+ host:
+ - "$kubernetes-resource_configmap_portal_host"
+ ports:
+ - "$kubernetes-resource_configmap_portal_port"
+questions:
+ - variable: portal
+ group: "Container Image"
+ label: "Configure Portal Button"
+ schema:
+ type: dict
+ hidden: true
+ attrs:
+ - variable: enabled
+ label: "Enable"
+ description: "enable the portal button"
+ schema:
+ hidden: true
+ editable: false
+ type: boolean
+ default: true
+
+ # Update Policy
+ - variable: strategyType
+ group: "Container Image"
+ label: "Update Strategy"
+ schema:
+ type: string
+ default: "Recreate"
+ enum:
+ - value: "RollingUpdate"
+ description: "Create new pods and then kill old ones"
+ - value: "Recreate"
+ description: "Kill existing pods before creating new ones"
+ # Configure Time Zone
+ - variable: timezone
+ group: "Container Image"
+ label: "Timezone"
+ schema:
+ type: string
+ default: "Etc/UTC"
+ $ref:
+ - "definitions/timezone"
+
+ # Configure Enviroment Variables
+ - variable: environmentVariables
+ label: "Image environment"
+ group: "Configuration"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: environmentVariable
+ label: "Environment Variable"
+ schema:
+ type: dict
+ attrs:
+ - variable: name
+ label: "Name"
+ schema:
+ type: string
+ - variable: value
+ label: "Value"
+ schema:
+ type: string
+ # Enable Host Networking
+ - variable: hostNetwork
+ group: "Networking"
+ label: "Enable Host Networking"
+ schema:
+ type: boolean
+ default: false
+ - variable: services
+ group: "Networking"
+ label: "Configure Service"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "Main service"
+ description: "The Primary service on which the healthcheck runs, often the webUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: false
+ enum:
+ - value: HTTP
+ description: "HTTP"
+ - value: "HTTPS"
+ description: "HTTPS"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 5299
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 5299
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36033
+ required: true
+## TrueCharts Specific
+ - variable: persistence
+ label: "Integrated Persistent Storage"
+ description: "Websocket Service"
+ group: "Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: config
+ label: "App Config Storage"
+ description: "Stores the Application Configuration."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: "/config"
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "100Gi"
+
+ - variable: customStorage
+ label: "Custom app storage"
+ group: "Storage"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: volumeMount
+ label: "Custom Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enabled"
+ schema:
+ type: boolean
+ default: true
+ required: true
+ hidden: true
+ editable: false
+ - variable: setPermissions
+ label: "Automatic Permissions"
+ description: "Automatically set permissions on install"
+ schema:
+ type: boolean
+ default: true
+ hidden: false
+ - variable: readOnly
+ label: "Mount as ReadOnly"
+ description: "prevent any write from being done to the mounted volume"
+ schema:
+ type: boolean
+ default: false
+ hidden: false
+ - variable: emptyDir
+ label: "emptyDir"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ editable: false
+ - variable: mountPath
+ label: "Mount Path"
+ description: "Path to mount inside the pod"
+ schema:
+ type: path
+ required: true
+ default: ""
+ editable: true
+ - variable: hostPath
+ label: "Host Path"
+ schema:
+ type: hostpath
+ required: true
+ - variable: ingress
+ label: ""
+ group: "Reverse Proxy Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "WebUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: certType
+ label: "Select Reverse-Proxy Type"
+ schema:
+ type: string
+ default: "disabled"
+ enum:
+ - value: "disabled"
+ description: "Disabled"
+ - value: ""
+ description: "No Encryption/TLS/Certificates"
+ - value: "selfsigned"
+ description: "Self-Signed Certificate"
+ - value: "ixcert"
+ description: "TrueNAS SCALE Certificate"
+ - variable: type
+ label: "Reverse Proxy Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: true
+ editable: false
+ required: true
+ - variable: serviceName
+ label: "Service name to proxy to"
+ schema:
+ hidden: true
+ editable: false
+ type: string
+ default: ""
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: "websecure"
+ required: true
+ enum:
+ - value: "websecure"
+ description: "Websecure: HTTPS/TLS port 443"
+ - variable: hosts
+ label: "Hosts"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: list
+ default: []
+ items:
+ - variable: host
+ label: "Host"
+ schema:
+ type: dict
+ attrs:
+ - variable: host
+ label: "Domain Name"
+ required: true
+ schema:
+ type: string
+ - variable: path
+ label: "path"
+ schema:
+ type: string
+ required: true
+ hidden: true
+ default: "/"
+ - variable: certificate
+ label: "Select TrueNAS SCALE Certificate"
+ schema:
+ type: int
+ show_if: [["certType", "=", "ixcert"]]
+ $ref:
+ - "definitions/certificate"
+ - variable: authForwardURL
+ label: "Forward Authentication URL"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: ""
+ - variable: PUID
+ group: "Advanced"
+ label: "PUID"
+ description: "Sets the PUID env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: int
+ default: 568
+
+ - variable: PGID
+ group: "Advanced"
+ label: "PGID"
+ description: "Sets the PGID env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: int
+ default: 568
+ - variable: UMASK
+ group: "Advanced"
+ label: "UMASK"
+ description: "Sets the UMASK env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: string
+ default: "002"
+ # Enable privileged
+ - variable: securityContext
+ group: "Advanced"
+ label: "Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: privileged
+ label: "Enable privileged mode for Common-Chart based charts"
+ schema:
+ type: boolean
+ default: false
+ # Set Pod Security Policy
+ - variable: podSecurityContext
+ group: "Advanced"
+ label: "Pod Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: runAsNonRoot
+ label: "runAsNonRoot"
+ schema:
+ type: boolean
+ default: false
+ - variable: runAsUser
+ label: "runAsUser"
+ description: "The UserID of the user running the application"
+ schema:
+ type: int
+ default: 0
+ - variable: runAsGroup
+ label: "runAsGroup"
+ description: The groupID this App of the user running the application"
+ schema:
+ type: int
+ default: 0
+ - variable: supplementalGroups
+ label: "supplementalGroups"
+ description: "Additional groups this App needs access to"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: Group
+ label: "Group"
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroup
+ label: "fsGroup"
+ description: "The group that should own ALL storage."
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroupChangePolicy
+ label: "When should we take ownership?"
+ schema:
+ type: string
+ default: "OnRootMismatch"
+ enum:
+ - value: "OnRootMismatch"
+ description: "OnRootMismatch"
+ - value: "Always"
+ description: "Always"
diff --git a/scale-catalog-template/test/lazylibrarian/3.1.5/templates/common.yaml b/scale-catalog-template/test/lazylibrarian/3.1.5/templates/common.yaml
new file mode 100644
index 00000000..a6613c2c
--- /dev/null
+++ b/scale-catalog-template/test/lazylibrarian/3.1.5/templates/common.yaml
@@ -0,0 +1 @@
+{{ include "common.all" . }}
diff --git a/scale-catalog-template/test/lazylibrarian/3.1.5/test_values.yaml b/scale-catalog-template/test/lazylibrarian/3.1.5/test_values.yaml
new file mode 100644
index 00000000..23d51564
--- /dev/null
+++ b/scale-catalog-template/test/lazylibrarian/3.1.5/test_values.yaml
@@ -0,0 +1,35 @@
+# Default values for LazyLibrarian.
+
+image:
+ repository: linuxserver/lazylibrarian
+ pullPolicy: IfNotPresent
+ tag: latest
+
+strategy:
+ type: Recreate
+
+# Configure the Security Context for the Pod
+podSecurityContext:
+ runAsNonRoot: false
+ runAsUser: 0
+ runAsGroup: 0
+ fsGroup: 0
+
+services:
+ main:
+ port:
+ port: 5299
+
+env: {}
+ # TZ: UTC
+ # PUID: 1001
+ # PGID: 1001
+
+persistence:
+ config:
+ enabled: true
+ mountPath: "/config"
+ emptyDir: true
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ storageClass: ""
diff --git a/scale-catalog-template/test/lazylibrarian/3.1.5/values.yaml b/scale-catalog-template/test/lazylibrarian/3.1.5/values.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/scale-catalog-template/test/lazylibrarian/item.yaml b/scale-catalog-template/test/lazylibrarian/item.yaml
new file mode 100644
index 00000000..9c98c1c5
--- /dev/null
+++ b/scale-catalog-template/test/lazylibrarian/item.yaml
@@ -0,0 +1,3 @@
+categories:
+ - media
+icon_url: https://lazylibrarian.gitlab.io/logo.svg
diff --git a/scale-catalog-template/test/lychee/3.1.5/CONFIG.md b/scale-catalog-template/test/lychee/3.1.5/CONFIG.md
new file mode 100644
index 00000000..6d760c18
--- /dev/null
+++ b/scale-catalog-template/test/lychee/3.1.5/CONFIG.md
@@ -0,0 +1,8 @@
+# Configuration Options
+
+##### Connecting to other apps
+If you need to connect this App to other Apps on TrueNAS SCALE, please refer to our "Linking Apps Together" guide:
+https://truecharts.org/manual/linking/
+
+##### Available config options
+In the future this page is going to contain an automated list of options available in the installation/edit UI.
diff --git a/scale-catalog-template/test/lychee/3.1.5/Chart.lock b/scale-catalog-template/test/lychee/3.1.5/Chart.lock
new file mode 100644
index 00000000..73850d9b
--- /dev/null
+++ b/scale-catalog-template/test/lychee/3.1.5/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+digest: sha256:ea66c36be2fa73e56bc33f7e89af9ce338cdfbed0b347484888e87228b825015
+generated: "2021-05-06T13:29:56.76465654Z"
diff --git a/scale-catalog-template/test/lychee/3.1.5/Chart.yaml b/scale-catalog-template/test/lychee/3.1.5/Chart.yaml
new file mode 100644
index 00000000..32e24374
--- /dev/null
+++ b/scale-catalog-template/test/lychee/3.1.5/Chart.yaml
@@ -0,0 +1,30 @@
+apiVersion: v2
+kubeVersion: ">=1.16.0-0"
+name: lychee
+version: 3.1.5
+upstream_version: 2.3.1
+appVersion: "auto"
+description: Lychee is a free photo-management tool, which runs on your server or web-space
+type: application
+deprecated: false
+home: https://github.com/truecharts/apps/tree/master/incubator/lychee
+icon: https://github.com/LycheeOrg/Lychee/blob/master/Banner.png?raw=true
+keywords:
+ - lychee
+ - photo
+ - pictures
+sources:
+ - https://github.com/truecharts/apps/tree/master/incubator/lychee
+ - https://github.com/k8s-at-home/charts/tree/master/charts/lychee
+ - https://github.com/LycheeOrg/Lychee
+ - https://hub.docker.com/r/lycheeorg/lychee
+dependencies:
+ - name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+ # condition:
+maintainers:
+ - name: TrueCharts
+ email: info@truecharts.org
+ url: truecharts.org
+# annotations:
diff --git a/scale-catalog-template/test/lychee/3.1.5/README.md b/scale-catalog-template/test/lychee/3.1.5/README.md
new file mode 100644
index 00000000..27772b14
--- /dev/null
+++ b/scale-catalog-template/test/lychee/3.1.5/README.md
@@ -0,0 +1,56 @@
+# Introduction
+
+![Version: 3.1.5](https://img.shields.io/badge/Version-3.1.5-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: auto](https://img.shields.io/badge/AppVersion-auto-informational?style=flat-square)
+
+Lychee is a free photo-management tool, which runs on your server or web-space
+
+TrueCharts are designed to be installed as TrueNAS SCALE app only. We can not guarantee this charts works as a stand-alone helm installation.
+**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/apps/issues/new/choose)**
+
+## Source Code
+
+*
+*
+*
+*
+
+## Requirements
+
+Kubernetes: `>=1.16.0-0`
+
+## Dependencies
+
+| Repository | Name | Version |
+|------------|------|---------|
+| https://truecharts.org/ | common | 3.5.5 |
+
+## Installing the Chart
+
+To install the chart with the release name `lychee`
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Click "Install" for this specific Apps
+- Fill out the configuration form
+
+## Uninstalling the Chart
+
+To uninstall the `lychee` deployment
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Go to "Installed Apps"
+- Expand the menu in the top-right corner of this App
+- Click "Remove" for this specific Apps
+
+The command removes all the Kubernetes components associated with the chart **including storage volumes** _(Except hostPath Storage)_ and deletes the release.
+
+## Support
+
+- See the [Wiki](https://truecharts.org)
+- Open a [issue](https://github.com/truecharts/apps/issues/new/choose)
+- Ask a [question](https://github.com/truecharts/apps/discussions)
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
+All Rights Reserved - The TrueCharts Project
diff --git a/scale-catalog-template/test/lychee/3.1.5/app-readme.md b/scale-catalog-template/test/lychee/3.1.5/app-readme.md
new file mode 100644
index 00000000..b420d9b3
--- /dev/null
+++ b/scale-catalog-template/test/lychee/3.1.5/app-readme.md
@@ -0,0 +1,3 @@
+Lychee is a free photo-management tool, which runs on your server or web-space
+This App is supplied by TrueCharts, for more information please visit https://truecharts.org
+Lychee is a free photo-management tool, which runs on your server or web-space
diff --git a/scale-catalog-template/test/lychee/3.1.5/charts/common-3.5.5.tgz b/scale-catalog-template/test/lychee/3.1.5/charts/common-3.5.5.tgz
new file mode 100644
index 00000000..d01688bb
Binary files /dev/null and b/scale-catalog-template/test/lychee/3.1.5/charts/common-3.5.5.tgz differ
diff --git a/scale-catalog-template/test/lychee/3.1.5/ix_values.yaml b/scale-catalog-template/test/lychee/3.1.5/ix_values.yaml
new file mode 100644
index 00000000..63bb15fa
--- /dev/null
+++ b/scale-catalog-template/test/lychee/3.1.5/ix_values.yaml
@@ -0,0 +1,16 @@
+##
+# This file contains Values.yaml content that gets added to the output of questions.yaml
+# It's ONLY meant for content that the user is NOT expected to change.
+# Example: Everything under "image" is not included in questions.yaml but is included here.
+##
+
+image:
+ repository: lycheeorg/lychee-laravel
+ pullPolicy: IfNotPresent
+ tag: v4.3.0
+
+
+##
+# Most other defaults are set in questions.yaml
+# For other options please refer to the wiki, default_values.yaml or the common library chart
+##
diff --git a/scale-catalog-template/test/lychee/3.1.5/questions.yaml b/scale-catalog-template/test/lychee/3.1.5/questions.yaml
new file mode 100644
index 00000000..53e656bb
--- /dev/null
+++ b/scale-catalog-template/test/lychee/3.1.5/questions.yaml
@@ -0,0 +1,450 @@
+groups:
+ - name: "Container Image"
+ description: "Image to be used for container"
+ - name: "Workload Configuration"
+ description: "Configure workload deployment"
+ - name: "Configuration"
+ description: "additional container configuration"
+ - name: "Networking"
+ description: "Configure / service for container"
+ - name: "Storage"
+ description: "Persist and share data that is separate from the lifecycle of the container"
+ - name: "Resources and Devices"
+ description: "Specify resources/devices to be allocated to workload"
+ - name: "Reverse Proxy Configuration"
+ description: "Reverse Proxy configuration"
+ - name: "Advanced"
+ description: "Advanced Configuration"
+ - name: "WARNING"
+ description: "WARNING"
+portals:
+ web_portal:
+ protocols:
+ - "$kubernetes-resource_configmap_portal_protocol"
+ host:
+ - "$kubernetes-resource_configmap_portal_host"
+ ports:
+ - "$kubernetes-resource_configmap_portal_port"
+questions:
+ - variable: portal
+ group: "Container Image"
+ label: "Configure Portal Button"
+ schema:
+ type: dict
+ hidden: true
+ attrs:
+ - variable: enabled
+ label: "Enable"
+ description: "enable the portal button"
+ schema:
+ hidden: true
+ editable: false
+ type: boolean
+ default: true
+
+ # Update Policy
+ - variable: strategyType
+ group: "Container Image"
+ label: "Update Strategy"
+ schema:
+ type: string
+ default: "Recreate"
+ enum:
+ - value: "RollingUpdate"
+ description: "Create new pods and then kill old ones"
+ - value: "Recreate"
+ description: "Kill existing pods before creating new ones"
+ # Configure Time Zone
+ - variable: timezone
+ group: "Container Image"
+ label: "Timezone"
+ schema:
+ type: string
+ default: "Etc/UTC"
+ $ref:
+ - "definitions/timezone"
+
+ # Configure Enviroment Variables
+ - variable: environmentVariables
+ label: "Image environment"
+ group: "Configuration"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: environmentVariable
+ label: "Environment Variable"
+ schema:
+ type: dict
+ attrs:
+ - variable: name
+ label: "Name"
+ schema:
+ type: string
+ - variable: value
+ label: "Value"
+ schema:
+ type: string
+ # Enable Host Networking
+ - variable: hostNetwork
+ group: "Networking"
+ label: "Enable Host Networking"
+ schema:
+ type: boolean
+ default: false
+ - variable: services
+ group: "Networking"
+ label: "Configure Service"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "Main service"
+ description: "The Primary service on which the healthcheck runs, often the webUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: false
+ enum:
+ - value: HTTP
+ description: "HTTP"
+ - value: "HTTPS"
+ description: "HTTPS"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 80
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 80
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36034
+ required: true
+## TrueCharts Specific
+ - variable: persistence
+ label: "Integrated Persistent Storage"
+ description: "Websocket Service"
+ group: "Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: config
+ label: "App Config Storage"
+ description: "Stores the Application Configuration."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: "/config"
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "100Gi"
+ - variable: customStorage
+ label: "Custom app storage"
+ group: "Storage"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: volumeMount
+ label: "Custom Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enabled"
+ schema:
+ type: boolean
+ default: true
+ required: true
+ hidden: true
+ editable: false
+ - variable: setPermissions
+ label: "Automatic Permissions"
+ description: "Automatically set permissions on install"
+ schema:
+ type: boolean
+ default: true
+ hidden: false
+ - variable: readOnly
+ label: "Mount as ReadOnly"
+ description: "prevent any write from being done to the mounted volume"
+ schema:
+ type: boolean
+ default: false
+ hidden: false
+ - variable: emptyDir
+ label: "emptyDir"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ editable: false
+ - variable: mountPath
+ label: "Mount Path"
+ description: "Path to mount inside the pod"
+ schema:
+ type: path
+ required: true
+ default: ""
+ editable: true
+ - variable: hostPath
+ label: "Host Path"
+ schema:
+ type: hostpath
+ required: true
+ - variable: ingress
+ label: ""
+ group: "Reverse Proxy Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "WebUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: certType
+ label: "Select Reverse-Proxy Type"
+ schema:
+ type: string
+ default: "disabled"
+ enum:
+ - value: "disabled"
+ description: "Disabled"
+ - value: ""
+ description: "No Encryption/TLS/Certificates"
+ - value: "selfsigned"
+ description: "Self-Signed Certificate"
+ - value: "ixcert"
+ description: "TrueNAS SCALE Certificate"
+ - variable: type
+ label: "Reverse Proxy Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: true
+ editable: false
+ required: true
+ - variable: serviceName
+ label: "Service name to proxy to"
+ schema:
+ hidden: true
+ editable: false
+ type: string
+ default: ""
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: "websecure"
+ required: true
+ enum:
+ - value: "websecure"
+ description: "Websecure: HTTPS/TLS port 443"
+ - variable: hosts
+ label: "Hosts"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: list
+ default: []
+ items:
+ - variable: host
+ label: "Host"
+ schema:
+ type: dict
+ attrs:
+ - variable: host
+ label: "Domain Name"
+ required: true
+ schema:
+ type: string
+ - variable: path
+ label: "path"
+ schema:
+ type: string
+ required: true
+ hidden: true
+ default: "/"
+ - variable: certificate
+ label: "Select TrueNAS SCALE Certificate"
+ schema:
+ type: int
+ show_if: [["certType", "=", "ixcert"]]
+ $ref:
+ - "definitions/certificate"
+ - variable: authForwardURL
+ label: "Forward Authentication URL"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: ""
+ - variable: PUID
+ group: "Advanced"
+ label: "PUID"
+ description: "Sets the PUID env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: int
+ default: 568
+
+ - variable: PGID
+ group: "Advanced"
+ label: "PGID"
+ description: "Sets the PGID env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: int
+ default: 568
+ - variable: UMASK
+ group: "Advanced"
+ label: "UMASK"
+ description: "Sets the UMASK env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: string
+ default: "002"
+ # Enable privileged
+ - variable: securityContext
+ group: "Advanced"
+ label: "Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: privileged
+ label: "Enable privileged mode for Common-Chart based charts"
+ schema:
+ type: boolean
+ default: false
+ # Set Pod Security Policy
+ - variable: podSecurityContext
+ group: "Advanced"
+ label: "Pod Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: runAsNonRoot
+ label: "runAsNonRoot"
+ schema:
+ type: boolean
+ default: false
+ - variable: runAsUser
+ label: "runAsUser"
+ description: "The UserID of the user running the application"
+ schema:
+ type: int
+ default: 0
+ - variable: runAsGroup
+ label: "runAsGroup"
+ description: The groupID this App of the user running the application"
+ schema:
+ type: int
+ default: 0
+ - variable: supplementalGroups
+ label: "supplementalGroups"
+ description: "Additional groups this App needs access to"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: Group
+ label: "Group"
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroup
+ label: "fsGroup"
+ description: "The group that should own ALL storage."
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroupChangePolicy
+ label: "When should we take ownership?"
+ schema:
+ type: string
+ default: "OnRootMismatch"
+ enum:
+ - value: "OnRootMismatch"
+ description: "OnRootMismatch"
+ - value: "Always"
+ description: "Always"
diff --git a/scale-catalog-template/test/lychee/3.1.5/templates/common.yaml b/scale-catalog-template/test/lychee/3.1.5/templates/common.yaml
new file mode 100644
index 00000000..a6613c2c
--- /dev/null
+++ b/scale-catalog-template/test/lychee/3.1.5/templates/common.yaml
@@ -0,0 +1 @@
+{{ include "common.all" . }}
diff --git a/scale-catalog-template/test/lychee/3.1.5/test_values.yaml b/scale-catalog-template/test/lychee/3.1.5/test_values.yaml
new file mode 100644
index 00000000..d333576f
--- /dev/null
+++ b/scale-catalog-template/test/lychee/3.1.5/test_values.yaml
@@ -0,0 +1,35 @@
+# Default values for Lychee.
+
+image:
+ repository: lycheeorg/lychee-laravel
+ pullPolicy: IfNotPresent
+ tag: v4.3.0
+
+strategy:
+ type: Recreate
+
+# Configure the Security Context for the Pod
+podSecurityContext:
+ runAsNonRoot: false
+ runAsUser: 0
+ runAsGroup: 0
+ fsGroup: 0
+
+services:
+ main:
+ port:
+ port: 80
+
+env: {}
+ # PHP_TZ: UTC
+ # PUID: 1001
+ # PGID: 1001
+
+persistence:
+ config:
+ enabled: true
+ mountPath: "/config"
+ emptyDir: true
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ storageClass: ""
diff --git a/scale-catalog-template/test/lychee/3.1.5/values.yaml b/scale-catalog-template/test/lychee/3.1.5/values.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/scale-catalog-template/test/lychee/item.yaml b/scale-catalog-template/test/lychee/item.yaml
new file mode 100644
index 00000000..f4a427e5
--- /dev/null
+++ b/scale-catalog-template/test/lychee/item.yaml
@@ -0,0 +1,3 @@
+categories:
+ - media
+icon_url: https://github.com/LycheeOrg/Lychee/blob/master/Banner.png?raw=true
diff --git a/scale-catalog-template/test/navidrome/3.1.5/CONFIG.md b/scale-catalog-template/test/navidrome/3.1.5/CONFIG.md
new file mode 100644
index 00000000..6d760c18
--- /dev/null
+++ b/scale-catalog-template/test/navidrome/3.1.5/CONFIG.md
@@ -0,0 +1,8 @@
+# Configuration Options
+
+##### Connecting to other apps
+If you need to connect this App to other Apps on TrueNAS SCALE, please refer to our "Linking Apps Together" guide:
+https://truecharts.org/manual/linking/
+
+##### Available config options
+In the future this page is going to contain an automated list of options available in the installation/edit UI.
diff --git a/scale-catalog-template/test/navidrome/3.1.5/Chart.lock b/scale-catalog-template/test/navidrome/3.1.5/Chart.lock
new file mode 100644
index 00000000..7bc1bf1a
--- /dev/null
+++ b/scale-catalog-template/test/navidrome/3.1.5/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+digest: sha256:ea66c36be2fa73e56bc33f7e89af9ce338cdfbed0b347484888e87228b825015
+generated: "2021-05-06T13:29:57.203494707Z"
diff --git a/scale-catalog-template/test/navidrome/3.1.5/Chart.yaml b/scale-catalog-template/test/navidrome/3.1.5/Chart.yaml
new file mode 100644
index 00000000..72932899
--- /dev/null
+++ b/scale-catalog-template/test/navidrome/3.1.5/Chart.yaml
@@ -0,0 +1,30 @@
+apiVersion: v2
+kubeVersion: ">=1.16.0-0"
+name: navidrome
+version: 3.1.5
+upstream_version: 2.3.1
+appVersion: "auto"
+description: Navidrome is an open source web-based music collection server and streamer
+type: application
+deprecated: false
+home: https://github.com/truecharts/apps/tree/master/incubator/navidrome
+icon: https://raw.githubusercontent.com/navidrome/navidrome/v0.42.0/ui/src/icons/android-icon-192x192.png
+keywords:
+ - navidrome
+ - music
+ - streaming
+sources:
+ - https://github.com/truecharts/apps/tree/master/incubator/navidrome
+ - https://github.com/k8s-at-home/charts/tree/master/charts/navidrome
+ - https://github.com/deluan/navidrome
+ - https://hub.docker.com/r/deluan/navidrome
+dependencies:
+ - name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+ # condition:
+maintainers:
+ - name: TrueCharts
+ email: info@truecharts.org
+ url: truecharts.org
+# annotations:
diff --git a/scale-catalog-template/test/navidrome/3.1.5/README.md b/scale-catalog-template/test/navidrome/3.1.5/README.md
new file mode 100644
index 00000000..5e5e1c74
--- /dev/null
+++ b/scale-catalog-template/test/navidrome/3.1.5/README.md
@@ -0,0 +1,56 @@
+# Introduction
+
+![Version: 3.1.5](https://img.shields.io/badge/Version-3.1.5-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: auto](https://img.shields.io/badge/AppVersion-auto-informational?style=flat-square)
+
+Navidrome is an open source web-based music collection server and streamer
+
+TrueCharts are designed to be installed as TrueNAS SCALE app only. We can not guarantee this charts works as a stand-alone helm installation.
+**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/apps/issues/new/choose)**
+
+## Source Code
+
+*
+*
+*
+*
+
+## Requirements
+
+Kubernetes: `>=1.16.0-0`
+
+## Dependencies
+
+| Repository | Name | Version |
+|------------|------|---------|
+| https://truecharts.org/ | common | 3.5.5 |
+
+## Installing the Chart
+
+To install the chart with the release name `navidrome`
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Click "Install" for this specific Apps
+- Fill out the configuration form
+
+## Uninstalling the Chart
+
+To uninstall the `navidrome` deployment
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Go to "Installed Apps"
+- Expand the menu in the top-right corner of this App
+- Click "Remove" for this specific Apps
+
+The command removes all the Kubernetes components associated with the chart **including storage volumes** _(Except hostPath Storage)_ and deletes the release.
+
+## Support
+
+- See the [Wiki](https://truecharts.org)
+- Open a [issue](https://github.com/truecharts/apps/issues/new/choose)
+- Ask a [question](https://github.com/truecharts/apps/discussions)
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
+All Rights Reserved - The TrueCharts Project
diff --git a/scale-catalog-template/test/navidrome/3.1.5/app-readme.md b/scale-catalog-template/test/navidrome/3.1.5/app-readme.md
new file mode 100644
index 00000000..4f10b994
--- /dev/null
+++ b/scale-catalog-template/test/navidrome/3.1.5/app-readme.md
@@ -0,0 +1,3 @@
+Navidrome is an open source web-based music collection server and streamer
+This App is supplied by TrueCharts, for more information please visit https://truecharts.org
+Navidrome is an open source web-based music collection server and streamer
diff --git a/scale-catalog-template/test/navidrome/3.1.5/charts/common-3.5.5.tgz b/scale-catalog-template/test/navidrome/3.1.5/charts/common-3.5.5.tgz
new file mode 100644
index 00000000..d01688bb
Binary files /dev/null and b/scale-catalog-template/test/navidrome/3.1.5/charts/common-3.5.5.tgz differ
diff --git a/scale-catalog-template/test/navidrome/3.1.5/ix_values.yaml b/scale-catalog-template/test/navidrome/3.1.5/ix_values.yaml
new file mode 100644
index 00000000..e473a71b
--- /dev/null
+++ b/scale-catalog-template/test/navidrome/3.1.5/ix_values.yaml
@@ -0,0 +1,15 @@
+##
+# This file contains Values.yaml content that gets added to the output of questions.yaml
+# It's ONLY meant for content that the user is NOT expected to change.
+# Example: Everything under "image" is not included in questions.yaml but is included here.
+##
+
+image:
+ repository: deluan/navidrome
+ pullPolicy: IfNotPresent
+ tag: 0.42.1
+
+##
+# Most other defaults are set in questions.yaml
+# For other options please refer to the wiki, default_values.yaml or the common library chart
+##
diff --git a/scale-catalog-template/test/navidrome/3.1.5/questions.yaml b/scale-catalog-template/test/navidrome/3.1.5/questions.yaml
new file mode 100644
index 00000000..8758663b
--- /dev/null
+++ b/scale-catalog-template/test/navidrome/3.1.5/questions.yaml
@@ -0,0 +1,436 @@
+groups:
+ - name: "Container Image"
+ description: "Image to be used for container"
+ - name: "Workload Configuration"
+ description: "Configure workload deployment"
+ - name: "Configuration"
+ description: "additional container configuration"
+ - name: "Networking"
+ description: "Configure / service for container"
+ - name: "Storage"
+ description: "Persist and share data that is separate from the lifecycle of the container"
+ - name: "Resources and Devices"
+ description: "Specify resources/devices to be allocated to workload"
+ - name: "Reverse Proxy Configuration"
+ description: "Reverse Proxy configuration"
+ - name: "Advanced"
+ description: "Advanced Configuration"
+ - name: "WARNING"
+ description: "WARNING"
+portals:
+ web_portal:
+ protocols:
+ - "$kubernetes-resource_configmap_portal_protocol"
+ host:
+ - "$kubernetes-resource_configmap_portal_host"
+ ports:
+ - "$kubernetes-resource_configmap_portal_port"
+questions:
+ - variable: portal
+ group: "Container Image"
+ label: "Configure Portal Button"
+ schema:
+ type: dict
+ hidden: true
+ attrs:
+ - variable: enabled
+ label: "Enable"
+ description: "enable the portal button"
+ schema:
+ hidden: true
+ editable: false
+ type: boolean
+ default: true
+
+ # Update Policy
+ - variable: strategyType
+ group: "Container Image"
+ label: "Update Strategy"
+ schema:
+ type: string
+ default: "Recreate"
+ enum:
+ - value: "RollingUpdate"
+ description: "Create new pods and then kill old ones"
+ - value: "Recreate"
+ description: "Kill existing pods before creating new ones"
+ # Configure Time Zone
+ - variable: timezone
+ group: "Container Image"
+ label: "Timezone"
+ schema:
+ type: string
+ default: "Etc/UTC"
+ $ref:
+ - "definitions/timezone"
+
+ # Configure Enviroment Variables
+ - variable: environmentVariables
+ label: "Image environment"
+ group: "Configuration"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: environmentVariable
+ label: "Environment Variable"
+ schema:
+ type: dict
+ attrs:
+ - variable: name
+ label: "Name"
+ schema:
+ type: string
+ - variable: value
+ label: "Value"
+ schema:
+ type: string
+ # Enable Host Networking
+ - variable: hostNetwork
+ group: "Networking"
+ label: "Enable Host Networking"
+ schema:
+ type: boolean
+ default: false
+ - variable: services
+ group: "Networking"
+ label: "Configure Service"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "Main service"
+ description: "The Primary service on which the healthcheck runs, often the webUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: false
+ enum:
+ - value: HTTP
+ description: "HTTP"
+ - value: "HTTPS"
+ description: "HTTPS"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 4533
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 4533
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36027
+ required: true
+## TrueCharts Specific
+ - variable: persistence
+ label: "Integrated Persistent Storage"
+ description: "Websocket Service"
+ group: "Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: data
+ label: "App Config Storage"
+ description: "Stores the Application Configuration."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: "/data"
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "100Gi"
+ - variable: customStorage
+ label: "Custom app storage"
+ group: "Storage"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: volumeMount
+ label: "Custom Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enabled"
+ schema:
+ type: boolean
+ default: true
+ required: true
+ hidden: true
+ editable: false
+ - variable: setPermissions
+ label: "Automatic Permissions"
+ description: "Automatically set permissions on install"
+ schema:
+ type: boolean
+ default: true
+ hidden: false
+ - variable: readOnly
+ label: "Mount as ReadOnly"
+ description: "prevent any write from being done to the mounted volume"
+ schema:
+ type: boolean
+ default: false
+ hidden: false
+ - variable: emptyDir
+ label: "emptyDir"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ editable: false
+ - variable: mountPath
+ label: "Mount Path"
+ description: "Path to mount inside the pod"
+ schema:
+ type: path
+ required: true
+ default: ""
+ editable: true
+ - variable: hostPath
+ label: "Host Path"
+ schema:
+ type: hostpath
+ required: true
+ - variable: ingress
+ label: ""
+ group: "Reverse Proxy Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "WebUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: certType
+ label: "Select Reverse-Proxy Type"
+ schema:
+ type: string
+ default: "disabled"
+ enum:
+ - value: "disabled"
+ description: "Disabled"
+ - value: ""
+ description: "No Encryption/TLS/Certificates"
+ - value: "selfsigned"
+ description: "Self-Signed Certificate"
+ - value: "ixcert"
+ description: "TrueNAS SCALE Certificate"
+ - variable: type
+ label: "Reverse Proxy Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: true
+ editable: false
+ required: true
+ - variable: serviceName
+ label: "Service name to proxy to"
+ schema:
+ hidden: true
+ editable: false
+ type: string
+ default: ""
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: "websecure"
+ required: true
+ enum:
+ - value: "websecure"
+ description: "Websecure: HTTPS/TLS port 443"
+ - variable: hosts
+ label: "Hosts"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: list
+ default: []
+ items:
+ - variable: host
+ label: "Host"
+ schema:
+ type: dict
+ attrs:
+ - variable: host
+ label: "Domain Name"
+ required: true
+ schema:
+ type: string
+ - variable: path
+ label: "path"
+ schema:
+ type: string
+ required: true
+ hidden: true
+ default: "/"
+ - variable: certificate
+ label: "Select TrueNAS SCALE Certificate"
+ schema:
+ type: int
+ show_if: [["certType", "=", "ixcert"]]
+ $ref:
+ - "definitions/certificate"
+ - variable: authForwardURL
+ label: "Forward Authentication URL"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: ""
+
+ - variable: UMASK
+ group: "Advanced"
+ label: "UMASK"
+ description: "Sets the UMASK env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: string
+ default: "002"
+ # Enable privileged
+ - variable: securityContext
+ group: "Advanced"
+ label: "Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: privileged
+ label: "Enable privileged mode for Common-Chart based charts"
+ schema:
+ type: boolean
+ default: false
+ # Set Pod Security Policy
+ - variable: podSecurityContext
+ group: "Advanced"
+ label: "Pod Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: runAsNonRoot
+ label: "runAsNonRoot"
+ schema:
+ type: boolean
+ default: true
+ - variable: runAsUser
+ label: "runAsUser"
+ description: "The UserID of the user running the application"
+ schema:
+ type: int
+ default: 568
+ - variable: runAsGroup
+ label: "runAsGroup"
+ description: The groupID this App of the user running the application"
+ schema:
+ type: int
+ default: 568
+ - variable: supplementalGroups
+ label: "supplementalGroups"
+ description: "Additional groups this App needs access to"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: Group
+ label: "Group"
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroup
+ label: "fsGroup"
+ description: "The group that should own ALL storage."
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroupChangePolicy
+ label: "When should we take ownership?"
+ schema:
+ type: string
+ default: "OnRootMismatch"
+ enum:
+ - value: "OnRootMismatch"
+ description: "OnRootMismatch"
+ - value: "Always"
+ description: "Always"
diff --git a/scale-catalog-template/test/navidrome/3.1.5/templates/common.yaml b/scale-catalog-template/test/navidrome/3.1.5/templates/common.yaml
new file mode 100644
index 00000000..a6613c2c
--- /dev/null
+++ b/scale-catalog-template/test/navidrome/3.1.5/templates/common.yaml
@@ -0,0 +1 @@
+{{ include "common.all" . }}
diff --git a/scale-catalog-template/test/navidrome/3.1.5/test_values.yaml b/scale-catalog-template/test/navidrome/3.1.5/test_values.yaml
new file mode 100644
index 00000000..2446a844
--- /dev/null
+++ b/scale-catalog-template/test/navidrome/3.1.5/test_values.yaml
@@ -0,0 +1,30 @@
+# Default values for Navidrome.
+
+image:
+ repository: deluan/navidrome
+ pullPolicy: IfNotPresent
+ tag: 0.42.1
+
+strategy:
+ type: Recreate
+
+services:
+ main:
+ port:
+ port: 4533
+
+env:
+ ND_SCANINTERVAL: "15m"
+ ND_LOGLEVEL: "info"
+ ND_SESSIONTIMEOUT: "24h"
+ ND_ENABLETRANSCODINGCONFIG: "true"
+ ND_MUSICFOLDER: "/music"
+
+persistence:
+ data:
+ enabled: true
+ mountPath: "/data"
+ emptyDir: true
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ storageClass: ""
diff --git a/scale-catalog-template/test/navidrome/3.1.5/values.yaml b/scale-catalog-template/test/navidrome/3.1.5/values.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/scale-catalog-template/test/navidrome/item.yaml b/scale-catalog-template/test/navidrome/item.yaml
new file mode 100644
index 00000000..576fa6c3
--- /dev/null
+++ b/scale-catalog-template/test/navidrome/item.yaml
@@ -0,0 +1,3 @@
+categories:
+ - media
+icon_url: https://raw.githubusercontent.com/navidrome/navidrome/v0.42.0/ui/src/icons/android-icon-192x192.png
diff --git a/scale-catalog-template/test/node-red/3.1.5/CONFIG.md b/scale-catalog-template/test/node-red/3.1.5/CONFIG.md
new file mode 100644
index 00000000..6d760c18
--- /dev/null
+++ b/scale-catalog-template/test/node-red/3.1.5/CONFIG.md
@@ -0,0 +1,8 @@
+# Configuration Options
+
+##### Connecting to other apps
+If you need to connect this App to other Apps on TrueNAS SCALE, please refer to our "Linking Apps Together" guide:
+https://truecharts.org/manual/linking/
+
+##### Available config options
+In the future this page is going to contain an automated list of options available in the installation/edit UI.
diff --git a/scale-catalog-template/test/node-red/3.1.5/Chart.lock b/scale-catalog-template/test/node-red/3.1.5/Chart.lock
new file mode 100644
index 00000000..97540c4a
--- /dev/null
+++ b/scale-catalog-template/test/node-red/3.1.5/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+digest: sha256:ea66c36be2fa73e56bc33f7e89af9ce338cdfbed0b347484888e87228b825015
+generated: "2021-05-06T13:29:57.699027831Z"
diff --git a/scale-catalog-template/test/node-red/3.1.5/Chart.yaml b/scale-catalog-template/test/node-red/3.1.5/Chart.yaml
new file mode 100644
index 00000000..fc4384e3
--- /dev/null
+++ b/scale-catalog-template/test/node-red/3.1.5/Chart.yaml
@@ -0,0 +1,28 @@
+apiVersion: v2
+kubeVersion: ">=1.16.0-0"
+name: node-red
+version: 3.1.5
+upstream_version: 5.2.1
+appVersion: "auto"
+description: Node-RED is low-code programming for event-driven applications
+type: application
+deprecated: false
+home: https://github.com/truecharts/apps/tree/master/incubator/node-red
+icon: https://nodered.org/about/resources/media/node-red-icon-2.png
+keywords:
+ - node-red
+ - nodered
+sources:
+ - https://github.com/truecharts/apps/tree/master/incubator/node-red
+ - https://github.com/k8s-at-home/charts/tree/master/charts/node-red
+ - https://github.com/node-red/node-red-docker
+dependencies:
+ - name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+ # condition:
+maintainers:
+ - name: TrueCharts
+ email: info@truecharts.org
+ url: truecharts.org
+# annotations:
diff --git a/scale-catalog-template/test/node-red/3.1.5/README.md b/scale-catalog-template/test/node-red/3.1.5/README.md
new file mode 100644
index 00000000..ef5216e0
--- /dev/null
+++ b/scale-catalog-template/test/node-red/3.1.5/README.md
@@ -0,0 +1,55 @@
+# Introduction
+
+![Version: 3.1.5](https://img.shields.io/badge/Version-3.1.5-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: auto](https://img.shields.io/badge/AppVersion-auto-informational?style=flat-square)
+
+Node-RED is low-code programming for event-driven applications
+
+TrueCharts are designed to be installed as TrueNAS SCALE app only. We can not guarantee this charts works as a stand-alone helm installation.
+**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/apps/issues/new/choose)**
+
+## Source Code
+
+*
+*
+*
+
+## Requirements
+
+Kubernetes: `>=1.16.0-0`
+
+## Dependencies
+
+| Repository | Name | Version |
+|------------|------|---------|
+| https://truecharts.org/ | common | 3.5.5 |
+
+## Installing the Chart
+
+To install the chart with the release name `node-red`
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Click "Install" for this specific Apps
+- Fill out the configuration form
+
+## Uninstalling the Chart
+
+To uninstall the `node-red` deployment
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Go to "Installed Apps"
+- Expand the menu in the top-right corner of this App
+- Click "Remove" for this specific Apps
+
+The command removes all the Kubernetes components associated with the chart **including storage volumes** _(Except hostPath Storage)_ and deletes the release.
+
+## Support
+
+- See the [Wiki](https://truecharts.org)
+- Open a [issue](https://github.com/truecharts/apps/issues/new/choose)
+- Ask a [question](https://github.com/truecharts/apps/discussions)
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
+All Rights Reserved - The TrueCharts Project
diff --git a/scale-catalog-template/test/node-red/3.1.5/app-readme.md b/scale-catalog-template/test/node-red/3.1.5/app-readme.md
new file mode 100644
index 00000000..6ecbe710
--- /dev/null
+++ b/scale-catalog-template/test/node-red/3.1.5/app-readme.md
@@ -0,0 +1,3 @@
+Node-RED is low-code programming for event-driven applications
+This App is supplied by TrueCharts, for more information please visit https://truecharts.org
+Node-RED is low-code programming for event-driven applications
diff --git a/scale-catalog-template/test/node-red/3.1.5/charts/common-3.5.5.tgz b/scale-catalog-template/test/node-red/3.1.5/charts/common-3.5.5.tgz
new file mode 100644
index 00000000..d01688bb
Binary files /dev/null and b/scale-catalog-template/test/node-red/3.1.5/charts/common-3.5.5.tgz differ
diff --git a/scale-catalog-template/test/node-red/3.1.5/ix_values.yaml b/scale-catalog-template/test/node-red/3.1.5/ix_values.yaml
new file mode 100644
index 00000000..48dd3201
--- /dev/null
+++ b/scale-catalog-template/test/node-red/3.1.5/ix_values.yaml
@@ -0,0 +1,15 @@
+##
+# This file contains Values.yaml content that gets added to the output of questions.yaml
+# It's ONLY meant for content that the user is NOT expected to change.
+# Example: Everything under "image" is not included in questions.yaml but is included here.
+##
+
+image:
+ repository: nodered/node-red
+ pullPolicy: IfNotPresent
+ tag: 1.3.4
+
+##
+# Most other defaults are set in questions.yaml
+# For other options please refer to the wiki, default_values.yaml or the common library chart
+##
diff --git a/scale-catalog-template/test/node-red/3.1.5/questions.yaml b/scale-catalog-template/test/node-red/3.1.5/questions.yaml
new file mode 100644
index 00000000..eb29b285
--- /dev/null
+++ b/scale-catalog-template/test/node-red/3.1.5/questions.yaml
@@ -0,0 +1,436 @@
+groups:
+ - name: "Container Image"
+ description: "Image to be used for container"
+ - name: "Workload Configuration"
+ description: "Configure workload deployment"
+ - name: "Configuration"
+ description: "additional container configuration"
+ - name: "Networking"
+ description: "Configure / service for container"
+ - name: "Storage"
+ description: "Persist and share data that is separate from the lifecycle of the container"
+ - name: "Resources and Devices"
+ description: "Specify resources/devices to be allocated to workload"
+ - name: "Reverse Proxy Configuration"
+ description: "Reverse Proxy configuration"
+ - name: "Advanced"
+ description: "Advanced Configuration"
+ - name: "WARNING"
+ description: "WARNING"
+portals:
+ web_portal:
+ protocols:
+ - "$kubernetes-resource_configmap_portal_protocol"
+ host:
+ - "$kubernetes-resource_configmap_portal_host"
+ ports:
+ - "$kubernetes-resource_configmap_portal_port"
+questions:
+ - variable: portal
+ group: "Container Image"
+ label: "Configure Portal Button"
+ schema:
+ type: dict
+ hidden: true
+ attrs:
+ - variable: enabled
+ label: "Enable"
+ description: "enable the portal button"
+ schema:
+ hidden: true
+ editable: false
+ type: boolean
+ default: true
+
+ # Update Policy
+ - variable: strategyType
+ group: "Container Image"
+ label: "Update Strategy"
+ schema:
+ type: string
+ default: "Recreate"
+ enum:
+ - value: "RollingUpdate"
+ description: "Create new pods and then kill old ones"
+ - value: "Recreate"
+ description: "Kill existing pods before creating new ones"
+ # Configure Time Zone
+ - variable: timezone
+ group: "Container Image"
+ label: "Timezone"
+ schema:
+ type: string
+ default: "Etc/UTC"
+ $ref:
+ - "definitions/timezone"
+
+ # Configure Enviroment Variables
+ - variable: environmentVariables
+ label: "Image environment"
+ group: "Configuration"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: environmentVariable
+ label: "Environment Variable"
+ schema:
+ type: dict
+ attrs:
+ - variable: name
+ label: "Name"
+ schema:
+ type: string
+ - variable: value
+ label: "Value"
+ schema:
+ type: string
+ # Enable Host Networking
+ - variable: hostNetwork
+ group: "Networking"
+ label: "Enable Host Networking"
+ schema:
+ type: boolean
+ default: false
+ - variable: services
+ group: "Networking"
+ label: "Configure Service"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "Main service"
+ description: "The Primary service on which the healthcheck runs, often the webUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: false
+ enum:
+ - value: HTTP
+ description: "HTTP"
+ - value: "HTTPS"
+ description: "HTTPS"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 1880
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 1880
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36028
+ required: true
+## TrueCharts Specific
+ - variable: persistence
+ label: "Integrated Persistent Storage"
+ description: "Websocket Service"
+ group: "Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: data
+ label: "App Config Storage"
+ description: "Stores the Application Configuration."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: "/data"
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "100Gi"
+ - variable: customStorage
+ label: "Custom app storage"
+ group: "Storage"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: volumeMount
+ label: "Custom Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enabled"
+ schema:
+ type: boolean
+ default: true
+ required: true
+ hidden: true
+ editable: false
+ - variable: setPermissions
+ label: "Automatic Permissions"
+ description: "Automatically set permissions on install"
+ schema:
+ type: boolean
+ default: true
+ hidden: false
+ - variable: readOnly
+ label: "Mount as ReadOnly"
+ description: "prevent any write from being done to the mounted volume"
+ schema:
+ type: boolean
+ default: false
+ hidden: false
+ - variable: emptyDir
+ label: "emptyDir"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ editable: false
+ - variable: mountPath
+ label: "Mount Path"
+ description: "Path to mount inside the pod"
+ schema:
+ type: path
+ required: true
+ default: ""
+ editable: true
+ - variable: hostPath
+ label: "Host Path"
+ schema:
+ type: hostpath
+ required: true
+ - variable: ingress
+ label: ""
+ group: "Reverse Proxy Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "WebUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: certType
+ label: "Select Reverse-Proxy Type"
+ schema:
+ type: string
+ default: "disabled"
+ enum:
+ - value: "disabled"
+ description: "Disabled"
+ - value: ""
+ description: "No Encryption/TLS/Certificates"
+ - value: "selfsigned"
+ description: "Self-Signed Certificate"
+ - value: "ixcert"
+ description: "TrueNAS SCALE Certificate"
+ - variable: type
+ label: "Reverse Proxy Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: true
+ editable: false
+ required: true
+ - variable: serviceName
+ label: "Service name to proxy to"
+ schema:
+ hidden: true
+ editable: false
+ type: string
+ default: ""
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: "websecure"
+ required: true
+ enum:
+ - value: "websecure"
+ description: "Websecure: HTTPS/TLS port 443"
+ - variable: hosts
+ label: "Hosts"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: list
+ default: []
+ items:
+ - variable: host
+ label: "Host"
+ schema:
+ type: dict
+ attrs:
+ - variable: host
+ label: "Domain Name"
+ required: true
+ schema:
+ type: string
+ - variable: path
+ label: "path"
+ schema:
+ type: string
+ required: true
+ hidden: true
+ default: "/"
+ - variable: certificate
+ label: "Select TrueNAS SCALE Certificate"
+ schema:
+ type: int
+ show_if: [["certType", "=", "ixcert"]]
+ $ref:
+ - "definitions/certificate"
+ - variable: authForwardURL
+ label: "Forward Authentication URL"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: ""
+
+ - variable: UMASK
+ group: "Advanced"
+ label: "UMASK"
+ description: "Sets the UMASK env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: string
+ default: "002"
+ # Enable privileged
+ - variable: securityContext
+ group: "Advanced"
+ label: "Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: privileged
+ label: "Enable privileged mode for Common-Chart based charts"
+ schema:
+ type: boolean
+ default: false
+ # Set Pod Security Policy
+ - variable: podSecurityContext
+ group: "Advanced"
+ label: "Pod Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: runAsNonRoot
+ label: "runAsNonRoot"
+ schema:
+ type: boolean
+ default: true
+ - variable: runAsUser
+ label: "runAsUser"
+ description: "The UserID of the user running the application"
+ schema:
+ type: int
+ default: 568
+ - variable: runAsGroup
+ label: "runAsGroup"
+ description: The groupID this App of the user running the application"
+ schema:
+ type: int
+ default: 568
+ - variable: supplementalGroups
+ label: "supplementalGroups"
+ description: "Additional groups this App needs access to"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: Group
+ label: "Group"
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroup
+ label: "fsGroup"
+ description: "The group that should own ALL storage."
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroupChangePolicy
+ label: "When should we take ownership?"
+ schema:
+ type: string
+ default: "OnRootMismatch"
+ enum:
+ - value: "OnRootMismatch"
+ description: "OnRootMismatch"
+ - value: "Always"
+ description: "Always"
diff --git a/scale-catalog-template/test/node-red/3.1.5/templates/common.yaml b/scale-catalog-template/test/node-red/3.1.5/templates/common.yaml
new file mode 100644
index 00000000..a6613c2c
--- /dev/null
+++ b/scale-catalog-template/test/node-red/3.1.5/templates/common.yaml
@@ -0,0 +1 @@
+{{ include "common.all" . }}
diff --git a/scale-catalog-template/test/node-red/3.1.5/test_values.yaml b/scale-catalog-template/test/node-red/3.1.5/test_values.yaml
new file mode 100644
index 00000000..4339f588
--- /dev/null
+++ b/scale-catalog-template/test/node-red/3.1.5/test_values.yaml
@@ -0,0 +1,32 @@
+# Default values for node-red.
+
+image:
+ repository: nodered/node-red
+ pullPolicy: IfNotPresent
+ tag: 1.3.4
+
+strategy:
+ type: Recreate
+
+# See more environment varaibles in the node-red documentation
+# https://nodered.org/docs/getting-started/docker
+env: {}
+ # TZ:
+ # NODE_OPTIONS:
+ # NODE_RED_ENABLE_PROJECTS:
+ # NODE_RED_ENABLE_SAFE_MODE:
+ # FLOWS:
+
+services:
+ main:
+ port:
+ port: 1880
+
+persistence:
+ data:
+ enabled: true
+ mountPath: "/data"
+ emptyDir: true
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ storageClass: ""
diff --git a/scale-catalog-template/test/node-red/3.1.5/values.yaml b/scale-catalog-template/test/node-red/3.1.5/values.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/scale-catalog-template/test/node-red/item.yaml b/scale-catalog-template/test/node-red/item.yaml
new file mode 100644
index 00000000..31b0c4a8
--- /dev/null
+++ b/scale-catalog-template/test/node-red/item.yaml
@@ -0,0 +1,3 @@
+categories:
+ - tools
+icon_url: https://nodered.org/about/resources/media/node-red-icon-2.png
diff --git a/scale-catalog-template/test/nzbget/3.1.5/CONFIG.md b/scale-catalog-template/test/nzbget/3.1.5/CONFIG.md
new file mode 100644
index 00000000..6d760c18
--- /dev/null
+++ b/scale-catalog-template/test/nzbget/3.1.5/CONFIG.md
@@ -0,0 +1,8 @@
+# Configuration Options
+
+##### Connecting to other apps
+If you need to connect this App to other Apps on TrueNAS SCALE, please refer to our "Linking Apps Together" guide:
+https://truecharts.org/manual/linking/
+
+##### Available config options
+In the future this page is going to contain an automated list of options available in the installation/edit UI.
diff --git a/scale-catalog-template/test/nzbget/3.1.5/Chart.lock b/scale-catalog-template/test/nzbget/3.1.5/Chart.lock
new file mode 100644
index 00000000..9d35bc3f
--- /dev/null
+++ b/scale-catalog-template/test/nzbget/3.1.5/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+digest: sha256:ea66c36be2fa73e56bc33f7e89af9ce338cdfbed0b347484888e87228b825015
+generated: "2021-05-06T13:29:58.151914285Z"
diff --git a/scale-catalog-template/test/nzbget/3.1.5/Chart.yaml b/scale-catalog-template/test/nzbget/3.1.5/Chart.yaml
new file mode 100644
index 00000000..863ecde8
--- /dev/null
+++ b/scale-catalog-template/test/nzbget/3.1.5/Chart.yaml
@@ -0,0 +1,29 @@
+apiVersion: v2
+kubeVersion: ">=1.16.0-0"
+name: nzbget
+version: 3.1.5
+upstream_version: 7.3.1
+appVersion: "auto"
+description: NZBGet is a Usenet downloader client
+type: application
+deprecated: false
+home: https://github.com/truecharts/apps/tree/master/incubator/nzbget
+icon: https://avatars1.githubusercontent.com/u/3368377?s=400&v=4
+keywords:
+ - nzbget
+ - usenet
+sources:
+ - https://github.com/truecharts/apps/tree/master/incubator/nzbget
+ - https://github.com/k8s-at-home/charts/tree/master/charts/nzbget
+ - https://hub.docker.com/r/linuxserver/nzbget/
+ - https://nzbget.net/
+dependencies:
+ - name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+ # condition:
+maintainers:
+ - name: TrueCharts
+ email: info@truecharts.org
+ url: truecharts.org
+# annotations:
diff --git a/scale-catalog-template/test/nzbget/3.1.5/README.md b/scale-catalog-template/test/nzbget/3.1.5/README.md
new file mode 100644
index 00000000..927dec88
--- /dev/null
+++ b/scale-catalog-template/test/nzbget/3.1.5/README.md
@@ -0,0 +1,56 @@
+# Introduction
+
+![Version: 3.1.5](https://img.shields.io/badge/Version-3.1.5-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: auto](https://img.shields.io/badge/AppVersion-auto-informational?style=flat-square)
+
+NZBGet is a Usenet downloader client
+
+TrueCharts are designed to be installed as TrueNAS SCALE app only. We can not guarantee this charts works as a stand-alone helm installation.
+**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/apps/issues/new/choose)**
+
+## Source Code
+
+*
+*
+*
+*
+
+## Requirements
+
+Kubernetes: `>=1.16.0-0`
+
+## Dependencies
+
+| Repository | Name | Version |
+|------------|------|---------|
+| https://truecharts.org/ | common | 3.5.5 |
+
+## Installing the Chart
+
+To install the chart with the release name `nzbget`
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Click "Install" for this specific Apps
+- Fill out the configuration form
+
+## Uninstalling the Chart
+
+To uninstall the `nzbget` deployment
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Go to "Installed Apps"
+- Expand the menu in the top-right corner of this App
+- Click "Remove" for this specific Apps
+
+The command removes all the Kubernetes components associated with the chart **including storage volumes** _(Except hostPath Storage)_ and deletes the release.
+
+## Support
+
+- See the [Wiki](https://truecharts.org)
+- Open a [issue](https://github.com/truecharts/apps/issues/new/choose)
+- Ask a [question](https://github.com/truecharts/apps/discussions)
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
+All Rights Reserved - The TrueCharts Project
diff --git a/scale-catalog-template/test/nzbget/3.1.5/app-readme.md b/scale-catalog-template/test/nzbget/3.1.5/app-readme.md
new file mode 100644
index 00000000..bde861cf
--- /dev/null
+++ b/scale-catalog-template/test/nzbget/3.1.5/app-readme.md
@@ -0,0 +1,3 @@
+NZBGet is a Usenet downloader client
+This App is supplied by TrueCharts, for more information please visit https://truecharts.org
+NZBGet is a Usenet downloader client
diff --git a/scale-catalog-template/test/nzbget/3.1.5/charts/common-3.5.5.tgz b/scale-catalog-template/test/nzbget/3.1.5/charts/common-3.5.5.tgz
new file mode 100644
index 00000000..d01688bb
Binary files /dev/null and b/scale-catalog-template/test/nzbget/3.1.5/charts/common-3.5.5.tgz differ
diff --git a/scale-catalog-template/test/nzbget/3.1.5/ix_values.yaml b/scale-catalog-template/test/nzbget/3.1.5/ix_values.yaml
new file mode 100644
index 00000000..08de88a7
--- /dev/null
+++ b/scale-catalog-template/test/nzbget/3.1.5/ix_values.yaml
@@ -0,0 +1,15 @@
+##
+# This file contains Values.yaml content that gets added to the output of questions.yaml
+# It's ONLY meant for content that the user is NOT expected to change.
+# Example: Everything under "image" is not included in questions.yaml but is included here.
+##
+
+image:
+ repository: ghcr.io/truecharts/nzbget
+ pullPolicy: IfNotPresent
+ tag: v21.0
+
+##
+# Most other defaults are set in questions.yaml
+# For other options please refer to the wiki, default_values.yaml or the common library chart
+##
diff --git a/scale-catalog-template/test/nzbget/3.1.5/questions.yaml b/scale-catalog-template/test/nzbget/3.1.5/questions.yaml
new file mode 100644
index 00000000..842b21e7
--- /dev/null
+++ b/scale-catalog-template/test/nzbget/3.1.5/questions.yaml
@@ -0,0 +1,436 @@
+groups:
+ - name: "Container Image"
+ description: "Image to be used for container"
+ - name: "Workload Configuration"
+ description: "Configure workload deployment"
+ - name: "Configuration"
+ description: "additional container configuration"
+ - name: "Networking"
+ description: "Configure / service for container"
+ - name: "Storage"
+ description: "Persist and share data that is separate from the lifecycle of the container"
+ - name: "Resources and Devices"
+ description: "Specify resources/devices to be allocated to workload"
+ - name: "Reverse Proxy Configuration"
+ description: "Reverse Proxy configuration"
+ - name: "Advanced"
+ description: "Advanced Configuration"
+ - name: "WARNING"
+ description: "WARNING"
+portals:
+ web_portal:
+ protocols:
+ - "$kubernetes-resource_configmap_portal_protocol"
+ host:
+ - "$kubernetes-resource_configmap_portal_host"
+ ports:
+ - "$kubernetes-resource_configmap_portal_port"
+questions:
+ - variable: portal
+ group: "Container Image"
+ label: "Configure Portal Button"
+ schema:
+ type: dict
+ hidden: true
+ attrs:
+ - variable: enabled
+ label: "Enable"
+ description: "enable the portal button"
+ schema:
+ hidden: true
+ editable: false
+ type: boolean
+ default: true
+
+ # Update Policy
+ - variable: strategyType
+ group: "Container Image"
+ label: "Update Strategy"
+ schema:
+ type: string
+ default: "Recreate"
+ enum:
+ - value: "RollingUpdate"
+ description: "Create new pods and then kill old ones"
+ - value: "Recreate"
+ description: "Kill existing pods before creating new ones"
+ # Configure Time Zone
+ - variable: timezone
+ group: "Container Image"
+ label: "Timezone"
+ schema:
+ type: string
+ default: "Etc/UTC"
+ $ref:
+ - "definitions/timezone"
+
+ # Configure Enviroment Variables
+ - variable: environmentVariables
+ label: "Image environment"
+ group: "Configuration"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: environmentVariable
+ label: "Environment Variable"
+ schema:
+ type: dict
+ attrs:
+ - variable: name
+ label: "Name"
+ schema:
+ type: string
+ - variable: value
+ label: "Value"
+ schema:
+ type: string
+ # Enable Host Networking
+ - variable: hostNetwork
+ group: "Networking"
+ label: "Enable Host Networking"
+ schema:
+ type: boolean
+ default: false
+ - variable: services
+ group: "Networking"
+ label: "Configure Service"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "Main service"
+ description: "The Primary service on which the healthcheck runs, often the webUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: false
+ enum:
+ - value: HTTP
+ description: "HTTP"
+ - value: "HTTPS"
+ description: "HTTPS"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 6789
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 6789
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36021
+ required: true
+## TrueCharts Specific
+ - variable: persistence
+ label: "Integrated Persistent Storage"
+ description: "Websocket Service"
+ group: "Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: config
+ label: "App Config Storage"
+ description: "Stores the Application Configuration."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: "/config"
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "100Gi"
+ - variable: customStorage
+ label: "Custom app storage"
+ group: "Storage"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: volumeMount
+ label: "Custom Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enabled"
+ schema:
+ type: boolean
+ default: true
+ required: true
+ hidden: true
+ editable: false
+ - variable: setPermissions
+ label: "Automatic Permissions"
+ description: "Automatically set permissions on install"
+ schema:
+ type: boolean
+ default: true
+ hidden: false
+ - variable: readOnly
+ label: "Mount as ReadOnly"
+ description: "prevent any write from being done to the mounted volume"
+ schema:
+ type: boolean
+ default: false
+ hidden: false
+ - variable: emptyDir
+ label: "emptyDir"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ editable: false
+ - variable: mountPath
+ label: "Mount Path"
+ description: "Path to mount inside the pod"
+ schema:
+ type: path
+ required: true
+ default: ""
+ editable: true
+ - variable: hostPath
+ label: "Host Path"
+ schema:
+ type: hostpath
+ required: true
+ - variable: ingress
+ label: ""
+ group: "Reverse Proxy Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "WebUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: certType
+ label: "Select Reverse-Proxy Type"
+ schema:
+ type: string
+ default: "disabled"
+ enum:
+ - value: "disabled"
+ description: "Disabled"
+ - value: ""
+ description: "No Encryption/TLS/Certificates"
+ - value: "selfsigned"
+ description: "Self-Signed Certificate"
+ - value: "ixcert"
+ description: "TrueNAS SCALE Certificate"
+ - variable: type
+ label: "Reverse Proxy Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: true
+ editable: false
+ required: true
+ - variable: serviceName
+ label: "Service name to proxy to"
+ schema:
+ hidden: true
+ editable: false
+ type: string
+ default: ""
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: "websecure"
+ required: true
+ enum:
+ - value: "websecure"
+ description: "Websecure: HTTPS/TLS port 443"
+ - variable: hosts
+ label: "Hosts"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: list
+ default: []
+ items:
+ - variable: host
+ label: "Host"
+ schema:
+ type: dict
+ attrs:
+ - variable: host
+ label: "Domain Name"
+ required: true
+ schema:
+ type: string
+ - variable: path
+ label: "path"
+ schema:
+ type: string
+ required: true
+ hidden: true
+ default: "/"
+ - variable: certificate
+ label: "Select TrueNAS SCALE Certificate"
+ schema:
+ type: int
+ show_if: [["certType", "=", "ixcert"]]
+ $ref:
+ - "definitions/certificate"
+ - variable: authForwardURL
+ label: "Forward Authentication URL"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: ""
+
+ - variable: UMASK
+ group: "Advanced"
+ label: "UMASK"
+ description: "Sets the UMASK env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: string
+ default: "002"
+ # Enable privileged
+ - variable: securityContext
+ group: "Advanced"
+ label: "Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: privileged
+ label: "Enable privileged mode for Common-Chart based charts"
+ schema:
+ type: boolean
+ default: false
+ # Set Pod Security Policy
+ - variable: podSecurityContext
+ group: "Advanced"
+ label: "Pod Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: runAsNonRoot
+ label: "runAsNonRoot"
+ schema:
+ type: boolean
+ default: true
+ - variable: runAsUser
+ label: "runAsUser"
+ description: "The UserID of the user running the application"
+ schema:
+ type: int
+ default: 568
+ - variable: runAsGroup
+ label: "runAsGroup"
+ description: The groupID this App of the user running the application"
+ schema:
+ type: int
+ default: 568
+ - variable: supplementalGroups
+ label: "supplementalGroups"
+ description: "Additional groups this App needs access to"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: Group
+ label: "Group"
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroup
+ label: "fsGroup"
+ description: "The group that should own ALL storage."
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroupChangePolicy
+ label: "When should we take ownership?"
+ schema:
+ type: string
+ default: "OnRootMismatch"
+ enum:
+ - value: "OnRootMismatch"
+ description: "OnRootMismatch"
+ - value: "Always"
+ description: "Always"
diff --git a/scale-catalog-template/test/nzbget/3.1.5/templates/common.yaml b/scale-catalog-template/test/nzbget/3.1.5/templates/common.yaml
new file mode 100644
index 00000000..a6613c2c
--- /dev/null
+++ b/scale-catalog-template/test/nzbget/3.1.5/templates/common.yaml
@@ -0,0 +1 @@
+{{ include "common.all" . }}
diff --git a/scale-catalog-template/test/nzbget/3.1.5/test_values.yaml b/scale-catalog-template/test/nzbget/3.1.5/test_values.yaml
new file mode 100644
index 00000000..212877c5
--- /dev/null
+++ b/scale-catalog-template/test/nzbget/3.1.5/test_values.yaml
@@ -0,0 +1,23 @@
+# Default values for nzbget.
+
+image:
+ repository: ghcr.io/truecharts/nzbget
+ pullPolicy: IfNotPresent
+ tag: v21.0
+
+strategy:
+ type: Recreate
+
+services:
+ main:
+ port:
+ port: 6789
+
+persistence:
+ config:
+ enabled: true
+ mountPath: "/config"
+ emptyDir: true
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ storageClass: ""
diff --git a/scale-catalog-template/test/nzbget/3.1.5/values.yaml b/scale-catalog-template/test/nzbget/3.1.5/values.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/scale-catalog-template/test/nzbget/item.yaml b/scale-catalog-template/test/nzbget/item.yaml
new file mode 100644
index 00000000..86059d18
--- /dev/null
+++ b/scale-catalog-template/test/nzbget/item.yaml
@@ -0,0 +1,3 @@
+categories:
+ - media
+icon_url: https://avatars1.githubusercontent.com/u/3368377?s=400&v=4
diff --git a/scale-catalog-template/test/nzbhydra/3.1.5/CONFIG.md b/scale-catalog-template/test/nzbhydra/3.1.5/CONFIG.md
new file mode 100644
index 00000000..6d760c18
--- /dev/null
+++ b/scale-catalog-template/test/nzbhydra/3.1.5/CONFIG.md
@@ -0,0 +1,8 @@
+# Configuration Options
+
+##### Connecting to other apps
+If you need to connect this App to other Apps on TrueNAS SCALE, please refer to our "Linking Apps Together" guide:
+https://truecharts.org/manual/linking/
+
+##### Available config options
+In the future this page is going to contain an automated list of options available in the installation/edit UI.
diff --git a/scale-catalog-template/test/nzbhydra/3.1.5/Chart.lock b/scale-catalog-template/test/nzbhydra/3.1.5/Chart.lock
new file mode 100644
index 00000000..cef5aa69
--- /dev/null
+++ b/scale-catalog-template/test/nzbhydra/3.1.5/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+digest: sha256:ea66c36be2fa73e56bc33f7e89af9ce338cdfbed0b347484888e87228b825015
+generated: "2021-05-06T13:29:58.660164697Z"
diff --git a/scale-catalog-template/test/nzbhydra/3.1.5/Chart.yaml b/scale-catalog-template/test/nzbhydra/3.1.5/Chart.yaml
new file mode 100644
index 00000000..5d35ede6
--- /dev/null
+++ b/scale-catalog-template/test/nzbhydra/3.1.5/Chart.yaml
@@ -0,0 +1,29 @@
+apiVersion: v2
+kubeVersion: ">=1.16.0-0"
+name: nzbhydra
+version: 3.1.5
+upstream_version: 5.3.1
+appVersion: "auto"
+description: Usenet meta search
+type: application
+deprecated: false
+home: https://github.com/truecharts/apps/tree/master/incubator/nzbhydra
+icon: https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/hydra-icon.png
+keywords:
+ - nzbhydra
+ - usenet
+sources:
+ - https://github.com/truecharts/apps/tree/master/incubator/nzbhydra
+ - https://github.com/k8s-at-home/charts/tree/master/charts/nzbhydra
+ - https://hub.docker.com/r/linuxserver/nzbhydra2
+ - https://github.com/theotherp/nzbhydra2
+dependencies:
+ - name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+ # condition:
+maintainers:
+ - name: TrueCharts
+ email: info@truecharts.org
+ url: truecharts.org
+# annotations:
diff --git a/scale-catalog-template/test/nzbhydra/3.1.5/README.md b/scale-catalog-template/test/nzbhydra/3.1.5/README.md
new file mode 100644
index 00000000..a3cd6644
--- /dev/null
+++ b/scale-catalog-template/test/nzbhydra/3.1.5/README.md
@@ -0,0 +1,56 @@
+# Introduction
+
+![Version: 3.1.5](https://img.shields.io/badge/Version-3.1.5-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: auto](https://img.shields.io/badge/AppVersion-auto-informational?style=flat-square)
+
+Usenet meta search
+
+TrueCharts are designed to be installed as TrueNAS SCALE app only. We can not guarantee this charts works as a stand-alone helm installation.
+**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/apps/issues/new/choose)**
+
+## Source Code
+
+*
+*
+*
+*
+
+## Requirements
+
+Kubernetes: `>=1.16.0-0`
+
+## Dependencies
+
+| Repository | Name | Version |
+|------------|------|---------|
+| https://truecharts.org/ | common | 3.5.5 |
+
+## Installing the Chart
+
+To install the chart with the release name `nzbhydra`
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Click "Install" for this specific Apps
+- Fill out the configuration form
+
+## Uninstalling the Chart
+
+To uninstall the `nzbhydra` deployment
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Go to "Installed Apps"
+- Expand the menu in the top-right corner of this App
+- Click "Remove" for this specific Apps
+
+The command removes all the Kubernetes components associated with the chart **including storage volumes** _(Except hostPath Storage)_ and deletes the release.
+
+## Support
+
+- See the [Wiki](https://truecharts.org)
+- Open a [issue](https://github.com/truecharts/apps/issues/new/choose)
+- Ask a [question](https://github.com/truecharts/apps/discussions)
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
+All Rights Reserved - The TrueCharts Project
diff --git a/scale-catalog-template/test/nzbhydra/3.1.5/app-readme.md b/scale-catalog-template/test/nzbhydra/3.1.5/app-readme.md
new file mode 100644
index 00000000..2012c83a
--- /dev/null
+++ b/scale-catalog-template/test/nzbhydra/3.1.5/app-readme.md
@@ -0,0 +1,3 @@
+Usenet meta search
+This App is supplied by TrueCharts, for more information please visit https://truecharts.org
+Usenet meta search
diff --git a/scale-catalog-template/test/nzbhydra/3.1.5/charts/common-3.5.5.tgz b/scale-catalog-template/test/nzbhydra/3.1.5/charts/common-3.5.5.tgz
new file mode 100644
index 00000000..d01688bb
Binary files /dev/null and b/scale-catalog-template/test/nzbhydra/3.1.5/charts/common-3.5.5.tgz differ
diff --git a/scale-catalog-template/test/nzbhydra/3.1.5/ix_values.yaml b/scale-catalog-template/test/nzbhydra/3.1.5/ix_values.yaml
new file mode 100644
index 00000000..0a6fde47
--- /dev/null
+++ b/scale-catalog-template/test/nzbhydra/3.1.5/ix_values.yaml
@@ -0,0 +1,51 @@
+##
+# This file contains Values.yaml content that gets added to the output of questions.yaml
+# It's ONLY meant for content that the user is NOT expected to change.
+# Example: Everything under "image" is not included in questions.yaml but is included here.
+##
+
+image:
+ repository: ghcr.io/truecharts/nzbhydra2
+ pullPolicy: IfNotPresent
+ tag: v3.14.1
+
+probes:
+ liveness:
+ custom: true
+ enabled: true
+ spec:
+ failureThreshold: 5
+ httpGet:
+ path: /actuator/health/livenessState
+ port: http
+ initialDelaySeconds: 30
+ periodSeconds: 10
+ timeoutSeconds: 10
+ readiness:
+ custom: true
+ enabled: true
+ spec:
+ failureThreshold: 5
+ httpGet:
+ path: /actuator/health/readinessState
+ port: http
+ initialDelaySeconds: 30
+ periodSeconds: 10
+ timeoutSeconds: 10
+ startup:
+ custom: true
+ enabled: true
+ spec:
+ failureThreshold: 5
+ httpGet:
+ path: /actuator/health/readinessState
+ port: http
+ initialDelaySeconds: 30
+ periodSeconds: 10
+ timeoutSeconds: 10
+
+
+##
+# Most other defaults are set in questions.yaml
+# For other options please refer to the wiki, default_values.yaml or the common library chart
+##
diff --git a/scale-catalog-template/test/nzbhydra/3.1.5/questions.yaml b/scale-catalog-template/test/nzbhydra/3.1.5/questions.yaml
new file mode 100644
index 00000000..a620bab6
--- /dev/null
+++ b/scale-catalog-template/test/nzbhydra/3.1.5/questions.yaml
@@ -0,0 +1,436 @@
+groups:
+ - name: "Container Image"
+ description: "Image to be used for container"
+ - name: "Workload Configuration"
+ description: "Configure workload deployment"
+ - name: "Configuration"
+ description: "additional container configuration"
+ - name: "Networking"
+ description: "Configure / service for container"
+ - name: "Storage"
+ description: "Persist and share data that is separate from the lifecycle of the container"
+ - name: "Resources and Devices"
+ description: "Specify resources/devices to be allocated to workload"
+ - name: "Reverse Proxy Configuration"
+ description: "Reverse Proxy configuration"
+ - name: "Advanced"
+ description: "Advanced Configuration"
+ - name: "WARNING"
+ description: "WARNING"
+portals:
+ web_portal:
+ protocols:
+ - "$kubernetes-resource_configmap_portal_protocol"
+ host:
+ - "$kubernetes-resource_configmap_portal_host"
+ ports:
+ - "$kubernetes-resource_configmap_portal_port"
+questions:
+ - variable: portal
+ group: "Container Image"
+ label: "Configure Portal Button"
+ schema:
+ type: dict
+ hidden: true
+ attrs:
+ - variable: enabled
+ label: "Enable"
+ description: "enable the portal button"
+ schema:
+ hidden: true
+ editable: false
+ type: boolean
+ default: true
+
+ # Update Policy
+ - variable: strategyType
+ group: "Container Image"
+ label: "Update Strategy"
+ schema:
+ type: string
+ default: "Recreate"
+ enum:
+ - value: "RollingUpdate"
+ description: "Create new pods and then kill old ones"
+ - value: "Recreate"
+ description: "Kill existing pods before creating new ones"
+ # Configure Time Zone
+ - variable: timezone
+ group: "Container Image"
+ label: "Timezone"
+ schema:
+ type: string
+ default: "Etc/UTC"
+ $ref:
+ - "definitions/timezone"
+
+ # Configure Enviroment Variables
+ - variable: environmentVariables
+ label: "Image environment"
+ group: "Configuration"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: environmentVariable
+ label: "Environment Variable"
+ schema:
+ type: dict
+ attrs:
+ - variable: name
+ label: "Name"
+ schema:
+ type: string
+ - variable: value
+ label: "Value"
+ schema:
+ type: string
+ # Enable Host Networking
+ - variable: hostNetwork
+ group: "Networking"
+ label: "Enable Host Networking"
+ schema:
+ type: boolean
+ default: false
+ - variable: services
+ group: "Networking"
+ label: "Configure Service"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "Main service"
+ description: "The Primary service on which the healthcheck runs, often the webUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: false
+ enum:
+ - value: HTTP
+ description: "HTTP"
+ - value: "HTTPS"
+ description: "HTTPS"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 5076
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 5076
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36041
+ required: true
+## TrueCharts Specific
+ - variable: persistence
+ label: "Integrated Persistent Storage"
+ description: "Websocket Service"
+ group: "Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: config
+ label: "App Config Storage"
+ description: "Stores the Application Configuration."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: "/config"
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "100Gi"
+ - variable: customStorage
+ label: "Custom app storage"
+ group: "Storage"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: volumeMount
+ label: "Custom Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enabled"
+ schema:
+ type: boolean
+ default: true
+ required: true
+ hidden: true
+ editable: false
+ - variable: setPermissions
+ label: "Automatic Permissions"
+ description: "Automatically set permissions on install"
+ schema:
+ type: boolean
+ default: true
+ hidden: false
+ - variable: readOnly
+ label: "Mount as ReadOnly"
+ description: "prevent any write from being done to the mounted volume"
+ schema:
+ type: boolean
+ default: false
+ hidden: false
+ - variable: emptyDir
+ label: "emptyDir"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ editable: false
+ - variable: mountPath
+ label: "Mount Path"
+ description: "Path to mount inside the pod"
+ schema:
+ type: path
+ required: true
+ default: ""
+ editable: true
+ - variable: hostPath
+ label: "Host Path"
+ schema:
+ type: hostpath
+ required: true
+ - variable: ingress
+ label: ""
+ group: "Reverse Proxy Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "WebUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: certType
+ label: "Select Reverse-Proxy Type"
+ schema:
+ type: string
+ default: "disabled"
+ enum:
+ - value: "disabled"
+ description: "Disabled"
+ - value: ""
+ description: "No Encryption/TLS/Certificates"
+ - value: "selfsigned"
+ description: "Self-Signed Certificate"
+ - value: "ixcert"
+ description: "TrueNAS SCALE Certificate"
+ - variable: type
+ label: "Reverse Proxy Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: true
+ editable: false
+ required: true
+ - variable: serviceName
+ label: "Service name to proxy to"
+ schema:
+ hidden: true
+ editable: false
+ type: string
+ default: ""
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: "websecure"
+ required: true
+ enum:
+ - value: "websecure"
+ description: "Websecure: HTTPS/TLS port 443"
+ - variable: hosts
+ label: "Hosts"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: list
+ default: []
+ items:
+ - variable: host
+ label: "Host"
+ schema:
+ type: dict
+ attrs:
+ - variable: host
+ label: "Domain Name"
+ required: true
+ schema:
+ type: string
+ - variable: path
+ label: "path"
+ schema:
+ type: string
+ required: true
+ hidden: true
+ default: "/"
+ - variable: certificate
+ label: "Select TrueNAS SCALE Certificate"
+ schema:
+ type: int
+ show_if: [["certType", "=", "ixcert"]]
+ $ref:
+ - "definitions/certificate"
+ - variable: authForwardURL
+ label: "Forward Authentication URL"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: ""
+
+ - variable: UMASK
+ group: "Advanced"
+ label: "UMASK"
+ description: "Sets the UMASK env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: string
+ default: "002"
+ # Enable privileged
+ - variable: securityContext
+ group: "Advanced"
+ label: "Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: privileged
+ label: "Enable privileged mode for Common-Chart based charts"
+ schema:
+ type: boolean
+ default: false
+ # Set Pod Security Policy
+ - variable: podSecurityContext
+ group: "Advanced"
+ label: "Pod Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: runAsNonRoot
+ label: "runAsNonRoot"
+ schema:
+ type: boolean
+ default: true
+ - variable: runAsUser
+ label: "runAsUser"
+ description: "The UserID of the user running the application"
+ schema:
+ type: int
+ default: 568
+ - variable: runAsGroup
+ label: "runAsGroup"
+ description: The groupID this App of the user running the application"
+ schema:
+ type: int
+ default: 568
+ - variable: supplementalGroups
+ label: "supplementalGroups"
+ description: "Additional groups this App needs access to"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: Group
+ label: "Group"
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroup
+ label: "fsGroup"
+ description: "The group that should own ALL storage."
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroupChangePolicy
+ label: "When should we take ownership?"
+ schema:
+ type: string
+ default: "OnRootMismatch"
+ enum:
+ - value: "OnRootMismatch"
+ description: "OnRootMismatch"
+ - value: "Always"
+ description: "Always"
diff --git a/scale-catalog-template/test/nzbhydra/3.1.5/templates/common.yaml b/scale-catalog-template/test/nzbhydra/3.1.5/templates/common.yaml
new file mode 100644
index 00000000..a6613c2c
--- /dev/null
+++ b/scale-catalog-template/test/nzbhydra/3.1.5/templates/common.yaml
@@ -0,0 +1 @@
+{{ include "common.all" . }}
diff --git a/scale-catalog-template/test/nzbhydra/3.1.5/test_values.yaml b/scale-catalog-template/test/nzbhydra/3.1.5/test_values.yaml
new file mode 100644
index 00000000..5baf1ad7
--- /dev/null
+++ b/scale-catalog-template/test/nzbhydra/3.1.5/test_values.yaml
@@ -0,0 +1,64 @@
+# Default values for nzbhydra.
+
+image:
+ repository: ghcr.io/truecharts/nzbhydra2
+ pullPolicy: IfNotPresent
+ tag: v3.14.1
+
+strategy:
+ type: Recreate
+
+services:
+ main:
+ port:
+ port: 5076
+
+env: {}
+ # TZ: UTC
+ # PUID: 1001
+ # PGID: 1001
+
+probes:
+ liveness:
+ custom: true
+ enabled: true
+ spec:
+ failureThreshold: 5
+ httpGet:
+ path: /actuator/health/livenessState
+ port: http
+ initialDelaySeconds: 30
+ periodSeconds: 10
+ timeoutSeconds: 10
+ readiness:
+ custom: true
+ enabled: true
+ spec:
+ failureThreshold: 5
+ httpGet:
+ path: /actuator/health/readinessState
+ port: http
+ initialDelaySeconds: 30
+ periodSeconds: 10
+ timeoutSeconds: 10
+ startup:
+ custom: true
+ enabled: true
+ spec:
+ failureThreshold: 5
+ httpGet:
+ path: /actuator/health/readinessState
+ port: http
+ initialDelaySeconds: 30
+ periodSeconds: 10
+ timeoutSeconds: 10
+
+
+persistence:
+ config:
+ enabled: true
+ mountPath: "/config"
+ emptyDir: true
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ storageClass: ""
diff --git a/scale-catalog-template/test/nzbhydra/3.1.5/values.yaml b/scale-catalog-template/test/nzbhydra/3.1.5/values.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/scale-catalog-template/test/nzbhydra/item.yaml b/scale-catalog-template/test/nzbhydra/item.yaml
new file mode 100644
index 00000000..9da6666b
--- /dev/null
+++ b/scale-catalog-template/test/nzbhydra/item.yaml
@@ -0,0 +1,3 @@
+categories:
+ - media
+icon_url: https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/hydra-icon.png
diff --git a/scale-catalog-template/test/organizr/3.1.5/CONFIG.md b/scale-catalog-template/test/organizr/3.1.5/CONFIG.md
new file mode 100644
index 00000000..6d760c18
--- /dev/null
+++ b/scale-catalog-template/test/organizr/3.1.5/CONFIG.md
@@ -0,0 +1,8 @@
+# Configuration Options
+
+##### Connecting to other apps
+If you need to connect this App to other Apps on TrueNAS SCALE, please refer to our "Linking Apps Together" guide:
+https://truecharts.org/manual/linking/
+
+##### Available config options
+In the future this page is going to contain an automated list of options available in the installation/edit UI.
diff --git a/scale-catalog-template/test/organizr/3.1.5/Chart.lock b/scale-catalog-template/test/organizr/3.1.5/Chart.lock
new file mode 100644
index 00000000..3afb86bf
--- /dev/null
+++ b/scale-catalog-template/test/organizr/3.1.5/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+digest: sha256:ea66c36be2fa73e56bc33f7e89af9ce338cdfbed0b347484888e87228b825015
+generated: "2021-05-06T13:29:59.129683638Z"
diff --git a/scale-catalog-template/test/organizr/3.1.5/Chart.yaml b/scale-catalog-template/test/organizr/3.1.5/Chart.yaml
new file mode 100644
index 00000000..631c1abc
--- /dev/null
+++ b/scale-catalog-template/test/organizr/3.1.5/Chart.yaml
@@ -0,0 +1,28 @@
+apiVersion: v2
+kubeVersion: ">=1.16.0-0"
+name: organizr
+version: 3.1.5
+upstream_version: 3.2.1
+appVersion: "latest"
+description: HTPC/Homelab Services Organizer
+type: application
+deprecated: false
+home: https://github.com/truecharts/apps/tree/master/incubator/organizr
+icon: https://github.com/causefx/Organizr/blob/v2-master/plugins/images/organizr/logo.png?raw=true
+keywords:
+ - organizr
+sources:
+ - https://github.com/truecharts/apps/tree/master/incubator/organizr
+ - https://github.com/k8s-at-home/charts/tree/master/charts/organizr
+ - https://github.com/causefx/Organizr
+ - https://hub.docker.com/r/organizr/organizr
+dependencies:
+ - name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+ # condition:
+maintainers:
+ - name: TrueCharts
+ email: info@truecharts.org
+ url: truecharts.org
+# annotations:
diff --git a/scale-catalog-template/test/organizr/3.1.5/README.md b/scale-catalog-template/test/organizr/3.1.5/README.md
new file mode 100644
index 00000000..dd5cdedc
--- /dev/null
+++ b/scale-catalog-template/test/organizr/3.1.5/README.md
@@ -0,0 +1,56 @@
+# Introduction
+
+![Version: 3.1.5](https://img.shields.io/badge/Version-3.1.5-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: latest](https://img.shields.io/badge/AppVersion-latest-informational?style=flat-square)
+
+HTPC/Homelab Services Organizer
+
+TrueCharts are designed to be installed as TrueNAS SCALE app only. We can not guarantee this charts works as a stand-alone helm installation.
+**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/apps/issues/new/choose)**
+
+## Source Code
+
+*
+*
+*
+*
+
+## Requirements
+
+Kubernetes: `>=1.16.0-0`
+
+## Dependencies
+
+| Repository | Name | Version |
+|------------|------|---------|
+| https://truecharts.org/ | common | 3.5.5 |
+
+## Installing the Chart
+
+To install the chart with the release name `organizr`
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Click "Install" for this specific Apps
+- Fill out the configuration form
+
+## Uninstalling the Chart
+
+To uninstall the `organizr` deployment
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Go to "Installed Apps"
+- Expand the menu in the top-right corner of this App
+- Click "Remove" for this specific Apps
+
+The command removes all the Kubernetes components associated with the chart **including storage volumes** _(Except hostPath Storage)_ and deletes the release.
+
+## Support
+
+- See the [Wiki](https://truecharts.org)
+- Open a [issue](https://github.com/truecharts/apps/issues/new/choose)
+- Ask a [question](https://github.com/truecharts/apps/discussions)
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
+All Rights Reserved - The TrueCharts Project
diff --git a/scale-catalog-template/test/organizr/3.1.5/app-readme.md b/scale-catalog-template/test/organizr/3.1.5/app-readme.md
new file mode 100644
index 00000000..0bfeec6a
--- /dev/null
+++ b/scale-catalog-template/test/organizr/3.1.5/app-readme.md
@@ -0,0 +1,3 @@
+HTPC/Homelab Services Organizer
+This App is supplied by TrueCharts, for more information please visit https://truecharts.org
+HTPC/Homelab Services Organizer
diff --git a/scale-catalog-template/test/organizr/3.1.5/charts/common-3.5.5.tgz b/scale-catalog-template/test/organizr/3.1.5/charts/common-3.5.5.tgz
new file mode 100644
index 00000000..d01688bb
Binary files /dev/null and b/scale-catalog-template/test/organizr/3.1.5/charts/common-3.5.5.tgz differ
diff --git a/scale-catalog-template/test/organizr/3.1.5/ix_values.yaml b/scale-catalog-template/test/organizr/3.1.5/ix_values.yaml
new file mode 100644
index 00000000..19a9fa1e
--- /dev/null
+++ b/scale-catalog-template/test/organizr/3.1.5/ix_values.yaml
@@ -0,0 +1,16 @@
+##
+# This file contains Values.yaml content that gets added to the output of questions.yaml
+# It's ONLY meant for content that the user is NOT expected to change.
+# Example: Everything under "image" is not included in questions.yaml but is included here.
+##
+
+image:
+ repository: organizr/organizr
+ pullPolicy: Always
+ tag: latest
+
+
+##
+# Most other defaults are set in questions.yaml
+# For other options please refer to the wiki, default_values.yaml or the common library chart
+##
diff --git a/scale-catalog-template/test/organizr/3.1.5/questions.yaml b/scale-catalog-template/test/organizr/3.1.5/questions.yaml
new file mode 100644
index 00000000..35051230
--- /dev/null
+++ b/scale-catalog-template/test/organizr/3.1.5/questions.yaml
@@ -0,0 +1,502 @@
+groups:
+ - name: "Container Image"
+ description: "Image to be used for container"
+ - name: "Workload Configuration"
+ description: "Configure workload deployment"
+ - name: "Configuration"
+ description: "additional container configuration"
+ - name: "Networking"
+ description: "Configure / service for container"
+ - name: "Storage"
+ description: "Persist and share data that is separate from the lifecycle of the container"
+ - name: "Resources and Devices"
+ description: "Specify resources/devices to be allocated to workload"
+ - name: "Reverse Proxy Configuration"
+ description: "Reverse Proxy configuration"
+ - name: "Advanced"
+ description: "Advanced Configuration"
+ - name: "WARNING"
+ description: "WARNING"
+portals:
+ web_portal:
+ protocols:
+ - "$kubernetes-resource_configmap_portal_protocol"
+ host:
+ - "$kubernetes-resource_configmap_portal_host"
+ ports:
+ - "$kubernetes-resource_configmap_portal_port"
+questions:
+ - variable: portal
+ group: "Container Image"
+ label: "Configure Portal Button"
+ schema:
+ type: dict
+ hidden: true
+ attrs:
+ - variable: enabled
+ label: "Enable"
+ description: "enable the portal button"
+ schema:
+ hidden: true
+ editable: false
+ type: boolean
+ default: true
+
+ # Update Policy
+ - variable: strategyType
+ group: "Container Image"
+ label: "Update Strategy"
+ schema:
+ type: string
+ default: "Recreate"
+ enum:
+ - value: "RollingUpdate"
+ description: "Create new pods and then kill old ones"
+ - value: "Recreate"
+ description: "Kill existing pods before creating new ones"
+ # Configure Time Zone
+ - variable: timezone
+ group: "Container Image"
+ label: "Timezone"
+ schema:
+ type: string
+ default: "Etc/UTC"
+ $ref:
+ - "definitions/timezone"
+
+ # Configure Enviroment Variables
+ - variable: environmentVariables
+ label: "Image environment"
+ group: "Configuration"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: environmentVariable
+ label: "Environment Variable"
+ schema:
+ type: dict
+ attrs:
+ - variable: name
+ label: "Name"
+ schema:
+ type: string
+ - variable: value
+ label: "Value"
+ schema:
+ type: string
+ # Enable Host Networking
+ - variable: hostNetwork
+ group: "Networking"
+ label: "Enable Host Networking"
+ schema:
+ type: boolean
+ default: false
+ - variable: services
+ group: "Networking"
+ label: "Configure Service"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "Main service"
+ description: "The Primary service on which the healthcheck runs, often the webUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: false
+ enum:
+ - value: HTTP
+ description: "HTTP"
+ - value: "HTTPS"
+ description: "HTTPS"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 80
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 80
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36046
+ required: true
+## TrueCharts Specific
+ - variable: persistence
+ label: "Integrated Persistent Storage"
+ description: "Websocket Service"
+ group: "Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: config
+ label: "App Config Storage"
+ description: "Stores the Application Configuration."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: "/config"
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "100Gi"
+ - variable: data
+ label: "App Config Storage"
+ description: "Stores the Application Configuration."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: "/data"
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "100Gi"
+ - variable: customStorage
+ label: "Custom app storage"
+ group: "Storage"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: volumeMount
+ label: "Custom Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enabled"
+ schema:
+ type: boolean
+ default: true
+ required: true
+ hidden: true
+ editable: false
+ - variable: setPermissions
+ label: "Automatic Permissions"
+ description: "Automatically set permissions on install"
+ schema:
+ type: boolean
+ default: true
+ hidden: false
+ - variable: readOnly
+ label: "Mount as ReadOnly"
+ description: "prevent any write from being done to the mounted volume"
+ schema:
+ type: boolean
+ default: false
+ hidden: false
+ - variable: emptyDir
+ label: "emptyDir"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ editable: false
+ - variable: mountPath
+ label: "Mount Path"
+ description: "Path to mount inside the pod"
+ schema:
+ type: path
+ required: true
+ default: ""
+ editable: true
+ - variable: hostPath
+ label: "Host Path"
+ schema:
+ type: hostpath
+ required: true
+ - variable: ingress
+ label: ""
+ group: "Reverse Proxy Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "WebUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: certType
+ label: "Select Reverse-Proxy Type"
+ schema:
+ type: string
+ default: "disabled"
+ enum:
+ - value: "disabled"
+ description: "Disabled"
+ - value: ""
+ description: "No Encryption/TLS/Certificates"
+ - value: "selfsigned"
+ description: "Self-Signed Certificate"
+ - value: "ixcert"
+ description: "TrueNAS SCALE Certificate"
+ - variable: type
+ label: "Reverse Proxy Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: true
+ editable: false
+ required: true
+ - variable: serviceName
+ label: "Service name to proxy to"
+ schema:
+ hidden: true
+ editable: false
+ type: string
+ default: ""
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: "websecure"
+ required: true
+ enum:
+ - value: "websecure"
+ description: "Websecure: HTTPS/TLS port 443"
+ - variable: hosts
+ label: "Hosts"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: list
+ default: []
+ items:
+ - variable: host
+ label: "Host"
+ schema:
+ type: dict
+ attrs:
+ - variable: host
+ label: "Domain Name"
+ required: true
+ schema:
+ type: string
+ - variable: path
+ label: "path"
+ schema:
+ type: string
+ required: true
+ hidden: true
+ default: "/"
+ - variable: certificate
+ label: "Select TrueNAS SCALE Certificate"
+ schema:
+ type: int
+ show_if: [["certType", "=", "ixcert"]]
+ $ref:
+ - "definitions/certificate"
+ - variable: authForwardURL
+ label: "Forward Authentication URL"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: ""
+ - variable: PUID
+ group: "Advanced"
+ label: "PUID"
+ description: "Sets the PUID env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: int
+ default: 568
+
+ - variable: PGID
+ group: "Advanced"
+ label: "PGID"
+ description: "Sets the PGID env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: int
+ default: 568
+ - variable: UMASK
+ group: "Advanced"
+ label: "UMASK"
+ description: "Sets the UMASK env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: string
+ default: "002"
+ # Enable privileged
+ - variable: securityContext
+ group: "Advanced"
+ label: "Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: privileged
+ label: "Enable privileged mode for Common-Chart based charts"
+ schema:
+ type: boolean
+ default: false
+ # Set Pod Security Policy
+ - variable: podSecurityContext
+ group: "Advanced"
+ label: "Pod Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: runAsNonRoot
+ label: "runAsNonRoot"
+ schema:
+ type: boolean
+ default: false
+ - variable: runAsUser
+ label: "runAsUser"
+ description: "The UserID of the user running the application"
+ schema:
+ type: int
+ default: 0
+ - variable: runAsGroup
+ label: "runAsGroup"
+ description: The groupID this App of the user running the application"
+ schema:
+ type: int
+ default: 0
+ - variable: supplementalGroups
+ label: "supplementalGroups"
+ description: "Additional groups this App needs access to"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: Group
+ label: "Group"
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroup
+ label: "fsGroup"
+ description: "The group that should own ALL storage."
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroupChangePolicy
+ label: "When should we take ownership?"
+ schema:
+ type: string
+ default: "OnRootMismatch"
+ enum:
+ - value: "OnRootMismatch"
+ description: "OnRootMismatch"
+ - value: "Always"
+ description: "Always"
diff --git a/scale-catalog-template/test/organizr/3.1.5/templates/common.yaml b/scale-catalog-template/test/organizr/3.1.5/templates/common.yaml
new file mode 100644
index 00000000..a6613c2c
--- /dev/null
+++ b/scale-catalog-template/test/organizr/3.1.5/templates/common.yaml
@@ -0,0 +1 @@
+{{ include "common.all" . }}
diff --git a/scale-catalog-template/test/organizr/3.1.5/test_values.yaml b/scale-catalog-template/test/organizr/3.1.5/test_values.yaml
new file mode 100644
index 00000000..c784dfb7
--- /dev/null
+++ b/scale-catalog-template/test/organizr/3.1.5/test_values.yaml
@@ -0,0 +1,35 @@
+# Default values for Organizr.
+
+image:
+ repository: organizr/organizr
+ pullPolicy: Always
+ tag: latest
+
+strategy:
+ type: Recreate
+
+# Configure the Security Context for the Pod
+podSecurityContext:
+ runAsNonRoot: false
+ runAsUser: 0
+ runAsGroup: 0
+ fsGroup: 0
+
+services:
+ main:
+ port:
+ port: 80
+
+env: {}
+ # TZ: UTC
+ # PUID: 1001
+ # PGID: 1001
+
+persistence:
+ config:
+ enabled: true
+ mountPath: "/config"
+ emptyDir: true
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ storageClass: ""
diff --git a/scale-catalog-template/test/organizr/3.1.5/values.yaml b/scale-catalog-template/test/organizr/3.1.5/values.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/scale-catalog-template/test/organizr/item.yaml b/scale-catalog-template/test/organizr/item.yaml
new file mode 100644
index 00000000..8d111e1f
--- /dev/null
+++ b/scale-catalog-template/test/organizr/item.yaml
@@ -0,0 +1,3 @@
+categories:
+ - organizers
+icon_url: https://github.com/causefx/Organizr/blob/v2-master/plugins/images/organizr/logo.png?raw=true
diff --git a/scale-catalog-template/test/podgrab/1.0.3/CONFIG.md b/scale-catalog-template/test/podgrab/1.0.3/CONFIG.md
new file mode 100644
index 00000000..6d760c18
--- /dev/null
+++ b/scale-catalog-template/test/podgrab/1.0.3/CONFIG.md
@@ -0,0 +1,8 @@
+# Configuration Options
+
+##### Connecting to other apps
+If you need to connect this App to other Apps on TrueNAS SCALE, please refer to our "Linking Apps Together" guide:
+https://truecharts.org/manual/linking/
+
+##### Available config options
+In the future this page is going to contain an automated list of options available in the installation/edit UI.
diff --git a/scale-catalog-template/test/podgrab/1.0.3/Chart.lock b/scale-catalog-template/test/podgrab/1.0.3/Chart.lock
new file mode 100644
index 00000000..ad7bd61f
--- /dev/null
+++ b/scale-catalog-template/test/podgrab/1.0.3/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+digest: sha256:ea66c36be2fa73e56bc33f7e89af9ce338cdfbed0b347484888e87228b825015
+generated: "2021-05-06T13:29:59.589063587Z"
diff --git a/scale-catalog-template/test/podgrab/1.0.3/Chart.yaml b/scale-catalog-template/test/podgrab/1.0.3/Chart.yaml
new file mode 100644
index 00000000..da35df55
--- /dev/null
+++ b/scale-catalog-template/test/podgrab/1.0.3/Chart.yaml
@@ -0,0 +1,27 @@
+apiVersion: v2
+kubeVersion: ">=1.16.0-0"
+name: podgrab
+version: 1.0.3
+upstream_version: 1.0.0
+appVersion: "latest"
+description: A self-hosted podcast manager to download episodes as soon as they become live.
+type: application
+deprecated: false
+home: https://github.com/truecharts/apps/tree/master/incubator/podgrab
+icon: https://truecharts.org/_static/img/podgrab-icon.png
+keywords:
+ - podgrab
+sources:
+ - https://github.com/akhilrex/podgrab
+ - https://hub.docker.com/r/akhilrex/podgrab
+dependencies:
+ - name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+maintainers:
+ - name: TrueCharts
+ email: info@truecharts.org
+ url: truecharts.org
+ - name: warllo54
+ email: 20650065+warllo54@users.noreply.github.com
+ url: truecharts.org
diff --git a/scale-catalog-template/test/podgrab/1.0.3/README.md b/scale-catalog-template/test/podgrab/1.0.3/README.md
new file mode 100644
index 00000000..9977071a
--- /dev/null
+++ b/scale-catalog-template/test/podgrab/1.0.3/README.md
@@ -0,0 +1,54 @@
+# Introduction
+
+![Version: 1.0.3](https://img.shields.io/badge/Version-1.0.3-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: latest](https://img.shields.io/badge/AppVersion-latest-informational?style=flat-square)
+
+A self-hosted podcast manager to download episodes as soon as they become live.
+
+TrueCharts are designed to be installed as TrueNAS SCALE app only. We can not guarantee this charts works as a stand-alone helm installation.
+**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/apps/issues/new/choose)**
+
+## Source Code
+
+*
+*
+
+## Requirements
+
+Kubernetes: `>=1.16.0-0`
+
+## Dependencies
+
+| Repository | Name | Version |
+|------------|------|---------|
+| https://truecharts.org/ | common | 3.5.5 |
+
+## Installing the Chart
+
+To install the chart with the release name `podgrab`
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Click "Install" for this specific Apps
+- Fill out the configuration form
+
+## Uninstalling the Chart
+
+To uninstall the `podgrab` deployment
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Go to "Installed Apps"
+- Expand the menu in the top-right corner of this App
+- Click "Remove" for this specific Apps
+
+The command removes all the Kubernetes components associated with the chart **including storage volumes** _(Except hostPath Storage)_ and deletes the release.
+
+## Support
+
+- See the [Wiki](https://truecharts.org)
+- Open a [issue](https://github.com/truecharts/apps/issues/new/choose)
+- Ask a [question](https://github.com/truecharts/apps/discussions)
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
+All Rights Reserved - The TrueCharts Project
diff --git a/scale-catalog-template/test/podgrab/1.0.3/app-readme.md b/scale-catalog-template/test/podgrab/1.0.3/app-readme.md
new file mode 100644
index 00000000..9d85b5de
--- /dev/null
+++ b/scale-catalog-template/test/podgrab/1.0.3/app-readme.md
@@ -0,0 +1,3 @@
+A self-hosted podcast manager to download episodes as soon as they become live.
+This App is supplied by TrueCharts, for more information please visit https://truecharts.org
+A self-hosted podcast manager to download episodes as soon as they become live.
diff --git a/scale-catalog-template/test/podgrab/1.0.3/charts/common-3.5.5.tgz b/scale-catalog-template/test/podgrab/1.0.3/charts/common-3.5.5.tgz
new file mode 100644
index 00000000..d01688bb
Binary files /dev/null and b/scale-catalog-template/test/podgrab/1.0.3/charts/common-3.5.5.tgz differ
diff --git a/scale-catalog-template/test/podgrab/1.0.3/ix_values.yaml b/scale-catalog-template/test/podgrab/1.0.3/ix_values.yaml
new file mode 100644
index 00000000..4d5da6cf
--- /dev/null
+++ b/scale-catalog-template/test/podgrab/1.0.3/ix_values.yaml
@@ -0,0 +1,16 @@
+##
+# This file contains Values.yaml content that gets added to the output of questions.yaml
+# It's ONLY meant for content that the user is NOT expected to change.
+# Example: Everything under "image" is not included in questions.yaml but is included here.
+##
+
+image:
+ repository: akhilrex/podgrab
+ pullPolicy: Always
+ tag: latest
+
+
+##
+# Most other defaults are set in questions.yaml
+# For other options please refer to the wiki, default_values.yaml or the common library chart
+##
diff --git a/scale-catalog-template/test/podgrab/1.0.3/questions.yaml b/scale-catalog-template/test/podgrab/1.0.3/questions.yaml
new file mode 100644
index 00000000..023e9e17
--- /dev/null
+++ b/scale-catalog-template/test/podgrab/1.0.3/questions.yaml
@@ -0,0 +1,454 @@
+groups:
+ - name: "Container Image"
+ description: "Image to be used for container"
+ - name: "Workload Configuration"
+ description: "Configure workload deployment"
+ - name: "Configuration"
+ description: "additional container configuration"
+ - name: "Networking"
+ description: "Configure / service for container"
+ - name: "Storage"
+ description: "Persist and share data that is separate from the lifecycle of the container"
+ - name: "Resources and Devices"
+ description: "Specify resources/devices to be allocated to workload"
+ - name: "Reverse Proxy Configuration"
+ description: "Reverse Proxy configuration"
+ - name: "Advanced"
+ description: "Advanced Configuration"
+ - name: "WARNING"
+ description: "WARNING"
+portals:
+ web_portal:
+ protocols:
+ - "$kubernetes-resource_configmap_portal_protocol"
+ host:
+ - "$kubernetes-resource_configmap_portal_host"
+ ports:
+ - "$kubernetes-resource_configmap_portal_port"
+questions:
+ - variable: portal
+ group: "Container Image"
+ label: "Configure Portal Button"
+ schema:
+ type: dict
+ hidden: true
+ attrs:
+ - variable: enabled
+ label: "Enable"
+ description: "enable the portal button"
+ schema:
+ hidden: true
+ editable: false
+ type: boolean
+ default: true
+
+ # Update Policy
+ - variable: strategyType
+ group: "Container Image"
+ label: "Update Strategy"
+ schema:
+ type: string
+ default: "Recreate"
+ enum:
+ - value: "RollingUpdate"
+ description: "Create new pods and then kill old ones"
+ - value: "Recreate"
+ description: "Kill existing pods before creating new ones"
+ # Configure Time Zone
+ - variable: timezone
+ group: "Container Image"
+ label: "Timezone"
+ schema:
+ type: string
+ default: "Etc/UTC"
+ $ref:
+ - "definitions/timezone"
+
+# App env variables
+ - variable: env
+ group: "Configuration"
+ label: "Image Environment"
+ schema:
+ type: dict
+ attrs:
+ - variable: PASSWORD
+ label: "Password"
+ description: "Desired Password"
+ schema:
+ type: string
+ default: ""
+ required: false
+ - variable: CHECK_FREQUENCY
+ label: "Update Frequency"
+ description: "Interval to check for new podcasts"
+ schema:
+ type: int
+ default: 240
+ required: true
+
+ # Configure Enviroment Variables
+ - variable: environmentVariables
+ label: "Image environment"
+ group: "Configuration"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: environmentVariable
+ label: "Environment Variable"
+ schema:
+ type: dict
+ attrs:
+ - variable: name
+ label: "Name"
+ schema:
+ type: string
+ - variable: value
+ label: "Value"
+ schema:
+ type: string
+
+ # Enable Host Networking
+ - variable: hostNetwork
+ group: "Networking"
+ label: "Enable Host Networking"
+ schema:
+ type: boolean
+ default: false
+ - variable: services
+ group: "Networking"
+ label: "Configure Service"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "Main service"
+ description: "The Primary service on which the healthcheck runs, often the webUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: false
+ enum:
+ - value: HTTP
+ description: "HTTP"
+ - value: "HTTPS"
+ description: "HTTPS"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 8080
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 51080
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36047
+ required: true
+## TrueCharts Specific
+ - variable: persistence
+ label: "Integrated Persistent Storage"
+ description: "Config Storage"
+ group: "Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: config
+ label: "App Config Storage"
+ description: "Stores the Application Configuration."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: "/config"
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "1Gi"
+
+ - variable: customStorage
+ label: "Custom app storage"
+ group: "Storage"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: volumeMount
+ label: "Custom Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enabled"
+ schema:
+ type: boolean
+ default: true
+ required: true
+ hidden: true
+ editable: false
+ - variable: setPermissions
+ label: "Automatic Permissions"
+ description: "Automatically set permissions on install"
+ schema:
+ type: boolean
+ default: true
+ hidden: false
+ - variable: readOnly
+ label: "Mount as ReadOnly"
+ description: "prevent any write from being done to the mounted volume"
+ schema:
+ type: boolean
+ default: false
+ hidden: false
+ - variable: emptyDir
+ label: "emptyDir"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ editable: false
+ - variable: mountPath
+ label: "Mount Path"
+ description: "Path to mount inside the pod"
+ schema:
+ type: path
+ required: true
+ default: ""
+ editable: true
+ - variable: hostPath
+ label: "Host Path"
+ schema:
+ type: hostpath
+ required: true
+ - variable: ingress
+ label: ""
+ group: "Reverse Proxy Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "WebUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: certType
+ label: "Select Reverse-Proxy Type"
+ schema:
+ type: string
+ default: "disabled"
+ enum:
+ - value: "disabled"
+ description: "Disabled"
+ - value: ""
+ description: "No Encryption/TLS/Certificates"
+ - value: "selfsigned"
+ description: "Self-Signed Certificate"
+ - value: "ixcert"
+ description: "TrueNAS SCALE Certificate"
+ - variable: type
+ label: "Reverse Proxy Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: true
+ editable: false
+ required: true
+ - variable: serviceName
+ label: "Service name to proxy to"
+ schema:
+ hidden: true
+ editable: false
+ type: string
+ default: ""
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: "websecure"
+ required: true
+ enum:
+ - value: "websecure"
+ description: "Websecure: HTTPS/TLS port 443"
+ - variable: hosts
+ label: "Hosts"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: list
+ default: []
+ items:
+ - variable: host
+ label: "Host"
+ schema:
+ type: dict
+ attrs:
+ - variable: host
+ label: "Domain Name"
+ required: true
+ schema:
+ type: string
+ - variable: path
+ label: "path"
+ schema:
+ type: string
+ required: true
+ hidden: true
+ default: "/"
+ - variable: certificate
+ label: "Select TrueNAS SCALE Certificate"
+ schema:
+ type: int
+ show_if: [["certType", "=", "ixcert"]]
+ $ref:
+ - "definitions/certificate"
+ - variable: authForwardURL
+ label: "Forward Authentication URL"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: ""
+
+ # Enable privileged
+ - variable: securityContext
+ group: "Advanced"
+ label: "Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: privileged
+ label: "Enable privileged mode for Common-Chart based charts"
+ schema:
+ type: boolean
+ default: false
+
+ # Set Pod Security Policy
+ - variable: podSecurityContext
+ group: "Advanced"
+ label: "Pod Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: runAsNonRoot
+ label: "runAsNonRoot"
+ schema:
+ type: boolean
+ default: true
+ - variable: runAsUser
+ label: "runAsUser"
+ description: "The UserID of the user running the application"
+ schema:
+ type: int
+ default: 568
+ - variable: runAsGroup
+ label: "runAsGroup"
+ description: The groupID this App of the user running the application"
+ schema:
+ type: int
+ default: 568
+ - variable: supplementalGroups
+ label: "supplementalGroups"
+ description: "Additional groups this App needs access to"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: Group
+ label: "Group"
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroup
+ label: "fsGroup"
+ description: "The group that should own ALL storage."
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroupChangePolicy
+ label: "When should we take ownership?"
+ schema:
+ type: string
+ default: "OnRootMismatch"
+ enum:
+ - value: "OnRootMismatch"
+ description: "OnRootMismatch"
+ - value: "Always"
+ description: "Always"
diff --git a/scale-catalog-template/test/podgrab/1.0.3/templates/common.yaml b/scale-catalog-template/test/podgrab/1.0.3/templates/common.yaml
new file mode 100644
index 00000000..a6613c2c
--- /dev/null
+++ b/scale-catalog-template/test/podgrab/1.0.3/templates/common.yaml
@@ -0,0 +1 @@
+{{ include "common.all" . }}
diff --git a/scale-catalog-template/test/podgrab/1.0.3/test_values.yaml b/scale-catalog-template/test/podgrab/1.0.3/test_values.yaml
new file mode 100644
index 00000000..6982fed0
--- /dev/null
+++ b/scale-catalog-template/test/podgrab/1.0.3/test_values.yaml
@@ -0,0 +1,47 @@
+# Default values for podgrab.
+
+image:
+ repository: akhilrex/podgrab
+ pullPolicy: Always
+ tag: latest
+
+strategy:
+ type: Recreate
+
+# Configure the Security Context for the Pod
+podSecurityContext:
+ runAsNonRoot: true
+ runAsUser: 568
+ runAsGroup: 568
+ fsGroup: 568
+
+services:
+ main:
+ port:
+ port: 8080
+ tcp:
+ enabled: true
+ type: ClusterIP
+ port:
+ port: 51080
+ protocol: TCP
+ targetPort: 51080
+
+env:
+ PASSWORD: secretpasswordgoeshere
+ CHECK_FREQUENCY: 240
+
+persistence:
+ config:
+ enabled: true
+ mountPath: "/config"
+ emptyDir: true
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ storageClass: ""
+
+customStorage:
+ - name: assets
+ enabled: true
+ mountPath: "/assets"
+ emptyDir: true
diff --git a/scale-catalog-template/test/podgrab/1.0.3/values.yaml b/scale-catalog-template/test/podgrab/1.0.3/values.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/scale-catalog-template/test/podgrab/item.yaml b/scale-catalog-template/test/podgrab/item.yaml
new file mode 100644
index 00000000..8fea192f
--- /dev/null
+++ b/scale-catalog-template/test/podgrab/item.yaml
@@ -0,0 +1,3 @@
+categories:
+ - mutlimedia
+icon_url: https://truecharts.org/_static/img/podgrab-icon.png
diff --git a/scale-catalog-template/test/qbittorrent/3.1.5/CONFIG.md b/scale-catalog-template/test/qbittorrent/3.1.5/CONFIG.md
new file mode 100644
index 00000000..6d760c18
--- /dev/null
+++ b/scale-catalog-template/test/qbittorrent/3.1.5/CONFIG.md
@@ -0,0 +1,8 @@
+# Configuration Options
+
+##### Connecting to other apps
+If you need to connect this App to other Apps on TrueNAS SCALE, please refer to our "Linking Apps Together" guide:
+https://truecharts.org/manual/linking/
+
+##### Available config options
+In the future this page is going to contain an automated list of options available in the installation/edit UI.
diff --git a/scale-catalog-template/test/qbittorrent/3.1.5/Chart.lock b/scale-catalog-template/test/qbittorrent/3.1.5/Chart.lock
new file mode 100644
index 00000000..42139f48
--- /dev/null
+++ b/scale-catalog-template/test/qbittorrent/3.1.5/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+digest: sha256:ea66c36be2fa73e56bc33f7e89af9ce338cdfbed0b347484888e87228b825015
+generated: "2021-05-06T13:30:00.098310198Z"
diff --git a/scale-catalog-template/test/qbittorrent/3.1.5/Chart.yaml b/scale-catalog-template/test/qbittorrent/3.1.5/Chart.yaml
new file mode 100644
index 00000000..37d8d5de
--- /dev/null
+++ b/scale-catalog-template/test/qbittorrent/3.1.5/Chart.yaml
@@ -0,0 +1,28 @@
+apiVersion: v2
+kubeVersion: ">=1.16.0-0"
+name: qbittorrent
+version: 3.1.5
+upstream_version: 7.2.1
+appVersion: "auto"
+description: qBittorrent is a cross-platform free and open-source BitTorrent client
+type: application
+deprecated: false
+home: https://github.com/truecharts/apps/tree/master/incubator/qbittorrent
+icon: https://cloud.githubusercontent.com/assets/14862437/23586868/89ef2922-01c4-11e7-869c-52aafcece17f.png
+keywords:
+ - qbittorrent
+ - torrrent
+sources:
+ - https://github.com/truecharts/apps/tree/master/incubator/qbittorrent
+ - https://github.com/k8s-at-home/charts/tree/master/charts/qbittorrent
+ - https://hub.docker.com/r/linuxserver/qbittorrent/
+dependencies:
+ - name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+ # condition:
+maintainers:
+ - name: TrueCharts
+ email: info@truecharts.org
+ url: truecharts.org
+# annotations:
diff --git a/scale-catalog-template/test/qbittorrent/3.1.5/README.md b/scale-catalog-template/test/qbittorrent/3.1.5/README.md
new file mode 100644
index 00000000..885309a1
--- /dev/null
+++ b/scale-catalog-template/test/qbittorrent/3.1.5/README.md
@@ -0,0 +1,55 @@
+# Introduction
+
+![Version: 3.1.5](https://img.shields.io/badge/Version-3.1.5-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: auto](https://img.shields.io/badge/AppVersion-auto-informational?style=flat-square)
+
+qBittorrent is a cross-platform free and open-source BitTorrent client
+
+TrueCharts are designed to be installed as TrueNAS SCALE app only. We can not guarantee this charts works as a stand-alone helm installation.
+**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/apps/issues/new/choose)**
+
+## Source Code
+
+*
+*
+*
+
+## Requirements
+
+Kubernetes: `>=1.16.0-0`
+
+## Dependencies
+
+| Repository | Name | Version |
+|------------|------|---------|
+| https://truecharts.org/ | common | 3.5.5 |
+
+## Installing the Chart
+
+To install the chart with the release name `qbittorrent`
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Click "Install" for this specific Apps
+- Fill out the configuration form
+
+## Uninstalling the Chart
+
+To uninstall the `qbittorrent` deployment
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Go to "Installed Apps"
+- Expand the menu in the top-right corner of this App
+- Click "Remove" for this specific Apps
+
+The command removes all the Kubernetes components associated with the chart **including storage volumes** _(Except hostPath Storage)_ and deletes the release.
+
+## Support
+
+- See the [Wiki](https://truecharts.org)
+- Open a [issue](https://github.com/truecharts/apps/issues/new/choose)
+- Ask a [question](https://github.com/truecharts/apps/discussions)
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
+All Rights Reserved - The TrueCharts Project
diff --git a/scale-catalog-template/test/qbittorrent/3.1.5/app-readme.md b/scale-catalog-template/test/qbittorrent/3.1.5/app-readme.md
new file mode 100644
index 00000000..5d26b483
--- /dev/null
+++ b/scale-catalog-template/test/qbittorrent/3.1.5/app-readme.md
@@ -0,0 +1,3 @@
+qBittorrent is a cross-platform free and open-source BitTorrent client
+This App is supplied by TrueCharts, for more information please visit https://truecharts.org
+qBittorrent is a cross-platform free and open-source BitTorrent client
diff --git a/scale-catalog-template/test/qbittorrent/3.1.5/charts/common-3.5.5.tgz b/scale-catalog-template/test/qbittorrent/3.1.5/charts/common-3.5.5.tgz
new file mode 100644
index 00000000..d01688bb
Binary files /dev/null and b/scale-catalog-template/test/qbittorrent/3.1.5/charts/common-3.5.5.tgz differ
diff --git a/scale-catalog-template/test/qbittorrent/3.1.5/ix_values.yaml b/scale-catalog-template/test/qbittorrent/3.1.5/ix_values.yaml
new file mode 100644
index 00000000..a99eddee
--- /dev/null
+++ b/scale-catalog-template/test/qbittorrent/3.1.5/ix_values.yaml
@@ -0,0 +1,15 @@
+##
+# This file contains Values.yaml content that gets added to the output of questions.yaml
+# It's ONLY meant for content that the user is NOT expected to change.
+# Example: Everything under "image" is not included in questions.yaml but is included here.
+##
+
+image:
+ repository: ghcr.io/truecharts/qbittorrent
+ pullPolicy: IfNotPresent
+ tag: v4.3.5
+
+##
+# Most other defaults are set in questions.yaml
+# For other options please refer to the wiki, default_values.yaml or the common library chart
+##
diff --git a/scale-catalog-template/test/qbittorrent/3.1.5/questions.yaml b/scale-catalog-template/test/qbittorrent/3.1.5/questions.yaml
new file mode 100644
index 00000000..d2494a1b
--- /dev/null
+++ b/scale-catalog-template/test/qbittorrent/3.1.5/questions.yaml
@@ -0,0 +1,563 @@
+groups:
+ - name: "Container Image"
+ description: "Image to be used for container"
+ - name: "Workload Configuration"
+ description: "Configure workload deployment"
+ - name: "Configuration"
+ description: "additional container configuration"
+ - name: "Networking"
+ description: "Configure / service for container"
+ - name: "Storage"
+ description: "Persist and share data that is separate from the lifecycle of the container"
+ - name: "Resources and Devices"
+ description: "Specify resources/devices to be allocated to workload"
+ - name: "Reverse Proxy Configuration"
+ description: "Reverse Proxy configuration"
+ - name: "Advanced"
+ description: "Advanced Configuration"
+ - name: "WARNING"
+ description: "WARNING"
+portals:
+ web_portal:
+ protocols:
+ - "$kubernetes-resource_configmap_portal_protocol"
+ host:
+ - "$kubernetes-resource_configmap_portal_host"
+ ports:
+ - "$kubernetes-resource_configmap_portal_port"
+questions:
+ - variable: portal
+ group: "Container Image"
+ label: "Configure Portal Button"
+ schema:
+ type: dict
+ hidden: true
+ attrs:
+ - variable: enabled
+ label: "Enable"
+ description: "enable the portal button"
+ schema:
+ hidden: true
+ editable: false
+ type: boolean
+ default: true
+
+ # Update Policy
+ - variable: strategyType
+ group: "Container Image"
+ label: "Update Strategy"
+ schema:
+ type: string
+ default: "Recreate"
+ enum:
+ - value: "RollingUpdate"
+ description: "Create new pods and then kill old ones"
+ - value: "Recreate"
+ description: "Kill existing pods before creating new ones"
+ # Configure Time Zone
+ - variable: timezone
+ group: "Container Image"
+ label: "Timezone"
+ schema:
+ type: string
+ default: "Etc/UTC"
+ $ref:
+ - "definitions/timezone"
+
+ # Configure Enviroment Variables
+ - variable: environmentVariables
+ label: "Image environment"
+ group: "Configuration"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: environmentVariable
+ label: "Environment Variable"
+ schema:
+ type: dict
+ attrs:
+ - variable: name
+ label: "Name"
+ schema:
+ type: string
+ - variable: value
+ label: "Value"
+ schema:
+ type: string
+ # Enable Host Networking
+ - variable: hostNetwork
+ group: "Networking"
+ label: "Enable Host Networking"
+ schema:
+ type: boolean
+ default: false
+ - variable: services
+ group: "Networking"
+ label: "Configure Service"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "Main service"
+ description: "The Primary service on which the healthcheck runs, often the webUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: false
+ enum:
+ - value: HTTP
+ description: "HTTP"
+ - value: "HTTPS"
+ description: "HTTPS"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 8080
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 8080
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36039
+ required: true
+ - variable: tcp
+ label: "TCP Torrent connections"
+ description: "This service is used to process incomming torrent connections over TCP"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "NodePort"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "TCP"
+ hidden: true
+ enum:
+ - value: TCP
+ description: "TCP"
+ - value: "UDP"
+ description: "UDP"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 6881
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 51413
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36040
+ required: true
+ - variable: udp
+ label: "UDP Torrent connections"
+ description: "This service is used to process incomming torrent connections over UDP"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "NodePort"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "UDP"
+ hidden: true
+ enum:
+ - value: TCP
+ description: "TCP"
+ - value: "UDP"
+ description: "UDP"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 6881
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 51413
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36040
+ required: true
+## TrueCharts Specific
+ - variable: persistence
+ label: "Integrated Persistent Storage"
+ description: "Websocket Service"
+ group: "Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: config
+ label: "App Config Storage"
+ description: "Stores the Application Configuration."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: "/config"
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "100Gi"
+
+ - variable: customStorage
+ label: "Custom app storage"
+ group: "Storage"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: volumeMount
+ label: "Custom Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enabled"
+ schema:
+ type: boolean
+ default: true
+ required: true
+ hidden: true
+ editable: false
+ - variable: setPermissions
+ label: "Automatic Permissions"
+ description: "Automatically set permissions on install"
+ schema:
+ type: boolean
+ default: true
+ hidden: false
+ - variable: readOnly
+ label: "Mount as ReadOnly"
+ description: "prevent any write from being done to the mounted volume"
+ schema:
+ type: boolean
+ default: false
+ hidden: false
+ - variable: emptyDir
+ label: "emptyDir"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ editable: false
+ - variable: mountPath
+ label: "Mount Path"
+ description: "Path to mount inside the pod"
+ schema:
+ type: path
+ required: true
+ default: ""
+ editable: true
+ - variable: hostPath
+ label: "Host Path"
+ schema:
+ type: hostpath
+ required: true
+ - variable: ingress
+ label: ""
+ group: "Reverse Proxy Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "WebUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: certType
+ label: "Select Reverse-Proxy Type"
+ schema:
+ type: string
+ default: "disabled"
+ enum:
+ - value: "disabled"
+ description: "Disabled"
+ - value: ""
+ description: "No Encryption/TLS/Certificates"
+ - value: "selfsigned"
+ description: "Self-Signed Certificate"
+ - value: "ixcert"
+ description: "TrueNAS SCALE Certificate"
+ - variable: type
+ label: "Reverse Proxy Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: true
+ editable: false
+ required: true
+ - variable: serviceName
+ label: "Service name to proxy to"
+ schema:
+ hidden: true
+ editable: false
+ type: string
+ default: ""
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: "websecure"
+ required: true
+ enum:
+ - value: "websecure"
+ description: "Websecure: HTTPS/TLS port 443"
+ - variable: hosts
+ label: "Hosts"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: list
+ default: []
+ items:
+ - variable: host
+ label: "Host"
+ schema:
+ type: dict
+ attrs:
+ - variable: host
+ label: "Domain Name"
+ required: true
+ schema:
+ type: string
+ - variable: path
+ label: "path"
+ schema:
+ type: string
+ required: true
+ hidden: true
+ default: "/"
+ - variable: certificate
+ label: "Select TrueNAS SCALE Certificate"
+ schema:
+ type: int
+ show_if: [["certType", "=", "ixcert"]]
+ $ref:
+ - "definitions/certificate"
+ - variable: authForwardURL
+ label: "Forward Authentication URL"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: ""
+
+ - variable: UMASK
+ group: "Advanced"
+ label: "UMASK"
+ description: "Sets the UMASK env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: string
+ default: "002"
+ # Enable privileged
+ - variable: securityContext
+ group: "Advanced"
+ label: "Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: privileged
+ label: "Enable privileged mode for Common-Chart based charts"
+ schema:
+ type: boolean
+ default: false
+ # Set Pod Security Policy
+ - variable: podSecurityContext
+ group: "Advanced"
+ label: "Pod Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: runAsNonRoot
+ label: "runAsNonRoot"
+ schema:
+ type: boolean
+ default: true
+ - variable: runAsUser
+ label: "runAsUser"
+ description: "The UserID of the user running the application"
+ schema:
+ type: int
+ default: 568
+ - variable: runAsGroup
+ label: "runAsGroup"
+ description: The groupID this App of the user running the application"
+ schema:
+ type: int
+ default: 568
+ - variable: supplementalGroups
+ label: "supplementalGroups"
+ description: "Additional groups this App needs access to"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: Group
+ label: "Group"
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroup
+ label: "fsGroup"
+ description: "The group that should own ALL storage."
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroupChangePolicy
+ label: "When should we take ownership?"
+ schema:
+ type: string
+ default: "OnRootMismatch"
+ enum:
+ - value: "OnRootMismatch"
+ description: "OnRootMismatch"
+ - value: "Always"
+ description: "Always"
diff --git a/scale-catalog-template/test/qbittorrent/3.1.5/templates/common.yaml b/scale-catalog-template/test/qbittorrent/3.1.5/templates/common.yaml
new file mode 100644
index 00000000..a6613c2c
--- /dev/null
+++ b/scale-catalog-template/test/qbittorrent/3.1.5/templates/common.yaml
@@ -0,0 +1 @@
+{{ include "common.all" . }}
diff --git a/scale-catalog-template/test/qbittorrent/3.1.5/templates/configmap.yaml b/scale-catalog-template/test/qbittorrent/3.1.5/templates/configmap.yaml
new file mode 100644
index 00000000..f8549d96
--- /dev/null
+++ b/scale-catalog-template/test/qbittorrent/3.1.5/templates/configmap.yaml
@@ -0,0 +1,45 @@
+##
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# `SPDX-License-Identifier: Apache-2.0`
+#
+# This file is considered to be modified by the TrueCharts Project.
+##
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: {{ template "common.names.fullname" . }}-scripts
+ labels:
+ {{- include "common.labels" . | nindent 4 }}
+data:
+ {{- $bittorrentPort := "" -}}
+ {{- $bittorrentPort = .Values.services.tcp.port.port -}}
+ {{- if $bittorrentPort }}
+ 31-update-port: |-
+ #!/bin/bash
+ QBITTORRENT_CONFIGFILE="/config/qBittorrent/qBittorrent.conf"
+ INCOMING_PORT={{- $bittorrentPort }}
+
+ incoming_port_exist=$(cat ${QBITTORRENT_CONFIGFILE} | grep -m 1 'Connection\\PortRangeMin='${INCOMING_PORT})
+ if [[ -z "${incoming_port_exist}" ]]; then
+ incoming_exist=$(cat ${QBITTORRENT_CONFIGFILE} | grep -m 1 'Connection\\PortRangeMin')
+ if [[ ! -z "${incoming_exist}" ]]; then
+ # Get line number of Incoming
+ LINE_NUM=$(grep -Fn -m 1 'Connection\PortRangeMin' ${QBITTORRENT_CONFIGFILE} | cut -d: -f 1)
+ sed -i "${LINE_NUM}s@.*@Connection\\\PortRangeMin=${INCOMING_PORT}@" ${QBITTORRENT_CONFIGFILE}
+ else
+ echo "Connection\\PortRangeMin=${INCOMING_PORT}" >> ${QBITTORRENT_CONFIGFILE}
+ fi
+ fi
+ {{- end }}
diff --git a/scale-catalog-template/test/qbittorrent/3.1.5/test_values.yaml b/scale-catalog-template/test/qbittorrent/3.1.5/test_values.yaml
new file mode 100644
index 00000000..02e101f8
--- /dev/null
+++ b/scale-catalog-template/test/qbittorrent/3.1.5/test_values.yaml
@@ -0,0 +1,60 @@
+# Default values for qbittorrent.
+
+image:
+ repository: ghcr.io/truecharts/qbittorrent
+ pullPolicy: IfNotPresent
+ tag: v4.3.5
+
+strategy:
+ type: Recreate
+
+env: {}
+ # TZ: UTC
+ # PUID: 1001
+ # PGID: 1001
+ # UMASK: 022
+
+services:
+ main:
+ port:
+ port: 8080
+ tcp:
+ enabled: true
+ type: ClusterIP
+ port:
+ port: 6881
+ protocol: TCP
+ targetPort: 51413
+ udp:
+ enabled: true
+ type: ClusterIP
+ port:
+ port: 6881
+ protocol: UDP
+ targetPort: 51413
+
+
+persistence:
+ config:
+ enabled: true
+ mountPath: "/config"
+ emptyDir: true
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ storageClass: ""
+
+additionalVolumes:
+ - name: qbittorrent-scripts
+ emptyDir: {}
+ ## When you want to enable automatic port configuration at startup, adjust this to:
+ # configMap:
+ # name: -scripts
+ # defaultMode: 511
+
+additionalVolumeMounts:
+ - mountPath: /config/custom-cont-init.d
+ name: qbittorrent-scripts
+
+
+appAdditionalServicesEnabled: true
+appAdditionalServices:
diff --git a/scale-catalog-template/test/qbittorrent/3.1.5/values.yaml b/scale-catalog-template/test/qbittorrent/3.1.5/values.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/scale-catalog-template/test/qbittorrent/item.yaml b/scale-catalog-template/test/qbittorrent/item.yaml
new file mode 100644
index 00000000..a366e589
--- /dev/null
+++ b/scale-catalog-template/test/qbittorrent/item.yaml
@@ -0,0 +1,3 @@
+categories:
+ - media
+icon_url: https://cloud.githubusercontent.com/assets/14862437/23586868/89ef2922-01c4-11e7-869c-52aafcece17f.png
diff --git a/scale-catalog-template/test/readarr/3.1.5/CONFIG.md b/scale-catalog-template/test/readarr/3.1.5/CONFIG.md
new file mode 100644
index 00000000..6d760c18
--- /dev/null
+++ b/scale-catalog-template/test/readarr/3.1.5/CONFIG.md
@@ -0,0 +1,8 @@
+# Configuration Options
+
+##### Connecting to other apps
+If you need to connect this App to other Apps on TrueNAS SCALE, please refer to our "Linking Apps Together" guide:
+https://truecharts.org/manual/linking/
+
+##### Available config options
+In the future this page is going to contain an automated list of options available in the installation/edit UI.
diff --git a/scale-catalog-template/test/readarr/3.1.5/Chart.lock b/scale-catalog-template/test/readarr/3.1.5/Chart.lock
new file mode 100644
index 00000000..ab4b8a02
--- /dev/null
+++ b/scale-catalog-template/test/readarr/3.1.5/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+digest: sha256:ea66c36be2fa73e56bc33f7e89af9ce338cdfbed0b347484888e87228b825015
+generated: "2021-05-06T13:30:00.428743745Z"
diff --git a/scale-catalog-template/test/readarr/3.1.5/Chart.yaml b/scale-catalog-template/test/readarr/3.1.5/Chart.yaml
new file mode 100644
index 00000000..041ee3f5
--- /dev/null
+++ b/scale-catalog-template/test/readarr/3.1.5/Chart.yaml
@@ -0,0 +1,35 @@
+apiVersion: v2
+kubeVersion: ">=1.16.0-0"
+name: readarr
+version: 3.1.5
+upstream_version: 2.1.0
+appVersion: "auto"
+description: A fork of Radarr to work with Books & AudioBooks
+type: application
+deprecated: false
+home: https://github.com/truecharts/apps/tree/master/incubator/readarr
+icon: https://github.com/Readarr/Readarr/blob/develop/Logo/1024.png?raw=true
+keywords:
+ - readarr
+ - torrent
+ - usenet
+ - AudioBooks
+ - ebooks
+sources:
+ - https://github.com/truecharts/apps/tree/master/incubator/readarr
+ - https://github.com/k8s-at-home/charts/tree/master/charts/readarr
+ - https://github.com/Readarr/Readarr
+ - https://readarr.com
+dependencies:
+ - name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+ # condition:
+maintainers:
+ - name: TrueCharts
+ email: info@truecharts.org
+ url: truecharts.org
+ - name: Ornias1993
+ email: kjeld@schouten-lebbing.nl
+ url: truecharts.org
+# annotations:
diff --git a/scale-catalog-template/test/readarr/3.1.5/README.md b/scale-catalog-template/test/readarr/3.1.5/README.md
new file mode 100644
index 00000000..dded0c18
--- /dev/null
+++ b/scale-catalog-template/test/readarr/3.1.5/README.md
@@ -0,0 +1,56 @@
+# Introduction
+
+![Version: 3.1.5](https://img.shields.io/badge/Version-3.1.5-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: auto](https://img.shields.io/badge/AppVersion-auto-informational?style=flat-square)
+
+A fork of Radarr to work with Books & AudioBooks
+
+TrueCharts are designed to be installed as TrueNAS SCALE app only. We can not guarantee this charts works as a stand-alone helm installation.
+**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/apps/issues/new/choose)**
+
+## Source Code
+
+*
+*
+*
+*
+
+## Requirements
+
+Kubernetes: `>=1.16.0-0`
+
+## Dependencies
+
+| Repository | Name | Version |
+|------------|------|---------|
+| https://truecharts.org/ | common | 3.5.5 |
+
+## Installing the Chart
+
+To install the chart with the release name `readarr`
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Click "Install" for this specific Apps
+- Fill out the configuration form
+
+## Uninstalling the Chart
+
+To uninstall the `readarr` deployment
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Go to "Installed Apps"
+- Expand the menu in the top-right corner of this App
+- Click "Remove" for this specific Apps
+
+The command removes all the Kubernetes components associated with the chart **including storage volumes** _(Except hostPath Storage)_ and deletes the release.
+
+## Support
+
+- See the [Wiki](https://truecharts.org)
+- Open a [issue](https://github.com/truecharts/apps/issues/new/choose)
+- Ask a [question](https://github.com/truecharts/apps/discussions)
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
+All Rights Reserved - The TrueCharts Project
diff --git a/scale-catalog-template/test/readarr/3.1.5/app-readme.md b/scale-catalog-template/test/readarr/3.1.5/app-readme.md
new file mode 100644
index 00000000..ec0ebb21
--- /dev/null
+++ b/scale-catalog-template/test/readarr/3.1.5/app-readme.md
@@ -0,0 +1,3 @@
+A fork of Radarr to work with Books & AudioBooks
+This App is supplied by TrueCharts, for more information please visit https://truecharts.org
+A fork of Radarr to work with Books & AudioBooks
diff --git a/scale-catalog-template/test/readarr/3.1.5/charts/common-3.5.5.tgz b/scale-catalog-template/test/readarr/3.1.5/charts/common-3.5.5.tgz
new file mode 100644
index 00000000..d01688bb
Binary files /dev/null and b/scale-catalog-template/test/readarr/3.1.5/charts/common-3.5.5.tgz differ
diff --git a/scale-catalog-template/test/readarr/3.1.5/ix_values.yaml b/scale-catalog-template/test/readarr/3.1.5/ix_values.yaml
new file mode 100644
index 00000000..8e161d6d
--- /dev/null
+++ b/scale-catalog-template/test/readarr/3.1.5/ix_values.yaml
@@ -0,0 +1,37 @@
+##
+# This file contains Values.yaml content that gets added to the output of questions.yaml
+# It's ONLY meant for content that the user is NOT expected to change.
+# Example: Everything under "image" is not included in questions.yaml but is included here.
+##
+
+image:
+ repository: ghcr.io/truecharts/readarr
+ pullPolicy: IfNotPresent
+ tag: v0.1.0.643
+
+probes:
+ liveness:
+ enabled: true
+ ## Set this to true if you wish to specify your own livenessProbe
+ custom: true
+ ## The spec field contains the values for the default livenessProbe.
+ ## If you selected custom: true, this field holds the definition of the livenessProbe.
+ spec:
+ exec:
+ command:
+ - /usr/bin/env
+ - bash
+ - -c
+ - curl --fail localhost:8787/api/v1/system/status?apiKey=`IFS=\> && while
+ read -d \< E C; do if [[ $E = "ApiKey" ]]; then echo $C; fi; done < /config/config.xml`
+ failureThreshold: 5
+ initialDelaySeconds: 60
+ periodSeconds: 10
+ successThreshold: 1
+ timeoutSeconds: 10
+
+
+##
+# Most other defaults are set in questions.yaml
+# For other options please refer to the wiki, default_values.yaml or the common library chart
+##
diff --git a/scale-catalog-template/test/readarr/3.1.5/questions.yaml b/scale-catalog-template/test/readarr/3.1.5/questions.yaml
new file mode 100644
index 00000000..840fe89a
--- /dev/null
+++ b/scale-catalog-template/test/readarr/3.1.5/questions.yaml
@@ -0,0 +1,436 @@
+groups:
+ - name: "Container Image"
+ description: "Image to be used for container"
+ - name: "Workload Configuration"
+ description: "Configure workload deployment"
+ - name: "Configuration"
+ description: "additional container configuration"
+ - name: "Networking"
+ description: "Configure / service for container"
+ - name: "Storage"
+ description: "Persist and share data that is separate from the lifecycle of the container"
+ - name: "Resources and Devices"
+ description: "Specify resources/devices to be allocated to workload"
+ - name: "Reverse Proxy Configuration"
+ description: "Reverse Proxy configuration"
+ - name: "Advanced"
+ description: "Advanced Configuration"
+ - name: "WARNING"
+ description: "WARNING"
+portals:
+ web_portal:
+ protocols:
+ - "$kubernetes-resource_configmap_portal_protocol"
+ host:
+ - "$kubernetes-resource_configmap_portal_host"
+ ports:
+ - "$kubernetes-resource_configmap_portal_port"
+questions:
+ - variable: portal
+ group: "Container Image"
+ label: "Configure Portal Button"
+ schema:
+ type: dict
+ hidden: true
+ attrs:
+ - variable: enabled
+ label: "Enable"
+ description: "enable the portal button"
+ schema:
+ hidden: true
+ editable: false
+ type: boolean
+ default: true
+
+ # Update Policy
+ - variable: strategyType
+ group: "Container Image"
+ label: "Update Strategy"
+ schema:
+ type: string
+ default: "Recreate"
+ enum:
+ - value: "RollingUpdate"
+ description: "Create new pods and then kill old ones"
+ - value: "Recreate"
+ description: "Kill existing pods before creating new ones"
+ # Configure Time Zone
+ - variable: timezone
+ group: "Container Image"
+ label: "Timezone"
+ schema:
+ type: string
+ default: "Etc/UTC"
+ $ref:
+ - "definitions/timezone"
+
+ # Configure Enviroment Variables
+ - variable: environmentVariables
+ label: "Image environment"
+ group: "Configuration"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: environmentVariable
+ label: "Environment Variable"
+ schema:
+ type: dict
+ attrs:
+ - variable: name
+ label: "Name"
+ schema:
+ type: string
+ - variable: value
+ label: "Value"
+ schema:
+ type: string
+ # Enable Host Networking
+ - variable: hostNetwork
+ group: "Networking"
+ label: "Enable Host Networking"
+ schema:
+ type: boolean
+ default: false
+ - variable: services
+ group: "Networking"
+ label: "Configure Service"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "Main service"
+ description: "The Primary service on which the healthcheck runs, often the webUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: false
+ enum:
+ - value: HTTP
+ description: "HTTP"
+ - value: "HTTPS"
+ description: "HTTPS"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 8787
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 8787
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36038
+ required: true
+## TrueCharts Specific
+ - variable: persistence
+ label: "Integrated Persistent Storage"
+ description: "Websocket Service"
+ group: "Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: config
+ label: "App Config Storage"
+ description: "Stores the Application Configuration."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: "/config"
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "100Gi"
+ - variable: customStorage
+ label: "Custom app storage"
+ group: "Storage"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: volumeMount
+ label: "Custom Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enabled"
+ schema:
+ type: boolean
+ default: true
+ required: true
+ hidden: true
+ editable: false
+ - variable: setPermissions
+ label: "Automatic Permissions"
+ description: "Automatically set permissions on install"
+ schema:
+ type: boolean
+ default: true
+ hidden: false
+ - variable: readOnly
+ label: "Mount as ReadOnly"
+ description: "prevent any write from being done to the mounted volume"
+ schema:
+ type: boolean
+ default: false
+ hidden: false
+ - variable: emptyDir
+ label: "emptyDir"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ editable: false
+ - variable: mountPath
+ label: "Mount Path"
+ description: "Path to mount inside the pod"
+ schema:
+ type: path
+ required: true
+ default: ""
+ editable: true
+ - variable: hostPath
+ label: "Host Path"
+ schema:
+ type: hostpath
+ required: true
+ - variable: ingress
+ label: ""
+ group: "Reverse Proxy Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "WebUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: certType
+ label: "Select Reverse-Proxy Type"
+ schema:
+ type: string
+ default: "disabled"
+ enum:
+ - value: "disabled"
+ description: "Disabled"
+ - value: ""
+ description: "No Encryption/TLS/Certificates"
+ - value: "selfsigned"
+ description: "Self-Signed Certificate"
+ - value: "ixcert"
+ description: "TrueNAS SCALE Certificate"
+ - variable: type
+ label: "Reverse Proxy Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: true
+ editable: false
+ required: true
+ - variable: serviceName
+ label: "Service name to proxy to"
+ schema:
+ hidden: true
+ editable: false
+ type: string
+ default: ""
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: "websecure"
+ required: true
+ enum:
+ - value: "websecure"
+ description: "Websecure: HTTPS/TLS port 443"
+ - variable: hosts
+ label: "Hosts"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: list
+ default: []
+ items:
+ - variable: host
+ label: "Host"
+ schema:
+ type: dict
+ attrs:
+ - variable: host
+ label: "Domain Name"
+ required: true
+ schema:
+ type: string
+ - variable: path
+ label: "path"
+ schema:
+ type: string
+ required: true
+ hidden: true
+ default: "/"
+ - variable: certificate
+ label: "Select TrueNAS SCALE Certificate"
+ schema:
+ type: int
+ show_if: [["certType", "=", "ixcert"]]
+ $ref:
+ - "definitions/certificate"
+ - variable: authForwardURL
+ label: "Forward Authentication URL"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: ""
+
+ - variable: UMASK
+ group: "Advanced"
+ label: "UMASK"
+ description: "Sets the UMASK env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: string
+ default: "002"
+ # Enable privileged
+ - variable: securityContext
+ group: "Advanced"
+ label: "Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: privileged
+ label: "Enable privileged mode for Common-Chart based charts"
+ schema:
+ type: boolean
+ default: false
+ # Set Pod Security Policy
+ - variable: podSecurityContext
+ group: "Advanced"
+ label: "Pod Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: runAsNonRoot
+ label: "runAsNonRoot"
+ schema:
+ type: boolean
+ default: true
+ - variable: runAsUser
+ label: "runAsUser"
+ description: "The UserID of the user running the application"
+ schema:
+ type: int
+ default: 568
+ - variable: runAsGroup
+ label: "runAsGroup"
+ description: The groupID this App of the user running the application"
+ schema:
+ type: int
+ default: 568
+ - variable: supplementalGroups
+ label: "supplementalGroups"
+ description: "Additional groups this App needs access to"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: Group
+ label: "Group"
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroup
+ label: "fsGroup"
+ description: "The group that should own ALL storage."
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroupChangePolicy
+ label: "When should we take ownership?"
+ schema:
+ type: string
+ default: "OnRootMismatch"
+ enum:
+ - value: "OnRootMismatch"
+ description: "OnRootMismatch"
+ - value: "Always"
+ description: "Always"
diff --git a/scale-catalog-template/test/readarr/3.1.5/templates/common.yaml b/scale-catalog-template/test/readarr/3.1.5/templates/common.yaml
new file mode 100644
index 00000000..a6613c2c
--- /dev/null
+++ b/scale-catalog-template/test/readarr/3.1.5/templates/common.yaml
@@ -0,0 +1 @@
+{{ include "common.all" . }}
diff --git a/scale-catalog-template/test/readarr/3.1.5/test_values.yaml b/scale-catalog-template/test/readarr/3.1.5/test_values.yaml
new file mode 100644
index 00000000..09676bb4
--- /dev/null
+++ b/scale-catalog-template/test/readarr/3.1.5/test_values.yaml
@@ -0,0 +1,49 @@
+# Default values for Radarr.
+
+image:
+ repository: ghcr.io/truecharts/readarr
+ pullPolicy: IfNotPresent
+ tag: v0.1.0.643
+
+strategy:
+ type: Recreate
+
+services:
+ main:
+ port:
+ port: 8787
+
+env: {}
+ # TZ: UTC
+ # PUID: 1001
+ # PGID: 1001
+
+probes:
+ liveness:
+ enabled: true
+ ## Set this to true if you wish to specify your own livenessProbe
+ custom: true
+ ## The spec field contains the values for the default livenessProbe.
+ ## If you selected custom: true, this field holds the definition of the livenessProbe.
+ spec:
+ exec:
+ command:
+ - /usr/bin/env
+ - bash
+ - -c
+ - curl --fail localhost:8787/api/v1/system/status?apiKey=`IFS=\> && while
+ read -d \< E C; do if [[ $E = "ApiKey" ]]; then echo $C; fi; done < /config/config.xml`
+ failureThreshold: 5
+ initialDelaySeconds: 60
+ periodSeconds: 10
+ successThreshold: 1
+ timeoutSeconds: 10
+
+persistence:
+ config:
+ enabled: true
+ mountPath: "/config"
+ emptyDir: true
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ storageClass: ""
diff --git a/scale-catalog-template/test/readarr/3.1.5/values.yaml b/scale-catalog-template/test/readarr/3.1.5/values.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/scale-catalog-template/test/readarr/item.yaml b/scale-catalog-template/test/readarr/item.yaml
new file mode 100644
index 00000000..e409535f
--- /dev/null
+++ b/scale-catalog-template/test/readarr/item.yaml
@@ -0,0 +1,3 @@
+categories:
+ - media
+icon_url: https://github.com/Readarr/Readarr/blob/develop/Logo/1024.png?raw=true
diff --git a/scale-catalog-template/test/sabnzbd/3.1.5/CONFIG.md b/scale-catalog-template/test/sabnzbd/3.1.5/CONFIG.md
new file mode 100644
index 00000000..6d760c18
--- /dev/null
+++ b/scale-catalog-template/test/sabnzbd/3.1.5/CONFIG.md
@@ -0,0 +1,8 @@
+# Configuration Options
+
+##### Connecting to other apps
+If you need to connect this App to other Apps on TrueNAS SCALE, please refer to our "Linking Apps Together" guide:
+https://truecharts.org/manual/linking/
+
+##### Available config options
+In the future this page is going to contain an automated list of options available in the installation/edit UI.
diff --git a/scale-catalog-template/test/sabnzbd/3.1.5/Chart.lock b/scale-catalog-template/test/sabnzbd/3.1.5/Chart.lock
new file mode 100644
index 00000000..5c046e33
--- /dev/null
+++ b/scale-catalog-template/test/sabnzbd/3.1.5/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+digest: sha256:ea66c36be2fa73e56bc33f7e89af9ce338cdfbed0b347484888e87228b825015
+generated: "2021-05-06T13:30:00.676279356Z"
diff --git a/scale-catalog-template/test/sabnzbd/3.1.5/Chart.yaml b/scale-catalog-template/test/sabnzbd/3.1.5/Chart.yaml
new file mode 100644
index 00000000..281a1644
--- /dev/null
+++ b/scale-catalog-template/test/sabnzbd/3.1.5/Chart.yaml
@@ -0,0 +1,29 @@
+apiVersion: v2
+kubeVersion: ">=1.16.0-0"
+name: sabnzbd
+version: 3.1.5
+upstream_version: 5.0.1
+appVersion: "auto"
+description: Free and easy binary newsreader
+type: application
+deprecated: false
+home: https://github.com/truecharts/apps/tree/master/incubator/sabnzbd
+icon: https://avatars1.githubusercontent.com/u/960698?s=400&v=4
+keywords:
+ - sabnzbd
+ - usenet
+sources:
+ - https://github.com/truecharts/apps/tree/master/incubator/sabnzbd
+ - https://github.com/k8s-at-home/charts/tree/master/charts/sabnzbd
+ - https://hub.docker.com/r/linuxserver/sabnzbd/
+ - https://sabnzbd.org/
+dependencies:
+ - name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+ # condition:
+maintainers:
+ - name: TrueCharts
+ email: info@truecharts.org
+ url: truecharts.org
+# annotations:
diff --git a/scale-catalog-template/test/sabnzbd/3.1.5/README.md b/scale-catalog-template/test/sabnzbd/3.1.5/README.md
new file mode 100644
index 00000000..cfa2b2d0
--- /dev/null
+++ b/scale-catalog-template/test/sabnzbd/3.1.5/README.md
@@ -0,0 +1,56 @@
+# Introduction
+
+![Version: 3.1.5](https://img.shields.io/badge/Version-3.1.5-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: auto](https://img.shields.io/badge/AppVersion-auto-informational?style=flat-square)
+
+Free and easy binary newsreader
+
+TrueCharts are designed to be installed as TrueNAS SCALE app only. We can not guarantee this charts works as a stand-alone helm installation.
+**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/apps/issues/new/choose)**
+
+## Source Code
+
+*
+*
+*
+*
+
+## Requirements
+
+Kubernetes: `>=1.16.0-0`
+
+## Dependencies
+
+| Repository | Name | Version |
+|------------|------|---------|
+| https://truecharts.org/ | common | 3.5.5 |
+
+## Installing the Chart
+
+To install the chart with the release name `sabnzbd`
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Click "Install" for this specific Apps
+- Fill out the configuration form
+
+## Uninstalling the Chart
+
+To uninstall the `sabnzbd` deployment
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Go to "Installed Apps"
+- Expand the menu in the top-right corner of this App
+- Click "Remove" for this specific Apps
+
+The command removes all the Kubernetes components associated with the chart **including storage volumes** _(Except hostPath Storage)_ and deletes the release.
+
+## Support
+
+- See the [Wiki](https://truecharts.org)
+- Open a [issue](https://github.com/truecharts/apps/issues/new/choose)
+- Ask a [question](https://github.com/truecharts/apps/discussions)
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
+All Rights Reserved - The TrueCharts Project
diff --git a/scale-catalog-template/test/sabnzbd/3.1.5/app-readme.md b/scale-catalog-template/test/sabnzbd/3.1.5/app-readme.md
new file mode 100644
index 00000000..05e7f339
--- /dev/null
+++ b/scale-catalog-template/test/sabnzbd/3.1.5/app-readme.md
@@ -0,0 +1,3 @@
+Free and easy binary newsreader
+This App is supplied by TrueCharts, for more information please visit https://truecharts.org
+Free and easy binary newsreader
diff --git a/scale-catalog-template/test/sabnzbd/3.1.5/charts/common-3.5.5.tgz b/scale-catalog-template/test/sabnzbd/3.1.5/charts/common-3.5.5.tgz
new file mode 100644
index 00000000..d01688bb
Binary files /dev/null and b/scale-catalog-template/test/sabnzbd/3.1.5/charts/common-3.5.5.tgz differ
diff --git a/scale-catalog-template/test/sabnzbd/3.1.5/ix_values.yaml b/scale-catalog-template/test/sabnzbd/3.1.5/ix_values.yaml
new file mode 100644
index 00000000..70a2cef7
--- /dev/null
+++ b/scale-catalog-template/test/sabnzbd/3.1.5/ix_values.yaml
@@ -0,0 +1,15 @@
+##
+# This file contains Values.yaml content that gets added to the output of questions.yaml
+# It's ONLY meant for content that the user is NOT expected to change.
+# Example: Everything under "image" is not included in questions.yaml but is included here.
+##
+
+image:
+ repository: ghcr.io/truecharts/sabnzbd
+ pullPolicy: IfNotPresent
+ tag: v3.2.1
+
+##
+# Most other defaults are set in questions.yaml
+# For other options please refer to the wiki, default_values.yaml or the common library chart
+##
diff --git a/scale-catalog-template/test/sabnzbd/3.1.5/questions.yaml b/scale-catalog-template/test/sabnzbd/3.1.5/questions.yaml
new file mode 100644
index 00000000..d47bf059
--- /dev/null
+++ b/scale-catalog-template/test/sabnzbd/3.1.5/questions.yaml
@@ -0,0 +1,452 @@
+groups:
+ - name: "Container Image"
+ description: "Image to be used for container"
+ - name: "Workload Configuration"
+ description: "Configure workload deployment"
+ - name: "Configuration"
+ description: "additional container configuration"
+ - name: "Networking"
+ description: "Configure / service for container"
+ - name: "Storage"
+ description: "Persist and share data that is separate from the lifecycle of the container"
+ - name: "Resources and Devices"
+ description: "Specify resources/devices to be allocated to workload"
+ - name: "Reverse Proxy Configuration"
+ description: "Reverse Proxy configuration"
+ - name: "Advanced"
+ description: "Advanced Configuration"
+ - name: "WARNING"
+ description: "WARNING"
+portals:
+ web_portal:
+ protocols:
+ - "$kubernetes-resource_configmap_portal_protocol"
+ host:
+ - "$kubernetes-resource_configmap_portal_host"
+ ports:
+ - "$kubernetes-resource_configmap_portal_port"
+questions:
+ - variable: portal
+ group: "Container Image"
+ label: "Configure Portal Button"
+ schema:
+ type: dict
+ hidden: true
+ attrs:
+ - variable: enabled
+ label: "Enable"
+ description: "enable the portal button"
+ schema:
+ hidden: true
+ editable: false
+ type: boolean
+ default: true
+
+ # Update Policy
+ - variable: strategyType
+ group: "Container Image"
+ label: "Update Strategy"
+ schema:
+ type: string
+ default: "Recreate"
+ enum:
+ - value: "RollingUpdate"
+ description: "Create new pods and then kill old ones"
+ - value: "Recreate"
+ description: "Kill existing pods before creating new ones"
+ # Configure Time Zone
+ - variable: timezone
+ group: "Container Image"
+ label: "Timezone"
+ schema:
+ type: string
+ default: "Etc/UTC"
+ $ref:
+ - "definitions/timezone"
+
+
+ # Docker specific env
+ - variable: env
+ group: "Configuration"
+ label: "Image Environment"
+ schema:
+ type: dict
+ attrs:
+ - variable: HOST_WHITELIST_ENTRIES
+ label: "HostName Whitelist"
+ description: "If you use a reverse proxy, you might need to enter your hostname's here (comma seperated)"
+ schema:
+ type: string
+ default: ""
+ required: false
+ # Configure Enviroment Variables
+ - variable: environmentVariables
+ label: "Image environment"
+ group: "Configuration"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: environmentVariable
+ label: "Environment Variable"
+ schema:
+ type: dict
+ attrs:
+ - variable: name
+ label: "Name"
+ schema:
+ type: string
+ - variable: value
+ label: "Value"
+ schema:
+ type: string
+
+ # Enable Host Networking
+ - variable: hostNetwork
+ group: "Networking"
+ label: "Enable Host Networking"
+ schema:
+ type: boolean
+ default: false
+ - variable: services
+ group: "Networking"
+ label: "Configure Service"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "Main service"
+ description: "The Primary service on which the healthcheck runs, often the webUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: false
+ enum:
+ - value: HTTP
+ description: "HTTP"
+ - value: "HTTPS"
+ description: "HTTPS"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 8080
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 8080
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36045
+ required: true
+## TrueCharts Specific
+ - variable: persistence
+ label: "Integrated Persistent Storage"
+ description: "Websocket Service"
+ group: "Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: config
+ label: "App Config Storage"
+ description: "Stores the Application Configuration."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: "/config"
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "100Gi"
+ - variable: customStorage
+ label: "Custom app storage"
+ group: "Storage"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: volumeMount
+ label: "Custom Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enabled"
+ schema:
+ type: boolean
+ default: true
+ required: true
+ hidden: true
+ editable: false
+ - variable: setPermissions
+ label: "Automatic Permissions"
+ description: "Automatically set permissions on install"
+ schema:
+ type: boolean
+ default: true
+ hidden: false
+ - variable: readOnly
+ label: "Mount as ReadOnly"
+ description: "prevent any write from being done to the mounted volume"
+ schema:
+ type: boolean
+ default: false
+ hidden: false
+ - variable: emptyDir
+ label: "emptyDir"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ editable: false
+ - variable: mountPath
+ label: "Mount Path"
+ description: "Path to mount inside the pod"
+ schema:
+ type: path
+ required: true
+ default: ""
+ editable: true
+ - variable: hostPath
+ label: "Host Path"
+ schema:
+ type: hostpath
+ required: true
+ - variable: ingress
+ label: ""
+ group: "Reverse Proxy Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "WebUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: certType
+ label: "Select Reverse-Proxy Type"
+ schema:
+ type: string
+ default: "disabled"
+ enum:
+ - value: "disabled"
+ description: "Disabled"
+ - value: ""
+ description: "No Encryption/TLS/Certificates"
+ - value: "selfsigned"
+ description: "Self-Signed Certificate"
+ - value: "ixcert"
+ description: "TrueNAS SCALE Certificate"
+ - variable: type
+ label: "Reverse Proxy Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: true
+ editable: false
+ required: true
+ - variable: serviceName
+ label: "Service name to proxy to"
+ schema:
+ hidden: true
+ editable: false
+ type: string
+ default: ""
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: "websecure"
+ required: true
+ enum:
+ - value: "websecure"
+ description: "Websecure: HTTPS/TLS port 443"
+ - variable: hosts
+ label: "Hosts"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: list
+ default: []
+ items:
+ - variable: host
+ label: "Host"
+ schema:
+ type: dict
+ attrs:
+ - variable: host
+ label: "Domain Name"
+ required: true
+ schema:
+ type: string
+ - variable: path
+ label: "path"
+ schema:
+ type: string
+ required: true
+ hidden: true
+ default: "/"
+ - variable: certificate
+ label: "Select TrueNAS SCALE Certificate"
+ schema:
+ type: int
+ show_if: [["certType", "=", "ixcert"]]
+ $ref:
+ - "definitions/certificate"
+ - variable: authForwardURL
+ label: "Forward Authentication URL"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: ""
+
+ - variable: UMASK
+ group: "Advanced"
+ label: "UMASK"
+ description: "Sets the UMASK env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: string
+ default: "002"
+ # Enable privileged
+ - variable: securityContext
+ group: "Advanced"
+ label: "Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: privileged
+ label: "Enable privileged mode for Common-Chart based charts"
+ schema:
+ type: boolean
+ default: false
+ # Set Pod Security Policy
+ - variable: podSecurityContext
+ group: "Advanced"
+ label: "Pod Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: runAsNonRoot
+ label: "runAsNonRoot"
+ schema:
+ type: boolean
+ default: true
+ - variable: runAsUser
+ label: "runAsUser"
+ description: "The UserID of the user running the application"
+ schema:
+ type: int
+ default: 568
+ - variable: runAsGroup
+ label: "runAsGroup"
+ description: The groupID this App of the user running the application"
+ schema:
+ type: int
+ default: 568
+ - variable: supplementalGroups
+ label: "supplementalGroups"
+ description: "Additional groups this App needs access to"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: Group
+ label: "Group"
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroup
+ label: "fsGroup"
+ description: "The group that should own ALL storage."
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroupChangePolicy
+ label: "When should we take ownership?"
+ schema:
+ type: string
+ default: "OnRootMismatch"
+ enum:
+ - value: "OnRootMismatch"
+ description: "OnRootMismatch"
+ - value: "Always"
+ description: "Always"
diff --git a/scale-catalog-template/test/sabnzbd/3.1.5/templates/common.yaml b/scale-catalog-template/test/sabnzbd/3.1.5/templates/common.yaml
new file mode 100644
index 00000000..a6613c2c
--- /dev/null
+++ b/scale-catalog-template/test/sabnzbd/3.1.5/templates/common.yaml
@@ -0,0 +1 @@
+{{ include "common.all" . }}
diff --git a/scale-catalog-template/test/sabnzbd/3.1.5/test_values.yaml b/scale-catalog-template/test/sabnzbd/3.1.5/test_values.yaml
new file mode 100644
index 00000000..b5ccdd61
--- /dev/null
+++ b/scale-catalog-template/test/sabnzbd/3.1.5/test_values.yaml
@@ -0,0 +1,28 @@
+# Default values for Sabnzbd.
+
+image:
+ repository: ghcr.io/truecharts/sabnzbd
+ pullPolicy: IfNotPresent
+ tag: v3.2.1
+
+strategy:
+ type: Recreate
+
+services:
+ main:
+ port:
+ port: 8080
+
+env: {}
+ # TZ: UTC
+ # PUID: 1001
+ # PGID: 1001
+
+persistence:
+ config:
+ enabled: true
+ mountPath: "/config"
+ emptyDir: true
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ storageClass: ""
diff --git a/scale-catalog-template/test/sabnzbd/3.1.5/values.yaml b/scale-catalog-template/test/sabnzbd/3.1.5/values.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/scale-catalog-template/test/sabnzbd/item.yaml b/scale-catalog-template/test/sabnzbd/item.yaml
new file mode 100644
index 00000000..b81149d2
--- /dev/null
+++ b/scale-catalog-template/test/sabnzbd/item.yaml
@@ -0,0 +1,3 @@
+categories:
+ - media
+icon_url: https://avatars1.githubusercontent.com/u/960698?s=400&v=4
diff --git a/scale-catalog-template/test/truecommand/3.1.5/CONFIG.md b/scale-catalog-template/test/truecommand/3.1.5/CONFIG.md
new file mode 100644
index 00000000..6d760c18
--- /dev/null
+++ b/scale-catalog-template/test/truecommand/3.1.5/CONFIG.md
@@ -0,0 +1,8 @@
+# Configuration Options
+
+##### Connecting to other apps
+If you need to connect this App to other Apps on TrueNAS SCALE, please refer to our "Linking Apps Together" guide:
+https://truecharts.org/manual/linking/
+
+##### Available config options
+In the future this page is going to contain an automated list of options available in the installation/edit UI.
diff --git a/scale-catalog-template/test/truecommand/3.1.5/Chart.lock b/scale-catalog-template/test/truecommand/3.1.5/Chart.lock
new file mode 100644
index 00000000..7d44d79e
--- /dev/null
+++ b/scale-catalog-template/test/truecommand/3.1.5/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+digest: sha256:ea66c36be2fa73e56bc33f7e89af9ce338cdfbed0b347484888e87228b825015
+generated: "2021-05-06T13:30:00.892306191Z"
diff --git a/scale-catalog-template/test/truecommand/3.1.5/Chart.yaml b/scale-catalog-template/test/truecommand/3.1.5/Chart.yaml
new file mode 100644
index 00000000..c8ab27ff
--- /dev/null
+++ b/scale-catalog-template/test/truecommand/3.1.5/Chart.yaml
@@ -0,0 +1,29 @@
+apiVersion: v2
+kubeVersion: ">=1.16.0-0"
+name: truecommand
+version: 3.1.5
+# upstream_version: 1.1.0
+appVersion: "nightly"
+description: Aggregated management of TrueNAS devices
+type: application
+deprecated: false
+home: https://github.com/truecharts/apps/tree/master/incubator/truecommand
+icon: https://www.ixsystems.com/documentation/truecommand/1.2/_static/tv-logo.png
+keywords:
+ - truecommand
+sources:
+ - https://github.com/truecharts/apps/tree/master/incubator/truecommand
+ - https://hub.docker.com/r/ixsystems/truecommand
+dependencies:
+ - name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+ # condition:
+maintainers:
+ - name: TrueCharts
+ email: info@truecharts.org
+ url: truecharts.org
+ - name: Ornias1993
+ email: kjeld@schouten-lebbing.nl
+ url: truecharts.org
+# annotations:
diff --git a/scale-catalog-template/test/truecommand/3.1.5/README.md b/scale-catalog-template/test/truecommand/3.1.5/README.md
new file mode 100644
index 00000000..8caf3b92
--- /dev/null
+++ b/scale-catalog-template/test/truecommand/3.1.5/README.md
@@ -0,0 +1,54 @@
+# Introduction
+
+![Version: 3.1.5](https://img.shields.io/badge/Version-3.1.5-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: nightly](https://img.shields.io/badge/AppVersion-nightly-informational?style=flat-square)
+
+Aggregated management of TrueNAS devices
+
+TrueCharts are designed to be installed as TrueNAS SCALE app only. We can not guarantee this charts works as a stand-alone helm installation.
+**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/apps/issues/new/choose)**
+
+## Source Code
+
+*
+*
+
+## Requirements
+
+Kubernetes: `>=1.16.0-0`
+
+## Dependencies
+
+| Repository | Name | Version |
+|------------|------|---------|
+| https://truecharts.org/ | common | 3.5.5 |
+
+## Installing the Chart
+
+To install the chart with the release name `truecommand`
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Click "Install" for this specific Apps
+- Fill out the configuration form
+
+## Uninstalling the Chart
+
+To uninstall the `truecommand` deployment
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Go to "Installed Apps"
+- Expand the menu in the top-right corner of this App
+- Click "Remove" for this specific Apps
+
+The command removes all the Kubernetes components associated with the chart **including storage volumes** _(Except hostPath Storage)_ and deletes the release.
+
+## Support
+
+- See the [Wiki](https://truecharts.org)
+- Open a [issue](https://github.com/truecharts/apps/issues/new/choose)
+- Ask a [question](https://github.com/truecharts/apps/discussions)
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
+All Rights Reserved - The TrueCharts Project
diff --git a/scale-catalog-template/test/truecommand/3.1.5/app-readme.md b/scale-catalog-template/test/truecommand/3.1.5/app-readme.md
new file mode 100644
index 00000000..8e146848
--- /dev/null
+++ b/scale-catalog-template/test/truecommand/3.1.5/app-readme.md
@@ -0,0 +1,3 @@
+Aggregated management of TrueNAS devices
+This App is supplied by TrueCharts, for more information please visit https://truecharts.org
+Aggregated management of TrueNAS devices
diff --git a/scale-catalog-template/test/truecommand/3.1.5/charts/common-3.5.5.tgz b/scale-catalog-template/test/truecommand/3.1.5/charts/common-3.5.5.tgz
new file mode 100644
index 00000000..d01688bb
Binary files /dev/null and b/scale-catalog-template/test/truecommand/3.1.5/charts/common-3.5.5.tgz differ
diff --git a/scale-catalog-template/test/truecommand/3.1.5/ix_values.yaml b/scale-catalog-template/test/truecommand/3.1.5/ix_values.yaml
new file mode 100644
index 00000000..d2b8ab2a
--- /dev/null
+++ b/scale-catalog-template/test/truecommand/3.1.5/ix_values.yaml
@@ -0,0 +1,15 @@
+##
+# This file contains Values.yaml content that gets added to the output of questions.yaml
+# It's ONLY meant for content that the user is NOT expected to change.
+# Example: Everything under "image" is not included in questions.yaml but is included here.
+##
+
+image:
+ repository: ixsystems/truecommand
+ pullPolicy: IfNotPresent
+ tag: nightly
+
+##
+# Most other defaults are set in questions.yaml
+# For other options please refer to the wiki, default_values.yaml or the common library chart
+##
diff --git a/scale-catalog-template/test/truecommand/3.1.5/questions.yaml b/scale-catalog-template/test/truecommand/3.1.5/questions.yaml
new file mode 100644
index 00000000..1701b241
--- /dev/null
+++ b/scale-catalog-template/test/truecommand/3.1.5/questions.yaml
@@ -0,0 +1,453 @@
+groups:
+ - name: "Container Image"
+ description: "Image to be used for container"
+ - name: "Workload Configuration"
+ description: "Configure workload deployment"
+ - name: "Configuration"
+ description: "additional container configuration"
+ - name: "Networking"
+ description: "Configure / service for container"
+ - name: "Storage"
+ description: "Persist and share data that is separate from the lifecycle of the container"
+ - name: "Resources and Devices"
+ description: "Specify resources/devices to be allocated to workload"
+ - name: "Reverse Proxy Configuration"
+ description: "Reverse Proxy configuration"
+ - name: "Advanced"
+ description: "Advanced Configuration"
+ - name: "WARNING"
+ description: "WARNING"
+portals:
+ web_portal:
+ protocols:
+ - "$kubernetes-resource_configmap_portal_protocol"
+ host:
+ - "$kubernetes-resource_configmap_portal_host"
+ ports:
+ - "$kubernetes-resource_configmap_portal_port"
+questions:
+ - variable: portal
+ group: "Container Image"
+ label: "Configure Portal Button"
+ schema:
+ type: dict
+ hidden: true
+ attrs:
+ - variable: enabled
+ label: "Enable"
+ description: "enable the portal button"
+ schema:
+ hidden: true
+ editable: false
+ type: boolean
+ default: true
+
+ # Update Policy
+ - variable: strategyType
+ group: "Container Image"
+ label: "Update Strategy"
+ schema:
+ type: string
+ default: "Recreate"
+ enum:
+ - value: "RollingUpdate"
+ description: "Create new pods and then kill old ones"
+ - value: "Recreate"
+ description: "Kill existing pods before creating new ones"
+ # Configure Time Zone
+ - variable: timezone
+ group: "Container Image"
+ label: "Timezone"
+ schema:
+ type: string
+ default: "Etc/UTC"
+ $ref:
+ - "definitions/timezone"
+
+ # Configure Enviroment Variables
+ - variable: environmentVariables
+ label: "Image environment"
+ group: "Configuration"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: environmentVariable
+ label: "Environment Variable"
+ schema:
+ type: dict
+ attrs:
+ - variable: name
+ label: "Name"
+ schema:
+ type: string
+ - variable: value
+ label: "Value"
+ schema:
+ type: string
+
+ # Enable Host Networking
+ - variable: hostNetwork
+ group: "Networking"
+ label: "Enable Host Networking"
+ schema:
+ type: boolean
+ default: false
+ - variable: services
+ group: "Networking"
+ label: "Configure Service"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "Main service"
+ description: "The Primary service on which the healthcheck runs, often the webUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: false
+ enum:
+ - value: HTTP
+ description: "HTTP"
+ - value: "HTTPS"
+ description: "HTTPS"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 80
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 80
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36044
+ required: true
+## TrueCharts Specific
+ - variable: persistence
+ label: "Integrated Persistent Storage"
+ description: "Websocket Service"
+ group: "Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: data
+ label: "App Config Storage"
+ description: "Stores the Application Configuration."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: "/data"
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "100Gi"
+
+ - variable: customStorage
+ label: "Custom app storage"
+ group: "Storage"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: volumeMount
+ label: "Custom Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enabled"
+ schema:
+ type: boolean
+ default: true
+ required: true
+ hidden: true
+ editable: false
+ - variable: setPermissions
+ label: "Automatic Permissions"
+ description: "Automatically set permissions on install"
+ schema:
+ type: boolean
+ default: true
+ hidden: false
+ - variable: readOnly
+ label: "Mount as ReadOnly"
+ description: "prevent any write from being done to the mounted volume"
+ schema:
+ type: boolean
+ default: false
+ hidden: false
+ - variable: emptyDir
+ label: "emptyDir"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ editable: false
+ - variable: mountPath
+ label: "Mount Path"
+ description: "Path to mount inside the pod"
+ schema:
+ type: path
+ required: true
+ default: ""
+ editable: true
+ - variable: hostPath
+ label: "Host Path"
+ schema:
+ type: hostpath
+ required: true
+ - variable: ingress
+ label: ""
+ group: "Reverse Proxy Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "WebUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: certType
+ label: "Select Reverse-Proxy Type"
+ schema:
+ type: string
+ default: "disabled"
+ enum:
+ - value: "disabled"
+ description: "Disabled"
+ - value: ""
+ description: "No Encryption/TLS/Certificates"
+ - value: "selfsigned"
+ description: "Self-Signed Certificate"
+ - value: "ixcert"
+ description: "TrueNAS SCALE Certificate"
+ - variable: type
+ label: "Reverse Proxy Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: true
+ editable: false
+ required: true
+ - variable: serviceName
+ label: "Service name to proxy to"
+ schema:
+ hidden: true
+ editable: false
+ type: string
+ default: ""
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: "websecure"
+ required: true
+ enum:
+ - value: "websecure"
+ description: "Websecure: HTTPS/TLS port 443"
+ - variable: hosts
+ label: "Hosts"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: list
+ default: []
+ items:
+ - variable: host
+ label: "Host"
+ schema:
+ type: dict
+ attrs:
+ - variable: host
+ label: "Domain Name"
+ required: true
+ schema:
+ type: string
+ - variable: path
+ label: "path"
+ schema:
+ type: string
+ required: true
+ hidden: true
+ default: "/"
+ - variable: certificate
+ label: "Select TrueNAS SCALE Certificate"
+ schema:
+ type: int
+ show_if: [["certType", "=", "ixcert"]]
+ $ref:
+ - "definitions/certificate"
+ - variable: authForwardURL
+ label: "Forward Authentication URL"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: ""
+
+ - variable: PUID
+ group: "Advanced"
+ label: "PUID"
+ description: "Sets the PUID env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: int
+ default: 568
+
+ - variable: PGID
+ group: "Advanced"
+ label: "PGID"
+ description: "Sets the PGID env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: int
+ default: 568
+ - variable: UMASK
+ group: "Advanced"
+ label: "UMASK"
+ description: "Sets the UMASK env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: string
+ default: "002"
+ # Enable privileged
+ - variable: securityContext
+ group: "Advanced"
+ label: "Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: privileged
+ label: "Enable privileged mode for Common-Chart based charts"
+ schema:
+ type: boolean
+ default: false
+ # Set Pod Security Policy
+ - variable: podSecurityContext
+ group: "Advanced"
+ label: "Pod Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: runAsNonRoot
+ label: "runAsNonRoot"
+ schema:
+ type: boolean
+ default: false
+ - variable: runAsUser
+ label: "runAsUser"
+ description: "The UserID of the user running the application"
+ schema:
+ type: int
+ default: 0
+ - variable: runAsGroup
+ label: "runAsGroup"
+ description: The groupID this App of the user running the application"
+ schema:
+ type: int
+ default: 0
+ - variable: supplementalGroups
+ label: "supplementalGroups"
+ description: "Additional groups this App needs access to"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: Group
+ label: "Group"
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroup
+ label: "fsGroup"
+ description: "The group that should own ALL storage."
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroupChangePolicy
+ label: "When should we take ownership?"
+ schema:
+ type: string
+ default: "OnRootMismatch"
+ enum:
+ - value: "OnRootMismatch"
+ description: "OnRootMismatch"
+ - value: "Always"
+ description: "Always"
diff --git a/scale-catalog-template/test/truecommand/3.1.5/templates/common.yaml b/scale-catalog-template/test/truecommand/3.1.5/templates/common.yaml
new file mode 100644
index 00000000..a6613c2c
--- /dev/null
+++ b/scale-catalog-template/test/truecommand/3.1.5/templates/common.yaml
@@ -0,0 +1 @@
+{{ include "common.all" . }}
diff --git a/scale-catalog-template/test/truecommand/3.1.5/test_values.yaml b/scale-catalog-template/test/truecommand/3.1.5/test_values.yaml
new file mode 100644
index 00000000..ee4eb28f
--- /dev/null
+++ b/scale-catalog-template/test/truecommand/3.1.5/test_values.yaml
@@ -0,0 +1,35 @@
+# Default values for Jackett.
+
+image:
+ repository: ixsystems/truecommand
+ pullPolicy: IfNotPresent
+ tag: nightly
+
+strategy:
+ type: Recreate
+
+# Configure the Security Context for the Pod
+podSecurityContext:
+ runAsNonRoot: false
+ runAsUser: 0
+ runAsGroup: 0
+ fsGroup: 0
+
+services:
+ main:
+ port:
+ port: 80
+
+env: {}
+ # TZ: UTC
+ # PUID: 1001
+ # PGID: 1001
+
+persistence:
+ data:
+ enabled: true
+ mountPath: "/data"
+ emptyDir: true
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ storageClass: ""
diff --git a/scale-catalog-template/test/truecommand/3.1.5/values.yaml b/scale-catalog-template/test/truecommand/3.1.5/values.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/scale-catalog-template/test/truecommand/item.yaml b/scale-catalog-template/test/truecommand/item.yaml
new file mode 100644
index 00000000..9c10785b
--- /dev/null
+++ b/scale-catalog-template/test/truecommand/item.yaml
@@ -0,0 +1,3 @@
+categories:
+ - Administration
+icon_url: https://www.ixsystems.com/documentation/truecommand/1.2/_static/tv-logo.png
diff --git a/scale-catalog-template/test/tvheadend/4.1.5/CONFIG.md b/scale-catalog-template/test/tvheadend/4.1.5/CONFIG.md
new file mode 100644
index 00000000..6d760c18
--- /dev/null
+++ b/scale-catalog-template/test/tvheadend/4.1.5/CONFIG.md
@@ -0,0 +1,8 @@
+# Configuration Options
+
+##### Connecting to other apps
+If you need to connect this App to other Apps on TrueNAS SCALE, please refer to our "Linking Apps Together" guide:
+https://truecharts.org/manual/linking/
+
+##### Available config options
+In the future this page is going to contain an automated list of options available in the installation/edit UI.
diff --git a/scale-catalog-template/test/tvheadend/4.1.5/Chart.lock b/scale-catalog-template/test/tvheadend/4.1.5/Chart.lock
new file mode 100644
index 00000000..3987b9bb
--- /dev/null
+++ b/scale-catalog-template/test/tvheadend/4.1.5/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+digest: sha256:ea66c36be2fa73e56bc33f7e89af9ce338cdfbed0b347484888e87228b825015
+generated: "2021-05-06T13:30:01.11612182Z"
diff --git a/scale-catalog-template/test/tvheadend/4.1.5/Chart.yaml b/scale-catalog-template/test/tvheadend/4.1.5/Chart.yaml
new file mode 100644
index 00000000..2e376dda
--- /dev/null
+++ b/scale-catalog-template/test/tvheadend/4.1.5/Chart.yaml
@@ -0,0 +1,30 @@
+apiVersion: v2
+kubeVersion: ">=1.16.0-0"
+name: tvheadend
+version: 4.1.5
+upstream_version: 1.1.2
+appVersion: "latest"
+description: TVheadend - a TV streaming server and digital video recorder
+type: application
+deprecated: false
+home: https://github.com/truecharts/apps/tree/master/incubator/tvheadend
+icon: https://avatars.githubusercontent.com/u/1908588?s=200&v=4
+keywords:
+ - tvheadend
+ - tv
+ - streaming
+ - dvb
+sources:
+ - https://github.com/truecharts/apps/tree/master/incubator/tvheadend
+ - https://github.com/k8s-at-home/charts/tree/master/charts/tvheadend
+ - https://github.com/tvheadend/tvheadend
+dependencies:
+ - name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+ # condition:
+maintainers:
+ - name: TrueCharts
+ email: info@truecharts.org
+ url: truecharts.org
+# annotations:
diff --git a/scale-catalog-template/test/tvheadend/4.1.5/README.md b/scale-catalog-template/test/tvheadend/4.1.5/README.md
new file mode 100644
index 00000000..63f3c617
--- /dev/null
+++ b/scale-catalog-template/test/tvheadend/4.1.5/README.md
@@ -0,0 +1,55 @@
+# Introduction
+
+![Version: 4.1.5](https://img.shields.io/badge/Version-4.1.5-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: latest](https://img.shields.io/badge/AppVersion-latest-informational?style=flat-square)
+
+TVheadend - a TV streaming server and digital video recorder
+
+TrueCharts are designed to be installed as TrueNAS SCALE app only. We can not guarantee this charts works as a stand-alone helm installation.
+**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/apps/issues/new/choose)**
+
+## Source Code
+
+*
+*
+*
+
+## Requirements
+
+Kubernetes: `>=1.16.0-0`
+
+## Dependencies
+
+| Repository | Name | Version |
+|------------|------|---------|
+| https://truecharts.org/ | common | 3.5.5 |
+
+## Installing the Chart
+
+To install the chart with the release name `tvheadend`
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Click "Install" for this specific Apps
+- Fill out the configuration form
+
+## Uninstalling the Chart
+
+To uninstall the `tvheadend` deployment
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Go to "Installed Apps"
+- Expand the menu in the top-right corner of this App
+- Click "Remove" for this specific Apps
+
+The command removes all the Kubernetes components associated with the chart **including storage volumes** _(Except hostPath Storage)_ and deletes the release.
+
+## Support
+
+- See the [Wiki](https://truecharts.org)
+- Open a [issue](https://github.com/truecharts/apps/issues/new/choose)
+- Ask a [question](https://github.com/truecharts/apps/discussions)
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
+All Rights Reserved - The TrueCharts Project
diff --git a/scale-catalog-template/test/tvheadend/4.1.5/app-readme.md b/scale-catalog-template/test/tvheadend/4.1.5/app-readme.md
new file mode 100644
index 00000000..972a532e
--- /dev/null
+++ b/scale-catalog-template/test/tvheadend/4.1.5/app-readme.md
@@ -0,0 +1,3 @@
+TVheadend - a TV streaming server and digital video recorder
+This App is supplied by TrueCharts, for more information please visit https://truecharts.org
+TVheadend - a TV streaming server and digital video recorder
diff --git a/scale-catalog-template/test/tvheadend/4.1.5/charts/common-3.5.5.tgz b/scale-catalog-template/test/tvheadend/4.1.5/charts/common-3.5.5.tgz
new file mode 100644
index 00000000..d01688bb
Binary files /dev/null and b/scale-catalog-template/test/tvheadend/4.1.5/charts/common-3.5.5.tgz differ
diff --git a/scale-catalog-template/test/tvheadend/4.1.5/ix_values.yaml b/scale-catalog-template/test/tvheadend/4.1.5/ix_values.yaml
new file mode 100644
index 00000000..1d54e5cb
--- /dev/null
+++ b/scale-catalog-template/test/tvheadend/4.1.5/ix_values.yaml
@@ -0,0 +1,15 @@
+##
+# This file contains Values.yaml content that gets added to the output of questions.yaml
+# It's ONLY meant for content that the user is NOT expected to change.
+# Example: Everything under "image" is not included in questions.yaml but is included here.
+##
+
+image:
+ repository: linuxserver/tvheadend
+ pullPolicy: IfNotPresent
+ tag: latest
+
+##
+# Most other defaults are set in questions.yaml
+# For other options please refer to the wiki, default_values.yaml or the common library chart
+##
diff --git a/scale-catalog-template/test/tvheadend/4.1.5/questions.yaml b/scale-catalog-template/test/tvheadend/4.1.5/questions.yaml
new file mode 100644
index 00000000..5a869bcc
--- /dev/null
+++ b/scale-catalog-template/test/tvheadend/4.1.5/questions.yaml
@@ -0,0 +1,492 @@
+groups:
+ - name: "Container Image"
+ description: "Image to be used for container"
+ - name: "Workload Configuration"
+ description: "Configure workload deployment"
+ - name: "Configuration"
+ description: "additional container configuration"
+ - name: "Networking"
+ description: "Configure / service for container"
+ - name: "Storage"
+ description: "Persist and share data that is separate from the lifecycle of the container"
+ - name: "Resources and Devices"
+ description: "Specify resources/devices to be allocated to workload"
+ - name: "Reverse Proxy Configuration"
+ description: "Reverse Proxy configuration"
+ - name: "Advanced"
+ description: "Advanced Configuration"
+ - name: "WARNING"
+ description: "WARNING"
+portals:
+ web_portal:
+ protocols:
+ - "$kubernetes-resource_configmap_portal_protocol"
+ host:
+ - "$kubernetes-resource_configmap_portal_host"
+ ports:
+ - "$kubernetes-resource_configmap_portal_port"
+questions:
+ - variable: portal
+ group: "Container Image"
+ label: "Configure Portal Button"
+ schema:
+ type: dict
+ hidden: true
+ attrs:
+ - variable: enabled
+ label: "Enable"
+ description: "enable the portal button"
+ schema:
+ hidden: true
+ editable: false
+ type: boolean
+ default: true
+
+ # Update Policy
+ - variable: strategyType
+ group: "Container Image"
+ label: "Update Strategy"
+ schema:
+ type: string
+ default: "Recreate"
+ enum:
+ - value: "RollingUpdate"
+ description: "Create new pods and then kill old ones"
+ - value: "Recreate"
+ description: "Kill existing pods before creating new ones"
+
+ # Configure Time Zone
+ - variable: timezone
+ group: "Container Image"
+ label: "Timezone"
+ schema:
+ type: string
+ default: "Etc/UTC"
+ $ref:
+ - "definitions/timezone"
+
+ # Service Configuration
+ # Enable Host Networking
+ - variable: hostNetwork
+ group: "Networking"
+ label: "Enable Host Networking"
+ schema:
+ type: boolean
+ default: false
+ - variable: services
+ group: "Networking"
+ label: "Configure Service"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "Main service"
+ description: "The Primary service on which the healthcheck runs, often the webUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: false
+ enum:
+ - value: HTTP
+ description: "HTTP"
+ - value: "HTTPS"
+ description: "HTTPS"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 9981
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 9981
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36042
+ required: true
+ - variable: htsp
+ label: "HTSP service"
+ description: "Service to connect to htsp"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "TCP"
+ hidden: true
+ enum:
+ - value: TCP
+ description: "TCP"
+ - value: "UDP"
+ description: "UDP"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 9982
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 9982
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36043
+ required: true
+ - variable: persistence
+ label: "Integrated Persistent Storage"
+ description: "Websocket Service"
+ group: "Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: config
+ label: "App Config Storage"
+ description: "Stores the Application Configuration."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: "/config"
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "100Gi"
+ - variable: customStorage
+ label: "Custom app storage"
+ group: "Storage"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: volumeMount
+ label: "Custom Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enabled"
+ schema:
+ type: boolean
+ default: true
+ required: true
+ hidden: true
+ editable: false
+ - variable: setPermissions
+ label: "Automatic Permissions"
+ description: "Automatically set permissions on install"
+ schema:
+ type: boolean
+ default: true
+ hidden: false
+ - variable: readOnly
+ label: "Mount as ReadOnly"
+ description: "prevent any write from being done to the mounted volume"
+ schema:
+ type: boolean
+ default: false
+ hidden: false
+ - variable: emptyDir
+ label: "emptyDir"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ editable: false
+ - variable: mountPath
+ label: "Mount Path"
+ description: "Path to mount inside the pod"
+ schema:
+ type: path
+ required: true
+ default: ""
+ editable: true
+ - variable: hostPath
+ label: "Host Path"
+ schema:
+ type: hostpath
+ required: true
+ - variable: ingress
+ label: ""
+ group: "Reverse Proxy Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "WebUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: certType
+ label: "Select Reverse-Proxy Type"
+ schema:
+ type: string
+ default: "disabled"
+ enum:
+ - value: "disabled"
+ description: "Disabled"
+ - value: ""
+ description: "No Encryption/TLS/Certificates"
+ - value: "selfsigned"
+ description: "Self-Signed Certificate"
+ - value: "ixcert"
+ description: "TrueNAS SCALE Certificate"
+ - variable: type
+ label: "Reverse Proxy Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: true
+ editable: false
+ required: true
+ - variable: serviceName
+ label: "Service name to proxy to"
+ schema:
+ hidden: true
+ editable: false
+ type: string
+ default: ""
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: "websecure"
+ required: true
+ enum:
+ - value: "websecure"
+ description: "Websecure: HTTPS/TLS port 443"
+ - variable: hosts
+ label: "Hosts"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: list
+ default: []
+ items:
+ - variable: host
+ label: "Host"
+ schema:
+ type: dict
+ attrs:
+ - variable: host
+ label: "Domain Name"
+ required: true
+ schema:
+ type: string
+ - variable: path
+ label: "path"
+ schema:
+ type: string
+ required: true
+ hidden: true
+ default: "/"
+ - variable: certificate
+ label: "Select TrueNAS SCALE Certificate"
+ schema:
+ type: int
+ show_if: [["certType", "=", "ixcert"]]
+ $ref:
+ - "definitions/certificate"
+ - variable: authForwardURL
+ label: "Forward Authentication URL"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: ""
+ - variable: PUID
+ group: "Advanced"
+ label: "PUID"
+ description: "Sets the PUID env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: int
+ default: 568
+
+ - variable: PGID
+ group: "Advanced"
+ label: "PGID"
+ description: "Sets the PGID env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: int
+ default: 568
+ - variable: UMASK
+ group: "Advanced"
+ label: "UMASK"
+ description: "Sets the UMASK env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: string
+ default: "002"
+ # Enable privileged
+ - variable: securityContext
+ group: "Advanced"
+ label: "Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: privileged
+ label: "Enable privileged mode for Common-Chart based charts"
+ schema:
+ type: boolean
+ default: false
+ # Set Pod Security Policy
+ - variable: podSecurityContext
+ group: "Advanced"
+ label: "Pod Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: runAsNonRoot
+ label: "runAsNonRoot"
+ schema:
+ type: boolean
+ default: false
+ - variable: runAsUser
+ label: "runAsUser"
+ description: "The UserID of the user running the application"
+ schema:
+ type: int
+ default: 0
+ - variable: runAsGroup
+ label: "runAsGroup"
+ description: The groupID this App of the user running the application"
+ schema:
+ type: int
+ default: 0
+ - variable: supplementalGroups
+ label: "supplementalGroups"
+ description: "Additional groups this App needs access to"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: Group
+ label: "Group"
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroup
+ label: "fsGroup"
+ description: "The group that should own ALL storage."
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroupChangePolicy
+ label: "When should we take ownership?"
+ schema:
+ type: string
+ default: "OnRootMismatch"
+ enum:
+ - value: "OnRootMismatch"
+ description: "OnRootMismatch"
+ - value: "Always"
+ description: "Always"
diff --git a/scale-catalog-template/test/tvheadend/4.1.5/templates/common.yaml b/scale-catalog-template/test/tvheadend/4.1.5/templates/common.yaml
new file mode 100644
index 00000000..a6613c2c
--- /dev/null
+++ b/scale-catalog-template/test/tvheadend/4.1.5/templates/common.yaml
@@ -0,0 +1 @@
+{{ include "common.all" . }}
diff --git a/scale-catalog-template/test/tvheadend/4.1.5/test_values.yaml b/scale-catalog-template/test/tvheadend/4.1.5/test_values.yaml
new file mode 100644
index 00000000..4d5ca71d
--- /dev/null
+++ b/scale-catalog-template/test/tvheadend/4.1.5/test_values.yaml
@@ -0,0 +1,44 @@
+# Default values for tvheadend.
+
+image:
+ repository: linuxserver/tvheadend
+ pullPolicy: IfNotPresent
+ tag: latest
+
+strategy:
+ type: Recreate
+
+# Configure the Security Context for the Pod
+podSecurityContext:
+ runAsNonRoot: false
+ runAsUser: 0
+ runAsGroup: 0
+ fsGroup: 0
+
+# See https://github.com/linuxserver/docker-tvheadend#parameters
+env: {}
+ # PUID: 1000
+ # PGID: 1000
+ # TZ: Europe/London
+ # RUN_OPTS:
+
+services:
+ main:
+ port:
+ port: 9981
+ htsp:
+ enabled: true
+ type: ClusterIP
+ port:
+ port: 9982
+ protocol: TCP
+ targetPort: 9982
+
+persistence:
+ config:
+ enabled: true
+ mountPath: "/config"
+ emptyDir: true
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ storageClass: ""
diff --git a/scale-catalog-template/test/tvheadend/4.1.5/values.yaml b/scale-catalog-template/test/tvheadend/4.1.5/values.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/scale-catalog-template/test/tvheadend/item.yaml b/scale-catalog-template/test/tvheadend/item.yaml
new file mode 100644
index 00000000..4e787795
--- /dev/null
+++ b/scale-catalog-template/test/tvheadend/item.yaml
@@ -0,0 +1,3 @@
+categories:
+ - media
+icon_url: https://avatars.githubusercontent.com/u/1908588?s=200&v=4
diff --git a/scale-catalog-template/test/unifi/3.1.5/CONFIG.md b/scale-catalog-template/test/unifi/3.1.5/CONFIG.md
new file mode 100644
index 00000000..6d760c18
--- /dev/null
+++ b/scale-catalog-template/test/unifi/3.1.5/CONFIG.md
@@ -0,0 +1,8 @@
+# Configuration Options
+
+##### Connecting to other apps
+If you need to connect this App to other Apps on TrueNAS SCALE, please refer to our "Linking Apps Together" guide:
+https://truecharts.org/manual/linking/
+
+##### Available config options
+In the future this page is going to contain an automated list of options available in the installation/edit UI.
diff --git a/scale-catalog-template/test/unifi/3.1.5/Chart.lock b/scale-catalog-template/test/unifi/3.1.5/Chart.lock
new file mode 100644
index 00000000..1cb7fec5
--- /dev/null
+++ b/scale-catalog-template/test/unifi/3.1.5/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+digest: sha256:ea66c36be2fa73e56bc33f7e89af9ce338cdfbed0b347484888e87228b825015
+generated: "2021-05-06T13:30:01.348637242Z"
diff --git a/scale-catalog-template/test/unifi/3.1.5/Chart.yaml b/scale-catalog-template/test/unifi/3.1.5/Chart.yaml
new file mode 100644
index 00000000..744da8ed
--- /dev/null
+++ b/scale-catalog-template/test/unifi/3.1.5/Chart.yaml
@@ -0,0 +1,28 @@
+apiVersion: v2
+kubeVersion: ">=1.16.0-0"
+name: unifi
+version: 3.1.5
+upstream_version: 1.5.1
+appVersion: "auto"
+description: Ubiquiti Network's Unifi Controller
+type: application
+deprecated: false
+home: https://github.com/truecharts/apps/tree/master/incubator/unifi
+icon: https://dl.ubnt.com/press/logo-UniFi.png
+keywords:
+ - ubiquiti
+ - unifi
+sources:
+ - https://github.com/truecharts/apps/tree/master/incubator/unifi
+ - https://github.com/jacobalberty/unifi-docker
+ - https://unifi-network.ui.com
+dependencies:
+ - name: common
+ repository: https://truecharts.org/
+ version: 3.5.5
+ # condition:
+maintainers:
+ - name: TrueCharts
+ email: info@truecharts.org
+ url: truecharts.org
+# annotations:
diff --git a/scale-catalog-template/test/unifi/3.1.5/README.md b/scale-catalog-template/test/unifi/3.1.5/README.md
new file mode 100644
index 00000000..048495ca
--- /dev/null
+++ b/scale-catalog-template/test/unifi/3.1.5/README.md
@@ -0,0 +1,55 @@
+# Introduction
+
+![Version: 3.1.5](https://img.shields.io/badge/Version-3.1.5-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: auto](https://img.shields.io/badge/AppVersion-auto-informational?style=flat-square)
+
+Ubiquiti Network's Unifi Controller
+
+TrueCharts are designed to be installed as TrueNAS SCALE app only. We can not guarantee this charts works as a stand-alone helm installation.
+**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/apps/issues/new/choose)**
+
+## Source Code
+
+*
+*
+*
+
+## Requirements
+
+Kubernetes: `>=1.16.0-0`
+
+## Dependencies
+
+| Repository | Name | Version |
+|------------|------|---------|
+| https://truecharts.org/ | common | 3.5.5 |
+
+## Installing the Chart
+
+To install the chart with the release name `unifi`
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Click "Install" for this specific Apps
+- Fill out the configuration form
+
+## Uninstalling the Chart
+
+To uninstall the `unifi` deployment
+
+- Open TrueNAS SCALE
+- Go to Apps
+- Go to "Installed Apps"
+- Expand the menu in the top-right corner of this App
+- Click "Remove" for this specific Apps
+
+The command removes all the Kubernetes components associated with the chart **including storage volumes** _(Except hostPath Storage)_ and deletes the release.
+
+## Support
+
+- See the [Wiki](https://truecharts.org)
+- Open a [issue](https://github.com/truecharts/apps/issues/new/choose)
+- Ask a [question](https://github.com/truecharts/apps/discussions)
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.5.0](https://github.com/norwoodj/helm-docs/releases/v1.5.0)
+All Rights Reserved - The TrueCharts Project
diff --git a/scale-catalog-template/test/unifi/3.1.5/app-readme.md b/scale-catalog-template/test/unifi/3.1.5/app-readme.md
new file mode 100644
index 00000000..0e6732e4
--- /dev/null
+++ b/scale-catalog-template/test/unifi/3.1.5/app-readme.md
@@ -0,0 +1,3 @@
+Ubiquiti Network's Unifi Controller
+This App is supplied by TrueCharts, for more information please visit https://truecharts.org
+Ubiquiti Network's Unifi Controller
diff --git a/scale-catalog-template/test/unifi/3.1.5/charts/common-3.5.5.tgz b/scale-catalog-template/test/unifi/3.1.5/charts/common-3.5.5.tgz
new file mode 100644
index 00000000..d01688bb
Binary files /dev/null and b/scale-catalog-template/test/unifi/3.1.5/charts/common-3.5.5.tgz differ
diff --git a/scale-catalog-template/test/unifi/3.1.5/ix_values.yaml b/scale-catalog-template/test/unifi/3.1.5/ix_values.yaml
new file mode 100644
index 00000000..a7c2aa22
--- /dev/null
+++ b/scale-catalog-template/test/unifi/3.1.5/ix_values.yaml
@@ -0,0 +1,21 @@
+##
+# This file contains Values.yaml content that gets added to the output of questions.yaml
+# It's ONLY meant for content that the user is NOT expected to change.
+# Example: Everything under "image" is not included in questions.yaml but is included here.
+##
+
+image:
+ repository: jacobalberty/unifi
+ tag: 6.1.71
+ pullPolicy: IfNotPresent
+
+
+envTpl:
+# Permissions Settings
+ UNIFI_GID: "{{ .Values.PUID }}"
+ UNIFI_UID: "{{ .Values.PGID }}"
+
+##
+# Most other defaults are set in questions.yaml
+# For other options please refer to the wiki, default_values.yaml or the common library chart
+##
diff --git a/scale-catalog-template/test/unifi/3.1.5/questions.yaml b/scale-catalog-template/test/unifi/3.1.5/questions.yaml
new file mode 100644
index 00000000..9b329892
--- /dev/null
+++ b/scale-catalog-template/test/unifi/3.1.5/questions.yaml
@@ -0,0 +1,635 @@
+groups:
+ - name: "Container Image"
+ description: "Image to be used for container"
+ - name: "Workload Configuration"
+ description: "Configure workload deployment"
+ - name: "Configuration"
+ description: "additional container configuration"
+ - name: "Networking"
+ description: "Configure / service for container"
+ - name: "Storage"
+ description: "Persist and share data that is separate from the lifecycle of the container"
+ - name: "Resources and Devices"
+ description: "Specify resources/devices to be allocated to workload"
+ - name: "Reverse Proxy Configuration"
+ description: "Reverse Proxy configuration"
+ - name: "Advanced"
+ description: "Advanced Configuration"
+ - name: "WARNING"
+ description: "WARNING"
+portals:
+ web_portal:
+ protocols:
+ - "$kubernetes-resource_configmap_portal_protocol"
+ host:
+ - "$kubernetes-resource_configmap_portal_host"
+ ports:
+ - "$kubernetes-resource_configmap_portal_port"
+questions:
+ - variable: portal
+ group: "Container Image"
+ label: "Configure Portal Button"
+ schema:
+ type: dict
+ hidden: true
+ attrs:
+ - variable: enabled
+ label: "Enable"
+ description: "enable the portal button"
+ schema:
+ hidden: true
+ editable: false
+ type: boolean
+ default: true
+
+ # Update Policy
+ - variable: strategyType
+ group: "Container Image"
+ label: "Update Strategy"
+ schema:
+ type: string
+ default: "Recreate"
+ enum:
+ - value: "RollingUpdate"
+ description: "Create new pods and then kill old ones"
+ - value: "Recreate"
+ description: "Kill existing pods before creating new ones"
+ # Configure Time Zone
+ - variable: timezone
+ group: "Container Image"
+ label: "Timezone"
+ schema:
+ type: string
+ default: "Etc/UTC"
+ $ref:
+ - "definitions/timezone"
+
+ # Configure Enviroment Variables
+ - variable: environmentVariables
+ label: "Image environment"
+ group: "Configuration"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: environmentVariable
+ label: "Environment Variable"
+ schema:
+ type: dict
+ attrs:
+ - variable: name
+ label: "Name"
+ schema:
+ type: string
+ - variable: value
+ label: "Value"
+ schema:
+ type: string
+ # Enable Host Networking
+ - variable: hostNetwork
+ group: "Networking"
+ label: "Enable Host Networking"
+ schema:
+ type: boolean
+ default: false
+ - variable: services
+ group: "Networking"
+ label: "Configure Service"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "Main service"
+ description: "The Primary service on which the healthcheck runs, often the webUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "HTTPS"
+ hidden: false
+ enum:
+ - value: HTTP
+ description: "HTTP"
+ - value: "HTTPS"
+ description: "HTTPS"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 8443
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 8443
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36035
+ required: true
+ - variable: tcp
+ label: "Unifi Device Communications"
+ description: "This services is used for devices to communicate with the controller"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "TCP"
+ hidden: true
+ enum:
+ - value: TCP
+ description: "TCP"
+ - value: "UDP"
+ description: "UDP"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 8080
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 8080
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36036
+ required: true
+ - variable: udp
+ label: "Stun Device Communications"
+ description: "This services is used for devices to communicate with the controller using STUN"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the service"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: type
+ label: "Service type"
+ description: "ClusterIP's are only internally available, nodePorts expose the container to the host node System"
+ schema:
+ type: string
+ default: "ClusterIP"
+ enum:
+ - value: "NodePort"
+ description: "NodePort"
+ - value: "ClusterIP"
+ description: "ClusterIP"
+ - variable: port
+ label: "Port configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: protocol
+ label: "Port Type"
+ schema:
+ type: string
+ default: "UDP"
+ hidden: true
+ enum:
+ - value: TCP
+ description: "TCP"
+ - value: "UDP"
+ description: "UDP"
+ - variable: port
+ label: "container port"
+ schema:
+ type: int
+ default: 3478
+ editable: false
+ hidden: true
+ - variable: targetport
+ label: "Internal Service port"
+ description: "When connecting internally to this App, you'll need this port"
+ schema:
+ type: int
+ default: 3478
+ editable: false
+ hidden: true
+ - variable: nodePort
+ label: "(optional) host nodePort to expose to"
+ description: "only get used when nodePort is selected"
+ schema:
+ type: int
+ min: 9000
+ max: 65535
+ default: 36037
+ required: true
+ - variable: persistence
+ label: "Integrated Persistent Storage"
+ description: "Websocket Service"
+ group: "Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: config
+ label: "App Config Storage"
+ description: "Stores the Application Configuration."
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable the storage"
+ schema:
+ type: boolean
+ default: true
+ hidden: true
+ - variable: storageClass
+ label: "Type of Storage"
+ description: " Warning: Anything other than Internal will break rollback!"
+ schema:
+ type: string
+ default: ""
+ enum:
+ - value: ""
+ description: "Internal"
+ - variable: mountPath
+ label: "mountPath"
+ description: "Path inside the container the storage is mounted"
+ schema:
+ type: string
+ default: "/unifi"
+ hidden: true
+ - variable: emptyDir
+ label: "Mount a ramdisk instead of actual storage"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ - variable: accessMode
+ label: "Access Mode (Advanced)"
+ description: "Allow or disallow multiple PVC's writhing to the same PVC"
+ schema:
+ type: string
+ default: "ReadWriteOnce"
+ enum:
+ - value: "ReadWriteOnce"
+ description: "ReadWriteOnce"
+ - value: "ReadOnlyMany"
+ description: "ReadOnlyMany"
+ - value: "ReadWriteMany"
+ description: "ReadWriteMany"
+ - variable: size
+ label: "Size quotum of storage"
+ schema:
+ type: string
+ default: "100Gi"
+
+
+ - variable: customStorage
+ label: "Custom app storage"
+ group: "Storage"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: volumeMount
+ label: "Custom Storage"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enabled"
+ schema:
+ type: boolean
+ default: true
+ required: true
+ hidden: true
+ editable: false
+ - variable: setPermissions
+ label: "Automatic Permissions"
+ description: "Automatically set permissions on install"
+ schema:
+ type: boolean
+ default: true
+ hidden: false
+ - variable: readOnly
+ label: "Mount as ReadOnly"
+ description: "prevent any write from being done to the mounted volume"
+ schema:
+ type: boolean
+ default: false
+ hidden: false
+ - variable: emptyDir
+ label: "emptyDir"
+ schema:
+ type: boolean
+ default: false
+ hidden: true
+ editable: false
+ - variable: mountPath
+ label: "Mount Path"
+ description: "Path to mount inside the pod"
+ schema:
+ type: path
+ required: true
+ default: ""
+ editable: true
+ - variable: hostPath
+ label: "Host Path"
+ schema:
+ type: hostpath
+ required: true
+ - variable: ingress
+ label: ""
+ group: "Reverse Proxy Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: main
+ label: "WebUI"
+ schema:
+ type: dict
+ attrs:
+ - variable: certType
+ label: "Select Reverse-Proxy Type"
+ schema:
+ type: string
+ default: "disabled"
+ enum:
+ - value: "disabled"
+ description: "Disabled"
+ - value: ""
+ description: "No Encryption/TLS/Certificates"
+ - value: "selfsigned"
+ description: "Self-Signed Certificate"
+ - value: "ixcert"
+ description: "TrueNAS SCALE Certificate"
+ - variable: type
+ label: "Reverse Proxy Type"
+ schema:
+ type: string
+ default: "HTTP"
+ hidden: true
+ editable: false
+ required: true
+ - variable: serviceName
+ label: "Service name to proxy to"
+ schema:
+ hidden: true
+ editable: false
+ type: string
+ default: ""
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: "websecure"
+ required: true
+ enum:
+ - value: "websecure"
+ description: "Websecure: HTTPS/TLS port 443"
+ - variable: hosts
+ label: "Hosts"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: list
+ default: []
+ items:
+ - variable: host
+ label: "Host"
+ schema:
+ type: dict
+ attrs:
+ - variable: host
+ label: "Domain Name"
+ required: true
+ schema:
+ type: string
+ - variable: path
+ label: "path"
+ schema:
+ type: string
+ required: true
+ hidden: true
+ default: "/"
+ - variable: certificate
+ label: "Select TrueNAS SCALE Certificate"
+ schema:
+ type: int
+ show_if: [["certType", "=", "ixcert"]]
+ $ref:
+ - "definitions/certificate"
+ - variable: authForwardURL
+ label: "Forward Authentication URL"
+ schema:
+ show_if: [["certType", "!=", "disabled"]]
+ type: string
+ default: ""
+ - variable: tcp
+ label: "TCP Ingress Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable TCP Ingress"
+ schema:
+ type: boolean
+ default: false
+ show_subquestions_if: true
+ subquestions:
+ - variable: type
+ label: "Select Ingress Type"
+ schema:
+ type: string
+ default: "TCP"
+ required: true
+ editable: false
+ hidden: true
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ type: string
+ default: "unificom"
+ required: true
+ enum:
+ - value: "unificom"
+ description: "Unifi Communications TCP: port 8080"
+ - variable: udp
+ label: "UDP Ingress Configuration"
+ schema:
+ type: dict
+ attrs:
+ - variable: enabled
+ label: "Enable UDP Ingress"
+ schema:
+ type: boolean
+ default: false
+ show_subquestions_if: true
+ subquestions:
+ - variable: type
+ label: "Select Ingress Type"
+ schema:
+ type: string
+ default: "UDP"
+ required: true
+ editable: false
+ hidden: true
+ - variable: entrypoint
+ label: "Select Entrypoint"
+ schema:
+ type: string
+ default: "stun-udp"
+ required: true
+ enum:
+ - value: "stun-udp"
+ description: "STUN UDP: port 3478"
+ - variable: PUID
+ group: "Advanced"
+ label: "PUID"
+ description: "Sets the PUID env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: int
+ default: 568
+
+ - variable: PGID
+ group: "Advanced"
+ label: "PGID"
+ description: "Sets the PGID env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: int
+ default: 568
+ - variable: UMASK
+ group: "Advanced"
+ label: "UMASK"
+ description: "Sets the UMASK env var for LinuxServer.io (compatible) containers"
+ schema:
+ type: string
+ default: "002"
+ # Enable privileged
+ - variable: securityContext
+ group: "Advanced"
+ label: "Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: privileged
+ label: "Enable privileged mode for Common-Chart based charts"
+ schema:
+ type: boolean
+ default: false
+ # Set Pod Security Policy
+ - variable: podSecurityContext
+ group: "Advanced"
+ label: "Pod Security Context"
+ schema:
+ type: dict
+ attrs:
+ - variable: runAsNonRoot
+ label: "runAsNonRoot"
+ schema:
+ type: boolean
+ default: false
+ - variable: runAsUser
+ label: "runAsUser"
+ description: "The UserID of the user running the application"
+ schema:
+ type: int
+ default: 0
+ - variable: runAsGroup
+ label: "runAsGroup"
+ description: The groupID this App of the user running the application"
+ schema:
+ type: int
+ default: 0
+ - variable: supplementalGroups
+ label: "supplementalGroups"
+ description: "Additional groups this App needs access to"
+ schema:
+ type: list
+ default: []
+ items:
+ - variable: Group
+ label: "Group"
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroup
+ label: "fsGroup"
+ description: "The group that should own ALL storage."
+ schema:
+ type: int
+ default: 568
+ - variable: fsGroupChangePolicy
+ label: "When should we take ownership?"
+ schema:
+ type: string
+ default: "OnRootMismatch"
+ enum:
+ - value: "OnRootMismatch"
+ description: "OnRootMismatch"
+ - value: "Always"
+ description: "Always"
diff --git a/scale-catalog-template/test/unifi/3.1.5/templates/common.yaml b/scale-catalog-template/test/unifi/3.1.5/templates/common.yaml
new file mode 100644
index 00000000..a6613c2c
--- /dev/null
+++ b/scale-catalog-template/test/unifi/3.1.5/templates/common.yaml
@@ -0,0 +1 @@
+{{ include "common.all" . }}
diff --git a/scale-catalog-template/test/unifi/3.1.5/test_values.yaml b/scale-catalog-template/test/unifi/3.1.5/test_values.yaml
new file mode 100644
index 00000000..b8989031
--- /dev/null
+++ b/scale-catalog-template/test/unifi/3.1.5/test_values.yaml
@@ -0,0 +1,54 @@
+# Default values for Unifi.
+
+image:
+ repository: jacobalberty/unifi
+ tag: 6.1.71
+ pullPolicy: IfNotPresent
+
+strategy:
+ type: Recreate
+
+# Configure the Security Context for the Pod
+podSecurityContext:
+ runAsNonRoot: false
+ runAsUser: 0
+ runAsGroup: 0
+ fsGroup: 0
+
+envTpl:
+# Permissions Settings
+ UNIFI_GID: "{{ .Values.PUID }}"
+ UNIFI_UID: "{{ .Values.PGID }}"
+
+services:
+ main:
+ port:
+ port: 8443
+ tcp:
+ enabled: true
+ type: ClusterIP
+ port:
+ port: 8080
+ protocol: TCP
+ targetPort: 8080
+ udp:
+ enabled: true
+ type: ClusterIP
+ port:
+ port: 3478
+ protocol: UDP
+ targetPort: 3478
+
+env: {}
+ # TZ:
+ # PUID:
+ # PGID:
+
+persistence:
+ config:
+ enabled: true
+ mountPath: "/unifi"
+ emptyDir: true
+ accessMode: ReadWriteOnce
+ size: 1Gi
+ storageClass: ""
diff --git a/scale-catalog-template/test/unifi/3.1.5/values.yaml b/scale-catalog-template/test/unifi/3.1.5/values.yaml
new file mode 100644
index 00000000..e69de29b
diff --git a/scale-catalog-template/test/unifi/item.yaml b/scale-catalog-template/test/unifi/item.yaml
new file mode 100644
index 00000000..288785c1
--- /dev/null
+++ b/scale-catalog-template/test/unifi/item.yaml
@@ -0,0 +1,3 @@
+categories:
+ - Networking
+icon_url: https://dl.ubnt.com/press/logo-UniFi.png