@@ -13,6 +13,7 @@ import com.coder.gateway.models.WorkspaceAgentStatus.STOPPED
13
13
import com.coder.gateway.models.WorkspaceAgentStatus.STOPPING
14
14
import com.coder.gateway.models.WorkspaceVersionStatus
15
15
import com.coder.gateway.sdk.Arch
16
+ import com.coder.gateway.sdk.CoderCLIDownloader
16
17
import com.coder.gateway.sdk.CoderCLIManager
17
18
import com.coder.gateway.sdk.CoderRestClientService
18
19
import com.coder.gateway.sdk.OS
@@ -76,7 +77,7 @@ import javax.swing.table.TableCellRenderer
76
77
77
78
class CoderWorkspacesStepView (val enableNextButtonCallback : (Boolean ) -> Unit ) : CoderWorkspacesWizardStep, Disposable {
78
79
private val cs = CoroutineScope (Dispatchers .Main )
79
- private var wizardModel = CoderWorkspacesWizardModel ()
80
+ private var localWizardModel = CoderWorkspacesWizardModel ()
80
81
private val coderClient: CoderRestClientService = ApplicationManager .getApplication().getService(CoderRestClientService ::class .java)
81
82
82
83
private var listTableModelOfWorkspaces = ListTableModel <WorkspaceAgentModel >(
@@ -135,7 +136,7 @@ class CoderWorkspacesStepView(val enableNextButtonCallback: (Boolean) -> Unit) :
135
136
browserLink(CoderGatewayBundle .message(" gateway.connector.view.login.documentation.action" ), " https://coder.com/docs/coder-oss/latest/workspaces" )
136
137
}.bottomGap(BottomGap .MEDIUM )
137
138
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 {
139
140
addActionListener {
140
141
poller?.cancel()
141
142
loginAndLoadWorkspace()
@@ -255,21 +256,26 @@ class CoderWorkspacesStepView(val enableNextButtonCallback: (Boolean) -> Unit) :
255
256
// force bindings to be filled
256
257
component.apply ()
257
258
258
- BrowserUtil .browse(wizardModel .coderURL.toURL().withPath(" /login?redirect=%2Fcli-auth" ))
259
+ BrowserUtil .browse(localWizardModel .coderURL.toURL().withPath(" /login?redirect=%2Fcli-auth" ))
259
260
val pastedToken = askToken()
260
261
261
262
if (pastedToken.isNullOrBlank()) {
262
263
return
263
264
}
264
265
try {
265
- coderClient.initClientSession(wizardModel .coderURL.toURL(), pastedToken)
266
+ coderClient.initClientSession(localWizardModel .coderURL.toURL(), pastedToken)
266
267
} 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 " )
268
269
return
269
270
}
270
- wizardModel.apply {
271
+
272
+ val cliManager = CoderCLIManager (localWizardModel.coderURL.toURL(), coderClient.buildVersion)
273
+
274
+
275
+ localWizardModel.apply {
271
276
token = pastedToken
272
277
buildVersion = coderClient.buildVersion
278
+ localCliPath = cliManager.localCliPath.toAbsolutePath().toString()
273
279
}
274
280
275
281
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) :
281
287
fraction = 0.1
282
288
}
283
289
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)
286
291
if (getOS() != OS .WINDOWS ) {
287
292
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 " )
290
295
}
291
296
pi.apply {
292
297
text = " Configuring coder cli..."
293
298
fraction = 0.5
294
299
}
295
300
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()
297
302
logger.info(" coder-cli login output: $loginOutput " )
298
303
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 " )
301
306
pi.fraction = 1.0
302
307
}
303
308
}
304
309
305
- wizardModel.apply {
306
- coderURL = wizardModel.coderURL
307
- token = wizardModel.token
308
- }
309
310
ProgressManager .getInstance().run (authTask)
310
311
triggerWorkspacePolling()
311
312
}
@@ -430,6 +431,29 @@ class CoderWorkspacesStepView(val enableNextButtonCallback: (Boolean) -> Unit) :
430
431
}
431
432
432
433
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
+
433
457
val workspace = tableOfWorkspaces.selectedObject
434
458
if (workspace != null ) {
435
459
wizardModel.selectedWorkspace = workspace
0 commit comments