@@ -13,6 +13,7 @@ import com.coder.gateway.models.WorkspaceAgentStatus.STOPPED
1313import com.coder.gateway.models.WorkspaceAgentStatus.STOPPING
1414import com.coder.gateway.models.WorkspaceVersionStatus
1515import com.coder.gateway.sdk.Arch
16+ import com.coder.gateway.sdk.CoderCLIDownloader
1617import com.coder.gateway.sdk.CoderCLIManager
1718import com.coder.gateway.sdk.CoderRestClientService
1819import com.coder.gateway.sdk.OS
@@ -76,7 +77,7 @@ import javax.swing.table.TableCellRenderer
7677
7778class CoderWorkspacesStepView (val enableNextButtonCallback : (Boolean ) -> Unit ) : CoderWorkspacesWizardStep, Disposable {
7879 private val cs = CoroutineScope (Dispatchers .Main )
79- private var wizardModel = CoderWorkspacesWizardModel ()
80+ private var localWizardModel = CoderWorkspacesWizardModel ()
8081 private val coderClient: CoderRestClientService = ApplicationManager .getApplication().getService(CoderRestClientService ::class .java)
8182
8283 private var listTableModelOfWorkspaces = ListTableModel <WorkspaceAgentModel >(
@@ -135,7 +136,7 @@ class CoderWorkspacesStepView(val enableNextButtonCallback: (Boolean) -> Unit) :
135136 browserLink(CoderGatewayBundle .message(" gateway.connector.view.login.documentation.action" ), " https://coder.com/docs/coder-oss/latest/workspaces" )
136137 }.bottomGap(BottomGap .MEDIUM )
137138 row(CoderGatewayBundle .message(" gateway.connector.view.login.url.label" )) {
138- textField().resizableColumn().horizontalAlign(HorizontalAlign .FILL ).gap(RightGap .SMALL ).bindText(wizardModel ::coderURL).applyToComponent {
139+ textField().resizableColumn().horizontalAlign(HorizontalAlign .FILL ).gap(RightGap .SMALL ).bindText(localWizardModel ::coderURL).applyToComponent {
139140 addActionListener {
140141 poller?.cancel()
141142 loginAndLoadWorkspace()
@@ -255,21 +256,26 @@ class CoderWorkspacesStepView(val enableNextButtonCallback: (Boolean) -> Unit) :
255256 // force bindings to be filled
256257 component.apply ()
257258
258- BrowserUtil .browse(wizardModel .coderURL.toURL().withPath(" /login?redirect=%2Fcli-auth" ))
259+ BrowserUtil .browse(localWizardModel .coderURL.toURL().withPath(" /login?redirect=%2Fcli-auth" ))
259260 val pastedToken = askToken()
260261
261262 if (pastedToken.isNullOrBlank()) {
262263 return
263264 }
264265 try {
265- coderClient.initClientSession(wizardModel .coderURL.toURL(), pastedToken)
266+ coderClient.initClientSession(localWizardModel .coderURL.toURL(), pastedToken)
266267 } catch (e: AuthenticationResponseException ) {
267- logger.error(" Could not authenticate on ${wizardModel .coderURL} . Reason $e " )
268+ logger.error(" Could not authenticate on ${localWizardModel .coderURL} . Reason $e " )
268269 return
269270 }
270- wizardModel.apply {
271+
272+ val cliManager = CoderCLIManager (localWizardModel.coderURL.toURL(), coderClient.buildVersion)
273+
274+
275+ localWizardModel.apply {
271276 token = pastedToken
272277 buildVersion = coderClient.buildVersion
278+ localCliPath = cliManager.localCliPath.toAbsolutePath().toString()
273279 }
274280
275281 val authTask = object : Task .Modal (null , CoderGatewayBundle .message(" gateway.connector.view.coder.workspaces.cli.downloader.dialog.title" ), false ) {
@@ -281,31 +287,26 @@ class CoderWorkspacesStepView(val enableNextButtonCallback: (Boolean) -> Unit) :
281287 fraction = 0.1
282288 }
283289
284- val cliManager = CoderCLIManager (wizardModel.coderURL.toURL(), wizardModel.buildVersion)
285- val cli = cliManager.download() ? : throw IllegalStateException (" Could not download coder binary" )
290+ CoderCLIDownloader ().downloadCLI(cliManager.remoteCliPath, cliManager.localCliPath)
286291 if (getOS() != OS .WINDOWS ) {
287292 pi.fraction = 0.4
288- val chmodOutput = ProcessExecutor ().command(" chmod" , " +x" , cli.toAbsolutePath().toString() ).readOutput(true ).execute().outputUTF8()
289- logger.info(" chmod +x ${cli .toAbsolutePath()} $chmodOutput " )
293+ val chmodOutput = ProcessExecutor ().command(" chmod" , " +x" , localWizardModel.localCliPath ).readOutput(true ).execute().outputUTF8()
294+ logger.info(" chmod +x ${cliManager.localCliPath .toAbsolutePath()} $chmodOutput " )
290295 }
291296 pi.apply {
292297 text = " Configuring coder cli..."
293298 fraction = 0.5
294299 }
295300
296- val loginOutput = ProcessExecutor ().command(cli.toAbsolutePath().toString() , " login" , wizardModel .coderURL, " --token" , wizardModel .token).readOutput(true ).execute().outputUTF8()
301+ val loginOutput = ProcessExecutor ().command(localWizardModel.localCliPath , " login" , localWizardModel .coderURL, " --token" , localWizardModel .token).readOutput(true ).execute().outputUTF8()
297302 logger.info(" coder-cli login output: $loginOutput " )
298303 pi.fraction = 0.8
299- val sshConfigOutput = ProcessExecutor ().command(cli.toAbsolutePath().toString() , " config-ssh" , " --yes" , " --use-previous-options" ).readOutput(true ).execute().outputUTF8()
300- logger.info(" Result of `${cli.toAbsolutePath() } config-ssh --yes --use-previous-options`: $sshConfigOutput " )
304+ val sshConfigOutput = ProcessExecutor ().command(localWizardModel.localCliPath , " config-ssh" , " --yes" , " --use-previous-options" ).readOutput(true ).execute().outputUTF8()
305+ logger.info(" Result of `${localWizardModel.localCliPath } config-ssh --yes --use-previous-options`: $sshConfigOutput " )
301306 pi.fraction = 1.0
302307 }
303308 }
304309
305- wizardModel.apply {
306- coderURL = wizardModel.coderURL
307- token = wizardModel.token
308- }
309310 ProgressManager .getInstance().run (authTask)
310311 triggerWorkspacePolling()
311312 }
@@ -430,6 +431,29 @@ class CoderWorkspacesStepView(val enableNextButtonCallback: (Boolean) -> Unit) :
430431 }
431432
432433 override fun onNext (wizardModel : CoderWorkspacesWizardModel ): Boolean {
434+ if (localWizardModel.localCliPath.isNotBlank()) {
435+ val configSSHTask = object : Task .Modal (null , CoderGatewayBundle .message(" gateway.connector.view.coder.workspaces.cli.configssh.dialog.title" ), false ) {
436+ override fun run (pi : ProgressIndicator ) {
437+ pi.apply {
438+ text = " Configuring coder cli..."
439+ fraction = 0.1
440+ }
441+ val sshConfigOutput = ProcessExecutor ().command(localWizardModel.localCliPath, " config-ssh" , " --yes" , " --use-previous-options" ).readOutput(true ).execute().outputUTF8()
442+ pi.fraction = 0.8
443+ logger.info(" Result of `${localWizardModel.localCliPath} config-ssh --yes --use-previous-options`: $sshConfigOutput " )
444+ pi.fraction = 1.0
445+ }
446+ }
447+ ProgressManager .getInstance().run (configSSHTask)
448+ }
449+
450+ wizardModel.apply {
451+ coderURL = localWizardModel.coderURL
452+ token = localWizardModel.token
453+ buildVersion = localWizardModel.buildVersion
454+ localCliPath = localWizardModel.localCliPath
455+ }
456+
433457 val workspace = tableOfWorkspaces.selectedObject
434458 if (workspace != null ) {
435459 wizardModel.selectedWorkspace = workspace
0 commit comments