Documentation ¶
Index ¶
- Variables
- func AutoStartWorkspace(workspaceId string, projectName string) (bool, error)
- func DeleteAllWorkspaces(force bool) error
- func GetGitProviderGpgKey(apiClient *apiclient.APIClient, ctx context.Context, providerConfigId *string) (string, error)
- func RemoveWorkspace(ctx context.Context, apiClient *apiclient.APIClient, ...) error
- func RestartWorkspace(apiClient *apiclient.APIClient, workspaceId, projectName string) error
- func StartWorkspace(apiClient *apiclient.APIClient, workspaceId, projectName string) error
- func StopWorkspace(apiClient *apiclient.APIClient, workspaceId, projectName string) error
- type WorkspaceState
Constants ¶
This section is empty.
Variables ¶
View Source
var CodeCmd = &cobra.Command{ Use: "code [WORKSPACE] [PROJECT]", Short: "Open a workspace in your preferred IDE", Args: cobra.RangeArgs(0, 2), Aliases: []string{"open"}, GroupID: util.WORKSPACE_GROUP, RunE: func(cmd *cobra.Command, args []string) error { c, err := config.GetConfig() if err != nil { return err } ctx := context.Background() var workspaceId string var projectName string var providerConfigId *string var ideId string var workspace *apiclient.WorkspaceDTO activeProfile, err := c.GetActiveProfile() if err != nil { return err } ideId = c.DefaultIdeId apiClient, err := apiclient_util.GetApiClient(&activeProfile) if err != nil { return err } if len(args) == 0 { workspaceList, res, err := apiClient.WorkspaceAPI.ListWorkspaces(ctx).Verbose(true).Execute() if err != nil { return apiclient_util.HandleErrorResponse(res, err) } if len(workspaceList) == 0 { views_util.NotifyEmptyWorkspaceList(true) return nil } workspace = selection.GetWorkspaceFromPrompt(workspaceList, "Open") if workspace == nil { return nil } workspaceId = workspace.Id } else { workspace, err = apiclient_util.GetWorkspace(url.PathEscape(args[0]), true) if err != nil { if strings.Contains(err.Error(), workspaces.ErrWorkspaceNotFound.Error()) { log.Debug(err) return errors.New("workspace not found. You can see all workspace names by running the command `daytona list`") } return err } workspaceId = workspace.Id } if len(args) == 0 || len(args) == 1 { selectedProject, err := selectWorkspaceProject(workspaceId, &activeProfile) if err != nil { return err } if selectedProject == nil { return nil } projectName = selectedProject.Name providerConfigId = selectedProject.GitProviderConfigId } if len(args) == 2 { projectName = args[1] for _, project := range workspace.Projects { if project.Name == projectName { providerConfigId = project.GitProviderConfigId break } } } if ideFlag != "" { ideId = ideFlag } if !workspace_util.IsProjectRunning(workspace, projectName) { wsRunningStatus, err := AutoStartWorkspace(workspace.Name, projectName) if err != nil { return err } if !wsRunningStatus { return nil } } providerMetadata := "" if ideId != "ssh" { providerMetadata, err = workspace_util.GetProjectProviderMetadata(workspace, projectName) if err != nil { return err } } gpgKey, err := GetGitProviderGpgKey(apiClient, ctx, providerConfigId) if err != nil { log.Warn(err) } yesFlag, _ := cmd.Flags().GetBool("yes") ideList := config.GetIdeList() ide_views.RenderIdeOpeningMessage(workspace.Name, projectName, ideId, ideList) return openIDE(ideId, activeProfile, workspaceId, projectName, providerMetadata, yesFlag, gpgKey) }, ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { if len(args) == 1 { return getProjectNameCompletions(cmd, args, toComplete) } return getWorkspaceNameCompletions() }, }
View Source
var CreateCmd = &cobra.Command{ Use: "create [REPOSITORY_URL | PROJECT_CONFIG_NAME]...", Short: "Create a workspace", GroupID: util.WORKSPACE_GROUP, RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() var projects []apiclient.CreateProjectDTO var workspaceName string var existingWorkspaceNames []string var existingProjectConfigNames []string promptUsingTUI := len(args) == 0 apiClient, err := apiclient_util.GetApiClient(nil) if err != nil { return err } c, err := config.GetConfig() if err != nil { return err } activeProfile, err := c.GetActiveProfile() if err != nil { return err } profileData, res, err := apiClient.ProfileAPI.GetProfileData(ctx).Execute() if err != nil { return apiclient_util.HandleErrorResponse(res, err) } if nameFlag != "" { workspaceName = nameFlag } workspaceList, res, err := apiClient.WorkspaceAPI.ListWorkspaces(ctx).Execute() if err != nil { return apiclient_util.HandleErrorResponse(res, err) } for _, workspaceInfo := range workspaceList { existingWorkspaceNames = append(existingWorkspaceNames, workspaceInfo.Name) } if promptUsingTUI { err = processPrompting(ctx, apiClient, &workspaceName, &projects, existingWorkspaceNames) if err != nil { if common.IsCtrlCAbort(err) { return nil } else { return err } } } else { existingProjectConfigNames, err = processCmdArguments(ctx, args, apiClient, &projects) if err != nil { return err } initialSuggestion := projects[0].Name if workspaceName == "" { workspaceName = workspace_util.GetSuggestedName(initialSuggestion, existingWorkspaceNames) } } if workspaceName == "" || len(projects) == 0 { return errors.New("workspace name and repository urls are required") } projectNames := []string{} for i := range projects { if profileData != nil && profileData.EnvVars != nil { projects[i].EnvVars = util.MergeEnvVars(profileData.EnvVars, projects[i].EnvVars) } else { projects[i].EnvVars = util.MergeEnvVars(projects[i].EnvVars) } projectNames = append(projectNames, projects[i].Name) } for i, projectConfigName := range existingProjectConfigNames { if projectConfigName == "" { continue } logs_view.DisplayLogEntry(logs.LogEntry{ ProjectName: &projects[i].Name, Msg: fmt.Sprintf("Using detected project config '%s'\n", projectConfigName), }, i) } targetList, res, err := apiClient.TargetAPI.ListTargets(ctx).Execute() if err != nil { return apiclient_util.HandleErrorResponse(res, err) } target, err := workspace_util.GetTarget(workspace_util.GetTargetConfig{ Ctx: ctx, ApiClient: apiClient, TargetList: targetList, ActiveProfileName: activeProfile.Name, TargetNameFlag: targetNameFlag, PromptUsingTUI: promptUsingTUI, }) if err != nil { if common.IsCtrlCAbort(err) { return nil } return err } logs_view.CalculateLongestPrefixLength(projectNames) logs_view.DisplayLogEntry(logs.LogEntry{ Msg: "Request submitted\n", }, logs_view.STATIC_INDEX) activeProfile, err = c.GetActiveProfile() if err != nil { return err } var tsConn *tsnet.Server if target.Name != "local" || activeProfile.Id != "default" { tsConn, err = tailscale.GetConnection(&activeProfile) if err != nil { return err } } id := stringid.GenerateRandomID() id = stringid.TruncateID(id) logsContext, stopLogs := context.WithCancel(context.Background()) go apiclient_util.ReadWorkspaceLogs(logsContext, activeProfile, id, projectNames, true, true, nil) createdWorkspace, res, err := apiClient.WorkspaceAPI.CreateWorkspace(ctx).Workspace(apiclient.CreateWorkspaceDTO{ Id: id, Name: workspaceName, Target: target.Name, Projects: projects, }).Execute() if err != nil { stopLogs() return apiclient_util.HandleErrorResponse(res, err) } gpgKey, err := GetGitProviderGpgKey(apiClient, ctx, projects[0].GitProviderConfigId) if err != nil { log.Warn(err) } err = waitForDial(createdWorkspace, &activeProfile, tsConn, gpgKey) if err != nil { stopLogs() return err } stopLogs() fmt.Print("\033[?25h") wsInfo, res, err := apiClient.WorkspaceAPI.GetWorkspace(ctx, workspaceName).Verbose(true).Execute() if err != nil { return apiclient_util.HandleErrorResponse(res, err) } chosenIdeId := c.DefaultIdeId if ideFlag != "" { chosenIdeId = ideFlag } ideList := config.GetIdeList() var chosenIde config.Ide for _, ide := range ideList { if ide.Id == chosenIdeId { chosenIde = ide } } fmt.Println() info.Render(wsInfo, chosenIde.Name, false) if noIdeFlag { views.RenderCreationInfoMessage("Run 'daytona code' when you're ready to start developing") return nil } views.RenderCreationInfoMessage(fmt.Sprintf("Opening the workspace in %s ...", chosenIde.Name)) projectName := wsInfo.Projects[0].Name providerMetadata, err := workspace_util.GetProjectProviderMetadata(wsInfo, projectName) if err != nil { return err } return openIDE(chosenIdeId, activeProfile, createdWorkspace.Id, wsInfo.Projects[0].Name, providerMetadata, yesFlag, gpgKey) }, }
View Source
var DeleteCmd = &cobra.Command{ Use: "delete [WORKSPACE]", Short: "Delete a workspace", GroupID: util.WORKSPACE_GROUP, Aliases: []string{"remove", "rm"}, RunE: func(cmd *cobra.Command, args []string) error { if allFlag { if yesFlag { fmt.Println("Deleting all workspaces.") err := DeleteAllWorkspaces(forceFlag) if err != nil { return err } } else { form := huh.NewForm( huh.NewGroup( huh.NewConfirm(). Title("Delete all workspaces?"). Description("Are you sure you want to delete all workspaces?"). Value(&yesFlag), ), ).WithTheme(views.GetCustomTheme()) err := form.Run() if err != nil { return err } if yesFlag { err := DeleteAllWorkspaces(forceFlag) if err != nil { return err } } else { fmt.Println("Operation canceled.") } } return nil } ctx := context.Background() var workspaceDeleteList = []*apiclient.WorkspaceDTO{} var workspaceDeleteListNames = []string{} apiClient, err := apiclient_util.GetApiClient(nil) if err != nil { return err } if len(args) == 0 { workspaceList, res, err := apiClient.WorkspaceAPI.ListWorkspaces(ctx).Execute() if err != nil { return apiclient_util.HandleErrorResponse(res, err) } if len(workspaceList) == 0 { views_util.NotifyEmptyWorkspaceList(false) return nil } workspaceDeleteList = selection.GetWorkspacesFromPrompt(workspaceList, "Delete") for _, workspace := range workspaceDeleteList { workspaceDeleteListNames = append(workspaceDeleteListNames, workspace.Name) } } else { for _, arg := range args { workspace, err := apiclient_util.GetWorkspace(arg, false) if err != nil { log.Error(fmt.Sprintf("[ %s ] : %v", arg, err)) continue } workspaceDeleteList = append(workspaceDeleteList, workspace) workspaceDeleteListNames = append(workspaceDeleteListNames, workspace.Name) } } if len(workspaceDeleteList) == 0 { return nil } if !yesFlag { form := huh.NewForm( huh.NewGroup( huh.NewConfirm(). Title(fmt.Sprintf("Delete workspace(s): [%s]?", strings.Join(workspaceDeleteListNames, ", "))). Description(fmt.Sprintf("Are you sure you want to delete the workspace(s): [%s]?", strings.Join(workspaceDeleteListNames, ", "))). Value(&yesFlag), ), ).WithTheme(views.GetCustomTheme()) err := form.Run() if err != nil { return err } } if !yesFlag { fmt.Println("Operation canceled.") } else { for _, workspace := range workspaceDeleteList { err := RemoveWorkspace(ctx, apiClient, workspace, forceFlag) if err != nil { log.Error(fmt.Sprintf("[ %s ] : %v", workspace.Name, err)) } views.RenderInfoMessage(fmt.Sprintf("Workspace '%s' successfully deleted", workspace.Name)) } } return nil }, ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { return getWorkspaceNameCompletions() }, }
View Source
var InfoCmd = &cobra.Command{ Use: "info [WORKSPACE]", Short: "Show workspace info", Aliases: []string{"view", "inspect"}, Args: cobra.RangeArgs(0, 1), GroupID: util.WORKSPACE_GROUP, RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() apiClient, err := apiclient_util.GetApiClient(nil) if err != nil { return err } var workspace *apiclient.WorkspaceDTO if len(args) == 0 { workspaceList, res, err := apiClient.WorkspaceAPI.ListWorkspaces(ctx).Verbose(true).Execute() if err != nil { return apiclient_util.HandleErrorResponse(res, err) } if len(workspaceList) == 0 { views_util.NotifyEmptyWorkspaceList(true) return nil } if format.FormatFlag != "" { format.UnblockStdOut() } workspace = selection.GetWorkspaceFromPrompt(workspaceList, "View") if format.FormatFlag != "" { format.BlockStdOut() } } else { workspace, err = apiclient_util.GetWorkspace(args[0], true) if err != nil { return err } } if workspace == nil { return nil } if format.FormatFlag != "" { formattedData := format.NewFormatter(workspace) formattedData.Print() return nil } info.Render(workspace, "", false) return nil }, ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { return getWorkspaceNameCompletions() }, }
View Source
var ListCmd = &cobra.Command{ Use: "list", Short: "List workspaces", Args: cobra.ExactArgs(0), Aliases: []string{"ls"}, GroupID: util.WORKSPACE_GROUP, RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() var specifyGitProviders bool apiClient, err := apiclient_util.GetApiClient(nil) if err != nil { return err } workspaceList, res, err := apiClient.WorkspaceAPI.ListWorkspaces(ctx).Verbose(verbose).Execute() if err != nil { return apiclient.HandleErrorResponse(res, err) } gitProviders, res, err := apiClient.GitProviderAPI.ListGitProviders(ctx).Execute() if err != nil { return apiclient.HandleErrorResponse(res, err) } if len(gitProviders) > 1 { specifyGitProviders = true } if format.FormatFlag != "" { formattedData := format.NewFormatter(workspaceList) formattedData.Print() return nil } c, err := config.GetConfig() if err != nil { return err } activeProfile, err := c.GetActiveProfile() if err != nil { return err } list_view.ListWorkspaces(workspaceList, specifyGitProviders, verbose, activeProfile.Name) return nil }, }
View Source
var RestartCmd = &cobra.Command{ Use: "restart [WORKSPACE]", Short: "Restart a workspace", Args: cobra.RangeArgs(0, 1), GroupID: util.WORKSPACE_GROUP, RunE: func(cmd *cobra.Command, args []string) error { var workspaceId string ctx := context.Background() apiClient, err := apiclient_util.GetApiClient(nil) if err != nil { return err } if len(args) == 0 { if restartProjectFlag != "" { err := cmd.Help() if err != nil { return err } return nil } workspaceList, res, err := apiClient.WorkspaceAPI.ListWorkspaces(ctx).Execute() if err != nil { return apiclient_util.HandleErrorResponse(res, err) } if len(workspaceList) == 0 { views_util.NotifyEmptyWorkspaceList(true) return nil } workspace := selection.GetWorkspaceFromPrompt(workspaceList, "Restart") if workspace == nil { return nil } workspaceId = workspace.Name } else { workspaceId = args[0] } err = RestartWorkspace(apiClient, workspaceId, restartProjectFlag) if err != nil { return err } if restartProjectFlag != "" { views.RenderInfoMessage(fmt.Sprintf("Project '%s' from workspace '%s' successfully restarted", restartProjectFlag, workspaceId)) } else { views.RenderInfoMessage(fmt.Sprintf("Workspace '%s' successfully restarted", workspaceId)) } return nil }, ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { return getAllWorkspacesByState(WORKSPACE_STATUS_RUNNING) }, }
View Source
var SshCmd = &cobra.Command{ Use: "ssh [WORKSPACE] [PROJECT] [CMD...]", Short: "SSH into a project using the terminal", Args: cobra.ArbitraryArgs, GroupID: util.WORKSPACE_GROUP, RunE: func(cmd *cobra.Command, args []string) error { c, err := config.GetConfig() if err != nil { return err } activeProfile, err := c.GetActiveProfile() if err != nil { return err } ctx := context.Background() var workspace *apiclient.WorkspaceDTO var projectName string var providerConfigId *string apiClient, err := apiclient_util.GetApiClient(&activeProfile) if err != nil { return err } if len(args) == 0 { workspaceList, res, err := apiClient.WorkspaceAPI.ListWorkspaces(ctx).Execute() if err != nil { return apiclient_util.HandleErrorResponse(res, err) } if len(workspaceList) == 0 { views_util.NotifyEmptyWorkspaceList(true) return nil } workspace = selection.GetWorkspaceFromPrompt(workspaceList, "SSH Into") if workspace == nil { return nil } } else { workspace, err = apiclient_util.GetWorkspace(args[0], true) if err != nil { return err } } if len(args) == 0 || len(args) == 1 { selectedProject, err := selectWorkspaceProject(workspace.Id, &activeProfile) if err != nil { return err } if selectedProject == nil { return nil } projectName = selectedProject.Name providerConfigId = selectedProject.GitProviderConfigId } if len(args) >= 2 { projectName = args[1] for _, project := range workspace.Projects { if project.Name == projectName { providerConfigId = project.GitProviderConfigId break } } } if edit { err := editSSHConfig(activeProfile, workspace, projectName) if err != nil { return err } return nil } if !workspace_util.IsProjectRunning(workspace, projectName) { wsRunningStatus, err := AutoStartWorkspace(workspace.Name, projectName) if err != nil { return err } if !wsRunningStatus { return nil } } sshArgs := []string{} if len(args) > 2 { sshArgs = append(sshArgs, args[2:]...) } gpgKey, err := GetGitProviderGpgKey(apiClient, ctx, providerConfigId) if err != nil { log.Warn(err) } return ide.OpenTerminalSsh(activeProfile, workspace.Id, projectName, gpgKey, sshOptions, sshArgs...) }, ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { if len(args) >= 2 { return nil, cobra.ShellCompDirectiveNoFileComp } if len(args) == 1 { return getProjectNameCompletions(cmd, args, toComplete) } return getWorkspaceNameCompletions() }, }
View Source
var SshProxyCmd = &cobra.Command{ Use: "ssh-proxy [PROFILE_ID] [WORKSPACE_ID] [PROJECT]", Args: cobra.RangeArgs(2, 3), Hidden: true, RunE: func(cmd *cobra.Command, args []string) error { c, err := config.GetConfig() if err != nil { return err } profileId := args[0] workspaceId := args[1] projectName := "" profile, err := c.GetProfile(profileId) if err != nil { return err } if len(args) == 3 { projectName = args[2] } else { projectName, err = apiclient.GetFirstWorkspaceProjectName(workspaceId, projectName, &profile) if err != nil { return err } } workspace, err := apiclient.GetWorkspace(workspaceId, true) if err != nil { return err } if workspace.Target == "local" && profile.Id == "default" { project := workspace.Projects[0] if project.Name != projectName { for _, p := range workspace.Projects { if p.Name == projectName { project = p break } } } cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil { return err } dockerClient := docker.NewDockerClient(docker.DockerClientConfig{ ApiClient: cli, }) containerName := dockerClient.GetProjectContainerName(conversion.ToProject(&project)) ctx := context.Background() config := container.ExecOptions{ AttachStdin: true, AttachStderr: true, AttachStdout: true, Cmd: []string{"daytona", "expose", fmt.Sprint(ssh_config.SSH_PORT)}, } response, err := cli.ContainerExecCreate(ctx, containerName, config) if err != nil { return err } resp, err := cli.ContainerExecAttach(ctx, response.ID, container.ExecStartOptions{ Tty: config.Tty, }) if err != nil { return err } go func() { _, err = stdcopy.StdCopy(os.Stdout, os.Stderr, resp.Reader) if err != nil { log.Fatal(err) } }() go func() { _, err := io.Copy(resp.Conn, os.Stdin) if err != nil { log.Fatal(err) } }() for { res, err := cli.ContainerExecInspect(ctx, response.ID) if err != nil { return err } if !res.Running { os.Exit(res.ExitCode) } time.Sleep(100 * time.Millisecond) } } tsConn, err := tailscale.GetConnection(&profile) if err != nil { return err } errChan := make(chan error) dialConn, err := tsConn.Dial(context.Background(), "tcp", fmt.Sprintf("%s:%d", project.GetProjectHostname(workspaceId, projectName), ssh_config.SSH_PORT)) if err != nil { return err } go func() { _, err := io.Copy(os.Stdout, dialConn) if err != nil { errChan <- err } errChan <- nil }() go func() { _, err := io.Copy(dialConn, os.Stdin) if err != nil { errChan <- err } errChan <- nil }() return <-errChan }, }
View Source
var StartCmd = &cobra.Command{ Use: "start [WORKSPACE]", Short: "Start a workspace", Args: cobra.RangeArgs(0, 1), GroupID: util.WORKSPACE_GROUP, RunE: func(cmd *cobra.Command, args []string) error { var selectedWorkspacesNames []string var activeProfile config.Profile var ideId string var ideList []config.Ide var providerConfigId *string projectProviderMetadata := "" ctx := context.Background() apiClient, err := apiclient_util.GetApiClient(nil) if err != nil { return err } if allFlag { return startAllWorkspaces() } if len(args) == 0 { if startProjectFlag != "" { return cmd.Help() } workspaceList, res, err := apiClient.WorkspaceAPI.ListWorkspaces(ctx).Execute() if err != nil { return apiclient_util.HandleErrorResponse(res, err) } if len(workspaceList) == 0 { views_util.NotifyEmptyWorkspaceList(true) return nil } selectedWorkspaces := selection.GetWorkspacesFromPrompt(workspaceList, "Start") for _, workspaces := range selectedWorkspaces { selectedWorkspacesNames = append(selectedWorkspacesNames, workspaces.Name) } } else { selectedWorkspacesNames = append(selectedWorkspacesNames, args[0]) } if len(selectedWorkspacesNames) == 1 { workspaceName := selectedWorkspacesNames[0] var workspaceId string if codeFlag { c, err := config.GetConfig() if err != nil { return err } activeProfile, err = c.GetActiveProfile() if err != nil { return err } ideList = config.GetIdeList() ideId = c.DefaultIdeId wsInfo, res, err := apiClient.WorkspaceAPI.GetWorkspace(ctx, workspaceName).Execute() if err != nil { return apiclient_util.HandleErrorResponse(res, err) } workspaceId = wsInfo.Id if startProjectFlag == "" { startProjectFlag = wsInfo.Projects[0].Name providerConfigId = wsInfo.Projects[0].GitProviderConfigId } else { for _, project := range wsInfo.Projects { if project.Name == startProjectFlag { providerConfigId = project.GitProviderConfigId break } } } if ideId != "ssh" { projectProviderMetadata, err = workspace_util.GetProjectProviderMetadata(wsInfo, wsInfo.Projects[0].Name) if err != nil { return err } } } err = StartWorkspace(apiClient, workspaceName, startProjectFlag) if err != nil { return err } gpgKey, err := GetGitProviderGpgKey(apiClient, ctx, providerConfigId) if err != nil { log.Warn(err) } if startProjectFlag == "" { views.RenderInfoMessage(fmt.Sprintf("Workspace '%s' started successfully", workspaceName)) } else { views.RenderInfoMessage(fmt.Sprintf("Project '%s' from workspace '%s' started successfully", startProjectFlag, workspaceName)) if codeFlag { ide_views.RenderIdeOpeningMessage(workspaceName, startProjectFlag, ideId, ideList) err = openIDE(ideId, activeProfile, workspaceId, startProjectFlag, projectProviderMetadata, yesFlag, gpgKey) if err != nil { return err } } } } else { for _, workspace := range selectedWorkspacesNames { err := StartWorkspace(apiClient, workspace, "") if err != nil { log.Errorf("Failed to start workspace %s: %v\n\n", workspace, err) continue } views.RenderInfoMessage(fmt.Sprintf("- Workspace '%s' started successfully", workspace)) } } return nil }, ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { return getAllWorkspacesByState(WORKSPACE_STATUS_STOPPED) }, }
View Source
var StopCmd = &cobra.Command{ Use: "stop [WORKSPACE]", Short: "Stop a workspace", GroupID: util.WORKSPACE_GROUP, Args: cobra.RangeArgs(0, 1), RunE: func(cmd *cobra.Command, args []string) error { timeFormat := time.Now().Format("2006-01-02 15:04:05") from, err := time.Parse("2006-01-02 15:04:05", timeFormat) if err != nil { return err } c, err := config.GetConfig() if err != nil { return err } activeProfile, err := c.GetActiveProfile() if err != nil { return err } if allFlag { return stopAllWorkspaces(activeProfile, from) } ctx := context.Background() apiClient, err := apiclient_util.GetApiClient(nil) if err != nil { return err } if len(args) == 0 { if stopProjectFlag != "" { return cmd.Help() } workspaceList, res, err := apiClient.WorkspaceAPI.ListWorkspaces(ctx).Execute() if err != nil { return apiclient_util.HandleErrorResponse(res, err) } if len(workspaceList) == 0 { views_util.NotifyEmptyWorkspaceList(true) return nil } selectedWorkspaces := selection.GetWorkspacesFromPrompt(workspaceList, "Stop") for _, workspace := range selectedWorkspaces { err := StopWorkspace(apiClient, workspace.Name, "") if err != nil { log.Errorf("Failed to stop workspace %s: %v\n\n", workspace.Name, err) continue } projectNames := util.ArrayMap(workspace.Projects, func(p apiclient.Project) string { return p.Name }) apiclient_util.ReadWorkspaceLogs(ctx, activeProfile, workspace.Id, projectNames, false, true, &from) views.RenderInfoMessage(fmt.Sprintf("- Workspace '%s' successfully stopped", workspace.Name)) } } else { workspaceId := args[0] var projectNames []string err = StopWorkspace(apiClient, workspaceId, stopProjectFlag) if err != nil { return err } workspace, err := apiclient_util.GetWorkspace(workspaceId, false) if err != nil { return err } if startProjectFlag != "" { projectNames = append(projectNames, stopProjectFlag) } else { projectNames = util.ArrayMap(workspace.Projects, func(p apiclient.Project) string { return p.Name }) } apiclient_util.ReadWorkspaceLogs(ctx, activeProfile, workspace.Id, projectNames, false, true, &from) if stopProjectFlag != "" { views.RenderInfoMessage(fmt.Sprintf("Project '%s' from workspace '%s' successfully stopped", stopProjectFlag, workspaceId)) } else { views.RenderInfoMessage(fmt.Sprintf("Workspace '%s' successfully stopped", workspaceId)) } } return nil }, ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { return getAllWorkspacesByState(WORKSPACE_STATUS_RUNNING) }, }
Functions ¶
func AutoStartWorkspace ¶ added in v0.29.0
func DeleteAllWorkspaces ¶ added in v0.7.0
func GetGitProviderGpgKey ¶ added in v0.40.0
func RemoveWorkspace ¶ added in v0.31.0
func RestartWorkspace ¶ added in v0.35.0
func StartWorkspace ¶ added in v0.31.0
Types ¶
type WorkspaceState ¶ added in v0.4.0
type WorkspaceState string
const ( WORKSPACE_STATUS_RUNNING WorkspaceState = "Running" WORKSPACE_STATUS_STOPPED WorkspaceState = "Unavailable" )
Source Files ¶
Click to show internal directories.
Click to hide internal directories.