Skip to content

Commit ba836d2

Browse files
committed
Implementation of Delete() for entry and uuid-style lists
1 parent 3164603 commit ba836d2

File tree

3 files changed

+125
-11
lines changed

3 files changed

+125
-11
lines changed

pkg/translate/terraform_provider/funcs.go

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1967,29 +1967,59 @@ func ResourceUpdateFunction(resourceTyp properties.ResourceType, names *NameProv
19671967
return processTemplate(tmpl, "resource-update-function", data, funcMap)
19681968
}
19691969

1970-
func ResourceDeleteFunction(resourceTyp properties.ResourceType, structName string, serviceName string, paramSpec *properties.Normalization, resourceSDKName string) (string, error) {
1970+
func ResourceDeleteFunction(resourceTyp properties.ResourceType, names *NameProvider, serviceName string, paramSpec *properties.Normalization, resourceSDKName string) (string, error) {
19711971
if strings.Contains(serviceName, "group") {
19721972
serviceName = "group"
19731973
}
19741974

1975+
var tmpl string
1976+
var listAttribute string
1977+
var exhaustive bool
1978+
switch resourceTyp {
1979+
case properties.ResourceEntry:
1980+
tmpl = resourceDeleteFunction
1981+
case properties.ResourceEntryPlural:
1982+
tmpl = resourceDeleteManyFunction
1983+
listAttribute = pascalCase(paramSpec.TerraformProviderConfig.PluralName)
1984+
case properties.ResourceUuid:
1985+
tmpl = resourceDeleteManyFunction
1986+
listAttribute = pascalCase(paramSpec.TerraformProviderConfig.PluralName)
1987+
exhaustive = true
1988+
case properties.ResourceUuidPlural:
1989+
tmpl = resourceDeleteManyFunction
1990+
listAttribute = pascalCase(paramSpec.TerraformProviderConfig.PluralName)
1991+
}
1992+
1993+
listAttributeVariant := &properties.NameVariant{
1994+
Underscore: naming.Underscore("", listAttribute, ""),
1995+
CamelCase: naming.CamelCase("", listAttribute, "", true),
1996+
LowerCamelCase: naming.CamelCase("", listAttribute, "", false),
1997+
}
1998+
1999+
var resourceIsMap bool
2000+
if resourceTyp == properties.ResourceEntryPlural {
2001+
resourceIsMap = true
2002+
}
2003+
19752004
data := map[string]interface{}{
19762005
"HasEncryptedResources": paramSpec.HasEncryptedResources(),
2006+
"ResourceIsMap": resourceIsMap,
19772007
"EntryOrConfig": paramSpec.EntryOrConfig(),
2008+
"ListAttribute": listAttributeVariant,
2009+
"Exhaustive": exhaustive,
19782010
"HasEntryName": paramSpec.HasEntryName(),
1979-
"structName": structName,
2011+
"structName": names.ResourceStructName,
19802012
"serviceName": naming.CamelCase("", serviceName, "", false),
19812013
"resourceSDKName": resourceSDKName,
19822014
}
19832015

1984-
var tmpl string
1985-
switch resourceTyp {
1986-
case properties.ResourceEntry:
1987-
tmpl = resourceDeleteFunction
1988-
case properties.ResourceUuid, properties.ResourceUuidPlural:
1989-
tmpl = resourceDeleteManyFunction
2016+
funcMap := template.FuncMap{
2017+
"RenderLocationsStateToPango": func(source string, dest string) (string, error) {
2018+
return RenderLocationsStateToPango(names, paramSpec, source, dest)
2019+
},
19902020
}
19912021

1992-
return processTemplate(tmpl, "resource-delete-function", data, nil)
2022+
return processTemplate(tmpl, "resource-delete-function", data, funcMap)
19932023
}
19942024

19952025
func ConfigEntry(entryName string, param *properties.SpecParam) (string, error) {

pkg/translate/terraform_provider/template.go

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1250,6 +1250,13 @@ findMatchingStateEntry := func(entry *{{ $resourceSDKStructName }}) (*{{ $resour
12501250
if found == nil {
12511251
return nil, false
12521252
}
1253+
1254+
// If matched entry already exists in the plan, this is not a rename
1255+
// but adding a missing entry.
1256+
if _, ok := planEntriesByName[found.Name]; ok {
1257+
return nil, false
1258+
}
1259+
12531260
return found, true
12541261
}
12551262
@@ -1592,7 +1599,84 @@ const resourceUpdateFunction = `
15921599
resp.Diagnostics.Append(resp.State.Set(ctx, &state)...)
15931600
`
15941601

1595-
const resourceDeleteManyFunction = ``
1602+
const resourceDeleteManyFunction = `
1603+
{{ $resourceSDKStructName := printf "%s.%s" .resourceSDKName .EntryOrConfig }}
1604+
{{ $resourceTFStructName := printf "%s%sObject" .structName .ListAttribute.CamelCase }}
1605+
1606+
var state {{ .structName }}Model
1607+
resp.Diagnostics.Append(req.State.Get(ctx, &state)...)
1608+
if resp.Diagnostics.HasError() {
1609+
return
1610+
}
1611+
1612+
// Basic logging.
1613+
tflog.Info(ctx, "performing resource delete", map[string]any{
1614+
"resource_name": "panos_{{ UnderscoreName .structName }}",
1615+
"function": "Delete",
1616+
})
1617+
1618+
{{- if .ResourceIsMap }}
1619+
elements := make(map[string]{{ $resourceTFStructName }}, len(state.{{ .ListAttribute.CamelCase }}.Elements()))
1620+
state.{{ .ListAttribute.CamelCase }}.ElementsAs(ctx, &elements, false)
1621+
{{- else }}
1622+
var elements []{{ $resourceTFStructName }}
1623+
state.{{ .ListAttribute.CamelCase }}.ElementsAs(ctx, &elements, false)
1624+
{{- end }}
1625+
1626+
var location {{ .resourceSDKName }}.Location
1627+
{{ RenderLocationsStateToPango "state.Location" "location" }}
1628+
1629+
updates := xmlapi.NewMultiConfig(len(elements))
1630+
1631+
{{- if .Exhausitive }}
1632+
existing, err := svc.List(ctx, location, "get", "", "")
1633+
if err != nil {
1634+
resp.Diagnostics.AddError("sdk error while listing entries", err.Error())
1635+
}
1636+
for _, elt := range existing {
1637+
path, err := location.XpathWithEntryName(r.client.Versioning(), elt.Name)
1638+
if err != nil {
1639+
resp.Diagnostics.AddError("sdk error while creating xpath", err.Error())
1640+
}
1641+
updates.Add(&xmlapi.Config{
1642+
Action: "delete",
1643+
Xpath: util.AsXpath(path),
1644+
Target: r.client.GetTarget(),
1645+
})
1646+
}
1647+
{{- else if .ResourceIsMap }}
1648+
for name, _ := range elements {
1649+
path, err := location.XpathWithEntryName(r.client.Versioning(), name)
1650+
if err != nil {
1651+
resp.Diagnostics.AddError("sdk error while creating xpath", err.Error())
1652+
}
1653+
updates.Add(&xmlapi.Config{
1654+
Action: "delete",
1655+
Xpath: util.AsXpath(path),
1656+
Target: r.client.GetTarget(),
1657+
})
1658+
}
1659+
{{- else }}
1660+
for _, elt := range elements {
1661+
path, err := location.XpathWithEntryName(r.client.Versioning(), elt.Name.ValueString())
1662+
if err != nil {
1663+
resp.Diagnostics.AddError("sdk error while creating xpath", err.Error())
1664+
}
1665+
updates.Add(&xmlapi.Config{
1666+
Action: "delete",
1667+
Xpath: util.AsXpath(path),
1668+
Target: r.client.GetTarget(),
1669+
})
1670+
}
1671+
{{- end }}
1672+
1673+
if len(updates.Operations) > 0 {
1674+
if _, _, _, err := r.client.MultiConfig(ctx, updates, false, nil); err != nil {
1675+
resp.Diagnostics.AddError("error updating entries", err.Error())
1676+
return
1677+
}
1678+
}
1679+
`
15961680

15971681
const resourceDeleteFunction = `
15981682
var state {{ .structName }}Model

pkg/translate/terraform_provider/terraform_provider_file.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ func (g *GenerateTerraformProvider) GenerateTerraformResource(resourceTyp proper
143143
return ResourceUpdateFunction(resourceTyp, names, serviceName, spec, names.PackageName)
144144
},
145145
"ResourceDeleteFunction": func(structName string, serviceName string) (string, error) {
146-
return ResourceDeleteFunction(resourceTyp, structName, serviceName, spec, names.PackageName)
146+
return ResourceDeleteFunction(resourceTyp, names, serviceName, spec, names.PackageName)
147147
},
148148
"ParamToModelResource": ParamToModelResource,
149149
"ModelNestedStruct": ModelNestedStruct,

0 commit comments

Comments
 (0)