import { withDefaultFeatures } from "./../api/api" import { FieldError } from "api/errors" import { everyOneGroup } from "utils/groups" import * as Types from "../api/types" import * as TypesGen from "../api/typesGenerated" import range from "lodash/range" import { Permissions } from "xServices/auth/authXService" import { TemplateVersionFiles } from "utils/templateVersion" import { FileTree } from "utils/filetree" export const MockOrganization: TypesGen.Organization = { id: "fc0774ce-cc9e-48d4-80ae-88f7a4d4a8b0", name: "Test Organization", created_at: "", updated_at: "", } export const MockTemplateDAUResponse: TypesGen.TemplateDAUsResponse = { entries: [ { date: "2022-08-27T00:00:00Z", amount: 1 }, { date: "2022-08-29T00:00:00Z", amount: 2 }, { date: "2022-08-30T00:00:00Z", amount: 1 }, ], } export const MockDeploymentDAUResponse: TypesGen.DeploymentDAUsResponse = { entries: [ { date: "2022-08-27T00:00:00Z", amount: 1 }, { date: "2022-08-29T00:00:00Z", amount: 2 }, { date: "2022-08-30T00:00:00Z", amount: 1 }, ], } export const MockSessionToken: TypesGen.LoginWithPasswordResponse = { session_token: "my-session-token", } export const MockAPIKey: TypesGen.GenerateAPIKeyResponse = { key: "my-api-key", } export const MockToken: TypesGen.APIKeyWithOwner = { id: "tBoVE3dqLl", user_id: "f9ee61d8-1d84-4410-ab6e-c1ec1a641e0b", last_used: "0001-01-01T00:00:00Z", expires_at: "2023-01-15T20:10:45.637438Z", created_at: "2022-12-16T20:10:45.637452Z", updated_at: "2022-12-16T20:10:45.637452Z", login_type: "token", scope: "all", lifetime_seconds: 2592000, token_name: "token-one", username: "admin", } export const MockTokens: TypesGen.APIKeyWithOwner[] = [ MockToken, { id: "tBoVE3dqLl", user_id: "f9ee61d8-1d84-4410-ab6e-c1ec1a641e0b", last_used: "0001-01-01T00:00:00Z", expires_at: "2023-01-15T20:10:45.637438Z", created_at: "2022-12-16T20:10:45.637452Z", updated_at: "2022-12-16T20:10:45.637452Z", login_type: "token", scope: "all", lifetime_seconds: 2592000, token_name: "token-two", username: "admin", }, ] export const MockPrimaryWorkspaceProxy: TypesGen.Region = { id: "4aa23000-526a-481f-a007-0f20b98b1e12", name: "primary", display_name: "Default", icon_url: "/emojis/1f60e.png", healthy: true, path_app_url: "https://coder.com", wildcard_hostname: "*.coder.com", } export const MockHealthyWildWorkspaceProxy: TypesGen.Region = { id: "5e2c1ab7-479b-41a9-92ce-aa85625de52c", name: "haswildcard", display_name: "Subdomain Supported", icon_url: "/emojis/1f319.png", healthy: true, path_app_url: "https://external.com", wildcard_hostname: "*.external.com", } export const MockUnhealthyWildWorkspaceProxy: TypesGen.Region = { id: "8444931c-0247-4171-842a-569d9f9cbadb", name: "unhealthy", display_name: "Unhealthy", icon_url: "/emojis/1f92e.png", healthy: false, path_app_url: "https://unhealthy.coder.com", wildcard_hostname: "*unhealthy..coder.com", } export const MockWorkspaceProxies: TypesGen.Region[] = [ MockPrimaryWorkspaceProxy, MockHealthyWildWorkspaceProxy, MockUnhealthyWildWorkspaceProxy, { id: "26e84c16-db24-4636-a62d-aa1a4232b858", name: "nowildcard", display_name: "No wildcard", icon_url: "/emojis/1f920.png", healthy: true, path_app_url: "https://cowboy.coder.com", wildcard_hostname: "", }, ] export const MockBuildInfo: TypesGen.BuildInfoResponse = { external_url: "file:///mock-url", version: "v99.999.9999+c9cdf14", dashboard_url: "https:///mock-url", workspace_proxy: false, } export const MockSupportLinks: TypesGen.LinkConfig[] = [ { name: "First link", target: "http://first-link", icon: "chat", }, { name: "Second link", target: "http://second-link", icon: "docs", }, { name: "Third link", target: "https://github.com/coder/coder/issues/new?labels=needs+grooming&body={CODER_BUILD_INFO}", icon: "", }, ] export const MockUpdateCheck: TypesGen.UpdateCheckResponse = { current: true, url: "file:///mock-url", version: "v99.999.9999+c9cdf14", } export const MockOwnerRole: TypesGen.Role = { name: "owner", display_name: "Owner", } export const MockUserAdminRole: TypesGen.Role = { name: "user_admin", display_name: "User Admin", } export const MockTemplateAdminRole: TypesGen.Role = { name: "template_admin", display_name: "Template Admin", } export const MockMemberRole: TypesGen.Role = { name: "member", display_name: "Member", } export const MockAuditorRole: TypesGen.Role = { name: "auditor", display_name: "Auditor", } // assignableRole takes a role and a boolean. The boolean implies if the // actor can assign (add/remove) the role from other users. export function assignableRole( role: TypesGen.Role, assignable: boolean, ): TypesGen.AssignableRoles { return { ...role, assignable: assignable, } } export const MockSiteRoles = [MockUserAdminRole, MockAuditorRole] export const MockAssignableSiteRoles = [ assignableRole(MockUserAdminRole, true), assignableRole(MockAuditorRole, true), ] export const MockMemberPermissions = { viewAuditLog: false, } export const MockUser: TypesGen.User = { id: "test-user", username: "TestUser", email: "test@coder.com", created_at: "", status: "active", organization_ids: [MockOrganization.id], roles: [MockOwnerRole], avatar_url: "https://avatars.githubusercontent.com/u/95932066?s=200&v=4", last_seen_at: "", } export const MockUserAdmin: TypesGen.User = { id: "test-user", username: "TestUser", email: "test@coder.com", created_at: "", status: "active", organization_ids: [MockOrganization.id], roles: [MockUserAdminRole], avatar_url: "", last_seen_at: "", } export const MockUser2: TypesGen.User = { id: "test-user-2", username: "TestUser2", email: "test2@coder.com", created_at: "", status: "active", organization_ids: [MockOrganization.id], roles: [], avatar_url: "", last_seen_at: "2022-09-14T19:12:21Z", } export const SuspendedMockUser: TypesGen.User = { id: "suspended-mock-user", username: "SuspendedMockUser", email: "iamsuspendedsad!@coder.com", created_at: "", status: "suspended", organization_ids: [MockOrganization.id], roles: [], avatar_url: "", last_seen_at: "", } export const MockProvisioner: TypesGen.ProvisionerDaemon = { created_at: "", id: "test-provisioner", name: "Test Provisioner", provisioners: ["echo"], tags: {}, } export const MockProvisionerJob: TypesGen.ProvisionerJob = { created_at: "", id: "test-provisioner-job", status: "succeeded", file_id: MockOrganization.id, completed_at: "2022-05-17T17:39:01.382927298Z", tags: {}, } export const MockFailedProvisionerJob: TypesGen.ProvisionerJob = { ...MockProvisionerJob, status: "failed", } export const MockCancelingProvisionerJob: TypesGen.ProvisionerJob = { ...MockProvisionerJob, status: "canceling", } export const MockCanceledProvisionerJob: TypesGen.ProvisionerJob = { ...MockProvisionerJob, status: "canceled", } export const MockRunningProvisionerJob: TypesGen.ProvisionerJob = { ...MockProvisionerJob, status: "running", } export const MockPendingProvisionerJob: TypesGen.ProvisionerJob = { ...MockProvisionerJob, status: "pending", } export const MockTemplateVersion: TypesGen.TemplateVersion = { id: "test-template-version", created_at: "2022-05-17T17:39:01.382927298Z", updated_at: "2022-05-17T17:39:01.382927298Z", template_id: "test-template", job: MockProvisionerJob, name: "test-version", readme: `--- name:Template test --- ## Instructions You can add instructions here [Some link info](https://coder.com)`, created_by: MockUser, } export const MockTemplateVersion2: TypesGen.TemplateVersion = { id: "test-template-version-2", created_at: "2022-05-17T17:39:01.382927298Z", updated_at: "2022-05-17T17:39:01.382927298Z", template_id: "test-template", job: MockProvisionerJob, name: "test-version-2", readme: `--- name:Template test 2 --- ## Instructions You can add instructions here [Some link info](https://coder.com)`, created_by: MockUser, } export const MockTemplate: TypesGen.Template = { id: "test-template", created_at: "2022-05-17T17:39:01.382927298Z", updated_at: "2022-05-18T17:39:01.382927298Z", organization_id: MockOrganization.id, name: "test-template", display_name: "Test Template", provisioner: MockProvisioner.provisioners[0], active_version_id: MockTemplateVersion.id, active_user_count: 1, build_time_stats: { start: { P50: 1000, P95: 1500, }, stop: { P50: 1000, P95: 1500, }, delete: { P50: 1000, P95: 1500, }, }, description: "This is a test description.", default_ttl_ms: 24 * 60 * 60 * 1000, max_ttl_ms: 2 * 24 * 60 * 60 * 1000, created_by_id: "test-creator-id", created_by_name: "test_creator", icon: "/icon/code.svg", allow_user_cancel_workspace_jobs: true, failure_ttl_ms: 0, inactivity_ttl_ms: 0, allow_user_autostart: false, allow_user_autostop: false, } export const MockTemplateVersionFiles: TemplateVersionFiles = { "README.md": "# Example\n\nThis is an example template.", "main.tf": `// Provides info about the workspace. data "coder_workspace" "me" {} // Provides the startup script used to download // the agent and communicate with Coder. resource "coder_agent" "dev" { os = "linux" arch = "amd64" } resource "kubernetes_pod" "main" { // Ensures that the Pod dies when the workspace shuts down! count = data.coder_workspace.me.start_count metadata { name = "dev-\${data.coder_workspace.me.id}" } spec { container { image = "ubuntu" command = ["sh", "-c", coder_agent.main.init_script] env { name = "CODER_AGENT_TOKEN" value = coder_agent.main.token } } } } `, } export const MockTemplateVersionFileTree: FileTree = { "README.md": "# Example\n\nThis is an example template.", "main.tf": `// Provides info about the workspace. data "coder_workspace" "me" {} // Provides the startup script used to download // the agent and communicate with Coder. resource "coder_agent" "dev" { os = "linux" arch = "amd64" } resource "kubernetes_pod" "main" { // Ensures that the Pod dies when the workspace shuts down! count = data.coder_workspace.me.start_count metadata { name = "dev-\${data.coder_workspace.me.id}" } spec { container { image = "ubuntu" command = ["sh", "-c", coder_agent.main.init_script] env { name = "CODER_AGENT_TOKEN" value = coder_agent.main.token } } } } `, images: { "java.Dockerfile": "FROM eclipse-temurin:17-jdk-jammy", "python.Dockerfile": "FROM python:3.8-slim-buster", }, } export const MockWorkspaceApp: TypesGen.WorkspaceApp = { id: "test-app", slug: "test-app", display_name: "Test App", icon: "", subdomain: false, health: "disabled", external: false, url: "", sharing_level: "owner", healthcheck: { url: "", interval: 0, threshold: 0, }, } export const MockWorkspaceAgent: TypesGen.WorkspaceAgent = { apps: [MockWorkspaceApp], architecture: "amd64", created_at: "", environment_variables: {}, id: "test-workspace-agent", name: "a-workspace-agent", operating_system: "linux", resource_id: "", status: "connected", updated_at: "", version: MockBuildInfo.version, latency: { "Coder Embedded DERP": { latency_ms: 32.55, preferred: true, }, }, connection_timeout_seconds: 120, troubleshooting_url: "https://coder.com/troubleshoot", lifecycle_state: "starting", login_before_ready: false, startup_logs_length: 0, startup_logs_overflowed: false, startup_script_timeout_seconds: 120, shutdown_script_timeout_seconds: 120, } export const MockWorkspaceAgentDisconnected: TypesGen.WorkspaceAgent = { ...MockWorkspaceAgent, id: "test-workspace-agent-2", name: "another-workspace-agent", status: "disconnected", version: "", latency: {}, lifecycle_state: "ready", } export const MockWorkspaceAgentOutdated: TypesGen.WorkspaceAgent = { ...MockWorkspaceAgent, id: "test-workspace-agent-3", name: "an-outdated-workspace-agent", version: "v99.999.9998+abcdef", operating_system: "Windows", latency: { ...MockWorkspaceAgent.latency, Chicago: { preferred: false, latency_ms: 95.11, }, "San Francisco": { preferred: false, latency_ms: 111.55, }, Paris: { preferred: false, latency_ms: 221.66, }, }, lifecycle_state: "ready", } export const MockWorkspaceAgentConnecting: TypesGen.WorkspaceAgent = { ...MockWorkspaceAgent, id: "test-workspace-agent-connecting", name: "another-workspace-agent", status: "connecting", version: "", latency: {}, lifecycle_state: "created", } export const MockWorkspaceAgentTimeout: TypesGen.WorkspaceAgent = { ...MockWorkspaceAgent, id: "test-workspace-agent-timeout", name: "a-timed-out-workspace-agent", status: "timeout", version: "", latency: {}, lifecycle_state: "created", } export const MockWorkspaceAgentStarting: TypesGen.WorkspaceAgent = { ...MockWorkspaceAgent, id: "test-workspace-agent-starting", name: "a-starting-workspace-agent", lifecycle_state: "starting", } export const MockWorkspaceAgentReady: TypesGen.WorkspaceAgent = { ...MockWorkspaceAgent, id: "test-workspace-agent-ready", name: "a-ready-workspace-agent", lifecycle_state: "ready", } export const MockWorkspaceAgentStartTimeout: TypesGen.WorkspaceAgent = { ...MockWorkspaceAgent, id: "test-workspace-agent-start-timeout", name: "a-workspace-agent-timed-out-while-running-startup-script", lifecycle_state: "start_timeout", } export const MockWorkspaceAgentStartError: TypesGen.WorkspaceAgent = { ...MockWorkspaceAgent, id: "test-workspace-agent-start-error", name: "a-workspace-agent-errored-while-running-startup-script", lifecycle_state: "start_error", } export const MockWorkspaceAgentShuttingDown: TypesGen.WorkspaceAgent = { ...MockWorkspaceAgent, id: "test-workspace-agent-shutting-down", name: "a-shutting-down-workspace-agent", lifecycle_state: "shutting_down", } export const MockWorkspaceAgentShutdownTimeout: TypesGen.WorkspaceAgent = { ...MockWorkspaceAgent, id: "test-workspace-agent-shutdown-timeout", name: "a-workspace-agent-timed-out-while-running-shutdownup-script", lifecycle_state: "shutdown_timeout", } export const MockWorkspaceAgentShutdownError: TypesGen.WorkspaceAgent = { ...MockWorkspaceAgent, id: "test-workspace-agent-shutdown-error", name: "a-workspace-agent-errored-while-running-shutdownup-script", lifecycle_state: "shutdown_error", } export const MockWorkspaceAgentOff: TypesGen.WorkspaceAgent = { ...MockWorkspaceAgent, id: "test-workspace-agent-off", name: "a-workspace-agent-is-shut-down", lifecycle_state: "off", } export const MockWorkspaceResource: TypesGen.WorkspaceResource = { agents: [ MockWorkspaceAgent, MockWorkspaceAgentConnecting, MockWorkspaceAgentOutdated, ], created_at: "", id: "test-workspace-resource", job_id: "", name: "a-workspace-resource", type: "google_compute_disk", workspace_transition: "start", hide: false, icon: "", metadata: [{ key: "api_key", value: "12345678", sensitive: true }], daily_cost: 10, } export const MockWorkspaceResource2: TypesGen.WorkspaceResource = { agents: [ MockWorkspaceAgent, MockWorkspaceAgentDisconnected, MockWorkspaceAgentOutdated, ], created_at: "", id: "test-workspace-resource-2", job_id: "", name: "another-workspace-resource", type: "google_compute_disk", workspace_transition: "start", hide: false, icon: "", metadata: [{ key: "size", value: "32GB", sensitive: false }], daily_cost: 10, } export const MockWorkspaceResource3: TypesGen.WorkspaceResource = { agents: [ MockWorkspaceAgent, MockWorkspaceAgentDisconnected, MockWorkspaceAgentOutdated, ], created_at: "", id: "test-workspace-resource-3", job_id: "", name: "another-workspace-resource", type: "google_compute_disk", workspace_transition: "start", hide: true, icon: "", metadata: [{ key: "size", value: "32GB", sensitive: false }], daily_cost: 20, } export const MockWorkspaceAutostartDisabled: TypesGen.UpdateWorkspaceAutostartRequest = { schedule: "", } export const MockWorkspaceAutostartEnabled: TypesGen.UpdateWorkspaceAutostartRequest = { // Runs at 9:30am Monday through Friday using Canada/Eastern // (America/Toronto) time schedule: "CRON_TZ=Canada/Eastern 30 9 * * 1-5", } export const MockWorkspaceBuild: TypesGen.WorkspaceBuild = { build_number: 1, created_at: "2022-05-17T17:39:01.382927298Z", id: "1", initiator_id: MockUser.id, initiator_name: MockUser.username, job: MockProvisionerJob, template_version_id: MockTemplateVersion.id, template_version_name: MockTemplateVersion.name, transition: "start", updated_at: "2022-05-17T17:39:01.382927298Z", workspace_name: "test-workspace", workspace_owner_id: MockUser.id, workspace_owner_name: MockUser.username, workspace_id: "759f1d46-3174-453d-aa60-980a9c1442f3", deadline: "2022-05-17T23:39:00.00Z", reason: "initiator", resources: [MockWorkspaceResource], status: "running", daily_cost: 20, } export const MockFailedWorkspaceBuild = ( transition: TypesGen.WorkspaceTransition = "start", ): TypesGen.WorkspaceBuild => ({ build_number: 1, created_at: "2022-05-17T17:39:01.382927298Z", id: "1", initiator_id: MockUser.id, initiator_name: MockUser.username, job: MockFailedProvisionerJob, template_version_id: MockTemplateVersion.id, template_version_name: MockTemplateVersion.name, transition: transition, updated_at: "2022-05-17T17:39:01.382927298Z", workspace_name: "test-workspace", workspace_owner_id: MockUser.id, workspace_owner_name: MockUser.username, workspace_id: "759f1d46-3174-453d-aa60-980a9c1442f3", deadline: "2022-05-17T23:39:00.00Z", reason: "initiator", resources: [], status: "running", daily_cost: 20, }) export const MockWorkspaceBuildStop: TypesGen.WorkspaceBuild = { ...MockWorkspaceBuild, id: "2", transition: "stop", } export const MockWorkspaceBuildDelete: TypesGen.WorkspaceBuild = { ...MockWorkspaceBuild, id: "3", transition: "delete", } export const MockBuilds = [ MockWorkspaceBuild, MockWorkspaceBuildStop, MockWorkspaceBuildDelete, ] export const MockWorkspace: TypesGen.Workspace = { id: "test-workspace", name: "Test-Workspace", created_at: "", updated_at: "", template_id: MockTemplate.id, template_name: MockTemplate.name, template_icon: MockTemplate.icon, template_display_name: MockTemplate.display_name, template_allow_user_cancel_workspace_jobs: MockTemplate.allow_user_cancel_workspace_jobs, outdated: false, owner_id: MockUser.id, organization_id: MockOrganization.id, owner_name: MockUser.username, autostart_schedule: MockWorkspaceAutostartEnabled.schedule, ttl_ms: 2 * 60 * 60 * 1000, latest_build: MockWorkspaceBuild, last_used_at: "2022-05-16T15:29:10.302441433Z", deleting_at: "0001-01-01T00:00:00Z", } export const MockStoppedWorkspace: TypesGen.Workspace = { ...MockWorkspace, id: "test-stopped-workspace", latest_build: { ...MockWorkspaceBuildStop, status: "stopped" }, } export const MockStoppingWorkspace: TypesGen.Workspace = { ...MockWorkspace, id: "test-stopping-workspace", latest_build: { ...MockWorkspaceBuildStop, job: MockRunningProvisionerJob, status: "stopping", }, } export const MockStartingWorkspace: TypesGen.Workspace = { ...MockWorkspace, id: "test-starting-workspace", latest_build: { ...MockWorkspaceBuild, job: MockRunningProvisionerJob, transition: "start", status: "starting", }, } export const MockCancelingWorkspace: TypesGen.Workspace = { ...MockWorkspace, id: "test-canceling-workspace", latest_build: { ...MockWorkspaceBuild, job: MockCancelingProvisionerJob, status: "canceling", }, } export const MockCanceledWorkspace: TypesGen.Workspace = { ...MockWorkspace, id: "test-canceled-workspace", latest_build: { ...MockWorkspaceBuild, job: MockCanceledProvisionerJob, status: "canceled", }, } export const MockFailedWorkspace: TypesGen.Workspace = { ...MockWorkspace, id: "test-failed-workspace", latest_build: { ...MockWorkspaceBuild, job: MockFailedProvisionerJob, status: "failed", }, } export const MockDeletingWorkspace: TypesGen.Workspace = { ...MockWorkspace, id: "test-deleting-workspace", latest_build: { ...MockWorkspaceBuildDelete, job: MockRunningProvisionerJob, status: "deleting", }, } export const MockDeletedWorkspace: TypesGen.Workspace = { ...MockWorkspace, id: "test-deleted-workspace", latest_build: { ...MockWorkspaceBuildDelete, status: "deleted" }, } export const MockOutdatedWorkspace: TypesGen.Workspace = { ...MockFailedWorkspace, id: "test-outdated-workspace", outdated: true, } export const MockPendingWorkspace: TypesGen.Workspace = { ...MockWorkspace, id: "test-pending-workspace", latest_build: { ...MockWorkspaceBuild, job: MockPendingProvisionerJob, transition: "start", status: "pending", }, } // just over one page of workspaces export const MockWorkspacesResponse: TypesGen.WorkspacesResponse = { workspaces: range(1, 27).map((id: number) => ({ ...MockWorkspace, id: id.toString(), name: `${MockWorkspace.name}${id}`, })), count: 26, } export const MockTemplateVersionParameter1: TypesGen.TemplateVersionParameter = { name: "first_parameter", type: "string", description: "This is first parameter", description_plaintext: "Markdown: This is first parameter", default_value: "abc", mutable: true, icon: "/icon/folder.svg", options: [], required: true, } export const MockTemplateVersionParameter2: TypesGen.TemplateVersionParameter = { name: "second_parameter", type: "number", description: "This is second parameter", description_plaintext: "Markdown: This is second parameter", default_value: "2", mutable: true, icon: "/icon/folder.svg", options: [], validation_min: 1, validation_max: 3, validation_monotonic: "increasing", required: true, } export const MockTemplateVersionParameter3: TypesGen.TemplateVersionParameter = { name: "third_parameter", type: "string", description: "This is third parameter", description_plaintext: "Markdown: This is third parameter", default_value: "aaa", mutable: true, icon: "/icon/database.svg", options: [], validation_error: "No way!", validation_regex: "^[a-z]{3}$", required: true, } export const MockTemplateVersionParameter4: TypesGen.TemplateVersionParameter = { name: "fourth_parameter", type: "string", description: "This is fourth parameter", description_plaintext: "Markdown: This is fourth parameter", default_value: "def", mutable: false, icon: "/icon/database.svg", options: [], required: true, } export const MockTemplateVersionParameter5: TypesGen.TemplateVersionParameter = { name: "fifth_parameter", type: "number", description: "This is fifth parameter", description_plaintext: "Markdown: This is fifth parameter", default_value: "5", mutable: true, icon: "/icon/folder.svg", options: [], validation_min: 1, validation_max: 10, validation_monotonic: "decreasing", required: true, } export const MockTemplateVersionVariable1: TypesGen.TemplateVersionVariable = { name: "first_variable", description: "This is first variable.", type: "string", value: "", default_value: "abc", required: false, sensitive: false, } export const MockTemplateVersionVariable2: TypesGen.TemplateVersionVariable = { name: "second_variable", description: "This is second variable.", type: "number", value: "5", default_value: "3", required: false, sensitive: false, } export const MockTemplateVersionVariable3: TypesGen.TemplateVersionVariable = { name: "third_variable", description: "This is third variable.", type: "bool", value: "", default_value: "false", required: false, sensitive: false, } export const MockTemplateVersionVariable4: TypesGen.TemplateVersionVariable = { name: "fourth_variable", description: "This is fourth variable.", type: "string", value: "defghijk", default_value: "", required: true, sensitive: true, } export const MockTemplateVersionVariable5: TypesGen.TemplateVersionVariable = { name: "fifth_variable", description: "This is fifth variable.", type: "string", value: "", default_value: "", required: true, sensitive: false, } // requests the MockWorkspace export const MockWorkspaceRequest: TypesGen.CreateWorkspaceRequest = { name: "test", parameter_values: [], template_id: "test-template", rich_parameter_values: [ { name: MockTemplateVersionParameter1.name, value: MockTemplateVersionParameter1.default_value, }, ], } export const MockUserAgent: Types.UserAgent = { browser: "Chrome 99.0.4844", device: "Other", ip_address: "11.22.33.44", os: "Windows 10", } export const MockAuthMethods: TypesGen.AuthMethods = { password: { enabled: true }, github: { enabled: false }, oidc: { enabled: false, signInText: "", iconUrl: "" }, } export const MockGitSSHKey: TypesGen.GitSSHKey = { user_id: "1fa0200f-7331-4524-a364-35770666caa7", created_at: "2022-05-16T14:30:34.148205897Z", updated_at: "2022-05-16T15:29:10.302441433Z", public_key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFJOQRIM7kE30rOzrfy+/+R+nQGCk7S9pioihy+2ARbq", } export const MockWorkspaceBuildLogs: TypesGen.ProvisionerJobLog[] = [ { id: 1, created_at: "2022-05-19T16:45:31.005Z", log_source: "provisioner_daemon", log_level: "info", stage: "Setting up", output: "", }, { id: 2, created_at: "2022-05-19T16:45:31.006Z", log_source: "provisioner_daemon", log_level: "info", stage: "Starting workspace", output: "", }, { id: 3, created_at: "2022-05-19T16:45:31.072Z", log_source: "provisioner", log_level: "debug", stage: "Starting workspace", output: "", }, { id: 4, created_at: "2022-05-19T16:45:31.073Z", log_source: "provisioner", log_level: "debug", stage: "Starting workspace", output: "Initializing the backend...", }, { id: 5, created_at: "2022-05-19T16:45:31.077Z", log_source: "provisioner", log_level: "debug", stage: "Starting workspace", output: "", }, { id: 6, created_at: "2022-05-19T16:45:31.078Z", log_source: "provisioner", log_level: "debug", stage: "Starting workspace", output: "Initializing provider plugins...", }, { id: 7, created_at: "2022-05-19T16:45:31.078Z", log_source: "provisioner", log_level: "debug", stage: "Starting workspace", output: '- Finding hashicorp/google versions matching "~\u003e 4.15"...', }, { id: 8, created_at: "2022-05-19T16:45:31.123Z", log_source: "provisioner", log_level: "debug", stage: "Starting workspace", output: '- Finding coder/coder versions matching "0.3.4"...', }, { id: 9, created_at: "2022-05-19T16:45:31.137Z", log_source: "provisioner", log_level: "debug", stage: "Starting workspace", output: "- Using hashicorp/google v4.21.0 from the shared cache directory", }, { id: 10, created_at: "2022-05-19T16:45:31.344Z", log_source: "provisioner", log_level: "debug", stage: "Starting workspace", output: "- Using coder/coder v0.3.4 from the shared cache directory", }, { id: 11, created_at: "2022-05-19T16:45:31.388Z", log_source: "provisioner", log_level: "debug", stage: "Starting workspace", output: "", }, { id: 12, created_at: "2022-05-19T16:45:31.388Z", log_source: "provisioner", log_level: "debug", stage: "Starting workspace", output: "Terraform has created a lock file .terraform.lock.hcl to record the provider", }, { id: 13, created_at: "2022-05-19T16:45:31.389Z", log_source: "provisioner", log_level: "debug", stage: "Starting workspace", output: "selections it made above. Include this file in your version control repository", }, { id: 14, created_at: "2022-05-19T16:45:31.389Z", log_source: "provisioner", log_level: "debug", stage: "Starting workspace", output: "so that Terraform can guarantee to make the same selections by default when", }, { id: 15, created_at: "2022-05-19T16:45:31.39Z", log_source: "provisioner", log_level: "debug", stage: "Starting workspace", output: 'you run "terraform init" in the future.', }, { id: 16, created_at: "2022-05-19T16:45:31.39Z", log_source: "provisioner", log_level: "debug", stage: "Starting workspace", output: "", }, { id: 17, created_at: "2022-05-19T16:45:31.391Z", log_source: "provisioner", log_level: "debug", stage: "Starting workspace", output: "Terraform has been successfully initialized!", }, { id: 18, created_at: "2022-05-19T16:45:31.42Z", log_source: "provisioner", log_level: "info", stage: "Starting workspace", output: "Terraform 1.1.9", }, { id: 19, created_at: "2022-05-19T16:45:33.537Z", log_source: "provisioner", log_level: "info", stage: "Starting workspace", output: "coder_agent.dev: Plan to create", }, { id: 20, created_at: "2022-05-19T16:45:33.537Z", log_source: "provisioner", log_level: "info", stage: "Starting workspace", output: "google_compute_disk.root: Plan to create", }, { id: 21, created_at: "2022-05-19T16:45:33.538Z", log_source: "provisioner", log_level: "info", stage: "Starting workspace", output: "google_compute_instance.dev[0]: Plan to create", }, { id: 22, created_at: "2022-05-19T16:45:33.539Z", log_source: "provisioner", log_level: "info", stage: "Starting workspace", output: "Plan: 3 to add, 0 to change, 0 to destroy.", }, { id: 23, created_at: "2022-05-19T16:45:33.712Z", log_source: "provisioner", log_level: "info", stage: "Starting workspace", output: "coder_agent.dev: Creating...", }, { id: 24, created_at: "2022-05-19T16:45:33.719Z", log_source: "provisioner", log_level: "info", stage: "Starting workspace", output: "coder_agent.dev: Creation complete after 0s [id=d07f5bdc-4a8d-4919-9cdb-0ac6ba9e64d6]", }, { id: 25, created_at: "2022-05-19T16:45:34.139Z", log_source: "provisioner", log_level: "info", stage: "Starting workspace", output: "google_compute_disk.root: Creating...", }, { id: 26, created_at: "2022-05-19T16:45:44.14Z", log_source: "provisioner", log_level: "info", stage: "Starting workspace", output: "google_compute_disk.root: Still creating... [10s elapsed]", }, { id: 27, created_at: "2022-05-19T16:45:47.106Z", log_source: "provisioner", log_level: "info", stage: "Starting workspace", output: "google_compute_disk.root: Creation complete after 13s [id=projects/bruno-coder-v2/zones/europe-west4-b/disks/coder-developer-bruno-dev-123-root]", }, { id: 28, created_at: "2022-05-19T16:45:47.118Z", log_source: "provisioner", log_level: "info", stage: "Starting workspace", output: "google_compute_instance.dev[0]: Creating...", }, { id: 29, created_at: "2022-05-19T16:45:57.122Z", log_source: "provisioner", log_level: "info", stage: "Starting workspace", output: "google_compute_instance.dev[0]: Still creating... [10s elapsed]", }, { id: 30, created_at: "2022-05-19T16:46:00.837Z", log_source: "provisioner", log_level: "info", stage: "Starting workspace", output: "google_compute_instance.dev[0]: Creation complete after 14s [id=projects/bruno-coder-v2/zones/europe-west4-b/instances/coder-developer-bruno-dev-123]", }, { id: 31, created_at: "2022-05-19T16:46:00.846Z", log_source: "provisioner", log_level: "info", stage: "Starting workspace", output: "Apply complete! Resources: 3 added, 0 changed, 0 destroyed.", }, { id: 32, created_at: "2022-05-19T16:46:00.847Z", log_source: "provisioner", log_level: "info", stage: "Starting workspace", output: "Outputs: 0", }, { id: 33, created_at: "2022-05-19T16:46:02.283Z", log_source: "provisioner_daemon", log_level: "info", stage: "Cleaning Up", output: "", }, ] export const MockCancellationMessage = { message: "Job successfully canceled", } type MockAPIInput = { message?: string detail?: string validations?: FieldError[] } type MockAPIOutput = { isAxiosError: true response: { data: { message: string detail: string | undefined validations: FieldError[] | undefined } } } export const mockApiError = ({ message, detail, validations, }: MockAPIInput): MockAPIOutput => ({ // This is how axios can check if it is an axios error when calling isAxiosError isAxiosError: true, response: { data: { message: message ?? "Something went wrong.", detail: detail ?? undefined, validations: validations ?? undefined, }, }, }) export const MockEntitlements: TypesGen.Entitlements = { errors: [], warnings: [], has_license: false, features: withDefaultFeatures({}), require_telemetry: false, trial: false, } export const MockEntitlementsWithWarnings: TypesGen.Entitlements = { errors: [], warnings: ["You are over your active user limit.", "And another thing."], has_license: true, trial: false, require_telemetry: false, features: withDefaultFeatures({ user_limit: { enabled: true, entitlement: "grace_period", limit: 100, actual: 102, }, audit_log: { enabled: true, entitlement: "entitled", }, browser_only: { enabled: true, entitlement: "entitled", }, }), } export const MockEntitlementsWithAuditLog: TypesGen.Entitlements = { errors: [], warnings: [], has_license: true, require_telemetry: false, trial: false, features: withDefaultFeatures({ audit_log: { enabled: true, entitlement: "entitled", }, }), } export const MockEntitlementsWithScheduling: TypesGen.Entitlements = { errors: [], warnings: [], has_license: true, require_telemetry: false, trial: false, features: withDefaultFeatures({ advanced_template_scheduling: { enabled: true, entitlement: "entitled", }, }), } export const MockExperiments: TypesGen.Experiment[] = ["workspace_actions"] export const MockAuditLog: TypesGen.AuditLog = { id: "fbd2116a-8961-4954-87ae-e4575bd29ce0", request_id: "53bded77-7b9d-4e82-8771-991a34d759f9", time: "2022-05-19T16:45:57.122Z", organization_id: MockOrganization.id, ip: "127.0.0.1", user_agent: '"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"', resource_type: "workspace", resource_id: "ef8d1cf4-82de-4fd9-8980-047dad6d06b5", resource_target: "bruno-dev", resource_icon: "", action: "create", diff: { ttl: { old: 0, new: 3600000000000, secret: false, }, }, status_code: 200, additional_fields: {}, description: "{user} created workspace {target}", user: MockUser, resource_link: "/@admin/bruno-dev", is_deleted: false, } export const MockAuditLog2: TypesGen.AuditLog = { ...MockAuditLog, id: "53bded77-7b9d-4e82-8771-991a34d759f9", action: "write", time: "2022-05-20T16:45:57.122Z", description: "{user} updated workspace {target}", diff: { workspace_name: { old: "old-workspace-name", new: MockWorkspace.name, secret: false, }, workspace_auto_off: { old: true, new: false, secret: false, }, template_version_id: { old: "fbd2116a-8961-4954-87ae-e4575bd29ce0", new: "53bded77-7b9d-4e82-8771-991a34d759f9", secret: false, }, roles: { old: null, new: ["admin", "auditor"], secret: false, }, }, } export const MockWorkspaceCreateAuditLogForDifferentOwner = { ...MockAuditLog, additional_fields: { workspace_owner: "Member", }, } export const MockAuditLogWithWorkspaceBuild: TypesGen.AuditLog = { ...MockAuditLog, id: "f90995bf-4a2b-4089-b597-e66e025e523e", request_id: "61555889-2875-475c-8494-f7693dd5d75b", action: "stop", resource_type: "workspace_build", description: "{user} stopped build for workspace {target}", additional_fields: { workspace_name: "test2", }, } export const MockAuditLogWithDeletedResource: TypesGen.AuditLog = { ...MockAuditLog, is_deleted: true, } export const MockAuditLogGitSSH: TypesGen.AuditLog = { ...MockAuditLog, diff: { private_key: { old: "", new: "", secret: true, }, public_key: { old: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINRUPjBSNtOAnL22+r07OSu9t3Lnm8/5OX8bRHECKS9g\n", new: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEwoUPJPMekuSzMZyV0rA82TGGNzw/Uj/dhLbwiczTpV\n", secret: false, }, }, } export const MockAuditLogSuccessfulLogin: TypesGen.AuditLog = { ...MockAuditLog, resource_type: "api_key", resource_target: "", action: "login", status_code: 201, description: "{user} logged in", } export const MockAuditLogUnsuccessfulLoginKnownUser: TypesGen.AuditLog = { ...MockAuditLogSuccessfulLogin, status_code: 401, } export const MockWorkspaceQuota: TypesGen.WorkspaceQuota = { credits_consumed: 0, budget: 100, } export const MockGroup: TypesGen.Group = { id: "fbd2116a-8961-4954-87ae-e4575bd29ce0", name: "Front-End", avatar_url: "https://example.com", organization_id: MockOrganization.id, members: [MockUser, MockUser2], quota_allowance: 5, } export const MockTemplateACL: TypesGen.TemplateACL = { group: [ { ...everyOneGroup(MockOrganization.id), role: "use" }, { ...MockGroup, role: "admin" }, ], users: [{ ...MockUser, role: "use" }], } export const MockTemplateACLEmpty: TypesGen.TemplateACL = { group: [], users: [], } export const MockTemplateExample: TypesGen.TemplateExample = { id: "aws-windows", url: "https://github.com/coder/coder/tree/main/examples/templates/aws-windows", name: "Develop in an ECS-hosted container", description: "Get started with Linux development on AWS ECS.", markdown: "\n# aws-ecs\n\nThis is a sample template for running a Coder workspace on ECS. It assumes there\nis a pre-existing ECS cluster with EC2-based compute to host the workspace.\n\n## Architecture\n\nThis workspace is built using the following AWS resources:\n\n- Task definition - the container definition, includes the image, command, volume(s)\n- ECS service - manages the task definition\n\n## code-server\n\n`code-server` is installed via the `startup_script` argument in the `coder_agent`\nresource block. The `coder_app` resource is defined to access `code-server` through\nthe dashboard UI over `localhost:13337`.\n", icon: "/icon/aws.png", tags: ["aws", "cloud"], } export const MockTemplateExample2: TypesGen.TemplateExample = { id: "aws-linux", url: "https://github.com/coder/coder/tree/main/examples/templates/aws-linux", name: "Develop in Linux on AWS EC2", description: "Get started with Linux development on AWS EC2.", markdown: '\n# aws-linux\n\nTo get started, run `coder templates init`. When prompted, select this template.\nFollow the on-screen instructions to proceed.\n\n## Authentication\n\nThis template assumes that coderd is run in an environment that is authenticated\nwith AWS. For example, run `aws configure import` to import credentials on the\nsystem and user running coderd. For other ways to authenticate [consult the\nTerraform docs](https://registry.terraform.io/providers/hashicorp/aws/latest/docs#authentication-and-configuration).\n\n## Required permissions / policy\n\nThe following sample policy allows Coder to create EC2 instances and modify\ninstances provisioned by Coder:\n\n```json\n{\n "Version": "2012-10-17",\n "Statement": [\n {\n "Sid": "VisualEditor0",\n "Effect": "Allow",\n "Action": [\n "ec2:GetDefaultCreditSpecification",\n "ec2:DescribeIamInstanceProfileAssociations",\n "ec2:DescribeTags",\n "ec2:CreateTags",\n "ec2:RunInstances",\n "ec2:DescribeInstanceCreditSpecifications",\n "ec2:DescribeImages",\n "ec2:ModifyDefaultCreditSpecification",\n "ec2:DescribeVolumes"\n ],\n "Resource": "*"\n },\n {\n "Sid": "CoderResources",\n "Effect": "Allow",\n "Action": [\n "ec2:DescribeInstances",\n "ec2:DescribeInstanceAttribute",\n "ec2:UnmonitorInstances",\n "ec2:TerminateInstances",\n "ec2:StartInstances",\n "ec2:StopInstances",\n "ec2:DeleteTags",\n "ec2:MonitorInstances",\n "ec2:CreateTags",\n "ec2:RunInstances",\n "ec2:ModifyInstanceAttribute",\n "ec2:ModifyInstanceCreditSpecification"\n ],\n "Resource": "arn:aws:ec2:*:*:instance/*",\n "Condition": {\n "StringEquals": {\n "aws:ResourceTag/Coder_Provisioned": "true"\n }\n }\n }\n ]\n}\n```\n\n## code-server\n\n`code-server` is installed via the `startup_script` argument in the `coder_agent`\nresource block. The `coder_app` resource is defined to access `code-server` through\nthe dashboard UI over `localhost:13337`.\n', icon: "/icon/aws.png", tags: ["aws", "cloud"], } export const MockPermissions: Permissions = { createGroup: true, createTemplates: true, createUser: true, deleteTemplates: true, readAllUsers: true, updateUsers: true, viewAuditLog: true, viewDeploymentValues: true, viewUpdateCheck: true, viewDeploymentStats: true, } export const MockAppearance: TypesGen.AppearanceConfig = { logo_url: "", service_banner: { enabled: false, }, } export const MockWorkspaceBuildParameter1: TypesGen.WorkspaceBuildParameter = { name: MockTemplateVersionParameter1.name, value: "mock-abc", } export const MockWorkspaceBuildParameter2: TypesGen.WorkspaceBuildParameter = { name: MockTemplateVersionParameter2.name, value: "3", } export const MockWorkspaceBuildParameter3: TypesGen.WorkspaceBuildParameter = { name: MockTemplateVersionParameter3.name, value: "my-database", } export const MockWorkspaceBuildParameter5: TypesGen.WorkspaceBuildParameter = { name: MockTemplateVersionParameter5.name, value: "5", } export const MockParameterSchema: TypesGen.ParameterSchema = { id: "000000", job_id: "000000", allow_override_destination: false, allow_override_source: true, created_at: "", default_destination_scheme: "none", default_refresh: "", default_source_scheme: "data", default_source_value: "default-value", name: "parameter name", description: "Some description!", redisplay_value: false, validation_condition: "", validation_contains: [], validation_error: "", validation_type_system: "", validation_value_type: "", } export const mockParameterSchema = ( partial: Partial, ): TypesGen.ParameterSchema => { return { ...MockParameterSchema, ...partial, } } export const MockParameterSchemas: TypesGen.ParameterSchema[] = [ mockParameterSchema({ name: "region", default_source_value: "🏈 US Central", description: "Where would you like your workspace to live?", redisplay_value: true, validation_contains: [ "🏈 US Central", "⚽ Brazil East", "💶 EU West", "🦘 Australia South", ], }), mockParameterSchema({ name: "instance_size", default_source_value: "Big", description: "How large should you instance be?", validation_contains: ["Small", "Medium", "Big"], redisplay_value: true, }), mockParameterSchema({ name: "instance_size", default_source_value: "Big", description: "How large should your instance be?", validation_contains: ["Small", "Medium", "Big"], redisplay_value: true, }), mockParameterSchema({ name: "disable_docker", description: "Disable Docker?", validation_value_type: "bool", default_source_value: "false", redisplay_value: true, }), ] export const MockTemplateVersionGitAuth: TypesGen.TemplateVersionGitAuth = { id: "github", type: "github", authenticate_url: "https://example.com/gitauth/github", authenticated: false, } export const MockDeploymentStats: TypesGen.DeploymentStats = { aggregated_from: "2023-03-06T19:08:55.211625Z", collected_at: "2023-03-06T19:12:55.211625Z", next_update_at: "2023-03-06T19:20:55.211625Z", session_count: { vscode: 128, jetbrains: 5, ssh: 32, reconnecting_pty: 15, }, workspaces: { building: 15, failed: 12, pending: 5, running: 32, stopped: 16, connection_latency_ms: { P50: 32.56, P95: 15.23, }, rx_bytes: 15613513253, tx_bytes: 36113513253, }, } export const MockDeploymentSSH: TypesGen.SSHConfigResponse = { hostname_prefix: " coder.", ssh_config_options: {}, } export const MockStartupLogs: TypesGen.WorkspaceAgentStartupLog[] = [ { id: 166663, created_at: "2023-05-04T11:30:41.402072Z", output: "+ curl -fsSL https://code-server.dev/install.sh", level: "info", }, { id: 166664, created_at: "2023-05-04T11:30:41.40228Z", output: "+ sh -s -- --method=standalone --prefix=/tmp/code-server --version 4.8.3", level: "info", }, { id: 166665, created_at: "2023-05-04T11:30:42.590731Z", output: "Ubuntu 22.04.2 LTS", level: "info", }, { id: 166666, created_at: "2023-05-04T11:30:42.593686Z", output: "Installing v4.8.3 of the amd64 release from GitHub.", level: "info", }, ]