mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
feat: enable Terraform debug mode via deployment configuration (#8260)
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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"]}
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user