Skip to content

Commit 26ba229

Browse files
committed
prevent parallel and multiple engine installation and start
1 parent a9bfeef commit 26ba229

File tree

11 files changed

+91
-67
lines changed

11 files changed

+91
-67
lines changed

ide-common/src/main/kotlin/org/digma/intellij/plugin/docker/DigmaInstallationStatus.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,13 @@ enum class DigmaInstallationType {
99
data class DigmaInstallationStatus(
1010
val connection: ConnectionStatus,
1111
val runningDigmaInstances: List<DigmaInstallationType>,
12-
)
12+
) {
13+
14+
companion object {
15+
val NOT_RUNNING = DigmaInstallationStatus(ConnectionStatus(null, false), listOf())
16+
}
17+
18+
}
1319

1420
enum class ConnectionType { local, remote }
1521

ide-common/src/main/kotlin/org/digma/intellij/plugin/docker/DockerService.kt

Lines changed: 10 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import com.intellij.openapi.project.Project
1212
import com.intellij.openapi.ui.MessageConstants
1313
import com.intellij.openapi.ui.Messages
1414
import com.intellij.openapi.util.SystemInfo
15-
import org.digma.intellij.plugin.analytics.BackendConnectionMonitor
1615
import org.digma.intellij.plugin.common.Backgroundable
1716
import org.digma.intellij.plugin.errorreporting.ErrorReporter
1817
import org.digma.intellij.plugin.log.Log
@@ -52,28 +51,14 @@ class DockerService {
5251

5352
init {
5453

55-
if (isEngineInstalled()) {
54+
if (PersistenceService.getInstance().isLocalEngineInstalled()) {
5655
//this will happen on IDE start,
5756
// DockerService is an application service so Downloader will be singleton per application
5857
downloader.downloadComposeFile()
5958
}
6059
}
6160

6261

63-
fun getActualRunningEngine(project: Project): DigmaInstallationStatus {
64-
return discoverActualRunningEngine(project)
65-
}
66-
67-
68-
fun getCurrentDigmaInstallationStatusOnConnectionLost(): DigmaInstallationStatus {
69-
return discoverActualRunningEngine(false)
70-
}
71-
72-
73-
fun getCurrentDigmaInstallationStatusOnConnectionGained(): DigmaInstallationStatus {
74-
return discoverActualRunningEngine(true)
75-
}
76-
7762

7863
fun isDockerInstalled(): Boolean {
7964
return isInstalled(DOCKER_COMMAND)
@@ -84,25 +69,6 @@ class DockerService {
8469
}
8570

8671

87-
fun isEngineInstalled(): Boolean {
88-
return PersistenceService.getInstance().isLocalEngineInstalled()
89-
}
90-
91-
92-
fun isEngineRunning(project: Project): Boolean {
93-
return isEngineInstalled() && BackendConnectionMonitor.getInstance(project).isConnectionOk()
94-
}
95-
96-
97-
private fun isDockerDaemonDownExitValue(exitValue: String): Boolean {
98-
return exitValue.contains("Cannot connect to the Docker daemon", true) ||//mac, linux
99-
exitValue.contains("docker daemon is not running", true) || //win
100-
//this is an error on windows with docker desktop that will be solved by starting docker desktop
101-
(exitValue.contains("error during connect", true) && exitValue.contains("The system cannot find the file specified", true)) || //win
102-
exitValue.contains("Error while fetching server API version", true)
103-
}
104-
105-
10672
fun collectDigmaContainerLog(): String {
10773
try {
10874

@@ -389,6 +355,15 @@ class DockerService {
389355
}
390356

391357

358+
private fun isDockerDaemonDownExitValue(exitValue: String): Boolean {
359+
return exitValue.contains("Cannot connect to the Docker daemon", true) ||//mac, linux
360+
exitValue.contains("docker daemon is not running", true) || //win
361+
//this is an error on windows with docker desktop that will be solved by starting docker desktop
362+
(exitValue.contains("error during connect", true) && exitValue.contains("The system cannot find the file specified", true)) || //win
363+
exitValue.contains("Error while fetching server API version", true)
364+
}
365+
366+
392367
private fun doRetryFlowWhenDockerDaemonIsDown(project: Project, prevExitValue: String, runCommand: Supplier<String>): String {
393368

394369
val eventName = "docker-daemon-is-down"

ide-common/src/main/kotlin/org/digma/intellij/plugin/docker/LocalInstallationFacade.kt

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ import com.intellij.openapi.components.Service
44
import com.intellij.openapi.components.service
55
import com.intellij.openapi.diagnostic.Logger
66
import com.intellij.openapi.project.Project
7+
import org.digma.intellij.plugin.analytics.BackendConnectionMonitor
78
import org.digma.intellij.plugin.log.Log
9+
import org.digma.intellij.plugin.persistence.PersistenceService
810
import java.util.concurrent.atomic.AtomicReference
911
import java.util.concurrent.locks.ReentrantLock
1012
import java.util.function.Consumer
@@ -48,7 +50,7 @@ class LocalInstallationFacade {
4850
fun installEngine(project: Project, resultTask: Consumer<String>) {
4951

5052
Log.log(logger::trace, "installEngine requested")
51-
if (DockerService.getInstance().isEngineInstalled()) {
53+
if (isLocalEngineInstalled()) {
5254
Log.log(logger::trace, "installEngine rejected because already installed")
5355
resultTask.accept("install engine rejected because local engine is installed, please remove before reinstall")
5456
return
@@ -78,7 +80,7 @@ class LocalInstallationFacade {
7880
fun startEngine(project: Project, resultTask: Consumer<String>) {
7981

8082
Log.log(logger::trace, "startEngine requested")
81-
if (DockerService.getInstance().isEngineRunning(project)) {
83+
if (isLocalEngineRunning(project)) {
8284
Log.log(logger::trace, "startEngine rejected because already running")
8385
resultTask.accept("start engine rejected because local engine is installed and running, please remove or stop before start")
8486
return
@@ -114,6 +116,7 @@ class LocalInstallationFacade {
114116
Log.log(logger::trace, "$op requested but already running, adding result consumer")
115117
myResultTask.addConsumer(resultTask)
116118
}
119+
117120
else -> {
118121
//reject
119122
Log.log(logger::trace, "$op requested but ${operationInProgress.get()} already running, rejecting $op")
@@ -129,9 +132,45 @@ class LocalInstallationFacade {
129132
}
130133

131134

135+
fun isLocalEngineInstalled(): Boolean {
136+
if (operationInProgress.get() == OP.INSTALL) {
137+
return false
138+
}
139+
return PersistenceService.getInstance().isLocalEngineInstalled()
140+
}
141+
142+
143+
fun isLocalEngineRunning(project: Project): Boolean {
144+
return isLocalEngineInstalled() && BackendConnectionMonitor.getInstance(project).isConnectionOk()
145+
}
146+
132147

148+
fun getDigmaInstallationStatus(project: Project): DigmaInstallationStatus {
133149

150+
return when (operationInProgress.get()) {
151+
null -> {
152+
discoverActualRunningEngine(project)
153+
}
154+
155+
OP.INSTALL, OP.START, OP.UPGRADE -> {
156+
DigmaInstallationStatus.NOT_RUNNING
157+
}
134158

159+
else -> {
160+
discoverActualRunningEngine(project)
161+
}
162+
}
163+
}
164+
165+
166+
fun getCurrentDigmaInstallationStatusOnConnectionLost(): DigmaInstallationStatus {
167+
return discoverActualRunningEngine(false)
168+
}
169+
170+
171+
fun getCurrentDigmaInstallationStatusOnConnectionGained(): DigmaInstallationStatus {
172+
return discoverActualRunningEngine(true)
173+
}
135174

136175

137176
private inner class MyResultTask : Consumer<String> {

ide-common/src/main/kotlin/org/digma/intellij/plugin/posthog/PluginActivityMonitor.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import com.intellij.openapi.diagnostic.Logger
1212
import com.intellij.openapi.project.Project
1313
import com.intellij.openapi.util.Disposer
1414
import org.digma.intellij.plugin.PluginId
15-
import org.digma.intellij.plugin.docker.DockerService
1615
import org.digma.intellij.plugin.docker.LocalInstallationFacade
1716
import org.digma.intellij.plugin.log.Log
1817

@@ -56,7 +55,7 @@ class PluginActivityMonitor(private val project: Project) : PluginStateListener,
5655
BrowserUtil.browse("https://digma.ai/uninstall?u=$userId", project)
5756

5857

59-
if (service<DockerService>().isEngineInstalled()) {
58+
if (service<LocalInstallationFacade>().isLocalEngineInstalled()) {
6059
Log.log(LOGGER::info, "removing digma engine on plugin uninstall")
6160
service<LocalInstallationFacade>().removeEngine(project) {
6261
Log.log(LOGGER::info, "removed digma engine on plugin uninstall completed with {}", it)

src/main/java/org/digma/intellij/plugin/dashboard/DashboardIndexTemplateBuilder.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package org.digma.intellij.plugin.dashboard;
22

3-
import com.intellij.openapi.application.*;
3+
import com.intellij.openapi.application.ApplicationNamesInfo;
44
import com.intellij.openapi.diagnostic.Logger;
55
import com.intellij.openapi.project.Project;
66
import freemarker.template.*;
7-
import org.digma.intellij.plugin.docker.DockerService;
7+
import org.digma.intellij.plugin.docker.*;
88
import org.digma.intellij.plugin.log.Log;
99
import org.digma.intellij.plugin.persistence.PersistenceService;
1010
import org.digma.intellij.plugin.settings.SettingsState;
@@ -56,8 +56,8 @@ public InputStream build(Project project, DashboardVirtualFile dashboardVirtualF
5656
var userEmail = PersistenceService.getInstance().getUserEmail();
5757
data.put(USER_EMAIL_VARIABLE, userEmail == null ? "" : userEmail);
5858
data.put(IS_OBSERVABILITY_ENABLED_VARIABLE, PersistenceService.getInstance().isObservabilityEnabled());
59-
data.put(IS_DIGMA_ENGINE_INSTALLED, DockerService.getInstance().isEngineInstalled());
60-
data.put(IS_DIGMA_ENGINE_RUNNING, DockerService.getInstance().isEngineRunning(project));
59+
data.put(IS_DIGMA_ENGINE_INSTALLED, LocalInstallationFacade.getInstance().isLocalEngineInstalled());
60+
data.put(IS_DIGMA_ENGINE_RUNNING, LocalInstallationFacade.getInstance().isLocalEngineRunning(project));
6161
data.put(IS_DOCKER_INSTALLED, DockerService.getInstance().isDockerInstalled());
6262
data.put(IS_DOCKER_COMPOSE_INSTALLED, DockerService.getInstance().isDockerComposeInstalled());
6363
data.put(DIGMA_API_URL, SettingsState.getInstance().getApiUrl());

src/main/java/org/digma/intellij/plugin/troubleshooting/TroubleshootingIndexTemplateBuilder.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package org.digma.intellij.plugin.troubleshooting;
22

3-
import com.intellij.openapi.application.*;
3+
import com.intellij.openapi.application.ApplicationNamesInfo;
44
import com.intellij.openapi.diagnostic.Logger;
55
import com.intellij.openapi.project.Project;
66
import freemarker.template.*;
7-
import org.digma.intellij.plugin.docker.DockerService;
7+
import org.digma.intellij.plugin.docker.*;
88
import org.digma.intellij.plugin.log.Log;
99
import org.digma.intellij.plugin.persistence.PersistenceService;
1010
import org.digma.intellij.plugin.ui.common.JaegerUtilKt;
@@ -52,8 +52,8 @@ public InputStream build(Project project) {
5252
var userEmail = PersistenceService.getInstance().getUserEmail();
5353
data.put(USER_EMAIL_VARIABLE, userEmail == null ? "" : userEmail);
5454
data.put(IS_OBSERVABILITY_ENABLED_VARIABLE, PersistenceService.getInstance().isObservabilityEnabled());
55-
data.put(IS_DIGMA_ENGINE_INSTALLED, DockerService.getInstance().isEngineInstalled());
56-
data.put(IS_DIGMA_ENGINE_RUNNING, DockerService.getInstance().isEngineRunning(project));
55+
data.put(IS_DIGMA_ENGINE_INSTALLED, LocalInstallationFacade.getInstance().isLocalEngineInstalled());
56+
data.put(IS_DIGMA_ENGINE_RUNNING, LocalInstallationFacade.getInstance().isLocalEngineRunning(project));
5757
data.put(IS_DOCKER_INSTALLED, DockerService.getInstance().isDockerInstalled());
5858
data.put(IS_DOCKER_COMPOSE_INSTALLED, DockerService.getInstance().isDockerComposeInstalled());
5959
data.put(IS_LOGGING_ENABLED, getIsLoggingEnabledSystemProperty());

src/main/kotlin/org/digma/intellij/plugin/ui/common/UpdateBackendAction.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import com.intellij.openapi.components.service
66
import com.intellij.openapi.project.Project
77
import com.intellij.ui.awt.RelativePoint
88
import com.intellij.util.ui.JBUI.Borders.empty
9-
import org.digma.intellij.plugin.docker.DockerService
109
import org.digma.intellij.plugin.docker.LocalInstallationFacade
1110
import org.digma.intellij.plugin.errorreporting.ErrorReporter
1211
import org.digma.intellij.plugin.model.rest.version.BackendDeploymentType
@@ -33,7 +32,7 @@ class UpdateBackendAction {
3332
}
3433

3534
BackendDeploymentType.DockerCompose -> {
36-
if (service<DockerService>().isEngineInstalled()) {
35+
if (service<LocalInstallationFacade>().isLocalEngineInstalled()) {
3736
sourceComponent?.let {
3837
val upgradePopupLabel = JLabel(
3938
asHtml(

src/main/kotlin/org/digma/intellij/plugin/ui/jcef/BaseIndexTemplateBuilder.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import org.digma.intellij.plugin.analytics.getCurrentEnvironment
1414
import org.digma.intellij.plugin.common.UniqueGeneratedUserId
1515
import org.digma.intellij.plugin.digmathon.DigmathonService
1616
import org.digma.intellij.plugin.docker.DockerService
17+
import org.digma.intellij.plugin.docker.LocalInstallationFacade
1718
import org.digma.intellij.plugin.errorreporting.ErrorReporter
1819
import org.digma.intellij.plugin.idea.frameworks.SpringBootMicrometerConfigureDepsService
1920
import org.digma.intellij.plugin.log.Log
@@ -79,8 +80,8 @@ abstract class BaseIndexTemplateBuilder(resourceFolderName: String, private val
7980
data[USER_EMAIL_VARIABLE] = PersistenceService.getInstance().getUserEmail() ?: ""
8081
data[USER_REGISTRATION_EMAIL_VARIABLE] = PersistenceService.getInstance().getUserRegistrationEmail() ?: ""
8182
data[IS_OBSERVABILITY_ENABLED_VARIABLE] = PersistenceService.getInstance().isObservabilityEnabled()
82-
data[IS_DIGMA_ENGINE_INSTALLED] = service<DockerService>().isEngineInstalled()
83-
data[IS_DIGMA_ENGINE_RUNNING] = service<DockerService>().isEngineRunning(project)
83+
data[IS_DIGMA_ENGINE_INSTALLED] = service<LocalInstallationFacade>().isLocalEngineInstalled()
84+
data[IS_DIGMA_ENGINE_RUNNING] = service<LocalInstallationFacade>().isLocalEngineRunning(project)
8485
data[IS_DOCKER_INSTALLED] = service<DockerService>().isDockerInstalled()
8586
data[IS_DOCKER_COMPOSE_INSTALLED] = service<DockerService>().isDockerComposeInstalled()
8687
data[DIGMA_API_URL] = SettingsState.getInstance().apiUrl

src/main/kotlin/org/digma/intellij/plugin/ui/jcef/JCefComponent.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import org.digma.intellij.plugin.common.newerThan
3232
import org.digma.intellij.plugin.digmathon.DigmathonActivationEvent
3333
import org.digma.intellij.plugin.digmathon.DigmathonProductKeyStateChangedEvent
3434
import org.digma.intellij.plugin.digmathon.UserFinishedDigmathonEvent
35-
import org.digma.intellij.plugin.docker.DockerService
35+
import org.digma.intellij.plugin.docker.LocalInstallationFacade
3636
import org.digma.intellij.plugin.errorreporting.ErrorReporter
3737
import org.digma.intellij.plugin.idea.frameworks.SpringBootMicrometerConfigureDepsService
3838
import org.digma.intellij.plugin.log.Log
@@ -161,7 +161,7 @@ private constructor(
161161
connectionEventAlarm.cancelAllRequests()
162162
connectionEventAlarm.addRequest({
163163
try {
164-
val status = service<DockerService>().getCurrentDigmaInstallationStatusOnConnectionLost()
164+
val status = service<LocalInstallationFacade>().getCurrentDigmaInstallationStatusOnConnectionLost()
165165
updateDigmaEngineStatus(jbCefBrowser.cefBrowser, status)
166166
} catch (e: Exception) {
167167
Log.warnWithException(logger, project, e, "error in connectionLost")
@@ -175,7 +175,7 @@ private constructor(
175175
connectionEventAlarm.cancelAllRequests()
176176
connectionEventAlarm.addRequest({
177177
try {
178-
val status = service<DockerService>().getCurrentDigmaInstallationStatusOnConnectionGained()
178+
val status = service<LocalInstallationFacade>().getCurrentDigmaInstallationStatusOnConnectionGained()
179179
updateDigmaEngineStatus(jbCefBrowser.cefBrowser, status)
180180
sendBackendAboutInfo(jbCefBrowser.cefBrowser, project)
181181
} catch (e: Exception) {

src/main/kotlin/org/digma/intellij/plugin/ui/jcef/JCefMessagesUtils.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import com.intellij.ui.jcef.JBCefBrowser
77
import org.cef.browser.CefBrowser
88
import org.digma.intellij.plugin.analytics.AnalyticsService
99
import org.digma.intellij.plugin.docker.DigmaInstallationStatus
10-
import org.digma.intellij.plugin.docker.DockerService
10+
import org.digma.intellij.plugin.docker.LocalInstallationFacade
1111
import org.digma.intellij.plugin.errorreporting.ErrorReporter
1212
import org.digma.intellij.plugin.model.rest.environment.Env
1313
import org.digma.intellij.plugin.model.rest.insights.SpanEnvironment
@@ -44,6 +44,8 @@ import org.digma.intellij.plugin.ui.jcef.model.SetStateMessage
4444
import org.digma.intellij.plugin.ui.jcef.model.SetUserEmailMessage
4545
import org.digma.intellij.plugin.ui.jcef.model.SetUserFinishedDigmathon
4646
import org.digma.intellij.plugin.ui.jcef.model.SetUserInfoMessage
47+
import org.digma.intellij.plugin.ui.jcef.model.SetViewMessage
48+
import org.digma.intellij.plugin.ui.jcef.model.SetViewMessagePayload
4749
import org.digma.intellij.plugin.ui.jcef.model.UICodeFontRequest
4850
import org.digma.intellij.plugin.ui.jcef.model.UIFontRequest
4951
import org.digma.intellij.plugin.ui.jcef.model.UIThemeRequest
@@ -53,8 +55,6 @@ import org.digma.intellij.plugin.ui.jcef.model.UiThemePayload
5355
import org.digma.intellij.plugin.ui.jcef.model.UserEmailPayload
5456
import org.digma.intellij.plugin.ui.jcef.model.UserFinishedDigmathonPayload
5557
import org.digma.intellij.plugin.ui.jcef.model.UserInfoPayload
56-
import org.digma.intellij.plugin.ui.jcef.model.SetViewMessage
57-
import org.digma.intellij.plugin.ui.jcef.model.SetViewMessagePayload
5858
import org.digma.intellij.plugin.ui.settings.Theme
5959

6060

@@ -111,7 +111,7 @@ fun sendUserFinishedDigmathon(cefBrowser: CefBrowser) {
111111

112112
fun updateDigmaEngineStatus(project: Project, cefBrowser: CefBrowser) {
113113
try {
114-
val status = service<DockerService>().getActualRunningEngine(project)
114+
val status = service<LocalInstallationFacade>().getDigmaInstallationStatus(project)
115115
updateDigmaEngineStatus(cefBrowser, status)
116116
} catch (e: Throwable) {
117117
ErrorReporter.getInstance().reportError("updateDigmaEngineStatus", e)

0 commit comments

Comments
 (0)