From f48087ccee411e9c83ad7fe81c9f95faa17c1538 Mon Sep 17 00:00:00 2001 From: Brandon Foley Date: Thu, 17 Oct 2024 11:45:44 -0400 Subject: [PATCH] Migrating addons to generic handler --- cmd/update.go | 39 ++-- pkg/addons/addon_config_test.go | 51 ----- pkg/addons/addons.go | 136 ------------- pkg/addons/addons_test.go | 184 ------------------ .../addon_helpers.go} | 86 ++++---- pkg/cmdhelpers/addon_helpers_test.go | 75 +++++++ .../addons/{helm => ingress}/ingress.yaml | 0 pkg/fixtures/addons/kustomize/ingress.yaml | 33 ---- pkg/handlers/template_test.go | 16 ++ .../addons/azure/webapp_routing/draft.yaml | 31 ++- .../addons/azure/webapp_routing/ingress.yaml | 22 +-- 11 files changed, 190 insertions(+), 483 deletions(-) delete mode 100644 pkg/addons/addon_config_test.go delete mode 100644 pkg/addons/addons.go delete mode 100644 pkg/addons/addons_test.go rename pkg/{addons/addon_config.go => cmdhelpers/addon_helpers.go} (68%) create mode 100644 pkg/cmdhelpers/addon_helpers_test.go rename pkg/fixtures/addons/{helm => ingress}/ingress.yaml (100%) delete mode 100644 pkg/fixtures/addons/kustomize/ingress.yaml diff --git a/cmd/update.go b/cmd/update.go index 148f86d7..297095ba 100644 --- a/cmd/update.go +++ b/cmd/update.go @@ -10,18 +10,16 @@ import ( log "github.com/sirupsen/logrus" "github.com/spf13/cobra" - "github.com/Azure/draft/pkg/addons" + "github.com/Azure/draft/pkg/cmdhelpers" "github.com/Azure/draft/pkg/config" dryrunpkg "github.com/Azure/draft/pkg/dryrun" + "github.com/Azure/draft/pkg/handlers" "github.com/Azure/draft/pkg/templatewriter" "github.com/Azure/draft/pkg/templatewriter/writers" - "github.com/Azure/draft/template" ) type updateCmd struct { dest string - provider string - addon string flagVariables []string templateWriter templatewriter.TemplateWriter addonFS embed.FS @@ -48,8 +46,6 @@ func newUpdateCmd() *cobra.Command { } f := cmd.Flags() f.StringVarP(&uc.dest, "destination", "d", ".", "specify the path to the project directory") - f.StringVarP(&uc.provider, "provider", "p", "azure", "cloud provider") - f.StringVarP(&uc.addon, "addon", "a", "", "addon name") f.StringArrayVarP(&uc.flagVariables, "variable", "", []string{}, "pass template variables (e.g. --variable ingress-tls-cert-keyvault-uri=test.uri ingress-host=host)") uc.templateWriter = &writers.LocalFSWriter{} @@ -60,40 +56,37 @@ func newUpdateCmd() *cobra.Command { func (uc *updateCmd) run() error { flagVariablesMap = flagVariablesToMap(uc.flagVariables) - if uc.addon == "" { - addon, err := addons.PromptAddon(template.Addons, uc.provider) - if err != nil { - return err - } - uc.addon = addon + if dryRun { + dryRunRecorder = dryrunpkg.NewDryRunRecorder() + uc.templateVariableRecorder = dryRunRecorder + uc.templateWriter = dryRunRecorder } - addonConfig, err := addons.GetAddonConfig(template.Addons, uc.provider, uc.addon) + ingressTemplate, err := handlers.GetTemplate("app-routing-ingress", "", uc.dest, uc.templateWriter) if err != nil { + log.Errorf("error getting ingress template: %s", err.Error()) return err } - - if addonConfig.DraftConfig == nil { + if ingressTemplate == nil { return errors.New("DraftConfig is nil") - } else { - addonConfig.DraftConfig.VariableMapToDraftConfig(flagVariablesMap) } - err = addons.PromptAddonValues(uc.dest, &addonConfig) + err = cmdhelpers.PromptAddonValues(uc.dest, ingressTemplate.Config) if err != nil { return err } if dryRun { - dryRunRecorder = dryrunpkg.NewDryRunRecorder() - uc.templateVariableRecorder = dryRunRecorder - uc.templateWriter = dryRunRecorder - for _, variable := range addonConfig.DraftConfig.Variables { + for _, variable := range ingressTemplate.Config.Variables { uc.templateVariableRecorder.Record(variable.Name, variable.Value) } } - err = addons.GenerateAddon(template.Addons, uc.provider, uc.addon, uc.dest, addonConfig, uc.templateWriter) + err = ingressTemplate.Generate() + if err != nil { + log.Errorf("error generating ingress template: %s", err.Error()) + return err + } if dryRun { dryRunText, err := json.MarshalIndent(dryRunRecorder.DryRunInfo, "", TWO_SPACES) diff --git a/pkg/addons/addon_config_test.go b/pkg/addons/addon_config_test.go deleted file mode 100644 index e4617552..00000000 --- a/pkg/addons/addon_config_test.go +++ /dev/null @@ -1,51 +0,0 @@ -package addons - -import ( - "io/fs" - "testing" - - "github.com/stretchr/testify/assert" - "gopkg.in/yaml.v3" - - "github.com/Azure/draft/template" -) - -func TestGetHelmReferenceMap(t *testing.T) { - configBytes, err := fs.ReadFile(template.Addons, "addons/azure/webapp_routing/draft.yaml") - assert.Nil(t, err) - - var addOnConfig AddonConfig - err = yaml.Unmarshal(configBytes, &addOnConfig) - assert.Nil(t, err) - - refMap := make(map[string]string) - err = extractHelmValuesToMap("service", "../../test/templates/helm", addOnConfig.ReferenceComponents["service"], refMap) - assert.Nil(t, err) - assert.NotEmpty(t, refMap) -} - -func TestGetKustomizeReferenceMap(t *testing.T) { - configBytes, err := fs.ReadFile(template.Addons, "addons/azure/webapp_routing/draft.yaml") - assert.Nil(t, err) - - var addOnConfig AddonConfig - err = yaml.Unmarshal(configBytes, &addOnConfig) - refMap := make(map[string]string) - - err = extractKustomizeValuesToMap("service", "../../test/templates/kustomize", addOnConfig.ReferenceComponents["service"], refMap) - assert.Nil(t, err) - assert.NotEmpty(t, refMap) -} - -func TestGetManifestReferenceMap(t *testing.T) { - configBytes, err := fs.ReadFile(template.Addons, "addons/azure/webapp_routing/draft.yaml") - assert.Nil(t, err) - - var addOnConfig AddonConfig - err = yaml.Unmarshal(configBytes, &addOnConfig) - refMap := make(map[string]string) - - err = extractManifestValuesToMap("service", "../../test/templates/manifests", addOnConfig.ReferenceComponents["service"], refMap) - assert.Nil(t, err) - assert.NotEmpty(t, refMap) -} diff --git a/pkg/addons/addons.go b/pkg/addons/addons.go deleted file mode 100644 index 97d5de23..00000000 --- a/pkg/addons/addons.go +++ /dev/null @@ -1,136 +0,0 @@ -package addons - -import ( - "embed" - "errors" - "fmt" - "io/fs" - "path" - "strings" - - "github.com/manifoldco/promptui" - log "github.com/sirupsen/logrus" - "golang.org/x/exp/maps" - "gopkg.in/yaml.v3" - - "github.com/Azure/draft/pkg/embedutils" - "github.com/Azure/draft/pkg/osutil" - "github.com/Azure/draft/pkg/prompts" - "github.com/Azure/draft/pkg/templatewriter" -) - -var ( - parentDirName = "addons" -) - -func GenerateAddon(addons embed.FS, provider, addon, dest string, addonConfig AddonConfig, templateWriter templatewriter.TemplateWriter) error { - selectedAddonPath, err := GetAddonPath(addons, provider, addon) - if err != nil { - return err - } - - addonDestPath, err := addonConfig.GetAddonDestPath(dest) - if err != nil { - return err - } - - if addonConfig.DraftConfig == nil { - return errors.New("DraftConfig is nil") - } else { - err := addonConfig.DraftConfig.ApplyDefaultVariables() - if err != nil { - return err - } - } - - if err = osutil.CopyDirWithTemplates(addons, selectedAddonPath, addonDestPath, addonConfig.DraftConfig, templateWriter); err != nil { - return err - } - - return err -} - -func GetAddonPath(addons embed.FS, provider, addon string) (string, error) { - providerPath := path.Join(parentDirName, strings.ToLower(provider)) - addonMap, err := embedutils.EmbedFStoMap(addons, providerPath) - if err != nil { - return "", err - } - var selectedAddon fs.DirEntry - var ok bool - if selectedAddon, ok = addonMap[addon]; !ok { - return "", errors.New("addon not found") - } - - selectedAddonPath := path.Join(providerPath, selectedAddon.Name()) - - return selectedAddonPath, nil -} - -func GetAddonConfig(addons embed.FS, provider, addon string) (AddonConfig, error) { - selectedAddonPath, err := GetAddonPath(addons, provider, addon) - if err != nil { - return AddonConfig{}, err - } - - addonConfigPath := path.Join(selectedAddonPath, "draft.yaml") - log.Debugf("addonConfig is: %s", addonConfigPath) - - configBytes, err := fs.ReadFile(addons, addonConfigPath) - if err != nil { - return AddonConfig{}, err - } - var addonConfig AddonConfig - if err = yaml.Unmarshal(configBytes, &addonConfig); err != nil { - return AddonConfig{}, err - } - - return addonConfig, nil -} - -func PromptAddon(addons embed.FS, provider string) (string, error) { - providerPath := path.Join(parentDirName, strings.ToLower(provider)) - addonMap, err := embedutils.EmbedFStoMap(addons, providerPath) - if err != nil { - return "", err - } - - addonNames := maps.Keys(addonMap) - prompt := promptui.Select{ - Label: fmt.Sprintf("Select %s addon", provider), - Items: addonNames, - } - _, addon, err := prompt.Run() - if err != nil { - return "", err - } - - return addon, nil -} - -func PromptAddonValues(dest string, addonConfig *AddonConfig) error { - err := prompts.RunPromptsFromConfigWithSkips(addonConfig.DraftConfig) - if err != nil { - return err - } - log.Debug("got user inputs") - - referenceMap, err := addonConfig.GetReferenceValueMap(dest) - if err != nil { - return err - } - log.Debug("got reference map") - // merge maps - for refName, refVal := range referenceMap { - // check for key collision - if _, err := addonConfig.DraftConfig.GetVariable(refName); err == nil { - return errors.New("variable name collision between references and DraftConfig") - } - if strings.Contains(strings.ToLower(refName), "namespace") && refVal == "" { - refVal = "default" //hack here to have explicit namespacing, probably a better way to do this - } - addonConfig.DraftConfig.SetVariable(refName, refVal) - } - - return nil -} diff --git a/pkg/addons/addons_test.go b/pkg/addons/addons_test.go deleted file mode 100644 index 7f446c38..00000000 --- a/pkg/addons/addons_test.go +++ /dev/null @@ -1,184 +0,0 @@ -package addons - -import ( - "fmt" - "github.com/Azure/draft/pkg/fixtures" - "io/ioutil" - "os" - "testing" - - "github.com/stretchr/testify/assert" - - "github.com/Azure/draft/pkg/config" - "github.com/Azure/draft/pkg/osutil" - "github.com/Azure/draft/pkg/templatewriter/writers" - "github.com/Azure/draft/template" -) - -const templatePath = "../../test/templates" - -func TestGenerateAddonErrors(t *testing.T) { - var addonConfig AddonConfig - templateWriter := &writers.LocalFSWriter{} - err := GenerateAddon(template.Addons, "azure", "webapp_routing", "fakeDest", addonConfig, templateWriter) - assert.NotNil(t, err, "should fail with fake destination") - - err = GenerateAddon(template.Addons, "azure", "fakeAddon", "../../test/templates/helm", addonConfig, templateWriter) - assert.NotNil(t, err, "should fail with fake addon name") - - err = GenerateAddon(template.Addons, "fakeProvider", "fakeAddon", "../../test/templates/helm", addonConfig, templateWriter) - assert.NotNil(t, err, "should fail with fake provider name") -} - -func TestGenerateHelmAddonSuccess(t *testing.T) { - templateWriter := &writers.LocalFSWriter{} - addonConfig := AddonConfig{ - DraftConfig: &config.DraftConfig{ - Variables: []*config.BuilderVar{ - { - Name: "ingress-tls-cert-keyvault-uri", - Value: "test.uri", - }, - { - Name: "ingress-use-osm-mtls", - Value: "false", - }, - { - Name: "ingress-host", - Value: "host", - }, - { - Name: "GENERATORLABEL", - Value: "draft", - }, - { - Name: "service-namespace", - Value: "test-namespace", - }, - { - Name: "service-name", - Value: "test-service", - }, - { - Name: "service-port", - Value: "80", - }, - }, - }, - } - dir, remove, err := setUpTempDir("helm") - assert.Nil(t, err) - - err = GenerateAddon(template.Addons, "azure", "webapp_routing", dir, addonConfig, templateWriter) - assert.Nil(t, err) - - // Validate generated content against the fixture - generatedFilePath := fmt.Sprintf("%s/charts/templates/ingress.yaml", dir) - generatedContent, err := os.ReadFile(generatedFilePath) - assert.Nil(t, err) - - fixturePath := "../fixtures/addons/helm/ingress.yaml" - if _, err := os.Stat(fixturePath); os.IsNotExist(err) { - t.Fatalf("Fixture file does not exist at path: %s", fixturePath) - } - - err = fixtures.ValidateContentAgainstFixture(generatedContent, fixturePath) - assert.Nil(t, err) - - assert.Nil(t, remove()) -} - -func TestGenerateKustomizeAddonSuccess(t *testing.T) { - templateWriter := &writers.LocalFSWriter{} - addonConfig := AddonConfig{ - DraftConfig: &config.DraftConfig{ - Variables: []*config.BuilderVar{ - { - Name: "ingress-tls-cert-keyvault-uri", - Value: "test.uri", - }, - { - Name: "ingress-use-osm-mtls", - Value: "false", - }, - { - Name: "ingress-host", - Value: "host", - }, - { - Name: "GENERATORLABEL", - Value: "draft", - }, - { - Name: "service-namespace", - Value: "test-namespace", - }, - { - Name: "service-name", - Value: "test-service", - }, - { - Name: "service-port", - Value: "80", - }, - }, - }, - } - dir, remove, err := setUpTempDir("kustomize") - assert.Nil(t, err) - - err = GenerateAddon(template.Addons, "azure", "webapp_routing", dir, addonConfig, templateWriter) - assert.Nil(t, err) - - // Validate generated content against the fixture - generatedFilePath := fmt.Sprintf("%s/overlays/production/ingress.yaml", dir) - generatedContent, err := os.ReadFile(generatedFilePath) - assert.Nil(t, err) - - fixturePath := "../fixtures/addons/kustomize/ingress.yaml" - if _, err := os.Stat(fixturePath); os.IsNotExist(err) { - t.Fatalf("Fixture file does not exist at path: %s", fixturePath) - } - - err = fixtures.ValidateContentAgainstFixture(generatedContent, fixturePath) - assert.Nil(t, err) - - assert.Nil(t, remove()) -} - -func TestNilDraftConfig(t *testing.T) { - templateWriter := &writers.LocalFSWriter{} - addonConfig := AddonConfig{} - dir, remove, err := setUpTempDir("helm") - assert.Nil(t, err) - - err = GenerateAddon(template.Addons, "azure", "webapp_routing", dir, addonConfig, templateWriter) - assert.NotNil(t, err, "should fail with nil DraftConfig") - assert.Equal(t, "DraftConfig is nil", err.Error()) - - err = PromptAddonValues(dir, &addonConfig) - assert.NotNil(t, err, "should fail with nil DraftConfig") - assert.Equal(t, "draftConfig is nil", err.Error()) - - assert.Nil(t, remove()) -} - -func setUpTempDir(deploy string) (dir string, close func() error, err error) { - templateWriter := &writers.LocalFSWriter{} - addonConfig := AddonConfig{ - DraftConfig: &config.DraftConfig{}, - } - dir, err = ioutil.TempDir("", "addonTest") - if err != nil { - return - } - close = func() error { - return os.RemoveAll(dir) - } - fs := os.DirFS(templatePath) - if err = osutil.CopyDir(fs, deploy, dir, addonConfig.DraftConfig, templateWriter); err != nil { - return - } - - return dir, close, err -} diff --git a/pkg/addons/addon_config.go b/pkg/cmdhelpers/addon_helpers.go similarity index 68% rename from pkg/addons/addon_config.go rename to pkg/cmdhelpers/addon_helpers.go index 2b13c78e..2221d0ba 100644 --- a/pkg/addons/addon_config.go +++ b/pkg/cmdhelpers/addon_helpers.go @@ -1,65 +1,77 @@ -package addons +package cmdhelpers import ( "errors" "fmt" - "path" "strings" + "github.com/Azure/draft/pkg/config" + "github.com/Azure/draft/pkg/consts" + "github.com/Azure/draft/pkg/filematches" + "github.com/Azure/draft/pkg/prompts" log "github.com/sirupsen/logrus" "helm.sh/helm/v3/pkg/chart/loader" + "sigs.k8s.io/kustomize/api/filesys" "sigs.k8s.io/kustomize/api/krusty" "sigs.k8s.io/kustomize/api/types" - "sigs.k8s.io/kustomize/kyaml/filesys" "sigs.k8s.io/kustomize/kyaml/yaml" - - "github.com/Azure/draft/pkg/config" - "github.com/Azure/draft/pkg/consts" - "github.com/Azure/draft/pkg/filematches" ) -// AddonConfig is a struct that extends the base DraftConfig to allow for the Referencing previously generated -// k8s objects. This allows an addon creator to reference pre-entered data from the deployment files. -type AddonConfig struct { - *config.DraftConfig `yaml:",inline"` - ReferenceComponents map[string][]referenceResource `yaml:"references"` - - deployType string -} - type referenceResource struct { Name string Path string } -type Reference interface { - GetReferenceVariables([]referenceResource) map[string]string +var ReferenceResources map[string][]referenceResource = map[string][]referenceResource{ + "service": { + {Name: "namespace", Path: "metadata.namespace"}, + {Name: "name", Path: "metadata.name"}, + {Name: "service-port", Path: "spec.ports.port"}, + }, } -func (ac *AddonConfig) getDeployType(dest string) (string, error) { - if ac.deployType != "" { - return ac.deployType, nil +func PromptAddonValues(dest string, addonConfig *config.DraftConfig) error { + err := prompts.RunPromptsFromConfigWithSkips(addonConfig) + if err != nil { + return err } - deploymentType, err := filematches.FindDraftDeploymentFiles(dest) - log.Debugf("found deployment type: %s", deploymentType) - return deploymentType, err -} + log.Debug("got user inputs") -func (ac *AddonConfig) GetAddonDestPath(dest string) (string, error) { - deployType, err := ac.getDeployType(dest) + deployType, err := getDeployType(dest) if err != nil { - return "", err + return err } - return path.Join(dest, consts.DeploymentFilePaths[deployType]), err -} -// GetReferenceValueMap extracts k8s object values into a mapping of template strings to k8s object value. -func (ac *AddonConfig) GetReferenceValueMap(dest string) (map[string]string, error) { - referenceMap := make(map[string]string) + referenceMap, err := GetReferenceValueMap(dest, deployType) + if err != nil { + return err + } + log.Debug("got reference map") + // merge maps + for refName, refVal := range referenceMap { + // check for key collision + if _, err := addonConfig.GetVariable(refName); err == nil { + return errors.New("variable name collision between references and DraftConfig") + } + if strings.Contains(strings.ToLower(refName), "namespace") && refVal == "" { + refVal = "default" //hack here to have explicit namespacing, probably a better way to do this + } + addonConfig.SetVariable(refName, refVal) + } - deployType, err := ac.getDeployType(dest) + return nil +} + +func getDeployType(dest string) (string, error) { + deploymentType, err := filematches.FindDraftDeploymentFiles(dest) + log.Debugf("found deployment type: %s", deploymentType) + return deploymentType, err +} - for referenceName, referenceResources := range ac.ReferenceComponents { +func GetReferenceValueMap(deployType, dest string) (map[string]string, error) { + referenceMap := make(map[string]string) + var err error + for referenceName, referenceResources := range ReferenceResources { switch deployType { case "helm": if err = extractHelmValuesToMap(referenceName, dest, referenceResources, referenceMap); err != nil { @@ -91,7 +103,7 @@ func extractHelmValuesToMap(referenceName, dest string, references []referenceRe for _, reference := range references { referenceMap[reference.Name] = strings.ReplaceAll( - consts.HelmReferencePathMapping[referenceName][reference.Path], "{{APPNAME}}", chart.Name()) + consts.HelmReferencePathMapping[referenceName][reference.Path], ".Config.GetVariableValue \"APPNAME\"", chart.Name()) } return nil @@ -125,7 +137,7 @@ func extractNativeRefMap(referenceNodes []*yaml.RNode, referenceName string, ref //hack for default namespace refStr = "default" } else if refStr == "" { - return errors.New(fmt.Sprintf("referenceResource %s not found", reference.Name)) + return fmt.Errorf("referenceResource %s not found", reference.Name) } referenceMap[reference.Name] = refStr diff --git a/pkg/cmdhelpers/addon_helpers_test.go b/pkg/cmdhelpers/addon_helpers_test.go new file mode 100644 index 00000000..7dfa6719 --- /dev/null +++ b/pkg/cmdhelpers/addon_helpers_test.go @@ -0,0 +1,75 @@ +package cmdhelpers + +import ( + "io/ioutil" + "os" + "testing" + + "github.com/Azure/draft/pkg/config" + "github.com/Azure/draft/pkg/handlers" + "github.com/Azure/draft/pkg/osutil" + "github.com/Azure/draft/pkg/templatewriter/writers" + "github.com/stretchr/testify/assert" +) + +const templatePath = "../../test/templates" + +func TestPromptAddonValues(t *testing.T) { + templateWriter := &writers.FileMapWriter{} + dir, remove, err := setUpTempDir("helm") + assert.Nil(t, err) + + ingressTemplate, err := handlers.GetTemplate("app-routing-ingress", "", dir, templateWriter) + assert.Nil(t, err) + assert.NotNil(t, ingressTemplate) + + ingressTemplate.Config.SetVariable("ingress-tls-cert-keyvault-uri", "test.keyvault.uri") + ingressTemplate.Config.SetVariable("ingress-use-osm-mtls", "false") + ingressTemplate.Config.SetVariable("ingress-host", "test.host") + ingressTemplate.Config.SetVariable("service-name", "test") + ingressTemplate.Config.SetVariable("service-namespace", "test") + ingressTemplate.Config.SetVariable("service-port", "80") + + err = PromptAddonValues(dir, ingressTemplate.Config) + assert.Nil(t, err) + assert.Nil(t, remove()) +} + +func TestGetHelmReferenceMap(t *testing.T) { + refMap := make(map[string]string) + err := extractHelmValuesToMap("service", "../../test/templates/helm", ReferenceResources["service"], refMap) + assert.Nil(t, err) + assert.NotEmpty(t, refMap) +} + +func TestGetKustomizeReferenceMap(t *testing.T) { + refMap := make(map[string]string) + err := extractKustomizeValuesToMap("service", "../../test/templates/kustomize", ReferenceResources["service"], refMap) + assert.Nil(t, err) + assert.NotEmpty(t, refMap) +} + +func TestGetManifestReferenceMap(t *testing.T) { + refMap := make(map[string]string) + err := extractManifestValuesToMap("service", "../../test/templates/manifests", ReferenceResources["service"], refMap) + assert.Nil(t, err) + assert.NotEmpty(t, refMap) +} + +func setUpTempDir(deploy string) (dir string, close func() error, err error) { + templateWriter := &writers.LocalFSWriter{} + draftconfig := &config.DraftConfig{} + dir, err = ioutil.TempDir("", "addonTest") + if err != nil { + return + } + close = func() error { + return os.RemoveAll(dir) + } + fs := os.DirFS(templatePath) + if err = osutil.CopyDir(fs, deploy, dir, draftconfig, templateWriter); err != nil { + return + } + + return dir, close, err +} diff --git a/pkg/fixtures/addons/helm/ingress.yaml b/pkg/fixtures/addons/ingress/ingress.yaml similarity index 100% rename from pkg/fixtures/addons/helm/ingress.yaml rename to pkg/fixtures/addons/ingress/ingress.yaml diff --git a/pkg/fixtures/addons/kustomize/ingress.yaml b/pkg/fixtures/addons/kustomize/ingress.yaml deleted file mode 100644 index b4d05333..00000000 --- a/pkg/fixtures/addons/kustomize/ingress.yaml +++ /dev/null @@ -1,33 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - annotations: - kubernetes.azure.com/tls-cert-keyvault-uri: "test.uri" - kubernetes.azure.com/use-osm-mtls: "false" - nginx.ingress.kubernetes.io/backend-protocol: HTTPS - nginx.ingress.kubernetes.io/configuration-snippet: |2- - - proxy_ssl_name "default.test-namespace.cluster.local"; - nginx.ingress.kubernetes.io/proxy-ssl-secret: kube-system/osm-ingress-client-cert - nginx.ingress.kubernetes.io/proxy-ssl-verify: "on" - name: "test-service" - namespace: "test-namespace" - labels: - kubernetes.azure.com/generator: draft -spec: - ingressClassName: webapprouting.kubernetes.azure.com - rules: - - host: "host" - http: - paths: - - backend: - service: - name: "test-service" - port: - number: 80 - path: / - pathType: Prefix - tls: - - hosts: - - "host" - secretName: "keyvault-test-service" \ No newline at end of file diff --git a/pkg/handlers/template_test.go b/pkg/handlers/template_test.go index c196cb33..472ea6d6 100644 --- a/pkg/handlers/template_test.go +++ b/pkg/handlers/template_test.go @@ -321,6 +321,22 @@ func TestTemplateHandlerValidation(t *testing.T) { "CLUSTERNAME": "testcluster", }, }, + { + name: "valid app-routing ingress", + templateName: "app-routing-ingress", + fixturesBaseDir: "../fixtures/addons/ingress", + version: "0.0.1", + dest: ".", + templateWriter: &writers.FileMapWriter{}, + varMap: map[string]string{ + "ingress-tls-cert-keyvault-uri": "test.uri", + "ingress-use-osm-mtls": "false", + "ingress-host": "host", + "service-name": "test-service", + "service-namespace": "test-namespace", + "service-port": "80", + }, + }, } for _, tt := range tests { diff --git a/template/addons/azure/webapp_routing/draft.yaml b/template/addons/azure/webapp_routing/draft.yaml index ec8e8bf7..56317b0c 100644 --- a/template/addons/azure/webapp_routing/draft.yaml +++ b/template/addons/azure/webapp_routing/draft.yaml @@ -1,19 +1,41 @@ templateName: "app-routing-ingress" description: "This template is used to create an ingress resource for use with the app-routing addon in AKS" +versions: "0.0.1" +defaultVersion: "0.0.1" type: "manifest" variables: - name: "ingress-tls-cert-keyvault-uri" type: "string" kind: "azureKeyvaultUri" description: "the keyvault uri for the tls certificate" + versions: ">=0.0.1" - name: "ingress-use-osm-mtls" description: "use open service mesh mutual-tls" type: "bool" kind: "flag" + versions: ">=0.0.1" - name: "ingress-host" type: "string" kind: "ingressHostName" description: "specify the host of the ingress resource" + versions: ">=0.0.1" + - name: "service-name" + type: "string" + kind: "kubernetesResourceName" + description: "specify the name of the service this points to" + versions: ">=0.0.1" + - name: "service-namespace" + type: "string" + kind: "kubernetesNamespace" + description: "specify the namespace for the ingress" + versions: ">=0.0.1" + - name: "service-port" + type: "int" + kind: "port" + default: + value: 80 + description: "the port exposed in the service" + versions: ">=0.0.1" - name: "GENERATORLABEL" type: "string" kind: "label" @@ -21,11 +43,4 @@ variables: disablePrompt: true value: "draft" description: "the label to identify who generated the resource" -references: - service: - - name: "service-name" - path: "metadata.name" - - name: "service-port" - path: "spec.ports.port" - - name: "service-namespace" - path: "metadata.namespace" + versions: ">=0.0.1" \ No newline at end of file diff --git a/template/addons/azure/webapp_routing/ingress.yaml b/template/addons/azure/webapp_routing/ingress.yaml index c230c138..83c92f3b 100644 --- a/template/addons/azure/webapp_routing/ingress.yaml +++ b/template/addons/azure/webapp_routing/ingress.yaml @@ -2,32 +2,32 @@ apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: - kubernetes.azure.com/tls-cert-keyvault-uri: "{{index . "ingress-tls-cert-keyvault-uri"}}" - kubernetes.azure.com/use-osm-mtls: "{{index . "ingress-use-osm-mtls"}}" + kubernetes.azure.com/tls-cert-keyvault-uri: "{{ .Config.GetVariableValue "ingress-tls-cert-keyvault-uri"}}" + kubernetes.azure.com/use-osm-mtls: "{{ .Config.GetVariableValue "ingress-use-osm-mtls"}}" nginx.ingress.kubernetes.io/backend-protocol: HTTPS nginx.ingress.kubernetes.io/configuration-snippet: |2- - proxy_ssl_name "default.{{index . "service-namespace"}}.cluster.local"; + proxy_ssl_name "default.{{ .Config.GetVariableValue "service-namespace"}}.cluster.local"; nginx.ingress.kubernetes.io/proxy-ssl-secret: kube-system/osm-ingress-client-cert nginx.ingress.kubernetes.io/proxy-ssl-verify: "on" - name: "{{index . "service-name"}}" - namespace: "{{index . "service-namespace"}}" + name: "{{ .Config.GetVariableValue "service-name"}}" + namespace: "{{ .Config.GetVariableValue "service-namespace"}}" labels: - kubernetes.azure.com/generator: {{.GENERATORLABEL}} + kubernetes.azure.com/generator: {{ .Config.GetVariableValue "GENERATORLABEL"}} spec: ingressClassName: webapprouting.kubernetes.azure.com rules: - - host: "{{index . "ingress-host"}}" + - host: "{{ .Config.GetVariableValue "ingress-host"}}" http: paths: - backend: service: - name: "{{index . "service-name"}}" + name: "{{ .Config.GetVariableValue "service-name"}}" port: - number: {{index . "service-port"}} + number: {{ .Config.GetVariableValue "service-port"}} path: / pathType: Prefix tls: - hosts: - - "{{index . "ingress-host"}}" - secretName: "keyvault-{{index . "service-name"}}" \ No newline at end of file + - "{{ .Config.GetVariableValue "ingress-host"}}" + secretName: "keyvault-{{ .Config.GetVariableValue "service-name"}}" \ No newline at end of file