func AddAllRequestedServiceAccountEdges(g osgraph.Graph) { for _, node := range g.NodeList() { if podSpecNode, ok := node.(*kubegraph.PodSpecNode); ok { AddRequestedServiceAccountEdges(g, podSpecNode) } } }
func AddAllMountedSecretEdges(g osgraph.Graph) { for _, node := range g.NodeList() { if podSpecNode, ok := node.(*kubegraph.PodSpecNode); ok { AddMountedSecretEdges(g, podSpecNode) } } }
func AddAllMountableSecretEdges(g osgraph.Graph) { for _, node := range g.NodeList() { if saNode, ok := node.(*kubegraph.ServiceAccountNode); ok { AddMountableSecretEdges(g, saNode) } } }
// calculatePrunableLayers returns the list of prunable layers. func calculatePrunableLayers(g graph.Graph) []*imagegraph.ImageLayerNode { prunable := []*imagegraph.ImageLayerNode{} nodes := g.NodeList() for i := range nodes { layerNode, ok := nodes[i].(*imagegraph.ImageLayerNode) if !ok { continue } glog.V(4).Infof("Examining layer %q", layerNode.Layer) if layerIsPrunable(g, layerNode) { glog.V(4).Infof("Layer %q is prunable", layerNode.Layer) prunable = append(prunable, layerNode) } } return prunable }
// DeploymentPipelines returns a map of DeploymentConfigs to the deployment flows that create them, // extracted from the provided Graph. func DeploymentPipelines(g osgraph.Graph) (DeploymentPipelineMap, osgraph.NodeSet) { covered := make(osgraph.NodeSet) g = g.EdgeSubgraph(osgraph.ReverseGraphEdge) flows := make(DeploymentPipelineMap) for _, node := range g.NodeList() { switch t := node.(type) { case *deploygraph.DeploymentConfigNode: covered.Add(t.ID()) images := []ImagePipeline{} for _, n := range g.Neighbors(node) { // find incoming image edges only switch g.EdgeKind(g.EdgeBetween(node, n)) { case deployedges.TriggersDeploymentEdgeKind, deployedges.UsedInDeploymentEdgeKind: if flow, ok := ImagePipelineFromNode(g, n, covered); ok { images = append(images, flow) } } } output := []ImagePipeline{} // ensure the list of images is ordered the same as what is in the template if template := t.DeploymentConfig.Template.ControllerTemplate.Template; template != nil { deployedges.EachTemplateImage( &template.Spec, deployedges.DeploymentConfigHasTrigger(t.DeploymentConfig), func(image deployedges.TemplateImage, err error) { if err != nil { return } for i := range images { switch t := images[i].Image.(type) { case *imagegraph.ImageStreamTagNode: if image.Ref != nil { continue } from := image.From if t.ImageStream.Name != from.Name || t.ImageStream.Namespace != from.Namespace { continue } output = append(output, images[i]) return case *imagegraph.DockerImageRepositoryNode: if image.From != nil { continue } ref1, ref2 := t.Ref.Minimal(), image.Ref.DockerClientDefaults().Minimal() if ref1 != ref2 { continue } output = append(output, images[i]) return } } }, ) } flows[t] = output } } return flows, covered }