Skip to content

Commit

Permalink
feat: use v1 snippets when v1 is enabled on cluster (#725) (#735)
Browse files Browse the repository at this point in the history
* feat: use v1 snippets when v1 is enabled on cluster (#725)

Signed-off-by: Luca Stocchi <[email protected]>

* fix trigger snippets

Signed-off-by: Luca Stocchi <[email protected]>

Signed-off-by: Luca Stocchi <[email protected]>
  • Loading branch information
lstocchi authored Jan 19, 2023
1 parent a3e83f9 commit 9f8f207
Show file tree
Hide file tree
Showing 16 changed files with 120 additions and 92 deletions.
6 changes: 0 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -137,12 +137,6 @@
}
}
},
"snippets": [
{
"language": "yaml",
"path": "./snippets/tekton.json"
}
],
"keybindings": [
{
"command": "tekton.explorer.refresh",
Expand Down
2 changes: 1 addition & 1 deletion rawsnippets/EventListener.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
apiVersion: tekton.dev/v1beta1
apiVersion: triggers.tekton.dev/v1beta1
kind: EventListener
metadata:
name: ${1:name}
Expand Down
2 changes: 1 addition & 1 deletion rawsnippets/cluster-triggerbinding.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
apiVersion: tekton.dev/v1beta1
apiVersion: triggers.tekton.dev/v1beta1
kind: ClusterTriggerBinding
metadata:
name: ${1:name}
Expand Down
2 changes: 1 addition & 1 deletion rawsnippets/pipeline.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
apiVersion: tekton.dev/v1beta1
apiVersion: <pipelines_api_version>
kind: Pipeline
metadata:
name: ${1:app-deploy}
Expand Down
2 changes: 1 addition & 1 deletion rawsnippets/pipelinerun.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
apiVersion: tekton.dev/v1beta1
apiVersion: <pipelines_api_version>
kind: PipelineRun
metadata:
name: ${1:foo-run}
Expand Down
2 changes: 1 addition & 1 deletion rawsnippets/task.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
apiVersion: tekton.dev/v1beta1
apiVersion: <pipelines_api_version>
kind: Task
metadata:
name: ${1}
Expand Down
2 changes: 1 addition & 1 deletion rawsnippets/taskrun.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
apiVersion: tekton.dev/v1beta1
apiVersion: <pipelines_api_version>
kind: TaskRun
metadata:
name: ${1:echo-hello-world-run}
Expand Down
2 changes: 1 addition & 1 deletion rawsnippets/triggerbinding.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
apiVersion: tekton.dev/v1beta1
apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerBinding
metadata:
name: ${1:name}
Expand Down
2 changes: 1 addition & 1 deletion rawsnippets/triggertemplate.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
apiVersion: tekton.dev/v1beta1
apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerTemplate
metadata:
name: ${1:name}
Expand Down
8 changes: 4 additions & 4 deletions snippets/tekton.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
"prefix": "Task",
"description": "Create a Tekton Task Resource",
"body": [
"apiVersion: tekton.dev/v1beta1",
"apiVersion: <pipelines_api_version>",
"kind: Task",
"metadata:",
" name: ${1}",
Expand Down Expand Up @@ -44,7 +44,7 @@
"prefix": "TaskRun",
"description": "Create a Tekton TaskRun Resource",
"body": [
"apiVersion: tekton.dev/v1beta1",
"apiVersion: <pipelines_api_version>",
"kind: TaskRun",
"metadata:",
" name: ${1:echo-hello-world-run}",
Expand All @@ -57,7 +57,7 @@
"prefix": "Pipeline",
"description": "Create a Tekton Pipeline Resource",
"body": [
"apiVersion: tekton.dev/v1beta1",
"apiVersion: <pipelines_api_version>",
"kind: Pipeline",
"metadata:",
" name: ${1:app-deploy}",
Expand Down Expand Up @@ -177,7 +177,7 @@
"prefix": "PipelineRun",
"description": "Create a Tekton PipelineRun Resource",
"body": [
"apiVersion: tekton.dev/v1beta1",
"apiVersion: <pipelines_api_version>",
"kind: PipelineRun",
"metadata:",
" name: ${1:foo-run}",
Expand Down
34 changes: 30 additions & 4 deletions src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,14 @@ import { TKN_RESOURCE_SCHEME, TKN_RESOURCE_SCHEME_READONLY, tektonVfsProvider }
import { updateTektonResource } from './tekton/deploy';
import { deleteFromExplorer, deleteFromCustom } from './commands/delete';
import { addTrigger } from './tekton/trigger';
import { triggerDetection } from './util/detection';
import { showDiagnosticData } from './tekton/diagnostic';
import { TriggerTemplate } from './tekton/triggertemplate';
import { TektonHubTasksViewProvider } from './hub/hub-view';
import { registerLogDocumentProvider } from './util/log-in-editor';
import { openPipelineRunTemplate, openTaskRunTemplate } from './tekton/generate-template';
import sendTelemetry, { startTelemetry, telemetryLogError, TelemetryProperties } from './telemetry';
import { cli, createCliCommand } from './cli';
import { getVersion, tektonVersionType } from './util/tknversion';
import { getVersion, tektonVersionType, TknVersion, version } from './util/tknversion';
import { TektonNode } from './tree-view/tekton-node';
import { checkClusterStatus } from './util/check-cluster-status';
import { getClusterVersions } from './cluster-version';
Expand All @@ -49,9 +48,11 @@ import { debugName, debugSessions, pipelineTriggerStatus } from './util/map-obje
import { deleteDebugger } from './debugger/delete-debugger';
import { bundleWizard } from './tekton/bundle-pipeline-task';
import { ERR_CLUSTER_TIMED_OUT } from './constants';
import TektonCompletionItemProvider from './yaml-support/tkn-completion-item-provider';

export let contextGlobalState: vscode.ExtensionContext;
let k8sExplorer: k8s.ClusterExplorerV1 | undefined = undefined;
let tektonCompletionProvider: TektonCompletionItemProvider | undefined = undefined;

export async function activate(context: vscode.ExtensionContext): Promise<void> {

Expand Down Expand Up @@ -134,8 +135,22 @@ export async function activate(context: vscode.ExtensionContext): Promise<void>
];
disposables.forEach((e) => context.subscriptions.push(e));

detectTknCli().then(() => {
triggerDetection();
detectTknCli().then(async () => {
const tknVersionType: TknVersion = await version();
setCommandContext(CommandContext.Trigger, tknVersionType && tknVersionType.trigger !== 'unknown');
tektonCompletionProvider = new TektonCompletionItemProvider(tknVersionType ? tknVersionType.pipeline : undefined);
tektonCompletionProvider.init().then((result) =>
{
if (!result.success)
{
console.log(`TektonCompletionItemProvider init failed: ${(result.error.message)}`);
vscode.window.showErrorMessage('Something went wrong when initializing tekton completion item provider. Please see the console for more infos!');
}
else
{
context.subscriptions.push(vscode.languages.registerCompletionItemProvider(<vscode.DocumentFilter>{language: 'yaml'}, tektonCompletionProvider));
}
});
});
detectKubectlCli().then(() => {
checkClusterStatus(true); // watch Tekton resources when all required dependency are installed
Expand Down Expand Up @@ -319,6 +334,9 @@ function refreshTreeView(): void {
if (ToolsConfig.getToolLocation('kubectl')) {
checkClusterStatus(true);
}
if (ToolsConfig.getToolLocation('tkn')) {
updateTektonCompletionProvider();
}
pipelineExplorer.refresh();
debugName.clear();
if (debugSessions && debugSessions.size !== 0) {
Expand All @@ -329,3 +347,11 @@ function refreshTreeView(): void {
debugSessions.clear();
debugExplorer.refresh();
}

function updateTektonCompletionProvider(): void {
version().then((v) => {
if (tektonCompletionProvider) {
tektonCompletionProvider.update(v.pipeline)
}
});
}
78 changes: 78 additions & 0 deletions src/yaml-support/tkn-completion-item-provider.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
/*-----------------------------------------------------------------------------------------------
* Copyright (c) Red Hat, Inc. All rights reserved.
* Licensed under the MIT License. See LICENSE file in the project root for license information.
*-----------------------------------------------------------------------------------------------*/

import {CompletionItem, CompletionItemProvider as ICompletionItemProvider, SnippetString} from 'vscode';
import * as fs from 'fs';
import * as path from 'path';
import { contextGlobalState } from '../extension';
import { Snippet } from './snippet';
import * as semver from 'semver';

export default class TektonCompletionItemProvider implements ICompletionItemProvider {
private newestVersion: string;
public readonly encoding = 'utf-8';
private readonly tektonSnippetsFile = path.join(contextGlobalState.extensionPath, 'snippets/tekton.json');
protected items: CompletionItem[];

constructor(newestVersion: string) {
this.newestVersion = newestVersion;
this.items = [];
}

public init(): Thenable<ICompletionItemProviderInitResult> {
return this.generateItems();
}

public update(newestVersion: string): Thenable<ICompletionItemProviderInitResult> {
this.newestVersion = newestVersion;
this.items = [];
return this.generateItems();
}

private generateItems(): Thenable<ICompletionItemProviderInitResult> {
return new Promise((resolve, reject) => {
fs.readFile(this.tektonSnippetsFile, this.encoding, (readFileError, data) => {
if (readFileError) {
resolve(<ICompletionItemProviderInitResult>{success: false, error: readFileError});
}
else {
try {
let version = 'tekton.dev/v1beta1';
if (this.newestVersion
&& this.newestVersion !== 'unknown'
&& semver.satisfies(this.newestVersion.replace('v',''), '>=0.43.0')) {
version = 'tekton.dev/v1';
}
const dataAsJson: Map<string, Snippet<string[]>> = JSON.parse(data);
for (const key in dataAsJson) {
const body: string[] = dataAsJson[key].body;
const bodyAsString = body.join('\n').replace('<pipelines_api_version>', version);
const completionItem: CompletionItem = {
label: key,
detail: dataAsJson[key].description,
insertText: new SnippetString(bodyAsString),
};
this.items.push(completionItem);
}

resolve(<ICompletionItemProviderInitResult>{success: true, error: undefined});
}
catch (error) {
resolve(<ICompletionItemProviderInitResult>{success: false, error: error});
}
}
});
});
}

public provideCompletionItems(): CompletionItem[] {
return this.items;
}
}

export interface ICompletionItemProviderInitResult {
success: boolean;
error: Error;
}
27 changes: 0 additions & 27 deletions src/yaml-support/tkn-conditions-provider.ts

This file was deleted.

41 changes: 0 additions & 41 deletions test/yaml-support/tkn-condition-provider.test.ts

This file was deleted.

2 changes: 0 additions & 2 deletions test/yaml-support/tkn-yaml-scheme-generator.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import * as path from 'path';
import { generateScheme } from '../../src/yaml-support/tkn-yaml-scheme-generator';
import { TestTextDocument } from '../text-document-mock';
import * as tasksProvider from '../../src/yaml-support/tkn-tasks-provider';
import * as conditionsProvider from '../../src/yaml-support/tkn-conditions-provider';
import { TknTask } from '../../src/tekton';

const expect = chai.expect;
Expand All @@ -25,7 +24,6 @@ suite('Pipeline scheme generator', () => {

setup(() => {
sandbox.stub(tasksProvider, 'getTknTasksSnippets').resolves([]);
sandbox.stub(conditionsProvider, 'getTknConditionsSnippets').resolves([]);
getRawTasksStub = sandbox.stub(tasksProvider, 'getRawTasks');
getRawTasksStub.resolves([]);
});
Expand Down

0 comments on commit 9f8f207

Please sign in to comment.