---
# System prepended metadata

title: kctrl - generate openAPISchema for helm Chart
tags: [kctrl]

---

# kctrl - generate openAPISchema for helm Chart

###### tags: `kctrl`

## Problem Statement

When a package author wants to generate Carvel package from helm Chart, `pkg release` should be able to read helm's `values.yaml` file and generate the openAPISchema for it and add to the `package.yml` file.

## Observations and findings

Helm doesn't have a very strict way to define a key's comment/description. e.g. 

1. [Bitnami Charts](https://github.com/bitnami/charts/blob/master/bitnami/nginx/values.yaml) defines it as @param.<Key_NAME> as the prefix and they are generally placed at the start of each section
2. [OSS MongoDb](https://github.com/mongodb/helm-charts/blob/main/charts/enterprise-operator/values.yaml) defines without key name just before each key.
3. [Official helm documentation](https://github.com/mongodb/helm-charts/blob/main/charts/enterprise-operator/values.yaml) says it should be key name followed by documentation.
4. Some uses `# --` as the prefix.

It becomes very difficult to figure out which variation is being used to define key's comment/description in a helm chart. 

## Target Scenario

We have decided to target the scenario as recommended in the official documentation of helm.

## Examples(Helm Chart and their corresponding openAPISchema)
1. Nested Obj

**Input**
```
# image Image details.
image:
  # repository Image repository
  repository: my-docker-image
  # pullPolicy Image Pull Policy
  pullPolicy: IfNotPresent
  
```

**Output**
```
openapi: 3.0.0
properties:
image:
  type: object
  description: Image details.
  properties:
    repository:
      type: string
      description: Image repository
      default: my-docker-image
    pullPolicy:
      type: string
      description: Image Pull Policy
      default: IfNotPresent
```

2. Plain Obj

**Input**
```
# image Image details.
image: my-docker-image:1.0.0
# name Container name
name: test-container
# boolExample boolean example
boolExample: true
# arrExample Array Example
arrExample:
- arr1
# numExample Number Example
numExample: 2.3
# intExample Integer Example
intExample: 3
```

**Output**
```
openapi: 3.0.0
properties:
  image:
    type: string
    description: Image details.
    default: my-docker-image:1.0.0
  name:
    type: string
    description: Container name
    default: test-container
  boolExample:
    type: boolean
    description: boolExample boolean example
    default: true
  arrExample:
    type: array
    description: arrExample Array Example
    items:
      type: string
      default: arr1
    default: []
  numExample:
    type: number
    format: float
    description: Number Example
    default: 2.3
  intExample:
    type: integer
    description: Integer Example
    default: 3
```

## Finalised Approach:

**Option 1**

Use golang `v3.yaml` and `v2.yaml` library and write our own custom logic to generate this.

## Alternate approach:
**Option 2**

Try to use ytt as a library but then we have to write our own custom logic to parse the comment. As by default, ytt understand anything suffixed with these`#@schema/desc` as comments. Moreover ytt exposes a lot of options/functionality and we dont want any of them.

**Option 3**

Generate json schema from yaml something similar to this [lib](https://github.com/karuppiah7890/helm-schema-gen). In this also we have to write our own logic to get the default value and comment. No added advantage from option 2.

