// findPendingTagMarkers is the guts behind FindPendingTags .... break out some of the content and reduce some indentation func findPendingTagMarkers(istNode *imagegraph.ImageStreamTagNode, g osgraph.Graph, f osgraph.Namer) []osgraph.Marker { markers := []osgraph.Marker{} buildFound := false bcNodes := buildedges.BuildConfigsForTag(g, graph.Node(istNode)) for _, bcNode := range bcNodes { latestBuild := buildedges.GetLatestBuild(g, bcNode) // A build config points to the non existent tag but no current build exists. if latestBuild == nil { continue } buildFound = true // A build config points to the non existent tag but something is going on with // the latest build. // TODO: Handle other build phases. switch latestBuild.Build.Status.Phase { case buildapi.BuildPhaseCancelled: // TODO: Add a warning here. case buildapi.BuildPhaseError: // TODO: Add a warning here. case buildapi.BuildPhaseComplete: // We should never hit this. The output of our build is missing but the build is complete. // Most probably the user has messed up? case buildapi.BuildPhaseFailed: // Since the tag hasn't been populated yet, we assume there hasn't been a successful // build so far. markers = append(markers, osgraph.Marker{ Node: graph.Node(latestBuild), RelatedNodes: []graph.Node{graph.Node(istNode), graph.Node(bcNode)}, Severity: osgraph.ErrorSeverity, Key: LatestBuildFailedErr, Message: fmt.Sprintf("%s has failed.", f.ResourceName(latestBuild)), Suggestion: osgraph.Suggestion(fmt.Sprintf("Inspect the build failure with 'oc logs -f bc/%s'", bcNode.BuildConfig.GetName())), }) default: // Do nothing when latest build is new, pending, or running. } } // if no current builds exist for any of the build configs, append marker for that // but ignore ISTs which have no build configs if !buildFound && len(bcNodes) > 0 { markers = append(markers, osgraph.Marker{ Node: graph.Node(istNode), RelatedNodes: bcNodesToRelatedNodes(bcNodes), Severity: osgraph.WarningSeverity, Key: TagNotAvailableWarning, Message: fmt.Sprintf("%s needs to be imported or created by a build.", f.ResourceName(istNode)), Suggestion: osgraph.Suggestion(multiBCStartBuildSuggestion(bcNodes)), }) } return markers }
// ictMarker inspects the image change triggers for the provided deploymentconfig and returns // a marker in case of the following two scenarios: // // 1. The image stream pointed by the dc trigger doen not exist. // 2. The image stream tag pointed by the dc trigger does not exist and there is no build in // flight that could push to the tag. func ictMarker(g osgraph.Graph, f osgraph.Namer, dcNode *deploygraph.DeploymentConfigNode) *osgraph.Marker { for _, uncastIstNode := range g.PredecessorNodesByEdgeKind(dcNode, deployedges.TriggersDeploymentEdgeKind) { if istNode := uncastIstNode.(*imagegraph.ImageStreamTagNode); !istNode.Found() { // The image stream for the tag of interest does not exist. if isNode, exists := doesImageStreamExist(g, uncastIstNode); !exists { return &osgraph.Marker{ Node: dcNode, RelatedNodes: []graph.Node{uncastIstNode, isNode}, Severity: osgraph.ErrorSeverity, Key: MissingImageStreamErr, Message: fmt.Sprintf("The image trigger for %s will have no effect because %s does not exist.", f.ResourceName(dcNode), f.ResourceName(isNode)), // TODO: Suggest `oc create imagestream` once we have that. } } for _, bcNode := range buildedges.BuildConfigsForTag(g, istNode) { // Avoid warning for the dc image trigger in case there is a build in flight. if latestBuild := buildedges.GetLatestBuild(g, bcNode); latestBuild != nil && !buildutil.IsBuildComplete(latestBuild.Build) { return nil } } // The image stream tag of interest does not exist. return &osgraph.Marker{ Node: dcNode, RelatedNodes: []graph.Node{uncastIstNode}, Severity: osgraph.WarningSeverity, Key: MissingImageStreamTagWarning, Message: fmt.Sprintf("The image trigger for %s will have no effect until %s is imported or created by a build.", f.ResourceName(dcNode), f.ResourceName(istNode)), } } } return nil }