@@ -26,24 +26,34 @@ import {
26
26
ComponentTypesJson ,
27
27
DevfileComponentType ,
28
28
ImageStreamTag ,
29
+ isCluster ,
29
30
isDevfileComponent ,
30
31
isImageStreamTag ,
32
+ isRegistry ,
31
33
isS2iComponent ,
34
+ Registry ,
32
35
S2iComponentType
33
36
} from './odo/componentType' ;
34
37
import {
35
38
isStarterProject ,
36
39
StarterProject
37
40
} from './odo/componentTypeDescription' ;
38
41
import { vsCommand , VsCommandError } from './vscommand' ;
42
+ import { Cluster } from '@kubernetes/client-node/dist/config_types' ;
43
+ import { KubeConfig } from '@kubernetes/client-node' ;
39
44
40
- type ComponentType = S2iComponentType | DevfileComponentType | ImageStreamTag | StarterProject ;
45
+ type ComponentType = S2iComponentType | DevfileComponentType | ImageStreamTag | StarterProject | Cluster | Registry ;
41
46
42
47
export enum ContextType {
43
48
S2I_COMPONENT_TYPE = 's2iComponentType' ,
44
49
DEVFILE_COMPONENT_TYPE = 'devfileComponentType' ,
45
50
S2I_IMAGE_STREAM_TAG = 's2iImageStreamTag' ,
46
51
DEVFILE_STARTER_PROJECT = 'devfileStarterProject' ,
52
+ DEVFILE_REGISTRY = 'devfileRegistry' ,
53
+ OFFLINE_CLUSTER = 'clusterOffline' ,
54
+ ONLINE_LOGGEDOFF_CLUSER = 'clusterLoggedoffOnline' ,
55
+ ONLINE_LOOGEDIN_CLUSER = 'clusterLoggedinOnline' ,
56
+ OFFLINE_OR_LOGGEDOUT_CLUSTER = 'clusterOfflineOrLoggedout' ,
47
57
}
48
58
49
59
export class ComponentTypesView implements TreeDataProvider < ComponentType > {
@@ -59,6 +69,7 @@ export class ComponentTypesView implements TreeDataProvider<ComponentType> {
59
69
. onDidChangeTreeDataEmitter . event ;
60
70
61
71
readonly odo : Odo = getInstance ( ) ;
72
+ private registries : Registry [ ] ;
62
73
63
74
createTreeView ( id : string ) : TreeView < ComponentType > {
64
75
if ( ! this . treeView ) {
@@ -78,6 +89,19 @@ export class ComponentTypesView implements TreeDataProvider<ComponentType> {
78
89
79
90
// eslint-disable-next-line class-methods-use-this
80
91
getTreeItem ( element : ComponentType ) : TreeItem | Thenable < TreeItem > {
92
+ if ( isCluster ( element ) ) {
93
+ return {
94
+ label : `${ element . server } ` ,
95
+ collapsibleState : TreeItemCollapsibleState . Collapsed ,
96
+ }
97
+ }
98
+ if ( isRegistry ( element ) ) {
99
+ return {
100
+ label : element . Name ,
101
+ description : element . URL ,
102
+ collapsibleState : TreeItemCollapsibleState . Collapsed ,
103
+ }
104
+ }
81
105
if ( isS2iComponent ( element ) ) {
82
106
return {
83
107
label : `${ element . metadata . name } (s2i)` ,
@@ -91,7 +115,7 @@ export class ComponentTypesView implements TreeDataProvider<ComponentType> {
91
115
}
92
116
if ( isImageStreamTag ( element ) ) {
93
117
return {
94
- label : element . name ,
118
+ label : element . annotations [ 'openshift.io/display-name' ] ? element . annotations [ 'openshift.io/display-name' ] : element . name ,
95
119
contextValue : ContextType . S2I_IMAGE_STREAM_TAG ,
96
120
tooltip : element . annotations . description ,
97
121
description : element . annotations . description ,
@@ -114,14 +138,14 @@ export class ComponentTypesView implements TreeDataProvider<ComponentType> {
114
138
}
115
139
}
116
140
return {
117
- label : `${ element . Name } (devfile)` ,
141
+ label : `${ element . DisplayName } (devfile)` ,
118
142
contextValue : ContextType . DEVFILE_COMPONENT_TYPE ,
119
143
iconPath : {
120
144
dark : Uri . file ( path . join ( __dirname , '..' , '..' , 'images' , 'component' , 'component-type-dark.png' ) ) ,
121
145
light : Uri . file ( path . join ( __dirname , '..' , '..' , 'images' , 'component' , 'component-type-light.png' ) )
122
146
} ,
123
147
tooltip : element . Description ,
124
- collapsibleState : TreeItemCollapsibleState . Collapsed ,
148
+ collapsibleState : this . registries . length > 1 ? TreeItemCollapsibleState . None : TreeItemCollapsibleState . Collapsed ,
125
149
} ;
126
150
}
127
151
@@ -136,19 +160,39 @@ export class ComponentTypesView implements TreeDataProvider<ComponentType> {
136
160
return data ;
137
161
}
138
162
163
+ private async getRegistries ( ) : Promise < Registry [ ] > {
164
+ if ( ! this . registries ) {
165
+ this . registries = await this . odo . getRegistries ( ) ;
166
+ }
167
+ return this . registries ;
168
+ }
169
+
139
170
// eslint-disable-next-line class-methods-use-this
140
171
async getChildren ( parent : ComponentType ) : Promise < ComponentType [ ] > {
141
172
let children : ComponentType [ ] ;
173
+
142
174
if ( ! parent ) {
175
+ const config = new KubeConfig ( ) ;
176
+ config . loadFromDefault ( ) ;
177
+ const cluster = config . getCurrentCluster ( ) ;
178
+ this . registries = await this . getRegistries ( ) ;
179
+ children = [ cluster , ...this . registries ] ;
180
+ } else if ( isCluster ( parent ) ) {
143
181
const result : CliExitData = await this . odo . execute ( Command . listCatalogComponentsJson ( ) ) ;
144
- children = this . loadItems < ComponentTypesJson , ComponentType > ( result , ( data ) => {
182
+ const builders = this . loadItems < ComponentTypesJson , ComponentType > ( result , ( data ) => {
145
183
if ( data . s2iItems ) { // filter hidden tags
146
184
data . s2iItems . forEach ( ( s2iItem ) => s2iItem . spec . imageStreamTags = s2iItem . spec . imageStreamTags . filter ( tag => s2iItem . spec . nonHiddenTags . includes ( tag . name ) ) ) ;
147
185
} else { // when not logged or disconnected form cluster s2i items are not available
148
186
data . s2iItems = [ ] ;
149
187
}
150
- return [ ... data . s2iItems , ... data . devfileItems ] ;
188
+ return data . s2iItems ;
151
189
} ) ;
190
+ children = [ ] ;
191
+ builders . forEach ( ( builder : S2iComponentType ) => children . splice ( children . length , 0 , ...builder . spec . imageStreamTags ) ) ;
192
+ } else if ( isRegistry ( parent ) ) {
193
+ const result : CliExitData = await this . odo . execute ( Command . listCatalogComponentsJson ( ) ) ;
194
+ children = this . loadItems < ComponentTypesJson , DevfileComponentType > ( result , ( data ) => data . devfileItems ) ;
195
+ children = children . filter ( ( element :DevfileComponentType ) => element . Registry . Name === parent . Name ) ;
152
196
153
197
} else if ( isS2iComponent ( parent ) ) {
154
198
children = parent . spec . imageStreamTags . map ( ( tag :ImageStreamTag ) => {
@@ -158,18 +202,12 @@ export class ComponentTypesView implements TreeDataProvider<ComponentType> {
158
202
} else if ( isDevfileComponent ( parent ) ) {
159
203
const result : CliExitData = await this . odo . execute ( Command . describeCatalogComponent ( parent . Name ) ) ;
160
204
children = this . loadItems < ComponentTypeDescription , StarterProject > ( result , ( data ) => data . Data . starterProjects ) ;
205
+
161
206
children = children . map ( ( starter :StarterProject ) => {
162
207
starter . typeName = parent . Name ; ;
163
208
return starter ;
164
209
} ) ;
165
210
}
166
- if ( ! parent ) {
167
- children = children . sort ( ( a , b ) => {
168
- const aTi = this . getTreeItem ( a ) as TreeItem ;
169
- const bTi = this . getTreeItem ( b ) as TreeItem ;
170
- return aTi . label . localeCompare ( bTi . label ) ;
171
- } ) ;
172
- }
173
211
return children ;
174
212
}
175
213
@@ -179,6 +217,7 @@ export class ComponentTypesView implements TreeDataProvider<ComponentType> {
179
217
}
180
218
181
219
refresh ( ) : void {
220
+ this . registries = undefined ;
182
221
this . onDidChangeTreeDataEmitter . fire ( ) ;
183
222
}
184
223
0 commit comments