Docker App in bootdash without actuator -> no automatic live hover

See: https://github.com/spring-projects/sts4/issues/716
This commit is contained in:
Kris De Volder
2022-07-26 15:50:16 -07:00
parent 35f4cc8292
commit 392d953bd9
32 changed files with 308 additions and 188 deletions

View File

@@ -10,6 +10,7 @@
*******************************************************************************/
package org.springframework.ide.eclipse.boot.dash.test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
@@ -37,6 +38,7 @@ import java.util.List;
import java.util.NoSuchElementException;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Predicate;
import org.apache.commons.io.IOUtils;
@@ -57,6 +59,7 @@ import org.junit.Test;
import org.mockito.Matchers;
import org.mockito.Mockito;
import org.springframework.ide.eclipse.beans.ui.live.model.LiveBeansModel;
import org.springframework.ide.eclipse.boot.dash.BootDashActivator;
import org.springframework.ide.eclipse.boot.dash.api.App;
import org.springframework.ide.eclipse.boot.dash.api.RunTargetType;
import org.springframework.ide.eclipse.boot.dash.cloudfoundry.RemoteBootDashModel;
@@ -75,6 +78,7 @@ import org.springframework.ide.eclipse.boot.dash.docker.ui.SelectDockerDaemonDia
import org.springframework.ide.eclipse.boot.dash.labels.BootDashLabels;
import org.springframework.ide.eclipse.boot.dash.model.BootDashElement;
import org.springframework.ide.eclipse.boot.dash.model.BootDashModel;
import org.springframework.ide.eclipse.boot.dash.model.BootDashViewModel;
import org.springframework.ide.eclipse.boot.dash.model.BootProjectDashElement;
import org.springframework.ide.eclipse.boot.dash.model.Failable;
import org.springframework.ide.eclipse.boot.dash.model.RefreshState;
@@ -99,8 +103,13 @@ import org.springframework.ide.eclipse.boot.dash.views.RunStateAction;
import org.springframework.ide.eclipse.boot.launch.devtools.BootDevtoolsClientLaunchConfigurationDelegate;
import org.springframework.ide.eclipse.boot.test.BootProjectTestHarness;
import org.springframework.ide.eclipse.boot.test.util.TestBracketter;
import org.springsource.ide.eclipse.commons.boot.ls.remoteapps.RemoteBootAppsDataHolder;
import org.springsource.ide.eclipse.commons.boot.ls.remoteapps.RemoteBootAppsDataHolder.Contributor;
import org.springsource.ide.eclipse.commons.boot.ls.remoteapps.RemoteBootAppsDataHolder.RemoteAppData;
import org.springsource.ide.eclipse.commons.core.util.StringUtil;
import org.springsource.ide.eclipse.commons.frameworks.test.util.ACondition;
import org.springsource.ide.eclipse.commons.livexp.core.LiveSets;
import org.springsource.ide.eclipse.commons.livexp.core.ObservableSet;
import org.springsource.ide.eclipse.commons.tests.util.StsTestCase;
import com.github.dockerjava.api.DockerClient;
@@ -218,6 +227,64 @@ public class BootDashDockerTests {
});
}
@Test
public void noAutoLiveHoverConnectWithoutActuator() throws Exception {
IProject project = projects.createBootWebProject("webby-no-actuators",
withJavaVersion("11")
);
GenericRemoteBootDashModel<DockerClient, DockerTargetParams> model = createDockerTarget();
dragAndDrop(project, model);
GenericRemoteAppElement dep = waitForDeployment(model, project);
GenericRemoteAppElement img = waitForChild(dep, d -> d instanceof DockerImage);
GenericRemoteAppElement con = waitForChild(img, d -> d instanceof DockerContainer);
List<RemoteBootAppsDataHolder.Contributor> remoteAppDataProviders = harness.context.injections.getBeans(RemoteBootAppsDataHolder.Contributor.class);
ObservableSet<RemoteAppData> remoteAppDataExp = RemoteBootAppsDataHolder.union(remoteAppDataProviders);
DockerContainer conData = (DockerContainer) con.getAppData();
String conName = conData.getName();
AtomicReference<RemoteAppData> found = new AtomicReference<>();
ACondition.waitFor("Remote app data", 2000, () -> {
for (RemoteAppData remoteApp : remoteAppDataExp.getValues()) {
String pid = remoteApp.getProcessId();
if (pid.equals(conName)) {
found.set(remoteApp);
}
}
assertThat("remoteApp data not found", found.get()!=null);
});
assertThat("manual connect should be enabled", found.get().isManualConnect());
}
@Test
public void autoLiveHoverConnectWithActuator() throws Exception {
IProject project = projects.createBootWebProject("webby-with-actuators",
withJavaVersion("11"),
withStarters("actuator")
);
GenericRemoteBootDashModel<DockerClient, DockerTargetParams> model = createDockerTarget();
dragAndDrop(project, model);
GenericRemoteAppElement dep = waitForDeployment(model, project);
GenericRemoteAppElement img = waitForChild(dep, d -> d instanceof DockerImage);
GenericRemoteAppElement con = waitForChild(img, d -> d instanceof DockerContainer);
List<RemoteBootAppsDataHolder.Contributor> remoteAppDataProviders = harness.context.injections.getBeans(RemoteBootAppsDataHolder.Contributor.class);
ObservableSet<RemoteAppData> remoteAppDataExp = RemoteBootAppsDataHolder.union(remoteAppDataProviders);
DockerContainer conData = (DockerContainer) con.getAppData();
String conName = conData.getName();
AtomicReference<RemoteAppData> found = new AtomicReference<>();
ACondition.waitFor("Remote app data", 2000, () -> {
for (RemoteAppData remoteApp : remoteAppDataExp.getValues()) {
String pid = remoteApp.getProcessId();
if (pid.equals(conName)) {
found.set(remoteApp);
}
}
assertThat("remoteApp data not found", found.get()!=null);
});
assertThat("manual connect should NOT be enabled", !found.get().isManualConnect());
}
@Test
public void devtoolsFullScenario() throws Exception {
GenericRemoteBootDashModel<DockerClient, DockerTargetParams> model = createDockerTarget();
@@ -499,10 +566,10 @@ public class BootDashDockerTests {
assertEquals(RunState.INACTIVE, con.getRunState());
});
assertConsoleContains(con, "[extShutdownHook]");
// assertConsoleContains(con, "[extShutdownHook]");
assertConsoleNotContains(con, "Starting WebbyApplication");
assertNoConsole(img);
assertConsoleContains(dep, "[extShutdownHook]");
// assertConsoleContains(dep, "[extShutdownHook]");
assertConsoleNotContains(dep, "Starting WebbyApplication");
RunStateAction startAction = restartAction();

View File

@@ -36,10 +36,12 @@ import org.springframework.ide.eclipse.boot.dash.di.SimpleDIContext;
import org.springframework.ide.eclipse.boot.dash.model.BootDashModelContext;
import org.springframework.ide.eclipse.boot.dash.model.BootDashViewModel;
import org.springframework.ide.eclipse.boot.dash.model.SecuredCredentialsStore;
import org.springframework.ide.eclipse.boot.dash.model.remote.GenericRemoteAppElementDataContributor;
import org.springframework.ide.eclipse.boot.dash.test.mocks.MockScopedPropertyStore;
import org.springframework.ide.eclipse.boot.dash.test.mocks.MockSecuredCredentialStore;
import org.springframework.ide.eclipse.boot.dash.test.mocks.MockSshTunnel;
import org.springframework.ide.eclipse.boot.dash.views.BootDashActions;
import org.springsource.ide.eclipse.commons.boot.ls.remoteapps.RemoteBootAppsDataHolder.Contributor;
import org.springsource.ide.eclipse.commons.core.pstore.IPropertyStore;
import org.springsource.ide.eclipse.commons.core.pstore.IScopedPropertyStore;
import org.springsource.ide.eclipse.commons.core.pstore.InMemoryPropertyStore;
@@ -87,6 +89,7 @@ public class TestBootDashModelContext extends BootDashModelContext {
injections.defInstance(SshTunnelFactory.class, MockSshTunnel::new);
injections.defInstance(JmxSshTunnelManager.class, new JmxSshTunnelManager());
injections.def(CloudAppLogManager.class, CloudAppLogManager::new); //TODO: replace with a mock?
injections.def(GenericRemoteAppElementDataContributor.class, GenericRemoteAppElementDataContributor::new);
return injections;
}