Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for Vert.x Web sessions #36310

Draft
wants to merge 4 commits into
base: main
Choose a base branch
from

Conversation

Ladicek
Copy link
Contributor

@Ladicek Ladicek commented Oct 5, 2023

The individual commits are:

  • Infinispan Client: improve dev services logging
  • Infinispan Client: add runtime SPI and deployment SPI modules
  • Redis Client: add runtime SPI and deployment SPI modules
  • Add support for Vert.x Web sessions

The last commit being the biggest obviously. Tagging @karesti for review of the 1st and 2nd commit, and @cescoffier for review of the 3rd commit.

@Ladicek Ladicek marked this pull request as draft October 5, 2023 13:58
@quarkus-bot quarkus-bot bot added area/dependencies Pull requests that update a dependency file area/infinispan Infinispan area/redis area/vertx labels Oct 5, 2023
@sberyozkin
Copy link
Member

sberyozkin commented Oct 5, 2023

@Ladicek Is it related to https://vertx.io/docs/vertx-web/java/#_handling_sessions ?

@michalvavrik completed the PR providing support for OIDC session data (tokens) stored in DB - the concept is the same.
Where does Vert.x session handler save the data ? We may as well optionally support it as an implementation of OIDC TokenStateManager if Vert.x Web session can be activated with some single or a very few properties.

OK, the local store would be of no use but https://vertx.io/docs/vertx-web/java/#_clustered_session_store and https://vertx.io/docs/vertx-web/java/#_infinispan_web_session_store may be of interest, @michalvavrik, lets discuss it a bit later - since it is part of Vert.x we won't even have to do another extension but may be can activate it with properties (sorry Ladislav if it is not related at all to your PR)

@Ladicek
Copy link
Contributor Author

Ladicek commented Oct 6, 2023

Hi @sberyozkin, I've been meaning to reply to your email about stateful OIDC token management after I get this PR up, but you beat me to it :-) For one, sessions are just fine, and two, I also thought you could just use sessions. We can discuss in that thread.

But yes, this is indeed about adding https://vertx.io/docs/vertx-web/java/#_handling_sessions to Quarkus. I aim to support all the "reasonable" session stores that Vert.x supports -- in-memory (local), clustered, Redis, Infinispan. I don't want to support cookieless sessions, and I don't want to support the cookie session store. It seems to work rather nicely, but I've only done some basic manual tests so far.

Also, I'd love to know your (@sberyozkin @michalvavrik) opinion on the default value of the SameSite attribute of the session cookie. In Vert.x, the attribute is not present by default and you have to configure it explicitly. I'm following that approach for now, but I thought maybe we could use a more reasonable default (Lax or Strict). WDYT?

@michalvavrik
Copy link
Member

michalvavrik commented Oct 6, 2023

I don't want to pollute your fantastic PR with OIDC token state stuff, but I'm all in. Let's discuss it in Quarkus DEV group when you find time. I'll wait. Using sessions, especially with Redis / Infinispan makes total sense. Thanks!

Also, I'd love to know your (@sberyozkin @michalvavrik) opinion on the default value of the SameSite attribute of the session cookie. In Vert.x, the attribute is not present by default and you have to configure it explicitly.

I thought when samesite cookie is not present, browsers mostly treat is as lax. Definitely +1 to explicitly specify it.

I'm following that approach for now, but I thought maybe we could use a more reasonable default (Lax or Strict). WDYT?

TBH I don't know what is reasonable default. FYI OIDC extension set lax for so called session cookie.

Copy link
Member

@cescoffier cescoffier left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks great! I made a few comments. Nothing critical.

.setCookieSameSite(sessions.cookieSameSite.orElse(null))
.setCookieMaxAge(sessions.cookieMaxAge.map(Duration::toMillis).orElse(-1L));
// TODO verify if this is the correct router to which the session handler should be installed
httpRouteRouter.route(path).handler(sessionHandler);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would say yes. That's the main "public" router. The question, however, is the order of the route.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, good point. I need to explore more around this, that's why I added these TODOs.

@@ -186,6 +191,17 @@ public KubernetesPortBuildItem kubernetesForManagement(
managementInterfaceBuildTimeConfig.enabled);
}

@BuildStep
public void sessionStoreRequest(HttpBuildTimeConfig config, BuildProducer<SessionStoreRequestBuildItem> request) {
if (config.sessions.mode == SessionsBuildTimeConfig.SessionsMode.REDIS) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if we should check the available capabilities here; i.e. consume the io.quarkus.deployment.Capabilities and then capabilites.isPresent(Capability.REDIS_CLIENT)...

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I originally had that, but the request/response protocol here (which I don't really like, but I don't have a better way at the moment) subsumes that. If the Redis extension isn't present, it won't reply, and we'll get an error.

@geoand
Copy link
Contributor

geoand commented Oct 9, 2023

@Ladicek sorry, haven't had time to review yet, but I would like to ask about your first question (regarding brining in the deps). Have you had that answered yet?
If not, I have a suggestion for you.

@sberyozkin
Copy link
Member

sberyozkin commented Oct 9, 2023

@Ladicek Hey, given that your PR is relevant to what OIDC code flow does, I'll briefly reply to some comments

For one, sessions are just fine, and two, I also thought you could just use sessions. We can discuss in that thread.

Default OIDC session management with encrypted cookies is simplest and most effective and it is recommended, but as I mentioned, what Michal did with providing an alternative option for users to get the session state saved in DB is conceptually exactly identical to what Vert.x Web Sessions offer - the actionable state is saved on the server, the cookie keeps some link to it only.

I aim to support all the "reasonable" session stores that Vert.x supports -- in-memory (local), clustered, Redis, Infinispan.

For OIDC, in-memory strategy would not be useful. OIDC session cookie outlasting the in-memory data due to the pod restart/scaling will point to nothing; may be for testing only.

As far as the clustered, Redis, Infinispan options are concerned, it is fine, for those OIDC users who don't trust even encrypted cookies and don't work with DBs and thus can't select the option done by Michal where tokens are saved in DB, one of these advanced Vertx Web Session options would be fine 👍

Can you please look at https://github.com/quarkusio/quarkus/blob/main/extensions/oidc-db-token-state-manager/runtime/src/main/java/io/quarkus/oidc/db/token/state/manager/runtime/OidcDbTokenStateManager.java ?

For us in OIDC be able to select one of these Vert.x Web Session options, we'd need to sync OIDC TokenStateManager API and Vert.x Web Session API that your PR represents, similarly to how Michal did it for linking TokenStateManager API with Reactive DB client API.

Specifically, OIDC needs to save/retrieve/delete 3 tokens and periodically clean the expired tokens as the browser may have been closed and therefore an explicit delete is not guaranteed.

Thanks

@Ladicek
Copy link
Contributor Author

Ladicek commented Oct 9, 2023

@Ladicek sorry, haven't had time to review yet, but I would like to ask about your first question (regarding brining in the deps). Have you had that answered yet? If not, I have a suggestion for you.

I'd love to hear anything you have!

@geoand
Copy link
Contributor

geoand commented Oct 9, 2023

A while back @aloubyansky introduced conditional extension dependencies.
Although the feature is not as widely used as it should be, I have personally used it a few times (I can get references to the source code if you like) and it works amazingly well.
IIUC, it would cover your use case here.

@Ladicek
Copy link
Contributor Author

Ladicek commented Oct 9, 2023

Yeah, so I looked into conditional dependencies and found that I can't really use them, or at least not easily. Or I don't understand conditional dependencies properly. The present situation is (described using Redis, but it's the same for Infinispan):

To be able to store sessions to Redis, one needs to depend on quarkus-redis-client-sessions. This module provides a Vert.x Web SessionStore, so it needs to depend on Vert.x Web. It also needs to depend on quarkus-redis-client, because it needs the CDI qualifier defined there to be able to lookup the Redis client at runtime.

If I wanted to use conditional dependencies, the quarkus-redis-client-sessions module would be the "special" one. I'd like it conditionally brought in when both quarkus-vertx-http and quarkus-redis-client are present. Now, I can't make quarkus-redis-client have an optional dependency on quarkus-redis-client-sessions, because that would lead to circular dependency. I'm not sure if I can make quarkus-vertx-http have an optional dependency on quarkus-redis-client-sessions, it seems ... strange.

Maybe I could use this to avoid the dependency circularity? I didn't find any actual usage of that, so I'm not sure how that's supposed to work. I'll try, I guess...

@geoand
Copy link
Contributor

geoand commented Oct 9, 2023

To be able to store sessions to Redis, one needs to depend on quarkus-redis-client-sessions. This module provides a Vert.x Web SessionStore, so it needs to depend on Vert.x Web. It also needs to depend on quarkus-redis-client, because it needs the CDI qualifier defined there to be able to lookup the Redis client at runtime.

If I wanted to use conditional dependencies, the quarkus-redis-client-sessions module would be the "special" one. I'd like it conditionally brought in when both quarkus-vertx-http and quarkus-redis-client are present. Now, I can't make quarkus-redis-client have an optional dependency on quarkus-redis-client-sessions, because that would lead to circular dependency. I'm not sure if I can make quarkus-vertx-http have an optional dependency on quarkus-redis-client-sessions, it seems ... strange.

Is there any way to move stuff into "common" type dependencies and then wire stuff up?
I think that's what I had to do with Spring Web and RESTEasy Reactive - it was not trivial nor straightforward.

Maybe I could use this to avoid the dependency circularity? I didn't find any actual usage of that, so I'm not sure how that's supposed to work. I'll try, I guess...

Okay, I indeed have not had to use that.

@FroMage
Copy link
Member

FroMage commented Oct 9, 2023

I don't want to support the cookie session store.

Why not? This is really the easiest to use for our users, because it requires no server dependency (unlike redis/etc) and allows for backend scaling unlike in-memory sessions.

@aloubyansky
Copy link
Member

Maybe I could use this to avoid the dependency circularity? I didn't find any actual usage of that, so I'm not sure how that's supposed to work. I'll try, I guess...

I think you should be able to do that. Checking for a condition of Maven optional dependencies is a convenience, since, I was thinking at the time, typically they would be optional dependencies anyway.

@Ladicek
Copy link
Contributor Author

Ladicek commented Oct 9, 2023

I don't want to support the cookie session store.

Why not? This is really the easiest to use for our users, because it requires no server dependency (unlike redis/etc) and allows for backend scaling unlike in-memory sessions.

Because:

  • it is not encrypted, so you can't put sensitive information into it (and you probably shouldn't even if it was)
  • it is limited by the nature of cookies and the overhead of Base64 encoding (maximum cookie size is typically about 4 KB, Base64 has roughly 33% overhead, plus there's a few bytes of the signature and the cookie name, so you can safely store, let's say, 2.5 KB of data)
  • it increases the size of data you need to transmit over network (potentially significantly, depending on the session data lifecycle)

@FroMage
Copy link
Member

FroMage commented Oct 9, 2023

I've played video games with 2.5K ;)
In many cases I don't need my session data to be encrypted, just signed. Things like username, or even JWT token, don't need to be encrypted.

@Ladicek
Copy link
Contributor Author

Ladicek commented Oct 9, 2023

Is there any way to move stuff into "common" type dependencies and then wire stuff up?

I'm thinking maybe if the qualifier defined by quarkus-redis-client was in something like quarkus-redis-client-common, that could prevent the circular dependency. Alternatively, I saw quarkus-infinispan-client emits build items that allow access to the clients (indirectly, of course, through recorders), without CDI lookup. The Redis client doesn't do that, but we could probably add it. This would, on the other hand, require moving the build items to a deployment-spi kind of artifact. I'll explore more around that.

I've played video games with 2.5K ;) In many cases I don't need my session data to be encrypted, just signed. Things like username, or even JWT token, don't need to be encrypted.

I can imagine even a simple cookie-based flash scope hitting the 2.5K boundary relatively easily if you use it to store a form with modest number of fields and validation messages. But then, I don't really mind, adding a cookie-based session store would be easy. The only actual problem I can see is that the existing implementation in Vert.x Web does no size validation, and I'm not even sure what we could possibly do when we detect the limit was reached 🤷

@FroMage
Copy link
Member

FroMage commented Oct 9, 2023

I can imagine even a simple cookie-based flash scope hitting the 2.5K boundary relatively easily if you use it to store a form with modest number of fields and validation messages. But then, I don't really mind, adding a cookie-based session store would be easy. The only actual problem I can see is that the existing implementation in Vert.x Web does no size validation, and I'm not even sure what we could possibly do when we detect the limit was reached 🤷

I can see JWT cookies hitting that limit too. Can't we use more than one cookie if that happens?

@Ladicek
Copy link
Contributor Author

Ladicek commented Oct 9, 2023

I don't know to be honest. I do know that the Vert.x Web cookie-based session store doesn't do that out of the box :-)

@FroMage
Copy link
Member

FroMage commented Oct 9, 2023

Let's say we have "entity.name must have at least one character and at most 20 characters" as a validation constraint message (average size, I'd say), that's 71 chars. Most browsers have 4096 bytes for cookies. I'm not entirely sure as to the cookie value encoding, but Mozilla docs say US-ASCII, which is a pity, but 1 byte per char, so 71 bytes per message. So, in US-ASCII, we have store 57 error messages. That's a lot of elements for a form.

I'm not sure why we have to base64 the value. Or encrypt it. I've never had the need to hide session data from the user. Sign it, sure, but hide or base64 (except for text encoding, yeah), not sure. If there's a real use-case for encrypting session data, perhaps we have to wrap the Vert.x session API to make room for two cookies: one for non-encrypted text, one for encrypted/encoded?

@Ladicek
Copy link
Contributor Author

Ladicek commented Oct 9, 2023

The cookie-based session store takes all the entries in the session, adds some metadata, serializes all that into a buffer, and encodes its content with Base64. That, and the Base64-encoded signature, is what gets into the cookie.

This is a generic implementation (though the set of possible types that you can put into the session is still fairly limited), a specialized one could be made more efficient I guess.

@mkouba
Copy link
Contributor

mkouba commented Oct 9, 2023

I don't want to support the cookie session store.

Why not? This is really the easiest to use for our users, because it requires no server dependency (unlike redis/etc) and allows for backend scaling unlike in-memory sessions.

Well, I think that the easiest and safest default for most users is the in-memory session store. And that's what you get with no additional dependency so 🤷.

Also for cookie store the sessions survive server restart/crashes which is not always what a user expects.

@github-actions
Copy link

github-actions bot commented Oct 18, 2023

🎊 PR Preview 72e99a3 has been successfully built and deployed to https://quarkus-pr-main-36310-preview.surge.sh/version/main/guides/

@Ladicek Ladicek force-pushed the vertx-web-sessions branch 2 times, most recently from af66d16 to ebd03bd Compare October 24, 2023 15:26
@Ladicek Ladicek marked this pull request as ready for review October 24, 2023 15:28
@Ladicek
Copy link
Contributor Author

Ladicek commented Oct 24, 2023

I believe this is ready now.

@quarkus-bot

This comment has been minimized.

@Ladicek
Copy link
Contributor Author

Ladicek commented Oct 25, 2023

The failure in TrustedXForwarderProxiesUnknownHostnameFailureTest.testHeadersAreIgnored shows an actual bug in

if (stringAsyncResult.succeeded()) {
var trustedIP = Inet.parseInetAddress(stringAsyncResult.result());

Per the io.vertx.core.dns.DnsClient.lookup() javadoc, the lookup may succeed with a null value:

* @param handler  the {@link io.vertx.core.Handler} to notify with the {@link io.vertx.core.AsyncResult}.
*                 The handler will get notified with the resolved address if a record was found. If non was found it
*                 will get notifed with {@code null}. If an error accours it will get failed.

which the code linked above ignores. I believe we can treat the null value exactly as we treat a NXDOMAIN error. In fact, I think most DNS servers will just respond with NXDOMAIN, but for some reason, in the CI environment, we can get a successful null result, as evidenced by:

2023-10-24 18:07:15,785 ERROR [io.qua.ver.cor.run.VertxCoreRecorder] (vert.x-eventloop-thread-0) Uncaught exception received by Vert.x: java.lang.NullPointerException: Cannot invoke "String.indexOf(int)" because "address" is null
	at org.wildfly.common.net.Inet.parseInetAddress(Inet.java:629)
	at org.wildfly.common.net.Inet.parseInetAddress(Inet.java:616)
	at io.quarkus.vertx.http.runtime.ForwardedProxyHandler$1.handle(ForwardedProxyHandler.java:83)
	at io.quarkus.vertx.http.runtime.ForwardedProxyHandler$1.handle(ForwardedProxyHandler.java:79)
	at ...

I'll submit another PR with a fix.

@Ladicek
Copy link
Contributor Author

Ladicek commented Oct 25, 2023

Submitted #36682

@karesti
Copy link
Member

karesti commented Oct 25, 2023

@Ladicek from Infinispan side everything looks good! if tests pass correctly, we should not experience any breaking change. thanks!!

@quarkus-bot

This comment has been minimized.

Copy link
Member

@cescoffier cescoffier left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

only minor comments.

@quarkus-bot

This comment has been minimized.

Some constants from the Infinispan Client runtime module are moved
to the runtime SPI module, so that they can be used from other modules
that cannot directly depend on the Infinispan Client extension.

Two build items, `InfinispanClientBuildItem` and `InfinispanClientNameBuildItem`,
are moved from the Infinispan Client deployment module to the deployment SPI
module. This is technically a breaking change, because they are also moved
to a different package, but these build items don't seem to be used anywhere
outside of Quarkus, so it should be safe.
Some constants from the Redis Client runtime module are moved
to the runtime SPI module, so that they can be used from other modules
that cannot directly depend on the Redis Client extension.

One build item, `RequestedRedisClientBuildItem`, is moved from the Redis Client
deployment module to the deployment SPI module. This is technically a breaking
change, because it is also moved to a different package, but this build item
doesn't seem to be used anywhere outside of Quarkus, so it should be safe.

Further, one new build item, `RedisClientBuildItem`, is added. It provides
runtime access to the Redis clients (in the Mutiny variant) without having
to perform a CDI lookup.
@Ladicek
Copy link
Contributor Author

Ladicek commented Oct 31, 2023

Tried to improve the documentation a little around the possibility of concurrent session access.

@quarkus-bot
Copy link

quarkus-bot bot commented Oct 31, 2023

Failing Jobs - Building e6e973a

Status Name Step Failures Logs Raw logs Build scan
Devtools Tests - JDK 11 Build Failures Logs Raw logs
Devtools Tests - JDK 11 Windows Build Failures Logs Raw logs
Devtools Tests - JDK 17 Build Failures Logs Raw logs
JVM Tests - JDK 11 Build Failures Logs Raw logs
JVM Tests - JDK 17 Build Failures Logs Raw logs
JVM Tests - JDK 21 Build Failures Logs Raw logs

Full information is available in the Build summary check run.

Failures

⚙️ Devtools Tests - JDK 11 #

- Failing: integration-tests/devtools 

📦 integration-tests/devtools

io.quarkus.devtools.codestarts.quarkus.AmazonLambdaCodestartTest.testContent line 23 - More details - Source on GitHub

java.lang.AssertionError: 
[Snapshot is not matching (use -Dsnap to update it automatically): AmazonLambdaCodestartTest/testContent/src_test_java_ilove_quark_us_lambda_LambdaHandlerTest.java] 
Path:

io.quarkus.devtools.codestarts.quarkus.FunqyAmazonLambdaCodestartTest.testContent line 23 - More details - Source on GitHub

java.lang.AssertionError: 
[Snapshot is not matching (use -Dsnap to update it automatically): FunqyAmazonLambdaCodestartTest/testContent/src_test_java_ilove_quark_us_funqy_FunqyTest.java] 
Path:

io.quarkus.devtools.codestarts.quarkus.FunqyGoogleCloudFunctionsCodestartTest.testContent line 23 - More details - Source on GitHub

java.lang.AssertionError: 
[Snapshot is not matching (use -Dsnap to update it automatically): FunqyGoogleCloudFunctionsCodestartTest/testContent/src_test_java_ilove_quark_us_funqygooglecloudfunctions_GreetingFunctionsCloudEventsTest.java] 
Path:

io.quarkus.devtools.codestarts.quarkus.FunqyHttpCodestartTest.testContent line 22 - More details - Source on GitHub

java.lang.AssertionError: 
[Snapshot is not matching (use -Dsnap to update it automatically): FunqyHttpCodestartTest/testContent/src_test_java_ilove_quark_us_MyFunctionsTest.java] 
Path:

io.quarkus.devtools.codestarts.quarkus.FunqyKnativeEventsCodestartTest.testContent line 23 - More details - Source on GitHub

java.lang.AssertionError: 
[Snapshot is not matching (use -Dsnap to update it automatically): FunqyKnativeEventsCodestartTest/testContent/src_test_java_ilove_quark_us_funqy_cloudevent_FunqyTest.java] 
Path:

io.quarkus.devtools.codestarts.quarkus.GoogleCloudFunctionsCodestartTest.testContent line 24 - More details - Source on GitHub

java.lang.AssertionError: 
[Snapshot is not matching (use -Dsnap to update it automatically): GoogleCloudFunctionsCodestartTest/testContent/src_test_java_ilove_quark_us_googlecloudfunctions_HelloWorldCloudEventsFunctionTest.java] 
Path:

io.quarkus.devtools.codestarts.quarkus.GrpcCodestartTest.testContent line 23 - More details - Source on GitHub

java.lang.AssertionError: 
[Snapshot is not matching (use -Dsnap to update it automatically): GrpcCodestartTest/testContent/src_test_java_ilove_quark_us_HelloGrpcServiceTest.java] 
Path:

⚙️ Devtools Tests - JDK 11 Windows #

- Failing: integration-tests/devtools 

📦 integration-tests/devtools

io.quarkus.devtools.codestarts.quarkus.AmazonLambdaCodestartTest.testContent line 23 - More details - Source on GitHub

java.lang.AssertionError: 
[Snapshot is not matching (use -Dsnap to update it automatically): AmazonLambdaCodestartTest/testContent/src_test_java_ilove_quark_us_lambda_LambdaHandlerTest.java] 
Path:

io.quarkus.devtools.codestarts.quarkus.FunqyAmazonLambdaCodestartTest.testContent line 23 - More details - Source on GitHub

java.lang.AssertionError: 
[Snapshot is not matching (use -Dsnap to update it automatically): FunqyAmazonLambdaCodestartTest/testContent/src_test_java_ilove_quark_us_funqy_FunqyTest.java] 
Path:

io.quarkus.devtools.codestarts.quarkus.FunqyGoogleCloudFunctionsCodestartTest.testContent line 23 - More details - Source on GitHub

java.lang.AssertionError: 
[Snapshot is not matching (use -Dsnap to update it automatically): FunqyGoogleCloudFunctionsCodestartTest/testContent/src_test_java_ilove_quark_us_funqygooglecloudfunctions_GreetingFunctionsCloudEventsTest.java] 
Path:

io.quarkus.devtools.codestarts.quarkus.FunqyHttpCodestartTest.testContent line 22 - More details - Source on GitHub

java.lang.AssertionError: 
[Snapshot is not matching (use -Dsnap to update it automatically): FunqyHttpCodestartTest/testContent/src_test_java_ilove_quark_us_MyFunctionsTest.java] 
Path:

io.quarkus.devtools.codestarts.quarkus.FunqyKnativeEventsCodestartTest.testContent line 23 - More details - Source on GitHub

java.lang.AssertionError: 
[Snapshot is not matching (use -Dsnap to update it automatically): FunqyKnativeEventsCodestartTest/testContent/src_test_java_ilove_quark_us_funqy_cloudevent_FunqyTest.java] 
Path:

io.quarkus.devtools.codestarts.quarkus.GoogleCloudFunctionsCodestartTest.testContent line 24 - More details - Source on GitHub

java.lang.AssertionError: 
[Snapshot is not matching (use -Dsnap to update it automatically): GoogleCloudFunctionsCodestartTest/testContent/src_test_java_ilove_quark_us_googlecloudfunctions_HelloWorldCloudEventsFunctionTest.java] 
Path:

io.quarkus.devtools.codestarts.quarkus.GrpcCodestartTest.testContent line 23 - More details - Source on GitHub

java.lang.AssertionError: 
[Snapshot is not matching (use -Dsnap to update it automatically): GrpcCodestartTest/testContent/src_test_java_ilove_quark_us_HelloGrpcServiceTest.java] 
Path:

⚙️ Devtools Tests - JDK 17 #

- Failing: integration-tests/devtools 

📦 integration-tests/devtools

io.quarkus.devtools.codestarts.quarkus.AmazonLambdaCodestartTest.testContent line 23 - More details - Source on GitHub

java.lang.AssertionError: 
[Snapshot is not matching (use -Dsnap to update it automatically): AmazonLambdaCodestartTest/testContent/src_test_java_ilove_quark_us_lambda_LambdaHandlerTest.java] 
Path:

io.quarkus.devtools.codestarts.quarkus.FunqyAmazonLambdaCodestartTest.testContent line 23 - More details - Source on GitHub

java.lang.AssertionError: 
[Snapshot is not matching (use -Dsnap to update it automatically): FunqyAmazonLambdaCodestartTest/testContent/src_test_java_ilove_quark_us_funqy_FunqyTest.java] 
Path:

io.quarkus.devtools.codestarts.quarkus.FunqyGoogleCloudFunctionsCodestartTest.testContent line 23 - More details - Source on GitHub

java.lang.AssertionError: 
[Snapshot is not matching (use -Dsnap to update it automatically): FunqyGoogleCloudFunctionsCodestartTest/testContent/src_test_java_ilove_quark_us_funqygooglecloudfunctions_GreetingFunctionsCloudEventsTest.java] 
Path:

io.quarkus.devtools.codestarts.quarkus.FunqyHttpCodestartTest.testContent line 22 - More details - Source on GitHub

java.lang.AssertionError: 
[Snapshot is not matching (use -Dsnap to update it automatically): FunqyHttpCodestartTest/testContent/src_test_java_ilove_quark_us_MyFunctionsTest.java] 
Path:

io.quarkus.devtools.codestarts.quarkus.FunqyKnativeEventsCodestartTest.testContent line 23 - More details - Source on GitHub

java.lang.AssertionError: 
[Snapshot is not matching (use -Dsnap to update it automatically): FunqyKnativeEventsCodestartTest/testContent/src_test_java_ilove_quark_us_funqy_cloudevent_FunqyTest.java] 
Path:

io.quarkus.devtools.codestarts.quarkus.GoogleCloudFunctionsCodestartTest.testContent line 24 - More details - Source on GitHub

java.lang.AssertionError: 
[Snapshot is not matching (use -Dsnap to update it automatically): GoogleCloudFunctionsCodestartTest/testContent/src_test_java_ilove_quark_us_googlecloudfunctions_HelloWorldCloudEventsFunctionTest.java] 
Path:

io.quarkus.devtools.codestarts.quarkus.GrpcCodestartTest.testContent line 23 - More details - Source on GitHub

java.lang.AssertionError: 
[Snapshot is not matching (use -Dsnap to update it automatically): GrpcCodestartTest/testContent/src_test_java_ilove_quark_us_HelloGrpcServiceTest.java] 
Path:

⚙️ JVM Tests - JDK 11 #

- Failing: integration-tests/hibernate-orm-compatibility-5.6/mariadb integration-tests/hibernate-orm-compatibility-5.6/postgresql 

📦 integration-tests/hibernate-orm-compatibility-5.6/mariadb

io.quarkus.it.hibernate.compatibility.CompatibilityTest.offsetTime line 122 - More details - Source on GitHub

org.opentest4j.AssertionFailedError: 

expected: 11:58:30+01:00

📦 integration-tests/hibernate-orm-compatibility-5.6/postgresql

io.quarkus.it.hibernate.compatibility.CompatibilityTest.offsetTime line 122 - More details - Source on GitHub

org.opentest4j.AssertionFailedError: 

expected: 11:58:30+01:00

⚙️ JVM Tests - JDK 17 #

- Failing: integration-tests/hibernate-orm-compatibility-5.6/mariadb integration-tests/hibernate-orm-compatibility-5.6/postgresql integration-tests/kubernetes-client-devservices 

📦 integration-tests/hibernate-orm-compatibility-5.6/mariadb

io.quarkus.it.hibernate.compatibility.CompatibilityTest.offsetTime line 122 - More details - Source on GitHub

org.opentest4j.AssertionFailedError: 

expected: 11:58:30+01:00

📦 integration-tests/hibernate-orm-compatibility-5.6/postgresql

io.quarkus.it.hibernate.compatibility.CompatibilityTest.offsetTime line 122 - More details - Source on GitHub

org.opentest4j.AssertionFailedError: 

expected: 11:58:30+01:00

📦 integration-tests/kubernetes-client-devservices

io.quarkus.kubernetes.client.devservices.it.DevServicesKubernetesITest.shouldReturnAllKeys - More details - Source on GitHub

java.lang.RuntimeException: 
java.lang.RuntimeException: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
	[error]: Build step io.quarkus.kubernetes.client.deployment.DevServicesKubernetesProcessor#setupKubernetesDevService threw an exception: java.lang.RuntimeException: org.testcontainers.containers.ContainerLaunchException: Container startup failed for image k8s.gcr.io/kube-apiserver:v1.24.1

⚙️ JVM Tests - JDK 21 #

- Failing: integration-tests/hibernate-orm-compatibility-5.6/mariadb integration-tests/hibernate-orm-compatibility-5.6/postgresql 

📦 integration-tests/hibernate-orm-compatibility-5.6/mariadb

io.quarkus.it.hibernate.compatibility.CompatibilityTest.offsetTime line 122 - More details - Source on GitHub

org.opentest4j.AssertionFailedError: 

expected: 11:58:30+01:00

📦 integration-tests/hibernate-orm-compatibility-5.6/postgresql

io.quarkus.it.hibernate.compatibility.CompatibilityTest.offsetTime line 122 - More details - Source on GitHub

org.opentest4j.AssertionFailedError: 

expected: 11:58:30+01:00

@Ladicek Ladicek marked this pull request as draft November 3, 2023 09:50
@Ladicek
Copy link
Contributor Author

Ladicek commented Nov 3, 2023

Moved back to draft after conversation with @stuartwdouglas who convinced me that Vert.x Web approach to concurrent session access (especially with external session stores) is not adequate enough for general purpose usage.

@sberyozkin
Copy link
Member

Hey @Ladicek, are you planning to restart working on this amazing PR :-) ?

@Ladicek
Copy link
Contributor Author

Ladicek commented Jan 17, 2024

One day, maybe :-) Sorry, busy with CDI these days.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/dependencies Pull requests that update a dependency file area/devtools Issues/PR related to maven, gradle, platform and cli tooling/plugins area/documentation area/infinispan Infinispan area/redis area/vertx release/noteworthy-feature
Projects
Status: Reviewer approved
Development

Successfully merging this pull request may close these issues.

9 participants