2
2
3
3
import static io .quarkus .deployment .annotations .ExecutionTime .STATIC_INIT ;
4
4
5
- import java .util . HashMap ;
5
+ import java .io . IOException ;
6
6
import java .util .Map ;
7
7
import java .util .Optional ;
8
- import java .util .function .Supplier ;
9
8
10
9
import org .jboss .logging .Logger ;
11
10
18
17
import io .quarkus .deployment .annotations .BuildStep ;
19
18
import io .quarkus .deployment .annotations .Produce ;
20
19
import io .quarkus .deployment .annotations .Record ;
21
- import io .quarkus .deployment .builditem .CuratedApplicationShutdownBuildItem ;
22
20
import io .quarkus .deployment .builditem .DevServicesResultBuildItem ;
23
21
import io .quarkus .deployment .builditem .LaunchModeBuildItem ;
24
22
import io .quarkus .deployment .builditem .ServiceStartBuildItem ;
23
+ import io .quarkus .deployment .builditem .Startable ;
25
24
import io .quarkus .runtime .LaunchMode ;
26
25
27
26
public class DevServicesLambdaProcessor {
28
27
private static final Logger log = Logger .getLogger (DevServicesLambdaProcessor .class );
29
28
30
- static MockEventServer server ;
31
- static LaunchMode startMode ;
32
-
33
29
@ BuildStep (onlyIfNot = IsNormal .class )
34
30
@ Record (STATIC_INIT )
35
31
public void enableHotReplacementChecker (LaunchModeBuildItem launchMode ,
@@ -53,61 +49,81 @@ private boolean legacyTestingEnabled() {
53
49
54
50
@ Produce (ServiceStartBuildItem .class )
55
51
@ BuildStep (onlyIfNot = IsNormal .class ) // This is required for testing so run it even if devservices.enabled=false
56
- public void startEventServer (LaunchModeBuildItem launchMode ,
52
+ public void startEventServer (LaunchModeBuildItem launchModeBuildItem ,
57
53
LambdaConfig config ,
58
54
Optional <EventServerOverrideBuildItem > override ,
59
- BuildProducer <DevServicesResultBuildItem > devServicePropertiesProducer ,
60
- CuratedApplicationShutdownBuildItem closeBuildItem )
61
- throws Exception {
62
- if (!launchMode .getLaunchMode ().isDevOrTest ())
55
+ BuildProducer <DevServicesResultBuildItem > devServicePropertiesProducer ) {
56
+ LaunchMode launchMode = launchModeBuildItem .getLaunchMode ();
57
+ if (!launchMode .isDevOrTest ())
63
58
return ;
64
59
if (legacyTestingEnabled ())
65
60
return ;
66
61
if (!config .mockEventServer ().enabled ()) {
67
62
return ;
68
63
}
69
- if (server != null ) {
70
- return ;
71
- }
72
- Supplier <MockEventServer > supplier = null ;
64
+
65
+ MockEventServer server ;
73
66
if (override .isPresent ()) {
74
- supplier = override .get ().getServer ();
67
+ server = override .get ().getServer (). get ();
75
68
} else {
76
- supplier = () -> new MockEventServer ();
69
+ server = new MockEventServer ();
77
70
}
78
71
79
- server = supplier .get ();
80
- int port = launchMode .getLaunchMode () == LaunchMode .TEST ? config .mockEventServer ().testPort ()
72
+ int configuredPort = launchMode == LaunchMode .TEST ? config .mockEventServer ().testPort ()
81
73
: config .mockEventServer ().devPort ();
82
- startMode = launchMode .getLaunchMode ();
83
- server .start (port );
84
- int actualPort = server .getPort ();
85
- String baseUrl = "localhost:" + actualPort + MockEventServer .BASE_PATH ;
86
- Map <String , String > properties = new HashMap <>();
87
- properties .put (AmazonLambdaApi .QUARKUS_INTERNAL_AWS_LAMBDA_TEST_API , baseUrl );
88
-
89
- if (actualPort != port ) {
90
- String portPropertyValue = String .valueOf (actualPort );
91
- String portPropertySuffix = launchMode .getLaunchMode () == LaunchMode .TEST ? "test-port" : "dev-port" ;
92
- String propName = "quarkus.lambda.mock-event-server." + portPropertySuffix ;
93
- System .setProperty (propName , portPropertyValue );
74
+ String portPropertySuffix = launchMode == LaunchMode .TEST ? "test-port" : "dev-port" ;
75
+ String propName = "quarkus.lambda.mock-event-server." + portPropertySuffix ;
76
+
77
+ // No compose support, and no using of external services, so no need to discover existing services
78
+
79
+ DevServicesResultBuildItem buildItem = DevServicesResultBuildItem .owned ().feature (Feature .AMAZON_LAMBDA )
80
+ .serviceName (Feature .AMAZON_LAMBDA .getName ())
81
+ .serviceConfig (config )
82
+ .startable (() -> new StartableEventServer (
83
+ server , configuredPort ))
84
+ .configProvider (
85
+ Map .of (propName , s -> String .valueOf (s .getExposedPort ()),
86
+ AmazonLambdaApi .QUARKUS_INTERNAL_AWS_LAMBDA_TEST_API ,
87
+ StartableEventServer ::getConnectionInfo ))
88
+ .build ();
89
+
90
+ devServicePropertiesProducer .produce (buildItem );
91
+
92
+ }
93
+
94
+ private static class StartableEventServer implements Startable {
95
+
96
+ private final MockEventServer server ;
97
+ private final int configuredPort ;
98
+
99
+ public StartableEventServer (MockEventServer server , int configuredPort ) {
100
+ this .server = server ;
101
+ this .configuredPort = configuredPort ;
94
102
}
95
103
96
- devServicePropertiesProducer .produce (
97
- new DevServicesResultBuildItem (Feature .AMAZON_LAMBDA .getName (), null , properties ));
98
- Runnable closeTask = () -> {
99
- if (server != null ) {
100
- try {
101
- server .close ();
102
- } catch (Throwable e ) {
103
- log .error ("Failed to stop the Lambda Mock Event Server" , e );
104
- } finally {
105
- server = null ;
106
- }
107
- }
108
- startMode = null ;
109
- server = null ;
110
- };
111
- closeBuildItem .addCloseTask (closeTask , true );
104
+ @ Override
105
+ public void start () {
106
+ server .start (configuredPort );
107
+ log .debugf ("Starting event server on port %d" , configuredPort );
108
+ }
109
+
110
+ public int getExposedPort () {
111
+ return server .getPort ();
112
+ }
113
+
114
+ @ Override
115
+ public String getConnectionInfo () {
116
+ return "localhost:" + getExposedPort () + MockEventServer .BASE_PATH ;
117
+ }
118
+
119
+ @ Override
120
+ public String getContainerId () {
121
+ return null ;
122
+ }
123
+
124
+ @ Override
125
+ public void close () throws IOException {
126
+ server .close ();
127
+ }
112
128
}
113
129
}
0 commit comments