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  }