Skip to content

Commit 770e40c

Browse files
authored
Add BuildConfig and Builds to Clusters View (#882)
* Add BuildConfig and Builds to Clusters View * Fix Load command for Build nodes and add build numbers * Remove not supported commands from Build resource node context menu
1 parent f0c9a17 commit 770e40c

File tree

2 files changed

+58
-2
lines changed

2 files changed

+58
-2
lines changed

src/extension.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import path = require('path');
2020
import fsx = require('fs-extra');
2121
import * as k8s from 'vscode-kubernetes-tools-api';
2222
import { ClusterExplorerV1 } from 'vscode-kubernetes-tools-api';
23+
import { DeploymentConfigNodeContributor } from './k8s/deployment';
2324

2425
export let contextGlobalState: vscode.ExtensionContext;
2526

@@ -94,7 +95,9 @@ export async function activate(context: vscode.ExtensionContext) {
9495
clusterExplorer.api.nodeSources.resourceFolder("Templates", "Templates", "Template", "template").if(isOpenShift).at(undefined),
9596
clusterExplorer.api.nodeSources.resourceFolder("ImageStreams", "ImageStreams", "ImageStream", "ImageStream").if(isOpenShift).at("Workloads"),
9697
clusterExplorer.api.nodeSources.resourceFolder("Routes", "Routes", "Route", "route").if(isOpenShift).at("Network"),
97-
clusterExplorer.api.nodeSources.resourceFolder("DeploymentConfigs", "DeploymentConfigs", "DeploymentConfig", "dc").if(isOpenShift).at("Workloads")
98+
clusterExplorer.api.nodeSources.resourceFolder("DeploymentConfigs", "DeploymentConfigs", "DeploymentConfig", "dc").if(isOpenShift).at("Workloads"),
99+
clusterExplorer.api.nodeSources.resourceFolder("BuildConfigs", "BuildConfigs", "BuildConfig", "bc").if(isOpenShift).at("Workloads"),
100+
new DeploymentConfigNodeContributor()
98101
];
99102
nodeContributors.forEach(element => {
100103
clusterExplorer.api.registerNodeContributor(element);
@@ -129,7 +132,7 @@ async function customizeAsync(node: ClusterExplorerV1.ClusterExplorerResourceNod
129132
treeItem.iconPath = vscode.Uri.file(path.join(__dirname, "../../images/context/cluster-node.png"));
130133
}
131134
}
132-
if (node.nodeType as unknown === 'resource' && node.resourceKind.manifestKind === 'Project') {
135+
if (node.nodeType === 'resource' && node.resourceKind.manifestKind === 'Project') {
133136
// assuming now that it’s a project node
134137
const projectName = node.name;
135138
if (projectName === lastNamespace) {
@@ -138,6 +141,9 @@ async function customizeAsync(node: ClusterExplorerV1.ClusterExplorerResourceNod
138141
treeItem.contextValue = `${treeItem.contextValue || ''}.openshift.inactiveProject`;
139142
}
140143
}
144+
if (node.nodeType === 'resource' && node.resourceKind.manifestKind === 'BuildConfig') {
145+
treeItem.collapsibleState = vscode.TreeItemCollapsibleState.Collapsed;
146+
}
141147
}
142148

143149
async function isOpenShift(): Promise<boolean> {

src/k8s/deployment.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import * as vscode from 'vscode';
2+
import { ClusterExplorerV1 } from 'vscode-kubernetes-tools-api';
3+
import * as k8s from 'vscode-kubernetes-tools-api';
4+
5+
export class DeploymentConfigNodeContributor implements ClusterExplorerV1.NodeContributor {
6+
contributesChildren(parent: ClusterExplorerV1.ClusterExplorerNode | undefined): boolean {
7+
return !!parent && parent.nodeType === 'resource' && parent.resourceKind.manifestKind === 'BuildConfig';
8+
}
9+
10+
async getChildren(parent: ClusterExplorerV1.ClusterExplorerNode | undefined): Promise<ClusterExplorerV1.Node[]> {
11+
const kubectl = await k8s.extension.kubectl.v1;
12+
if(kubectl.available) {
13+
const result = await kubectl.api.invokeCommand(`get build -o jsonpath="{range .items[?(.metadata.labels.buildconfig=='${(parent as any).name}')]}{.metadata.namespace}{','}{.metadata.name}{','}{.metadata.annotations.openshift\\.io/build\\.number}{\\"\\n\\"}{end}"`);
14+
const builds = result.stdout.split('\n')
15+
.filter((value) => value !== '')
16+
.map<Build>((item: string) => new Build(item.split(',')[0], item.split(',')[1], Number.parseInt(item.split(',')[2])));
17+
return builds;
18+
}
19+
return [];
20+
}
21+
}
22+
23+
class Build implements ClusterExplorerV1.Node, ClusterExplorerV1.ClusterExplorerResourceNode {
24+
nodeType: "resource";
25+
readonly resourceKind: ClusterExplorerV1.ResourceKind = {
26+
manifestKind: 'Build',
27+
abbreviation: 'build'
28+
};
29+
readonly kind: ClusterExplorerV1.ResourceKind = this.resourceKind;
30+
public id: string;
31+
public resourceId: string;
32+
constructor(readonly namespace: string, readonly name: string, readonly number: number, readonly metadata?: any) {
33+
this.id = this.resourceId = `build/${this.name}`;
34+
}
35+
36+
async getChildren(): Promise<ClusterExplorerV1.Node[]> {
37+
return [];
38+
}
39+
40+
getTreeItem(): vscode.TreeItem {
41+
const item = new vscode.TreeItem(`#${this.number} ${this.name}`);
42+
item.contextValue = 'openShift.resource.build';
43+
item.command = {
44+
arguments: [this],
45+
command: 'extension.vsKubernetesLoad',
46+
title: "Load"
47+
};
48+
return item;
49+
}
50+
}

0 commit comments

Comments
 (0)