Skip to content

Commit 7969e19

Browse files
authored
Ignore target hostNetwork pods in the DNS capture flow (#231)
1 parent c400bef commit 7969e19

File tree

3 files changed

+71
-1
lines changed

3 files changed

+71
-1
lines changed

src/mapper/pkg/resolvers/resolver_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/otterize/network-mapper/src/mapper/pkg/awsintentsholder"
1111
"github.com/otterize/network-mapper/src/mapper/pkg/dnscache"
1212
"github.com/otterize/network-mapper/src/mapper/pkg/externaltrafficholder"
13+
"github.com/otterize/network-mapper/src/mapper/pkg/graph/model"
1314
"github.com/otterize/network-mapper/src/mapper/pkg/incomingtrafficholder"
1415
"github.com/otterize/network-mapper/src/mapper/pkg/intentsstore"
1516
"github.com/otterize/network-mapper/src/mapper/pkg/kubefinder"
@@ -1212,6 +1213,27 @@ func (s *ResolverTestSuite) TestIntentsFilterByServer() {
12121213
s.Require().ElementsMatch(res.Intents, expectedIntents)
12131214
}
12141215

1216+
func (s *ResolverTestSuite) TestResolveOtterizeIdentityIgnoreHostNetworkPods() {
1217+
// Setup
1218+
serviceName := "test-service"
1219+
serviceIP := "10.0.0.10"
1220+
podIP := "1.1.1.3"
1221+
1222+
pod3 := s.AddPodWithHostNetwork("pod3", podIP, map[string]string{"app": "test"}, nil, true)
1223+
s.AddService(serviceName, map[string]string{"app": "test"}, serviceIP, []*v1.Pod{pod3})
1224+
s.Require().True(s.Mgr.GetCache().WaitForCacheSync(context.Background()))
1225+
1226+
service := &v1.Service{}
1227+
err := s.Mgr.GetClient().Get(context.Background(), types.NamespacedName{Name: "svc-" + serviceName, Namespace: s.TestNamespace}, service)
1228+
s.Require().NoError(err)
1229+
1230+
lastSeen := time.Now().Add(time.Minute)
1231+
_, ok, err := s.resolver.resolveOtterizeIdentityForDestinationAddress(context.Background(), model.Destination{LastSeen: lastSeen, Destination: fmt.Sprintf("%s.%s.svc.cluster.local", service.Name, service.Namespace)})
1232+
s.Require().False(ok)
1233+
s.Require().NoError(err)
1234+
1235+
}
1236+
12151237
func TestRunSuite(t *testing.T) {
12161238
suite.Run(t, new(ResolverTestSuite))
12171239
}

src/mapper/pkg/resolvers/schema.helpers.resolvers.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,10 @@ func (r *Resolver) resolveOtterizeIdentityForDestinationAddress(ctx context.Cont
283283
}
284284

285285
filteredPods := lo.Filter(pods, func(pod corev1.Pod, _ int) bool {
286+
if pod.Spec.HostNetwork {
287+
logrus.Debugf("pod %s is in host network, ignoring", pod.Name)
288+
return false
289+
}
286290
lastCreationTimeForUsToTrustIt := dest.LastSeen
287291
if lo.IsEmpty(serviceName) {
288292
// In this case the DNS was a "pod" DNS - which contains IP - and therefore less reliable.
@@ -593,7 +597,7 @@ func (r *Resolver) handleReportIstioConnectionResults(ctx context.Context, resul
593597
}
594598
dstPod, err := r.kubeFinder.ResolveIstioWorkloadToPod(ctx, result.DstWorkload, result.DstWorkloadNamespace)
595599
if err != nil {
596-
logrus.WithError(err).Debugf("Could not resolve workload %s to pod", result.SrcWorkload)
600+
logrus.WithError(err).Debugf("Could not resolve workload %s to pod", result.DstWorkload)
597601
continue
598602
}
599603
srcService, err := r.serviceIdResolver.ResolvePodToServiceIdentity(ctx, srcPod)
@@ -615,6 +619,9 @@ func (r *Resolver) handleReportIstioConnectionResults(ctx context.Context, resul
615619

616620
if dstService.OwnerObject != nil {
617621
dstSvcIdentity.PodOwnerKind = model.GroupVersionKindFromKubeGVK(dstService.OwnerObject.GetObjectKind().GroupVersionKind())
622+
if result.DstServiceName != "" {
623+
dstSvcIdentity.KubernetesService = &result.DstServiceName
624+
}
618625
}
619626

620627
intent := model.Intent{

src/shared/testbase/testsuitebase.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,47 @@ func (s *ControllerManagerTestSuiteBase) AddPod(name string, podIp string, label
132132
return podCopy
133133
}
134134

135+
func (s *ControllerManagerTestSuiteBase) AddPodWithHostNetwork(name, ip string, labels, annotations map[string]string, hostNetwork bool) *corev1.Pod {
136+
pod := &corev1.Pod{
137+
ObjectMeta: metav1.ObjectMeta{
138+
Name: name,
139+
Namespace: s.TestNamespace,
140+
Labels: labels,
141+
Annotations: annotations,
142+
},
143+
Spec: corev1.PodSpec{
144+
HostNetwork: hostNetwork,
145+
Containers: []corev1.Container{
146+
{
147+
Name: name,
148+
Image: "nginx",
149+
ImagePullPolicy: "Always",
150+
},
151+
},
152+
},
153+
Status: corev1.PodStatus{
154+
PodIP: ip,
155+
PodIPs: []corev1.PodIP{
156+
{IP: ip},
157+
},
158+
},
159+
}
160+
s.Require().NoError(s.Mgr.GetClient().Create(context.Background(), pod))
161+
162+
// Prevents race - UpdateStatus can alter the pod.
163+
podCopy := pod.DeepCopy()
164+
if ip != "" {
165+
pod.Status.PodIP = ip
166+
pod.Status.PodIPs = []corev1.PodIP{{IP: ip}}
167+
pod.Status.Phase = corev1.PodRunning
168+
pod.Status.DeepCopyInto(&podCopy.Status)
169+
_, err := s.K8sDirectClient.CoreV1().Pods(s.TestNamespace).UpdateStatus(context.Background(), pod, metav1.UpdateOptions{})
170+
s.Require().NoError(err)
171+
}
172+
s.waitForObjectToBeCreated(pod)
173+
return pod
174+
}
175+
135176
func (s *ControllerManagerTestSuiteBase) AddEndpoints(name string, pods []*corev1.Pod, port *int) *corev1.Endpoints {
136177
addresses := lo.Map(pods, func(pod *corev1.Pod, _ int) corev1.EndpointAddress {
137178
return corev1.EndpointAddress{IP: pod.Status.PodIP, TargetRef: &corev1.ObjectReference{Kind: "Pod", Name: pod.Name, Namespace: pod.Namespace}}

0 commit comments

Comments
 (0)