Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Added multiple fixes to ZIA and ZPA resources #244

Merged
merged 7 commits into from
Jan 5, 2025
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
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,17 @@
# Changelog

## 1.3.6 (January, 5 2025)

### Notes

- Release date: **(January, 5 2025)**
- Supported Terraform version: **v1.x.x**

### Bug Fixes
- [PR #244](https://github.com/zscaler/zscaler-terraformer/pull/244). Fixed ZIA import resources for: `zia_dlp_web_rules` to exclude attributes `auditor`, `icap_server`, and `notification_template`, when not populated.
- [PR #244](https://github.com/zscaler/zscaler-terraformer/pull/244). Fixed ZIA import resources for: `zia_firewall_filtering_rule` to reformat the attribute values `dest_countries` and `source_countries` during HCL generation.
- [PR #244](https://github.com/zscaler/zscaler-terraformer/pull/244). Upgraded tool to GO SDK v2.74.2 to fix ZPA import resource `zpa_service_edge_group`.

## 1.3.5 (November, 7 2024)

### Notes
Expand Down
17 changes: 2 additions & 15 deletions cmd/generate.go
Original file line number Diff line number Diff line change
Expand Up @@ -1098,6 +1098,7 @@ func generate(cmd *cobra.Command, writer io.Writer, resourceType string) {
resourceCount = len(items)
m, _ := json.Marshal(items)
_ = json.Unmarshal(m, &jsonStructData)

case "zia_url_filtering_rules":
if api.ZIA == nil {
log.Fatal("ZIA client is not initialized")
Expand Down Expand Up @@ -1340,7 +1341,7 @@ func generate(cmd *cobra.Command, writer io.Writer, resourceType string) {
}
} else if resourceType == "zia_dlp_notification_templates" && helpers.IsInList(attrName, []string{"subject", "plain_text_message", "html_message"}) {
valueStr := strings.ReplaceAll(value.(string), "$", "$$")
formattedValue := formatHeredoc(valueStr)
formattedValue := helpers.FormatHeredoc(valueStr)
switch attrName {
case "html_message", "plain_text_message":
output += fmt.Sprintf(" %s = <<-EOT\n%sEOT\n\n", attrName, formattedValue)
Expand Down Expand Up @@ -1411,17 +1412,3 @@ func generate(cmd *cobra.Command, writer io.Writer, resourceType string) {

fmt.Fprint(writer, output)
}

func formatHeredoc(value string) string {
lines := strings.Split(value, "\n")
formatted := ""
for i, line := range lines {
trimmedLine := strings.TrimSpace(line)
if trimmedLine != "" {
formatted += fmt.Sprintf("%s\n", trimmedLine)
} else if i != len(lines)-1 {
formatted += "\n"
}
}
return formatted
}
14 changes: 13 additions & 1 deletion docs/guides/release-notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,22 @@ Track all Zscaler Terraformer Tool releases. New resources, features, and bug fi

---

``Last updated: v1.3.5``
``Last updated: v1.3.6``

---

## 1.3.6 (January, 5 2025)

### Notes

- Release date: **(January, 5 2025)**
- Supported Terraform version: **v1.x.x**

### Bug Fixes
- [PR #244](https://github.com/zscaler/zscaler-terraformer/pull/244). Fixed ZIA import resources for: `zia_dlp_web_rules` to exclude attributes `auditor`, `icap_server`, and `notification_template`, when not populated.
- [PR #244](https://github.com/zscaler/zscaler-terraformer/pull/244). Fixed ZIA import resources for: `zia_firewall_filtering_rule` to reformat the attribute values `dest_countries` and `source_countries` during HCL generation.
- [PR #244](https://github.com/zscaler/zscaler-terraformer/pull/244). Upgraded tool to GO SDK v2.74.2 to fix ZPA import resource `zpa_service_edge_group`.

## 1.3.5 (November, 7 2024)

### Notes
Expand Down
8 changes: 4 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ require (
github.com/google/uuid v1.6.0
github.com/hashicorp/hc-install v0.9.0
github.com/hashicorp/terraform-exec v0.21.0
github.com/hashicorp/terraform-json v0.24.0
github.com/hashicorp/terraform-json v0.23.0
github.com/iancoleman/strcase v0.3.0
github.com/sirupsen/logrus v1.9.3
github.com/spf13/cobra v1.8.1
github.com/spf13/viper v1.19.0
github.com/zclconf/go-cty v1.15.1
github.com/zscaler/zscaler-sdk-go/v2 v2.732.0
github.com/zclconf/go-cty v1.15.0
github.com/zscaler/zscaler-sdk-go/v2 v2.74.2
)

require (
Expand All @@ -33,7 +33,7 @@ require (
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/hashicorp/logutils v1.0.0 // indirect
github.com/hashicorp/terraform-plugin-log v0.9.0 // indirect
github.com/hashicorp/terraform-plugin-sdk/v2 v2.34.0 // indirect
github.com/hashicorp/terraform-plugin-sdk/v2 v2.35.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
Expand Down
23 changes: 12 additions & 11 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -61,14 +61,14 @@ github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
github.com/hashicorp/terraform-exec v0.21.0 h1:uNkLAe95ey5Uux6KJdua6+cv8asgILFVWkd/RG0D2XQ=
github.com/hashicorp/terraform-exec v0.21.0/go.mod h1:1PPeMYou+KDUSSeRE9szMZ/oHf4fYUmB923Wzbq1ICg=
github.com/hashicorp/terraform-json v0.24.0 h1:rUiyF+x1kYawXeRth6fKFm/MdfBS6+lW4NbeATsYz8Q=
github.com/hashicorp/terraform-json v0.24.0/go.mod h1:Nfj5ubo9xbu9uiAoZVBsNOjvNKB66Oyrvtit74kC7ow=
github.com/hashicorp/terraform-json v0.23.0 h1:sniCkExU4iKtTADReHzACkk8fnpQXrdD2xoR+lppBkI=
github.com/hashicorp/terraform-json v0.23.0/go.mod h1:MHdXbBAbSg0GvzuWazEGKAn/cyNfIB7mN6y7KJN6y2c=
github.com/hashicorp/terraform-plugin-log v0.9.0 h1:i7hOA+vdAItN1/7UrfBqBwvYPQ9TFvymaRGZED3FCV0=
github.com/hashicorp/terraform-plugin-log v0.9.0/go.mod h1:rKL8egZQ/eXSyDqzLUuwUYLVdlYeamldAHSxjUFADow=
github.com/hashicorp/terraform-plugin-sdk v1.17.2 h1:V7DUR3yBWFrVB9z3ddpY7kiYVSsq4NYR67NiTs93NQo=
github.com/hashicorp/terraform-plugin-sdk v1.17.2/go.mod h1:wkvldbraEMkz23NxkkAsFS88A1R9eUiooiaUZyS6TLw=
github.com/hashicorp/terraform-plugin-sdk/v2 v2.34.0 h1:kJiWGx2kiQVo97Y5IOGR4EMcZ8DtMswHhUuFibsCQQE=
github.com/hashicorp/terraform-plugin-sdk/v2 v2.34.0/go.mod h1:sl/UoabMc37HA6ICVMmGO+/0wofkVIRxf+BMb/dnoIg=
github.com/hashicorp/terraform-plugin-sdk/v2 v2.35.0 h1:wyKCCtn6pBBL46c1uIIBNUOWlNfYXfXpVo16iDyLp8Y=
github.com/hashicorp/terraform-plugin-sdk/v2 v2.35.0/go.mod h1:B0Al8NyYVr8Mp/KLwssKXG1RqnTk7FySqSn4fRuLNgw=
github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=
github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
Expand Down Expand Up @@ -137,16 +137,17 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=
github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
github.com/zclconf/go-cty v1.15.1 h1:RgQYm4j2EvoBRXOPxhUvxPzRrGDo1eCOhHXuGfrj5S0=
github.com/zclconf/go-cty v1.15.1/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE=
github.com/zscaler/zscaler-sdk-go/v2 v2.732.0 h1:oyESzPJJswG9dTSH0VcCeZH1ebYUmhIOKeTQg0sLu+w=
github.com/zscaler/zscaler-sdk-go/v2 v2.732.0/go.mod h1:ugDudbyESUrANGw74moJypgVnWuOyLm8NyIJgfUzNNo=
github.com/zclconf/go-cty v1.15.0 h1:tTCRWxsexYUmtt/wVxgDClUe+uQusuI443uL6e+5sXQ=
github.com/zclconf/go-cty v1.15.0/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE=
github.com/zscaler/zscaler-sdk-go/v2 v2.74.2 h1:akUaVrnqLNWFBx5GK++PirbPJTdm/6jiAh4qm5fdTqI=
github.com/zscaler/zscaler-sdk-go/v2 v2.74.2/go.mod h1:4ZS4vlk8HKciHYJ6n1vnN2xXus5ir388p7K3VJSRkL8=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
Expand All @@ -155,8 +156,8 @@ golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUF
golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc=
golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
Expand Down
31 changes: 25 additions & 6 deletions teraformutils/helpers/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,21 +43,26 @@ func IsInList(item string, list []string) bool {

// TypeSetBlock generates HCL for TypeSet attributes like notification_template, auditor, icap_server.
func TypeSetBlock(blockName string, blockData interface{}) string {
output := blockName + " {\n"
output := ""

switch blockData := blockData.(type) {
case map[string]interface{}:
if id, ok := blockData["id"].(float64); ok {
output += fmt.Sprintf("id = %d\n", int64(id))
// Check if the ID exists and is valid
if id, ok := blockData["id"].(float64); ok && id != 0 {
output += fmt.Sprintf("%s {\n id = %d\n}\n", blockName, int64(id))
}
case []interface{}:
// If it's an array, process each item.
// Process each item in the array
for _, item := range blockData {
if itemMap, ok := item.(map[string]interface{}); ok {
output += TypeSetBlock(blockName, itemMap)
nestedBlock := TypeSetBlock(blockName, itemMap)
if nestedBlock != "" {
output += nestedBlock
}
}
}
}
output += "}\n"

return output
}

Expand Down Expand Up @@ -395,3 +400,17 @@ func HandleZIAError(responseBody []byte) (bool, string) {
}
return false, ""
}

func FormatHeredoc(value string) string {
lines := strings.Split(value, "\n")
formatted := ""
for i, line := range lines {
trimmedLine := strings.TrimSpace(line)
if trimmedLine != "" {
formatted += fmt.Sprintf("%s\n", trimmedLine)
} else if i != len(lines)-1 {
formatted += "\n"
}
}
return formatted
}
36 changes: 34 additions & 2 deletions teraformutils/nesting/nesting.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,10 @@ func NestBlocks(resourceType string, schemaBlock *tfjson.SchemaBlock, structData
if helpers.IsInList(resourceType, []string{"zia_dlp_web_rules"}) && helpers.IsInList(block, []string{
"notification_template", "auditor", "icap_server",
}) {
// Use the new TypeSetBlock helper.
output += helpers.TypeSetBlock(block, structData[apiBlock])
blockOutput := helpers.TypeSetBlock(block, structData[apiBlock])
if blockOutput != "" {
output += blockOutput
}
continue
}

Expand Down Expand Up @@ -384,6 +386,27 @@ func WriteAttrLine(key string, value interface{}, usedInBlock bool) string {
return ""
}

// Handle `dest_countries` and `source_countries` for `zia_firewall_filtering_rule`
if helpers.IsInList(key, []string{"dest_countries", "source_countries"}) {
if countryList, ok := value.([]string); ok {
// Strip the "COUNTRY_" prefix
for i, country := range countryList {
countryList[i] = strings.TrimPrefix(country, "COUNTRY_")
}
return fmt.Sprintf("%s = [%s]\n", key, formatList(countryList))
}
}

// Handle multiline strings with Heredoc
if strValue, ok := value.(string); ok {
if strings.Contains(strValue, "\n") {
// Use your existing formatHeredoc function
return fmt.Sprintf("%s = <<EOT\n%sEOT\n", key, helpers.FormatHeredoc(strValue))
}
// Use standard string formatting for single-line strings
return fmt.Sprintf("%s = %q\n", key, strValue)
}

if key == "id" {
// Attempt to convert the value to an integer if it's a float.
if floatValue, ok := value.(float64); ok {
Expand Down Expand Up @@ -525,3 +548,12 @@ func MapTfFieldNameToAPI(resourceType, fieldName string) string {
result := strcase.ToLowerCamel(fieldName)
return result
}

// Helper function to format a list of strings for HCL.
func formatList(items []string) string {
quotedItems := make([]string, len(items))
for i, item := range items {
quotedItems[i] = fmt.Sprintf("%q", item)
}
return strings.Join(quotedItems, ", ")
}
Loading