github.com/jfrog/jfrog-cli-core/v2@v2.52.0/utils/xray/xrayutils.go (about)

     1  package xray
     2  
     3  import (
     4  	"github.com/jfrog/jfrog-cli-core/v2/utils/config"
     5  	clientconfig "github.com/jfrog/jfrog-client-go/config"
     6  	"github.com/jfrog/jfrog-client-go/xray"
     7  	xrayUtils "github.com/jfrog/jfrog-client-go/xray/services/utils"
     8  )
     9  
    10  func CreateXrayServiceManager(serviceDetails *config.ServerDetails) (*xray.XrayServicesManager, error) {
    11  	xrayDetails, err := serviceDetails.CreateXrayAuthConfig()
    12  	if err != nil {
    13  		return nil, err
    14  	}
    15  	serviceConfig, err := clientconfig.NewConfigBuilder().
    16  		SetServiceDetails(xrayDetails).
    17  		Build()
    18  	if err != nil {
    19  		return nil, err
    20  	}
    21  	return xray.New(serviceConfig)
    22  }
    23  
    24  func CreateXrayServiceManagerAndGetVersion(serviceDetails *config.ServerDetails) (*xray.XrayServicesManager, string, error) {
    25  	xrayManager, err := CreateXrayServiceManager(serviceDetails)
    26  	if err != nil {
    27  		return nil, "", err
    28  	}
    29  	xrayVersion, err := xrayManager.GetVersion()
    30  	if err != nil {
    31  		return nil, "", err
    32  	}
    33  	return xrayManager, xrayVersion, nil
    34  }
    35  
    36  const maxUniqueAppearances = 10
    37  
    38  type DepTreeNode struct {
    39  	Types    *[]string `json:"types"`
    40  	Children []string  `json:"children"`
    41  }
    42  
    43  func toNodeTypesMap(depMap map[string]DepTreeNode) map[string][]string {
    44  	mapOfTypes := map[string][]string{}
    45  	for nodId, value := range depMap {
    46  		mapOfTypes[nodId] = nil
    47  		if value.Types != nil {
    48  			mapOfTypes[nodId] = *value.Types
    49  		}
    50  	}
    51  	return mapOfTypes
    52  }
    53  
    54  func BuildXrayDependencyTree(treeHelper map[string]DepTreeNode, nodeId string) (*xrayUtils.GraphNode, map[string][]string) {
    55  	rootNode := &xrayUtils.GraphNode{
    56  		Id:    nodeId,
    57  		Nodes: []*xrayUtils.GraphNode{},
    58  	}
    59  	dependencyAppearances := map[string]int8{}
    60  	populateXrayDependencyTree(rootNode, treeHelper, dependencyAppearances)
    61  	return rootNode, toNodeTypesMap(treeHelper)
    62  }
    63  
    64  func populateXrayDependencyTree(currNode *xrayUtils.GraphNode, treeHelper map[string]DepTreeNode, dependencyAppearances map[string]int8) {
    65  	dependencyAppearances[currNode.Id]++
    66  	if _, ok := treeHelper[currNode.Id]; !ok {
    67  		treeHelper[currNode.Id] = DepTreeNode{}
    68  	}
    69  	// Recursively create & append all node's dependencies.
    70  	for _, childDepId := range treeHelper[currNode.Id].Children {
    71  		childNode := &xrayUtils.GraphNode{
    72  			Id:     childDepId,
    73  			Nodes:  []*xrayUtils.GraphNode{},
    74  			Parent: currNode,
    75  			Types:  treeHelper[childDepId].Types,
    76  		}
    77  		if dependencyAppearances[childDepId] >= maxUniqueAppearances || childNode.NodeHasLoop() {
    78  			continue
    79  		}
    80  		currNode.Nodes = append(currNode.Nodes, childNode)
    81  		populateXrayDependencyTree(childNode, treeHelper, dependencyAppearances)
    82  	}
    83  }