@@ -18,10 +18,9 @@ package dns
18
18
19
19
import (
20
20
"context"
21
+ "errors"
21
22
"sync"
22
23
23
- "github.com/kcp-dev/logicalcluster/v3"
24
-
25
24
appsv1 "k8s.io/api/apps/v1"
26
25
corev1 "k8s.io/api/core/v1"
27
26
apierrors "k8s.io/apimachinery/pkg/api/errors"
@@ -30,6 +29,7 @@ import (
30
29
"k8s.io/client-go/kubernetes"
31
30
listersappsv1 "k8s.io/client-go/listers/apps/v1"
32
31
listerscorev1 "k8s.io/client-go/listers/core/v1"
32
+ listersnetworkingv1 "k8s.io/client-go/listers/networking/v1"
33
33
listersrbacv1 "k8s.io/client-go/listers/rbac/v1"
34
34
"k8s.io/klog/v2"
35
35
@@ -45,9 +45,10 @@ type DNSProcessor struct {
45
45
deploymentLister listersappsv1.DeploymentLister
46
46
serviceLister listerscorev1.ServiceLister
47
47
endpointLister listerscorev1.EndpointsLister
48
+ networkPolicyLister listersnetworkingv1.NetworkPolicyLister
48
49
49
- syncTargetName string
50
50
syncTargetUID types.UID
51
+ syncTargetName string
51
52
dnsNamespace string // namespace containing all DNS objects
52
53
dnsImage string
53
54
@@ -63,8 +64,9 @@ func NewDNSProcessor(
63
64
deploymentLister listersappsv1.DeploymentLister ,
64
65
serviceLister listerscorev1.ServiceLister ,
65
66
endpointLister listerscorev1.EndpointsLister ,
66
- syncTargetName string ,
67
+ networkPolicyLister listersnetworkingv1. NetworkPolicyLister ,
67
68
syncTargetUID types.UID ,
69
+ syncTargetName string ,
68
70
dnsNamespace string ,
69
71
dnsImage string ) * DNSProcessor {
70
72
return & DNSProcessor {
@@ -75,8 +77,9 @@ func NewDNSProcessor(
75
77
deploymentLister : deploymentLister ,
76
78
serviceLister : serviceLister ,
77
79
endpointLister : endpointLister ,
78
- syncTargetName : syncTargetName ,
80
+ networkPolicyLister : networkPolicyLister ,
79
81
syncTargetUID : syncTargetUID ,
82
+ syncTargetName : syncTargetName ,
80
83
dnsNamespace : dnsNamespace ,
81
84
dnsImage : dnsImage ,
82
85
}
@@ -87,12 +90,12 @@ func NewDNSProcessor(
87
90
// are effectively reachable through the Service.
88
91
// It returns true if the DNS is setup and reachable, and returns an error if there was an error
89
92
// during the check or creation of the DNS-related resources.
90
- func (d * DNSProcessor ) EnsureDNSUpAndReady (ctx context.Context , workspace logicalcluster. Name ) (bool , error ) {
93
+ func (d * DNSProcessor ) EnsureDNSUpAndReady (ctx context.Context , namespaceLocator shared. NamespaceLocator ) (bool , error ) {
91
94
logger := klog .FromContext (ctx )
92
- logger .WithName ("dns" )
95
+ logger = logger .WithName ("dns" )
93
96
94
- dnsID := shared .GetDNSID (workspace , d .syncTargetUID , d .syncTargetName )
95
- logger .WithValues ("name" , dnsID , "namespace" , d .dnsNamespace )
97
+ dnsID := shared .GetDNSID (namespaceLocator . ClusterName , d .syncTargetUID , d .syncTargetName )
98
+ logger = logger .WithValues ("name" , dnsID , "namespace" , d .dnsNamespace )
96
99
97
100
logger .V (4 ).Info ("checking if all dns objects exist and are up-to-date" )
98
101
ctx = klog .NewContext (ctx , logger )
@@ -132,6 +135,10 @@ func (d *DNSProcessor) EnsureDNSUpAndReady(ctx context.Context, workspace logica
132
135
if err := d .processService (ctx , dnsID ); err != nil {
133
136
return false , err
134
137
}
138
+ if err := d .processNetworkPolicy (ctx , dnsID , namespaceLocator ); err != nil {
139
+ return false , err
140
+ }
141
+
135
142
// Since the Endpoints resource was not found, the DNS is not yet ready,
136
143
// even though all the required resources have been created
137
144
// (deployment still needs to start).
@@ -233,6 +240,39 @@ func (d *DNSProcessor) processService(ctx context.Context, name string) error {
233
240
return nil
234
241
}
235
242
243
+ func (d * DNSProcessor ) processNetworkPolicy (ctx context.Context , name string , namespaceLocator shared.NamespaceLocator ) error {
244
+ logger := klog .FromContext (ctx )
245
+
246
+ var kubeEndpoints * corev1.Endpoints
247
+ _ , err := d .networkPolicyLister .NetworkPolicies (d .dnsNamespace ).Get (name )
248
+ if apierrors .IsNotFound (err ) {
249
+ kubeEndpoints , err = d .downstreamKubeClient .CoreV1 ().Endpoints ("default" ).Get (ctx , "kubernetes" , metav1.GetOptions {})
250
+ if err != nil {
251
+ return err
252
+ }
253
+ if len (kubeEndpoints .Subsets ) == 0 || len (kubeEndpoints .Subsets [0 ].Addresses ) == 0 {
254
+ return errors .New ("missing kubernetes API endpoints" )
255
+ }
256
+
257
+ tenantID , err := shared .GetTenantID (namespaceLocator )
258
+ if err != nil {
259
+ return err
260
+ }
261
+
262
+ expected := MakeNetworkPolicy (name , d .dnsNamespace , tenantID , & kubeEndpoints .Subsets [0 ])
263
+ _ , err = d .downstreamKubeClient .NetworkingV1 ().NetworkPolicies (d .dnsNamespace ).Create (ctx , expected , metav1.CreateOptions {})
264
+ if err == nil {
265
+ logger .Info ("NetworkPolicy created" )
266
+ }
267
+ }
268
+ if err != nil && ! apierrors .IsAlreadyExists (err ) {
269
+ logger .Error (err , "failed to get NetworkPolicy (retrying)" )
270
+ return err
271
+ }
272
+
273
+ return nil
274
+ }
275
+
236
276
func hasAtLeastOneReadyAddress (endpoints * corev1.Endpoints ) bool {
237
277
for _ , s := range endpoints .Subsets {
238
278
if len (s .Addresses ) > 0 && s .Addresses [0 ].IP != "" {
0 commit comments