Migrate applications to 3.33

Red Hat build of Quarkus 3.33

Red Hat Customer Content Services

Abstract

This guide describes how to migrate applications from earlier versions of Red Hat build of Quarkus to the current version.

Chapter 1. Migrate applications to 3.33

As an application developer, you can migrate applications that are based on Red Hat build of Quarkus version 3.2 or later to version 3.33 by using either the quarkus CLI or Maven.

Important

The Content from quarkus.io is not included.Quarkus CLI is intended for development purposes, including tasks such as creating, updating, and building Quarkus projects. However, Red Hat does not support using the Quarkus CLI in production environments.

1.1. Updating projects to the latest Red Hat build of Quarkus version

To update your Red Hat build of Quarkus projects to the latest version, follow these steps, which are explained in detail later in this guide:

  1. Use the quarkus CLI or Maven commands to run automated update tasks.
  2. Consult the Changes that affect compatibility with earlier versions section to perform any manual update tasks.

1.1.1. Automatic updates

Running the quarkus CLI or Maven commands triggers OpenRewrite recipes that upgrade project dependencies and source code. This automated approach provides a convenient and reliable way to update your projects.

However, not all migration tasks are automated. If specific updates are not applied after running the quarkus update command or its Maven equivalent, consider the following possible reasons:

  • The required migration task is not covered by the available OpenRewrite recipes.
  • An extension your project depends on is incompatible with the latest Red Hat build of Quarkus version.

1.1.2. Manual updates

Manual updates give you the flexibility and control to address any migration tasks to ensure your project aligns with your specific needs. Tasks that are not automated must be handled manually.

For a list of the migration tasks required to update from the previous release to this one, see the Changes that affect compatibility with earlier versions section of this guide.

Reviewing the migration guide for each release version between the current version of your application project and the version you’re upgrading to is essential. This review process ensures you are fully informed and prepared for the update process. For example, if upgrading from version 3.27 to 3.33, you only need to review this guide.

However, if upgrading from version 3.2 to 3.33, you must also review the guides for each intermediate version:

  • Migrating applications to Red Hat build of Quarkus 3.8
  • Migrating applications to Red Hat build of Quarkus 3.15
  • Migrating applications to Red Hat build of Quarkus 3.20
  • Migrating applications to Red Hat build of Quarkus 3.27

For links to these guides, see Additional resources.

Each task in this migration guide outlines the required changes and indicates whether they are automatically handled by the quarkus update command and its Maven equivalent.

For additional background, see the Quarkus community "Migration guides" in Additional resources.

1.2. Using the quarkus CLI to update the project

Update your Red Hat build of Quarkus projects by using the quarkus CLI.

Important

The Content from quarkus.io is not included.Quarkus CLI is intended for development purposes, including tasks such as creating, updating, and building Quarkus projects. However, Red Hat does not support using the Quarkus CLI in production environments.

Prerequisites

Procedure

  1. Create a working branch for your project in your version control system.
  2. Install the latest version of the quarkus CLI by following the Content from quarkus.io is not included.installation guide.
  3. Verify the installation by running the following command:

    quarkus -v
    3.33.1

     

  4. Important: Configure the extension registry client as instructed in the "Configuring Red Hat build of Quarkus extension registry client" section of the Configure your environment guide.
  5. In the terminal, navigate to your project directory.
  6. Update the project:

    quarkus update

    Optional: To update to a specific stream, use the --stream option followed by a specific version; for example:

    quarkus update --stream=3.33

     

  7. Review the output from the update command for instructions and perform any suggested tasks.
  8. Use a diff tool to inspect all changes made during the update process.
  9. Manually perform any changes that were not handled by updating the project. For details, refer to the following Changes that affect compatibility with earlier versions section.
  10. Ensure the project builds without errors, all tests pass, and the application functions as expected before deploying to production.

1.3. Using Maven to update the project

Update your Red Hat build of Quarkus projects by using Maven.

Prerequisites

Procedure

  1. Create a working branch for your project in your version control system.
  2. Important: Configure the extension registry client as instructed in the Configuring Red Hat build of Quarkus extension registry client section of the "Configure your environment" guide.
  3. Open a terminal and navigate to your project directory.
  4. Ensure that the Red Hat build of Quarkus Maven plugin version is aligned with the latest supported version. Configure the project according to the Build your first application guide, and then run:

    mvn com.redhat.quarkus.platform:quarkus-maven-plugin:3.33.1.redhat-00006:update

    Optional: To update to a specific stream, use the -Dstream option followed by the desired version; for example:

    mvn com.redhat.quarkus.platform:quarkus-maven-plugin:3.33.1.redhat-00006:update -Dstream=3.33

     

  5. Review the output from the update command for any instructions and perform the suggested tasks.
  6. Use a diff tool to examine all changes made during the update process.
  7. Manually perform any changes that were not handled by updating the project. For details, refer to the following Changes that affect compatibility with earlier versions section.
  8. Ensure the project builds without errors, all tests pass, and the application functions as expected before deploying to production.

1.4. Changes that affect compatibility with earlier versions

This section describes changes in Red Hat build of Quarkus 3.33 that affect the compatibility of applications built with earlier product versions.

Review these breaking changes and take the necessary steps to ensure that your applications continue functioning after updating them to Red Hat build of Quarkus 3.33.

You can perform many of the updates listed in this section by running quarkus update or the equivalent Maven command. This triggers automated OpenRewrite recipes that update your project dependencies and source code to the latest Red Hat build of Quarkus version.

However, not all migration tasks are automated. If specific updates aren’t applied by the automated update, it might be because the required migration task isn’t covered by the available OpenRewrite recipes or an extension your project relies on is incompatible with the latest version. In such cases, you need to perform the updates manually. Be sure to review the following items to identify and address any manual migration tasks.

1.4.1. Core

1.4.1.1. Cache: CacheManagerInfoBuildItem moved from SPI

In the current release, CacheManagerInfoBuildItem moves from io.quarkus.cache.deployment.spi to io.quarkus.cache.deployment. This change affects only extension maintainers who integrate with the cache extension because build fail if your extension imports the SPI class.

Update your imports from io.quarkus.cache.deployment.spi.CacheManagerInfoBuildItem to io.quarkus.cache.deployment.CacheManagerInfoBuildItem.

For more information, see the Quarkus Content from github.com is not included.Migration guide 3.30: CacheManagerInfoBuildItem moved from SPI to the deployment module.

1.4.1.2. Configuration: Accessing random ports has changed

In the current release, reading quarkus.http.port, quarkus.http.test-port, or test.url with System.getProperty() no longer returns the resolved random port values. This change affects applications and tests that build URLs from these system properties because they now keep their original values. Read these values from the Quarkus Config system, or inject io.quarkus.vertx.http.HttpServer to get the effective HTTP server configuration.

For more information, see the following resources:

1.4.1.3. Extension development: List<BuildItem> is now immutable

In the current release, when an extension consumes a MultiBuildItem in a @BuildStep, Quarkus returns an immutable List<BuildItem> instead of a mutable copy.

This affects extension code that sorts or otherwise modifies the returned list. Copy the list before modifying it, or use stream().sorted() when you only need sorted iteration.

For more information, see the Quarkus Content from github.com is not included.Migration guide 3.32: List<BuildItem> immutable.

1.4.1.4. Core: lz4-java groupId changed

In the current release, the lz4-java dependency switches from org.lz4:lz4-java to at.yawk.lz4:lz4-java. This change affects dependency resolution when your application or a dependency still pulls org.lz4:lz4-java because you can end up with conflicting LZ4-java artifacts on the classpath. Exclude org.lz4:lz4-java from your dependencies, then add at.yawk.lz4:lz4-java where needed.

For more information, see the Quarkus Content from github.com is not included.Migration guide 3.31: LZ4-java groupId change.

1.4.1.5. Qute: TemplateInstance rendering methods now throw TemplateException

In the current release, Qute changes TemplateInstance so that all rendering methods throw TemplateException on failure. Previously, rendering methods could throw TemplateException or an arbitrary runtime exception, and some failures could lead to a timeout when the underlying async operation did not complete.

Now, Qute catches these failures and throws TemplateException with the original runtime exception set as the cause. Update your exception handling to catch TemplateException for TemplateInstance rendering methods and inspect the cause when needed.

For more information, see the Quarkus Content from github.com is not included.Migration guide 3.29: Qute.

1.4.1.6. Red Hat Enterprise Linux (RHEL) 8 deprecated

In the current release, support for RHEL 8 is deprecated and planned to be removed in a future release.

To ensure continued support, migrate to RHEL 9.

For more information about migrating from RHEL 8, see Upgrading from RHEL 8 to RHEL 9.

1.4.2. Data

1.4.2.1. Hibernate ORM: Usage fails fast when a persistence unit is deactivated

In the current release, the Hibernate ORM extension fails fast when you deactivate a persistence unit with quarkus.hibernate-orm.active=false and the application still accesses Hibernate ORM CDI beans. This change causes startup failures for static CDI injection points, and it causes runtime exceptions for dynamic retrieval paths, instead of failing later on first access. Activate the persistence unit, or update your code to access Hibernate ORM beans only when the persistence unit is active, for example, by injecting Instance<Session> or InjectableInstance<Session>.

For more information, see the Quarkus Content from github.com is not included.Migration guide 3.29: Hibernate ORM inactive fail fast.

1.4.2.2. Hibernate ORM: Extension stays enabled without entities

In the current release, the Hibernate ORM extension stays enabled even when the application defines no Hibernate or Jakarta Persistence entities. This changes behavior for applications that include the Hibernate ORM extension and configure a datasource because Hibernate ORM now starts instead of being disabled. Disable Hibernate ORM explicitly by setting quarkus.hibernate-orm.enabled=false if the application does not need Hibernate ORM.

For more information, see the Quarkus Content from github.com is not included.Migration guide 3.29: Hibernate ORM enabled even if no entities are defined.

1.4.2.3. Hibernate Reactive: Usage fails fast when a persistence unit is deactivated

In the current release, Hibernate Reactive fails fast when you deactivate a persistence unit, and the application still accesses Hibernate Reactive CDI beans such as Mutiny.SessionFactory. This change causes startup failures for static CDI injection points, and it causes runtime exceptions for dynamic retrieval paths, instead of failing later on first access. Activate the persistence unit, or update your code to access Hibernate Reactive beans only when the persistence unit is active, for example, by injecting InjectableInstance<Mutiny.SessionFactory>.

For more information, see the Quarkus Content from github.com is not included.Migration guide 3.29: Hibernate Reactive inactive fail fast.

1.4.2.4. Hibernate Reactive: Extension stays enabled without entities

In the current release, the Hibernate Reactive extension stays enabled even when the application defines no Hibernate Reactive entities. This changes behavior for applications that include the Hibernate Reactive extension and configure a reactive datasource because Hibernate Reactive now starts instead of being disabled. Disable Hibernate Reactive explicitly by setting quarkus.hibernate-reactive.enabled=false if the application does not need Hibernate Reactive.

For more information, see the Quarkus Content from github.com is not included.Migration guide 3.29: Hibernate Reactive enabled even no entities are defined.

1.4.2.5. Hibernate Search: Fail fast when a persistence unit is deactivated

In the current release, Hibernate Search fails fast when a persistence unit is deactivated, and the application continues to access Hibernate Search CDI beans such as SearchSession or SearchMapping. This change causes startup failures at static CDI injection points and runtime exceptions for dynamic retrieval paths, instead of allowing the application to start and fail on first access. Update your code to access Hibernate Search beans only when the persistence unit is active, for example, by injecting InjectableInstance<SearchSession> or InjectableInstance<SearchMapping>.

For more information, see the Quarkus Content from github.com is not included.Migration guide 3.29: Hibernate Search inactive fail fast.

1.4.2.6. Hibernate Search: Elasticsearch client defaults changed

In the current release, the defaults for the Hibernate Search Elasticsearch client connection limits have changed. This change can increase the number of connections opened to your Elasticsearch cluster if you relied on the previous defaults. Set the following properties to keep the previous defaults:

  • quarkus.hibernate-search-[orm|standalone].elasticsearch.max-connections: 20 instead of the new default 40
  • quarkus.hibernate-search-[orm|standalone].elasticsearch.max-connections-per-route: 10 instead of the new default 20

For more information, see the Quarkus Content from github.com is not included.Migration guide 3.29: Hibernate Search Elasticsearch client defaults.

1.4.2.7. Agroal: Apache Derby support removed

In the current release, Agroal removes support for Apache Derby. Applications that connect to Apache Derby with the Agroal JDBC datasource fail to build because the Maven dependency no longer exists.

Replace Apache Derby with a supported database, or set db-kind=other to use an unsupported database driver. When you set db-kind=other, native compilation does not work, and other limitations can apply.

For more information, see the following resources:

1.4.2.8. Agroal: Default max pool size changed from 20 to 50

In the current release, Agroal changes the default maximum pool size from 20 to 50. This change can increase the number of database connections opened by default when you do not set quarkus.datasource.jdbc.max-size. Set quarkus.datasource.jdbc.max-size=20 to keep the previous default, or set a value that matches your database capacity and workload.

For more information, see the Quarkus Content from github.com is not included.Migration guide 3.31: Agroal and JDBC.

1.4.2.9. Data source: Dev Services SPI changed for extension developers

In the current release, the datasource Dev Services implementation uses the new Dev Services model, which changes the io.quarkus.datasource.deployment.spi SPI. This change affects extension developers only. Extensions that produce DevServicesDatasourceProviderBuildItem can fail to build until you update them to the new SPI.

Update your extension to use the new datasource Dev Services model. For an example migration, see the MS SQL conversion.

For more information, see the following resources:

1.4.3. Messaging

1.4.3.1. Apicurio Registry: Upgraded to version 3

In the current release, Apicurio Registry is upgraded from version 2 to version 3. The Apicurio Registry extensions quarkus-apicurio-registry-avro and quarkus-apicurio-registry-json-schema now use Apicurio Registry 3.x client libraries.

This major version upgrade introduces the following breaking changes:

  • Schema ID format changed: Apicurio Registry 3.x uses 4-byte identifiers instead of the 8-byte identifiers used in version 2.x. This change affects Kafka message compatibility between version 2 and 3 producers and consumers and requires configuration to handle messages across versions.
  • Registry URL path changed: The registry URL path changed from /apis/registry/v2 to /apis/registry/v3. Dev Services handles this change automatically.
1.4.3.1.1. Migration options

To migrate applications that consume messages created with Apicurio Registry 2.x, configure an appropriate ID handler:

  • New version 3 applications with no existing version 2 messages: No configuration changes are needed.
  • Applications consuming existing version 2 messages: Configure the Legacy8ByteIdHandler to read version 2 messages. Configure the handler globally or per-channel:

    Global configuration for all channels:

    mp.messaging.connector.smallrye-kafka.apicurio.registry.id-handler=io.apicurio.registry.serde.Legacy8ByteIdHandler

    Per-channel configuration:

    mp.messaging.incoming.my-channel.apicurio.registry.id-handler=io.apicurio.registry.serde.Legacy8ByteIdHandler
  • Gradual migration supporting both formats: Configure io.apicurio.registry.serde.OptimisticFallbackIdHandler, which writes version 3 (4-byte) identifiers but reads both version 2 and version 3 formats.

For detailed migration scenarios and configuration options, see the Content from quarkus.io is not included.Migrating from Apicurio Registry 2.x to 3.x section of the Quarkus "Using Apache Kafka with Schema Registry and Avro" guide.

1.4.4. Observability

1.4.4.1. Agroal: quarkus.datasource.jdbc.enable-metrics removed

In the current release, the deprecated quarkus.datasource.jdbc.enable-metrics configuration property is removed. Applications that set this property no longer control Agroal JDBC Micrometer metrics with it. Replace quarkus.datasource.jdbc.enable-metrics with quarkus.datasource.jdbc.metrics.enabled.

For more information, see the following resources:

1.4.4.2. OpenTelemetry: SDK updated to 1.49

In the current release, the OpenTelemetry (OTel) Software Development Kit (SDK) is updated to 1.49.0. This change renames OTel semantic-convention attribute keys, including those that affect SmallRye Reactive Messaging telemetry. Update queries, dashboards, and alert rules to use the new attribute keys.

Impacted attributes include:

  • code.functioncode.function.name
  • code.namespacecode.function.name
  • code.linenocode.line.number
  • db.redis.database_indexdb.namespace
  • messaging.consumer.idmessaging.client.id
  • messaging.kafka.consumer.groupmessaging.consumer.group.name
  • messaging.kafka.partitionmessaging.destination.partition.id.
  • messaging.kafka.message.offsetmessaging.kafka.offset

The migration guide also lists deprecated attributes that are scheduled for replacement. Plan updates for these attributes now to avoid future migration work.

Deprecated attributes include:

  • db.operationdb.operation.name
  • db.statementdb.query.text
  • db.user<no replacement>
  • db.connection_stringnetwork.peer.address and server.port
  • db.systemdb.system.name

For more information, see the Quarkus Content from github.com is not included.Migration guide 3.30: OpenTelemetry breaking changes.

1.4.4.3. OpenTelemetry: Package name typo fixed in the extension

In the current release, the OpenTelemetry (OTel) extension fixes a typo in the package name io.quarkus.opentelemetry.runtime.tracing.intrumentation by renaming it to io.quarkus.opentelemetry.runtime.tracing.instrumentation. This change breaks builds for applications that import classes from the old package name. Update your imports to the new package name.

For more information, see the Quarkus Content from github.com is not included.Migration guide 3.31: Package name typo fixed in the OpenTelemetry extension.

1.4.5. Security

1.4.5.1. Security: Elytron Security Properties File default hash algorithm changed

In the current release, Elytron Security Properties File raises password-hashing standards by changing the default hash algorithm from md5 to sha512. This change affects authentication when your properties file contains md5 hashed passwords because Elytron no longer matches them with the new default algorithm. Set the hash algorithm explicitly, or rehash stored passwords with sha512.

For more information, see the following resources:

1.4.5.2. Security: TLS v1.3 only by default

In the current release, the TLS registry enables only TLSv1.3 by default. This change raises the default security level, but it can cause TLS handshake failures when a peer requires TLSv1.2 or earlier. If you need to accept TLSv1.2, set quarkus.tls.protocols or quarkus.tls.<name>.protocols to include it, for example, TLSv1.3, TLSv1.2. TLSv1.2 is not deprecated, but TLSv1.3 remains the recommended protocol for stronger security.

For more information, see the following resources:

1.4.5.3. Security: Interceptors run before transaction interceptors

In the current release, security CDI interceptors run before transaction interceptors to avoid allocating transaction resources before a security check succeeds. This change affects code paths where authorization checks expect an active transaction started by an endpoint method interceptor. Start the transaction in the authorization check code path, or move transactional work to execute after authorization succeeds.

For more information, see the Quarkus Content from github.com is not included.Migration guide 3.31: Security interceptors run before transaction interceptors.

1.4.6. Tooling

1.4.6.1. AOT: Cache generation now requires Java 25

In the current release, ahead-of-time (AOT) cache generation requires Java 25. This change causes AOT cache generation to fail when you run it with an earlier Java version. Run AOT cache generation with Java 25, or disable AOT cache generation if you cannot move to Java 25 for this step.

For more information, see the Quarkus Content from github.com is not included.Migration guide 3.30: AOT.

1.4.6.2. Dev Services: Default images updated for Elasticsearch and OpenSearch

In the current release, Dev Services updated the default Elasticsearch image from 9.1 to 9.2 and the default OpenSearch image from 3.1 to 3.3. This change affects development and test environments that rely on the default images, as the updated containers might alter server behavior and compatibility. Set an explicit image name to keep a specific Elasticsearch or OpenSearch version in your Dev Services setup.

For more information, see the following resources:

1.4.6.3. Maven: New quarkus packaging and lifecycle

In the current release, Maven projects can set <packaging>quarkus</packaging> to use a Quarkus-specific build lifecycle. When you switch to quarkus packaging, Maven no longer runs maven-jar-plugin, so Maven no longer builds the default jar artifact. When you switch to quarkus packaging, Maven also no longer runs the default maven-install-plugin and maven-deploy-plugin executions for that default jar artifact. Keep <packaging>jar</packaging> if you rely on the default jar artifact, or configure explicit install and deploy steps for the artifact you want to publish. Set quarkus packaging only in the application module, not in library modules.

For more information, see the following resources:

1.4.6.4. Native image: Default builder image now uses Mandrel 25 on RHEL 9

In the current release, the default native builder image now uses registry.access.redhat.com/quarkus/mandrel-25-rhel9:25.0, which replaces the previous RHEL 8-based Mandrel builder image. This affects container-based native builds that still use UBI 8 runtime images, because native executables built with a UBI 9-based builder image are not compatible with UBI 8 base images.

Update the runtime image to a UBI 9-based image.

If you build your native application on a FIPS-enabled system, the resulting native image will have a dependency on the java-25-openjdk-crypto-adapter RHEL 9 package. Therefore, if you deploy native applications on FIPS-enabled RHEL 9 systems, install java-25-openjdk-crypto-adapter in the target image. This requirement applies only to FIPS-enabled native deployments.

The automatic update process does not cover this change. Apply this update manually.

For more information, see the following resources:

1.4.6.5. Testing: JUnit 6 and quarkus-junit5 artifact renames

In the current release, the test framework is upgraded from JUnit 5 to JUnit 6. To avoid confusion, Quarkus renames the *-junit5 test artifacts to *-junit.

Run quarkus update to apply the dependency relocations automatically. If you do not run quarkus update, update your dependencies to the new artifact names:

  • io.quarkus:quarkus-junit5io.quarkus:quarkus-junit
  • io.quarkus:quarkus-junit5-componentio.quarkus:quarkus-junit-component
  • io.quarkus:quarkus-junit5-configio.quarkus:quarkus-junit-config
  • io.quarkus:quarkus-junit5-internalio.quarkus:quarkus-junit-internal
  • io.quarkus:quarkus-junit5-mockitoio.quarkus:quarkus-junit-mockito
  • io.quarkus:quarkus-junit5-mockito-configio.quarkus:quarkus-junit-mockito-config
  • io.quarkus.junit5:junit5-virtual-threadsio.quarkus.junit:junit-virtual-threads

For more information, see the Quarkus Content from github.com is not included.Migration guide 3.31: JUnit 6.

1.4.6.6. Testing: Testcontainers 2 update

In the current release, the Testcontainers dependency has been updated to Version 2.0. This change affects projects that reference Testcontainers artifacts or packages directly because some artifact and package names have changed. Run quarkus update to apply the dependency and artifact renames automatically, then adjust any remaining direct Testcontainers references in your build and code.

For more information, see the Quarkus Content from github.com is not included.Migration guide 3.31: Testcontainers 2.

1.4.6.7. Tooling: Maven and Java 25 test configuration changes

In the current release, projects that run tests on Java 25 need an updated Maven Surefire and Failsafe argLine configuration to avoid JVM warnings.

If your pom.xml defines an explicit <argLine>, prepend @{argLine} to the existing <argLine> so the build automatically includes the required JVM arguments.

If your pom.xml does not define <argLine>, add <argLine>@{argLine}</argLine> so future test JVM tuning does not drop the required arguments.

Verify that the Quarkus Maven Plugin configuration includes <extensions>true</extensions>.

For more information, see the following resources:

1.4.7. Web

1.4.7.1. HTTP: Removed deprecated quarkus.http.cors configuration

In the current release, builds that set quarkus.http.cors fail to enable the CORS filter because this configuration key is removed. Update your configuration to use quarkus.http.cors.enabled instead.

For more information, see the Quarkus Content from github.com is not included.Migration guide 3.28.

1.4.7.2. GraphQL: Removed deprecated TLS configuration for SmallRye GraphQL clients

In the current release, the SmallRye GraphQL client extension removes the deprecated quarkus.smallrye-graphql.client.<client-name>.key-store.* and quarkus.smallrye-graphql.client.<client-name>.trust-store.* properties for Transport Layer Security (TLS) configuration.

Applications that relied on these properties no longer apply TLS settings for GraphQL clients. Configure TLS with the TLS registry, then reference that TLS configuration from your GraphQL clients.

For more information, see the following resources:

1.5. Additional resources

Legal Notice

Copyright © Red Hat.
Except as otherwise noted below, the text of and illustrations in this documentation are licensed by Red Hat under the Creative Commons Attribution–Share Alike 3.0 Unported license . If you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, the Red Hat logo, JBoss, Hibernate, and RHCE are trademarks or registered trademarks of Red Hat, LLC. or its subsidiaries in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
XFS is a trademark or registered trademark of Hewlett Packard Enterprise Development LP or its subsidiaries in the United States and other countries.
The OpenStack® Word Mark and OpenStack logo are trademarks or registered trademarks of the Linux Foundation, used under license.
All other trademarks are the property of their respective owners.