Skip to content

Commit ac777a1

Browse files
committed
TFC: Implement run panel for viewing plan
1 parent d8961d5 commit ac777a1

File tree

7 files changed

+548
-17
lines changed

7 files changed

+548
-17
lines changed

package-lock.json

Lines changed: 7 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,11 @@
495495
{
496496
"command": "terraform.cloud.run.plan.downloadLog",
497497
"title": "View raw plan log",
498+
"icon": "$(console)"
499+
},
500+
{
501+
"command": "terraform.cloud.run.viewPlan",
502+
"title": "View plan output",
498503
"icon": "$(output)"
499504
},
500505
{
@@ -567,6 +572,10 @@
567572
"command": "terraform.cloud.run.plan.downloadLog",
568573
"when": "false"
569574
},
575+
{
576+
"command": "terraform.cloud.run.viewPlan",
577+
"when": "false"
578+
},
570579
{
571580
"command": "terraform.cloud.run.apply.downloadLog",
572581
"when": "false"
@@ -633,7 +642,12 @@
633642
},
634643
{
635644
"command": "terraform.cloud.run.plan.downloadLog",
636-
"when": "view == terraform.cloud.runs && viewItem =~ /hasPlan/",
645+
"when": "view == terraform.cloud.runs && viewItem =~ /hasRawPlan/",
646+
"group": "inline"
647+
},
648+
{
649+
"command": "terraform.cloud.run.viewPlan",
650+
"when": "view == terraform.cloud.runs && viewItem =~ /hasStructuredPlan/",
637651
"group": "inline"
638652
},
639653
{
@@ -665,6 +679,12 @@
665679
"name": "Runs",
666680
"contextualTitle": "Terraform Cloud runs"
667681
}
682+
],
683+
"terraform-cloud-panel": [
684+
{
685+
"id": "terraform.cloud.run.plan",
686+
"name": "Plan"
687+
}
668688
]
669689
},
670690
"viewsContainers": {
@@ -679,6 +699,13 @@
679699
"title": "HashiCorp Terraform Cloud",
680700
"icon": "assets/icons/vs_code_terraform_cloud.svg"
681701
}
702+
],
703+
"panel": [
704+
{
705+
"id": "terraform-cloud-panel",
706+
"title": "Terraform Cloud",
707+
"icon": "assets/icons/vs_code_terraform_cloud.svg"
708+
}
682709
]
683710
},
684711
"viewsWelcome": [
@@ -723,6 +750,10 @@
723750
{
724751
"view": "terraform.cloud.runs",
725752
"contents": "Select a workspace to view a list of runs"
753+
},
754+
{
755+
"view": "terraform.cloud.run.plan",
756+
"contents": "Select a run to view a plan"
726757
}
727758
]
728759
},
@@ -751,6 +782,7 @@
751782
"@zodios/core": "^10.9.2",
752783
"@zodios/plugins": "^10.6.0",
753784
"axios": "^1.4.0",
785+
"semver": "^7.5.4",
754786
"vscode-languageclient": "8.1.0",
755787
"vscode-uri": "^3.0.7",
756788
"which": "^3.0.1",

src/features/terraformCloud.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import TelemetryReporter from '@vscode/extension-telemetry';
88

99
import { WorkspaceTreeDataProvider, WorkspaceTreeItem } from '../providers/tfc/workspaceProvider';
1010
import { RunTreeDataProvider } from '../providers/tfc/runProvider';
11+
import { PlanTreeDataProvider } from '../providers/tfc/planProvider';
1112
import { TerraformCloudAuthenticationProvider } from '../providers/authenticationProvider';
1213
import {
1314
CreateOrganizationItem,
@@ -56,7 +57,14 @@ export class TerraformCloudFeature implements vscode.Disposable {
5657
),
5758
);
5859

59-
const runDataProvider = new RunTreeDataProvider(this.context, this.reporter, outputChannel);
60+
const planDataProvider = new PlanTreeDataProvider(this.context, this.reporter, outputChannel);
61+
const planView = vscode.window.createTreeView('terraform.cloud.run.plan', {
62+
canSelectMany: false,
63+
showCollapseAll: true,
64+
treeDataProvider: planDataProvider,
65+
});
66+
67+
const runDataProvider = new RunTreeDataProvider(this.context, this.reporter, outputChannel, planDataProvider);
6068
const runView = vscode.window.createTreeView('terraform.cloud.runs', {
6169
canSelectMany: false,
6270
showCollapseAll: true,
@@ -77,7 +85,7 @@ export class TerraformCloudFeature implements vscode.Disposable {
7785
const organization = this.context.workspaceState.get('terraform.cloud.organization', '');
7886
workspaceView.title = organization !== '' ? `Workspaces - (${organization})` : 'Workspaces';
7987

80-
this.context.subscriptions.push(runView, runDataProvider, workspaceDataProvider, workspaceView);
88+
this.context.subscriptions.push(runView, planView, runDataProvider, workspaceDataProvider, workspaceView);
8189

8290
workspaceView.onDidChangeSelection((event) => {
8391
if (event.selection.length <= 0) {
@@ -89,6 +97,7 @@ export class TerraformCloudFeature implements vscode.Disposable {
8997
if (item instanceof WorkspaceTreeItem) {
9098
// call the TFC Run provider with the workspace
9199
runDataProvider.refresh(item);
100+
planDataProvider.refresh();
92101
}
93102
});
94103

@@ -100,6 +109,7 @@ export class TerraformCloudFeature implements vscode.Disposable {
100109
workspaceDataProvider.reset();
101110
workspaceDataProvider.refresh();
102111
runDataProvider.refresh();
112+
planDataProvider.refresh();
103113
}
104114
});
105115

src/providers/tfc/helpers.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55

66
import * as vscode from 'vscode';
7+
import { ChangeAction, DiagnosticSeverity } from '../../terraformCloud/log';
78

89
export function GetPlanApplyStatusIcon(status?: string): vscode.ThemeIcon {
910
switch (status) {
@@ -148,6 +149,34 @@ export function GetRunStatusMessage(status?: string): string {
148149
return 'No runs available';
149150
}
150151

152+
export function GetPlanActionIcon(action: ChangeAction): vscode.ThemeIcon {
153+
switch (action) {
154+
case 'create':
155+
return new vscode.ThemeIcon('diff-added', new vscode.ThemeColor('charts.green'));
156+
case 'delete':
157+
return new vscode.ThemeIcon('diff-removed', new vscode.ThemeColor('charts.red'));
158+
case 'update':
159+
return new vscode.ThemeIcon('diff-modified', new vscode.ThemeColor('charts.orange'));
160+
case 'move':
161+
return new vscode.ThemeIcon('diff-renamed', new vscode.ThemeColor('charts.orange'));
162+
case 'replace':
163+
return new vscode.ThemeIcon('arrow-swap', new vscode.ThemeColor('charts.orange'));
164+
case 'read':
165+
return new vscode.ThemeIcon('export', new vscode.ThemeColor('charts.blue'));
166+
case 'noop':
167+
return new vscode.ThemeIcon('diff-ignored', new vscode.ThemeColor('charts.grey'));
168+
}
169+
}
170+
171+
export function GetDiagnosticSeverityIcon(severity: DiagnosticSeverity): vscode.ThemeIcon {
172+
switch (severity) {
173+
case 'warning':
174+
return new vscode.ThemeIcon('warning', new vscode.ThemeColor('charts.orange'));
175+
case 'error':
176+
return new vscode.ThemeIcon('error', new vscode.ThemeColor('charts.red'));
177+
}
178+
}
179+
151180
export function RelativeTimeFormat(d: Date): string {
152181
const SECONDS_IN_MINUTE = 60;
153182
const SECONDS_IN_HOUR = SECONDS_IN_MINUTE * 60;

0 commit comments

Comments
 (0)