Skip to content

Commit 4938959

Browse files
committed
refactor: cleanup
Signed-off-by: Andrea Terzolo <andrea.terzolo@suse.com>
1 parent c6bc2ad commit 4938959

15 files changed

Lines changed: 623 additions & 311 deletions

File tree

.golangci.yml

Lines changed: 485 additions & 52 deletions
Large diffs are not rendered by default.

.pre-commit-config.yaml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
fail_fast: false
2+
minimum_pre_commit_version: '0'
3+
repos:
4+
# more info on the usage: https://github.com/golangci/golangci-lint/blob/main/.pre-commit-hooks.yaml
5+
- repo: https://github.com/golangci/golangci-lint
6+
rev: c0d3ddc9cf3faa61a4e378e879ece580256d76e5 # v2.12.2
7+
hooks:
8+
- id: golangci-lint-full
9+
language_version: 1.26.4
10+
stages: [pre-commit]
11+
- id: golangci-lint-fmt
12+
language_version: 1.26.4
13+
stages: [pre-commit]

Makefile

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,6 @@ test: manifests generate fmt vet setup-envtest ## Run tests.
7979

8080
# TODO(user): To use a different vendor for e2e tests, modify the setup under 'tests/e2e'.
8181
# The default setup assumes Kind is pre-installed and builds/loads the Manager Docker image locally.
82-
# CertManager is installed by default; skip with:
83-
# - CERT_MANAGER_INSTALL_SKIP=true
8482
KIND_CLUSTER ?= network-enforcer-test-e2e
8583

8684
.PHONY: setup-test-e2e

api/v1alpha1/groupversion_info.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17+
// Package v1alpha1 contains API Schema definitions for the security v1alpha1 API group.
1718
// +kubebuilder:object:generate=true
1819
// +groupName=security.security.rancher.io
1920
package v1alpha1
@@ -24,7 +25,10 @@ import (
2425
)
2526

2627
var (
27-
GroupVersion = schema.GroupVersion{Group: "security.security.rancher.io", Version: "v1alpha1"}
28+
//nolint:gochecknoglobals // Kubebuilder API registration requires package-level variables
29+
GroupVersion = schema.GroupVersion{Group: "security.security.rancher.io", Version: "v1alpha1"}
30+
//nolint:gochecknoglobals // Kubebuilder API registration requires package-level variables
2831
SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion}
29-
AddToScheme = SchemeBuilder.AddToScheme
32+
//nolint:gochecknoglobals // Kubebuilder API registration requires package-level variables
33+
AddToScheme = SchemeBuilder.AddToScheme
3034
)

api/v1alpha1/networkpolicyproposal_types.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ type NetworkPolicyProposalList struct {
5656
Items []NetworkPolicyProposal `json:"items"`
5757
}
5858

59+
//nolint:gochecknoinits // Kubebuilder API types register themselves during package initialization
5960
func init() {
6061
SchemeBuilder.Register(&NetworkPolicyProposal{}, &NetworkPolicyProposalList{})
6162
}

cmd/main.go

Lines changed: 93 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,12 @@ package main
1919
import (
2020
"crypto/tls"
2121
"flag"
22+
"fmt"
2223
"log/slog"
2324
"os"
2425

26+
"sigs.k8s.io/controller-runtime/pkg/manager"
27+
2528
"github.com/go-logr/logr"
2629
_ "k8s.io/client-go/plugin/pkg/client/auth"
2730

@@ -32,7 +35,6 @@ import (
3235
"sigs.k8s.io/controller-runtime/pkg/healthz"
3336
"sigs.k8s.io/controller-runtime/pkg/metrics/filters"
3437
metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
35-
"sigs.k8s.io/controller-runtime/pkg/webhook"
3638

3739
securityv1alpha1 "secuity.rancher.io/network-enforcer/api/v1alpha1"
3840
backendkubernetes "secuity.rancher.io/network-enforcer/internal/backend/kubernetes"
@@ -42,139 +44,135 @@ import (
4244
// +kubebuilder:scaffold:imports
4345
)
4446

45-
var (
46-
scheme = runtime.NewScheme()
47-
setupLog = ctrl.Log.WithName("setup")
48-
)
49-
50-
func init() {
51-
utilruntime.Must(clientgoscheme.AddToScheme(scheme))
52-
utilruntime.Must(securityv1alpha1.AddToScheme(scheme))
53-
// +kubebuilder:scaffold:scheme
47+
type config struct {
48+
metricsAddr string
49+
metricsCertPath string
50+
metricsCertName string
51+
metricsCertKey string
52+
enableLeaderElection bool
53+
probeAddr string
54+
secureMetrics bool
55+
enableHTTP2 bool
56+
otlpPort int
57+
tlsOpts []func(*tls.Config)
5458
}
5559

56-
func main() {
57-
var metricsAddr string
58-
var metricsCertPath, metricsCertName, metricsCertKey string
59-
var webhookCertPath, webhookCertName, webhookCertKey string
60-
var enableLeaderElection bool
61-
var probeAddr string
62-
var secureMetrics bool
63-
var enableHTTP2 bool
64-
var otlpPort int
65-
var tlsOpts []func(*tls.Config)
66-
flag.StringVar(&metricsAddr, "metrics-bind-address", "0", "The address the metrics endpoint binds to. "+
67-
"Use :8443 for HTTPS or :8080 for HTTP, or leave as 0 to disable the metrics service.")
68-
flag.StringVar(&probeAddr, "health-probe-bind-address", ":8081", "The address the probe endpoint binds to.")
69-
flag.BoolVar(&enableLeaderElection, "leader-elect", false,
70-
"Enable leader election for controller manager. "+
71-
"Enabling this will ensure there is only one active controller manager.")
72-
flag.BoolVar(&secureMetrics, "metrics-secure", true,
73-
"If set, the metrics endpoint is served securely via HTTPS. Use --metrics-secure=false to use HTTP instead.")
74-
flag.StringVar(&webhookCertPath, "webhook-cert-path", "", "The directory that contains the webhook certificate.")
75-
flag.StringVar(&webhookCertName, "webhook-cert-name", "tls.crt", "The name of the webhook certificate file.")
76-
flag.StringVar(&webhookCertKey, "webhook-cert-key", "tls.key", "The name of the webhook key file.")
77-
flag.StringVar(&metricsCertPath, "metrics-cert-path", "",
78-
"The directory that contains the metrics server certificate.")
79-
flag.StringVar(&metricsCertName, "metrics-cert-name", "tls.crt", "The name of the metrics server certificate file.")
80-
flag.StringVar(&metricsCertKey, "metrics-cert-key", "tls.key", "The name of the metrics server key file.")
81-
flag.BoolVar(&enableHTTP2, "enable-http2", false,
82-
"If set, HTTP/2 will be enabled for the metrics and webhook servers")
83-
flag.IntVar(&otlpPort, "otlp-port", 4317, "The port the OTLP gRPC receiver listens on.")
84-
flag.Parse()
85-
86-
slogHandler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo})
87-
slogger := slog.New(slogHandler).With("component", "agent")
88-
slog.SetDefault(slogger)
89-
ctrl.SetLogger(logr.FromSlogHandler(slogger.Handler()))
90-
60+
func newControllerManager(conf *config) (manager.Manager, error) {
9161
// Mitigate HTTP/2 Stream Cancellation / Rapid Reset CVEs.
9262
disableHTTP2 := func(c *tls.Config) {
9363
c.NextProtos = []string{"http/1.1"}
9464
}
9565

96-
if !enableHTTP2 {
97-
tlsOpts = append(tlsOpts, disableHTTP2)
66+
if !conf.enableHTTP2 {
67+
conf.tlsOpts = append(conf.tlsOpts, disableHTTP2)
9868
}
9969

100-
webhookServerOptions := webhook.Options{
101-
TLSOpts: tlsOpts,
102-
}
103-
104-
if len(webhookCertPath) > 0 {
105-
webhookServerOptions.CertDir = webhookCertPath
106-
webhookServerOptions.CertName = webhookCertName
107-
webhookServerOptions.KeyName = webhookCertKey
108-
}
109-
110-
webhookServer := webhook.NewServer(webhookServerOptions)
111-
11270
metricsServerOptions := metricsserver.Options{
113-
BindAddress: metricsAddr,
114-
SecureServing: secureMetrics,
115-
TLSOpts: tlsOpts,
71+
BindAddress: conf.metricsAddr,
72+
SecureServing: conf.secureMetrics,
73+
TLSOpts: conf.tlsOpts,
11674
}
11775

118-
if secureMetrics {
76+
if conf.secureMetrics {
11977
metricsServerOptions.FilterProvider = filters.WithAuthenticationAndAuthorization
12078
}
12179

122-
if len(metricsCertPath) > 0 {
123-
metricsServerOptions.CertDir = metricsCertPath
124-
metricsServerOptions.CertName = metricsCertName
125-
metricsServerOptions.KeyName = metricsCertKey
80+
if len(conf.metricsCertPath) > 0 {
81+
metricsServerOptions.CertDir = conf.metricsCertPath
82+
metricsServerOptions.CertName = conf.metricsCertName
83+
metricsServerOptions.KeyName = conf.metricsCertKey
12684
}
12785

128-
mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
86+
scheme := runtime.NewScheme()
87+
utilruntime.Must(clientgoscheme.AddToScheme(scheme))
88+
utilruntime.Must(securityv1alpha1.AddToScheme(scheme))
89+
controllerOptions := ctrl.Options{
12990
Scheme: scheme,
13091
Metrics: metricsServerOptions,
131-
WebhookServer: webhookServer,
132-
HealthProbeBindAddress: probeAddr,
133-
LeaderElection: enableLeaderElection,
92+
HealthProbeBindAddress: conf.probeAddr,
93+
LeaderElection: conf.enableLeaderElection,
13494
LeaderElectionID: "6163c1ee.security.rancher.io",
135-
})
95+
}
96+
mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), controllerOptions)
13697
if err != nil {
137-
setupLog.Error(err, "unable to start manager")
138-
os.Exit(1)
98+
return nil, fmt.Errorf("unable to start manager: %w", err)
99+
}
100+
return mgr, nil
101+
}
102+
103+
func run(logger *slog.Logger, conf *config) error {
104+
mgr, err := newControllerManager(conf)
105+
if err != nil {
106+
return fmt.Errorf("unable to create controller manager: %w", err)
139107
}
140108

141109
store := topology.NewStore()
142110

143-
receiver := flowcollector.NewReceiver(store, otlpPort, slogger)
144-
if err := mgr.Add(receiver); err != nil {
145-
setupLog.Error(err, "add OTLP receiver")
146-
os.Exit(1)
111+
receiver := flowcollector.NewReceiver(store, conf.otlpPort, logger)
112+
err = mgr.Add(receiver)
113+
if err != nil {
114+
return fmt.Errorf("unable to add OTLP receiver to manager: %w", err)
147115
}
148116

149-
scanner := controller.NewTopologyScanner(mgr.GetClient(), store, slogger)
150-
if err := mgr.Add(scanner); err != nil {
151-
setupLog.Error(err, "add topology scanner")
152-
os.Exit(1)
117+
scanner := controller.NewTopologyScanner(mgr.GetClient(), store, logger)
118+
err = mgr.Add(scanner)
119+
if err != nil {
120+
return fmt.Errorf("unable to add topology scanner to manager: %w", err)
153121
}
154122

155-
if err := (&controller.EnforcementReconciler{
123+
err = (&controller.EnforcementReconciler{
156124
Client: mgr.GetClient(),
157125
Scheme: mgr.GetScheme(),
158126
Backend: &backendkubernetes.Backend{},
159-
}).SetupWithManager(mgr); err != nil {
160-
setupLog.Error(err, "setup controller", "controller", "Enforcement")
161-
os.Exit(1)
127+
}).SetupWithManager(mgr)
128+
if err != nil {
129+
return fmt.Errorf("unable to setup Enforcement controller: %w", err)
162130
}
163131

164132
// +kubebuilder:scaffold:builder
165133

166-
if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil {
167-
setupLog.Error(err, "healthz check")
168-
os.Exit(1)
134+
if err = mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil {
135+
return fmt.Errorf("unable to add healthz check: %w", err)
169136
}
170-
if err := mgr.AddReadyzCheck("readyz", healthz.Ping); err != nil {
171-
setupLog.Error(err, "readyz check")
172-
os.Exit(1)
137+
if err = mgr.AddReadyzCheck("readyz", healthz.Ping); err != nil {
138+
return fmt.Errorf("unable to add readyz check: %w", err)
173139
}
174140

175-
setupLog.Info("starting manager")
176-
if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
177-
setupLog.Error(err, "manager exited")
141+
logger.Info("starting manager")
142+
return mgr.Start(ctrl.SetupSignalHandler())
143+
}
144+
145+
func main() {
146+
conf := &config{}
147+
flag.StringVar(&conf.metricsAddr, "metrics-bind-address", "0", "The address the metrics endpoint binds to. "+
148+
"Use :8443 for HTTPS or :8080 for HTTP, or leave as 0 to disable the metrics service.")
149+
flag.StringVar(&conf.probeAddr, "health-probe-bind-address", ":8081", "The address the probe endpoint binds to.")
150+
flag.BoolVar(&conf.enableLeaderElection, "leader-elect", false,
151+
"Enable leader election for controller manager. "+
152+
"Enabling this will ensure there is only one active controller manager.")
153+
flag.BoolVar(&conf.secureMetrics, "metrics-secure", true,
154+
"If set, the metrics endpoint is served securely via HTTPS. Use --metrics-secure=false to use HTTP instead.")
155+
flag.StringVar(&conf.metricsCertPath, "metrics-cert-path", "",
156+
"The directory that contains the metrics server certificate.")
157+
flag.StringVar(
158+
&conf.metricsCertName,
159+
"metrics-cert-name",
160+
"tls.crt",
161+
"The name of the metrics server certificate file.",
162+
)
163+
flag.StringVar(&conf.metricsCertKey, "metrics-cert-key", "tls.key", "The name of the metrics server key file.")
164+
flag.BoolVar(&conf.enableHTTP2, "enable-http2", false,
165+
"If set, HTTP/2 will be enabled for the metrics server")
166+
flag.IntVar(&conf.otlpPort, "otlp-port", 4317, "The port the OTLP gRPC receiver listens on.")
167+
flag.Parse()
168+
169+
slogHandler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo})
170+
slogger := slog.New(slogHandler).With("component", "agent")
171+
slog.SetDefault(slogger)
172+
ctrl.SetLogger(logr.FromSlogHandler(slogger.Handler()))
173+
174+
if err := run(slogger, conf); err != nil {
175+
slogger.Error("failed to run", "error", err)
178176
os.Exit(1)
179177
}
180178
}

cspell.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"ignoreWords": [
2121
"corev1",
2222
"metav1",
23+
"nolint",
2324
],
2425
"import": []
2526
}

internal/backend/backend.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,4 @@ type PolicyBackend interface {
1717
) client.Object
1818
// Empty returns a zero-value instance for client.Get.
1919
Empty() client.Object
20-
UpdateSpec(existing, desired client.Object)
2120
}

internal/backend/kubernetes/kubernetes.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,6 @@ func (b *Backend) Empty() client.Object {
1919
return &networkingv1.NetworkPolicy{}
2020
}
2121

22-
func (b *Backend) UpdateSpec(existing, desired client.Object) {
23-
existing.(*networkingv1.NetworkPolicy).Spec = desired.(*networkingv1.NetworkPolicy).Spec
24-
}
25-
2622
func (b *Backend) Build(
2723
name, namespace string,
2824
podSelector map[string]string,

internal/controller/enforcement_controller.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,9 @@ func (r *EnforcementReconciler) SetupWithManager(mgr ctrl.Manager) error {
7171
newLabels := e.ObjectNew.GetLabels()
7272
return oldLabels[enforceLabelKey] != newLabels[enforceLabelKey]
7373
},
74-
CreateFunc: func(e event.CreateEvent) bool { return true },
75-
DeleteFunc: func(e event.DeleteEvent) bool { return false },
76-
GenericFunc: func(e event.GenericEvent) bool { return false },
74+
CreateFunc: func(_ event.CreateEvent) bool { return true },
75+
DeleteFunc: func(_ event.DeleteEvent) bool { return false },
76+
GenericFunc: func(_ event.GenericEvent) bool { return false },
7777
}).
7878
Named("enforcement").
7979
Complete(r)

0 commit comments

Comments
 (0)