Skip to content

Commit

Permalink
✨ (generic-device-plugin): Initial Generic Device Plugin chart release
Browse files Browse the repository at this point in the history
  • Loading branch information
gabe565 committed Apr 24, 2023
1 parent 2181b36 commit 27e5822
Show file tree
Hide file tree
Showing 9 changed files with 475 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ helm delete my-<chart-name>
| [Domain Watch <img src='https://raw.githubusercontent.com/gabe565/domain-watch/ee028db206ea80c2617dd74a87193191a25a0a8a/assets/icon.svg' alt='domain-watch icon' width='18px' align='right' loading='lazy'>](charts/domain-watch/) | Tool to watch whois reports and notify when statuses change or expiration is incoming. |
| [Home Assistant <img src='https://raw.githubusercontent.com/esphome/esphome-docs/019178551126f2d6a588a1f9ef50f60453041531/images/logo.svg' alt='esphome icon' width='18px' align='right' loading='lazy'>](charts/esphome/) | ESPHome is a system to control your ESP8266/ESP32 by simple yet powerful configuration files and control them remotely through Home Automation systems. |
| [Flame <img src='https://raw.githubusercontent.com/pawelmalak/flame/4ed29fe276b4282c67415f9788660df2a3a69b5c/client/public/icons/apple-touch-icon-180x180.png' alt='flame icon' width='18px' align='right' loading='lazy'>](charts/flame/) | Flame is self-hosted startpage for your server. Easily manage your apps and bookmarks with built-in editors. |
| [Generic Device Plugin ](charts/generic-device-plugin/) | The generic-device-plugin enables allocating generic Linux devices, such as serial devices, the FUSE device, or video cameras, to Kubernetes Pods |
| [Hammond <img src='https://raw.githubusercontent.com/akhilrex/hammond/84cba2c7f26f6d3f81c49b132110b24ac97c7b49/ui/public/touch-icon.png' alt='hammond icon' width='18px' align='right' loading='lazy'>](charts/hammond/) | A self-hosted vehicle expense tracking system with support for multiple users. |
| [Headscale <img src='https://raw.githubusercontent.com/juanfont/headscale/56a7b1e34952c3e0306a134b2be9b4277f5d8d6e/docs/logo/headscale3-dots.svg' alt='headscale icon' width='18px' align='right' loading='lazy'>](charts/headscale/) | An open source, self-hosted implementation of the Tailscale control server. |
| [Healthchecks <img src='https://raw.githubusercontent.com/gabe565/charts/main/charts/healthchecks/icon.svg' alt='healthchecks icon' width='18px' align='right' loading='lazy'>](charts/healthchecks/) | A cron monitoring tool written in Python & Django |
Expand Down
25 changes: 25 additions & 0 deletions charts/generic-device-plugin/.helmignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# 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/
# helm-docs templates
*.gotmpl
6 changes: 6 additions & 0 deletions charts/generic-device-plugin/Chart.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
dependencies:
- name: common
repository: https://bjw-s.github.io/helm-charts
version: 1.4.0
digest: sha256:4b75202a3971677362052bcee21a023ea42a0c18991800ae62a8890d4655b699
generated: "2023-04-24T01:07:47.392308-05:00"
26 changes: 26 additions & 0 deletions charts/generic-device-plugin/Chart.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
apiVersion: v2
name: generic-device-plugin
description: The generic-device-plugin enables allocating generic Linux devices, such as serial devices, the FUSE device, or video cameras, to Kubernetes Pods
home: https://charts.gabe565.com/charts/generic-device-plugin/
type: application
version: 0.0.1
# renovate datasource=docker depName=ghcr.io/squat/generic-device-plugin
appVersion: latest
kubeVersion: ">=1.22.0-0"
keywords:
- device-plugin
dependencies:
- name: common
repository: https://bjw-s.github.io/helm-charts
version: 1.4.0
sources:
- https://github.com/squat/generic-device-plugin
annotations:
artifacthub.io/changes: |-
- kind: added
description: Initial release
artifacthub.io/links: |-
- name: App Source
url: https://github.com/squat/generic-device-plugin
- name: Chart Source
url: https://github.com/gabe565/charts/tree/main/charts/generic-device-plugin
174 changes: 174 additions & 0 deletions charts/generic-device-plugin/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
# Generic Device Plugin

![Version: 0.0.1](https://img.shields.io/badge/Version-0.0.1-informational?style=flat)
![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat)
![AppVersion: latest](https://img.shields.io/badge/AppVersion-latest-informational?style=flat)

The generic-device-plugin enables allocating generic Linux devices, such as serial devices, the FUSE device, or video cameras, to Kubernetes Pods

**Homepage:** <https://charts.gabe565.com/charts/generic-device-plugin/>

**This chart is not maintained by the upstream project and any issues with the chart should be raised
[here](https://github.com/gabe565/charts/issues/new?assignees=gabe565&labels=bug&template=bug_report.yaml&name=generic-device-plugin&version=0.0.1)**

## Source Code

* <https://github.com/squat/generic-device-plugin>

## Requirements

Kubernetes: `>=1.22.0-0`

## Dependencies

| Repository | Name | Version |
|------------|------|---------|
| <https://bjw-s.github.io/helm-charts> | common | 1.4.0 |

## TL;DR

```console
helm repo add gabe565 https://charts.gabe565.com
helm repo update
helm install generic-device-plugin gabe565/generic-device-plugin
```

## Installing the Chart

To install the chart with the release name `generic-device-plugin`

```console
helm install generic-device-plugin gabe565/generic-device-plugin
```

## Uninstalling the Chart

To uninstall the `generic-device-plugin` deployment

```console
helm uninstall generic-device-plugin
```

The command removes all the Kubernetes components associated with the chart **including persistent volumes** and deletes the release.

## Configuration

Read through the [values.yaml](./values.yaml) file. It has several commented out suggested values.
Other values may be used from the [values.yaml](https://github.com/bjw-s/helm-charts/tree/main/charts/library/common/values.yaml) from the [bjw-s common library](https://github.com/bjw-s/helm-charts/tree/main/charts/library/common).

Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`.

```console
helm install generic-device-plugin \
--set env.TZ="America/New York" \
gabe565/generic-device-plugin
```

Alternatively, a YAML file that specifies the values for the above parameters can be provided while installing the chart.

```console
helm install generic-device-plugin gabe565/generic-device-plugin -f values.yaml
```

## Custom configuration

### Configuring Devices
Generic Device Plugin will only expose whitelisted devices.
To add a device with this Helm chart, add it to `config.data` in the following format:

```yaml
config:
data: |
devices:
- <device specs>
```
#### Device Spec
- Multiple paths can be given for each type. Paths can be globs.
- Should be provided in the form:
```yaml
name: <name>
groups:
- <device definitions>
count: <count>
```
#### Device Definition
- The device definition can be either a path to a device file or a USB device. You cannot define both in the same group.
- For device files, use something like:
```yaml
paths:
- path: <path-1>
mountPath: <mount-path-1>
- path: <path-2>
mountPath: <mount-path-2>
```
- For example, to expose serial devices with different names:
```yaml
name: serial
groups:
- paths:
- path: /dev/ttyUSB*
- paths:
- path: /dev/ttyACM*
```
- For USB devices, use something like:
```yaml
usb:
- vendor: "1209"
product: "000F"
```
- For example, to expose a CH340 serial converter:
```yaml
name: ch340
groups:
- usb:
- vendor: "1a86"
product: "7523"
```
- The device flag can specify lists of devices that should be grouped and mounted into a container together as one single meta-device.
- For example, to allocate and mount an audio capture device:
```yaml
name: capture
groups:
- paths:
- path: /dev/snd/pcmC0D0c
- path: /dev/snd/controlC0
```
- A "count" can be specified to allow a discovered device group to be scheduled multiple times.
- For example, to permit allocation of the FUSE device 10 times:
```yaml
name: fuse
groups:
- count: 10
paths:
- path: /dev/fuse
```
- Note: if omitted, "count" is assumed to be 1
See [values.yaml](./values.yaml) for an example configuration file.
## Values
**Important**: When deploying an application Helm chart you can add more values from the bjw-s common library chart [here](https://github.com/bjw-s/helm-charts/tree/main/charts/library/common)
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| config.data | string | See [values.yaml](./values.yaml) | generic-device-plugin config file [[ref]](https://github.com/squat/generic-device-plugin#usage) |
| config.enabled | bool | `true` | Enables the config file ConfigMap |
| controller.type | string | `"daemonset"` | Sets the controller type |
| env | object | See [values.yaml](./values.yaml) | Environment variables [[ref]](https://github.com/squat/generic-device-plugin#usage) |
| env.DOMAIN | string | `"squat.ai"` | The domain to use when declaring devices |
| image.pullPolicy | string | `"Always"` | Image pull policy |
| image.repository | string | `"ghcr.io/squat/generic-device-plugin"` | Image repository |
| image.tag | string | `"latest"` | Image tag |
| persistence.dev | object | See [values.yaml](./values.yaml) | Host path volume bind to the dev dir |
| persistence.device-plugins | object | See [values.yaml](./values.yaml) | Host path volume bind to the Kubelet plugin directory |
| probes.liveness | object | `{"path":"/health","type":"HTTP"}` | Configures liveness probe |
| probes.readiness | object | `{"path":"/health","type":"HTTP"}` | Configures readiness probe |
| probes.startup | object | `{"path":"/health","type":"HTTP"}` | Configures startup probe |
| securityContext.privileged | bool | `true` | Privileged mode is required to access devices |
| service.main | object | See [values.yaml](./values.yaml) | Configures health/metrics service settings for the chart. |

---
Autogenerated from chart metadata using [helm-docs](https://github.com/norwoodj/helm-docs)
87 changes: 87 additions & 0 deletions charts/generic-device-plugin/README_CONFIG.md.gotmpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
{{- define "custom.chart.name" -}}
Generic Device Plugin
{{- end -}}

{{- define "custom.custom.configuration.header" -}}
## Custom configuration
{{- end -}}

{{- define "custom.custom.configuration" -}}
{{ template "custom.custom.configuration.header" . }}

### Configuring Devices
Generic Device Plugin will only expose whitelisted devices.
To add a device with this Helm chart, add it to `config.data` in the following format:

```yaml
config:
data: |
devices:
- <device specs>
```

#### Device Spec
- Multiple paths can be given for each type. Paths can be globs.
- Should be provided in the form:
```yaml
name: <name>
groups:
- <device definitions>
count: <count>
```

#### Device Definition
- The device definition can be either a path to a device file or a USB device. You cannot define both in the same group.
- For device files, use something like:
```yaml
paths:
- path: <path-1>
mountPath: <mount-path-1>
- path: <path-2>
mountPath: <mount-path-2>
```
- For example, to expose serial devices with different names:
```yaml
name: serial
groups:
- paths:
- path: /dev/ttyUSB*
- paths:
- path: /dev/ttyACM*
```
- For USB devices, use something like:
```yaml
usb:
- vendor: "1209"
product: "000F"
```
- For example, to expose a CH340 serial converter:
```yaml
name: ch340
groups:
- usb:
- vendor: "1a86"
product: "7523"
```
- The device flag can specify lists of devices that should be grouped and mounted into a container together as one single meta-device.
- For example, to allocate and mount an audio capture device:
```yaml
name: capture
groups:
- paths:
- path: /dev/snd/pcmC0D0c
- path: /dev/snd/controlC0
```
- A "count" can be specified to allow a discovered device group to be scheduled multiple times.
- For example, to permit allocation of the FUSE device 10 times:
```yaml
name: fuse
groups:
- count: 10
paths:
- path: /dev/fuse
```
- Note: if omitted, "count" is assumed to be 1

See [values.yaml](./values.yaml) for an example configuration file.
{{- end -}}
1 change: 1 addition & 0 deletions charts/generic-device-plugin/templates/NOTES.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{{- include "bjw-s.common.lib.chart.notes" . -}}
35 changes: 35 additions & 0 deletions charts/generic-device-plugin/templates/common.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{{- define "genericDevicePlugin.config" -}}
{{- with .Values.config }}
{{- if .enabled }}
args:
- --config=/config/config.yaml

configMaps:
config:
enabled: true
data:
config.yaml: {{ toYaml .data | nindent 8 }}

persistence:
config:
enabled: true
type: configMap
name: {{ include "bjw-s.common.lib.chart.names.fullname" $ }}-config
{{- end }}
{{- end }}
{{- end -}}
{{- $_ := merge .Values (include "genericDevicePlugin.config" . | fromYaml) -}}

{{/* Append the hardcoded settings */}}
{{- define "genericDevicePlugin.defaultValues" -}}
env:
LISTEN: :{{ .Values.service.main.ports.http.port }}

{{- with get .Values.persistence "device-plugins" }}
PLUGIN_DIRECTORY: {{ .mountPath | default .hostPath }}
{{- end }}
{{- end -}}
{{- $_ = merge .Values (include "genericDevicePlugin.defaultValues" . | fromYaml) -}}

{{/* Render the templates */}}
{{ include "bjw-s.common.loader.all" . }}
Loading

0 comments on commit 27e5822

Please sign in to comment.