// AddTriggerEdges creates edges that point to named Docker image repositories for each image used in the deployment. func AddTriggerEdges(g osgraph.MutableUniqueGraph, node *deploygraph.DeploymentConfigNode) *deploygraph.DeploymentConfigNode { podTemplate := node.DeploymentConfig.Spec.Template if podTemplate == nil { return node } deployapi.EachTemplateImage( &podTemplate.Spec, deployapi.DeploymentConfigHasTrigger(node.DeploymentConfig), func(image deployapi.TemplateImage, err error) { if err != nil { return } if image.From != nil { if len(image.From.Name) == 0 { return } name, tag, _ := imageapi.SplitImageStreamTag(image.From.Name) in := imagegraph.FindOrCreateSyntheticImageStreamTagNode(g, imagegraph.MakeImageStreamTagObjectMeta(image.From.Namespace, name, tag)) g.AddEdge(in, node, TriggersDeploymentEdgeKind) return } tag := image.Ref.Tag image.Ref.Tag = "" in := imagegraph.EnsureDockerRepositoryNode(g, image.Ref.String(), tag) g.AddEdge(in, node, UsedInDeploymentEdgeKind) }) return node }
// AddOutputEdges links the build config to its output image node. func AddOutputEdges(g osgraph.MutableUniqueGraph, node *buildgraph.BuildConfigNode) { if node.BuildConfig.Spec.Output.To == nil { return } out := imageRefNode(g, node.BuildConfig.Spec.Output.To, node.BuildConfig) g.AddEdge(node, out, BuildOutputEdgeKind) }
// AddTriggerEdges creates edges that point to named Docker image repositories for each image used in the deployment. func AddTriggerEdges(g osgraph.MutableUniqueGraph, node *deploygraph.DeploymentConfigNode) *deploygraph.DeploymentConfigNode { rcTemplate := node.DeploymentConfig.Template.ControllerTemplate.Template if rcTemplate == nil { return node } EachTemplateImage( &rcTemplate.Spec, DeploymentConfigHasTrigger(node.DeploymentConfig), func(image TemplateImage, err error) { if err != nil { return } if image.From != nil { if len(image.From.Name) == 0 { return } in := imagegraph.EnsureImageStreamTagNode(g, image.From.Namespace, image.From.Name, image.FromTag) g.AddEdge(in, node, TriggersDeploymentEdgeKind) return } tag := image.Ref.Tag image.Ref.Tag = "" in := imagegraph.EnsureDockerRepositoryNode(g, image.Ref.String(), tag) g.AddEdge(in, node, UsedInDeploymentEdgeKind) }) return node }
// AddRouteEdges adds an edge that connect a service to a route in the given graph func AddRouteEdges(g osgraph.MutableUniqueGraph, node *routegraph.RouteNode) { syntheticService := &kapi.Service{} syntheticService.Namespace = node.Namespace syntheticService.Name = node.Spec.To.Name serviceNode := kubegraph.FindOrCreateSyntheticServiceNode(g, syntheticService) g.AddEdge(node, serviceNode, ExposedThroughRouteEdgeKind) }
// AddBuildEdges adds edges that connect a BuildConfig to Builds to the given graph func AddBuildEdges(g osgraph.MutableUniqueGraph, node *buildgraph.BuildConfigNode) { for _, n := range g.(graph.Graph).Nodes() { if buildNode, ok := n.(*buildgraph.BuildNode); ok { if belongsToBuildConfig(node.BuildConfig, buildNode.Build) { g.AddEdge(node, buildNode, BuildEdgeKind) } } } }
// AddInputEdges links the build config to its input image and source nodes. func AddInputEdges(g osgraph.MutableUniqueGraph, node *buildgraph.BuildConfigNode) { if in := buildgraph.EnsureSourceRepositoryNode(g, node.BuildConfig.Spec.Source); in != nil { g.AddEdge(in, node, BuildInputEdgeKind) } inputImage := buildutil.GetImageStreamForStrategy(node.BuildConfig.Spec.Strategy) if input := imageRefNode(g, inputImage, node.BuildConfig); input != nil { g.AddEdge(input, node, BuildInputImageEdgeKind) } }
// AddImageStreamImageRefEdge ensures that a directed edge exists between an ImageStreamImage Node and the IS it references func AddImageStreamImageRefEdge(g osgraph.MutableUniqueGraph, node *imagegraph.ImageStreamImageNode) { dockImgRef, _ := imageapi.ParseDockerImageReference(node.Name) imageStream := &imageapi.ImageStream{} imageStream.Namespace = node.Namespace imageStream.Name = dockImgRef.Name imageStreamNode := imagegraph.FindOrCreateSyntheticImageStreamNode(g, imageStream) g.AddEdge(node, imageStreamNode, ReferencedImageStreamImageGraphEdgeKind) }
// AddImageStreamRefEdge ensures that a directed edge exists between an IST Node and the IS it references func AddImageStreamRefEdge(g osgraph.MutableUniqueGraph, node *imagegraph.ImageStreamTagNode) { isName, _, _ := imageapi.SplitImageStreamTag(node.Name) imageStream := &imageapi.ImageStream{} imageStream.Namespace = node.Namespace imageStream.Name = isName imageStreamNode := imagegraph.FindOrCreateSyntheticImageStreamNode(g, imageStream) g.AddEdge(node, imageStreamNode, ReferencedImageStreamGraphEdgeKind) }
func AddDeploymentEdges(g osgraph.MutableUniqueGraph, node *deploygraph.DeploymentConfigNode) *deploygraph.DeploymentConfigNode { for _, n := range g.(graph.Graph).Nodes() { if rcNode, ok := n.(*kubegraph.ReplicationControllerNode); ok { if BelongsToDeploymentConfig(node.DeploymentConfig, rcNode.ReplicationController) { g.AddEdge(node, rcNode, DeploymentEdgeKind) } } } return node }
// AddTriggerEdges links the build config to its trigger input image nodes. func AddTriggerEdges(g osgraph.MutableUniqueGraph, node *buildgraph.BuildConfigNode) { for _, trigger := range node.BuildConfig.Spec.Triggers { if trigger.Type != buildapi.ImageChangeBuildTriggerType { continue } from := trigger.ImageChange.From if trigger.ImageChange.From == nil { from = buildutil.GetImageStreamForStrategy(node.BuildConfig.Spec.Strategy) } triggerNode := imageRefNode(g, from, node.BuildConfig) g.AddEdge(triggerNode, node, BuildTriggerImageEdgeKind) } }
// AddManagedByRCPodEdges ensures that a directed edge exists between an RC and all the pods // in the graph that match the label selector func AddManagedByRCPodEdges(g osgraph.MutableUniqueGraph, rcNode *kubegraph.ReplicationControllerNode) { if rcNode.Spec.Selector == nil { return } query := labels.SelectorFromSet(rcNode.Spec.Selector) for _, n := range g.(graph.Graph).Nodes() { switch target := n.(type) { case *kubegraph.PodNode: if query.Matches(labels.Set(target.Labels)) { g.AddEdge(target, rcNode, ManagedByRCEdgeKind) } } } }
// AddExposedPodEdges ensures that a directed edge exists between a service and all the pods // in the graph that match the service selector func AddExposedPodEdges(g osgraph.MutableUniqueGraph, node *kubegraph.ServiceNode) { if node.Service.Spec.Selector == nil { return } query := labels.SelectorFromSet(node.Service.Spec.Selector) for _, n := range g.(graph.Graph).Nodes() { switch target := n.(type) { case *kubegraph.PodNode: if query.Matches(labels.Set(target.Labels)) { g.AddEdge(target, node, ExposedThroughServiceEdgeKind) } } } }
func EnsurePetSetSpecNode(g osgraph.MutableUniqueGraph, spec *kapps.PetSetSpec, namespace string, ownerName osgraph.UniqueName) *PetSetSpecNode { specName := PetSetSpecNodeName(spec, ownerName) specNode := osgraph.EnsureUnique(g, specName, func(node osgraph.Node) graph.Node { return &PetSetSpecNode{node, spec, namespace, ownerName} }, ).(*PetSetSpecNode) ptSpecNode := EnsurePodTemplateSpecNode(g, &spec.Template, namespace, specName) g.AddEdge(specNode, ptSpecNode, osgraph.ContainsEdgeKind) return specNode }
func EnsurePetSetNode(g osgraph.MutableUniqueGraph, petset *kapps.PetSet) *PetSetNode { nodeName := PetSetNodeName(petset) node := osgraph.EnsureUnique(g, nodeName, func(node osgraph.Node) graph.Node { return &PetSetNode{node, petset} }, ).(*PetSetNode) specNode := EnsurePetSetSpecNode(g, &petset.Spec, petset.Namespace, nodeName) g.AddEdge(node, specNode, osgraph.ContainsEdgeKind) return node }
// EnsureReplicationControllerNode adds a graph node for the ReplicationController if it does not already exist. func EnsureReplicationControllerNode(g osgraph.MutableUniqueGraph, rc *kapi.ReplicationController) *ReplicationControllerNode { rcNodeName := ReplicationControllerNodeName(rc) rcNode := osgraph.EnsureUnique(g, rcNodeName, func(node osgraph.Node) graph.Node { return &ReplicationControllerNode{node, rc} }, ).(*ReplicationControllerNode) rcSpecNode := EnsureReplicationControllerSpecNode(g, &rc.Spec, rcNodeName) g.AddEdge(rcNode, rcSpecNode, osgraph.ContainsEdgeKind) return rcNode }
func EnsurePodTemplateSpecNode(g osgraph.MutableUniqueGraph, ptSpec *kapi.PodTemplateSpec, ownerName osgraph.UniqueName) *PodTemplateSpecNode { ptSpecName := PodTemplateSpecNodeName(ptSpec, ownerName) ptSpecNode := osgraph.EnsureUnique(g, ptSpecName, func(node osgraph.Node) graph.Node { return &PodTemplateSpecNode{node, ptSpec, ownerName} }, ).(*PodTemplateSpecNode) podSpecNode := EnsurePodSpecNode(g, &ptSpec.Spec, ptSpecName) g.AddEdge(ptSpecNode, podSpecNode, osgraph.ContainsEdgeKind) return ptSpecNode }
func EnsurePodNode(g osgraph.MutableUniqueGraph, pod *kapi.Pod) *PodNode { podNodeName := PodNodeName(pod) podNode := osgraph.EnsureUnique(g, podNodeName, func(node osgraph.Node) graph.Node { return &PodNode{node, pod} }, ).(*PodNode) podSpecNode := EnsurePodSpecNode(g, &pod.Spec, podNodeName) g.AddEdge(podNode, podSpecNode, osgraph.ContainsEdgeKind) return podNode }
func AddDeploymentEdges(g osgraph.MutableUniqueGraph, node *deploygraph.DeploymentConfigNode) *deploygraph.DeploymentConfigNode { for _, n := range g.(graph.Graph).Nodes() { if rcNode, ok := n.(*kubegraph.ReplicationControllerNode); ok { if rcNode.ReplicationController.Namespace != node.DeploymentConfig.Namespace { continue } if BelongsToDeploymentConfig(node.DeploymentConfig, rcNode.ReplicationController) { g.AddEdge(node, rcNode, DeploymentEdgeKind) g.AddEdge(rcNode, node, kubeedges.ManagedByControllerEdgeKind) } } } return node }
// EnsureDeploymentConfigNode adds the provided deployment config to the graph if it does not exist func EnsureDeploymentConfigNode(g osgraph.MutableUniqueGraph, dc *depoyapi.DeploymentConfig) *DeploymentConfigNode { dcName := DeploymentConfigNodeName(dc) dcNode := osgraph.EnsureUnique( g, dcName, func(node osgraph.Node) graph.Node { return &DeploymentConfigNode{Node: node, DeploymentConfig: dc} }, ).(*DeploymentConfigNode) rcSpecNode := kubegraph.EnsureReplicationControllerSpecNode(g, &dc.Template.ControllerTemplate, dcName) g.AddEdge(dcNode, rcSpecNode, osgraph.ContainsEdgeKind) return dcNode }
func EnsureReplicationControllerSpecNode(g osgraph.MutableUniqueGraph, rcSpec *kapi.ReplicationControllerSpec, ownerName osgraph.UniqueName) *ReplicationControllerSpecNode { rcSpecName := ReplicationControllerSpecNodeName(rcSpec, ownerName) rcSpecNode := osgraph.EnsureUnique(g, rcSpecName, func(node osgraph.Node) graph.Node { return &ReplicationControllerSpecNode{node, rcSpec, ownerName} }, ).(*ReplicationControllerSpecNode) if rcSpec.Template != nil { ptSpecNode := EnsurePodTemplateSpecNode(g, rcSpec.Template, rcSpecName) g.AddEdge(rcSpecNode, ptSpecNode, osgraph.ContainsEdgeKind) } return rcSpecNode }
// AddManagedByControllerPodEdges ensures that a directed edge exists between a controller and all the pods // in the graph that match the label selector func AddManagedByControllerPodEdges(g osgraph.MutableUniqueGraph, to graph.Node, namespace string, selector map[string]string) { if selector == nil { return } query := labels.SelectorFromSet(selector) for _, n := range g.(graph.Graph).Nodes() { switch target := n.(type) { case *kubegraph.PodNode: if target.Namespace != namespace { continue } if query.Matches(labels.Set(target.Labels)) { g.AddEdge(target, to, ManagedByControllerEdgeKind) } } } }
// EnsureDeploymentConfigNode adds the provided deployment config to the graph if it does not exist func EnsureDeploymentConfigNode(g osgraph.MutableUniqueGraph, dc *depoyapi.DeploymentConfig) *DeploymentConfigNode { dcName := DeploymentConfigNodeName(dc) dcNode := osgraph.EnsureUnique( g, dcName, func(node osgraph.Node) graph.Node { return &DeploymentConfigNode{Node: node, DeploymentConfig: dc} }, ).(*DeploymentConfigNode) if dc.Spec.Template != nil { podTemplateSpecNode := kubegraph.EnsurePodTemplateSpecNode(g, dc.Spec.Template, dcName) g.AddEdge(dcNode, podTemplateSpecNode, osgraph.ContainsEdgeKind) } return dcNode }
// AddInputOutputEdges links the build config to other nodes for the images and source repositories it depends on. func AddInputOutputEdges(g osgraph.MutableUniqueGraph, node *buildgraph.BuildConfigNode) *buildgraph.BuildConfigNode { output := node.BuildConfig.Parameters.Output to := output.To switch { case to != nil && len(to.Name) > 0: out := imagegraph.FindOrCreateSyntheticImageStreamTagNode(g, imagegraph.MakeImageStreamTagObjectMeta(defaultNamespace(to.Namespace, node.BuildConfig.Namespace), to.Name, output.Tag)) g.AddEdge(node, out, BuildOutputEdgeKind) case len(output.DockerImageReference) > 0: out := imagegraph.EnsureDockerRepositoryNode(g, output.DockerImageReference, output.Tag) g.AddEdge(node, out, BuildOutputEdgeKind) } if in := buildgraph.EnsureSourceRepositoryNode(g, node.BuildConfig.Parameters.Source); in != nil { g.AddEdge(in, node, BuildInputEdgeKind) } from := buildutil.GetImageStreamForStrategy(node.BuildConfig.Parameters.Strategy) if from != nil { switch from.Kind { case "DockerImage": if ref, err := imageapi.ParseDockerImageReference(from.Name); err == nil { tag := ref.Tag ref.Tag = "" in := imagegraph.EnsureDockerRepositoryNode(g, ref.String(), tag) g.AddEdge(in, node, BuildInputImageEdgeKind) } case "ImageStream": tag := imageapi.DefaultImageTag in := imagegraph.FindOrCreateSyntheticImageStreamTagNode(g, imagegraph.MakeImageStreamTagObjectMeta(defaultNamespace(from.Namespace, node.BuildConfig.Namespace), from.Name, tag)) g.AddEdge(in, node, BuildInputImageEdgeKind) case "ImageStreamTag": name, tag, _ := imageapi.SplitImageStreamTag(from.Name) in := imagegraph.FindOrCreateSyntheticImageStreamTagNode(g, imagegraph.MakeImageStreamTagObjectMeta(defaultNamespace(from.Namespace, node.BuildConfig.Namespace), name, tag)) g.AddEdge(in, node, BuildInputImageEdgeKind) case "ImageStreamImage": glog.V(4).Infof("Ignoring ImageStreamImage reference in BuildConfig %s/%s", node.BuildConfig.Namespace, node.BuildConfig.Name) } } return node }
// AddInputOutputEdges links the build config to other nodes for the images and source repositories it depends on. func AddInputOutputEdges(g osgraph.MutableUniqueGraph, node *buildgraph.BuildConfigNode) *buildgraph.BuildConfigNode { output := node.BuildConfig.Spec.Output to := output.To switch { case to == nil: case to.Kind == "DockerImage": out := imagegraph.EnsureDockerRepositoryNode(g, to.Name, "") g.AddEdge(node, out, BuildOutputEdgeKind) case to.Kind == "ImageStreamTag": out := imagegraph.FindOrCreateSyntheticImageStreamTagNode(g, imagegraph.MakeImageStreamTagObjectMeta2(defaultNamespace(to.Namespace, node.BuildConfig.Namespace), to.Name)) g.AddEdge(node, out, BuildOutputEdgeKind) } if in := buildgraph.EnsureSourceRepositoryNode(g, node.BuildConfig.Spec.Source); in != nil { g.AddEdge(in, node, BuildInputEdgeKind) } from := buildutil.GetImageStreamForStrategy(node.BuildConfig.Spec.Strategy) if from != nil { switch from.Kind { case "DockerImage": if ref, err := imageapi.ParseDockerImageReference(from.Name); err == nil { tag := ref.Tag ref.Tag = "" in := imagegraph.EnsureDockerRepositoryNode(g, ref.String(), tag) g.AddEdge(in, node, BuildInputImageEdgeKind) } case "ImageStream": in := imagegraph.FindOrCreateSyntheticImageStreamTagNode(g, imagegraph.MakeImageStreamTagObjectMeta(defaultNamespace(from.Namespace, node.BuildConfig.Namespace), from.Name, imageapi.DefaultImageTag)) g.AddEdge(in, node, BuildInputImageEdgeKind) case "ImageStreamTag": in := imagegraph.FindOrCreateSyntheticImageStreamTagNode(g, imagegraph.MakeImageStreamTagObjectMeta2(defaultNamespace(from.Namespace, node.BuildConfig.Namespace), from.Name)) g.AddEdge(in, node, BuildInputImageEdgeKind) case "ImageStreamImage": in := imagegraph.FindOrCreateSyntheticImageStreamImageNode(g, imagegraph.MakeImageStreamImageObjectMeta(defaultNamespace(from.Namespace, node.BuildConfig.Namespace), from.Name)) g.AddEdge(in, node, BuildInputImageEdgeKind) } } return node }