@@ -20,6 +20,7 @@ import (
2020 "context"
2121 "fmt"
2222 "net/http"
23+ "sort"
2324 "time"
2425
2526 OCICommon "github.com/oracle/oci-go-sdk/v65/common"
@@ -30,6 +31,14 @@ import (
3031 "github.com/NVIDIA/topograph/pkg/common"
3132)
3233
34+ type level int
35+
36+ const (
37+ localBlockLevel level = iota + 1
38+ networkBlockLevel
39+ hpcIslandLevel
40+ )
41+
3342func GenerateInstanceTopology (ctx context.Context , creds OCICommon.ConfigurationProvider , cis []common.ComputeInstances ) ([]* core.ComputeBareMetalHostSummary , error ) {
3443 var err error
3544 bareMetalHostSummaries := []* core.ComputeBareMetalHostSummary {}
@@ -144,73 +153,51 @@ func toGraph(bareMetalHostSummaries []*core.ComputeBareMetalHostSummary, cis []c
144153
145154 nodes := make (map [string ]* common.Vertex )
146155 forest := make (map [string ]* common.Vertex )
147-
156+ levelWiseSwitchCount := map [level ]int {localBlockLevel : 0 , networkBlockLevel : 0 , hpcIslandLevel : 0 }
157+ bareMetalHostSummaries = filterAndSort (bareMetalHostSummaries , instanceToNodeMap )
148158 for _ , bmhSummary := range bareMetalHostSummaries {
149- if bmhSummary .InstanceId == nil {
150- klog .V (5 ).Infof ("Skipped bmhSummary %s" , bmhSummary .String ())
151- continue
152- }
153- nodeName , ok := instanceToNodeMap [* bmhSummary .InstanceId ]
154- if ! ok {
155- klog .V (5 ).Infof ("Node not found for instance ID %s" , * bmhSummary .InstanceId )
156- continue
157- }
158- klog .V (4 ).Infof ("Found node %q instance %q" , nodeName , * bmhSummary .InstanceId )
159+ nodeName := instanceToNodeMap [* bmhSummary .InstanceId ]
159160 delete (instanceToNodeMap , * bmhSummary .InstanceId )
160161
161162 instance := & common.Vertex {
162163 Name : nodeName ,
163164 ID : * bmhSummary .InstanceId ,
164165 }
165166
166- localBlockId := "lb_nil"
167- if bmhSummary .ComputeLocalBlockId != nil {
168- localBlockId = * bmhSummary .ComputeLocalBlockId
169- } else {
170- klog .Warningf ("ComputeLocalBlockId is nil for instance %q" , * bmhSummary .InstanceId )
171- missingAncestor .WithLabelValues ("localBlock" , nodeName ).Add (float64 (1 ))
172- }
173-
167+ localBlockId := * bmhSummary .ComputeLocalBlockId
174168 localBlock , ok := nodes [localBlockId ]
175169 if ! ok {
170+ levelWiseSwitchCount [localBlockLevel ]++
176171 localBlock = & common.Vertex {
177172 ID : localBlockId ,
178173 Vertices : make (map [string ]* common.Vertex ),
174+ Name : fmt .Sprintf ("Switch.%d.%d" , localBlockLevel , levelWiseSwitchCount [localBlockLevel ]),
179175 }
180176 nodes [localBlockId ] = localBlock
181177 }
182178 localBlock .Vertices [instance .ID ] = instance
183179
184- networkBlockId := "nw_nil"
185- if bmhSummary .ComputeNetworkBlockId != nil {
186- networkBlockId = * bmhSummary .ComputeNetworkBlockId
187- } else {
188- klog .Warningf ("ComputeNetworkBlockId is nil for instance %q" , * bmhSummary .InstanceId )
189- missingAncestor .WithLabelValues ("networkBlock" , nodeName ).Add (float64 (1 ))
190- }
191-
180+ networkBlockId := * bmhSummary .ComputeNetworkBlockId
192181 networkBlock , ok := nodes [networkBlockId ]
193182 if ! ok {
183+ levelWiseSwitchCount [networkBlockLevel ]++
194184 networkBlock = & common.Vertex {
195185 ID : networkBlockId ,
196186 Vertices : make (map [string ]* common.Vertex ),
187+ Name : fmt .Sprintf ("Switch.%d.%d" , networkBlockLevel , levelWiseSwitchCount [networkBlockLevel ]),
197188 }
198189 nodes [networkBlockId ] = networkBlock
199190 }
200191 networkBlock .Vertices [localBlockId ] = localBlock
201192
202- hpcIslandId := "hpc_nil"
203- if bmhSummary .ComputeHpcIslandId != nil {
204- hpcIslandId = * bmhSummary .ComputeHpcIslandId
205- } else {
206- klog .Warningf ("ComputeHpcIslandId is nil for instance %q" , * bmhSummary .InstanceId )
207- missingAncestor .WithLabelValues ("hpcIsland" , nodeName ).Add (float64 (1 ))
208- }
193+ hpcIslandId := * bmhSummary .ComputeHpcIslandId
209194 hpcIsland , ok := nodes [hpcIslandId ]
210195 if ! ok {
196+ levelWiseSwitchCount [hpcIslandLevel ]++
211197 hpcIsland = & common.Vertex {
212198 ID : hpcIslandId ,
213199 Vertices : make (map [string ]* common.Vertex ),
200+ Name : fmt .Sprintf ("Switch.%d.%d" , hpcIslandLevel , levelWiseSwitchCount [hpcIslandLevel ]),
214201 }
215202 nodes [hpcIslandId ] = hpcIsland
216203 forest [hpcIslandId ] = hpcIsland
@@ -244,6 +231,58 @@ func toGraph(bareMetalHostSummaries []*core.ComputeBareMetalHostSummary, cis []c
244231
245232}
246233
234+ func filterAndSort (bareMetalHostSummaries []* core.ComputeBareMetalHostSummary , instanceToNodeMap map [string ]string ) []* core.ComputeBareMetalHostSummary {
235+ var filtered []* core.ComputeBareMetalHostSummary
236+ for _ , bmh := range bareMetalHostSummaries {
237+ if bmh .InstanceId == nil {
238+ klog .V (5 ).Infof ("Instance ID is nil for bmhSummary %s" , bmh .String ())
239+ continue
240+ }
241+
242+ if bmh .ComputeLocalBlockId == nil {
243+ klog .Warningf ("ComputeLocalBlockId is nil for instance %q" , * bmh .InstanceId )
244+ missingAncestor .WithLabelValues ("localBlock" , * bmh .InstanceId ).Add (float64 (1 ))
245+ continue
246+ }
247+
248+ if bmh .ComputeNetworkBlockId == nil {
249+ klog .Warningf ("ComputeNetworkBlockId is nil for instance %q" , * bmh .InstanceId )
250+ missingAncestor .WithLabelValues ("networkBlock" , * bmh .InstanceId ).Add (float64 (1 ))
251+ continue
252+ }
253+
254+ if bmh .ComputeHpcIslandId == nil {
255+ klog .Warningf ("ComputeHpcIslandId is nil for instance %q" , * bmh .InstanceId )
256+ missingAncestor .WithLabelValues ("hpcIsland" , * bmh .InstanceId ).Add (float64 (1 ))
257+ continue
258+ }
259+
260+ if _ , ok := instanceToNodeMap [* bmh .InstanceId ]; ok {
261+ klog .V (4 ).Infof ("Adding bmhSummary %s" , bmh .String ())
262+ filtered = append (filtered , bmh )
263+ } else {
264+ klog .V (4 ).Infof ("Skipping bmhSummary %s" , bmh .String ())
265+ }
266+ }
267+
268+ sort .Slice (filtered , func (i , j int ) bool {
269+ if filtered [i ].ComputeHpcIslandId != filtered [j ].ComputeHpcIslandId {
270+ return * filtered [i ].ComputeHpcIslandId < * filtered [j ].ComputeHpcIslandId
271+ }
272+
273+ if filtered [i ].ComputeNetworkBlockId != filtered [j ].ComputeNetworkBlockId {
274+ return * filtered [i ].ComputeNetworkBlockId < * filtered [j ].ComputeNetworkBlockId
275+ }
276+
277+ if filtered [i ].ComputeLocalBlockId != filtered [j ].ComputeLocalBlockId {
278+ return * filtered [i ].ComputeLocalBlockId < * filtered [j ].ComputeLocalBlockId
279+ }
280+
281+ return * filtered [i ].InstanceId < * filtered [j ].InstanceId
282+ })
283+ return filtered
284+ }
285+
247286func generateInstanceTopology (ctx context.Context , provider OCICommon.ConfigurationProvider , ci * common.ComputeInstances , bareMetalHostSummaries []* core.ComputeBareMetalHostSummary ) ([]* core.ComputeBareMetalHostSummary , error ) {
248287 identityClient , err := identity .NewIdentityClientWithConfigurationProvider (provider )
249288 if err != nil {
0 commit comments