func()

in pkg/skoop/collector/manager/manager.go [160:252]


func (m *simplePodCollectorManager) buildCache(nodeName string) error {
	dump, err := m.collectNodeStackDump(nodeName)
	if err != nil {
		return err
	}

	netnsMap := map[string]netstack.NetNSInfo{}

	for _, netns := range dump.Netns {
		netnsMap[netns.Netns] = netns
	}

	if _, ok := netnsMap[hostnsKey]; !ok {
		return fmt.Errorf("cannot get host netns info for node %s", nodeName)
	}

	hostNetNS := netnsMap[hostnsKey]
	nodeInfo := &k8s.NodeInfo{
		SubNetNSInfo: dump.Netns,
		NetNS:        netstack.NetNS{NetNSInfo: &hostNetNS},
		NodeMeta: k8s.NodeMeta{
			NodeName: nodeName,
		},
	}

	nodeInfo.Router = netstack.NewSimulateRouter(nodeInfo.NetNSInfo.RuleInfo, nodeInfo.NetNSInfo.RouteInfo, nodeInfo.NetNSInfo.Interfaces)
	nodeInfo.IPVS = netstack.NewIPVS(nodeInfo.NetNSInfo.IPVSInfo)
	nodeInfo.IPTables = netstack.ParseIPTables(nodeInfo.NetNSInfo.IptablesInfo)
	if err != nil {
		return err
	}
	nodeInfo.IPSetManager, err = netstack.NewIPSetManager(nodeInfo.NetNSInfo.IpsetInfo)
	if err != nil {
		return err
	}
	nodeInfo.Interfaces = nodeInfo.NetNSInfo.Interfaces
	nodeInfo.Neighbour = netstack.NewNeigh(nodeInfo.NetNSInfo.Interfaces)
	nodeInfo.Netfilter = netstack.NewSimulateNetfilter(netstack.SimulateNetfilterContext{
		IPTables: nodeInfo.IPTables,
		IPSet:    nodeInfo.IPSetManager,
		Router:   nodeInfo.Router,
		IPVS:     nodeInfo.IPVS,
	})

	m.nodeCache[nodeName] = nodeInfo

	for _, p := range dump.Pods {
		podInfo := &k8s.Pod{
			PodMeta: k8s.PodMeta{
				Namespace:   p.PodNamespace,
				PodName:     p.PodName,
				HostNetwork: p.NetworkMode == "host",
				NodeName:    nodeName,
			},
		}

		if podInfo.HostNetwork {
			podInfo.NetNSInfo = nodeInfo.NetNSInfo
		} else {
			podNetNS, ok := netnsMap[p.Netns]
			if !ok {
				return fmt.Errorf("cannot get pod netns info for pod %s/%s, node %s", p.PodNamespace, p.PodName, nodeName)
			}
			podInfo.NetNSInfo = &podNetNS
		}

		podInfo.IPVS = netstack.NewIPVS(podInfo.NetNSInfo.IPVSInfo)
		podInfo.IPTables = netstack.ParseIPTables(podInfo.NetNSInfo.IptablesInfo)
		if err != nil {
			return err
		}
		podInfo.IPSetManager, err = netstack.NewIPSetManager(podInfo.NetNSInfo.IpsetInfo)
		if err != nil {
			return err
		}

		podInfo.Router = netstack.NewSimulateRouter(podInfo.NetNSInfo.RuleInfo, podInfo.NetNSInfo.RouteInfo, podInfo.NetNSInfo.Interfaces)
		podInfo.Interfaces = podInfo.NetNSInfo.Interfaces
		podInfo.Neighbour = netstack.NewNeigh(podInfo.NetNSInfo.Interfaces)
		podInfo.Netfilter = netstack.NewSimulateNetfilter(netstack.SimulateNetfilterContext{
			IPTables: podInfo.IPTables,
			IPSet:    podInfo.IPSetManager,
			Router:   podInfo.Router,
			IPVS:     podInfo.IPVS,
		})

		podKey := fmt.Sprintf("%s/%s", p.PodNamespace, p.PodName)

		m.podCache[podKey] = podInfo
	}

	return nil
}