github.com/GoogleCloudPlatform/terraformer@v0.8.18/providers/panos/panorama_device_config.go (about) 1 // Copyright 2018 The Terraformer Authors. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package panos 16 17 import ( 18 "fmt" 19 20 "github.com/GoogleCloudPlatform/terraformer/terraformutils" 21 "github.com/PaloAltoNetworks/pango" 22 "github.com/PaloAltoNetworks/pango/util" 23 ) 24 25 type PanoramaDeviceConfigGenerator struct { 26 PanosService 27 } 28 29 func (g *PanoramaDeviceConfigGenerator) createResourcesFromList(o getGeneric, idPrefix string, useIDForResourceName bool, terraformResourceName string) (resources []terraformutils.Resource) { 30 var l []string 31 var err error 32 33 switch f := o.i.(type) { 34 case getListWithoutArg: 35 l, err = f.GetList() 36 case getListWithTwoArgs: 37 l, err = f.GetList(o.params[0], o.params[1]) 38 default: 39 err = fmt.Errorf("not supported") 40 } 41 if err != nil || len(l) == 0 { 42 return []terraformutils.Resource{} 43 } 44 45 for _, r := range l { 46 id := idPrefix + r 47 resources = append(resources, terraformutils.NewSimpleResource( 48 id, 49 normalizeResourceName(func() string { 50 if useIDForResourceName { 51 return id 52 } 53 54 return r 55 }()), 56 terraformResourceName, 57 "panos", 58 []string{}, 59 )) 60 } 61 62 return resources 63 } 64 65 func (g *PanoramaDeviceConfigGenerator) createDeviceGroupResources() []terraformutils.Resource { 66 return g.createResourcesFromList(getGeneric{g.client.(*pango.Panorama).Panorama.DeviceGroup, []string{}}, 67 "", false, "panos_panorama_device_group", 68 ) 69 } 70 71 func (g *PanoramaDeviceConfigGenerator) createDeviceGroupParentResources() (resources []terraformutils.Resource) { 72 p, err := g.client.(*pango.Panorama).Panorama.DeviceGroup.GetParents() 73 if err != nil { 74 return resources 75 } 76 77 for dg, parent := range p { 78 if parent != "" { 79 resources = append(resources, terraformutils.NewResource( 80 dg, 81 normalizeResourceName(dg), 82 "panos_device_group_parent", 83 "panos", 84 map[string]string{ 85 "device_group": dg, 86 "parent": parent, 87 }, 88 []string{}, 89 map[string]interface{}{}, 90 )) 91 } 92 } 93 94 return resources 95 } 96 97 func createAttributes(tmpl, ts, dg string) map[string]string { 98 attributes := make(map[string]string) 99 100 if tmpl != "" { 101 attributes["template"] = tmpl 102 } 103 if ts != "" { 104 attributes["template_stack"] = ts 105 } 106 if dg != "" { 107 attributes["device_group"] = dg 108 } 109 110 return attributes 111 } 112 113 func createServerProfileResources(tmpl, ts, vsys, dg, terraformResourceName string, l []string) (resources []terraformutils.Resource) { 114 attributes := createAttributes(tmpl, ts, dg) 115 116 for _, r := range l { 117 id := tmpl + ":" + ts + ":" + vsys + ":" + dg + ":" + r 118 resources = append(resources, terraformutils.NewResource( 119 id, 120 normalizeResourceName(id), 121 terraformResourceName, 122 "panos", 123 attributes, 124 []string{}, 125 map[string]interface{}{}, 126 )) 127 } 128 129 return resources 130 } 131 132 func (g *PanoramaDeviceConfigGenerator) createEmailServerProfileResources(tmpl, ts, vsys, dg string) (resources []terraformutils.Resource) { 133 l := make([]string, 0) 134 var err error 135 136 if tmpl != "" || ts != "" { 137 l, err = g.client.(*pango.Panorama).Device.EmailServerProfile.GetList(tmpl, ts, vsys) 138 } 139 if dg != "" { 140 ans := make([]string, 0, 7) 141 ans = append(ans, util.DeviceGroupXpathPrefix(dg)...) 142 ans = append(ans, []string{"log-settings", "email"}...) 143 l, err = g.client.(util.XapiClient).EntryListUsing(g.client.(util.XapiClient).Get, ans) 144 } 145 146 if err != nil || len(l) == 0 { 147 return resources 148 } 149 150 return createServerProfileResources(tmpl, ts, vsys, dg, "panos_panorama_email_server_profile", l) 151 } 152 153 func (g *PanoramaDeviceConfigGenerator) createHTTPServerProfileResources(tmpl, ts, vsys, dg string) (resources []terraformutils.Resource) { 154 l := make([]string, 0) 155 var err error 156 157 if tmpl != "" || ts != "" { 158 l, err = g.client.(*pango.Panorama).Device.HttpServerProfile.GetList(tmpl, ts, vsys) 159 } 160 if dg != "" { 161 ans := make([]string, 0, 7) 162 ans = append(ans, util.DeviceGroupXpathPrefix(dg)...) 163 ans = append(ans, []string{"log-settings", "http"}...) 164 l, err = g.client.(util.XapiClient).EntryListUsing(g.client.(util.XapiClient).Get, ans) 165 } 166 167 if err != nil || len(l) == 0 { 168 return resources 169 } 170 171 return createServerProfileResources(tmpl, ts, vsys, dg, "panos_panorama_http_server_profile", l) 172 } 173 174 func (g *PanoramaDeviceConfigGenerator) createSNMPTrapServerProfileResources(tmpl, ts, vsys, dg string) (resources []terraformutils.Resource) { 175 l := make([]string, 0) 176 var err error 177 178 if tmpl != "" || ts != "" { 179 l, err = g.client.(*pango.Panorama).Device.SnmpServerProfile.GetList(tmpl, ts, vsys) 180 } 181 if dg != "" { 182 ans := make([]string, 0, 7) 183 ans = append(ans, util.DeviceGroupXpathPrefix(dg)...) 184 ans = append(ans, []string{"log-settings", "snmptrap"}...) 185 l, err = g.client.(util.XapiClient).EntryListUsing(g.client.(util.XapiClient).Get, ans) 186 } 187 188 if err != nil || len(l) == 0 { 189 return resources 190 } 191 192 return createServerProfileResources(tmpl, ts, vsys, dg, "panos_panorama_snmptrap_server_profile", l) 193 } 194 195 func (g *PanoramaDeviceConfigGenerator) createSyslogServerProfileResources(tmpl, ts, vsys, dg string) (resources []terraformutils.Resource) { 196 l := make([]string, 0) 197 var err error 198 199 if tmpl != "" || ts != "" { 200 l, err = g.client.(*pango.Panorama).Device.SyslogServerProfile.GetList(tmpl, ts, vsys) 201 } 202 if dg != "" { 203 ans := make([]string, 0, 7) 204 ans = append(ans, util.DeviceGroupXpathPrefix(dg)...) 205 ans = append(ans, []string{"log-settings", "syslog"}...) 206 l, err = g.client.(util.XapiClient).EntryListUsing(g.client.(util.XapiClient).Get, ans) 207 } 208 209 if err != nil || len(l) == 0 { 210 return resources 211 } 212 213 return createServerProfileResources(tmpl, ts, vsys, dg, "panos_panorama_syslog_server_profile", l) 214 } 215 216 func (g *PanoramaDeviceConfigGenerator) createTemplateResources() []terraformutils.Resource { 217 return g.createResourcesFromList(getGeneric{g.client.(*pango.Panorama).Panorama.Template, []string{}}, 218 "", false, "panos_panorama_template", 219 ) 220 } 221 222 func (g *PanoramaDeviceConfigGenerator) createTemplateStackResources() []terraformutils.Resource { 223 return g.createResourcesFromList(getGeneric{g.client.(*pango.Panorama).Panorama.TemplateStack, []string{}}, 224 "", false, "panos_panorama_template_stack", 225 ) 226 } 227 228 func (g *PanoramaDeviceConfigGenerator) createTemplateVariableResources(tmpl, ts string) []terraformutils.Resource { 229 return g.createResourcesFromList(getGeneric{g.client.(*pango.Panorama).Panorama.TemplateVariable, []string{tmpl, ts}}, 230 tmpl+":"+ts+":", true, "panos_panorama_template_variable", 231 ) 232 } 233 234 func (g *PanoramaDeviceConfigGenerator) InitResources() error { 235 if err := g.Initialize(); err != nil { 236 return err 237 } 238 239 g.Resources = append(g.Resources, g.createTemplateStackResources()...) 240 g.Resources = append(g.Resources, g.createTemplateResources()...) 241 g.Resources = append(g.Resources, g.createDeviceGroupResources()...) 242 g.Resources = append(g.Resources, g.createDeviceGroupParentResources()...) 243 244 ts, err := g.client.(*pango.Panorama).Panorama.TemplateStack.GetList() 245 if err != nil { 246 return err 247 } 248 249 for _, v := range ts { 250 g.Resources = append(g.Resources, g.createTemplateVariableResources("", v)...) 251 252 vsysList, err := g.client.(*pango.Panorama).Vsys.GetList("", v) 253 if err != nil { 254 continue 255 } 256 257 vsysList = append(vsysList, "shared") 258 259 for _, vsys := range vsysList { 260 g.Resources = append(g.Resources, g.createEmailServerProfileResources("", v, vsys, "")...) 261 g.Resources = append(g.Resources, g.createHTTPServerProfileResources("", v, vsys, "")...) 262 g.Resources = append(g.Resources, g.createSNMPTrapServerProfileResources("", v, vsys, "")...) 263 g.Resources = append(g.Resources, g.createSyslogServerProfileResources("", v, vsys, "")...) 264 } 265 } 266 267 tmpl, err := g.client.(*pango.Panorama).Panorama.Template.GetList() 268 if err != nil { 269 return err 270 } 271 272 for _, v := range tmpl { 273 g.Resources = append(g.Resources, g.createTemplateVariableResources(v, "")...) 274 275 vsysList, err := g.client.(*pango.Panorama).Vsys.GetList(v, "") 276 if err != nil { 277 continue 278 } 279 if err != nil { 280 continue 281 } 282 283 vsysList = append(vsysList, "shared") 284 285 for _, vsys := range vsysList { 286 g.Resources = append(g.Resources, g.createEmailServerProfileResources(v, "", vsys, "")...) 287 g.Resources = append(g.Resources, g.createHTTPServerProfileResources(v, "", vsys, "")...) 288 g.Resources = append(g.Resources, g.createSNMPTrapServerProfileResources(v, "", vsys, "")...) 289 g.Resources = append(g.Resources, g.createSyslogServerProfileResources(v, "", vsys, "")...) 290 } 291 } 292 293 dg, err := g.client.(*pango.Panorama).Panorama.DeviceGroup.GetList() 294 if err != nil { 295 return err 296 } 297 298 for _, v := range dg { 299 g.Resources = append(g.Resources, g.createEmailServerProfileResources("", "", "", v)...) 300 g.Resources = append(g.Resources, g.createHTTPServerProfileResources("", "", "", v)...) 301 g.Resources = append(g.Resources, g.createSNMPTrapServerProfileResources("", "", "", v)...) 302 g.Resources = append(g.Resources, g.createSyslogServerProfileResources("", "", "", v)...) 303 } 304 305 // TODO: Panorama's own profiles are not yet supported by the Terraform provider 306 307 return nil 308 }