feat: enable Terraform debug mode via deployment configuration (#8260)

This commit is contained in:
Marcin Tojek
2023-06-29 15:22:21 +02:00
committed by GitHub
parent 7ca624eceb
commit 83fee4b192
19 changed files with 214 additions and 27 deletions
+1
View File
@@ -374,6 +374,7 @@ export interface DeploymentValues {
readonly wgtunnel_host?: string
readonly disable_owner_workspace_exec?: boolean
readonly proxy_health_status_interval?: number
readonly enable_terraform_debug_mode?: boolean
// This is likely an enum in an external package ("github.com/coder/coder/cli/clibase.YAMLConfigPath")
readonly config?: string
readonly write_config?: boolean
@@ -156,6 +156,25 @@ export const FailedWithLogs: Story = {
},
}
export const FailedWithRetry: Story = {
args: {
...Running.args,
workspace: {
...Mocks.MockFailedWorkspace,
latest_build: {
...Mocks.MockFailedWorkspace.latest_build,
job: {
...Mocks.MockFailedWorkspace.latest_build.job,
error:
"recv workspace provision: plan terraform: terraform plan: exit status 1",
},
},
},
failedBuildLogs: makeFailedBuildLogs(),
canRetryDebugMode: true,
},
}
export const Deleting: Story = {
args: {
...Running.args,
+3 -3
View File
@@ -60,7 +60,7 @@ export interface WorkspaceProps {
builds?: TypesGen.WorkspaceBuild[]
templateWarnings?: TypesGen.TemplateVersionWarning[]
canUpdateWorkspace: boolean
canUpdateTemplate: boolean
canRetryDebugMode: boolean
canChangeVersions: boolean
hideSSHButton?: boolean
hideVSCodeDesktopButton?: boolean
@@ -92,7 +92,7 @@ export const Workspace: FC<React.PropsWithChildren<WorkspaceProps>> = ({
resources,
builds,
canUpdateWorkspace,
canUpdateTemplate,
canRetryDebugMode,
canChangeVersions,
workspaceErrors,
hideSSHButton,
@@ -236,7 +236,7 @@ export const Workspace: FC<React.PropsWithChildren<WorkspaceProps>> = ({
<Alert
severity="error"
actions={
canUpdateTemplate && (
canRetryDebugMode && (
<Button
key={0}
onClick={handleBuildRetry}
@@ -23,6 +23,7 @@ import {
MockTemplateVersion3,
MockUser,
MockEntitlementsWithScheduling,
MockDeploymentConfig,
} from "testHelpers/entities"
import * as api from "../../api/api"
import { Workspace } from "../../api/typesGenerated"
@@ -39,6 +40,9 @@ const { t } = i18next
const renderWorkspacePage = async () => {
jest.spyOn(api, "getTemplate").mockResolvedValueOnce(MockTemplate)
jest.spyOn(api, "getTemplateVersionRichParameters").mockResolvedValueOnce([])
jest
.spyOn(api, "getDeploymentValues")
.mockResolvedValueOnce(MockDeploymentConfig)
jest.spyOn(api, "watchStartupLogs").mockImplementation((_, options) => {
options.onDone()
return new WebSocket("")
@@ -61,6 +61,7 @@ export const WorkspaceReadyPage = ({
workspace,
template,
templateVersion,
deploymentValues,
builds,
getBuildsError,
buildError,
@@ -75,6 +76,9 @@ export const WorkspaceReadyPage = ({
const deadline = getDeadline(workspace)
const canUpdateWorkspace = Boolean(permissions?.updateWorkspace)
const canUpdateTemplate = Boolean(permissions?.updateTemplate)
const canRetryDebugMode =
Boolean(permissions?.viewDeploymentValues) &&
Boolean(deploymentValues?.enable_terraform_debug_mode)
const { t } = useTranslation("workspacePage")
const favicon = getFaviconByStatus(workspace.latest_build)
const navigate = useNavigate()
@@ -166,7 +170,7 @@ export const WorkspaceReadyPage = ({
resources={workspace.latest_build.resources}
builds={builds}
canUpdateWorkspace={canUpdateWorkspace}
canUpdateTemplate={canUpdateTemplate}
canRetryDebugMode={canRetryDebugMode}
canChangeVersions={canUpdateTemplate}
hideSSHButton={featureVisibility["browser_only"]}
hideVSCodeDesktopButton={featureVisibility["browser_only"]}
+7
View File
@@ -1583,6 +1583,13 @@ export const MockPermissions: Permissions = {
viewDeploymentStats: true,
}
export const MockDeploymentConfig: Types.DeploymentConfig = {
config: {
enable_terraform_debug_mode: true,
},
options: [],
}
export const MockAppearance: TypesGen.AppearanceConfig = {
logo_url: "",
service_banner: {
@@ -55,6 +55,7 @@ export interface WorkspaceContext {
template?: TypesGen.Template
permissions?: Permissions
templateVersion?: TypesGen.TemplateVersion
deploymentValues?: TypesGen.DeploymentValues
build?: TypesGen.WorkspaceBuild
// Builds
builds?: TypesGen.WorkspaceBuild[]
@@ -100,6 +101,7 @@ export const checks = {
readWorkspace: "readWorkspace",
updateWorkspace: "updateWorkspace",
updateTemplate: "updateTemplate",
viewDeploymentValues: "viewDeploymentValues",
} as const
const permissionsToCheck = (
@@ -130,6 +132,12 @@ const permissionsToCheck = (
},
action: "update",
},
[checks.viewDeploymentValues]: {
object: {
resource_type: "deployment_config",
},
action: "read",
},
} as const)
export const workspaceMachine = createMachine(
@@ -488,6 +496,7 @@ export const workspaceMachine = createMachine(
template: (_, event) => event.data.template,
templateVersion: (_, event) => event.data.templateVersion,
permissions: (_, event) => event.data.permissions as Permissions,
deploymentValues: (_, event) => event.data.deploymentValues,
}),
assignError: assign({
error: (_, event) => event.data,
@@ -740,10 +749,17 @@ async function loadInitialWorkspaceData({
}),
])
const canViewDeploymentValues = Boolean(
(permissions as Permissions)?.viewDeploymentValues,
)
const deploymentValues = canViewDeploymentValues
? (await API.getDeploymentValues())?.config
: undefined
return {
workspace,
template,
templateVersion,
permissions,
deploymentValues,
}
}