Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion internal/helm/images.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,13 @@ func FindImagesFromChart(client goHelm.Client, valuesYaml, chartName, chartVersi
return nil, err
}

images := findAllImages(rel.Manifest)
// Combine main manifest with hook manifests to include resources like bootloader
fullManifest := rel.Manifest
for _, hook := range rel.Hooks {
fullManifest += "\n---\n" + hook.Manifest
}

images := findAllImages(fullManifest)
return images, nil
}

Expand Down
108 changes: 108 additions & 0 deletions internal/helm/images_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,60 @@ func TestFindImagesFromChart(t *testing.T) {
client.EXPECT().InstallChart(gomock.Any(), gomock.Any(), gomock.Any()).Return(&release.Release{Manifest: sampleRenderedYaml}, nil)
},
},
{
name: "manifest-with-hooks",
valuesPath: "",
chartName: "airbyte/airbyte",
chartVersion: "1.1.0",
expect: []string{
"airbyte/bootloader:1.1.0",
"airbyte/server:1.1.0",
"airbyte/worker:1.1.0",
"busybox:latest",
},
mockSetup: func(client *mock.MockClient) {
client.EXPECT().AddOrUpdateChartRepo(gomock.Any()).Return(nil)
client.EXPECT().InstallChart(gomock.Any(), gomock.Any(), gomock.Any()).Return(&release.Release{
Manifest: manifestWithoutHooks,
Hooks: []*release.Hook{
{
Name: "airbyte-bootloader",
Manifest: bootloaderHookManifest,
},
{
Name: "pre-install-job",
Manifest: preInstallJobHookManifest,
},
},
}, nil)
},
},
{
name: "hooks-only-no-manifest",
valuesPath: "",
chartName: "airbyte/airbyte",
chartVersion: "1.1.0",
expect: []string{
"airbyte/bootloader:1.1.0",
"busybox:latest",
},
mockSetup: func(client *mock.MockClient) {
client.EXPECT().AddOrUpdateChartRepo(gomock.Any()).Return(nil)
client.EXPECT().InstallChart(gomock.Any(), gomock.Any(), gomock.Any()).Return(&release.Release{
Manifest: "", // Empty manifest, only hooks
Hooks: []*release.Hook{
{
Name: "airbyte-bootloader",
Manifest: bootloaderHookManifest,
},
{
Name: "pre-install-job",
Manifest: preInstallJobHookManifest,
},
},
}, nil)
},
},
{
name: "configmap-airbyte-env-image-keys",
valuesPath: "",
Expand Down Expand Up @@ -292,6 +346,60 @@ spec:
targetPort: 9376
`

const manifestWithoutHooks = `
apiVersion: apps/v1
kind: Deployment
metadata:
name: airbyte-server
spec:
template:
spec:
containers:
- name: server
image: airbyte/server:1.1.0
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: airbyte-worker
spec:
template:
spec:
containers:
- name: worker
image: airbyte/worker:1.1.0
`

const bootloaderHookManifest = `
apiVersion: v1
kind: Pod
metadata:
name: airbyte-bootloader
annotations:
helm.sh/hook: pre-install,pre-upgrade
helm.sh/hook-weight: "0"
spec:
containers:
- name: bootloader
image: airbyte/bootloader:1.1.0
`

const preInstallJobHookManifest = `
apiVersion: batch/v1
kind: Job
metadata:
name: pre-install-job
annotations:
helm.sh/hook: pre-install
helm.sh/hook-weight: "-1"
spec:
template:
spec:
containers:
- name: pre-install
image: busybox:latest
`

// sampleRenderedYaml should be a string containing a rendered Helm chart YAML with all the images above.
// For brevity, you can use a minimal YAML or mock as needed for your actual test.
const sampleRenderedYaml = `
Expand Down