Skip to content

Commit

Permalink
Entry keys in aggregated Helm index are appended with the name of sou…
Browse files Browse the repository at this point in the history
…rce Helm repo

The introduced convention enables that all charts with the same name, but
in different source Helm repo, appear in the aggregated index file under
the name following the pattern: `foo-chart--my-repo`, where `my-repo` is the name
of `HelmChartRepository` available in the cluster.
  • Loading branch information
pedjak committed Sep 26, 2020
1 parent e9108d3 commit d690950
Show file tree
Hide file tree
Showing 8 changed files with 619 additions and 36 deletions.
25 changes: 25 additions & 0 deletions docs/helm/endpoints_api.md
Original file line number Diff line number Diff line change
Expand Up @@ -321,3 +321,28 @@ _Returns all chart details for the given chart URL_

* **Code:** 400 BAD REQUEST <br />
**Content:** `{ error : "error message" }`

**Retrieve Helm Repository Index**
----

_Returns repository index file containing all entries from all configured repositories_

* **URL**

`/api/helm/charts/index.yaml`

* **Method:**

`GET`

* **Success Response:**

* **Code:** 200 <br />
* JSON representation of [Index file](https://github.com/helm/helm/blob/master/pkg/repo/index.go#L79)
* Each entry key is appended with [source repo name](https://github.com/openshift/api/blob/master/helm/v1beta1/types_helm.go#L16).
Double dash (`--`) serves as the separate between the chart and repo name (e.g. `foo-chart--my-repo`)

* **Error Response:**

* **Code:** 400 BAD REQUEST <br />
**Content:** `{ error : "error message" }`
8 changes: 5 additions & 3 deletions pkg/helm/chartproxy/proxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,13 +69,15 @@ func (p *proxy) IndexFile() (*repo.IndexFile, error) {
return nil, err
}

var indexFiles []*repo.IndexFile
indexFile := repo.NewIndexFile()
for _, helmRepo := range helmRepos {
idxFile, err := helmRepo.IndexFile()
if err != nil {
return nil, err
}
indexFiles = append(indexFiles, idxFile)
for key, entry := range idxFile.Entries {
indexFile.Entries[key+"--"+helmRepo.Name] = entry
}
}
return mergeIndexFiles(indexFiles...), nil
return indexFile, nil
}
11 changes: 8 additions & 3 deletions pkg/helm/chartproxy/proxy_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,19 @@ func TestProxy_IndexFile(t *testing.T) {
}{
{
name: "returned index file for configured helm repo",
indexFiles: []string{"testdata/azureRepoIndex.yaml"},
mergedFile: "testdata/azureRepoIndex.yaml",
indexFiles: []string{"testdata/sampleRepoIndex.yaml"},
mergedFile: "testdata/mergedSampleRepoIndex2.yaml",
},
{
name: "returned merged index file for configured helm repos",
indexFiles: []string{"testdata/azureRepoIndex.yaml", "testdata/sampleRepoIndex.yaml"},
mergedFile: "testdata/mergedRepoIndex.yaml",
},
{
name: "returned merged index contains all entries from source repos - helm names are appended with repo names to avoid duplicate removal",
indexFiles: []string{"testdata/sampleRepoIndex2.yaml", "testdata/sampleRepoIndex2.yaml"},
mergedFile: "testdata/mergedRepoIndexWithDuplicates.yaml",
},
{
name: "return empty index file when no repositories declared in cluster",
indexFiles: []string{},
Expand Down Expand Up @@ -64,7 +69,7 @@ func TestProxy_IndexFile(t *testing.T) {
if err != nil {
t.Error(err)
}
if reflect.DeepEqual(indexFile, expectedIndexFile) {
if !reflect.DeepEqual(indexFile.Entries, expectedIndexFile.Entries) {
t.Errorf("Expected index content \n%v but got \n%v", expectedIndexFile, indexFile)
}
} else {
Expand Down
10 changes: 0 additions & 10 deletions pkg/helm/chartproxy/repos.go
Original file line number Diff line number Diff line change
Expand Up @@ -175,16 +175,6 @@ func (b helmRepoGetter) unmarshallConfig(repo unstructured.Unstructured) (*helmR
return h, nil
}

func mergeIndexFiles(files ...*repo.IndexFile) *repo.IndexFile {
indexFile := repo.NewIndexFile()
for _, file := range files {
for key, entry := range file.Entries {
indexFile.Entries[key] = entry
}
}
return indexFile
}

func (b *helmRepoGetter) List() ([]*helmRepo, error) {
var helmRepos []*helmRepo
repos, err := b.Client.Resource(helmChartRepositoryGVK).List(context.TODO(), v1.ListOptions{})
Expand Down
40 changes: 20 additions & 20 deletions pkg/helm/chartproxy/testdata/mergedRepoIndex.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
apiVersion: v1
entries:
aks-helloworld:
aks-helloworld--sample-repo-1:
- apiVersion: v1
created: "2020-03-30T16:27:13.4350608-05:00"
description: A Helm chart for Kubernetes
Expand All @@ -17,7 +17,7 @@ entries:
response:
- https://azure-samples.github.io/helm-charts/aks-helloworld-0.1.0.tgz
version: 0.1.0
azure-vote:
azure-vote--sample-repo-1:
- apiVersion: v1
created: "2020-03-30T16:27:13.4454224-05:00"
description: A Helm chart for Kubernetes
Expand All @@ -34,7 +34,7 @@ entries:
response:
- https://azure-samples.github.io/helm-charts/azure-vote-0.1.0.tgz
version: 0.1.0
azure-vote-osba:
azure-vote-osba--sample-repo-1:
- apiVersion: v1
created: "2020-03-30T16:27:13.4518442-05:00"
description: A Helm chart for Kubernetes
Expand All @@ -43,7 +43,7 @@ entries:
response:
- https://azure-samples.github.io/helm-charts/azure-vote-osba-0.1.0.tgz
version: 0.1.0
burst-scheduler:
burst-scheduler--sample-repo-1:
- apiVersion: v1
created: "2020-03-30T16:27:13.455658-05:00"
description: A Helm chart for Kubernetes
Expand All @@ -52,7 +52,7 @@ entries:
response:
- https://azure-samples.github.io/helm-charts/burst-scheduler-0.1.0.tgz
version: 0.1.0
image-pull-secret:
image-pull-secret--sample-repo-1:
- apiVersion: v1
created: "2020-03-30T16:27:13.4592817-05:00"
description: A Helm chart for Kubernetes
Expand All @@ -61,7 +61,7 @@ entries:
response:
- https://azure-samples.github.io/helm-charts/image-pull-secret-0.1.0.tgz
version: 0.1.0
open-service-broker-azure:
open-service-broker-azure--sample-repo-1:
- apiVersion: v1
appVersion: v0.0.1
created: "2020-03-30T16:27:13.4706997-05:00"
Expand Down Expand Up @@ -89,7 +89,7 @@ entries:
response:
- https://azure-samples.github.io/helm-charts/open-service-broker-azure-v0.0.1.tgz
version: v0.0.1
osba-container-instances-demo:
osba-container-instances-demo--sample-repo-1:
- apiVersion: v1
created: "2020-03-30T16:27:13.4798738-05:00"
description: A Helm chart for Kubernetes
Expand All @@ -98,7 +98,7 @@ entries:
response:
- https://azure-samples.github.io/helm-charts/osba-container-instances-demo-0.1.0.tgz
version: 0.1.0
osba-cosmos-mongodb-demo:
osba-cosmos-mongodb-demo--sample-repo-1:
- apiVersion: v1
created: "2020-03-30T16:27:13.489062-05:00"
description: A Helm chart for Kubernetes
Expand All @@ -107,7 +107,7 @@ entries:
response:
- https://azure-samples.github.io/helm-charts/osba-cosmos-mongodb-demo-0.1.0.tgz
version: 0.1.0
osba-mysql-demo:
osba-mysql-demo--sample-repo-1:
- apiVersion: v1
created: "2020-03-30T16:27:13.4958437-05:00"
description: A Helm chart for Kubernetes
Expand All @@ -116,7 +116,7 @@ entries:
response:
- https://azure-samples.github.io/helm-charts/osba-mysql-demo-0.1.0.tgz
version: 0.1.0
osba-storage-demo:
osba-storage-demo--sample-repo-1:
- apiVersion: v1
created: "2020-03-30T16:27:13.5013751-05:00"
description: A Helm chart for Kubernetes
Expand All @@ -125,7 +125,7 @@ entries:
response:
- https://azure-samples.github.io/helm-charts/osba-storage-demo-0.1.0.tgz
version: 0.1.0
osba-text-analytics-demo:
osba-text-analytics-demo--sample-repo-1:
- apiVersion: v1
created: "2020-03-30T16:27:13.5060898-05:00"
description: A Helm chart for Kubernetes
Expand All @@ -134,7 +134,7 @@ entries:
response:
- https://azure-samples.github.io/helm-charts/osba-text-analytics-demo-0.1.0.tgz
version: 0.1.0
tweet-factory-operator:
tweet-factory-operator--sample-repo-1:
- apiVersion: v1
created: "2020-03-30T16:27:13.5104606-05:00"
description: A Helm chart for Kubernetes
Expand All @@ -143,7 +143,7 @@ entries:
response:
- https://azure-samples.github.io/helm-charts/tweet-factory-operator-0.1.0.tgz
version: 0.1.0
twitter-sentiment:
twitter-sentiment--sample-repo-1:
- apiVersion: v1
created: "2020-03-30T16:27:13.5145249-05:00"
description: A Helm chart for Kubernetes
Expand All @@ -152,7 +152,7 @@ entries:
response:
- https://azure-samples.github.io/helm-charts/twitter-sentiment-0.1.0.tgz
version: 0.1.0
twitter-sentiment-cnab:
twitter-sentiment-cnab--sample-repo-1:
- apiVersion: v1
created: "2020-03-30T16:27:13.5192786-05:00"
description: A Helm chart for Kubernetes
Expand All @@ -161,7 +161,7 @@ entries:
response:
- https://azure-samples.github.io/helm-charts/twitter-sentiment-cnab-0.1.0.tgz
version: 0.1.0
ibm-cpq-prod:
ibm-cpq-prod--sample-repo-2:
- apiVersion: v2
appVersion: 10.0.0.6
created: "2020-07-15T16:32:34.607411698+05:30"
Expand Down Expand Up @@ -203,7 +203,7 @@ entries:
response:
- https://redhat-developer.github.com/redhat-helm-charts/charts/ibm-cpq-prod-2.0.0.tgz
version: 2.0.0
ibm-object-storage-plugin:
ibm-object-storage-plugin--sample-repo-2:
- apiVersion: v2
appVersion: 2.0.0
created: "2020-07-15T16:32:34.612556197+05:30"
Expand Down Expand Up @@ -238,7 +238,7 @@ entries:
response:
- https://redhat-developer.github.com/redhat-helm-charts/charts/ibm-object-storage-plugin-2.0.0.tgz
version: 2.0.0
ibm-oms-ent-prod:
ibm-oms-ent-prod--sample-repo-2:
- apiVersion: v2
appVersion: 10.0.0
created: "2020-07-15T16:32:34.663118186+05:30"
Expand Down Expand Up @@ -276,7 +276,7 @@ entries:
response:
- https://redhat-developer.github.com/redhat-helm-charts/charts/ibm-oms-ent-prod-5.0.0.tgz
version: 5.0.0
ibm-oms-pro-prod:
ibm-oms-pro-prod--sample-repo-2:
- apiVersion: v2
appVersion: 10.0.0
created: "2020-07-15T16:32:34.695882333+05:30"
Expand Down Expand Up @@ -314,7 +314,7 @@ entries:
response:
- https://redhat-developer.github.com/redhat-helm-charts/charts/ibm-oms-pro-prod-5.0.0.tgz
version: 5.0.0
ibm-operator-catalog-enablement:
ibm-operator-catalog-enablement--sample-repo-2:
- apiVersion: v2
appVersion: 1.0.0
created: "2020-07-15T16:32:34.697730479+05:30"
Expand Down Expand Up @@ -347,7 +347,7 @@ entries:
response:
- https://redhat-developer.github.com/redhat-helm-charts/charts/ibm-operator-catalog-enablement-1.0.0.tgz
version: 1.0.0
nodejs-ex-k:
nodejs-ex-k--sample-repo-2:
- apiVersion: v2
appVersion: 1.16.0
created: "2020-07-15T16:32:34.700484147+05:30"
Expand Down
Loading

0 comments on commit d690950

Please sign in to comment.