providers/panos/panorama_objects.go (245 lines of code) (raw):
// Copyright 2018 The Terraformer Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package panos
import (
"github.com/GoogleCloudPlatform/terraformer/terraformutils"
"github.com/PaloAltoNetworks/pango"
)
type PanoramaObjectsGenerator struct {
PanosService
}
func (g *PanoramaObjectsGenerator) createResourcesFromList(o getGeneric, dg string, terraformResourceName string) (resources []terraformutils.Resource) {
l, err := o.i.(getListWithOneArg).GetList(o.params[0])
if err != nil || len(l) == 0 {
return []terraformutils.Resource{}
}
for _, r := range l {
id := dg + ":" + r
resources = append(resources, terraformutils.NewResource(
id,
normalizeResourceName(id),
terraformResourceName,
"panos",
map[string]string{
"device_group": dg,
},
[]string{},
map[string]interface{}{},
))
}
return resources
}
func (g *PanoramaObjectsGenerator) createAddressGroupResources(dg string) []terraformutils.Resource {
return g.createResourcesFromList(
getGeneric{g.client.(*pango.Panorama).Objects.AddressGroup, []string{dg}},
dg, "panos_panorama_address_group",
)
}
func (g *PanoramaObjectsGenerator) createAdministrativeTagResources(dg string) []terraformutils.Resource {
return g.createResourcesFromList(
getGeneric{g.client.(*pango.Panorama).Objects.Tags, []string{dg}},
dg, "panos_panorama_administrative_tag",
)
}
func (g *PanoramaObjectsGenerator) createApplicationGroupResources(dg string) []terraformutils.Resource {
return g.createResourcesFromList(
getGeneric{g.client.(*pango.Panorama).Objects.AppGroup, []string{dg}},
dg, "panos_panorama_application_group",
)
}
func (g *PanoramaObjectsGenerator) createApplicationObjectResources(dg string) (resources []terraformutils.Resource) {
l, err := g.client.(*pango.Panorama).Objects.Application.GetList(dg)
if err != nil {
return []terraformutils.Resource{}
}
for _, r := range l {
id := dg + ":" + r
resources = append(resources, terraformutils.NewSimpleResource(
id,
normalizeResourceName(id),
"panos_panorama_application_object",
"panos",
[]string{},
))
// TODO
// resources = append(resources, g.createApplicationSignatureResources(dg, r)...)
}
return resources
}
func (g *PanoramaObjectsGenerator) createEDLResources(dg string) []terraformutils.Resource {
return g.createResourcesFromList(
getGeneric{g.client.(*pango.Panorama).Objects.Edl, []string{dg}},
dg, "panos_panorama_edl",
)
}
func (g *PanoramaObjectsGenerator) createLogForwardingResources(dg string) []terraformutils.Resource {
return g.createResourcesFromList(
getGeneric{g.client.(*pango.Panorama).Objects.LogForwardingProfile, []string{dg}},
dg, "panos_panorama_log_forwarding_profile",
)
}
func (g *PanoramaObjectsGenerator) createServiceGroupResources(dg string) []terraformutils.Resource {
return g.createResourcesFromList(
getGeneric{g.client.(*pango.Panorama).Objects.ServiceGroup, []string{dg}},
dg, "panos_panorama_service_group",
)
}
func (g *PanoramaObjectsGenerator) createServiceObjectResources(dg string) []terraformutils.Resource {
return g.createResourcesFromList(
getGeneric{g.client.(*pango.Panorama).Objects.Services, []string{dg}},
dg, "panos_panorama_service_object",
)
}
func (g *PanoramaObjectsGenerator) createAddressObjectResources(dg string) []terraformutils.Resource {
return g.createResourcesFromList(
getGeneric{g.client.(*pango.Panorama).Objects.Address, []string{dg}},
dg, "panos_address_object",
)
}
func (g *PanoramaObjectsGenerator) createAntiSpywareSecurityProfileResources(dg string) []terraformutils.Resource {
return g.createResourcesFromList(
getGeneric{g.client.(*pango.Panorama).Objects.AntiSpywareProfile, []string{dg}},
dg, "panos_anti_spyware_security_profile",
)
}
func (g *PanoramaObjectsGenerator) createAntivirusSecurityProfileResources(dg string) []terraformutils.Resource {
return g.createResourcesFromList(
getGeneric{g.client.(*pango.Panorama).Objects.AntivirusProfile, []string{dg}},
dg, "panos_antivirus_security_profile",
)
}
func (g *PanoramaObjectsGenerator) createCustomDataPatternObjectResources(dg string) []terraformutils.Resource {
return g.createResourcesFromList(
getGeneric{g.client.(*pango.Panorama).Objects.DataPattern, []string{dg}},
dg, "panos_custom_data_pattern_object",
)
}
func (g *PanoramaObjectsGenerator) createDataFilteringSecurityProfileResources(dg string) []terraformutils.Resource {
return g.createResourcesFromList(
getGeneric{g.client.(*pango.Panorama).Objects.DataFilteringProfile, []string{dg}},
dg, "panos_data_filtering_security_profile",
)
}
func (g *PanoramaObjectsGenerator) createDOSProtectionProfileResources(dg string) []terraformutils.Resource {
return g.createResourcesFromList(
getGeneric{g.client.(*pango.Panorama).Objects.DosProtectionProfile, []string{dg}},
dg, "panos_dos_protection_profile",
)
}
func (g *PanoramaObjectsGenerator) createDynamicUserGroupResources(dg string) []terraformutils.Resource {
return g.createResourcesFromList(
getGeneric{g.client.(*pango.Panorama).Objects.DynamicUserGroup, []string{dg}},
dg, "panos_dynamic_user_group",
)
}
func (g *PanoramaObjectsGenerator) createFileBlockingSecurityProfileResources(dg string) []terraformutils.Resource {
return g.createResourcesFromList(
getGeneric{g.client.(*pango.Panorama).Objects.FileBlockingProfile, []string{dg}},
dg, "panos_file_blocking_security_profile",
)
}
func (g *PanoramaObjectsGenerator) createURLFilteringSecurityProfileResources(dg string) []terraformutils.Resource {
return g.createResourcesFromList(
getGeneric{g.client.(*pango.Panorama).Objects.UrlFilteringProfile, []string{dg}},
dg, "panos_url_filtering_security_profile",
)
}
func (g *PanoramaObjectsGenerator) createVulnerabilitySecurityProfileResources(dg string) []terraformutils.Resource {
return g.createResourcesFromList(
getGeneric{g.client.(*pango.Panorama).Objects.VulnerabilityProfile, []string{dg}},
dg, "panos_vulnerability_security_profile",
)
}
func (g *PanoramaObjectsGenerator) createWildfireAnalysisSecurityProfileResources(dg string) []terraformutils.Resource {
return g.createResourcesFromList(
getGeneric{g.client.(*pango.Panorama).Objects.WildfireAnalysisProfile, []string{dg}},
dg, "panos_wildfire_analysis_security_profile",
)
}
func (g *PanoramaObjectsGenerator) InitResources() error {
if err := g.Initialize(); err != nil {
return err
}
dg, err := g.client.(*pango.Panorama).Panorama.DeviceGroup.GetList()
if err != nil {
return err
}
for _, v := range dg {
g.Resources = append(g.Resources, g.createAddressGroupResources(v)...)
g.Resources = append(g.Resources, g.createAdministrativeTagResources(v)...)
g.Resources = append(g.Resources, g.createApplicationGroupResources(v)...)
g.Resources = append(g.Resources, g.createApplicationObjectResources(v)...)
g.Resources = append(g.Resources, g.createEDLResources(v)...)
g.Resources = append(g.Resources, g.createLogForwardingResources(v)...)
g.Resources = append(g.Resources, g.createServiceGroupResources(v)...)
g.Resources = append(g.Resources, g.createServiceObjectResources(v)...)
g.Resources = append(g.Resources, g.createAddressObjectResources(v)...)
g.Resources = append(g.Resources, g.createAntiSpywareSecurityProfileResources(v)...)
g.Resources = append(g.Resources, g.createAntivirusSecurityProfileResources(v)...)
g.Resources = append(g.Resources, g.createCustomDataPatternObjectResources(v)...)
g.Resources = append(g.Resources, g.createDataFilteringSecurityProfileResources(v)...)
g.Resources = append(g.Resources, g.createDOSProtectionProfileResources(v)...)
g.Resources = append(g.Resources, g.createDynamicUserGroupResources(v)...)
g.Resources = append(g.Resources, g.createFileBlockingSecurityProfileResources(v)...)
g.Resources = append(g.Resources, g.createURLFilteringSecurityProfileResources(v)...)
g.Resources = append(g.Resources, g.createVulnerabilitySecurityProfileResources(v)...)
g.Resources = append(g.Resources, g.createWildfireAnalysisSecurityProfileResources(v)...)
}
return nil
}
func (g *PanoramaObjectsGenerator) PostConvertHook() error {
mapAddressObjectIDs := map[string]string{}
mapApplicationObjectIDs := map[string]string{}
mapServiceObjectIDs := map[string]string{}
for _, r := range g.Resources {
if _, ok := r.Item["name"]; ok {
if r.InstanceInfo.Type == "panos_address_object" {
mapAddressObjectIDs[r.Item["name"].(string)] = "${" + r.InstanceInfo.Type + "." + r.ResourceName + ".name}"
}
if r.InstanceInfo.Type == "panos_panorama_application_object" {
mapApplicationObjectIDs[r.Item["name"].(string)] = "${" + r.InstanceInfo.Type + "." + r.ResourceName + ".name}"
}
if r.InstanceInfo.Type == "panos_panorama_service_object" {
mapServiceObjectIDs[r.Item["name"].(string)] = "${" + r.InstanceInfo.Type + "." + r.ResourceName + ".name}"
}
}
}
for _, r := range g.Resources {
if r.InstanceInfo.Type == "panos_panorama_address_group" {
if _, ok := r.Item["static_addresses"]; ok {
staticAddresses := make([]string, len(r.Item["static_addresses"].([]interface{})))
for k, staticAddress := range r.Item["static_addresses"].([]interface{}) {
if _, ok2 := mapAddressObjectIDs[staticAddress.(string)]; ok2 {
staticAddresses[k] = mapAddressObjectIDs[staticAddress.(string)]
continue
}
staticAddresses[k] = staticAddress.(string)
}
r.Item["static_addresses"] = staticAddresses
}
}
if r.InstanceInfo.Type == "panos_panorama_application_group" {
if _, ok := r.Item["applications"]; ok {
applications := make([]string, len(r.Item["applications"].([]interface{})))
for k, application := range r.Item["applications"].([]interface{}) {
if _, ok2 := mapApplicationObjectIDs[application.(string)]; ok2 {
applications[k] = mapApplicationObjectIDs[application.(string)]
continue
}
applications[k] = application.(string)
}
r.Item["applications"] = applications
}
}
if r.InstanceInfo.Type == "panos_panorama_service_group" {
if _, ok := r.Item["services"]; ok {
services := make([]string, len(r.Item["services"].([]interface{})))
for k, service := range r.Item["services"].([]interface{}) {
if _, ok2 := mapServiceObjectIDs[service.(string)]; ok2 {
services[k] = mapServiceObjectIDs[service.(string)]
continue
}
services[k] = service.(string)
}
r.Item["services"] = services
}
}
}
return nil
}