github.com/jfrog/jfrog-cli-core/v2@v2.51.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 }