github.com/cilium/cilium@v1.16.2/pkg/hubble/parser/seven/dns_test.go (about)

     1  // SPDX-License-Identifier: Apache-2.0
     2  // Copyright Authors of Hubble
     3  
     4  package seven
     5  
     6  import (
     7  	"net"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/require"
    13  
    14  	flowpb "github.com/cilium/cilium/api/v1/flow"
    15  	"github.com/cilium/cilium/pkg/hubble/testutils"
    16  	"github.com/cilium/cilium/pkg/proxy/accesslog"
    17  	"github.com/cilium/cilium/pkg/u8proto"
    18  )
    19  
    20  func TestDecodeL7DNSRecord(t *testing.T) {
    21  	lr := &accesslog.LogRecord{
    22  		Type:                accesslog.TypeResponse,
    23  		Timestamp:           fakeTimestamp,
    24  		NodeAddressInfo:     fakeNodeInfo,
    25  		ObservationPoint:    accesslog.Ingress,
    26  		SourceEndpoint:      fakeDestinationEndpoint,
    27  		DestinationEndpoint: fakeSourceEndpoint,
    28  		IPVersion:           accesslog.VersionIPV6,
    29  		Verdict:             accesslog.VerdictForwarded,
    30  		TransportProtocol:   accesslog.TransportProtocol(u8proto.UDP),
    31  		ServiceInfo:         nil,
    32  		DropReason:          nil,
    33  		DNS: &accesslog.LogRecordDNS{
    34  			Query:             "deathstar.empire.svc.cluster.local.",
    35  			IPs:               []net.IP{net.ParseIP("1.2.3.4")},
    36  			TTL:               5,
    37  			ObservationSource: accesslog.DNSSourceProxy,
    38  			RCode:             0,
    39  			QTypes:            []uint16{1},
    40  			AnswerTypes:       []uint16{1},
    41  		},
    42  	}
    43  	lr.SourceEndpoint.Port = 53
    44  	lr.DestinationEndpoint.Port = 56789
    45  
    46  	dnsGetter := &testutils.NoopDNSGetter
    47  	ipGetter := &testutils.NoopIPGetter
    48  	serviceGetter := &testutils.NoopServiceGetter
    49  	endpointGetter := &testutils.NoopEndpointGetter
    50  
    51  	parser, err := New(log, dnsGetter, ipGetter, serviceGetter, endpointGetter)
    52  	require.NoError(t, err)
    53  
    54  	f := &flowpb.Flow{}
    55  	err = parser.Decode(lr, f)
    56  	require.NoError(t, err)
    57  
    58  	ts := f.GetTime().AsTime()
    59  	assert.Equal(t, fakeTimestamp, ts.Format(time.RFC3339Nano))
    60  
    61  	assert.Equal(t, fakeSourceEndpoint.IPv6, f.GetIP().GetDestination())
    62  	assert.Equal(t, uint32(56789), f.GetL4().GetUDP().GetDestinationPort())
    63  	assert.Equal(t, []string(nil), f.GetDestinationNames())
    64  	assert.Equal(t, fakeSourceEndpoint.Labels.GetModel(), f.GetDestination().GetLabels())
    65  	assert.Equal(t, "", f.GetDestination().GetNamespace())
    66  	assert.Equal(t, "", f.GetDestination().GetPodName())
    67  	assert.Equal(t, "", f.GetDestinationService().GetNamespace())
    68  	assert.Equal(t, "", f.GetDestinationService().GetName())
    69  
    70  	assert.Equal(t, fakeDestinationEndpoint.IPv6, f.GetIP().GetSource())
    71  	assert.Equal(t, uint32(53), f.GetL4().GetUDP().GetSourcePort())
    72  	assert.Equal(t, []string(nil), f.GetSourceNames())
    73  	assert.Equal(t, fakeDestinationEndpoint.Labels.GetModel(), f.GetSource().GetLabels())
    74  	assert.Equal(t, "", f.GetSource().GetNamespace())
    75  	assert.Equal(t, "", f.GetSource().GetPodName())
    76  	assert.Equal(t, "", f.GetSourceService().GetNamespace())
    77  	assert.Equal(t, "", f.GetSourceService().GetName())
    78  
    79  	assert.Equal(t, flowpb.Verdict_FORWARDED, f.GetVerdict())
    80  
    81  	assert.Equal(t, &flowpb.DNS{
    82  		Query:             "deathstar.empire.svc.cluster.local.",
    83  		Ips:               []string{"1.2.3.4"},
    84  		Ttl:               5,
    85  		ObservationSource: string(accesslog.DNSSourceProxy),
    86  		Rcode:             0,
    87  		Qtypes:            []string{"A"},
    88  		Rrtypes:           []string{"A"},
    89  	}, f.GetL7().GetDns())
    90  }