diff --git a/apis/v1alpha1/policy_methods.go b/apis/v1alpha1/policy_methods.go index 71cc93ede8..8643bb7d89 100644 --- a/apis/v1alpha1/policy_methods.go +++ b/apis/v1alpha1/policy_methods.go @@ -1,12 +1,8 @@ -package v1alpha1 +// Code generated by gen_policies.go; DO NOT EDIT. -import ( - "sigs.k8s.io/gateway-api/apis/v1alpha2" -) +package v1alpha1 -// FIXME(kate-osborn): https://github.com/nginx/nginx-gateway-fabric/issues/1939. -// Figure out a way to generate these methods for all our policies. -// These methods implement the policies.Policy interface which extends client.Object to add the following methods. +import "sigs.k8s.io/gateway-api/apis/v1alpha2" func (p *ClientSettingsPolicy) GetTargetRefs() []v1alpha2.LocalPolicyTargetReference { return []v1alpha2.LocalPolicyTargetReference{p.Spec.TargetRef} diff --git a/apis/v1alpha1/tools/gen_policies.go b/apis/v1alpha1/tools/gen_policies.go new file mode 100644 index 0000000000..4e8086ae03 --- /dev/null +++ b/apis/v1alpha1/tools/gen_policies.go @@ -0,0 +1,70 @@ +package main + +import ( + "log" + "os" + "text/template" +) + +//go:generate go run gen_policies.go + +// Define policy types +var policies = []struct { + Name string + HasSingleRef bool // true if it uses a single TargetRef, false if it uses TargetRefs +}{ + {"ClientSettingsPolicy", true}, + {"ObservabilityPolicy", false}, + {"UpstreamSettingsPolicy", false}, +} + +// Template for generating policy methods +const tmpl = `// Code generated by gen_policies.go; DO NOT EDIT. + +package v1alpha1 + +import "sigs.k8s.io/gateway-api/apis/v1alpha2" + +{{- range . }} + +func (p *{{ .Name }}) GetTargetRefs() []v1alpha2.LocalPolicyTargetReference { + {{- if .HasSingleRef }} + return []v1alpha2.LocalPolicyTargetReference{p.Spec.TargetRef} + {{- else }} + return p.Spec.TargetRefs + {{- end }} +} + +func (p *{{ .Name }}) GetPolicyStatus() v1alpha2.PolicyStatus { + return p.Status +} + +func (p *{{ .Name }}) SetPolicyStatus(status v1alpha2.PolicyStatus) { + p.Status = status +} + +{{- end }} +` + +func main() { + // Ensure the output directory exists + outputDir := "../apis/v1alpha1" + if err := os.MkdirAll(outputDir, os.ModePerm); err != nil { + log.Fatalf("failed to create directory: %v", err) + } + + // Open the output file + file, err := os.Create("../policy_methods.go") + if err != nil { + log.Fatalf("failed to create file: %v", err) + } + defer file.Close() + + // Create a template and execute it with the policy list + t := template.Must(template.New("policy").Parse(tmpl)) + if err := t.Execute(file, policies); err != nil { + log.Fatalf("failed to execute template: %v", err) + } + + log.Printf("Writing PolicyMethods to %s... Done\n", "policy_methods.go") +} diff --git a/apis/v1alpha2/policy_methods.go b/apis/v1alpha2/policy_methods.go index b5e59a0ff5..5f999fa50f 100644 --- a/apis/v1alpha2/policy_methods.go +++ b/apis/v1alpha2/policy_methods.go @@ -1,12 +1,8 @@ -package v1alpha2 +// Code generated by gen_policies.go; DO NOT EDIT. -import ( - "sigs.k8s.io/gateway-api/apis/v1alpha2" -) +package v1alpha2 -// FIXME(kate-osborn): https://github.com/nginx/nginx-gateway-fabric/issues/1939. -// Figure out a way to generate these methods for all our policies. -// These methods implement the policies.Policy interface which extends client.Object to add the following methods. +import "sigs.k8s.io/gateway-api/apis/v1alpha2" func (p *ObservabilityPolicy) GetTargetRefs() []v1alpha2.LocalPolicyTargetReference { return p.Spec.TargetRefs diff --git a/apis/v1alpha2/tools/gen_policies.go b/apis/v1alpha2/tools/gen_policies.go new file mode 100644 index 0000000000..f9df1a8a1c --- /dev/null +++ b/apis/v1alpha2/tools/gen_policies.go @@ -0,0 +1,59 @@ +package main + +import ( + "log" + "os" + "text/template" +) + +//go:generate go run gen_policies.go + +// Define policy types +var policies = []string{ + "ObservabilityPolicy", +} + +// Template for generating policy methods +const tmpl = `// Code generated by gen_policies.go; DO NOT EDIT. + +package v1alpha2 + +import "sigs.k8s.io/gateway-api/apis/v1alpha2" + +{{ range . }} +func (p *{{ . }}) GetTargetRefs() []v1alpha2.LocalPolicyTargetReference { + return p.Spec.TargetRefs +} + +func (p *{{ . }}) GetPolicyStatus() v1alpha2.PolicyStatus { + return p.Status +} + +func (p *{{ . }}) SetPolicyStatus(status v1alpha2.PolicyStatus) { + p.Status = status +} +{{ end }} +` + +func main() { + // Ensure the output directory exists + outputDir := "../apis/v1alpha2" + if err := os.MkdirAll(outputDir, os.ModePerm); err != nil { + log.Fatalf("failed to create directory: %v", err) + } + + // Open the output file + file, err := os.Create("../policy_methods.go") + if err != nil { + log.Fatalf("failed to create file: %v", err) + } + defer file.Close() + + // Create a template and execute it with the policy list + t := template.Must(template.New("policy").Parse(tmpl)) + if err := t.Execute(file, policies); err != nil { + log.Fatalf("failed to execute template: %v", err) + } + + log.Printf("Writing PolicyMethods to %s... Done\n", "policy_methods.go") +}