multiple config files to allow spreading of configuration

This commit is contained in:
Erik Brakkee 2025-01-02 19:21:04 +01:00
parent 5659d7c18c
commit c522f16d64
7 changed files with 30 additions and 32 deletions

View File

@ -79,6 +79,12 @@ type Config struct {
Communications []*Communication `yaml:"communications,omitempty"` Communications []*Communication `yaml:"communications,omitempty"`
} }
func (c *Config) Update(config *Config) {
c.Namespaces = append(c.Namespaces, config.Namespaces...)
c.Networks = append(c.Networks, config.Networks...)
c.Communications = append(c.Communications, config.Communications...)
}
func (c Config) Validate() error { func (c Config) Validate() error {
errs := make([]error, 0) errs := make([]error, 0)
@ -173,10 +179,6 @@ func LoadConfig(file string) (*Config, error) {
if err != nil { if err != nil {
return nil, fmt.Errorf("Error parsing YAML: %v", err) return nil, fmt.Errorf("Error parsing YAML: %v", err)
} }
err = config.Validate()
if err != nil {
return nil, err
}
// every application must have its namespace field set // every application must have its namespace field set
for _, ns := range config.Namespaces { for _, ns := range config.Namespaces {

View File

@ -1,9 +1,7 @@
package main package main
import ( import (
"fmt"
"io" "io"
"log"
"os" "os"
) )
@ -56,8 +54,6 @@ type Egress struct {
} }
func Generate(writer io.Writer, generator Generator, config *Config) error { func Generate(writer io.Writer, generator Generator, config *Config) error {
log.Printf("CONFIG %+v", config)
for _, ns := range config.Namespaces { for _, ns := range config.Namespaces {
err := generator.GenerateNamespace(os.Stdout, ns) err := generator.GenerateNamespace(os.Stdout, ns)
if err != nil { if err != nil {
@ -104,9 +100,6 @@ func Generate(writer io.Writer, generator Generator, config *Config) error {
for app, ingress := range ingresses { for app, ingress := range ingresses {
egress := egresses[app] egress := egresses[app]
if !ingress.Empty() || !egress.Empty() { if !ingress.Empty() || !egress.Empty() {
fmt.Fprintf(os.Stderr, "RULE %s\n", app)
fmt.Fprintf(os.Stderr, " IN %s\n", ingress)
fmt.Fprintf(os.Stderr, " OUT %s\n", egress)
err := generator.GenerateCommunicationRule(writer, applications[app], ingress, egress) err := generator.GenerateCommunicationRule(writer, applications[app], ingress, egress)
if err != nil { if err != nil {
return err return err

View File

@ -17,27 +17,35 @@ func execute(files []string, options *Options) error {
if len(files) == 0 { if len(files) == 0 {
return fmt.Errorf("File expected") return fmt.Errorf("File expected")
} }
config := &Config{}
for _, file := range files { for _, file := range files {
config, err := LoadConfig(file) log.Printf("LOADING %s\n", file)
configNew, err := LoadConfig(file)
if err != nil { if err != nil {
return err return err
} }
config.Update(configNew)
policyTemplates, err := NewPolicyTemplates() err = config.Validate()
if err != nil { if err != nil {
return err return fmt.Errorf("Error loading config %s: %w", file, err)
} }
var generator Generator log.Printf("Namespaces %v", config.Namespaces)
generator = NetworkPolicyGenerrator{
config: config,
policyTemplates: policyTemplates,
}
err = Generate(os.Stdout, generator, config)
if err != nil {
return err
}
} }
policyTemplates, err := NewPolicyTemplates()
if err != nil {
return err
}
var generator Generator
generator = NetworkPolicyGenerrator{
config: config,
policyTemplates: policyTemplates,
}
err = Generate(os.Stdout, generator, config)
if err != nil {
return err
}
return nil return nil
} }

View File

@ -3,7 +3,6 @@ package main
import ( import (
"fmt" "fmt"
"io" "io"
"log"
"os" "os"
"slices" "slices"
) )
@ -17,7 +16,6 @@ func (g NetworkPolicyGenerrator) GenerateNamespace(writer io.Writer, namespace *
fmt.Fprintf(os.Stderr, "Namespace %s\n", namespace.Name) fmt.Fprintf(os.Stderr, "Namespace %s\n", namespace.Name)
templates := g.policyTemplates.NamespaceTemplates("netpol", namespace.Capabilities) templates := g.policyTemplates.NamespaceTemplates("netpol", namespace.Capabilities)
log.Printf("Got %d templates", len(templates))
for _, template := range templates { for _, template := range templates {
err := template.Execute(writer, &namespace) err := template.Execute(writer, &namespace)
@ -64,14 +62,12 @@ func (g NetworkPolicyGenerrator) GenerateCommunicationRule(
for _, pre := range egress.Predefined { for _, pre := range egress.Predefined {
allPredefined[pre] = true allPredefined[pre] = true
} }
log.Printf("ALl PREDEFINED %v", allPredefined)
for predefined, _ := range allPredefined { for predefined, _ := range allPredefined {
tmpl := g.policyTemplates.PredefineApplicationPolicyTemplate("netpol", predefined) tmpl := g.policyTemplates.PredefineApplicationPolicyTemplate("netpol", predefined)
if tmpl == nil { if tmpl == nil {
return fmt.Errorf("Could not find predefined template for netpol/%s", predefined) return fmt.Errorf("Could not find predefined template for netpol/%s", predefined)
} }
log.Printf("PREDEFINED FOR %s", app.Name)
err := tmpl.Execute(writer, map[string]any{ err := tmpl.Execute(writer, map[string]any{
"app": app, "app": app,
"ingress": slices.Contains(ingress.Predefined, predefined), "ingress": slices.Contains(ingress.Predefined, predefined),

View File

@ -55,7 +55,6 @@ func showContents(files fs.FS) {
panic(err) panic(err)
} }
for _, entry := range entries { for _, entry := range entries {
fmt.Fprintf(os.Stderr, "entry %s %s\n", entry.Name(), entry.Type())
if entry.Type().IsDir() { if entry.Type().IsDir() {
subdir, err := fs.Sub(files, entry.Name()) subdir, err := fs.Sub(files, entry.Name())
if err != nil { if err != nil {

View File

@ -2,7 +2,7 @@
kind: CiliumNetworkPolicy kind: CiliumNetworkPolicy
apiVersion: cilium.io/v2 apiVersion: cilium.io/v2
metadata: metadata:
name: {{.app.Name}} name: {{.app.Name}}-apiserver
namespace: {{.app.Namespace.Name}} namespace: {{.app.Namespace.Name}}
labels: {{ .labels | toYaml | nindent 4 }} labels: {{ .labels | toYaml | nindent 4 }}
spec: spec:

View File

@ -61,7 +61,7 @@ spec:
{{- if or .egress.Applications .egress.Networks }} {{- if or .egress.Applications .egress.Networks }}
egress: egress:
tp: to:
{{- template "peers" .egress }} {{- template "peers" .egress }}
{{- template "networks" .egress }} {{- template "networks" .egress }}
{{- end }} {{- end }}