Documentation ¶
Index ¶
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"}, 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).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(args[0]) if err != nil { 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 } if len(args) == 2 { projectName = args[1] } if ideFlag != "" { ideId = ideFlag } views.RenderInfoMessage(fmt.Sprintf("Opening the project '%s' from workspace '%s' in your preferred IDE.", projectName, *workspace.Name)) err = openIDE(ideId, activeProfile, workspaceId, projectName) 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 CreateCmd = &cobra.Command{ Use: "create [REPOSITORY_URL]", Short: "Create a workspace", Args: cobra.RangeArgs(0, 1), Run: func(cmd *cobra.Command, args []string) { ctx := context.Background() var projects []apiclient.CreateWorkspaceRequestProject var workspaceName string var existingWorkspaceNames []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(apiClient, &workspaceName, &projects, existingWorkspaceNames, ctx) if err != nil { log.Fatal(err) } } else { err = processCmdArguments(args, apiClient, &projects, ctx) if err != nil { log.Fatal(err) } if workspaceName == "" { workspaceName = workspace_util.GetSuggestedWorkspaceName(projects[0].Name, existingWorkspaceNames) } } if workspaceName == "" || len(projects) == 0 { log.Fatal("workspace name and repository urls are required") return } visited := make(map[string]bool) for i := range projects { if projects[i].Source == nil || projects[i].Source.Repository == nil || projects[i].Source.Repository.Url == nil { log.Fatal("Error: repository url is required") } if visited[*projects[i].Source.Repository.Url] { log.Fatalf("Error: duplicate repository url: %s", *projects[i].Source.Repository.Url) } visited[*projects[i].Source.Repository.Url] = true projects[i].EnvVars = getEnvVariables(&projects[i], profileData) } target, err := getTarget(activeProfile.Name) if err != nil { log.Fatal(err) } activeProfile, err = c.GetActiveProfile() if err != nil { log.Fatal(err) } tsConn, err := tailscale.GetConnection(&activeProfile) if err != nil { log.Fatal(err) } stopLogs := false id := stringid.GenerateRandomID() id = stringid.TruncateID(id) go readWorkspaceLogs(activeProfile, id, projects, &stopLogs) createdWorkspace, res, err := apiClient.WorkspaceAPI.CreateWorkspace(ctx).Workspace(apiclient.CreateWorkspaceRequest{ Id: &id, Name: &workspaceName, Target: target.Name, Projects: projects, }).Execute() if err != nil { log.Fatal(apiclient_util.HandleErrorResponse(res, err)) } dialStartTime := time.Now() dialTimeout := 3 * time.Minute err = waitForDial(tsConn, *createdWorkspace.Id, *createdWorkspace.Projects[0].Name, dialStartTime, dialTimeout) if err != nil { log.Fatal(err) } stopLogs = true wsInfo, res, err := apiClient.WorkspaceAPI.GetWorkspace(ctx, workspaceName).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("Opening the workspace in your preferred editor ...") err = openIDE(chosenIdeId, activeProfile, *createdWorkspace.Id, *wsInfo.Projects[0].Name) if err != nil { log.Fatal(err) } }, }
View Source
var DeleteCmd = &cobra.Command{ Use: "delete [WORKSPACE]", Short: "Delete a workspace", Aliases: []string{"remove", "rm"}, Run: func(cmd *cobra.Command, args []string) { if allFlag { if yesFlag { fmt.Println("Deleting all workspaces.") err := DeleteAllWorkspaces() 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() if err != nil { log.Fatal(err) } } else { fmt.Println("Operation canceled.") } } return } ctx := context.Background() var workspace *apiclient.WorkspaceDTO 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)) } workspace = selection.GetWorkspaceFromPrompt(workspaceList, "Delete") } else { workspace, err = apiclient_util.GetWorkspace(args[0]) if err != nil { log.Fatal(err) } } if workspace == nil { return } if !yesFlag { form := huh.NewForm( huh.NewGroup( huh.NewConfirm(). Title(fmt.Sprintf("Delete workspace %s?", *workspace.Name)). Description(fmt.Sprintf("Are you sure you want to delete workspace %s?", *workspace.Name)). Value(&yesFlag), ), ).WithTheme(views.GetCustomTheme()) err := form.Run() if err != nil { log.Fatal(err) } } if yesFlag { err := removeWorkspace(ctx, apiClient, workspace) if err != nil { log.Fatal(err) } } else { fmt.Println("Operation canceled.") } }, 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"}, Args: cobra.RangeArgs(0, 1), 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)) } workspace = selection.GetWorkspaceFromPrompt(workspaceList, "View") } else { workspace, err = apiclient_util.GetWorkspace(args[0]) if err != nil { log.Fatal(err) } } if workspace == nil { return } if output.FormatFlag != "" { output.Output = workspace 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"}, 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 output.FormatFlag != "" { output.Output = workspaceList return } if len(workspaceList) == 0 { views.RenderInfoMessage("The workspace list is empty. Start off by running 'daytona create'.") return } list_view.ListWorkspaces(workspaceList, specifyGitProviders, verbose) }, }
View Source
var SshCmd = &cobra.Command{ Use: "ssh [WORKSPACE] [PROJECT]", Short: "SSH into a project using the terminal", Args: cobra.RangeArgs(0, 2), 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 workspaceId string var projectName string apiClient, err := apiclient.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.HandleErrorResponse(res, err)) } workspace := selection.GetWorkspaceFromPrompt(workspaceList, "SSH Into") if workspace == nil { return } workspaceId = *workspace.Id } else { workspace, err := apiclient.GetWorkspace(args[0]) if err != nil { 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 } if len(args) == 2 { projectName = args[1] } err = ide.OpenTerminalSsh(activeProfile, workspaceId, projectName) 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) } } 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", workspace.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), Run: func(cmd *cobra.Command, args []string) { var workspaceId string var message string if allFlag { err := startAllWorkspaces() if err != nil { log.Fatal(err) } return } ctx := context.Background() apiClient, err := apiclient.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.HandleErrorResponse(res, err)) } workspace := selection.GetWorkspaceFromPrompt(workspaceList, "Start") if workspace == nil { return } workspaceId = *workspace.Name } else { workspaceId = args[0] } if startProjectFlag == "" { message = fmt.Sprintf("Workspace '%s' is starting", workspaceId) res, err := apiClient.WorkspaceAPI.StartWorkspace(ctx, workspaceId).Execute() if err != nil { log.Fatal(apiclient.HandleErrorResponse(res, err)) } } else { message = fmt.Sprintf("Project '%s' from workspace '%s' is starting", startProjectFlag, workspaceId) res, err := apiClient.WorkspaceAPI.StartProject(ctx, workspaceId, startProjectFlag).Execute() if err != nil { log.Fatal(apiclient.HandleErrorResponse(res, err)) } } views.RenderInfoMessage(message) }, 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", Args: cobra.RangeArgs(0, 1), Run: func(cmd *cobra.Command, args []string) { var workspaceId string var message string if allFlag { err := stopAllWorkspaces() if err != nil { log.Fatal(err) } return } ctx := context.Background() apiClient, err := apiclient.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.HandleErrorResponse(res, err)) } workspace := selection.GetWorkspaceFromPrompt(workspaceList, "Stop") if workspace == nil { return } workspaceId = *workspace.Name } else { workspaceId = args[0] } if stopProjectFlag == "" { message = fmt.Sprintf("Workspace '%s' is stopping", workspaceId) res, err := apiClient.WorkspaceAPI.StopWorkspace(ctx, workspaceId).Execute() if err != nil { log.Fatal(apiclient.HandleErrorResponse(res, err)) } } else { message = fmt.Sprintf("Project '%s' from workspace '%s' is stopping", stopProjectFlag, workspaceId) res, err := apiClient.WorkspaceAPI.StopProject(ctx, workspaceId, stopProjectFlag).Execute() if err != nil { log.Fatal(apiclient.HandleErrorResponse(res, err)) } } views.RenderInfoMessage(message) }, 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 DeleteAllWorkspaces ¶ added in v0.7.0
func DeleteAllWorkspaces() error
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.