linkerd in progress. Network authentications generated.
This commit is contained in:
		
							parent
							
								
									b41c92112e
								
							
						
					
					
						commit
						ef99ad61e8
					
				| @ -49,7 +49,7 @@ type Port struct { | |||||||
| 
 | 
 | ||||||
| // Network represents each network entry in the YAML
 | // Network represents each network entry in the YAML
 | ||||||
| type Network struct { | type Network struct { | ||||||
| 	Name   string `yaml:"name" validate:"required,applicationName"` | 	Name   string `yaml:"name" validate:"required,applicationName,hostname"` | ||||||
| 	CIDR   CIDR   `yaml:"cidr"` | 	CIDR   CIDR   `yaml:"cidr"` | ||||||
| 	Except []CIDR `yaml:"except,omitempty" validate:"dive,required"` | 	Except []CIDR `yaml:"except,omitempty" validate:"dive,required"` | ||||||
| 	Ports  []Port `yaml:"ports,omitempty"  validate:"dive,required"` | 	Ports  []Port `yaml:"ports,omitempty"  validate:"dive,required"` | ||||||
| @ -62,7 +62,7 @@ type MatchExpression struct { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type Application struct { | type Application struct { | ||||||
| 	Name        string            `yaml:"name" validate:"required,applicationName"` | 	Name        string            `yaml:"name" validate:"required,applicationName,hostname"` | ||||||
| 	Ports       []Port            `yaml:"ports,omitempty"` | 	Ports       []Port            `yaml:"ports,omitempty"` | ||||||
| 	MatchLabels map[string]string `yaml:"matchLabels"` | 	MatchLabels map[string]string `yaml:"matchLabels"` | ||||||
| 	//MatchExpressions []MatchExpression `yaml:"matchExpressions" validate:"omitempty,dive"`
 | 	//MatchExpressions []MatchExpression `yaml:"matchExpressions" validate:"omitempty,dive"`
 | ||||||
|  | |||||||
| @ -6,6 +6,7 @@ import ( | |||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type Generator interface { | type Generator interface { | ||||||
|  | 	Init(write io.Writer) error | ||||||
| 	GenerateNamespace(writer io.Writer, namespace *Namespace) error | 	GenerateNamespace(writer io.Writer, namespace *Namespace) error | ||||||
| 	GenerateCommunicationRule(writer io.Writer, app *Application, ingress *Ingress, egress *Egress) error | 	GenerateCommunicationRule(writer io.Writer, app *Application, ingress *Ingress, egress *Egress) error | ||||||
| } | } | ||||||
| @ -66,8 +67,13 @@ type Egress struct { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func Generate(writer io.Writer, generator Generator, config *Config) error { | func Generate(writer io.Writer, generator Generator, config *Config) error { | ||||||
|  | 	err := generator.Init(writer) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	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 { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
|  | |||||||
							
								
								
									
										55
									
								
								cmd/policygen/linkerd_generator.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								cmd/policygen/linkerd_generator.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,55 @@ | |||||||
|  | package main | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"io" | ||||||
|  | 	"os" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type LinkerdPolicyGenerator struct { | ||||||
|  | 	config          *Config | ||||||
|  | 	policyTemplates *PolicyTemplates | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (g LinkerdPolicyGenerator) Init(writer io.Writer) error { | ||||||
|  | 	// start by generating network authentications
 | ||||||
|  | 	for _, network := range g.config.Networks { | ||||||
|  | 		fmt.Fprintf(os.Stderr, "NetworkAuthentication default/%s\n", network.Name) | ||||||
|  | 		template := g.policyTemplates.PredefineApplicationPolicyTemplate("linkerd", "network-authentication") | ||||||
|  | 		if template == nil { | ||||||
|  | 			return fmt.Errorf("Linkerd template for network authentication not found") | ||||||
|  | 		} | ||||||
|  | 		err := template.Execute(writer, network) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return fmt.Errorf("Error executing network authentication template for %s", network.Name) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (g LinkerdPolicyGenerator) GenerateNamespace(writer io.Writer, namespace *Namespace) error { | ||||||
|  | 	// and then the meshTLSAuthentications
 | ||||||
|  | 	for _, app := range namespace.Applications { | ||||||
|  | 		fmt.Fprintf(os.Stderr, "MeshTLSAuthentication %s/%s %v\n", | ||||||
|  | 			namespace.Name, app.Name, app.ServiceAccounts) | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (g LinkerdPolicyGenerator) GenerateCommunicationRule( | ||||||
|  | 	writer io.Writer, | ||||||
|  | 	app *Application, | ||||||
|  | 	ingress *Ingress, | ||||||
|  | 	egress *Egress) error { | ||||||
|  | 
 | ||||||
|  | 	if len(ingress.Applications)+ | ||||||
|  | 		len(ingress.Networks)+ | ||||||
|  | 		len(egress.Applications)+ | ||||||
|  | 		len(egress.Networks) > 0 { | ||||||
|  | 		// non-trivial regular network policy
 | ||||||
|  | 
 | ||||||
|  | 		// TODO
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
| @ -42,7 +42,7 @@ func generateNetworkPolicy(files []string, options *Options) error { | |||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	var generator Generator | 	var generator Generator | ||||||
| 	generator = NetworkPolicyGenerrator{ | 	generator = NetworkPolicyGenerator{ | ||||||
| 		config:          config, | 		config:          config, | ||||||
| 		policyTemplates: policyTemplates, | 		policyTemplates: policyTemplates, | ||||||
| 	} | 	} | ||||||
| @ -55,7 +55,35 @@ func generateNetworkPolicy(files []string, options *Options) error { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func generateLinkerdPolicies(files []string, options *Options) error { | func generateLinkerdPolicies(files []string, options *Options) error { | ||||||
| 	return fmt.Errorf(("Not yet implemented")) | 	if len(files) == 0 { | ||||||
|  | 		return fmt.Errorf("File expected") | ||||||
|  | 	} | ||||||
|  | 	config, err := readConfig(files) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	clientset, _ := GetKubernetesConnection() | ||||||
|  | 	cluster, err := NewCluster(clientset) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	config.Infer(cluster) | ||||||
|  | 
 | ||||||
|  | 	policyTemplates, err := NewPolicyTemplates() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	var generator Generator | ||||||
|  | 	generator = LinkerdPolicyGenerator{ | ||||||
|  | 		config:          config, | ||||||
|  | 		policyTemplates: policyTemplates, | ||||||
|  | 	} | ||||||
|  | 	err = Generate(os.Stdout, generator, config) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func main() { | func main() { | ||||||
|  | |||||||
| @ -7,12 +7,16 @@ import ( | |||||||
| 	"slices" | 	"slices" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type NetworkPolicyGenerrator struct { | type NetworkPolicyGenerator struct { | ||||||
| 	config          *Config | 	config          *Config | ||||||
| 	policyTemplates *PolicyTemplates | 	policyTemplates *PolicyTemplates | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (g NetworkPolicyGenerrator) GenerateNamespace(writer io.Writer, namespace *Namespace) error { | func (g NetworkPolicyGenerator) Init(writer io.Writer) error { | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (g NetworkPolicyGenerator) GenerateNamespace(writer io.Writer, namespace *Namespace) error { | ||||||
| 	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) | ||||||
| @ -26,7 +30,7 @@ func (g NetworkPolicyGenerrator) GenerateNamespace(writer io.Writer, namespace * | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (g NetworkPolicyGenerrator) GenerateCommunicationRule( | func (g NetworkPolicyGenerator) GenerateCommunicationRule( | ||||||
| 	writer io.Writer, | 	writer io.Writer, | ||||||
| 	app *Application, | 	app *Application, | ||||||
| 	ingress *Ingress, | 	ingress *Ingress, | ||||||
|  | |||||||
| @ -0,0 +1,17 @@ | |||||||
|  | {{- if .CIDR }} | ||||||
|  | --- | ||||||
|  | apiVersion: policy.linkerd.io/v1alpha1 | ||||||
|  | kind: NetworkAuthentication | ||||||
|  | metadata: | ||||||
|  |   name: {{ .Name }} | ||||||
|  |   namespace: default | ||||||
|  | spec: | ||||||
|  |   networks: | ||||||
|  |     - cidr: {{ .CIDR }} | ||||||
|  |       {{- if .Except }} | ||||||
|  |       except: | ||||||
|  |         {{- range $cidr := .Except }} | ||||||
|  |         - {{ $cidr }} | ||||||
|  |         {{- end }} | ||||||
|  |       {{- end }} | ||||||
|  |   {{- end }} | ||||||
| @ -32,7 +32,7 @@ var translations = map[string]Translation{ | |||||||
| 		}, | 		}, | ||||||
| 	}, | 	}, | ||||||
| 	"applicationName": { | 	"applicationName": { | ||||||
| 		"{0} must not end with -p[0-9]+$ to prevent conflicts with generated resource names", | 		"{0} must not end with -[0-9]+$ to prevent conflicts with generated resource names", | ||||||
| 		func(fe validator.FieldError) []any { | 		func(fe validator.FieldError) []any { | ||||||
| 			return []any{fe.Namespace()} | 			return []any{fe.Namespace()} | ||||||
| 		}, | 		}, | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user