Skip to content

Commit

Permalink
Merge pull request #411 from Jeremy-Boyle/develop
Browse files Browse the repository at this point in the history
Solution issue #409
  • Loading branch information
cppforlife authored Oct 26, 2021
2 parents e63bb78 + b08a09f commit 22d3f3a
Show file tree
Hide file tree
Showing 2 changed files with 144 additions and 18 deletions.
37 changes: 29 additions & 8 deletions pkg/packageinstall/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,12 @@ import (
const (
ManuallyControlledAnnKey = "ext.packaging.carvel.dev/manually-controlled"

HelmTemplateOverlayNameKey = "ext.packaging.carvel.dev/helm-template-name"
HelmTemplateOverlayNameSpaceKey = "ext.packaging.carvel.dev/helm-template-namespace"

// Resulting secret names are sorted deterministically by suffix
ExtYttPathsFromSecretNameAnnKey = "ext.packaging.carvel.dev/ytt-paths-from-secret-name"
ExtYttPathsFromSecretNameAnnKeyPrefix = ExtYttPathsFromSecretNameAnnKey + "."
ExtYttPathsFromSecretNameAnnKey = "ext.packaging.carvel.dev/ytt-paths-from-secret-name"
ExtHelmPathsFromSecretNameAnnKey = "ext.packaging.carvel.dev/helm-template-values-from-secret-name"

ExtYttDataValuesOverlaysAnnKey = "ext.packaging.carvel.dev/ytt-data-values-overlays"

Expand Down Expand Up @@ -88,9 +91,27 @@ func NewApp(existingApp *v1alpha1.App, pkgInstall *pkgingv1alpha1.PackageInstall

valuesApplied := false
yttPathsApplied := false
helmPathsApplied := false

for i, templateStep := range desiredApp.Spec.Template {
if templateStep.HelmTemplate != nil {
if !helmPathsApplied {
helmPathsApplied = true

if _, found := pkgInstall.Annotations[HelmTemplateOverlayNameKey]; found {
templateStep.HelmTemplate.Name = pkgInstall.Annotations[HelmTemplateOverlayNameKey]
}
if _, found := pkgInstall.Annotations[HelmTemplateOverlayNameSpaceKey]; found {
templateStep.HelmTemplate.Namespace = pkgInstall.Annotations[HelmTemplateOverlayNameSpaceKey]
}
for _, secretName := range secretNamesFromAnn(pkgInstall, ExtHelmPathsFromSecretNameAnnKey) {
templateStep.HelmTemplate.ValuesFrom = append(templateStep.HelmTemplate.ValuesFrom, kcv1alpha1.AppTemplateValuesSource{
SecretRef: &kcv1alpha1.AppTemplateValuesSourceRef{
Name: secretName,
},
})
}
}
if !valuesApplied {
valuesApplied = true

Expand All @@ -108,7 +129,7 @@ func NewApp(existingApp *v1alpha1.App, pkgInstall *pkgingv1alpha1.PackageInstall
if !yttPathsApplied {
yttPathsApplied = true

for _, secretName := range secretNamesFromAnn(pkgInstall) {
for _, secretName := range secretNamesFromAnn(pkgInstall, ExtYttPathsFromSecretNameAnnKey) {
if templateStep.Ytt.Inline == nil {
templateStep.Ytt.Inline = &kcv1alpha1.AppFetchInline{}
}
Expand Down Expand Up @@ -152,17 +173,17 @@ func NewApp(existingApp *v1alpha1.App, pkgInstall *pkgingv1alpha1.PackageInstall
return desiredApp, nil
}

func secretNamesFromAnn(installedPkg *pkgingv1alpha1.PackageInstall) []string {
func secretNamesFromAnn(installedPkg *pkgingv1alpha1.PackageInstall, annKey string) []string {
var suffixes []string
suffixToSecretName := map[string]string{}

for annKey, secretName := range installedPkg.Annotations {
if annKey == ExtYttPathsFromSecretNameAnnKey {
for ann, secretName := range installedPkg.Annotations {
if ann == annKey {
suffix := ""
suffixToSecretName[suffix] = secretName
suffixes = append(suffixes, suffix)
} else if strings.HasPrefix(annKey, ExtYttPathsFromSecretNameAnnKeyPrefix) {
suffix := strings.TrimPrefix(annKey, ExtYttPathsFromSecretNameAnnKeyPrefix)
} else if strings.HasPrefix(ann, annKey+".") {
suffix := strings.TrimPrefix(ann, annKey+".")
suffixToSecretName[suffix] = secretName
suffixes = append(suffixes, suffix)
}
Expand Down
125 changes: 115 additions & 10 deletions pkg/packageinstall/app_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,20 @@ import (
// several tests below have no SyncPeriod set so they'll all use the same default.
var defaultSyncPeriod metav1.Duration = metav1.Duration{10 * time.Minute}

func TestAppExtYttPathsFromSecretNameAnn(t *testing.T) {
func TestAppExtPathsFromSecretNameAnn(t *testing.T) {
ipkg := &pkgingv1alpha1.PackageInstall{
ObjectMeta: metav1.ObjectMeta{
Name: "app",
Namespace: "default",
Annotations: map[string]string{
"ext.packaging.carvel.dev/ytt-paths-from-secret-name": "no-suffix",
"ext.packaging.carvel.dev/ytt-paths-from-secret-name.4": "suffix-4",
"ext.packaging.carvel.dev/ytt-paths-from-secret-name.2": "suffix-2",
"ext.packaging.carvel.dev/ytt-paths-from-secret-name.text": "suffix-text",
"ext.packaging.carvel.dev/ytt-paths-from-secret-name": "ytt-no-suffix",
"ext.packaging.carvel.dev/ytt-paths-from-secret-name.4": "ytt-suffix-4",
"ext.packaging.carvel.dev/ytt-paths-from-secret-name.2": "ytt-suffix-2",
"ext.packaging.carvel.dev/ytt-paths-from-secret-name.text": "ytt-suffix-text",
"ext.packaging.carvel.dev/helm-template-values-from-secret-name": "helm-no-suffix",
"ext.packaging.carvel.dev/helm-template-values-from-secret-name.4": "helm-suffix-4",
"ext.packaging.carvel.dev/helm-template-values-from-secret-name.2": "helm-suffix-2",
"ext.packaging.carvel.dev/helm-template-values-from-secret-name.text": "helm-suffix-text",
},
},
}
Expand All @@ -41,6 +45,7 @@ func TestAppExtYttPathsFromSecretNameAnn(t *testing.T) {
Template: datapkgingv1alpha1.AppTemplateSpec{
Spec: &kcv1alpha1.AppSpec{
Template: []kcv1alpha1.AppTemplate{
{HelmTemplate: &kcv1alpha1.AppTemplateHelmTemplate{}},
{HelmTemplate: &kcv1alpha1.AppTemplateHelmTemplate{}},
{Ytt: &kcv1alpha1.AppTemplateYtt{}},
{Ytt: &kcv1alpha1.AppTemplateYtt{}},
Expand All @@ -59,29 +64,54 @@ func TestAppExtYttPathsFromSecretNameAnn(t *testing.T) {
Spec: kcv1alpha1.AppSpec{
SyncPeriod: &defaultSyncPeriod,
Template: []kcv1alpha1.AppTemplate{
// Helm template step is untouched
{HelmTemplate: &kcv1alpha1.AppTemplateHelmTemplate{
ValuesFrom: []kcv1alpha1.AppTemplateValuesSource{
kcv1alpha1.AppTemplateValuesSource{
SecretRef: &kcv1alpha1.AppTemplateValuesSourceRef{
Name: "helm-no-suffix",
},
},
kcv1alpha1.AppTemplateValuesSource{
SecretRef: &kcv1alpha1.AppTemplateValuesSourceRef{
Name: "helm-suffix-2",
},
},
kcv1alpha1.AppTemplateValuesSource{
SecretRef: &kcv1alpha1.AppTemplateValuesSourceRef{
Name: "helm-suffix-4",
},
},
kcv1alpha1.AppTemplateValuesSource{
SecretRef: &kcv1alpha1.AppTemplateValuesSourceRef{
Name: "helm-suffix-text",
},
},
},
}},
// Second Helm template step is untouched
{HelmTemplate: &kcv1alpha1.AppTemplateHelmTemplate{}},

{Ytt: &kcv1alpha1.AppTemplateYtt{
Inline: &kcv1alpha1.AppFetchInline{
PathsFrom: []kcv1alpha1.AppFetchInlineSource{
kcv1alpha1.AppFetchInlineSource{
SecretRef: &kcv1alpha1.AppFetchInlineSourceRef{
Name: "no-suffix",
Name: "ytt-no-suffix",
},
},
kcv1alpha1.AppFetchInlineSource{
SecretRef: &kcv1alpha1.AppFetchInlineSourceRef{
Name: "suffix-2",
Name: "ytt-suffix-2",
},
},
kcv1alpha1.AppFetchInlineSource{
SecretRef: &kcv1alpha1.AppFetchInlineSourceRef{
Name: "suffix-4",
Name: "ytt-suffix-4",
},
},
kcv1alpha1.AppFetchInlineSource{
SecretRef: &kcv1alpha1.AppFetchInlineSourceRef{
Name: "suffix-text",
Name: "ytt-suffix-text",
},
},
},
Expand All @@ -101,6 +131,81 @@ func TestAppExtYttPathsFromSecretNameAnn(t *testing.T) {
t.Fatalf("App does not match expected app: (actual)\n%s", bs)
}
}
func TestAppHelmOverlaysFromAnn(t *testing.T) {
ipkg := &pkgingv1alpha1.PackageInstall{
ObjectMeta: metav1.ObjectMeta{
Name: "app",
Namespace: "default",
Annotations: map[string]string{
"ext.packaging.carvel.dev/helm-template-name": "helm-new-name",
"ext.packaging.carvel.dev/helm-template-namespace": "helm-new-namespace",
},
},
Spec: pkgingv1alpha1.PackageInstallSpec{
Values: []pkgingv1alpha1.PackageInstallValues{
{SecretRef: &pkgingv1alpha1.PackageInstallValuesSecretRef{Name: "values1"}},
{SecretRef: &pkgingv1alpha1.PackageInstallValuesSecretRef{Name: "values2"}},
},
},
}

pkgVersion := datapkgingv1alpha1.Package{
Spec: datapkgingv1alpha1.PackageSpec{
RefName: "expec-pkg",
Version: "1.5.0",
Template: datapkgingv1alpha1.AppTemplateSpec{
Spec: &kcv1alpha1.AppSpec{
Template: []kcv1alpha1.AppTemplate{
{HelmTemplate: &kcv1alpha1.AppTemplateHelmTemplate{
Name: "helm-default-name",
Namespace: "helm-default-namespace",
}},
{Ytt: &kcv1alpha1.AppTemplateYtt{}},
},
},
},
},
}

app, err := packageinstall.NewApp(&kcv1alpha1.App{}, ipkg, pkgVersion)
if err != nil {
t.Fatalf("Expected no err, but was: %s", err)
}

expectedApp := &kcv1alpha1.App{
Spec: kcv1alpha1.AppSpec{
SyncPeriod: &defaultSyncPeriod,
Template: []kcv1alpha1.AppTemplate{
{HelmTemplate: &kcv1alpha1.AppTemplateHelmTemplate{
Name: "helm-new-name",
Namespace: "helm-new-namespace",
ValuesFrom: []kcv1alpha1.AppTemplateValuesSource{
kcv1alpha1.AppTemplateValuesSource{
SecretRef: &kcv1alpha1.AppTemplateValuesSourceRef{
Name: "values1",
},
},
kcv1alpha1.AppTemplateValuesSource{
SecretRef: &kcv1alpha1.AppTemplateValuesSourceRef{
Name: "values2",
},
},
},
}},
// Ytt template step is untouched
{Ytt: &kcv1alpha1.AppTemplateYtt{}},
},
},
}

// Not interesting in metadata in this test
app.ObjectMeta = metav1.ObjectMeta{}

if !reflect.DeepEqual(expectedApp, app) {
bs, _ := yaml.Marshal(app)
t.Fatalf("App does not match expected app: (actual)\n%s", bs)
}
}

func TestAppExtYttDataValuesOverlaysAnn(t *testing.T) {
ipkg := &pkgingv1alpha1.PackageInstall{
Expand Down

0 comments on commit 22d3f3a

Please sign in to comment.