2 Replies Latest reply on Jun 20, 2018 12:16 PM by bookwood

    Howto add a postgreSQL datasource to a arquillian wildfly embedded container?

    bookwood

      When I use the default ExampleDS all my test works fine. Now I want to change the embedded h2 database to a PostgreSQL datasource and got a

      DeploymentException: Cannot deploy: test.war

      Error. When the Wildfly Server with a defined PostgreSQL datasource runs in Eclipse, I got the following in the console:

      19:16:49,732 INFO  [org.jboss.weld.deployer] (MSC service thread 1-4) WFLYWELD0003: Processing weld deployment test.war

      19:16:49,761 ERROR [org.jboss.as.controller.management-operation] (management-handler-thread - 15) WFLYCTL0013: Operation ("deploy") failed - address: ([("deployment" => "test.war")]) - failure description: {

          "WFLYCTL0412: Required services that are not installed:" => ["jboss.naming.context.java.jboss.datasources.PostgresDS"],

          "WFLYCTL0180: Services with missing/unavailable dependencies" => [

              "jboss.persistenceunit.\"test.war#TestLoricaDS\" is missing [jboss.naming.context.java.jboss.datasources.PostgresDS]",

              "jboss.persistenceunit.\"test.war#TestLoricaDS\".__FIRST_PHASE__ is missing [jboss.naming.context.java.jboss.datasources.PostgresDS]"

          ]

      }

      Is there a preferred way to add an other database to the arquillian wildfly embedded container? The documentation is incomplete in this case. I found only unanswered questions of my problem or workarounds that not work.

      Here is my test class:

       

      package de.ifasec.model;
      
      import javax.inject.Inject;
      import javax.persistence.EntityManager;
      import javax.persistence.PersistenceContext;
      
      import org.jboss.arquillian.container.test.api.Deployment;
      import org.jboss.arquillian.junit.Arquillian;
      import org.jboss.shrinkwrap.api.Archive;
      import org.jboss.shrinkwrap.api.ShrinkWrap;
      import org.jboss.shrinkwrap.api.asset.EmptyAsset;
      import org.jboss.shrinkwrap.api.spec.JavaArchive;
      import org.junit.Assert;
      import org.junit.Test;
      import org.junit.runner.RunWith;
      
      @RunWith(Arquillian.class)
      public class TalkTest {
      
      
          @Deployment
          public static Archive<?> createDeployment() {
      //        WebArchive war = ShrinkWrap.create(WebArchive.class)
      //                .addClass(Talk.class)
      //                .addAsResource("META-INF/persistence.xml", "persistence.xml")
      //                .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
      
               // or jar packaging...
              JavaArchive jar = ShrinkWrap.create(JavaArchive.class)
                  .addPackage(Talk.class.getPackage())
                  //.addAsManifestResource("META-INF/persistence.xml", "persistence.xml")
                  .addAsManifestResource("persistence-test.xml", "persistence.xml")
                  .addAsManifestResource("wildfly-ds.xml")
                  .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
              return jar;
          }
      
          
          @PersistenceContext(unitName="TestLoricaDS")
          EntityManager em;
      
          @Inject
          private Talk talk;
      
          @Test
          public void should_be_deployed() {
              Assert.assertNotNull(talk);
          }
      }
      

       

      and my persistence-test.xml:

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
        <persistence-unit name="TestLoricaDS" transaction-type="JTA">
          <description>Forge Persistence Unit</description>
          <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <!-- The commented tag works (the internal database -->
      <!--     <jta-data-source>java:/jboss/datasources/ExampleDS</jta-data-source> -->
          <jta-data-source>java:jboss/datasources/PostgresDS</jta-data-source>
          <exclude-unlisted-classes>false</exclude-unlisted-classes>
          <properties>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.transaction.flush_before_completion" value="true"/>
          </properties>
          
        </persistence-unit>
      </persistence>
      

       

      and my wildfly-ds.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <datasources xmlns="http://www.jboss.org/ironjacamar/schema"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="
              http://www.jboss.org/ironjacamar/schema
              http://docs.jboss.org/ironjacamar/schema/datasources_1_0.xsd">
          <datasource enabled="true" jndi-name="java:/jdbc/PostgresTestDS"
              pool-name="PostgresDS">
              <connection-url>jdbc:postgresql://10.20.1.4:2345/test</connection-url>
              <driver>postgres</driver>
              <pool>
                  <min-pool-size>4</min-pool-size>
                  <initial-pool-size>4</initial-pool-size>
                  <max-pool-size>64</max-pool-size>
              </pool>
              <security>
                  <user-name>test</user-name>
                  <password>test</password>
              </security>
          </datasource>
      </datasources>
      

       

      and my arquillian.xml

      <?xml version="1.0" encoding="UTF-8" standalone="no"?>
      <arquillian xmlns="http://jboss.org/schema/arquillian"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://jboss.org/schema/arquillian http://jboss.org/schema/arquillian/arquillian_1_0.xsd">
          <container default="true" qualifier="arquillian-wildfly-embedded">
              <configuration>
                  <property name="chameleonTarget">${chameleon.target}</property>
      <!--             <property name="serverConfig">standalone-psql.xml</property> -->
      <!-- The upper serverConfig produces -->
      <!-- LifecycleException:  -->
      <!-- Could not invoke start on: org.wildfly.core.embedded.EmbeddedManagedProcessImpl@40238dd0 -->
                  <property name="outputToConsole">true</property>
              </configuration>
          </container>
          <extension qualifier="persistence">
              <property name="defaultDataSource">java:jboss/datasources/PostgresDS</property>
          </extension>
      </arquillian>
      

       

      The maven pom

      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>de.ifasec</groupId>
        <artifactId>jpa-test</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <packaging>war</packaging>
        <build>
          <finalName>jpaTest</finalName>
        </build>
        <properties>
          <failOnMissingWebXml>false</failOnMissingWebXml>
          <maven.compiler.source>1.8</maven.compiler.source>
          <maven.compiler.target>1.8</maven.compiler.target>
          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
          <version.arquillian_universe>1.1.13.0</version.arquillian_universe>
          <version.junit>4.12</version.junit>
        </properties>
        <profiles>
          <profile>
            <id>arquillian-wildfly-embedded</id>
            <activation>
              <activeByDefault>true</activeByDefault>
            </activation>
            <build>
              <plugins>
                <plugin>
                  <artifactId>maven-surefire-plugin</artifactId>
                  <version>2.14.1</version>
                  <configuration>
                    <systemPropertyVariables>
                      <arquillian.launch>arquillian-wildfly-embedded</arquillian.launch>
                      <chameleon.target>wildfly:10.1.0.Final:EMBEDDED</chameleon.target>
                      <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
                      <!-- <jboss.home>${project.build.directory}/${wildfly.test.embedded.folder}</jboss.home> -->
                      <!-- <jboss.server.default.config>standalone-psql.xml</jboss.server.default.config> -->
                    </systemPropertyVariables>
                  </configuration>
                </plugin>
              </plugins>
            </build>
            <dependencies>
              <dependency>
                <groupId>org.jboss.logmanager</groupId>
                <artifactId>jboss-logmanager</artifactId>
                <version>2.0.7.Final</version>
                <scope>test</scope>
              </dependency>
              <dependency>
                <groupId>org.postgresql</groupId>
                <artifactId>postgresql</artifactId>
                <version>42.1.3</version>
                <scope>test</scope>
              </dependency>
            </dependencies>
          </profile>
          <profile>
            <id>arquillian-wildfly-remote</id>
            <build>
              <plugins>
                <plugin>
                  <artifactId>maven-surefire-plugin</artifactId>
                  <version>2.14.1</version>
                  <configuration>
                    <systemPropertyVariables>
                      <arquillian.launch>arquillian-wildfly-remote</arquillian.launch>
                      <chameleon.target>wildfly:10.1.0.Final:REMOTE</chameleon.target>
                    </systemPropertyVariables>
                  </configuration>
                </plugin>
              </plugins>
            </build>
          </profile>
          <profile>
            <id>JETTY_EMBEDDED_7.X_AND_8.X</id>
            <dependencies>
              <dependency>
                <groupId>org.jboss.arquillian.container</groupId>
                <artifactId>arquillian-jetty-embedded-7</artifactId>
                <version>1.0.0.CR3</version>
              </dependency>
              <dependency>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-webapp</artifactId>
                <version>9.4.6.v20170531</version>
              </dependency>
              <dependency>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-plus</artifactId>
                <version>9.4.6.v20170531</version>
              </dependency>
            </dependencies>
          </profile>
        </profiles>
        <dependencies>
          <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.0-api</artifactId>
            <scope>provided</scope>
          </dependency>
          <dependency>
            <groupId>org.arquillian.universe</groupId>
            <artifactId>arquillian-junit</artifactId>
            <type>pom</type>
            <scope>test</scope>
          </dependency>
          <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${version.junit}</version>
            <scope>test</scope>
          </dependency>
          <dependency>
            <groupId>org.arquillian.universe</groupId>
            <artifactId>arquillian-chameleon</artifactId>
            <type>pom</type>
            <scope>test</scope>
          </dependency>
          <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <scope>provided</scope>
          </dependency>
          <dependency>
            <groupId>org.jboss.arquillian.extension</groupId>
            <artifactId>arquillian-persistence-dbunit</artifactId>
            <version>1.0.0.Alpha7</version>
          </dependency>
        </dependencies>
        <dependencyManagement>
          <dependencies>
            <dependency>
              <groupId>org.jboss.spec</groupId>
              <artifactId>jboss-javaee-6.0</artifactId>
              <version>3.0.3.Final</version>
              <type>pom</type>
              <scope>import</scope>
            </dependency>
            <dependency>
              <groupId>org.arquillian</groupId>
              <artifactId>arquillian-universe</artifactId>
              <version>${version.arquillian_universe}</version>
              <type>pom</type>
              <scope>import</scope>
            </dependency>
          </dependencies>
        </dependencyManagement>
      </project>
      

      I generated the test project with jboss forge.

      Thanks in advance!

        • 1. Re: Howto add a postgreSQL datasource to a arquillian wildfly embedded container?
          a.bader

          Do you have a solution now? I have the same problem.

          • 2. Re: Howto add a postgreSQL datasource to a arquillian wildfly embedded container?
            bookwood

            No, the embedded container is to unflexible. I work with eclipse/jboss tools ide and now I use the remote container and start my wildfly with the eclipse server adapter. The main goal is, that I can use the debugger in my IDE for test driven development. For the automatic integration tests I defined an maven integration test profile and user the arquillian cube extension to launch two containers. One with postgreSQL and one with a wildfly. Arquillian connect  with the remote adapter to the wildfly docker container. this is much more flexible. For the test driven development  I defined a eclipse debug maven profile like the following and activate it in Eclipse:

                  <profile>
                  <id>eclipse-debug-test</id>
                  <build>
                    <plugins>
                      <plugin>
                        <artifactId>maven-failsafe-plugin</artifactId>
                        <configuration>
                          <systemPropertyVariables>
                            <arquillian.launch>arquillian-wildfly-remote</arquillian.launch>
                            <chameleon.target>wildfly:10.1.0.Final:REMOTE</chameleon.target>
                          </systemPropertyVariables>
                        </configuration>
                        <executions>
                          <execution>
                            <goals>
                              <goal>integration-test</goal>
                              <goal>verify</goal>
                            </goals>
                          </execution>
                        </executions>
                      </plugin>
                    </plugins>
                  </build>
                  <dependencies />
                </profile>
            

            Here is my actual arquillian.xml:

            <?xml version="1.0" encoding="UTF-8" standalone="no"?>
            <arquillian xmlns="http://jboss.org/schema/arquillian" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jboss.org/schema/arquillian http://jboss.org/schema/arquillian/arquillian_1_0.xsd">
              <defaultProtocol type="Servlet 3.0" />
              <container qualifier="arquillian-wildfly-remote" default="true">
                <configuration>
                  <property name="chameleonTarget">wildfly:10.1.0.Final:REMOTE</property>
                </configuration>
              </container>
              <container qualifier="wildfly10" default="false">
                <configuration>
                  <property name="chameleonTarget">wildfly:10.1.0.Final:REMOTE</property>
                  <property name="managementAddress">${docker.server}</property> 
                  <property name="username">test</property>
                  <property name="password">test</property>
                </configuration>
              </container>
              <extension qualifier="docker">
                <property name="serverVersion">1.27</property>
                <property name="definitionFormat">CUBE</property>
                <property name="serverUri">tcp://${docker.server}:${docker.port}</property>
                <property name="dockerContainersFile">src/test/resources/docker/intergration-test.yml</property>
              </extension>
            </arquillian>
            
              

            I hope this helps.