Documentation ¶
Index ¶
- Variables
- func AutoStartWorkspace(workspaceId string, projectName string) (bool, error)
- func DeleteAllWorkspaces(force bool) error
- func RemoveWorkspace(ctx context.Context, apiClient *apiclient.APIClient, ...) 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, Run: func(cmd *cobra.Command, args []string) { c, err := config.GetConfig() if err != nil { log.Fatal(err) } ctx := context.Background() var workspaceId string var projectName string var ideId string var workspace *apiclient.WorkspaceDTO activeProfile, err := c.GetActiveProfile() if err != nil { log.Fatal(err) } ideId = c.DefaultIdeId apiClient, err := apiclient_util.GetApiClient(&activeProfile) if err != nil { log.Fatal(err) } if len(args) == 0 { workspaceList, res, err := apiClient.WorkspaceAPI.ListWorkspaces(ctx).Verbose(true).Execute() if err != nil { log.Fatal(apiclient_util.HandleErrorResponse(res, err)) } workspace = selection.GetWorkspaceFromPrompt(workspaceList, "Open") if workspace == nil { return } 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) log.Fatal("Workspace not found. You can see all workspace names by running the command `daytona list`") } log.Fatal(err) } workspaceId = workspace.Id } if len(args) == 0 || len(args) == 1 { selectedProject, err := selectWorkspaceProject(workspaceId, &activeProfile) if err != nil { log.Fatal(err) } if selectedProject == nil { return } projectName = selectedProject.Name } if len(args) == 2 { projectName = args[1] } if ideFlag != "" { ideId = ideFlag } if !workspace_util.IsProjectRunning(workspace, projectName) { wsRunningStatus, err := AutoStartWorkspace(workspace.Name, projectName) if err != nil { log.Fatal(err) } if !wsRunningStatus { return } } providerMetadata := "" if ideId != "ssh" { providerMetadata, err = workspace_util.GetProjectProviderMetadata(workspace, projectName) if err != nil { log.Fatal(err) } } yesFlag, _ := cmd.Flags().GetBool("yes") ideList := config.GetIdeList() ide_views.RenderIdeOpeningMessage(workspace.Name, projectName, ideId, ideList) if err := openIDE(ideId, activeProfile, workspaceId, projectName, providerMetadata, yesFlag); err != nil { log.Fatal(err) } }, 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 CreateCmd = &cobra.Command{ Use: "create [REPOSITORY_URL | PROJECT_CONFIG_NAME]...", Short: "Create a workspace", GroupID: util.WORKSPACE_GROUP, Run: func(cmd *cobra.Command, args []string) { ctx := context.Background() var projects []apiclient.CreateProjectDTO var workspaceName string var existingWorkspaceNames []string var existingProjectConfigNames []string apiClient, err := apiclient_util.GetApiClient(nil) if err != nil { log.Fatal(err) } c, err := config.GetConfig() if err != nil { log.Fatal(err) } activeProfile, err := c.GetActiveProfile() if err != nil { log.Fatal(err) } profileData, res, err := apiClient.ProfileAPI.GetProfileData(ctx).Execute() if err != nil { log.Fatal(apiclient_util.HandleErrorResponse(res, err)) } if nameFlag != "" { workspaceName = nameFlag } workspaceList, res, err := apiClient.WorkspaceAPI.ListWorkspaces(ctx).Execute() if err != nil { log.Fatal(apiclient_util.HandleErrorResponse(res, err)) } for _, workspaceInfo := range workspaceList { existingWorkspaceNames = append(existingWorkspaceNames, workspaceInfo.Name) } if len(args) == 0 { err = processPrompting(ctx, apiClient, &workspaceName, &projects, existingWorkspaceNames) if err != nil { if common.IsCtrlCAbort(err) { return } else { log.Fatal(err) } } } else { existingProjectConfigNames, err = processCmdArguments(ctx, args, apiClient, &projects) if err != nil { log.Fatal(err) } initialSuggestion := projects[0].Name if workspaceName == "" { workspaceName = workspace_util.GetSuggestedName(initialSuggestion, existingWorkspaceNames) } } if workspaceName == "" || len(projects) == 0 { log.Fatal("workspace name and repository urls are required") return } 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) } logs_view.CalculateLongestPrefixLength(projectNames) logs_view.DisplayLogEntry(logs.LogEntry{ Msg: "Request submitted\n", }, logs_view.STATIC_INDEX) 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 { log.Fatal(apiclient_util.HandleErrorResponse(res, err)) } target, err := getTarget(targetList, activeProfile.Name) if err != nil { log.Fatal(err) } activeProfile, err = c.GetActiveProfile() if err != nil { log.Fatal(err) } var tsConn *tsnet.Server if target.Name != "local" || activeProfile.Id != "default" { tsConn, err = tailscale.GetConnection(&activeProfile) if err != nil { log.Fatal(err) } } id := stringid.GenerateRandomID() id = stringid.TruncateID(id) logsContext, stopLogs := context.WithCancel(context.Background()) go apiclient_util.ReadWorkspaceLogs(logsContext, activeProfile, id, projectNames) createdWorkspace, res, err := apiClient.WorkspaceAPI.CreateWorkspace(ctx).Workspace(apiclient.CreateWorkspaceDTO{ Id: id, Name: workspaceName, Target: target.Name, Projects: projects, }).Execute() if err != nil { log.Fatal(apiclient_util.HandleErrorResponse(res, err)) } err = waitForDial(createdWorkspace, &activeProfile, tsConn) if err != nil { log.Fatal(err) } stopLogs() fmt.Print("\033[?25h") wsInfo, res, err := apiClient.WorkspaceAPI.GetWorkspace(ctx, workspaceName).Verbose(true).Execute() if err != nil { log.Fatal(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 !codeFlag { views.RenderCreationInfoMessage("Run 'daytona code' when you're ready to start developing") return } 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 { log.Fatal(err) } err = openIDE(chosenIdeId, activeProfile, createdWorkspace.Id, wsInfo.Projects[0].Name, providerMetadata, yesFlag) if err != nil { log.Fatal(err) } }, }
View Source
var DeleteCmd = &cobra.Command{ Use: "delete [WORKSPACE]", Short: "Delete a workspace", GroupID: util.WORKSPACE_GROUP, Aliases: []string{"remove", "rm"}, Run: func(cmd *cobra.Command, args []string) { if allFlag { if yesFlag { fmt.Println("Deleting all workspaces.") err := DeleteAllWorkspaces(forceFlag) if err != nil { log.Fatal(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 { log.Fatal(err) } if yesFlag { err := DeleteAllWorkspaces(forceFlag) if err != nil { log.Fatal(err) } } else { fmt.Println("Operation canceled.") } } return } ctx := context.Background() var workspaceDeleteList = []*apiclient.WorkspaceDTO{} var workspaceDeleteListNames = []string{} apiClient, err := apiclient_util.GetApiClient(nil) if err != nil { log.Fatal(err) } if len(args) == 0 { workspaceList, res, err := apiClient.WorkspaceAPI.ListWorkspaces(ctx).Execute() if err != nil { log.Fatal(apiclient_util.HandleErrorResponse(res, err)) } 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 } 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 { log.Fatal(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)) } } }, ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { if len(args) > 0 { return nil, cobra.ShellCompDirectiveNoFileComp } 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, Run: func(cmd *cobra.Command, args []string) { ctx := context.Background() apiClient, err := apiclient_util.GetApiClient(nil) if err != nil { log.Fatal(err) } var workspace *apiclient.WorkspaceDTO if len(args) == 0 { workspaceList, res, err := apiClient.WorkspaceAPI.ListWorkspaces(ctx).Verbose(true).Execute() if err != nil { log.Fatal(apiclient_util.HandleErrorResponse(res, err)) } 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 { log.Fatal(err) } } if workspace == nil { return } if format.FormatFlag != "" { formattedData := format.NewFormatter(workspace) formattedData.Print() return } info.Render(workspace, "", false) }, ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { if len(args) > 0 { return nil, cobra.ShellCompDirectiveNoFileComp } return getWorkspaceNameCompletions() }, }
View Source
var ListCmd = &cobra.Command{ Use: "list", Short: "List workspaces", Args: cobra.ExactArgs(0), Aliases: []string{"ls"}, GroupID: util.WORKSPACE_GROUP, Run: func(cmd *cobra.Command, args []string) { ctx := context.Background() var specifyGitProviders bool apiClient, err := apiclient_util.GetApiClient(nil) if err != nil { log.Fatal(err) } workspaceList, res, err := apiClient.WorkspaceAPI.ListWorkspaces(ctx).Verbose(verbose).Execute() if err != nil { log.Fatal(apiclient.HandleErrorResponse(res, err)) } gitProviders, res, err := apiClient.GitProviderAPI.ListGitProviders(ctx).Execute() if err != nil { log.Fatal(apiclient.HandleErrorResponse(res, err)) } if len(gitProviders) > 1 { specifyGitProviders = true } if format.FormatFlag != "" { formattedData := format.NewFormatter(workspaceList) formattedData.Print() return } if len(workspaceList) == 0 { views.RenderInfoMessage("The workspace list is empty. Start off by running 'daytona create'.") return } c, err := config.GetConfig() if err != nil { log.Fatal(err) } activeProfile, err := c.GetActiveProfile() if err != nil { log.Fatal(err) } list_view.ListWorkspaces(workspaceList, specifyGitProviders, verbose, activeProfile.Name) }, }
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, Run: func(cmd *cobra.Command, args []string) { c, err := config.GetConfig() if err != nil { log.Fatal(err) } activeProfile, err := c.GetActiveProfile() if err != nil { log.Fatal(err) } ctx := context.Background() var workspace *apiclient.WorkspaceDTO var projectName string apiClient, err := apiclient_util.GetApiClient(&activeProfile) if err != nil { log.Fatal(err) } if len(args) == 0 { workspaceList, res, err := apiClient.WorkspaceAPI.ListWorkspaces(ctx).Execute() if err != nil { log.Fatal(apiclient_util.HandleErrorResponse(res, err)) } workspace = selection.GetWorkspaceFromPrompt(workspaceList, "SSH Into") if workspace == nil { return } } else { workspace, err = apiclient_util.GetWorkspace(args[0], true) if err != nil { log.Fatal(err) } } if len(args) == 0 || len(args) == 1 { selectedProject, err := selectWorkspaceProject(workspace.Id, &activeProfile) if err != nil { log.Fatal(err) } if selectedProject == nil { return } projectName = selectedProject.Name } if len(args) >= 2 { projectName = args[1] } if !workspace_util.IsProjectRunning(workspace, projectName) { wsRunningStatus, err := AutoStartWorkspace(workspace.Name, projectName) if err != nil { log.Fatal(err) } if !wsRunningStatus { return } } sshArgs := []string{} if len(args) > 2 { sshArgs = append(sshArgs, args[2:]...) } err = ide.OpenTerminalSsh(activeProfile, workspace.Id, projectName, sshArgs...) if err != nil { log.Fatal(err) } }, 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, Run: func(cmd *cobra.Command, args []string) { c, err := config.GetConfig() if err != nil { log.Fatal(err) } profileId := args[0] workspaceId := args[1] projectName := "" profile, err := c.GetProfile(profileId) if err != nil { log.Fatal(err) } if len(args) == 3 { projectName = args[2] } else { projectName, err = apiclient.GetFirstWorkspaceProjectName(workspaceId, projectName, &profile) if err != nil { log.Fatal(err) } } workspace, err := apiclient.GetWorkspace(workspaceId, true) if err != nil { log.Fatal(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 { log.Fatal(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 { log.Fatal(err) } resp, err := cli.ContainerExecAttach(ctx, response.ID, container.ExecStartOptions{ Tty: config.Tty, }) if err != nil { log.Fatal(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 { log.Fatal(err) } if !res.Running { os.Exit(res.ExitCode) } time.Sleep(100 * time.Millisecond) } } tsConn, err := tailscale.GetConnection(&profile) if err != nil { log.Fatal(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 { log.Fatal(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 }() if err := <-errChan; err != nil { log.Fatal(err) } }, }
View Source
var StartCmd = &cobra.Command{ Use: "start [WORKSPACE]", Short: "Start a workspace", Args: cobra.RangeArgs(0, 1), GroupID: util.WORKSPACE_GROUP, Run: func(cmd *cobra.Command, args []string) { var workspaceIdOrName string var activeProfile config.Profile var ideId string var workspaceId string var ideList []config.Ide projectProviderMetadata := "" if allFlag { err := startAllWorkspaces() if err != nil { log.Fatal(err) } return } ctx := context.Background() apiClient, err := apiclient_util.GetApiClient(nil) if err != nil { log.Fatal(err) } if len(args) == 0 { if startProjectFlag != "" { err := cmd.Help() if err != nil { log.Fatal(err) } return } workspaceList, res, err := apiClient.WorkspaceAPI.ListWorkspaces(ctx).Execute() if err != nil { log.Fatal(apiclient_util.HandleErrorResponse(res, err)) } workspace := selection.GetWorkspaceFromPrompt(workspaceList, "Start") if workspace == nil { return } workspaceIdOrName = workspace.Name } else { workspaceIdOrName = args[0] } if codeFlag { c, err := config.GetConfig() if err != nil { log.Fatal(err) } ideList = config.GetIdeList() activeProfile, err = c.GetActiveProfile() if err != nil { log.Fatal(err) } ideId = c.DefaultIdeId wsInfo, res, err := apiClient.WorkspaceAPI.GetWorkspace(ctx, workspaceIdOrName).Execute() if err != nil { log.Fatal(apiclient_util.HandleErrorResponse(res, err)) } workspaceId = wsInfo.Id if startProjectFlag == "" { startProjectFlag = wsInfo.Projects[0].Name } if ideId != "ssh" { projectProviderMetadata, err = workspace_util.GetProjectProviderMetadata(wsInfo, wsInfo.Projects[0].Name) if err != nil { log.Fatal(err) } } } err = StartWorkspace(apiClient, workspaceIdOrName, startProjectFlag) if err != nil { log.Fatal(err) } if startProjectFlag == "" { views.RenderInfoMessage(fmt.Sprintf("Workspace '%s' started successfully", workspaceIdOrName)) } else { views.RenderInfoMessage(fmt.Sprintf("Project '%s' from workspace '%s' started successfully", startProjectFlag, workspaceIdOrName)) if codeFlag { ide_views.RenderIdeOpeningMessage(workspaceIdOrName, startProjectFlag, ideId, ideList) err = openIDE(ideId, activeProfile, workspaceId, startProjectFlag, projectProviderMetadata, yesFlag) if err != nil { log.Fatal(err) } } } }, ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { if len(args) != 0 { return nil, cobra.ShellCompDirectiveNoFileComp } 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), Run: func(cmd *cobra.Command, args []string) { var workspaceId string if allFlag { err := stopAllWorkspaces() if err != nil { log.Fatal(err) } return } ctx := context.Background() apiClient, err := apiclient_util.GetApiClient(nil) if err != nil { log.Fatal(err) } if len(args) == 0 { if stopProjectFlag != "" { err := cmd.Help() if err != nil { log.Fatal(err) } return } workspaceList, res, err := apiClient.WorkspaceAPI.ListWorkspaces(ctx).Execute() if err != nil { log.Fatal(apiclient_util.HandleErrorResponse(res, err)) } workspace := selection.GetWorkspaceFromPrompt(workspaceList, "Stop") if workspace == nil { return } workspaceId = workspace.Name } else { workspaceId = args[0] } err = StopWorkspace(apiClient, workspaceId, stopProjectFlag) if err != nil { log.Fatal(err) } 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)) } }, ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { if len(args) >= 1 { return nil, cobra.ShellCompDirectiveNoFileComp } return getAllWorkspacesByState(WORKSPACE_STATUS_RUNNING) }, }
Functions ¶
func AutoStartWorkspace ¶ added in v0.29.0
func DeleteAllWorkspaces ¶ added in v0.7.0
func RemoveWorkspace ¶ added in v0.31.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.