Skip to content

refactor: envoyfilters as types#118

Open
hown3d wants to merge 1 commit intomainfrom
refactor/types
Open

refactor: envoyfilters as types#118
hown3d wants to merge 1 commit intomainfrom
refactor/types

Conversation

@hown3d
Copy link
Copy Markdown
Member

@hown3d hown3d commented Mar 18, 2025

What this PR does / why we need it:
Refactors the code to use the proto definitions of envoy instead of relying on map[string]interface{}.
This ensures type safety and increases developer experience a lot, since you no longer have to dig deep in the envoy documentation in regards to syntax.

Special notes for your reviewer:
/cc @timebertt
Tested on ond-lamb with shoot acl

@hown3d hown3d force-pushed the refactor/types branch 2 times, most recently from 859f14e to 9e7beaf Compare March 18, 2025 16:04
Copy link
Copy Markdown
Member

@dergeberl dergeberl left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very nice to have this objects typed! 🎉

We added a few comments.
I will have a second look incl. the cluster on the ondemand after resolving our comments.

Comment thread pkg/envoyfilters/envoyfilters.go Outdated
Comment thread pkg/envoyfilters/envoyfilters.go
Comment thread pkg/envoyfilters/envoyfilters.go Outdated
Comment thread pkg/envoyfilters/envoyfilters.go Outdated
Comment thread pkg/envoyfilters/envoyfilters_test.go Outdated
Comment thread pkg/webhook/webhook.go Outdated
if err := json.Unmarshal([]byte(originalFilter.Raw), &originalFilterMap); err != nil {
return admission.Errored(http.StatusInternalServerError, err)
var originalFilter *structpb.Struct
for _, configpatch := range filter.Spec.ConfigPatches {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the gjson we only checked the ConfigPatches[0].

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could break the outer loop when we find the first occurence of"envoy.filters.network.tcp_proxy" in a filterList. This way we are safe if the configPatches changes and something is added before the tcp_proxy filter

Comment thread pkg/webhook/webhook.go Outdated
@hown3d hown3d requested a review from dergeberl April 15, 2025 15:36
@hown3d hown3d requested a review from Wieneo as a code owner August 7, 2025 09:08
@hown3d hown3d force-pushed the refactor/types branch 2 times, most recently from bdf5b81 to 3c0bb13 Compare August 7, 2025 09:13
@hown3d hown3d requested a review from maboehm as a code owner April 15, 2026 15:16
- remote_ip:
address_prefix: 10.96.0.0
prefix_len: 11
stat_prefix: envoyrbac
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was previously a bug, there is not stat_prefix field in http.rbac.v3.RBAC message.
Ref: https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/filters/http/rbac/v3/rbac.proto

Signed-off-by: Lukas Hoehl <lukas.hoehl@stackit.cloud>
@timebertt timebertt requested review from Copilot and removed request for Wieneo April 30, 2026 05:59
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Refactors EnvoyFilter generation to use typed Envoy/Istio protobuf definitions (instead of map[string]interface{}), improving type safety and easing future maintenance.

Changes:

  • Reworks EnvoyFilter builders to return typed *istio.io/api/networking/v1alpha3.EnvoyFilter objects and constructs typed RBAC filter configs using go-control-plane protos.
  • Updates unit tests and golden testdata to compare rendered output via JSON equivalence (and adjusts field names like rules_stat_prefix).
  • Wires new builder signatures through the actuator and updates module dependencies to include protobuf/Envoy proto packages.

Reviewed changes

Copilot reviewed 10 out of 11 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
pkg/envoyfilters/envoyfilters.go Core refactor: build typed EnvoyFilter + typed RBAC configs; introduces proto→structpb.Struct helper.
pkg/envoyfilters/envoyfilters_test.go Updates tests to compare JSON-equivalent output; adapts to new return types and signatures.
pkg/envoyfilters/testdata/*.yaml Adjusts golden specs for protojson defaults (e.g., action omitted) and rules_stat_prefix naming.
pkg/controller/actuator.go Updates call sites to handle new (spec, error) builder signatures.
go.mod / go.sum Adds dependencies for Envoy protos and protobuf tooling; adjusts YAML/protobuf deps.
Comments suppressed due to low confidence (1)

pkg/envoyfilters/envoyfilters.go:416

  • ruleCIDRsToPrincipal appends alwaysAllowedCIDRs only when rule.Action == "ALLOW", which is case-sensitive. Since validation accepts any casing, an action like "allow" would skip adding always-allowed CIDRs and could unintentionally block cluster-internal communication. Consider using a case-insensitive check (or reusing actionProto() / normalized action) here as well.
	// if the rule has action "ALLOW" (which means "limit the access to only the
	// specified IPs", we need to insert the node CIDR range to not block
	// cluster-internal communication)
	if rule.Action == "ALLOW" {
		for _, cidr := range alwaysAllowedCIDRs {
			prefix, length, err := getPrefixAndPrefixLength(cidr)

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +41 to +49
func (r *ACLRule) actionProto() (envoy_rbacv3.RBAC_Action, error) {
switch r.Action {
case "DENY":
return envoy_rbacv3.RBAC_DENY, nil
case "ALLOW":
return envoy_rbacv3.RBAC_ALLOW, nil
default:
return -1, fmt.Errorf("unknown action %s", r.Action)
}
}

// FilterPatch represents the object beneath EnvoyFilter.spec.configPatches.patch.value
// It holds the name of the filter and it's typed config to inject into the envoy config
Copy link
Copy Markdown
Member

@timebertt timebertt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ufff, this is really hard to review. I can only judge high-level code quality, e.g., error handling, etc.
However, the tests comparing the marshalled results with the expected YAML give me confidence that everything will still work as expected.

result, err := CreateInternalFilterPatchFromRule(rule, alwaysAllowedCIDRs, []string{})

Expect(err).ToNot(HaveOccurred())
checkIfMapEqualsYAML(result, "singleFiltersAllowEntry.yaml")
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we remove the singleFiltersAllowEntry.yaml file?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants