Skip to content

Commit a6c2eb6

Browse files
committed
chore: simplify uri handling implementation (3)
Refactored code around cli initialization.
1 parent bb4b643 commit a6c2eb6

File tree

1 file changed

+101
-78
lines changed

1 file changed

+101
-78
lines changed

src/main/kotlin/com/coder/toolbox/util/CoderProtocolHandler.kt

Lines changed: 101 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -65,95 +65,22 @@ open class CoderProtocolHandler(
6565
if (!prepareWorkspace(workspace, restClient, workspaceName, deploymentURL)) return
6666
if (!ensureAgentIsReady(workspace, agent)) return
6767

68-
val cli = ensureCLI(
69-
context,
70-
deploymentURL.toURL(),
71-
restClient.buildInfo().version
72-
)
73-
74-
// We only need to log in if we are using token-based auth.
75-
if (restClient.token != null) {
76-
context.logger.info("Authenticating Coder CLI...")
77-
cli.login(restClient.token)
78-
}
79-
80-
context.logger.info("Configuring Coder CLI...")
81-
cli.configSsh(restClient.workspacesByAgents())
68+
val cli = configureCli(deploymentURL, restClient)
8269

8370
if (shouldWaitForAutoLogin) {
8471
isInitialized.waitForTrue()
8572
}
8673
reInitialize(restClient, cli)
8774

8875
val environmentId = "${workspace.name}.${agent.name}"
89-
context.popupPluginMainPage()
90-
context.envPageManager.showEnvironmentPage(environmentId, false)
76+
context.showEnvironmentPage(environmentId)
77+
9178
val productCode = params.ideProductCode()
9279
val buildNumber = params.ideBuildNumber()
9380
val projectFolder = params.projectFolder()
94-
if (!productCode.isNullOrBlank() && !buildNumber.isNullOrBlank()) {
95-
var selectedIde = "$productCode-$buildNumber"
96-
context.cs.launch {
97-
val installedIdes = context.remoteIdeOrchestrator.getInstalledRemoteTools(environmentId, productCode)
98-
val alreadyInstalled = installedIdes.firstOrNull { it.contains(buildNumber) } != null
99-
if (alreadyInstalled) {
100-
context.logger.info("$productCode-$buildNumber is already on $environmentId. Going to launch JBClient")
101-
} else {
102-
val availableVersions =
103-
context.remoteIdeOrchestrator.getAvailableRemoteTools(environmentId, productCode)
104-
if (availableVersions.isEmpty()) {
105-
val error = IllegalArgumentException("$productCode is not available on $environmentId")
106-
context.logger.error(error, "Error encountered while handling Coder URI")
107-
context.ui.showSnackbar(
108-
UUID.randomUUID().toString(),
109-
context.i18n.ptrl("Error encountered while handling Coder URI"),
110-
context.i18n.pnotr("$productCode is not available on $environmentId"),
111-
context.i18n.ptrl("OK")
112-
)
113-
return@launch
114-
}
115-
116-
val matchingBuildNumber = availableVersions.firstOrNull { it.contains(buildNumber) } != null
117-
if (!matchingBuildNumber) {
118-
selectedIde = availableVersions.maxOf { it }
119-
val msg =
120-
"$productCode-$buildNumber is not available, we've selected the latest $selectedIde"
121-
context.logger.info(msg)
122-
context.ui.showSnackbar(
123-
UUID.randomUUID().toString(),
124-
context.i18n.pnotr("$productCode-$buildNumber not available"),
125-
context.i18n.pnotr(msg),
126-
context.i18n.ptrl("OK")
127-
)
128-
}
12981

130-
// needed otherwise TBX will install it again
131-
if (!installedIdes.contains(selectedIde)) {
132-
context.logger.info("Installing $selectedIde on $environmentId...")
133-
context.remoteIdeOrchestrator.installRemoteTool(environmentId, selectedIde)
134-
if (context.remoteIdeOrchestrator.waitForIdeToBeInstalled(environmentId, selectedIde)) {
135-
context.logger.info("Successfully installed $selectedIde on $environmentId...")
136-
} else {
137-
context.ui.showSnackbar(
138-
UUID.randomUUID().toString(),
139-
context.i18n.pnotr("$selectedIde could not be installed"),
140-
context.i18n.pnotr("$selectedIde could not be installed on time. Check the logs for more details"),
141-
context.i18n.ptrl("OK")
142-
)
143-
}
144-
} else {
145-
context.logger.info("$selectedIde is already present on $environmentId...")
146-
}
147-
}
148-
149-
val job = context.cs.launch {
150-
context.logger.info("Downloading and installing JBClient counterpart to $selectedIde locally")
151-
context.jbClientOrchestrator.prepareClient(environmentId, selectedIde)
152-
}
153-
job.join()
154-
context.logger.info("Launching $selectedIde on $environmentId")
155-
context.jbClientOrchestrator.connectToIde(environmentId, selectedIde, projectFolder)
156-
}
82+
if (!productCode.isNullOrBlank() && !buildNumber.isNullOrBlank()) {
83+
launchIde(productCode, buildNumber, environmentId, projectFolder)
15784
}
15885
}
15986

@@ -354,6 +281,97 @@ open class CoderProtocolHandler(
354281
return true
355282
}
356283

284+
private suspend fun configureCli(
285+
deploymentURL: String,
286+
restClient: CoderRestClient
287+
): CoderCLIManager {
288+
val cli = ensureCLI(
289+
context,
290+
deploymentURL.toURL(),
291+
restClient.buildInfo().version
292+
)
293+
294+
// We only need to log in if we are using token-based auth.
295+
if (restClient.token != null) {
296+
context.logger.info("Authenticating Coder CLI...")
297+
cli.login(restClient.token)
298+
}
299+
300+
context.logger.info("Configuring Coder CLI...")
301+
cli.configSsh(restClient.workspacesByAgents())
302+
return cli
303+
}
304+
305+
private fun launchIde(
306+
productCode: String,
307+
buildNumber: String,
308+
environmentId: String,
309+
projectFolder: String?
310+
) {
311+
var selectedIde = "$productCode-$buildNumber"
312+
context.cs.launch {
313+
val installedIdes = context.remoteIdeOrchestrator.getInstalledRemoteTools(environmentId, productCode)
314+
val alreadyInstalled = installedIdes.firstOrNull { it.contains(buildNumber) } != null
315+
if (alreadyInstalled) {
316+
context.logger.info("$productCode-$buildNumber is already on $environmentId. Going to launch JBClient")
317+
} else {
318+
val availableVersions =
319+
context.remoteIdeOrchestrator.getAvailableRemoteTools(environmentId, productCode)
320+
if (availableVersions.isEmpty()) {
321+
val error = IllegalArgumentException("$productCode is not available on $environmentId")
322+
context.logger.error(error, "Error encountered while handling Coder URI")
323+
context.ui.showSnackbar(
324+
UUID.randomUUID().toString(),
325+
context.i18n.ptrl("Error encountered while handling Coder URI"),
326+
context.i18n.pnotr("$productCode is not available on $environmentId"),
327+
context.i18n.ptrl("OK")
328+
)
329+
return@launch
330+
}
331+
332+
val matchingBuildNumber = availableVersions.firstOrNull { it.contains(buildNumber) } != null
333+
if (!matchingBuildNumber) {
334+
selectedIde = availableVersions.maxOf { it }
335+
val msg =
336+
"$productCode-$buildNumber is not available, we've selected the latest $selectedIde"
337+
context.logger.info(msg)
338+
context.ui.showSnackbar(
339+
UUID.randomUUID().toString(),
340+
context.i18n.pnotr("$productCode-$buildNumber not available"),
341+
context.i18n.pnotr(msg),
342+
context.i18n.ptrl("OK")
343+
)
344+
}
345+
346+
// needed otherwise TBX will install it again
347+
if (!installedIdes.contains(selectedIde)) {
348+
context.logger.info("Installing $selectedIde on $environmentId...")
349+
context.remoteIdeOrchestrator.installRemoteTool(environmentId, selectedIde)
350+
if (context.remoteIdeOrchestrator.waitForIdeToBeInstalled(environmentId, selectedIde)) {
351+
context.logger.info("Successfully installed $selectedIde on $environmentId...")
352+
} else {
353+
context.ui.showSnackbar(
354+
UUID.randomUUID().toString(),
355+
context.i18n.pnotr("$selectedIde could not be installed"),
356+
context.i18n.pnotr("$selectedIde could not be installed on time. Check the logs for more details"),
357+
context.i18n.ptrl("OK")
358+
)
359+
}
360+
} else {
361+
context.logger.info("$selectedIde is already present on $environmentId...")
362+
}
363+
}
364+
365+
val job = context.cs.launch {
366+
context.logger.info("Downloading and installing JBClient counterpart to $selectedIde locally")
367+
context.jbClientOrchestrator.prepareClient(environmentId, selectedIde)
368+
}
369+
job.join()
370+
context.logger.info("Launching $selectedIde on $environmentId")
371+
context.jbClientOrchestrator.connectToIde(environmentId, selectedIde, projectFolder)
372+
}
373+
}
374+
357375
private suspend fun CoderRestClient.waitForReady(workspace: Workspace): Boolean {
358376
var status = workspace.latestBuild.status
359377
try {
@@ -440,4 +458,9 @@ private fun CoderToolboxContext.popupPluginMainPage() {
440458
this.envPageManager.showPluginEnvironmentsPage(true)
441459
}
442460

461+
private suspend fun CoderToolboxContext.showEnvironmentPage(envId: String) {
462+
this.ui.showWindow()
463+
this.envPageManager.showEnvironmentPage(envId, false)
464+
}
465+
443466
class MissingArgumentException(message: String, ex: Throwable? = null) : IllegalArgumentException(message, ex)

0 commit comments

Comments
 (0)