@@ -18,9 +18,11 @@ import {
18
18
createNode ,
19
19
defaultLayoutFactory ,
20
20
stylesComponentFactory ,
21
+ TopologyViewLevel ,
22
+ } from '@odf/shared/topology' ;
23
+ import {
21
24
TopologyDataContext ,
22
25
TopologySearchContext ,
23
- TopologyViewLevel ,
24
26
} from '@odf/shared/topology' ;
25
27
import {
26
28
ClusterServiceVersionKind ,
@@ -99,6 +101,151 @@ type SideBarProps = {
99
101
isExpanded : boolean ;
100
102
} ;
101
103
104
+ const Error = ( { error } ) => < > { error } </ > ;
105
+
106
+ const TopologyDataProvider : React . FC < {
107
+ children : React . ReactNode ;
108
+ visualizationLevel : TopologyViewLevel ;
109
+ activeNode : string ;
110
+ setActiveNode : React . Dispatch < React . SetStateAction < string > > ;
111
+ } > = ( { children, visualizationLevel, activeNode, setActiveNode } ) => {
112
+ const [ nodes , nodesLoaded , nodesError ] =
113
+ useK8sWatchResource < NodeKind [ ] > ( nodeResource ) ;
114
+ const { odfNamespace, isODFNsLoaded, odfNsLoadError } =
115
+ useODFNamespaceSelector ( ) ;
116
+ const [ storageClusters , storageClustersLoaded , storageClustersError ] =
117
+ useK8sWatchResource < StorageClusterKind [ ] > ( storageClusterResource ) ;
118
+ const [ selectedElement , setSelectedElement ] =
119
+ React . useState < GraphElement | null > ( null ) ;
120
+
121
+ // ToDo (epic 4422): This will work as Internal mode cluster will only be created in ODF install namespace.
122
+ // Still, make this generic so that this works even if it gets created in a different namespace.
123
+ const storageCluster = getStorageClusterInNs ( storageClusters , odfNamespace ) ;
124
+ const storageLabel = cephStorageLabel ( odfNamespace ) ;
125
+ const odfNodes = nodes . filter ( ( node ) =>
126
+ _ . has ( node . metadata . labels , storageLabel )
127
+ ) ;
128
+
129
+ const [ deployments , deploymentsLoaded , deploymentsError ] =
130
+ useSafeK8sWatchResource < DeploymentKind [ ] > ( odfDeploymentsResource ) ;
131
+
132
+ const [ pods , podsLoaded , podsError ] =
133
+ useSafeK8sWatchResource < PodKind [ ] > ( odfPodsResource ) ;
134
+
135
+ const [ statefulSets , statefulSetLoaded , statefulSetError ] =
136
+ useSafeK8sWatchResource < K8sResourceCommon [ ] > ( odfStatefulSetResource ) ;
137
+
138
+ const [ replicaSets , replicaSetsLoaded , replicaSetsError ] =
139
+ useSafeK8sWatchResource < K8sResourceCommon [ ] > ( odfReplicaSetResource ) ;
140
+
141
+ const [ daemonSets , daemonSetsLoaded , daemonSetError ] =
142
+ useSafeK8sWatchResource < K8sResourceCommon [ ] > ( odfDaemonSetResource ) ;
143
+
144
+ const memoizedNodes = useDeepCompareMemoize ( odfNodes , true ) ;
145
+ const memoizedDeployments = useDeepCompareMemoize ( deployments , true ) ;
146
+ const memoizedPods = useDeepCompareMemoize ( pods , true ) ;
147
+ const memoizedStatefulSets = useDeepCompareMemoize ( statefulSets , true ) ;
148
+ const memoizedReplicaSets = useDeepCompareMemoize ( replicaSets , true ) ;
149
+ const memoizedDaemonSets = useDeepCompareMemoize ( daemonSets , true ) ;
150
+ const zones = memoizedNodes . map ( getTopologyDomain ) ;
151
+
152
+ const nodeDeploymentMap = React . useMemo (
153
+ ( ) =>
154
+ generateNodeDeploymentsMap (
155
+ memoizedNodes ,
156
+ memoizedPods ,
157
+ memoizedDeployments ,
158
+ ...memoizedReplicaSets ,
159
+ ...memoizedDaemonSets ,
160
+ ...memoizedStatefulSets ,
161
+ ...memoizedDeployments
162
+ ) ,
163
+ [
164
+ memoizedDaemonSets ,
165
+ memoizedDeployments ,
166
+ memoizedNodes ,
167
+ memoizedPods ,
168
+ memoizedReplicaSets ,
169
+ memoizedStatefulSets ,
170
+ ]
171
+ ) ;
172
+
173
+ const value = {
174
+ nodes : memoizedNodes ,
175
+ storageCluster,
176
+ zones : zones ,
177
+ deployments : memoizedDeployments ,
178
+ visualizationLevel : visualizationLevel ,
179
+ activeNode,
180
+ setActiveNode,
181
+ nodeDeploymentMap,
182
+ selectedElement,
183
+ setSelectedElement,
184
+ } ;
185
+
186
+ const loading =
187
+ ! nodesLoaded ||
188
+ ! storageClustersLoaded ||
189
+ ! deploymentsLoaded ||
190
+ ! podsLoaded ||
191
+ ! statefulSetLoaded ||
192
+ ! replicaSetsLoaded ||
193
+ ! daemonSetsLoaded ||
194
+ ! isODFNsLoaded ;
195
+
196
+ const error =
197
+ deploymentsError ||
198
+ podsError ||
199
+ statefulSetError ||
200
+ replicaSetsError ||
201
+ daemonSetError ;
202
+
203
+ return (
204
+ < >
205
+ { loading || error ? (
206
+ < HandleErrorAndLoading
207
+ loading = { loading }
208
+ error = {
209
+ storageClustersError ||
210
+ nodesError ||
211
+ deploymentsError ||
212
+ podsError ||
213
+ replicaSetsError ||
214
+ daemonSetError ||
215
+ statefulSetError ||
216
+ odfNsLoadError
217
+ }
218
+ ErrorMessage = { Error }
219
+ />
220
+ ) : (
221
+ < TopologyDataContext . Provider value = { value } >
222
+ { children }
223
+ </ TopologyDataContext . Provider >
224
+ ) }
225
+ </ >
226
+ ) ;
227
+ } ;
228
+
229
+ const TopologySearchProvider : React . FC < { children : React . ReactNode } > = ( {
230
+ children,
231
+ } ) => {
232
+ const [ activeItemsUID , setActiveItemsUID ] = React . useState < string [ ] > ( [ ] ) ;
233
+ const [ activeItem , setActiveItem ] = React . useState < string > ( '' ) ;
234
+
235
+ const value = {
236
+ activeItemsUID,
237
+ setActiveItemsUID,
238
+ activeItem,
239
+ setActiveItem,
240
+ } ;
241
+
242
+ return (
243
+ < TopologySearchContext . Provider value = { value } >
244
+ { children }
245
+ </ TopologySearchContext . Provider >
246
+ ) ;
247
+ } ;
248
+
102
249
const Sidebar : React . FC < SideBarProps > = ( { onClose, isExpanded } ) => {
103
250
const { selectedElement : element } = React . useContext ( TopologyDataContext ) ;
104
251
const data = element ?. getData ( ) ;
@@ -458,81 +605,11 @@ const TopologyViewComponent: React.FC = () => {
458
605
) ;
459
606
} ;
460
607
461
- const Error = ( { error } ) => < > { error } </ > ;
462
-
463
608
const Topology : React . FC = ( ) => {
464
- const { odfNamespace, isODFNsLoaded, odfNsLoadError } =
465
- useODFNamespaceSelector ( ) ;
466
-
467
609
const [ controller , setController ] = React . useState < Visualization > ( null ) ;
468
610
const [ visualizationLevel , setVisualizationLevel ] =
469
611
React . useState < TopologyViewLevel > ( TopologyViewLevel . NODES ) ;
470
- const [ activeItemsUID , setActiveItemsUID ] = React . useState < string [ ] > ( [ ] ) ;
471
- const [ activeItem , setActiveItem ] = React . useState < string > ( '' ) ;
472
612
const [ activeNode , setActiveNode ] = React . useState ( '' ) ;
473
- const [ selectedElement , setSelectedElement ] =
474
- React . useState < GraphElement > ( null ) ;
475
-
476
- const [ nodes , nodesLoaded , nodesError ] =
477
- useK8sWatchResource < NodeKind [ ] > ( nodeResource ) ;
478
-
479
- const [ storageClusters , storageClustersLoaded , storageClustersError ] =
480
- useK8sWatchResource < StorageClusterKind [ ] > ( storageClusterResource ) ;
481
-
482
- const [ deployments , deploymentsLoaded , deploymentsError ] =
483
- useSafeK8sWatchResource < DeploymentKind [ ] > ( odfDeploymentsResource ) ;
484
-
485
- const [ pods , podsLoaded , podsError ] =
486
- useSafeK8sWatchResource < PodKind [ ] > ( odfPodsResource ) ;
487
-
488
- const [ statefulSets , statefulSetLoaded , statefulSetError ] =
489
- useSafeK8sWatchResource < K8sResourceCommon [ ] > ( odfStatefulSetResource ) ;
490
-
491
- const [ replicaSets , replicaSetsLoaded , replicaSetsError ] =
492
- useSafeK8sWatchResource < K8sResourceCommon [ ] > ( odfReplicaSetResource ) ;
493
-
494
- const [ daemonSets , daemonSetsLoaded , daemonSetError ] =
495
- useSafeK8sWatchResource < K8sResourceCommon [ ] > ( odfDaemonSetResource ) ;
496
-
497
- // ToDo (epic 4422): This will work as Internal mode cluster will only be created in ODF install namespace.
498
- // Still, make this generic so that this works even if it gets created in a different namespace.
499
- const storageCluster : StorageClusterKind = getStorageClusterInNs (
500
- storageClusters ,
501
- odfNamespace
502
- ) ;
503
-
504
- const storageLabel = cephStorageLabel ( odfNamespace ) ;
505
- const odfNodes = nodes . filter ( ( node ) =>
506
- _ . has ( node . metadata . labels , storageLabel )
507
- ) ;
508
-
509
- const memoizedNodes = useDeepCompareMemoize ( odfNodes , true ) ;
510
- const memoizedDeployments = useDeepCompareMemoize ( deployments , true ) ;
511
- const memoizedPods = useDeepCompareMemoize ( pods , true ) ;
512
- const memoizedStatefulSets = useDeepCompareMemoize ( statefulSets , true ) ;
513
- const memoizedReplicaSets = useDeepCompareMemoize ( replicaSets , true ) ;
514
- const memoizedDaemonSets = useDeepCompareMemoize ( daemonSets , true ) ;
515
-
516
- const nodeDeploymentMap = React . useMemo (
517
- ( ) =>
518
- generateNodeDeploymentsMap (
519
- memoizedNodes ,
520
- memoizedPods ,
521
- memoizedDeployments ,
522
- ...memoizedReplicaSets ,
523
- ...memoizedDaemonSets ,
524
- ...memoizedStatefulSets ,
525
- ...memoizedDeployments
526
- ) ,
527
- [
528
- memoizedDaemonSets ,
529
- memoizedDeployments ,
530
- memoizedNodes ,
531
- memoizedPods ,
532
- memoizedReplicaSets ,
533
- memoizedStatefulSets ,
534
- ]
535
- ) ;
536
613
537
614
const onStepInto = ( args ) => {
538
615
const nodeName = args . label ;
@@ -559,59 +636,21 @@ const Topology: React.FC = () => {
559
636
} ;
560
637
} , [ ] ) ;
561
638
562
- const loading =
563
- ! nodesLoaded ||
564
- ! storageClustersLoaded ||
565
- ! deploymentsLoaded ||
566
- ! podsLoaded ||
567
- ! statefulSetLoaded ||
568
- ! replicaSetsLoaded ||
569
- ! daemonSetsLoaded ||
570
- ! isODFNsLoaded ;
571
-
572
- const zones = memoizedNodes . map ( getTopologyDomain ) ;
573
-
574
639
return (
575
- < TopologyDataContext . Provider
576
- value = { {
577
- nodes : memoizedNodes ,
578
- storageCluster : storageCluster ,
579
- zones,
580
- deployments : memoizedDeployments ,
581
- visualizationLevel : visualizationLevel ,
582
- activeNode,
583
- setActiveNode,
584
- nodeDeploymentMap,
585
- selectedElement,
586
- setSelectedElement : setSelectedElement as any ,
587
- } }
640
+ < TopologyDataProvider
641
+ visualizationLevel = { visualizationLevel }
642
+ activeNode = { activeNode }
643
+ setActiveNode = { setActiveNode }
588
644
>
589
- < TopologySearchContext . Provider
590
- value = { { activeItemsUID, setActiveItemsUID, activeItem, setActiveItem } }
591
- >
645
+ < TopologySearchProvider >
592
646
< VisualizationProvider controller = { controller } >
593
647
< div className = "odf__topology-view" id = "odf-topology" >
594
648
< TopologyTopBar />
595
- < HandleErrorAndLoading
596
- loading = { loading }
597
- error = {
598
- storageClustersError ||
599
- nodesError ||
600
- deploymentsError ||
601
- podsError ||
602
- replicaSetsError ||
603
- daemonSetError ||
604
- statefulSetError ||
605
- odfNsLoadError
606
- }
607
- ErrorMessage = { Error }
608
- >
609
- < TopologyViewComponent />
610
- </ HandleErrorAndLoading >
649
+ < TopologyViewComponent />
611
650
</ div >
612
651
</ VisualizationProvider >
613
- </ TopologySearchContext . Provider >
614
- </ TopologyDataContext . Provider >
652
+ </ TopologySearchProvider >
653
+ </ TopologyDataProvider >
615
654
) ;
616
655
} ;
617
656
0 commit comments