From 65258713c5103c0639bfa4127541e853c4877304 Mon Sep 17 00:00:00 2001 From: shireenf-ibm <82180114+shireenf-ibm@users.noreply.github.com> Date: Sun, 12 May 2024 12:14:23 +0300 Subject: [PATCH] exposure analysis with focus-workload (#349) * exposure analysis with focus-workload * focus-workload fixes * textual output enhancement (adding [] to strings with multiple words) * fix --- pkg/netpol/connlist/connlist.go | 41 +++-- pkg/netpol/connlist/connlist_test.go | 38 ++++ pkg/netpol/connlist/conns_formatter.go | 39 +++-- pkg/netpol/connlist/conns_formatter_dot.go | 8 +- ...rkload_backend_catalog_connlist_output.dot | 12 ++ ...ad_backend_catalog_connlist_output.dot.png | Bin 0 -> 17924 bytes ...ad_backend_catalog_connlist_output.dot.svg | 49 ++++++ ...rkload_backend_catalog_connlist_output.txt | 2 + ...rkload_frontend_webapp_connlist_output.dot | 26 +++ ...ad_frontend_webapp_connlist_output.dot.png | Bin 0 -> 51233 bytes ...ad_frontend_webapp_connlist_output.dot.svg | 113 ++++++++++++ ...rkload_frontend_webapp_connlist_output.txt | 12 ++ ...ad_ratings-v1-b6994bb9_connlist_output.dot | 29 ++++ ...atings-v1-b6994bb9_connlist_output.dot.png | Bin 0 -> 77981 bytes ...atings-v1-b6994bb9_connlist_output.dot.svg | 163 ++++++++++++++++++ ...ad_ratings-v1-b6994bb9_connlist_output.txt | 25 +++ ..._details-v1-79f774bdb9_connlist_output.dot | 14 ++ ...ails-v1-79f774bdb9_connlist_output.dot.png | Bin 0 -> 23635 bytes ...ails-v1-79f774bdb9_connlist_output.dot.svg | 62 +++++++ ..._details-v1-79f774bdb9_connlist_output.txt | 7 + ...lineboutique_workloads_connlist_output.txt | 8 +- ..._default_loadgenerator_connlist_output.dot | 17 ++ ...ault_loadgenerator_connlist_output.dot.png | Bin 0 -> 22700 bytes ...ault_loadgenerator_connlist_output.dot.svg | 54 ++++++ ..._default_loadgenerator_connlist_output.txt | 5 + ...o_all_pods_in_a_new_ns_connlist_output.txt | 2 +- ...lector_and_ns_selector_connlist_output.txt | 2 +- ...with_only_pod_selector_connlist_output.txt | 2 +- ...pod_selector_in_any_ns_connlist_output.txt | 2 +- ...posure_with_named_port_connlist_output.txt | 2 +- ...e_with_multiple_labels_connlist_output.txt | 2 +- ...hello-world_workload-a_connlist_output.dot | 16 ++ ...o-world_workload-a_connlist_output.dot.png | Bin 0 -> 32196 bytes ...o-world_workload-a_connlist_output.dot.svg | 76 ++++++++ ...hello-world_workload-a_connlist_output.txt | 14 ++ ...ltiple_unmatched_rules_connlist_output.txt | 6 +- ...onn_and_entire_cluster_connlist_output.txt | 2 +- ...o_representative_peers_connlist_output.txt | 4 +- ...rule_in_ingress_egress_connlist_output.txt | 4 +- 39 files changed, 810 insertions(+), 48 deletions(-) create mode 100644 test_outputs/connlist/exposure_acs-security-demos_focus_workload_backend_catalog_connlist_output.dot create mode 100644 test_outputs/connlist/exposure_acs-security-demos_focus_workload_backend_catalog_connlist_output.dot.png create mode 100644 test_outputs/connlist/exposure_acs-security-demos_focus_workload_backend_catalog_connlist_output.dot.svg create mode 100644 test_outputs/connlist/exposure_acs-security-demos_focus_workload_backend_catalog_connlist_output.txt create mode 100644 test_outputs/connlist/exposure_acs-security-demos_focus_workload_frontend_webapp_connlist_output.dot create mode 100644 test_outputs/connlist/exposure_acs-security-demos_focus_workload_frontend_webapp_connlist_output.dot.png create mode 100644 test_outputs/connlist/exposure_acs-security-demos_focus_workload_frontend_webapp_connlist_output.dot.svg create mode 100644 test_outputs/connlist/exposure_acs-security-demos_focus_workload_frontend_webapp_connlist_output.txt create mode 100644 test_outputs/connlist/exposure_k8s_ingress_test_focus_workload_ratings-v1-b6994bb9_connlist_output.dot create mode 100644 test_outputs/connlist/exposure_k8s_ingress_test_focus_workload_ratings-v1-b6994bb9_connlist_output.dot.png create mode 100644 test_outputs/connlist/exposure_k8s_ingress_test_focus_workload_ratings-v1-b6994bb9_connlist_output.dot.svg create mode 100644 test_outputs/connlist/exposure_k8s_ingress_test_focus_workload_ratings-v1-b6994bb9_connlist_output.txt create mode 100644 test_outputs/connlist/exposure_k8s_ingress_test_new_focus_workload_details-v1-79f774bdb9_connlist_output.dot create mode 100644 test_outputs/connlist/exposure_k8s_ingress_test_new_focus_workload_details-v1-79f774bdb9_connlist_output.dot.png create mode 100644 test_outputs/connlist/exposure_k8s_ingress_test_new_focus_workload_details-v1-79f774bdb9_connlist_output.dot.svg create mode 100644 test_outputs/connlist/exposure_k8s_ingress_test_new_focus_workload_details-v1-79f774bdb9_connlist_output.txt create mode 100644 test_outputs/connlist/exposure_onlineboutique_workloads_focus_workload_default_loadgenerator_connlist_output.dot create mode 100644 test_outputs/connlist/exposure_onlineboutique_workloads_focus_workload_default_loadgenerator_connlist_output.dot.png create mode 100644 test_outputs/connlist/exposure_onlineboutique_workloads_focus_workload_default_loadgenerator_connlist_output.dot.svg create mode 100644 test_outputs/connlist/exposure_onlineboutique_workloads_focus_workload_default_loadgenerator_connlist_output.txt create mode 100644 test_outputs/connlist/exposure_test_matched_and_unmatched_rules_focus_workload_hello-world_workload-a_connlist_output.dot create mode 100644 test_outputs/connlist/exposure_test_matched_and_unmatched_rules_focus_workload_hello-world_workload-a_connlist_output.dot.png create mode 100644 test_outputs/connlist/exposure_test_matched_and_unmatched_rules_focus_workload_hello-world_workload-a_connlist_output.dot.svg create mode 100644 test_outputs/connlist/exposure_test_matched_and_unmatched_rules_focus_workload_hello-world_workload-a_connlist_output.txt diff --git a/pkg/netpol/connlist/connlist.go b/pkg/netpol/connlist/connlist.go index e929dde7..1c76d304 100644 --- a/pkg/netpol/connlist/connlist.go +++ b/pkg/netpol/connlist/connlist.go @@ -363,7 +363,7 @@ func GetConnectionSetFromP2PConnection(c Peer2PeerConnection) *common.Connection ////////////////////////////////////////////////////////////////////////////////////////////// -func (ca *ConnlistAnalyzer) includePairOfWorkloads(pe *eval.PolicyEngine, src, dst eval.Peer) bool { +func (ca *ConnlistAnalyzer) includePairOfWorkloads(pe *eval.PolicyEngine, src, dst Peer) bool { if src.IsPeerIPType() && dst.IsPeerIPType() { return false } @@ -376,14 +376,12 @@ func (ca *ConnlistAnalyzer) includePairOfWorkloads(pe *eval.PolicyEngine, src, d if ca.exposureAnalysis && !ca.includePairWithRepresentativePeer(pe, src, dst) { return false } - if ca.focusWorkload == "" { - return true - } - // at least one of src/dst should be the focus workload + + // no focusworkload or at least one of src/dst should be the focus workload return ca.isPeerFocusWorkload(src) || ca.isPeerFocusWorkload(dst) } -func (ca *ConnlistAnalyzer) includePairWithRepresentativePeer(pe *eval.PolicyEngine, src, dst eval.Peer) bool { +func (ca *ConnlistAnalyzer) includePairWithRepresentativePeer(pe *eval.PolicyEngine, src, dst Peer) bool { isRepSrc := pe.IsRepresentativePeer(src) isRepDst := pe.IsRepresentativePeer(dst) // cases when at least one of the peers is representative peer; when not to include the peers pair: @@ -403,12 +401,15 @@ func (ca *ConnlistAnalyzer) includePairWithRepresentativePeer(pe *eval.PolicyEng return true } -func getPeerNsNameFormat(peer eval.Peer) string { +func getPeerNsNameFormat(peer Peer) string { return types.NamespacedName{Namespace: peer.Namespace(), Name: peer.Name()}.String() } -func (ca *ConnlistAnalyzer) isPeerFocusWorkload(peer eval.Peer) bool { - return !peer.IsPeerIPType() && (peer.Name() == ca.focusWorkload || getPeerNsNameFormat(peer) == ca.focusWorkload) +// isPeerFocusWorkload returns true if focus-workload flag is not used (each peer is included), +// or if the focus-workload is equal to peer's name +func (ca *ConnlistAnalyzer) isPeerFocusWorkload(peer Peer) bool { + return ca.focusWorkload == "" || + (!peer.IsPeerIPType() && (peer.Name() == ca.focusWorkload || getPeerNsNameFormat(peer) == ca.focusWorkload)) } func convertEvalPeersToConnlistPeer(peers []eval.Peer) []Peer { @@ -500,7 +501,7 @@ func (ca *ConnlistAnalyzer) existsFocusWorkload(peers []Peer, excludeIngressAnal // check if the focusworkload is in the peers for _, peer := range peers { - if ca.focusWorkload == peer.Name() || ca.focusWorkload == getPeerNsNameFormat(peer) { + if ca.isPeerFocusWorkload(peer) { return true, "" } } @@ -531,7 +532,7 @@ func (ca *ConnlistAnalyzer) getConnectionsBetweenPeers(pe *eval.PolicyEngine, pe return nil, nil, err } if ca.exposureAnalysis { - err = updatePeersGeneralExposureData(pe, srcPeer, dstPeer, ingressSet, egressSet, exposureMaps) + err = ca.updatePeersGeneralExposureData(pe, srcPeer, dstPeer, ingressSet, egressSet, exposureMaps) if err != nil { return nil, nil, err } @@ -641,7 +642,8 @@ func createConnectionObject(allowedConnections common.Connection, src, dst Peer) } // updatePeersGeneralExposureData updates src and dst connections to entire world/cluster on the exposures map -func updatePeersGeneralExposureData(pe *eval.PolicyEngine, src, dst Peer, ingressSet, egressSet map[Peer]bool, exMaps *exposureMaps) error { +func (ca *ConnlistAnalyzer) updatePeersGeneralExposureData(pe *eval.PolicyEngine, src, dst Peer, ingressSet, egressSet map[Peer]bool, + exMaps *exposureMaps) error { // when computing allowed conns between the peers,(even on first time) // if a workload peer is not protected by netpols this was definitely detected; // also exposure to entire cluster was definitely computed for src or/and dst (if its a workload peer) @@ -652,7 +654,7 @@ func updatePeersGeneralExposureData(pe *eval.PolicyEngine, src, dst Peer, ingres // (e.g. only one peer with one netpol exposing the peer to entire cluster, no netpols) var err error // 1. only on first time : add general exposure data for the src peer (on egress) - if !src.IsPeerIPType() && !pe.IsRepresentativePeer(src) && !egressSet[src] { + if ca.shouldAddPeerGeneralExposureData(pe, src, egressSet) { err = exMaps.addPeerGeneralExposure(pe, src, false) if err != nil { return err @@ -660,9 +662,20 @@ func updatePeersGeneralExposureData(pe *eval.PolicyEngine, src, dst Peer, ingres } egressSet[src] = true // 2. only on first time : add general exposure data for the dst peer (on ingress) - if !dst.IsPeerIPType() && !pe.IsRepresentativePeer(dst) && !ingressSet[dst] { + if ca.shouldAddPeerGeneralExposureData(pe, dst, ingressSet) { err = exMaps.addPeerGeneralExposure(pe, dst, true) } ingressSet[dst] = true return err } + +// shouldAddPeerGeneralExposureData returns whether should add given peer's general +// exposure data to the exposure results. +// returns true if : +// - the peer is not IP type +// - the peer is not representative peer +// - focus-workload flag is not used or the peer is the focus-workload +// - it is first time the peer is visited +func (ca *ConnlistAnalyzer) shouldAddPeerGeneralExposureData(pe *eval.PolicyEngine, peer Peer, xgressSet map[Peer]bool) bool { + return !peer.IsPeerIPType() && !pe.IsRepresentativePeer(peer) && !xgressSet[peer] && ca.isPeerFocusWorkload(peer) +} diff --git a/pkg/netpol/connlist/connlist_test.go b/pkg/netpol/connlist/connlist_test.go index bfef2314..79bef84f 100644 --- a/pkg/netpol/connlist/connlist_test.go +++ b/pkg/netpol/connlist/connlist_test.go @@ -760,6 +760,20 @@ var goodPathTests = []struct { exposureAnalysis: true, outputFormats: ExposureValidFormats, }, + { + testDirName: "acs-security-demos", + exposureAnalysis: true, + // test with focus-workload that appears in exposure-analysis result + focusWorkload: "frontend/webapp", + outputFormats: ExposureValidFormats, + }, + { + testDirName: "acs-security-demos", + exposureAnalysis: true, + // test with focus-workload that does not appear in exposure-analysis result + focusWorkload: "backend/catalog", + outputFormats: ExposureValidFormats, + }, { testDirName: "test_allow_all", exposureAnalysis: true, @@ -785,6 +799,12 @@ var goodPathTests = []struct { exposureAnalysis: true, outputFormats: ExposureValidFormats, }, + { + testDirName: "test_matched_and_unmatched_rules", + exposureAnalysis: true, + focusWorkload: "hello-world/workload-a", + outputFormats: ExposureValidFormats, + }, { testDirName: "test_only_matched_rules", exposureAnalysis: true, @@ -870,9 +890,27 @@ var goodPathTests = []struct { exposureAnalysis: true, outputFormats: ExposureValidFormats, }, + { + testDirName: "onlineboutique_workloads", + exposureAnalysis: true, + focusWorkload: "default/loadgenerator", + outputFormats: ExposureValidFormats, + }, { testDirName: "k8s_ingress_test_new", exposureAnalysis: true, outputFormats: ExposureValidFormats, }, + { + testDirName: "k8s_ingress_test_new", + exposureAnalysis: true, + focusWorkload: "details-v1-79f774bdb9", + outputFormats: ExposureValidFormats, + }, + { + testDirName: "k8s_ingress_test", + exposureAnalysis: true, + focusWorkload: "ratings-v1-b6994bb9", + outputFormats: ExposureValidFormats, + }, } diff --git a/pkg/netpol/connlist/conns_formatter.go b/pkg/netpol/connlist/conns_formatter.go index b6a97ce3..980cd8c5 100644 --- a/pkg/netpol/connlist/conns_formatter.go +++ b/pkg/netpol/connlist/conns_formatter.go @@ -74,8 +74,8 @@ func formExposureItemAsSingleConnFiled(peerStr string, exposureItem XgressExposu if exposureItem.IsExposedToEntireCluster() { return formSingleExposureConn(peerStr, entireCluster, exposureItem.PotentialConnectivity(), isIngress) } - repPeerStr := getRepresentativeNamespaceString(exposureItem.NamespaceLabels()) + "/" + - getRepresentativePodString(exposureItem.PodLabels()) + repPeerStr := getRepresentativeNamespaceString(exposureItem.NamespaceLabels(), true) + "/" + + getRepresentativePodString(exposureItem.PodLabels(), true) return formSingleExposureConn(peerStr, repPeerStr, exposureItem.PotentialConnectivity(), isIngress) } @@ -85,27 +85,42 @@ func convertLabelsMapToString(labelsMap map[string]string) string { } const ( - mapOpen = "{" - mapClose = "}" + stringInBrackets = "[%s]" + mapOpen = "{" + mapClose = "}" ) -// getRepresentativeNamespaceString returns a string representation of a potential peer with namespace labels -func getRepresentativeNamespaceString(nsLabels map[string]string) string { +// getRepresentativeNamespaceString returns a string representation of a potential peer with namespace labels. +// if namespace with multiple words adds [] , in case of textual (non-graphical) output +func getRepresentativeNamespaceString(nsLabels map[string]string, txtOutFlag bool) string { nsName, ok := nsLabels[common.K8sNsNameLabelKey] if len(nsLabels) == 1 && ok { return nsName } + res := "" if len(nsLabels) > 0 { - return "namespace with " + mapOpen + convertLabelsMapToString(nsLabels) + mapClose + res += "namespace with " + mapOpen + convertLabelsMapToString(nsLabels) + mapClose + } else { + res += allNamespacesLbl } - return allNamespacesLbl + if txtOutFlag { + return fmt.Sprintf(stringInBrackets, res) + } + return res } // getRepresentativePodString returns a string representation of potential peer with pod labels -// or all pods string for empty pod labels map (which indicates all pods) -func getRepresentativePodString(podLabels map[string]string) string { +// or all pods string for empty pod labels map (which indicates all pods). +// adds [] in case of textual (non-graphical) output +func getRepresentativePodString(podLabels map[string]string, txtOutFlag bool) string { + res := "" if len(podLabels) == 0 { - return allPeersLbl + res += allPeersLbl + } else { + res += "pod with " + mapOpen + convertLabelsMapToString(podLabels) + mapClose + } + if txtOutFlag { + return fmt.Sprintf(stringInBrackets, res) } - return "pod with " + mapOpen + convertLabelsMapToString(podLabels) + mapClose + return res } diff --git a/pkg/netpol/connlist/conns_formatter_dot.go b/pkg/netpol/connlist/conns_formatter_dot.go index 20ed2af6..73c564e9 100644 --- a/pkg/netpol/connlist/conns_formatter_dot.go +++ b/pkg/netpol/connlist/conns_formatter_dot.go @@ -150,17 +150,17 @@ func getXgressExposureEdges(exposedPeerStr string, xgressExpData []XgressExposur data.PotentialConnectivity().(*common.ConnectionSet))) continue // if a data contains exposure to entire cluster it does not specify labels } - nsRepLabel := getRepresentativeNamespaceString(data.NamespaceLabels()) - repPeerLabel := getRepresentativePodString(data.PodLabels()) + nsRepLabel := getRepresentativeNamespaceString(data.NamespaceLabels(), false) + repPeerLabel := getRepresentativePodString(data.PodLabels(), false) repPeersStr := repPeerLabel + "_in_" + nsRepLabel // to get a unique string name of the peer node if !representativeVisited[repPeersStr] { representativeVisited[repPeersStr] = true peerLine := getRepPeerLine(repPeersStr, repPeerLabel) // ns label maybe a name of an existing namespace, so check where to add the peer if _, ok := nsPeers[nsRepLabel]; ok { // in real ns - dotformatting.AddPeerToNsGroup(getRepresentativeNamespaceString(data.NamespaceLabels()), peerLine, nsPeers) + dotformatting.AddPeerToNsGroup(nsRepLabel, peerLine, nsPeers) } else { // in a representative ns - dotformatting.AddPeerToNsGroup(getRepresentativeNamespaceString(data.NamespaceLabels()), peerLine, nsRepPeers) + dotformatting.AddPeerToNsGroup(nsRepLabel, peerLine, nsRepPeers) } } xgressEdges = append(xgressEdges, getExposureEdgeLine(exposedPeerStr, repPeersStr, isIngress, diff --git a/test_outputs/connlist/exposure_acs-security-demos_focus_workload_backend_catalog_connlist_output.dot b/test_outputs/connlist/exposure_acs-security-demos_focus_workload_backend_catalog_connlist_output.dot new file mode 100644 index 00000000..93a4e6d3 --- /dev/null +++ b/test_outputs/connlist/exposure_acs-security-demos_focus_workload_backend_catalog_connlist_output.dot @@ -0,0 +1,12 @@ +digraph { + subgraph "cluster_backend" { + color="black" + fontcolor="black" + "backend/catalog[Deployment]" [label="catalog[Deployment]" color="blue" fontcolor="blue"] + "backend/recommendation[Deployment]" [label="recommendation[Deployment]" color="blue" fontcolor="blue"] + "backend/reports[Deployment]" [label="reports[Deployment]" color="blue" fontcolor="blue"] + label="backend" + } + "backend/recommendation[Deployment]" -> "backend/catalog[Deployment]" [label="TCP 8080" color="gold2" fontcolor="darkgreen"] + "backend/reports[Deployment]" -> "backend/catalog[Deployment]" [label="TCP 8080" color="gold2" fontcolor="darkgreen"] +} \ No newline at end of file diff --git a/test_outputs/connlist/exposure_acs-security-demos_focus_workload_backend_catalog_connlist_output.dot.png b/test_outputs/connlist/exposure_acs-security-demos_focus_workload_backend_catalog_connlist_output.dot.png new file mode 100644 index 0000000000000000000000000000000000000000..c5c1861c2ff4fc909ea60ff0237c3c3d424ecec3 GIT binary patch literal 17924 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

abjcqEGJ^(0-?ST2NhG z))dE2zgq?{j+}f$Z|GFP}`8gZ(4#29UbM5frSjh z2}A}iF84@2J|LTa^$H+60Kj9%!l4^Sql?N@{?v^+m~6BJZAufFV_P)N5DK50^HEB4 za}rm^Y;VUT=>5EqMFEFMO#}D%czhO^NiIZgQf*}|?!=jzmaUro3`PGgkraQa#?YG6 zO6DOXQu&PBU#FM$aN@_3sw*A(hGgmziMlhrr5OMa4+)N8#^3+2X&8 zCG1#5qB6bWg3-Nyq^3PXVe5T(2s_UADsl=6(2^3>FdVvT(cmE#z{!}Dq9OTZ zW}Z+_9~_{uveLg+rneCPVkjhJVI!$atfMnJ_ifXhi~DE8J~idp|Iz{wDkyj{ymRK_ zA?68$Sy%uLIg*i-_%y`?hd{+kke%&?Si?;Evm(V15j*TU@Na|D-Np3Y%@-BTkV1yv zYQGCt%Z?nk-lKLJU*8csF<&90Ld0Ge8oGaN8$fa7Yi_=dj`Hf?U~_i;S%PL`Giq@y z+w0==_3yEj#d{MI=##Lci=+$^bc@}aKapvrsiOmnOgObPFDBdGVTDoAv2p|J_I7mi zQ)|m6e`>0-j@3edn{%?#z$E^m*>8!wS6XiZ_0Zki>KoeTi2<*6;;)9>Kte`l@}$*J zg2qp(qmwoHvxQV&ACOtrjL!VOC$|qbi)`dj=H_lEjUy3kY#vnK^h_r$FRm=n$#2)a z>~yi8=Q73_PKVo9V%o$Bl+jDk=?8hV8om5dh2#Hj{PQg&yJC3MFQSA_mQ%|cv&ng_Fr@a_PWT2T{c9hj9O$(6Bi{KU_^E|&-jPgf9iH|V1Ep!taDhY#b3aaUMcZ@+;UT&%J=c! zqz;oX^~m}p^Q5Ovawh#!0w5#z+2u9$rV~>LQ(q;fE{QcYw5HGYM>2ILCtgM(=r9A9 zwS3T$)tQ{UC;U>AY8PlyEB?j74Tnu*#=qWVdyhHKvX-01CndrT!;XNGEv9TB*c&zo zR`qRj%Z)?*{^8!h$gn+$(h!U^N`F~x+Xh2E&16mMmS&^rrH#>HY#A~sDy4>#TZp{s z#@wl%-5yl0`RF{^zJJ7I?saw!)p{^JG|HQ0$<3qNXVl?_vVuzuuTpf|9;pI$!p(X5 zu_pggJ=Xfy)-MuGXo8ruM6a@n4=KLh!}PXinX85{bsR$dtq6@XF9a2S&*r{!6(^RH(&{;XL9YG>(xl z7qrbtH8OLhC-}K0X|d=?<@shG*u14RFHlN8uino29{>2hmQZfE%C4}Tg+wUaU$z#} zJLz-^m1Ge;Fq2Cu)!w#1TG{p_7O@f%Dv-Wt)V)So`Z%I2@P-2cP}6P_*mhqRlH`}i z3~Imc2n3;rM7T9h1(s~t9@d|t6xcNyTZQRv9~F?|5E27hq>ZQ9zAj|69)^=9X#{FF z)?{Gbt+Cc5GGR7dd(x$!hWdoC)WlUlPWO0e9Wtq+=X0!uMhotJ#d^fLNvq^aP9b(Q zWFLdjzhM&R+&Oi#;@^~H#8=LtSVx+a%SucKSfRB-#CWa-2fE6g5iAVm2SGX?Du=WMgGRNo5*&Uaj@=y{ zsI?GJ&RV}t!I5JZ*I}uKY^kXiXwjXjB1DiylP0b&dLy^;8VsOX{K=S=Ge5u&zyU9zgOT3%;znUxY9b3Yx4R$MvsLCGe=D?^JiI)V4#B9QeN*_PI0!J&2ZlbkXxs-e28Y z^-daH!KBMRvbopXntXzt_$txLfb!^zIc5&QMEPwT(*|Z3@m`57)E%n1N*N|y2|n(> zql4kBAv`gy&V-_KM0P?K+bR9ryn*vW0;=LZ-^mkA22b7dEGv1mlxDol**%4|NU;Q;?AzUK%hY_U{e6Xz#!Vs|aEU6GK1&;0oNsI*vLzj&rBqH$)9Yrx^v0oR=<->bBB{<>VCa zW=lkLy$7tSL}4=OAHu5Ft7DbkU9#&db==wddY#T~8UJwovtSMvgZ?JZLOKjeuT9LpcA^B%h(qW<% zH4}rfP2!>1f+4zJTH#7j(9hdS(6@w{j*gDSL&@I_!*HuhLUa@xUG)0umyq((bhtn1 z79Xk+3qMJnP0?5bw$5evdd3mPoZ5uBUYkDcyH@!9z>S`-ZQy{7SBTIg zLEavN4Ya=U2C+JUWpA%l0{WKni`Gp-DHNNr-hJroNAko(c}vr!dN?(`p*lK8L%V)k zqq`=6_wGI>PtrTSLsbI<+#lpx5W#FQojF4`eJZ5ZbAt96G=#m-gZUX=;W745oV zcJ!4G4npP+;uX-%u%T!XHM~(fU4opcENFfaH-va0wtDp{iv<~H{XgzS)-}1*e?J1+ zdND*6Bc;3hVo)Ics`Eez)w8f7c*lci>8P+D?wl<4i5kTRnd%h}#OI?}a7dJ4*rcf_ zA=rxc>MIqCW(AtD>$_P4xh&b8Zg(wVQdx!)y>(#(`LD+IA{%a6hX~I&H=8-Oye__` zgh%XIp3KmLfrXS$#93W(r#qr>q$a$v3zdrX(#AWjrffhbeaM3(gEcC+L+BJ&^9fOa zWvR?siJ*VDm7!8*I5dM(_$`{Wy>4Ah|T9sYrcU z_aMPNrs*$#9PADcZ71r6CWjtX!PdI3+`^mMB$i2Qpb>3!-c^Ocjl`{uv{0BLfUYV3*!6X%!r|jZ42@#>aw8~`AkPCx@`g54%Vdt0?`nFM{ z-9_o;5)I9=r|Dacgp+eeGpCJ@nSvL`KSCO!gX1Id@XoW7m72pkl=4FkVz*Ytq`e{cr?B&tusIw({66unYD~8)>2Pq7*tWKxR zQLt+J`{hKhroA5hd32kB)!|JOYFbuwMCc3NiE903+q^Fgy##0(MfH3ZMRd zd`j#zN$r6=xtyf(G&^qd(5}r6rweG7=$NT@|GJm`B3`sK;p5PtyIpmNl@=5gq}Nd` zghuYH{-8n=*BAt)K)DYp8Aib2SVER{TQP~w7=?-20kv3m!#8zje&Nj%1CLt4&n&nvrvyn zOY6CT#ILkuiSF_^{68E5Ej`ujT-2cyaqjLC4}mN-*i^iYA|W$BW~eVs!g~H*R_5L= z6^S8ovRLR|)n&--6y63hZGSi_=&He^eBg z71g&mTYB~h8EY3`{XIL3_04vbhw#4YFY9EHzz!0$#n`j9fnMX3lVx`h1}2vle7teq zYbfy0Z_!*e`l^?qg+~qI159f0d4tZU-9SSK9W#_X!(%4rtH|rxFx~^^-qoftJ+3H)C!!)ky52ASASA=RL@T#M% z*eQp@<}h&X98Xe@_)c=74~x)Ndj*sx)`22C0ppT6oMLmWXLn z_Mvs%+P#7ax7{yxmt{h8Msru&wwEH$v)(OybW(Z{p&^@S!G`7&hrc4k1rC>vfqzh4 zcFJAr$Dy(eRTK3^A)G$6%3YW3r3aIiH%4Zc&oW61Z&srbVmb6=pgZlL8k6+{dE%WbL#C~e zFUonk!N=CCAJy@5>{uMKK!=P@8|VJD>nKQO!Jsx`N8q}(xU9<9+jEC1?+BZVU$kP$ z+O6hs9(cX%*BZ;ITDA!l1eF}zg9TO6`!di?9tj`}_uolwEqWMN@+7Y1OqZJfLGA3^ zUhk^8=Tw<>;jGC>Y4UQ?hzh3S%TKRUTm3z^^nOFI0_Un985Ltto&RlNaki-KagOw` zS-c3obopV$n6Ye7yU^v7cl8$q3?-}&>rtrDn8tKqt7g+%uM#p|8nbFW+`Gq;M}(0t z+hf|_yH?pA{Svm*G%t5_Q0U?MkD{fvwraI+3Z*LR=rq-_(`j6>f~o%m3tMa-a>|G$ zWjNhX+W$0uWnkt}QcD>okVpn=SQUZjH2-)pNqtGZ~EVzYt1@UXF4dt%qGdhal+H9fg}#qEo*O&RB` zQH)41$XbKfgdhkT3W@supQ?ngoD1%wFO2%V=jr#BD~|-{LXl6-?#i{(&(VP^%2SW1 zeEuHqtp1(mTJDr(mvccvOhx1=qXQQRBGoDgK2gQy_JpwONAJ2ED%+ipTea>M_ij(i z(d-uXn|hRJj$>rRyMEKBLwZd_*(v%wGUMyJ2G$%~^48@9&0&A~GiJ9+7fgCl%Y5Mm zad_d{>cggY3Yq-TZqniE*KkZxEHM&rIjrDtuUbvjR*;oeSVLrJc6j91$8$VBX4Ol{ zF6%CWWR0D9<`4Ay(O&6em4Pnfdo2iN2&lDyqj9{@Es$wlC%Z_LS$)~DW1Kf()%y2} z9zN2BSIf}ab4SQSzp6`a0EWPMQ9X@>1ea0*6LjsUgsS!^zocV>Zm(3V3UV>oq3@zk5Lpw0e&RKQS&6u|GoQ{0IRL?S6TfIWWUQ`e)Eyc(% zMe~^!gLFv$PUVbRGgb{E+}~l>c{nCVt+EhZ)aYzj_p`*d;FZ-o zpr)P*28!ZZB9Ypf>=Nd@Tv|Fx^EFP42lMXlCRePtBfhQL2mh3xmDz1WXorU}13>TG zK=R+}-;<3!lxNTl2?@aL3j$9I^VjSY0b0l{cz!agv?nr&?o0ctu}t8PdOFed-G643 z5TsBLrW9n5{hiEiBx1lVER6VCo!vIGIQiu3ASiUhv~hqI6riNGvZ73%rTm^M#iilO zVt(Uc6!8*ra?%%f*4|*AjC>nu(|0gusu>;n=RF)eB^7L2 zTWF{s{zDKW<=QI{?9imA1C|CC7reZC_q$-l$x5G;h&VC_9-fj76CkHoJ)L3o7aBm! zOyPIb;R2vBu3w0Fi)gMr)mS2Pz4i<F^6%wQf97BjSOmHwQ7Q&Kr<-LVs$rEJYHG)`-#yEq zmv-Ag(T*Z+N+Tu?*eoEYCbaZ&t2rQ4-fC6sBMp$2`sVjtRO(~FHMQr&)mo2=deEHC z`Na!AJwO0-b{_9=^AiF2Z*)jnT3})jrm>S^%LCQr)I^|MlKl#7|A51zAdBAn53l(7 zVg3xE0ljskq$7vVDNbiMPz%Su5zWTr-yVCzOVHMq%stdjQG%yg_Vd4Vz|vp&SoHqj z8)p54^$>yq0_p$K3kMyAh7qogiBL*>`fk{hbn5u}nG%qc08R%daaHWN zxZ8{3f)&og6iz_j0Abj$qD-!g?5fiNAdzm&`E%t%tFnf6wI*i6KIQ`*EYQ0xx>a$aVbrI1E+CBP>PWA@y)al z%hGyzJ6tUSW|m0@5{i@^NUhj0PmF>Oq+>AK+kf1ajh2PIZr>Vwg*Pw&%1I1CKeK^< zE0oSzkO=+nhSHG%uz-4`Lrh2jTvoJT0IeLGH6BeIv65Ujr;-v-4Vn$W0IesW0nbKG z{sjU`H6u#BsN9|1lp{Nb#&j_Ies^C-=XlApx4*qBJed~@LkOZ?#I!8`p%<;I8)!iQ zI~|Mw3~+Qjp2%#UCoa-hnTB?Me=F7_-Af?$q_oxiE&OD_5HRk5R`@=ql8KU9@@BFDFi#adK&J_q1_Lr#+2bO^ zv8PhZCY-Qx(^r>=T|p>-mMPW`*RDE#xDpGI?6r`(nbh8PcE2&}>;V$u<32iGM>xP4 zpKRZF@9xE>N1mU@CQ@S)8eWT%u*XU zt2o%|)xl$;`QZbQI2-zeP2|VM1qgZW3rmZ2ll7Oi3wYu=ZNATG>x&1XoF6AQ6(JbQ z?mz05YX^!617*A1oSp)P34l6wzHV(LB=RYhN6_`#Y;ExA#(dv+uGdGubLTJfZ?p&? z5vtz};azvI@tEFw2}Y4}`ero6k6M&_H^salctlw|o_6o+bHCDu(Q2APkggb(KV~&# z>5(R1QSxnP^$ojP#^=BmlOpXe6WcxLI^75jYr{AEGe7TeHfa%)K9p(wZqdt0*QxX= zPvL%SC6W1_P_5&gNO;boJ&Spc_Z{>2#7%rl2QMlba(ggZ@4%j$yQX1ui7q8Jpq`g~ z2Cn)B*2>Bq*~<*0D=V{oIQ2g1r38PRAQ2xS_vJF^92!{r-1cxnuK9gsjY2dvAtqy3 ziQ{+xzmxnaR3R-U*8gKZT)2PCSjhh!4GM)mCVX`-|As6*!owVCW`4RzNchnBB2Se) zH|_-!b>I;O+r&Gw(45@diejd2f{z7SIz&J*YV}Tpo+s%AlSn3ex9k2ty7jzwjGe}P zBsGo83k?nXGi?MWi0Ev7xVVIJo13{BXKhJ|I`~dLKG3g(Qkzn1$Zr{TdEW3ySC#b| z#{^?DDRP_xx#YPAx36%T(0n#0ZRgkZ^>wW@_P0=E%W;}oqrjZc{TrMK-=2~)N5;pm z4+rH3(p;)aZj`0g;zD-xV1&z1nJ_=;)@qS)$tYDlE;y#3uU--l=5554cFm%Zoh34( zev-|t_#uk7@&HS0u}MxW0oFC!u-q@aW6Y<2tP3n3-kCGm2vd1F6YZ~RDK4>WA1jjG^e#~|2qYa zL4N9&FqKs={+(OG%v5e5IFW=}&wfwo^Ib>YA|fC*&>$4tTsJi}{j|t$!8K}OzcX(C z*y6P=iY!ADkV&2j^5Vc4m4MTtPwgF)v8Yp1-HP?Udd=Q(&dvfYwq0vjeSMoOLBGX< z-XIZ+gC*{JM-E3P75$;Qn7N9V#5_7xs4#v3urT#!!#+YG*WN@_?C;zMgAdDE+gCc= z&&RT*t%grT8Wo&f0f&5RZ6p@_4O~i4$YCq}dP{^<$dD!c%X~Nallp(OZ=sh%2HG#M-i$+Kf0I{O40C}i3`p7IcVmK{i+cX z{*M!H%Jc-(#Z7cdp{jkdayQv}Cgi11*)ATGO5Rl2Njq#nKlu)LF90pw+PwcX1t-Tf zJEDR1dTAhR_hye?ny&at@CFBCe3Nj$i<3?4U#r9v%jREJ>VqVuWAQ5t#g>$M?&f9& zM>&=;=ClNf)2m5#xA6R`-a;to=6llu&Up}C469|XTfq~!vs2@IMLy>|2Hb(cb>cFj zIL4+a2pwlUIVE+Vl1kn~8BeNqAgL{jws!Zqd2dw2Mbq0ZuCB_x>T`Bao7wi|eq*VE z^`rsJhHSVFlB&vxSS{QtQ5_v9>yWWr?w)rw!TP`WWbd0iPM73MS8g|!G~U>nYF=Al zL4wh`CRSCRcUOM`
dngK<`iM1GwaI*nWb5}X%oU}ofxuJe^Er8-ACnvd zNYv?P$|s|3Q2tsR?^m^pXpL)U`eJsLF7wmfrB5^}6JrNZ(OYgfiwAfAp}wc{Q%Jj}d##~C zq^lNbGdbyg`eDHd!?p#NPVv*JY4%Gh(`v8-zm}j9eBc`X0pcp79aZoF7ClVH?N4B+fWXOa5s2fKTCV@S1hodo zXH`ceuL$F}Z;K{o>o7(HL7WMSG(fbn;8ivHBGy4Xw_V`q-$C8jY?#O+mXZisiu`sm zk^{Q)g9{VTFXbz(rMuZ5lGrxD7ZmjN`D-vbYnjS3(*MbcreZ+0YxW0vu&(gy#UuI# zY!0gLhUu~4C_ax)uklv@i9&)`+YqrxBO{3&Rw1LYu@$+EL{E265U?-cK!XLq^8&J; zp9|o{shHU<^5|crc``27{j@*}K_%YM%m*u|@WbmQR+9rA5Gnvq;n1x%Y}s!{fR@IJ zTgmKNf%5$xmrXByg-f1r!^Eh85yZSXeJgBYkI(-!v zk3}AxpV^%uw7vhDUzmev`+}bS&j72*qZcG-2UIBR*&vI5PS#~yX zoRUzG=TT5d$g??lfQ1TWehQ9|s&3UBN0uhoFfs3}$kG<^3O z?-)^hZ*lbWL43S9-1UPGj8t~^Y9rFB)HD^XP#ik@eS#=bATJRV0!fR{?MG1Tayh@U z^VT^O5+MSDW26cKP|cEN2dZjd>^G2sbgRPTdXpGPk8W?XlqvWKpX>QRQJ;)#fEt7I zsA)Zr>!`$@bP1s{3X&8QTpvA2Suv=p{u4_`!xUA)B}p?j#>5E>A%pdcLjNHY{*wxf zh-(M1VU)7eHv*{_4b5@cwR>mJ#Et3aztbV#kbw@Vo**|D2(4zTl#3|wOvY(`{rdFa z@#_}_Ej%TqSdT0cJ0MT@&(1qRA>Y%>=^bUAZ$GJk_A?F}bZ-AZ_Jk-?H{?}lw6rnR z>MAB_XlaQpnJe`!e%QL`VOEd^^H{QSYcrg9#&l42agGi zAglGf1ZI_#+#?+xf}GNVzP$rfSRLE93OuK`NJs?J({5?0qkkdYQo_+wQ$HJ1k4g*J z51W7s+uWOrBeE&g@r)2yK4pF z@n`AG_QAWTor6d}7&y2;%bC6oivUMB4M@TV<-=<)Sy_8GhJ9G`6hmsctE;n0B7H%z zZZ13#8WB;%?Dstjs{jMLAKbhIl$4>N?@eho2Uo5nQ9WslJvvb+Ol@N zF=3RH9VMBAuaOT7+(b=H`B)}X#}Z7GJS$~X-wHls8H=R0wlRJGR$gdou9dv8wcSLk z)YJR7F + + + + + + + +cluster_backend + +backend + + + +backend/catalog[Deployment] + +catalog[Deployment] + + + +backend/recommendation[Deployment] + +recommendation[Deployment] + + + +backend/recommendation[Deployment]->backend/catalog[Deployment] + + +TCP 8080 + + + +backend/reports[Deployment] + +reports[Deployment] + + + +backend/reports[Deployment]->backend/catalog[Deployment] + + +TCP 8080 + + + diff --git a/test_outputs/connlist/exposure_acs-security-demos_focus_workload_backend_catalog_connlist_output.txt b/test_outputs/connlist/exposure_acs-security-demos_focus_workload_backend_catalog_connlist_output.txt new file mode 100644 index 00000000..6be687c7 --- /dev/null +++ b/test_outputs/connlist/exposure_acs-security-demos_focus_workload_backend_catalog_connlist_output.txt @@ -0,0 +1,2 @@ +backend/recommendation[Deployment] => backend/catalog[Deployment] : TCP 8080 +backend/reports[Deployment] => backend/catalog[Deployment] : TCP 8080 \ No newline at end of file diff --git a/test_outputs/connlist/exposure_acs-security-demos_focus_workload_frontend_webapp_connlist_output.dot b/test_outputs/connlist/exposure_acs-security-demos_focus_workload_frontend_webapp_connlist_output.dot new file mode 100644 index 00000000..9547ce51 --- /dev/null +++ b/test_outputs/connlist/exposure_acs-security-demos_focus_workload_frontend_webapp_connlist_output.dot @@ -0,0 +1,26 @@ +digraph { + subgraph "cluster_backend" { + color="black" + fontcolor="black" + "backend/checkout[Deployment]" [label="checkout[Deployment]" color="blue" fontcolor="blue"] + "backend/recommendation[Deployment]" [label="recommendation[Deployment]" color="blue" fontcolor="blue"] + "backend/reports[Deployment]" [label="reports[Deployment]" color="blue" fontcolor="blue"] + "backend/shipping[Deployment]" [label="shipping[Deployment]" color="blue" fontcolor="blue"] + label="backend" + } + subgraph "cluster_frontend" { + color="black" + fontcolor="black" + "frontend/webapp[Deployment]" [label="webapp[Deployment]" color="blue" fontcolor="blue"] + label="frontend" + } + "entire-cluster" [label="entire-cluster" color="red2" fontcolor="red2" shape=diamond] + "{ingress-controller}" [label="{ingress-controller}" color="blue" fontcolor="blue"] + "entire-cluster" -> "frontend/webapp[Deployment]" [label="TCP 8080" color="gold2" fontcolor="darkgreen"] + "frontend/webapp[Deployment]" -> "backend/checkout[Deployment]" [label="TCP 8080" color="gold2" fontcolor="darkgreen"] + "frontend/webapp[Deployment]" -> "backend/recommendation[Deployment]" [label="TCP 8080" color="gold2" fontcolor="darkgreen"] + "frontend/webapp[Deployment]" -> "backend/reports[Deployment]" [label="TCP 8080" color="gold2" fontcolor="darkgreen"] + "frontend/webapp[Deployment]" -> "backend/shipping[Deployment]" [label="TCP 8080" color="gold2" fontcolor="darkgreen"] + "frontend/webapp[Deployment]" -> "entire-cluster" [label="UDP 5353" color="gold2" fontcolor="darkgreen"] + "{ingress-controller}" -> "frontend/webapp[Deployment]" [label="TCP 8080" color="gold2" fontcolor="darkgreen"] +} \ No newline at end of file diff --git a/test_outputs/connlist/exposure_acs-security-demos_focus_workload_frontend_webapp_connlist_output.dot.png b/test_outputs/connlist/exposure_acs-security-demos_focus_workload_frontend_webapp_connlist_output.dot.png new file mode 100644 index 0000000000000000000000000000000000000000..b4067d6fd6747608bb07b15dc4f9d0de707f5760 GIT binary patch literal 51233 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 + + + + + + + +cluster_backend + +backend + + +cluster_frontend + +frontend + + + +backend/checkout[Deployment] + +checkout[Deployment] + + + +backend/recommendation[Deployment] + +recommendation[Deployment] + + + +backend/reports[Deployment] + +reports[Deployment] + + + +backend/shipping[Deployment] + +shipping[Deployment] + + + +frontend/webapp[Deployment] + +webapp[Deployment] + + + +frontend/webapp[Deployment]->backend/checkout[Deployment] + + +TCP 8080 + + + +frontend/webapp[Deployment]->backend/recommendation[Deployment] + + +TCP 8080 + + + +frontend/webapp[Deployment]->backend/reports[Deployment] + + +TCP 8080 + + + +frontend/webapp[Deployment]->backend/shipping[Deployment] + + +TCP 8080 + + + +entire-cluster + +entire-cluster + + + +frontend/webapp[Deployment]->entire-cluster + + +UDP 5353 + + + +entire-cluster->frontend/webapp[Deployment] + + +TCP 8080 + + + +{ingress-controller} + +{ingress-controller} + + + +{ingress-controller}->frontend/webapp[Deployment] + + +TCP 8080 + + + diff --git a/test_outputs/connlist/exposure_acs-security-demos_focus_workload_frontend_webapp_connlist_output.txt b/test_outputs/connlist/exposure_acs-security-demos_focus_workload_frontend_webapp_connlist_output.txt new file mode 100644 index 00000000..6097ddd4 --- /dev/null +++ b/test_outputs/connlist/exposure_acs-security-demos_focus_workload_frontend_webapp_connlist_output.txt @@ -0,0 +1,12 @@ +frontend/webapp[Deployment] => backend/checkout[Deployment] : TCP 8080 +frontend/webapp[Deployment] => backend/recommendation[Deployment] : TCP 8080 +frontend/webapp[Deployment] => backend/reports[Deployment] : TCP 8080 +frontend/webapp[Deployment] => backend/shipping[Deployment] : TCP 8080 +{ingress-controller} => frontend/webapp[Deployment] : TCP 8080 + +Exposure Analysis Result: +Egress Exposure: +frontend/webapp[Deployment] => entire-cluster : UDP 5353 + +Ingress Exposure: +frontend/webapp[Deployment] <= entire-cluster : TCP 8080 diff --git a/test_outputs/connlist/exposure_k8s_ingress_test_focus_workload_ratings-v1-b6994bb9_connlist_output.dot b/test_outputs/connlist/exposure_k8s_ingress_test_focus_workload_ratings-v1-b6994bb9_connlist_output.dot new file mode 100644 index 00000000..5a522bf6 --- /dev/null +++ b/test_outputs/connlist/exposure_k8s_ingress_test_focus_workload_ratings-v1-b6994bb9_connlist_output.dot @@ -0,0 +1,29 @@ +digraph { + subgraph "cluster_default" { + color="black" + fontcolor="black" + "default/details-v1-79f774bdb9[ReplicaSet]" [label="details-v1-79f774bdb9[ReplicaSet]" color="blue" fontcolor="blue"] + "default/productpage-v1-6b746f74dc[ReplicaSet]" [label="productpage-v1-6b746f74dc[ReplicaSet]" color="blue" fontcolor="blue"] + "default/ratings-v1-b6994bb9[ReplicaSet]" [label="ratings-v1-b6994bb9[ReplicaSet]" color="blue" fontcolor="blue"] + "default/reviews-v1-545db77b95[ReplicaSet]" [label="reviews-v1-545db77b95[ReplicaSet]" color="blue" fontcolor="blue"] + "default/reviews-v2-7bf8c9648f[ReplicaSet]" [label="reviews-v2-7bf8c9648f[ReplicaSet]" color="blue" fontcolor="blue"] + "default/reviews-v3-84779c7bbc[ReplicaSet]" [label="reviews-v3-84779c7bbc[ReplicaSet]" color="blue" fontcolor="blue"] + label="default" + } + "0.0.0.0-255.255.255.255" [label="0.0.0.0-255.255.255.255" color="red2" fontcolor="red2"] + "entire-cluster" [label="entire-cluster" color="red2" fontcolor="red2" shape=diamond] + "0.0.0.0-255.255.255.255" -> "default/ratings-v1-b6994bb9[ReplicaSet]" [label="All Connections" color="gold2" fontcolor="darkgreen"] + "default/details-v1-79f774bdb9[ReplicaSet]" -> "default/ratings-v1-b6994bb9[ReplicaSet]" [label="All Connections" color="gold2" fontcolor="darkgreen"] + "default/productpage-v1-6b746f74dc[ReplicaSet]" -> "default/ratings-v1-b6994bb9[ReplicaSet]" [label="All Connections" color="gold2" fontcolor="darkgreen"] + "default/ratings-v1-b6994bb9[ReplicaSet]" -> "0.0.0.0-255.255.255.255" [label="All Connections" color="gold2" fontcolor="darkgreen"] + "default/ratings-v1-b6994bb9[ReplicaSet]" -> "default/details-v1-79f774bdb9[ReplicaSet]" [label="All Connections" color="gold2" fontcolor="darkgreen"] + "default/ratings-v1-b6994bb9[ReplicaSet]" -> "default/productpage-v1-6b746f74dc[ReplicaSet]" [label="All Connections" color="gold2" fontcolor="darkgreen"] + "default/ratings-v1-b6994bb9[ReplicaSet]" -> "default/reviews-v1-545db77b95[ReplicaSet]" [label="All Connections" color="gold2" fontcolor="darkgreen"] + "default/ratings-v1-b6994bb9[ReplicaSet]" -> "default/reviews-v2-7bf8c9648f[ReplicaSet]" [label="All Connections" color="gold2" fontcolor="darkgreen"] + "default/ratings-v1-b6994bb9[ReplicaSet]" -> "default/reviews-v3-84779c7bbc[ReplicaSet]" [label="All Connections" color="gold2" fontcolor="darkgreen"] + "default/ratings-v1-b6994bb9[ReplicaSet]" -> "entire-cluster" [label="All Connections" color="gold2" fontcolor="darkgreen"] + "default/reviews-v1-545db77b95[ReplicaSet]" -> "default/ratings-v1-b6994bb9[ReplicaSet]" [label="All Connections" color="gold2" fontcolor="darkgreen"] + "default/reviews-v2-7bf8c9648f[ReplicaSet]" -> "default/ratings-v1-b6994bb9[ReplicaSet]" [label="All Connections" color="gold2" fontcolor="darkgreen"] + "default/reviews-v3-84779c7bbc[ReplicaSet]" -> "default/ratings-v1-b6994bb9[ReplicaSet]" [label="All Connections" color="gold2" fontcolor="darkgreen"] + "entire-cluster" -> "default/ratings-v1-b6994bb9[ReplicaSet]" [label="All Connections" color="gold2" fontcolor="darkgreen"] +} \ No newline at end of file diff --git a/test_outputs/connlist/exposure_k8s_ingress_test_focus_workload_ratings-v1-b6994bb9_connlist_output.dot.png b/test_outputs/connlist/exposure_k8s_ingress_test_focus_workload_ratings-v1-b6994bb9_connlist_output.dot.png new file mode 100644 index 0000000000000000000000000000000000000000..c06fa245712a5bd2441252548338ccdf83a25e26 GIT binary patch literal 77981 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 + + + + + + + +cluster_default + +default + + + +default/details-v1-79f774bdb9[ReplicaSet] + +details-v1-79f774bdb9[ReplicaSet] + + + +default/ratings-v1-b6994bb9[ReplicaSet] + +ratings-v1-b6994bb9[ReplicaSet] + + + +default/details-v1-79f774bdb9[ReplicaSet]->default/ratings-v1-b6994bb9[ReplicaSet] + + +All Connections + + + +default/productpage-v1-6b746f74dc[ReplicaSet] + +productpage-v1-6b746f74dc[ReplicaSet] + + + +default/productpage-v1-6b746f74dc[ReplicaSet]->default/ratings-v1-b6994bb9[ReplicaSet] + + +All Connections + + + +default/ratings-v1-b6994bb9[ReplicaSet]->default/details-v1-79f774bdb9[ReplicaSet] + + +All Connections + + + +default/ratings-v1-b6994bb9[ReplicaSet]->default/productpage-v1-6b746f74dc[ReplicaSet] + + +All Connections + + + +default/reviews-v1-545db77b95[ReplicaSet] + +reviews-v1-545db77b95[ReplicaSet] + + + +default/ratings-v1-b6994bb9[ReplicaSet]->default/reviews-v1-545db77b95[ReplicaSet] + + +All Connections + + + +default/reviews-v2-7bf8c9648f[ReplicaSet] + +reviews-v2-7bf8c9648f[ReplicaSet] + + + +default/ratings-v1-b6994bb9[ReplicaSet]->default/reviews-v2-7bf8c9648f[ReplicaSet] + + +All Connections + + + +default/reviews-v3-84779c7bbc[ReplicaSet] + +reviews-v3-84779c7bbc[ReplicaSet] + + + +default/ratings-v1-b6994bb9[ReplicaSet]->default/reviews-v3-84779c7bbc[ReplicaSet] + + +All Connections + + + +0.0.0.0-255.255.255.255 + +0.0.0.0-255.255.255.255 + + + +default/ratings-v1-b6994bb9[ReplicaSet]->0.0.0.0-255.255.255.255 + + +All Connections + + + +entire-cluster + +entire-cluster + + + +default/ratings-v1-b6994bb9[ReplicaSet]->entire-cluster + + +All Connections + + + +default/reviews-v1-545db77b95[ReplicaSet]->default/ratings-v1-b6994bb9[ReplicaSet] + + +All Connections + + + +default/reviews-v2-7bf8c9648f[ReplicaSet]->default/ratings-v1-b6994bb9[ReplicaSet] + + +All Connections + + + +default/reviews-v3-84779c7bbc[ReplicaSet]->default/ratings-v1-b6994bb9[ReplicaSet] + + +All Connections + + + +0.0.0.0-255.255.255.255->default/ratings-v1-b6994bb9[ReplicaSet] + + +All Connections + + + +entire-cluster->default/ratings-v1-b6994bb9[ReplicaSet] + + +All Connections + + + diff --git a/test_outputs/connlist/exposure_k8s_ingress_test_focus_workload_ratings-v1-b6994bb9_connlist_output.txt b/test_outputs/connlist/exposure_k8s_ingress_test_focus_workload_ratings-v1-b6994bb9_connlist_output.txt new file mode 100644 index 00000000..8c2be6bb --- /dev/null +++ b/test_outputs/connlist/exposure_k8s_ingress_test_focus_workload_ratings-v1-b6994bb9_connlist_output.txt @@ -0,0 +1,25 @@ +0.0.0.0-255.255.255.255 => default/ratings-v1-b6994bb9[ReplicaSet] : All Connections +default/details-v1-79f774bdb9[ReplicaSet] => default/ratings-v1-b6994bb9[ReplicaSet] : All Connections +default/productpage-v1-6b746f74dc[ReplicaSet] => default/ratings-v1-b6994bb9[ReplicaSet] : All Connections +default/ratings-v1-b6994bb9[ReplicaSet] => 0.0.0.0-255.255.255.255 : All Connections +default/ratings-v1-b6994bb9[ReplicaSet] => default/details-v1-79f774bdb9[ReplicaSet] : All Connections +default/ratings-v1-b6994bb9[ReplicaSet] => default/productpage-v1-6b746f74dc[ReplicaSet] : All Connections +default/ratings-v1-b6994bb9[ReplicaSet] => default/reviews-v1-545db77b95[ReplicaSet] : All Connections +default/ratings-v1-b6994bb9[ReplicaSet] => default/reviews-v2-7bf8c9648f[ReplicaSet] : All Connections +default/ratings-v1-b6994bb9[ReplicaSet] => default/reviews-v3-84779c7bbc[ReplicaSet] : All Connections +default/reviews-v1-545db77b95[ReplicaSet] => default/ratings-v1-b6994bb9[ReplicaSet] : All Connections +default/reviews-v2-7bf8c9648f[ReplicaSet] => default/ratings-v1-b6994bb9[ReplicaSet] : All Connections +default/reviews-v3-84779c7bbc[ReplicaSet] => default/ratings-v1-b6994bb9[ReplicaSet] : All Connections + +Exposure Analysis Result: +Egress Exposure: +default/ratings-v1-b6994bb9[ReplicaSet] => 0.0.0.0-255.255.255.255 : All Connections +default/ratings-v1-b6994bb9[ReplicaSet] => entire-cluster : All Connections + +Ingress Exposure: +default/ratings-v1-b6994bb9[ReplicaSet] <= 0.0.0.0-255.255.255.255 : All Connections +default/ratings-v1-b6994bb9[ReplicaSet] <= entire-cluster : All Connections + +Workloads not protected by network policies: +default/ratings-v1-b6994bb9[ReplicaSet] is not protected on Egress +default/ratings-v1-b6994bb9[ReplicaSet] is not protected on Ingress diff --git a/test_outputs/connlist/exposure_k8s_ingress_test_new_focus_workload_details-v1-79f774bdb9_connlist_output.dot b/test_outputs/connlist/exposure_k8s_ingress_test_new_focus_workload_details-v1-79f774bdb9_connlist_output.dot new file mode 100644 index 00000000..e007e982 --- /dev/null +++ b/test_outputs/connlist/exposure_k8s_ingress_test_new_focus_workload_details-v1-79f774bdb9_connlist_output.dot @@ -0,0 +1,14 @@ +digraph { + subgraph "cluster_default" { + color="black" + fontcolor="black" + "default/details-v1-79f774bdb9[ReplicaSet]" [label="details-v1-79f774bdb9[ReplicaSet]" color="blue" fontcolor="blue"] + "default/unicorn[Deployment]" [label="unicorn[Deployment]" color="blue" fontcolor="blue"] + label="default" + } + "entire-cluster" [label="entire-cluster" color="red2" fontcolor="red2" shape=diamond] + "{ingress-controller}" [label="{ingress-controller}" color="blue" fontcolor="blue"] + "default/unicorn[Deployment]" -> "default/details-v1-79f774bdb9[ReplicaSet]" [label="TCP 9080" color="gold2" fontcolor="darkgreen"] + "entire-cluster" -> "default/details-v1-79f774bdb9[ReplicaSet]" [label="TCP 9080" color="gold2" fontcolor="darkgreen"] + "{ingress-controller}" -> "default/details-v1-79f774bdb9[ReplicaSet]" [label="TCP 9080" color="gold2" fontcolor="darkgreen"] +} \ No newline at end of file diff --git a/test_outputs/connlist/exposure_k8s_ingress_test_new_focus_workload_details-v1-79f774bdb9_connlist_output.dot.png b/test_outputs/connlist/exposure_k8s_ingress_test_new_focus_workload_details-v1-79f774bdb9_connlist_output.dot.png new file mode 100644 index 0000000000000000000000000000000000000000..4da909814c07f2f839e84a7a27361f11aae47c7a GIT binary patch literal 23635 zcmce;bx>Vh%r^=xv}mEYQ{17rLveR^io3fPcXxN!;_mKxaF^olb~n%aely>{ckavu zW^*{~y;fF|m6iOGoDf-Q5qKCZ7%(s}crj5yc`&fgR>12As87HZdzbJU`1M6kLPQYk z{o^~ky(kV0><5^bAfKX3`pKHBhvME6@7rVwBjd0E>97F-m3cfEG~y2n0`R%7`DR~} zV3ep9tCZj>>Kp3AWVV77J3Wui1GMl?^L#Dw3t)nmvHFzdMv$O1M0>DuA&`C$5R6J1 zNf=F}JU~-ujo>zP62Yx{j_#^U*ZczB*f_=P# z!Yn0EApUqk@G4kB{NG!LWa1>y|J}wbM=AE-15Y9HV!$o_h%++r;z%E_qP=nzV?Q4A zzd9Q&Mu+?FMJ@ z1M{svZ2BQoYBnRCkOPx~c~*#jO6K)`o5%l z)*Bt3k5_x`DUU-jMCPE%JvOV;<$6Oy!?zX04`zG z78iH@ay`j7fJUd?=JopY$70BUVOsSk@PKG=wqoqf>~U4+`Y3zBAJM@`T-eQ=AUsNP za*UzCZ#ZmIMg1Ra-sS~Z+UdR%!TQBqi8Ri1G?B)yp5=qHaEJx5`3RDvvv;Q}?2#HB z9%k~8=M0k%+n6K0>7Ew+hY*$)tYsi+I$>xB9+D>X58Y* zBk>_Eusnd4?oy?)yYmfeCM;MO80k!|!$(C=&sSs_u9(!+5e)acCFA!U-nYE+@^JbA zj5s5kjrTn|?`EU%)RvZ(($dl-Z8y{2KzOjDqa!YmvXassqYt`{$F#ZShxDNd#Yx1h z0geHz)8c)*jLOT)17CFnX=P5Ht+hG>Zz6EtAo_5gHGS^-itn*$&wY7$`S|z<4Gk@S zE_Qh1%+K$8z%`@r-&nRIx?g_u1|+W@Lzg2MLsk*8Z5Vz7*i4z74__| zp>qQuYhYESrIZ|DQXhPFR7@aluXnvR0$Y1kj<`8lsL+riMP9Djzhgh>Mc{=yg8vu< z4mMsqc3r)}0@DZJw2F$#=jgy^@M@=1b+G$&cRC+{KVnrNdz_@?*e|R`7??cmtVkY&z2%_*tfNtZ_3?SOfT`|l|IA_0SAb=aUc>`LrEziHI>6^wF%&& zbOy(~?oW%A2Fsm+2rwihBtQZHU0;9j^6GGSkK3+>V>0IVlS!o#YsC|3In^4DqP1&x zTCKIbyu2(dD1%M%zPEMjCNr7NRBE;EPiCEKyXxuX)_pmQta~V{>S!^WFa6O5`@!zZ zu3J+Zo{|Yc^mQbD-{74lTu!HQ&1Qy0U^hYKl>V<#p!@&HDExo6FJhP{U_*#T^*vj^ z%&AVC*l?=V!GEDl&unuSJ*&~t)2}PI;K|8lWJZL3niMGV6K78DM&|dhZ|=LY1MQ8z zl&gj2=j)0H1S8O*OOiG>+p==_g4Hg$OV?uhZgSIeV1-U3)Lqz^Fo9)H58bbM4@=2W zvd^ehm{`PHlOj{2C68CD>N4dP6zu%AuYLK$l(K2}_-6Cvmmow>4Gcjf7@L3tEtLrlL7{s18)^%AV7Byl2h@;5^e zxS}30BubtzWtO8niceFIrA`ws4vql-)#eimiU?FC zWhG2#QlQugAmgr;cupU8+h*wfQ&+o532)JWFY%0dTRydmn_H&bh(Xdkv^FG3P2V@8l09^7!hzRw5u5VBMD%p*8e&r}FwRvPHEt6C5I|c!l z77k$bw$dpFd!8J$-!3ncnMxFd_c{)5*D11fC=z(2Z4eR{lrbW3F>5)4tjzfJiD424}RqdORr{F}1#Q6;mFI)0( zI1BJK|_+#(%tf!LSfq9O`2C+(9m{_OlBwyjGT7m{t)3<0S_*HeM3dbuTnV|(>HK! z^hgj)tj_sEtX4xM_5z>H%;l5=pWNo=yAR_JK*uqul#R^#1G+aR`31u?6VYYnHsLkv zlkI>F1mko*yV2mv*C0iv)$A&eX!1~-z%58q?A>v7b-s}d%y-j}2TWVnb+;EdK}kJo zeSLnm#;?DBduov}ruF}2aIFtQs4XOwF55F6i&idEZ%dXCy%;nn;3I=7F7FF~ zwcB<%jP(#P3+(CnX_dZ;L_$Wyj7mWvD%SmPT2#6)j|A)|utnw;wwIZK&60|x*&ccf zvfYEJ)ciA7<$pkL1UECYyW$VsbgL|xi8F%=FHRz$CjlI9qz`T47q`(1A z-(GMq3W{VV=)*(c5=TbFjk_}-H+a8UtA07J(qsdUib_tGbT0bJbL(bcL`Vh8Xrwy; zCz&Bm@wS<#I1|=-Lym?HI~du0ctg#7Rcmbjrv)ydzAm^(+EJsr?Uco8uDDB(|Eb%c zXE=_Wc3?P;%@qlqjvp~wk&p&HB_){)6B9F;0Wyv>z#+gQ*_OlhkzpdE_wo8_Dl*k%5g?XP`#k?o3rZbXgrtRH{E5b7+L$h;(K)CUc#h z`Wv(-sB)Nn?{Jo!rvGsEXIl5Qs7%s(MXk~Ab*`tZZ=b|TQsyZW;~gluDHA-D6E)p5 zn`G&K^H=Lb2+C2@CHVp-ssGCE+;^|dRiH{?@j|b5Ympv@H*#AK1$}2*=x1O)F*|b# zhmtf-NjZ)@hJX_4$f)fdwYa#fW_Tz}lV)&K(z|V~v3~a_2)iG^f%&=bu&+dcoLbP9 z{u^H3-l!~POlIVmq=CT?PHg*qh#P#FPuYdSJijE0f+n)Q>WfMUSkYcxMW=;PD136u zn60K~P#Bgj7~C1$vVkbOS>!D*5MpzZjC`LWSXdo9bns9{L#6&aW-&0GM^4?BBf#c@ zXlWT75|c)7n3#fjf+&WsMomtWke0Tsr`ZH1CuqlTbyaNuZD$`7v$c__5-&-Zy1@JmZg&sMAU2u725 zb?4^s;@`gUb#=Z++;0q?trb@Yd2l6C$1wWM&FOv>;ZGY4h(&rl9^C4+;h@+5a@L7Y zrJ^^Julp4}Hc)|b*n;J9clb;^%EO6;cSf4^iCVR=V0i6UiS80?LW0Y^*2!wfY*Eha zaD8#>xv;o+H4zb?VeRj8?UVHg8D1erW+Wt=^Y(`c=W3g+U%c`FDZ%7=8$50AJUmZO z@bJmp*!LSzoacSzY7XT@ufJ=C4szb!oaYwwo*c?GLlUUyZS|^&U`YhH6HXM}xNJXJ zT88Emd)=LEX}O)?8!EDeEIPz%>+qEA6)Yg!~{{tM?{#Gg0vVnqsEj^cP8mtEj0O7o(0+;<45)UCD` zKfK=EJ+7d8dTcg4KbGu30e>m#wztaO_Ds9(iLRuS%#O_aLV)L*KdHk@o^XOa04TP$ zCn_M;>AcI`xQDyO5>27(H%V`mpJyaa-&{fTHt+3~_JnOW4UJQZX1aB|K7At{G zY+SEQSJ&UMS62Ed5>9B6V9z_k-k-f~w?0|5!prbR08dnT65C*5T`Xw0ygC9Wiu+l2 z7#$%M)gnElSa4x%X2GD}SFI#E_awYm?jM7qq@jQl)Vk7DO{dBbSfNp4O9WUy&-<V3$J1|PO(+BNw-|BMNAG4Ui;~+0K`El5cscWEyguJA)+a20=f1)KMT%?Z_tULzw z?+gMS+6Lt4s%GW=ZQ_)Iyl+t!U~F7oY+qgunr;_#zX}H8hCy1l2W-52fq~Ta!YotS z*wwhWcud?UOQPLccei~$#bAahD0mpv;irny?8G|;eRT-K0oh(RKDk+JMDC5gcI5Ew zp5F%@Ty}kCvxD${#_o7QIy_u#l6y;$LV}VmQq^3&8{}12sbY~z))kkkU-j;^2hj?t zr|w62hjZAIwlpX=nkVfCpesrwLhwY@Rq0sYAAJ8a58`aFZuEaKmXC?gXTV^hYs+4# z6|rUz%3#l1suPPz++VF9{p-<8Pdni-O0zIuw!&hKHklbPihAPWKC0J!-xFlO3C`3BQIIBMZ*5!iF*Xh4DZF2Zv^~COdH7nc6tiv7X-PzBI@H-s;N0p*iFL{k9o}|_ zMx;mzxAPRzktKcU>G&Xnb-O5C{W-cgk>S)cvWm(rDD1 zC2hOMTX!4n^g|r%+pGs&^dYOZqFwKAMX*+zDY4f6?Qps12EzJ_ZXOy22g}tVw#e6u zpfM{1C-NK!UBDI9%HWzdi7$#zWbpfg30Gceb-{{m1_R?Eh%r=6r>VQNL`@rs%Y&0m z^99!j2tOZeKT8+cYzrRazv-&gkFfpbN1p1tE)0hoEmf+p?x09#@71K`wQ8rsfrOO$ z^Xkt8{&`7n^YdBAEby<{r~R}^_qZ-(FVlqbuM*Q|Y27A%0!?#}uDU=OPNh4z@r{_WR$14g`$yUhC6e7wYt7;E4&g?#}dL9XTicg7*E;Zl--(kDkPy4fy zdvn@%JQ{jaT^VV)G6465{ihGW=+cpAije7{2FtjlwYFwJjG1;I*yAHrK5#~i!lV)Zp#?QYoU>YKDtf=Fe>tY$?__LES9k<4|_=&4HFnEZEA0+j$8bV=68>j`Htd^ zQfa&FYsgXf_g?Iek5{8H%6ndm0?}*j1jh@G7R!tiUFZt9-vE?ELhSeWIQW{CtgdWn zEP+~#-TeF#tEJheu`hntqjUunmMaY@@Lv|RXBe^J^psHb#~Q3M6p7-kGVNQAjsU?L z`E?sIsb61P0^>HmSrO4=0boen!s?MNldTHL+RAPEnVM}p%Up|VZCRys>KUpH0^O4F z1vn~0Yfx`@p|s)kKIGF&@+7kC8PV^_aR~jBQM#1wANXh& zNFoNLVZ~S08X{`$sB7!$b{HuvC7!y#aF+}~=>M*jP*5L>?<9;D*XTr+pV#c4JREua zaLQTxHd0en^$6YfQ+`>qUOZ)phcYuq`hHpogx@ETNM%kX&1R<@X)_41?ENCb_ouAH zbV}e9Sw$;jN!MhhA%cGY%%u5Vb9C*0i4X8mQi_pM(0QxrSHijmdEAuDmq ze;-t8zP=NsIP(fQdhIk@;l6(Us3gi>{EQO#oMt{rSLDqXXhG?EN%(njI*)JB;m2+I zf0`1-^OyTxQv{rXWx?Zq?M~-?`LQ3pGBNR2;4;~nSvp8<^G|+kyN);LQ_-RdA1$R*bhW{ccpai zIR0vmzjk!A*y3n$ZL|?m_|BFgSz&bE4l*SKM2+X2PNRY5fBKCp;pBJLv1iKy2oNf{ zr~m3;-dWGFrv+<-!V?^J#8t@EdRsamO)qMsa>W?~J+S8kUcc(YUq`eF4r&z@RqYG0 zNn{yqR-aN8DMxz|IC-AO3>hGKCOVF2y|Ky_{~p}lw^`^k(rPwsN+X}*%~#-|9ZD7F zNS2qHJs;~x)f%^MNb2k5?rCh;oh;3sJ1&42eNNXngMY8%v^Y@Rc$Bij$KCX6Q}*B5 z^>WMn@>ivfN_1k96pc{Tk zBSFh&Fmk%DKDIl)xFXRu-@pInec;>e_IpZ9EM_z&T=!6Tof6PfOEFwx(090z#Y|AY zxqbsVzS4&`ThE{*bc6l6ab-Hh1wu9zSwtmuti&v9@3ZCw741U>Q31aLms?ZQLff5k z87}ZNsdh7^zBFs`oq2QKhhOyuVx5hM_))=79a$9eY-vwwF_*plmKP z+u$rz4K`Rl9LiY#6$NSi;Kqf7B&QMb;>mRXcE(-YdKm7wO3Y`9{PpjChu1f4S4gAU zmv@-tLQ*Cs-IK)$h3ELtNdMB^;W#*5ZtdlN=%1^^TdI5#N7j^-a1+=M!@}l5lIuaR zYgNo$f`DODhwC-D<{01F2GAHj|D2e5N&)BzecjD|HbGMmB6KEuO z98s{C$|E*l>;Bs@WYx2@B-gRrSpbfYIW<`h3Tmz8u`gAWOKVT9VSTAtbmJ7tN{?+* z2c(`PD>7|>fn1}R8BN0B_~iXM{u!ZKDC~=81#1xaO#(Ifzq@jCkiI^Gh}L9HD0kzr zy_?F1*h?svo|*6S4lhy4J7V8oH>e4HQ^qq$N7cEF?y^tNQ0=|Ps_P2Vjh=k*BEcO1e@LK&(h|S z8gWNwn*C@GmVYgw536;;|Bu3e)bZ`zh8YFPJ$pw;PObm6?a1FLEmnw3US)#E2X>_WM5*yN?Q(k`+e#OUjSFGKheTbHCpDb>g^oka;I0f ze*lY4>r%3^QxSN?$uk(wjLZ`gc?w~vqeB*}X`84A!OgBo!`{D=Sm2`jg zS_?+tfrZf0$ihp7o=lrdbhNZmjgsnZalCphEtM`B@{~R|^Re8PLU`cOk+xnqseL@l zIXv9sB?ppBi^Xy$WW0w+l35E30L~zhr0T(?(UH!M^Jm3GDWNS&9FpBs6Rc`2?C~ks z?Mz0VSMxA#pPeJ`CjO@VYX&EED`<0`Zt(z3jdf$V%_@z>(Sz*TEkfQUQ-EDOtm!My z#fjj_HRO{AY9`zld?JOr7dtN2Y389!^q3Abi5*)vOQvW_N>%<(j2Qe!p$6WVvXo0| z#qbEk%1UAa2ddZC1zckXx8!F*^4*gSR$8ER$(9t(q<^iIot%{|9H!DMEsp%pWFzLs zdP)iLSR61g82U5SJo1T$6X@+v;%;9&W|K}(J-Qs0sQ|$5K>PbejRvUvx18L`&7qG~ z-7#Nz&_dC%T+Oi~v3zr1S#yj7h^Z+^{pKn6%)UkDvnjH*Ti5y7-i^_?r`g8|@@Zpa z@zi3PFfnmIZ?8b7_44%Mx5p0l&~W!eMsO&M6H|`Cl*l6fDr&0a!yet`)3IM|gBR?@ zIU*3z?u`OCD-d;YX!)>U3BEnlV}l_=T=qcTBdiA>O#C@`6pMQ}u`txmWMEC29J+X> z!;i~`I`#I{z)qy;ZMJ^^b^bJ0_F>_O_EQyt?CIrnEGjGR$`|{?NgN3QZe=)TwCap6 zE^f04Rw#YzrHq+P9+(OVTWyWs@hCNx9@6;=&(03Ss5cYO=lcDjx?jKlqDA+*=X^O* z0q~!d#;9PfnW+COqVXv!6sD$4oPm7?;MVOT6tQ#1d&ZDbR4OLE*Ob1>o}OxVRy-Fl zSoCcf?;ht)?BIy~10cEjRJ(b1>hh1^JR~G!vB7eaFGl*s^R#>=g;BNUlQ7ZU>2-|A zr);XGR%Uawk&)<_KR}$X8B$uR`;`f&na=+BzQ8y37DyayvMH+UL~?$?15I6=d+Sf& zaJ_S7dgI}HOSyGq(Q!X~-DK``DbIBa zGNBuh!!=*9tiLF0+nBfaz9Wc4!saY}qp``B2<}U{4nkasHEhQ{UV{anqvK$FC`{XX zN7PH~P1LZziuRvwp9t*N4w^K0x;7tnd%%ou>q%yvxwCL|d)l`;Z7mtwzH)dy2mq`P z4u^C4#kc1gYrI);pj%-%idL@XH=YLID4*d?eZJhk9!d*AE>!eRWT^gy=zPX4l)455 z^2c>b+uWxbcgs`L-qEVks`m+re5GR99(H_fad~k8&E&mgjg0T<>HFd8Z{TnR18BnI zH4sSBweN1+4H@+CzK7he3-Iw}B`tUA(3(|h1g%)(^KD#w)_t_&x`H}ufqml{J6R4e z&g8RaWU=Z)@B%ZuFRB5K*MtS-mwWFW)=oZEj7$$Ca}Xgj^CErB_mXNvAZCi<>4~RU ztb>+F`ofv53*|<+1O$qi93&`cF#Y{K-F}s$Nd;C;cKEF)7DvA^WwqS7KZVvY6~uGy z?_Dw)^V8SK3_^c;JMgal{h0}i>l!Z84TeCOpF|*yd>jA0t5Ax~?E`GtONvQ$i4y{# zCqHb~i=(o|Hq3~Krgtv@7(%0gaROl9>Xpm0)`!_FS@qCn`^zy#KpihUs(WE#r^HD( zuc=jG$fUC?q+*hXCR2!Xx&R;+{rmS5j38{lmv=cy)^r05_>zUD0Wq&epzqhibY4DP@86p7iIY5!ZFNm# zxSTTMu=|F?aor#)SN7$Lb$<(k6Uhy3cfWjlez*`=v`}qE0uZZadp}&|>Hs@{TgKg2 zA7~uv2gnP+r=LjxY|2&S@bbm=C(D?4RJ#Go&ZPGM{+mykiY-VBK<5Bha>~RP7Y$P$ zqj#$pKr#WWr-6m*4#Vq3Uow3$h#9b^-el67-tXx6Uctwpn1p}?sv0{It9Ita-!VBd zA0XYjH$J|nKQ?Q0Mg*{-qPPS7{dGmqumUA1mr|m94dsz|-5cEdFeBxC&gkRB*t|5! zsc*F0{tsNqM+EiokErdHh36dy3mz~CQ9Pl5HZ_yciqdH{`8aR%x1Q(zMVc)Hu*b{x z^BnvvVsVnM;wZM8KC4F{kp7bc0COkO_V)zb%tzlyS<>8{bRT5tPvXsi^!FvpRsSSV z*^bh5M^g8}O)LJ5OGBe(Wc0(;s}9Lk)n2!CorR+1zSH*Pb~@>5J>UK(M@+Jn>27ns zrrP3=uR|lw6+#$^*MGM5aH9~PNXU$ez#A@tFQlye4iYQb&HgTQvJxc21I)Lx%5K7> z+Jq>P1fbdUmRK46gdIz#Y%a3W_%d06>Je>R0F`H*oz@5F!tq@3f~0pa|Dt+Q6!_t&P=2EGSj;gWovxp@G(^|*xOd4ynQ4i4>EZ5|pI za$-TFg@Cu<>X~2I?t{kR@bBSALC>p4H8llngG8e462p^YK^nGKNj{lTZ3vl+_&l4) zIC?TDJdR6;*VF}#y5#1caYV#oD^O1I$M=(FXJkI{SSGMGYPC;p=0WW(95|eT0znu3 z=;RdOgTLQAFyMfJmzMmR3B*ZWNB8)}pkZKv97S&skfMthmrM&>)f`I;N@1iom6y?H zj@jzA7y!~Rw297sM`jmXg))P_kifyX-H*Y|u}JWZqL(uPV$-b5j_GZD`hvBlK3!$K zw48aES_lkPS|(i243p<8zrJUx~plt@hCW zvMafS@$p?-zg*Y~rT@!m#ab)IV|@XV%F3i0Kz2zDdH@kS?D0A#&JPmyr!(yalOu#hvXdjE{I}#gz^oitJ@DqRcYa(z(}SCpID5g1^}1z!~3nO z;cOcYAkQV82_&+BiyG#MlL=EYcNZftb1H;j%l@u?fSfgcvzv-j`z~-W{4$| zeJ($8(y_7s zR9`5C7Ih;Z=Sp;4PcYJ@y-}!BmZ%dGhKUUEc*aswi*GQtH77Wx-6VhFBaH?4-a@FR z@h6O#*CxccifdKMvsRhYXd>EN=BAINvlBH6DpP?KD`K!pOH<9xL?;Gb?!=^q_6fFR z7a^pk0hJg>W{S!qjS@+~_Nm1LF!6Bgpm4ZmuJo8c!*K$Y%{hv8!QX}0`)xP!H4jEm z*)p!U+_>fCfxL4(3NeY}YE+bnCXSxI$Ws816DJn-^dfLf0q&8RnawLlrB>WIXd$;= zDU*>weqy>HjnllS?31rKkjBYqy(Pl51STj-8_&)P1CSrD_ zw6yc8>m*P@;f9(E1tv~{gbY+6#Kr*^faX}=>AaX|AE0bwFseztaM=IJZMEsovO17u zG6%_Ogi)#N2C<}ZX?S>uXrE0?42ENVl42={?e!;j8VOoei@9m+(0=omxN&2zh_|Y# zxymRe7Zm0%^3#qgCjaMf)r&ZY5iVR;*QNJo2`&tBeEeq`VC;YzB<7r&??6$=p}s!R z$z7x&Ggfo_@kE<~!rluf31shOl6#OJL87>uLjZ)J;ase?Q@{;!R&#c%ZpnYu8W}z3 z%{NUh^dg--C}znDbs4cUBF3YgDN|h(bsl|ih6b4o3@Rm~JMr{yi{-t4%2ebOh{(jw z6val;^BHSno7mWk;?;BiD_HqwA}B;a`bAC-w=vq%XL)&Q#y1hI`PO#B+9X;d{mG4q z1;}2)!{Y|vMGEK<$}8-xaORG{N3f0vOQ4oQ}L4TB!u{%4^ZBsBH0d%VUH9k6-$V5gq4WA@1 zEzXaXR~c#u>|`+R1#9Jhf;Kn(9*Kt<7V1wV0{p1jGZsx>)EZOS+o9|XhLK4_i9`;e zYi`(uF_4L{dv`F91!eJgLd}T@W00mo9NTtllBXg-C-U!`DHX@MoSxhJhERe;)p>@xU^FD8*S`D{2TnK?7ajV#)yS65 z618{!xKZ;EnWxK`QCO=g82 zq=mr#DrNtG?VsG5it%QL^7AtVU|q?o+O#OBAwohEYpq&JNL_ah0j9PEZo;?szWY88~pGGvm@Bu-&D zKt#k^MWPX5WF>5bmtzVAo%#bqkH!21jm(*j3hj8))4}05)7+du4Rl8FyxrP_42~38 zxeo7br?<{d6+9vmu~sX;u%rtWm=?iT_`yqs!V87M&C5YQT$sZz$buSb&nd^Al1<$d zgb%?fBgG_JC3MBPXHX@n&hLGFvNXE?az5&cT~2o@whGsyyS}{ZUg8 zTc$8F$>%-0InkmD$Wel6^-oR9lbY{*m?@*?46D38f}-R=4Kq-Ro!w5gtJAj-ig*qq z76^BrVy;m$^><^h_)F0?Q6ZIM^VV>utkBv7g((CBQp-mbcyyY6?(~x8R5R6XR*<}k zD3V_C6uD|BghY%kElR~;%IHK1QhW>KZ?Q>oN7(q~lWZM(DN(xr%FWmEDx(dieolL7 zSL2{j2MO87EV_Y%Ri%{A(LiC}db_NB;^E?6{Ejq(|4}L$j4+293x{K`CS)FBLUV^l z!}Tt(# zTo!E1bPqJ9=6|EAs0^t(o-`Iy5g*b_h8c~0)v`?Lrg*$?Ff`Cs?ZGnK<$t2&4`ltQ zi6z3YXOqfePjwR4B2aSkqkYv^x?%lzFlAJYOg##ELGRus3J1SpZbEL5m-JPcplE8< zgXX_#VkCZH!e%Oi9Trli2Il~eWS|TN7adwj5=CRQKs!pyt2jE)otOvt^C|ubO5&;_I8qt6o*HKxTHqDXs1=ojpt1u_`7`Q7lTI)OVOddNUyTU z^&n1>$vKQGIvdALjMEs!vb0!p-fUYI`!T?WVCn)|R<27-!#PWs+eO_VQBl#n9SQ;i zjH@FUO!_mWBN(w&%?b5sH~#ytp73R(ylpkR76gW!KV0R4mH|20MbmV?SIXf?n_sMiP`MsEBG8 zypuWx;7lizFHb@x68Y{0o3InU4>>*%^Du}oI>pI1`hX;JF5RFo9UQty{NcFej>I+Q zqi`b5>2pF__#+KyjWbNxDOIDO5(%f>d_&M8L6^(yrHfygT5t+zgA@iJIfeNH*+1AX z5Li|*GF|uD7bGg-s%%R=Kz+L z>coMy{+&7q^=Own=%@acb*JqHoiCsrh)H?Eb*Rp72|c3PjP0Jq7dXl}7=Qp46pZk}dH#So)W4?#8h|Fc zN(sAM*&jX3!zkGSqVwt&3^SoZt?1A2G9u+#(=Q){YuQYVo)Q5XONfWsTKG%#@Zeha z=(Rbi7Hwm?56sF?051;^GO!Evb)^F+Q$R+I?_-j*MN=QsiEjKyA`%v=9fYo4m--`0t;+q!NT2S zLI7x7pj@fn+e8DCq4k)FHvIQASNT^fkh+)X8t+oGI;bF6=BzTBzKYdFavl2Qgu@<` z0WPz-;@;t@?wRToDBJg;#~hY4$*@B1?3?n%v49tw8h_iyqEV9enRblZ9ps%Jr8EQn zCt7ykY5RYwC%!({K@nswV>xd^TW~gvb3@92$vB(@twdU0do-P$A73@@>oj@sxv7HW zRb$10$dRscHu2<`}l>C6Vm%|@5 zt_zlk(|A_=$z;{FMlh%6N- z9!sx0uNpum z>rgXvO;J+vuLYV5oT552i4ZBNwxs@SJh8S}N`zfstn~JZ(f2n0M)BS03q?Zw+3W-& z4sDSx=dAjD;odgoY)N=wp609^hQus2x=Q`R8(($0E^SVddG6;=1Om7bqe7of=X$xh zu`5C<-I`&#Vn&GQPQ4C!&)+61ug7H4HhQu08P%*$yz`C~&T&0umi=#RJYHPDIAu;C zY#z3MgHb%89F`b(GWh5xMTsG>RxA<+KxDU+V0DGvceu3^MZDac@>%{tAV81Z?m>EKf#$pCco1VRi3I*1%?j3m(%4 zYtQ4+f9epozG%rGcwKM|ati#Rm#b#- z=xly!O{2rDODRU5P^jMF)@Aw>9+iwo{}xevxc6kCZy=ll96(BL0-fGRsdwP~fgC_r zP;hL^yfa9xqwFu0A(*7oY~dsexQj)%zScoZYFubbXr;^}wYp0KINkca-rM%e2aWEh z7Re0dNfHs{dgjfq%dmxi9j+e(_(#zJ*Cs5}Rf^R$io@#`Oa#3sgWy;4k7e=Yqm629 zx3;|-Mg5v}O)n9RHFL0@ST7WI!z`W^4CZ=by_fgm9Tngx`NaN@==8I{Keaf?@K5?3 z5MvV=`zxaxSi!qa$)vruy#3WPcV`j|s=Pi?Mp;XV3XiwpWq$v_JIg24+XJN;EGRHi zruunnmaI{8cIJND9h!u<%;FNVyuu84nYRG`1eEw_6XSo}k9D{8=+t`>5&hFN#zsq3 zFJp#Pvcj)HET>g+vlD`oO{HlMaxPbN@iAfS0W6D`cW3}nADuwNf?|+<>-gDAXryb} zZRbLV1_~Mta&-#8p{`?uBP4Br+V5FdPNG5m zqA!-~vD{)xRwTU;{wAfk5AE4N!I1Y8P~7>;GFK_1>YapXo?oIvK+~Upacj{U{H9&+ zUbogMZrnM!ON)=?Z@@FRRbYjQ50fRO<8 z3oE$tpdgTD72d8L(q!DMz_?hwAcb1_%O#25o{AAn0%j#xFQR2tJKn9z>L z56~O5-idsw{p(wX-2rn|Y--F|nG8Mb^aoHeer0kz1}MJg#U7q#JSA48&Z|eN&zkRd zJ1h4pC*D>|_A|YPDWhPD>&5YS3mE3B$kWY>KkD&k;xm)5j0B%upX<>j4Usup_$Qhu zoda&JU1gRrpGM}D4^3PKm2ZhQR5T{b!!p(KBsL1fJo!-T{S^cuNQQWFJbj|0g-VE_ zN$)|<_qa0F+;ZFRlfZ$#*{{F?^siIOy>GNd@TY~V+^RIoz&V#{JXMFh9o+AG?BCss~RmY@jAQ%$66xN7k0NN zl^Ij>M>BIJYdUS{pC2|Plx?5|S0JYhl}Z_Gv3YhdD((9Wc4Xmwg^o9;5v^YpzT`1S zZqTq5hpg@9>};0!JX8ro4YhrWgTvW47MIwywRXGf*+Vl=s|=uH^)K~%zN+*r{M>ATHJ5IovWw!@(5F*J+)&)1nPpeZeh623#885Z0JF@5Y5D$lr)(%?dzd_!NA19a)GApsAG&;@WZFGq19a9?mHh zL%Ji)A@qG0-S|G-6uoXc(YgfR5S%I%GvhKn6_dK9HYeIwKPUpAcY~OK2n#tCM+%?q zKi3WAXu34{YmYGZgvbLPSHJ^0a{q!Ig)>S;e{Mx`vpPFZEJ#x2$gUSTYpZ@Khmiw; zz#r(jA~qn76%KG876*igA3UW?I)9WV&?s26!fuJ|QEu7=* z`)%=iZ;%X(lcs?7!D>w~bi`)7hYLs5_(Fd9PCX!Ew0SpZ0*H@?QCuAYUeJrC0J!Fl zp05cn-Lg1@1`v9pSr$k#jq2Z+7@G=r4w=`wjytqWq$2XS07@H8kZ-Os#H*k(_p}a})S^H4HQj_0em~kfPL?w)$~_)rbiKT!2&^@_<74J2 zAi8Hub8?Q(a+&@s^`t(m^$w^QXyqv~f@MzhZMc5VI_ zYXK3OqJIG-rz9|r6`;y*1+r0Fy)zKUVm{4e4Aa{kRdXAt;Z6L=jsYh$kYwU}!tBm< z2@FX}9YgAIOFTbaz7>TdIOY2zGK>L^if-X=VD2DNm!X`~pSMK-;z8D=JoUN+G1hMNZL=~6jG}M_;V~{JtnU<$ z&Cca}y|djwnj#*NUziDC&W3F%gwn2_@hJGO6Q+zEAV%^-RYG(;g(<~NJH&^7Nxu7;UWZxFHqaVK?btMB0yKRC(yF|OSa!DtTlZyxmO>nDpY%bV#gP4 zHd{CM^~k$H+ndB~05yQJxwTpFS?$9{_j1x2(|jm?M}DNYzd|I8K|bF>N6#_|{L~IT z2SU~OHwo2VbB4#@5++JEpeY*Y42}J@`9N-XqvdPLdffC7Sh9l$ZzTD7Krrt1*cz5b z$ESO`iH7TtOqsOz~Z%Z2gckT6PaeyCBO{_$TUs6LJ=4& z0?-XaFvpu*QAyWp^v+xCAu>uJ3}jf3l6j1F?-T! zxh@r2MZexL*q~(`WnOJNw*I#peKq0wDa% zhQb~cF(}c)pA$5={H_*SUAL9->wl#ORRpEd&$DTxDd^~Y$8)bT`I8WXt=5uB9Cc4U!HGiOwdiX<}kG~R@lWO=kZeY58w zSdxcOqJs6}yIPymm%-z&ws}CyHa|Y#C)&)}MzLWvd;)l{bTgwHH0xYG?q(X1XG?`~ zd=-xzdhzcN-FF=|7CPe296Mt`CbyRIYc*QYqWbjZ=Y<7i+5<@Ha{R&6!Y?g1gHO9tk5k8Q)FtzX{ZTwY~o#KvDpYYw`;f82@kaHjC*LB>;kuLC+ z23^Wl1U9rs8A?908&sf~c^4Mu-sTrR4?h) z=N3R3G2(nnmb7W+cnc*|SNC{9g-9O1(s9V5{#NO#hVcGa5S6snIJMXEIQBZlJgrEM zh`V-3H%UZUI;&HF6cdy2X2vvS_8m2#nB1Rp{d*-hIH}VS&Jv`)wDGJo%iAp&0z0j` z%yMZa0P}zeiTJ0>*Jaoh#b(e}-N`w;&{qv_*4v|&_Wct6kO@Y%B7@?h#ZN5GHAzw+ z6Jy{zzZ^p$ejg$H7}-B_3R56B@|v`>yPc(tP=I7=n(>$Fmvkwyd?e(rJU$nf#z}E2 z_3z<_4zI($4NnI`a$8;}DLqdHHC=}%E{n@Bt++nvh!XiPiwCutn6)>J^{DXhHXM7* z8q{`hT0~o@+dyr{%m35KS%yW`z2P1~K$@W&8B$UyVGya26b6v)k{40B8>NO02_+0_ z5Co(fURt_KkQNx}7{H;<^8J53=gZljxY)4Py4HTy+Rxh0{kty`FUwHpkM3u*tS`%% z{ZKjaSAAF@Cuc3JqWN+tvX(hy$+qFZ^o4KO?|%iT$OvcC7rp<=5-n^H zh!m)@DUZ@3OzRi$B9SmN>M$AUb@cius?+wCN*!%qW%Oe( zF;zm=rmoXr+C4yU0>97scz%I|nHZXGwU?E{Q zs>45r$VCDudOEkPjMMUKd2c*(&bZ2mfVhnfC9?nu;xF5i(0zhl^ozVGWGz+_K2=tw z5a%nX-Tm`YJn1K@J17`&(5!Db;KRi9C?FXsNb2SWa8faidjp0ec1ZsVmOyUm*d=^4VN;rJYLLt;)>vmmT zcXw?Cz=Gg+<^g zitz<+K$ZJOWz!E~fexONZ7<*l!OFK39G| zK;#=5j&eW|l?N)_;DX{Ia+`4YG6dy;Ap>(N) z!%LiSvb7}eCi$agDpe@5$GJ5bWDNGm|GJluHYTU2i$<0h9%5$P3%B0OsOQl5vE94( zw?5solC=a^Css~Ww#m(wh#W)majDV}|G9lO`31)r-x)u>>7$o)@lgD)Qp_gH^l{+! zmpfC^5=*%9G-<>U=VPZ6S=a6&p<50B#ok|B>#^Q3T5ujrOvUKp2J1a}a zIJ#dwTQ=5XQ`$sIU*DuMo=p+Z7Fdj23rgW1N=y#RopX_ZQ9Q zN5Sq24F#|%$m`R#VvE;KSEBxs_9E0&_uZi56Azvf1I^3i7gbHNEseV%y9y_5(L3s= z&6W8%3F{(W@Qe)>djG<9+|%Z?Edk(xTUa|3?e!W);sJlouf zXpM{m%uG>H(#`d@Wl<@9=&X@6DqE6lqL4$Z$~H*{LY!m5hG<9F&Yi@AwPY5p1yhoNa>@DI%?j7)A=J8PR)0r zUj>1P$L|=R$mV{^pjkt{!W23Zt?ZPECCuiJFQrtpftz z#wNE*DeqlHHMKa8{La@{f5YDL7sX}DUS42v0_?2lYj|HcShF(peJM&;Mhi0^hgBR! z8wwqci&5UHUDHp4aa+MGRE^{o5*U^(?-(~9-~vRyKh5_@ZD*<6`QZ~dyh_hA&n^H^ zq$&!x08>j5f~=JUa<2Y27tP^+cXezI=6J*%~bUn(jrmmfYM!bsgQ1woB(Ni3v1K=(jn=qO4>X;%z`> z#(Ei=#Ivi%IyDuG?HUQ@p`z;QiO)sxo@3)u;P6AvBi{O@5O&K8rs=N=rp(@ZT?@Vq z?gazOcfoUdp}FLdNltjWqoa|?iWi#6YDw=qYNH;bljOx50 z>ff-JWBsviz(Wm_QJQVXY$s=I`U5o+KmX)$+chnY?z1V4SbUtvm!r1()tj(iTY}?2 z%lYwoGK8##qM>p;VCJMPM}GeIPKJW}{MjPOx%ZF5W!L2cYs`~@&QF!1R{AaEL{9tb z?aPms&XBmHKgs^h>vdF9J7B`HRk#VuvH~jj`jDc!1}ylQvhGGjINZ)mwO!1iWLAd>Dbp0XKB`0^-T+&QRf(xz&_5-Zo$^jQ`wyJF+1L4V=IpRDZBE)S)-1Q zddwfDwKp>YRmwM7iun_(%B;l&8|te6I6F5_X`{M_eROQ|92|*_TFtoRoXW-4U`q+Z zwb+a2`TDxSX%Z4_+vl=u)zsKZ9xW7%P1y2Ocy2o>$)kE7e2DPf3xE^VvEkO#lu6Ef zk`S*Sa4TxFOihn@gZn_LsE%otUky(45X#8CzepPqu^K^NX#T|^CFpy#WsslA#8qmU z;a;-bsYP46zJ3||g?w`Nc0+o)ok)wk-RPuZSlov_MNK>*p|TI&ioQ{7OSpJx`}zsj z&?a*)Q&N-bUjzKSYS{k`mR8)b?=jM##K#8_)*D6|XhKSMGF>UYE0mcTK2`jI5SF{{ z+~0x+%qJFKk6V#>J&y97m=_Qg?Rr^`F74z4qm%=qM0}(Rb$FTOU69*Xcl`chzhpXY z{c$u-TRSUjZefphYO2fcEWGB$CkqtZCZZs6+3w_0LoS7ji;s{h?hH}WJDX{*antrq z!5D>@uyjRBfkijFTd%+#pdcsi>&-9)BrkC+1PTEQST>!^LLS3UuN>~6B46A0e6Cxh zqKjQ5{$DVs1aUVtS&RC4evVaY%~@IKW3xZ%zxQL^(3~~+h}x($a`9wS4(yap^FS3R z8*nl$c<=R8vH$fgso({~lGK`AM$_Qand~EXkassRzj#qpq7)*B^JYvRD50oQy45Fq+KJ=r96B<0)B^PPQ z>6uz597TtawAaAc0@yhKUy~mNbw^kX&cUYK+R{zW1cEt;r0ww^xQN!&%-UPT8$BKe z>DJiG+9Z5O{@3_7l!oOoxzOYf!mFok*aUKkH|_Qw<{D2l zC|Ftf`{rJimADRodcKHT$i3dhe$sUxst!!v-ov}tlwVDo(ko(5xg2;7WV8v+$_3W~ zOf%$vMTsx>WVq-vGwY95%w3XtkKK6VI+avewt9{J;i|b`8l)MVNZ63zz0Y_ifZ1Xp z=-91=>FY20{X9da6cBL;Thi6k6tk3*;Z2QhBgsz8yAoHdK}6ht-*vic<1YHW|G#C| z$)$)cXahETIP3&XC&#l40A0K|UHO9g7Em`v9s<{a1~@9aK2q-@$!0t>-i;>OSxWrv z7?-#PFeHj#%0TM3eVzx)?WLx5%5C0oI1OCSzcyMHrQG+Q zeokozD1OGyv>l9Vd>`&9502OmB;4HvqIxvCqKpm#i4guhGoPfHLNB}w0^UbNkPd(; zr+ZHji0Y;H-<9&6RddpQU2$D^_YKvLWVefiM8Cm(grNaa>HXj+0JNOWe;-No8bTuZ z%)~s=wYgA`u9OJ_wf}-y^C5w|`!{c)MPEF?bnN|n{{>$*9~uDc4t*aSFibbp(PJ>@ zV~I%_Q8h0?W?bu}q(L(L;qO_Xy83+?1qAYBdf|OwmEZBff`{*(G?=sRkjtz6^JTot zjfcR?M{Hzy?jK-)5))%zsSKy_^VwToR|CmVo(hnmN_%KqB!GRQP}6s(!pJZIiG(^T z=jGeCHYyQ-Mwr|y1GyKRpFl-{HVcstAP=v zwK9QtAQ|~<0Ccq&NNsroOL=Q+E(e9iB+SCqeDLwXE+*q`g)Kvt_ZUoGOhV{J`rK_L#a?cfBwMSxiccx)jz zo$FkcmD&c8{pzV{*1IP8`Tt9ht5*5c{rg5#f*-FxLGtnd;W{`sY>of~17v72V8w5=E+J$;Z@&}qbNgNUo3 zZPOVyw}G;Suq4XuWqKU*2%C3w#{#B^7h$t+vCv9}6HA|0bf>%9cO4>8YDQEgZ9vPL ziQm(E_-7ORm0@`?di9A{L)oMr4P9>0ouv!5m{=X%H*s-Bh8alYYTphrrM0puIVYZs zd2%3{sJdpQYQ*&y@sD|cpg1`ETWX4vloWayC}>((sKTZY{1{kcWioaCrtS`<+(Ij; z5W-|YM-DEAZ=0w6ZJ>g5v@C5`PJ*V9xzP3XuEue&#+K|~rk(&-y}t%t0fQ`T$^lKp z86e-6y8(Ke`aSKGlsC=@j?rPCFcSklag0&?#)0+@{3T4ZD7 zHUM1)IxC-__Zxzm#^Ca_Mv*xc4L;I%+lwo-`g9^ zF0iv{YT;f5w~ExgHn#@1PYB z6pf8mbtO|NDS98*KrC8^ZM&cVi4l}^gQkXz4f<^bBL?k(RYU_Nc9O<<5v~&DIE+Rs z_&glW)@hqqTXO_Xrb%fL*(|`djhE2a7<9(S2#(n)+>S9(GLvIpy*J6R*wLA&MT?Wu z+;R$UnZ_pTy1Wt+azYmJnV^^B<7Oed0B~9`n~LBRN%X1Vf#wzkY~|YBB_aZ}kF)TH z!10ms*SDtD^J;MBc0qvlvge^x;$Njb@O3*o`{K3-qN3m23)JI}_9=HMsG!i?`ffhPThYOEh85hV(-yr|CKFm}N1yUR&V2_OoYGrL)i11VY1a8%7R{7*-gW!a^Po+6x+e+7L9`^3SdL z*;uzs1%V{H#idXP&QX461E+jAjjV@_`7J28GD{h_qmkf6^YrhF7u?}dR{Q&VV(L6D z2)H7mbyC1>WJeds%)w=Clgb5d=iZM9j6T}f*bp+Uh3E1Ay(8WfPRBh{YD!<=PYGev z)6q%J%3|I&p@cwi-i0?`i2iL&2RUo_e{b%AIv6BG=iUG3X#OAnUU-AII#p+Gkor6d QxP;@VJ<)=fDO$bxKiwe(O#lD@ literal 0 HcmV?d00001 diff --git a/test_outputs/connlist/exposure_k8s_ingress_test_new_focus_workload_details-v1-79f774bdb9_connlist_output.dot.svg b/test_outputs/connlist/exposure_k8s_ingress_test_new_focus_workload_details-v1-79f774bdb9_connlist_output.dot.svg new file mode 100644 index 00000000..3a9a05d6 --- /dev/null +++ b/test_outputs/connlist/exposure_k8s_ingress_test_new_focus_workload_details-v1-79f774bdb9_connlist_output.dot.svg @@ -0,0 +1,62 @@ + + + + + + + + +cluster_default + +default + + + +default/details-v1-79f774bdb9[ReplicaSet] + +details-v1-79f774bdb9[ReplicaSet] + + + +default/unicorn[Deployment] + +unicorn[Deployment] + + + +default/unicorn[Deployment]->default/details-v1-79f774bdb9[ReplicaSet] + + +TCP 9080 + + + +entire-cluster + +entire-cluster + + + +entire-cluster->default/details-v1-79f774bdb9[ReplicaSet] + + +TCP 9080 + + + +{ingress-controller} + +{ingress-controller} + + + +{ingress-controller}->default/details-v1-79f774bdb9[ReplicaSet] + + +TCP 9080 + + + diff --git a/test_outputs/connlist/exposure_k8s_ingress_test_new_focus_workload_details-v1-79f774bdb9_connlist_output.txt b/test_outputs/connlist/exposure_k8s_ingress_test_new_focus_workload_details-v1-79f774bdb9_connlist_output.txt new file mode 100644 index 00000000..4ba5bc78 --- /dev/null +++ b/test_outputs/connlist/exposure_k8s_ingress_test_new_focus_workload_details-v1-79f774bdb9_connlist_output.txt @@ -0,0 +1,7 @@ +default/unicorn[Deployment] => default/details-v1-79f774bdb9[ReplicaSet] : TCP 9080 +{ingress-controller} => default/details-v1-79f774bdb9[ReplicaSet] : TCP 9080 + +Exposure Analysis Result: + +Ingress Exposure: +default/details-v1-79f774bdb9[ReplicaSet] <= entire-cluster : TCP 9080 diff --git a/test_outputs/connlist/exposure_onlineboutique_workloads_connlist_output.txt b/test_outputs/connlist/exposure_onlineboutique_workloads_connlist_output.txt index 6789be78..cee8e4a3 100644 --- a/test_outputs/connlist/exposure_onlineboutique_workloads_connlist_output.txt +++ b/test_outputs/connlist/exposure_onlineboutique_workloads_connlist_output.txt @@ -18,10 +18,10 @@ default/redis-cart[Deployment] => 0.0.0.0-255.255.255.255 : All Connections Exposure Analysis Result: Egress Exposure: -default/checkoutservice[Deployment] => all namespaces/pod with {k8s-app=kube-dns} : UDP 53 -default/frontend[Deployment] => all namespaces/pod with {k8s-app=kube-dns} : UDP 53 -default/loadgenerator[Deployment] => all namespaces/pod with {k8s-app=kube-dns} : UDP 53 -default/recommendationservice[Deployment] => all namespaces/pod with {k8s-app=kube-dns} : UDP 53 +default/checkoutservice[Deployment] => [all namespaces]/[pod with {k8s-app=kube-dns}] : UDP 53 +default/frontend[Deployment] => [all namespaces]/[pod with {k8s-app=kube-dns}] : UDP 53 +default/loadgenerator[Deployment] => [all namespaces]/[pod with {k8s-app=kube-dns}] : UDP 53 +default/recommendationservice[Deployment] => [all namespaces]/[pod with {k8s-app=kube-dns}] : UDP 53 default/redis-cart[Deployment] => 0.0.0.0-255.255.255.255 : All Connections default/redis-cart[Deployment] => entire-cluster : All Connections diff --git a/test_outputs/connlist/exposure_onlineboutique_workloads_focus_workload_default_loadgenerator_connlist_output.dot b/test_outputs/connlist/exposure_onlineboutique_workloads_focus_workload_default_loadgenerator_connlist_output.dot new file mode 100644 index 00000000..9ea42352 --- /dev/null +++ b/test_outputs/connlist/exposure_onlineboutique_workloads_focus_workload_default_loadgenerator_connlist_output.dot @@ -0,0 +1,17 @@ +digraph { + subgraph "cluster_default" { + color="black" + fontcolor="black" + "default/frontend[Deployment]" [label="frontend[Deployment]" color="blue" fontcolor="blue"] + "default/loadgenerator[Deployment]" [label="loadgenerator[Deployment]" color="blue" fontcolor="blue"] + label="default" + } + subgraph "cluster_all namespaces" { + color="red2" + fontcolor="red2" + "pod with {k8s-app=kube-dns}_in_all namespaces" [label="pod with {k8s-app=kube-dns}" color="red2" fontcolor="red2"] + label="all namespaces" + } + "default/loadgenerator[Deployment]" -> "default/frontend[Deployment]" [label="TCP 8080" color="gold2" fontcolor="darkgreen"] + "default/loadgenerator[Deployment]" -> "pod with {k8s-app=kube-dns}_in_all namespaces" [label="UDP 53" color="gold2" fontcolor="darkgreen"] +} \ No newline at end of file diff --git a/test_outputs/connlist/exposure_onlineboutique_workloads_focus_workload_default_loadgenerator_connlist_output.dot.png b/test_outputs/connlist/exposure_onlineboutique_workloads_focus_workload_default_loadgenerator_connlist_output.dot.png new file mode 100644 index 0000000000000000000000000000000000000000..5662aa0877eec5f2798fab9d30216dc0e8a3a9f3 GIT binary patch literal 22700 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 literal 0 HcmV?d00001 diff --git a/test_outputs/connlist/exposure_onlineboutique_workloads_focus_workload_default_loadgenerator_connlist_output.dot.svg b/test_outputs/connlist/exposure_onlineboutique_workloads_focus_workload_default_loadgenerator_connlist_output.dot.svg new file mode 100644 index 00000000..9f141f1a --- /dev/null +++ b/test_outputs/connlist/exposure_onlineboutique_workloads_focus_workload_default_loadgenerator_connlist_output.dot.svg @@ -0,0 +1,54 @@ + + + + + + + + +cluster_default + +default + + +cluster_all namespaces + +all namespaces + + + +default/frontend[Deployment] + +frontend[Deployment] + + + +default/loadgenerator[Deployment] + +loadgenerator[Deployment] + + + +default/loadgenerator[Deployment]->default/frontend[Deployment] + + +TCP 8080 + + + +pod with {k8s-app=kube-dns}_in_all namespaces + +pod with {k8s-app=kube-dns} + + + +default/loadgenerator[Deployment]->pod with {k8s-app=kube-dns}_in_all namespaces + + +UDP 53 + + + diff --git a/test_outputs/connlist/exposure_onlineboutique_workloads_focus_workload_default_loadgenerator_connlist_output.txt b/test_outputs/connlist/exposure_onlineboutique_workloads_focus_workload_default_loadgenerator_connlist_output.txt new file mode 100644 index 00000000..51f71091 --- /dev/null +++ b/test_outputs/connlist/exposure_onlineboutique_workloads_focus_workload_default_loadgenerator_connlist_output.txt @@ -0,0 +1,5 @@ +default/loadgenerator[Deployment] => default/frontend[Deployment] : TCP 8080 + +Exposure Analysis Result: +Egress Exposure: +default/loadgenerator[Deployment] => [all namespaces]/[pod with {k8s-app=kube-dns}] : UDP 53 diff --git a/test_outputs/connlist/exposure_test_conn_to_all_pods_in_a_new_ns_connlist_output.txt b/test_outputs/connlist/exposure_test_conn_to_all_pods_in_a_new_ns_connlist_output.txt index b07bde9e..777caec2 100644 --- a/test_outputs/connlist/exposure_test_conn_to_all_pods_in_a_new_ns_connlist_output.txt +++ b/test_outputs/connlist/exposure_test_conn_to_all_pods_in_a_new_ns_connlist_output.txt @@ -3,4 +3,4 @@ Egress Exposure: hello-world/workload-a[Deployment] => entire-cluster : All Connections Ingress Exposure: -hello-world/workload-a[Deployment] <= backend/all pods : TCP 8050 +hello-world/workload-a[Deployment] <= backend/[all pods] : TCP 8050 diff --git a/test_outputs/connlist/exposure_test_conn_with_new_pod_selector_and_ns_selector_connlist_output.txt b/test_outputs/connlist/exposure_test_conn_with_new_pod_selector_and_ns_selector_connlist_output.txt index b8a54337..5d6eb70e 100644 --- a/test_outputs/connlist/exposure_test_conn_with_new_pod_selector_and_ns_selector_connlist_output.txt +++ b/test_outputs/connlist/exposure_test_conn_with_new_pod_selector_and_ns_selector_connlist_output.txt @@ -6,7 +6,7 @@ hello-world/workload-a[Deployment] => 0.0.0.0-255.255.255.255 : All Connection hello-world/workload-a[Deployment] => entire-cluster : All Connections Ingress Exposure: -hello-world/workload-a[Deployment] <= namespace with {effect=NoSchedule}/pod with {role=monitoring} : TCP 8050 +hello-world/workload-a[Deployment] <= [namespace with {effect=NoSchedule}]/[pod with {role=monitoring}] : TCP 8050 Workloads not protected by network policies: hello-world/workload-a[Deployment] is not protected on Egress diff --git a/test_outputs/connlist/exposure_test_conn_with_only_pod_selector_connlist_output.txt b/test_outputs/connlist/exposure_test_conn_with_only_pod_selector_connlist_output.txt index 5a409a23..f094e98f 100644 --- a/test_outputs/connlist/exposure_test_conn_with_only_pod_selector_connlist_output.txt +++ b/test_outputs/connlist/exposure_test_conn_with_only_pod_selector_connlist_output.txt @@ -6,7 +6,7 @@ hello-world/workload-a[Deployment] => 0.0.0.0-255.255.255.255 : All Connection hello-world/workload-a[Deployment] => entire-cluster : All Connections Ingress Exposure: -hello-world/workload-a[Deployment] <= hello-world/pod with {role=monitoring} : TCP 8050 +hello-world/workload-a[Deployment] <= hello-world/[pod with {role=monitoring}] : TCP 8050 Workloads not protected by network policies: hello-world/workload-a[Deployment] is not protected on Egress diff --git a/test_outputs/connlist/exposure_test_conn_with_pod_selector_in_any_ns_connlist_output.txt b/test_outputs/connlist/exposure_test_conn_with_pod_selector_in_any_ns_connlist_output.txt index 93a758b6..c40e6ffd 100644 --- a/test_outputs/connlist/exposure_test_conn_with_pod_selector_in_any_ns_connlist_output.txt +++ b/test_outputs/connlist/exposure_test_conn_with_pod_selector_in_any_ns_connlist_output.txt @@ -6,7 +6,7 @@ hello-world/workload-a[Deployment] => 0.0.0.0-255.255.255.255 : All Connection hello-world/workload-a[Deployment] => entire-cluster : All Connections Ingress Exposure: -hello-world/workload-a[Deployment] <= all namespaces/pod with {role=monitoring} : TCP 8050 +hello-world/workload-a[Deployment] <= [all namespaces]/[pod with {role=monitoring}] : TCP 8050 Workloads not protected by network policies: hello-world/workload-a[Deployment] is not protected on Egress diff --git a/test_outputs/connlist/exposure_test_egress_exposure_with_named_port_connlist_output.txt b/test_outputs/connlist/exposure_test_egress_exposure_with_named_port_connlist_output.txt index 1fd11ac6..a930e260 100644 --- a/test_outputs/connlist/exposure_test_egress_exposure_with_named_port_connlist_output.txt +++ b/test_outputs/connlist/exposure_test_egress_exposure_with_named_port_connlist_output.txt @@ -1,6 +1,6 @@ Exposure Analysis Result: Egress Exposure: -hello-world/workload-a[Deployment] => namespace with {foo.com/managed-state=managed}/all pods : TCP http +hello-world/workload-a[Deployment] => [namespace with {foo.com/managed-state=managed}]/[all pods] : TCP http Ingress Exposure: hello-world/workload-a[Deployment] <= entire-cluster : TCP 8000 diff --git a/test_outputs/connlist/exposure_test_exposure_to_namespace_with_multiple_labels_connlist_output.txt b/test_outputs/connlist/exposure_test_exposure_to_namespace_with_multiple_labels_connlist_output.txt index 0f62de93..3a3ee313 100644 --- a/test_outputs/connlist/exposure_test_exposure_to_namespace_with_multiple_labels_connlist_output.txt +++ b/test_outputs/connlist/exposure_test_exposure_to_namespace_with_multiple_labels_connlist_output.txt @@ -6,7 +6,7 @@ hello-world/workload-a[Deployment] => 0.0.0.0-255.255.255.255 : All Connection hello-world/workload-a[Deployment] => entire-cluster : All Connections Ingress Exposure: -hello-world/workload-a[Deployment] <= namespace with {effect=NoSchedule,release=stable}/all pods : TCP 8050 +hello-world/workload-a[Deployment] <= [namespace with {effect=NoSchedule,release=stable}]/[all pods] : TCP 8050 Workloads not protected by network policies: hello-world/workload-a[Deployment] is not protected on Egress diff --git a/test_outputs/connlist/exposure_test_matched_and_unmatched_rules_focus_workload_hello-world_workload-a_connlist_output.dot b/test_outputs/connlist/exposure_test_matched_and_unmatched_rules_focus_workload_hello-world_workload-a_connlist_output.dot new file mode 100644 index 00000000..fe340f76 --- /dev/null +++ b/test_outputs/connlist/exposure_test_matched_and_unmatched_rules_focus_workload_hello-world_workload-a_connlist_output.dot @@ -0,0 +1,16 @@ +digraph { + subgraph "cluster_hello_world" { + color="black" + fontcolor="black" + "hello-world/workload-a[Deployment]" [label="workload-a[Deployment]" color="blue" fontcolor="blue"] + "hello-world/workload-b[Deployment]" [label="workload-b[Deployment]" color="blue" fontcolor="blue"] + label="hello-world" + } + "0.0.0.0-255.255.255.255" [label="0.0.0.0-255.255.255.255" color="red2" fontcolor="red2"] + "entire-cluster" [label="entire-cluster" color="red2" fontcolor="red2" shape=diamond] + "entire-cluster" -> "hello-world/workload-a[Deployment]" [label="TCP 8050" color="gold2" fontcolor="darkgreen"] + "hello-world/workload-a[Deployment]" -> "0.0.0.0-255.255.255.255" [label="All Connections" color="gold2" fontcolor="darkgreen"] + "hello-world/workload-a[Deployment]" -> "entire-cluster" [label="All Connections" color="gold2" fontcolor="darkgreen"] + "hello-world/workload-a[Deployment]" -> "hello-world/workload-b[Deployment]" [label="All Connections" color="gold2" fontcolor="darkgreen"] + "hello-world/workload-b[Deployment]" -> "hello-world/workload-a[Deployment]" [label="All Connections" color="gold2" fontcolor="darkgreen"] +} \ No newline at end of file diff --git a/test_outputs/connlist/exposure_test_matched_and_unmatched_rules_focus_workload_hello-world_workload-a_connlist_output.dot.png b/test_outputs/connlist/exposure_test_matched_and_unmatched_rules_focus_workload_hello-world_workload-a_connlist_output.dot.png new file mode 100644 index 0000000000000000000000000000000000000000..385744bab6635b4a627c7ed04fda19cefdfa5730 GIT binary patch literal 32196 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 K$!c+ + + + + + + + +cluster_hello_world + +hello-world + + + +hello-world/workload-a[Deployment] + +workload-a[Deployment] + + + +hello-world/workload-b[Deployment] + +workload-b[Deployment] + + + +hello-world/workload-a[Deployment]->hello-world/workload-b[Deployment] + + +All Connections + + + +0.0.0.0-255.255.255.255 + +0.0.0.0-255.255.255.255 + + + +hello-world/workload-a[Deployment]->0.0.0.0-255.255.255.255 + + +All Connections + + + +entire-cluster + +entire-cluster + + + +hello-world/workload-a[Deployment]->entire-cluster + + +All Connections + + + +hello-world/workload-b[Deployment]->hello-world/workload-a[Deployment] + + +All Connections + + + +entire-cluster->hello-world/workload-a[Deployment] + + +TCP 8050 + + + diff --git a/test_outputs/connlist/exposure_test_matched_and_unmatched_rules_focus_workload_hello-world_workload-a_connlist_output.txt b/test_outputs/connlist/exposure_test_matched_and_unmatched_rules_focus_workload_hello-world_workload-a_connlist_output.txt new file mode 100644 index 00000000..d90a3cb8 --- /dev/null +++ b/test_outputs/connlist/exposure_test_matched_and_unmatched_rules_focus_workload_hello-world_workload-a_connlist_output.txt @@ -0,0 +1,14 @@ +hello-world/workload-a[Deployment] => 0.0.0.0-255.255.255.255 : All Connections +hello-world/workload-a[Deployment] => hello-world/workload-b[Deployment] : All Connections +hello-world/workload-b[Deployment] => hello-world/workload-a[Deployment] : All Connections + +Exposure Analysis Result: +Egress Exposure: +hello-world/workload-a[Deployment] => 0.0.0.0-255.255.255.255 : All Connections +hello-world/workload-a[Deployment] => entire-cluster : All Connections + +Ingress Exposure: +hello-world/workload-a[Deployment] <= entire-cluster : TCP 8050 + +Workloads not protected by network policies: +hello-world/workload-a[Deployment] is not protected on Egress diff --git a/test_outputs/connlist/exposure_test_multiple_unmatched_rules_connlist_output.txt b/test_outputs/connlist/exposure_test_multiple_unmatched_rules_connlist_output.txt index 5bc39272..8d627c6d 100644 --- a/test_outputs/connlist/exposure_test_multiple_unmatched_rules_connlist_output.txt +++ b/test_outputs/connlist/exposure_test_multiple_unmatched_rules_connlist_output.txt @@ -6,9 +6,9 @@ hello-world/workload-a[Deployment] => 0.0.0.0-255.255.255.255 : All Connection hello-world/workload-a[Deployment] => entire-cluster : All Connections Ingress Exposure: -hello-world/workload-a[Deployment] <= namespace with {effect=NoSchedule}/all pods : TCP 8050 -hello-world/workload-a[Deployment] <= namespace with {foo.com/managed-state=managed}/all pods : TCP 8050 -hello-world/workload-a[Deployment] <= namespace with {release=stable}/all pods : All Connections +hello-world/workload-a[Deployment] <= [namespace with {effect=NoSchedule}]/[all pods] : TCP 8050 +hello-world/workload-a[Deployment] <= [namespace with {foo.com/managed-state=managed}]/[all pods] : TCP 8050 +hello-world/workload-a[Deployment] <= [namespace with {release=stable}]/[all pods] : All Connections Workloads not protected by network policies: hello-world/workload-a[Deployment] is not protected on Egress diff --git a/test_outputs/connlist/exposure_test_new_namespace_conn_and_entire_cluster_connlist_output.txt b/test_outputs/connlist/exposure_test_new_namespace_conn_and_entire_cluster_connlist_output.txt index 777f0a14..44e20775 100644 --- a/test_outputs/connlist/exposure_test_new_namespace_conn_and_entire_cluster_connlist_output.txt +++ b/test_outputs/connlist/exposure_test_new_namespace_conn_and_entire_cluster_connlist_output.txt @@ -12,8 +12,8 @@ hello-world/workload-b[Deployment] => 0.0.0.0-255.255.255.255 : All Connection hello-world/workload-b[Deployment] => entire-cluster : All Connections Ingress Exposure: +hello-world/workload-a[Deployment] <= [namespace with {foo.com/managed-state=managed}]/[all pods] : TCP 8050,8090 hello-world/workload-a[Deployment] <= entire-cluster : TCP 8050 -hello-world/workload-a[Deployment] <= namespace with {foo.com/managed-state=managed}/all pods : TCP 8050,8090 hello-world/workload-b[Deployment] <= 0.0.0.0-255.255.255.255 : All Connections hello-world/workload-b[Deployment] <= entire-cluster : All Connections diff --git a/test_outputs/connlist/exposure_test_pod_exposed_only_to_representative_peers_connlist_output.txt b/test_outputs/connlist/exposure_test_pod_exposed_only_to_representative_peers_connlist_output.txt index dc6799b5..353d593d 100644 --- a/test_outputs/connlist/exposure_test_pod_exposed_only_to_representative_peers_connlist_output.txt +++ b/test_outputs/connlist/exposure_test_pod_exposed_only_to_representative_peers_connlist_output.txt @@ -5,12 +5,12 @@ Exposure Analysis Result: Egress Exposure: hello-world/workload-a[Deployment] => 0.0.0.0-255.255.255.255 : All Connections hello-world/workload-a[Deployment] => entire-cluster : All Connections -hello-world/workload-b[Deployment] => namespace with {foo.com/managed-state=managed}/all pods : TCP 8050 +hello-world/workload-b[Deployment] => [namespace with {foo.com/managed-state=managed}]/[all pods] : TCP 8050 Ingress Exposure: hello-world/workload-a[Deployment] <= 0.0.0.0-255.255.255.255 : All Connections hello-world/workload-a[Deployment] <= entire-cluster : All Connections -hello-world/workload-b[Deployment] <= namespace with {foo.com/managed-state=managed}/all pods : TCP 8050 +hello-world/workload-b[Deployment] <= [namespace with {foo.com/managed-state=managed}]/[all pods] : TCP 8050 Workloads not protected by network policies: hello-world/workload-a[Deployment] is not protected on Egress diff --git a/test_outputs/connlist/exposure_test_same_unmatched_rule_in_ingress_egress_connlist_output.txt b/test_outputs/connlist/exposure_test_same_unmatched_rule_in_ingress_egress_connlist_output.txt index 9d844f36..ce914035 100644 --- a/test_outputs/connlist/exposure_test_same_unmatched_rule_in_ingress_egress_connlist_output.txt +++ b/test_outputs/connlist/exposure_test_same_unmatched_rule_in_ingress_egress_connlist_output.txt @@ -1,7 +1,7 @@ Exposure Analysis Result: Egress Exposure: -hello-world/workload-a[Deployment] => namespace with {foo.com/managed-state=managed}/all pods : TCP 8050 +hello-world/workload-a[Deployment] => [namespace with {foo.com/managed-state=managed}]/[all pods] : TCP 8050 Ingress Exposure: +hello-world/workload-a[Deployment] <= [namespace with {foo.com/managed-state=managed}]/[all pods] : TCP 8000,8090 hello-world/workload-a[Deployment] <= entire-cluster : TCP 8000 -hello-world/workload-a[Deployment] <= namespace with {foo.com/managed-state=managed}/all pods : TCP 8000,8090