Giter Site home page Giter Site logo

sunstone's People

Contributors

codacy-badger avatar istraka avatar jmartisk avatar kwart avatar ladok8 avatar littlejohnii avatar mjurc avatar mnovak1 avatar simkam avatar tommaso-borgato avatar tplevko avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

sunstone's Issues

VPC support for EC2

Internal ID: 20

EC2 node should have configurable VPC. Sth like:

  • use existing subnet ID
  • create a new subnet

Expose configuration for private IP address in baremetal provider

When using baremetal provider, there should be option to configure also its private IP addresses as you might want to have defined some virtual network between nodes in the clouds and want to be able to access these addresses also when using bare provider. Or you just want to mimic with the baremetal provider the same public vs private IP address setup as when using some other cloud provider where public and private IP addresses are not equal.

Leaking provisioned virtual machines if an exception is thrown in waitForStartPorts()

Internal ID: 75

From AzureNode (but this is the case in other Nodes as well):

        try {
            this.initialNodeMetadata = createNode(template);
            String publicAddress = Iterables.getFirst(initialNodeMetadata.getPublicAddresses(), null);
            LOGGER.info("Started {} node '{}' from image {}, its public IP address is {}",
                    cloudProvider.getCloudProviderType().getHumanReadableName(), name, imageName, publicAddress);
            waitForStartPorts();
        } catch (RunNodesException e) {
            throw new RuntimeException("Unable to create " + cloudProvider.getCloudProviderType().getHumanReadableName()
                    + " node from template " + template, e);
        }

If an exception is thrown in waitForStartPorts it is a subclass of RuntimeException and isn't caught. In this case, the VM has already been successfully provisioned and it is not destroyed when the exception is thrown.

ExecBuilder.asDaemon doesn't work on EC2

Internal ID: 56

Doing trivial ExecBuilder.fromCommand("touch", "/tmp/bagr").exec(node) works properly, but when adding .asDaemon(), the file doesn't get created.

In our tests, We're using a public AMI with Amazon Linux on it. The sleep command from our tests works on that AMI when run manually, but not when running without a terminal. I don't know what's the cause yet. However, when running the tests on a RH AMI, it works in both cases. Thus, I assume the issue is with the Amazon AMI and ExecBuilder.asDaemon does work on EC2.

Enhancement to starting multiple nodes with the same configuration

It is currently possible to start a variable number of nodes with the same configuration with Sunstone, but it's a little clunky.

To do that, we define a node with complete configuration:

node.node1.stuff=stuff
node.node1.moreStuff=moreStuff

And then we add a second node with the template property:

node.node2.template=node1

We can also change any properties for node2 that are different from the template settings. This approach can be chained (e.g. node3 inherits from node2, node2 from node1).

Issues with the current approach:

  1. This configuration usually resides in the sunstone.properties file or an equivalent, because it can get large. It can, of course, be extracted and passed as a list of java system properties, but then, ...
  2. The configuration requires at least one property per additional node. Starting a test with 40 servers means we'll be passing 40 properties.
  3. The nodes are started by passing a list of node names (String) to the cloud provider. This means we need to know the node names before we start them. It is possible to establish a convention - e.g. if the .properties file related to the test defines node1 as a template, we'll be looking for properties for node2, node3, etc. and we'll stop when we don't find any template property for node4. This is not an elegant solution though - it would be better if we could extract a list of node names from a property that has been passed by a user - e.g.:
node.node1.templateTo=node2,node3

Proposed solution:

Exactly what I used as an example above, we introduce property node.<nodeName>.templateTo, which will list the node names that will be automatically configured as if they were declared with node.<newNodeName>.template.

Requirements:

  • The user needs a constant amount of properties (preferably one) to declare any number of additional nodes, if they all inherit from a single template.
  • It is still possible to change any properties for the new nodes, just as if they were declared via template.
  • Java system properties need to be recognized. This will allow us to change the number of nodes the test uses without touching the test or the .properties files.

Non-requirements and notes:

  • Tests will still need to account for a variable number of nodes. There may or may not be API provided for easier manipulation (to be decided).
  • Bare metal providers need a list of nodes when declared. This proposition makes that list variable. It would be nice if adding nodes would not require the user to redefine the list of nodes for bare metal providers. This may not be easy to implement and is only a little inconvenient, so it's not a requirement.

node configuration doesn't have a link to cloud provider configuration

Internal ID: 58

This was probably intentional, but it's not very convenient. I don't think people will be writing node configuration in such a way that they could start the node in multiple cloud providers (though they theoretically can). At the same time, the link would be useful -- e.g. for the bare metal provider (actually for the byon JClouds provider) or for the Arquillian extension.

Are we gonna do something about that?

Some properties for sunstone do not start with "sunstone."

These two:
clouds.sysprop.value.delimiter at ObjectProperties
clouds.ssh at DynamicSshClientModule

They should be deprecated and replaced with properties with proper prefix.

And the Arquillian README mentions old properties with the "clouds" prefix.

Doclint issues with javadoc plugin when releasing

When releasing a new version, doclint needs to be disabled, otherwise it blocks the release on the javadoc plugin. Either fix the documentation according to the errors/warnings, or disable doclint for good.

Run BaremetalTest against a Docker container

As the Sunstone tests expect to Docker provider to be configured, we can reuse it also for BaremetalCloudProvider testing. Currently the BaremetalTest expects an SSH-able host and the test run must be allowed by system property -Dbaremetal.run.

Add protection to temporary content

The README.md says,

Some properties are expected to contain file paths. This is typical e.g. for SSH private keys:

node.nodeA.openstack.ssh.privateKeyFile=/home/me/.ssh/id_rsa

In such cases, it is possible to load data also from classpath, using the classpath: prefix:

node.nodeA.openstack.ssh.privateKeyFile=classpath:org/jboss/test/openstack/ssh-private-key.pem

Note that these classpath resources are actually copied to the filesystem and the resulting temporary files are scheduled to be deleted at JVM exit. This shouldn't be a concern typically.

Doing "node.nodeA.openstack.ssh.privateKeyFile=classpath:test/ssh-private-key.pem" will expose
the temporary copy of the private key to local users on the system for a while.

We should add some level of protection here.

Identify extension points for Clouds

Internal ID: 48

Let's identify possible extension points for the framework and create new issues for them:

  • we already have the NodeWrapper
  • we can add handlers/listeners for lifecycle events (node created/stopped/started/killed, provider created/closed)
  • ...

Add a way to monitor lifecycle of on-boot scripts

Internal ID: 79

Depends on #25

Add listeners/callbacks/observers to let the user monitor the lifecycle of on-boot scripts. When this is implemented, the user should be able to find out when his VM has been fully configured.

Unstable EC2Test

While testing 1.2.0 release (with no changes to EC2 provider), the EC2 test failed intermittently several times:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running org.wildfly.extras.sunstone.tests.ec2.EC2Test
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.inject.internal.cglib.core.$ReflectUtils$2 (file:/home/rjanik/.m2/repository/com/google/inject/guice/3.0/guice-3.0.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of com.google.inject.internal.cglib.core.$ReflectUtils$2
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Tests run: 2, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 425.664 sec <<< FAILURE! - in org.wildfly.extras.sunstone.tests.ec2.EC2Test
node(org.wildfly.extras.sunstone.tests.ec2.EC2Test)  Time elapsed: 424.551 sec  <<< FAILURE!
java.lang.AssertionError: 'sleep' process should be found expected:<0> but was:<1>
	at org.junit.Assert.fail(Assert.java:88)
	at org.junit.Assert.failNotEquals(Assert.java:834)
	at org.junit.Assert.assertEquals(Assert.java:645)
	at org.wildfly.extras.sunstone.tests.AbstractCloudProviderTest.testExecBuilderFactory(AbstractCloudProviderTest.java:332)
	at org.wildfly.extras.sunstone.tests.AbstractCloudProviderTest.node(AbstractCloudProviderTest.java:194)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
	at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:48)
	at org.junit.rules.RunRules.evaluate(RunRules.java:20)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:367)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:274)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:238)
	at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:161)
	at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:290)
	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:242)
	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:121)

and:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running org.wildfly.extras.sunstone.tests.ec2.EC2Test
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.inject.internal.cglib.core.$ReflectUtils$2 (file:/home/rjanik/.m2/repository/com/google/inject/guice/3.0/guice-3.0.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of com.google.inject.internal.cglib.core.$ReflectUtils$2
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Tests run: 2, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 521.275 sec <<< FAILURE! - in org.wildfly.extras.sunstone.tests.ec2.EC2Test
node(org.wildfly.extras.sunstone.tests.ec2.EC2Test)  Time elapsed: 520.502 sec  <<< FAILURE!
java.lang.AssertionError
	at org.junit.Assert.fail(Assert.java:86)
	at org.junit.Assert.assertTrue(Assert.java:41)
	at org.junit.Assert.assertTrue(Assert.java:52)
	at org.wildfly.extras.sunstone.tests.AbstractCloudProviderTest.testLifecycleControl(AbstractCloudProviderTest.java:359)
	at org.wildfly.extras.sunstone.tests.AbstractCloudProviderTest.node(AbstractCloudProviderTest.java:195)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
	at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:48)
	at org.junit.rules.RunRules.evaluate(RunRules.java:20)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:367)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:274)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:238)
	at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:161)
	at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:290)
	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:242)
	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:121)

The first is likely timing issue - the test is slow and once the sleep time has been increased (to 300), the test passed. The second needs to be investigated, because it violates the contract that says when you run node.start(), the node should be started afterwards.

Investigate use of JSON configuration files

It has been suggested that we investigate the use of structured configuration files - using JSON instead of .properties. Libraries for working with JSON (Jackson/GSON/...) could allow us to construct configuration objects directly from the configuration files.

Cc @jmartisk

Creating instances with AMI name does not work for private images

I've tried creating some instances with a private image by supplying the image name and I got:

java.util.concurrent.CompletionException: java.lang.IllegalArgumentException: No image exists: <<<image-name>>>
    at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:273) ~[na:1.8.0_45]
    at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:280) ~[na:1.8.0_45]
    at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1584) ~[na:1.8.0_45]
    at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1574) ~[na:1.8.0_45]
    at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289) ~[na:1.8.0_45]
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056) ~[na:1.8.0_45]
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1689) ~[na:1.8.0_45]
    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157) ~[na:1.8.0_45]
Caused by: java.lang.IllegalArgumentException: No image exists: <<<image-name>>>
    at org.wildfly.extras.sunstone.api.impl.ResolvedImage.fromNameAndId(ResolvedImage.java:49) ~[sunstone-core-0.8.0.jar:na]
    at org.wildfly.extras.sunstone.api.impl.ec2.EC2Node.<init>(EC2Node.java:61) ~[sunstone-core-0.8.0.jar:na]
    at org.wildfly.extras.sunstone.api.impl.ec2.EC2CloudProvider.createNodeInternal(EC2CloudProvider.java:73) ~[sunstone-core-0.8.0.jar:na]
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.lambda$createNode$3(AbstractJCloudsCloudProvider.java:100) ~[sunstone-core-0.8.0.jar:na]
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider$$Lambda$22/346631962.apply(Unknown Source) ~[na:na]
    at java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1853) ~[na:1.8.0_45]
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.createNode(AbstractJCloudsCloudProvider.java:95) ~[sunstone-core-0.8.0.jar:na]
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.lambda$createNodeAsync$6(AbstractJCloudsCloudProvider.java:154) ~[sunstone-core-0.8.0.jar:na]
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider$$Lambda$21/898695324.get(Unknown Source) ~[na:na]
    at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1582) ~[na:1.8.0_45]
    ... 5 common frames omitted

Creating the instance via ID succeeds and the logs show that the image name is indeed correct.

I'm not sure why this is happening or whether there is some solution to it.

Node group too long for EC2

Internal ID: 89

The node group name can be too long for EC2. The limitation is 63 characters.

Object 'cloudts-jenkins-eap-7x-amazon-domain-simple-cluster-test-rhel6-1' doesn't match dns naming constraints. Reason: Can't be null or empty. Length must be 3 to 63 symbols.

Docker incompatibility with newer daemon versions, due to strange use of Docker REST API by JClouds

This is an issue that has been found with older version of Sunstone and JClouds and needs to be validated.

Copying reproducer information from an internal document:

# Install Docker-CE on Ubuntu - https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/
# Preparing docker daemon on Ubuntu to listen on tcp.

cat > /etc/docker/daemon.json <<EOF
{
        "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
}
EOF

# Update /lib/systemd/system/docker.service

- ExecStart=/usr/bin/dockerd -H fd://
+ ExecStart=/usr/bin/dockerd

systemctl daemon-reload
service docker restart

# run Wireshark to listen on loopback
docker -H tcp://0.0.0.0:2375 run hello-world

# TODO: Run this java application which uses JClouds library to start a local image.
# TODO: List communication when local image is running.

# When docker client is used and remote image is run, the communication consists of HTTP requests (see attached file for entire communication):
# POST /v1.30/containers/create -> returns 404
# GET /v1.30/info -> returns 200
# POST /v1.30/images/create?fromImage=hello-world&tag=latest -> returns 200
# POST /v1.30/containers/create -> returns 200

# When JClouds is used and local image is run, the communication consists of HTTP requests (see attached file for entire communication):
# POST /v1.18/images/create?fromImage=hello-world
# This request returns 200 on old implementation of Docker so JClouds works.
# This request returns 404 on new implementation of Docker what causes an exception in JClouds and failure of application.

Stacktrace:

Tests run: 4, Failures: 0, Errors: 4, Skipped: 0, Time elapsed: 7.142 sec <<< FAILURE! - in org.jboss.qa.messaging.tests.eap7.NfsNetworkFailureTestCase
disconnectJournalOnNfsCheckIOError(org.jboss.qa.messaging.tests.eap7.NfsNetworkFailureTestCase)  Time elapsed: 2.422 sec  <<< ERROR!
java.lang.RuntimeException: java.util.concurrent.CompletionException: org.jclouds.rest.ResourceNotFoundException: repository eap not found: does not exist or no pull access

    at org.jboss.qa.messaging.MessagingTestBase.setUp(MessagingTestBase.java:166)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
    at org.junit.rules.RunRules.evaluate(RunRules.java:20)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:283)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:173)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:128)
    at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
Caused by: java.util.concurrent.CompletionException: org.jclouds.rest.ResourceNotFoundException: repository eap not found: does not exist or no pull access

    at java.util.concurrent.CompletableFuture.internalComplete(CompletableFuture.java:205)
    at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:482)
    at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:902)
    at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1689)
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1644)
    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: org.jclouds.rest.ResourceNotFoundException: repository eap not found: does not exist or no pull access

    at org.jclouds.docker.handlers.DockerErrorHandler.handleError(DockerErrorHandler.java:73)
    at org.jclouds.http.handlers.DelegatingErrorHandler.handleError(DelegatingErrorHandler.java:65)
    at org.jclouds.http.internal.BaseHttpCommandExecutorService.shouldContinue(BaseHttpCommandExecutorService.java:140)
    at org.jclouds.http.internal.BaseHttpCommandExecutorService.invoke(BaseHttpCommandExecutorService.java:109)
    at org.jclouds.rest.internal.InvokeHttpMethod.invoke(InvokeHttpMethod.java:90)
    at org.jclouds.rest.internal.InvokeHttpMethod.apply(InvokeHttpMethod.java:73)
    at org.jclouds.rest.internal.InvokeHttpMethod.apply(InvokeHttpMethod.java:44)
    at org.jclouds.reflect.FunctionalReflection$FunctionalInvocationHandler.handleInvocation(FunctionalReflection.java:117)
    at com.google.common.reflect.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:87)
    at com.sun.proxy.$Proxy63.createImage(Unknown Source)
    at org.wildfly.extras.sunstone.api.impl.docker.DockerNode.<init>(DockerNode.java:90)
    at org.wildfly.extras.sunstone.api.impl.docker.DockerCloudProvider.createNodeInternal(DockerCloudProvider.java:68)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.lambda$createNode$0(AbstractJCloudsCloudProvider.java:100)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider$$Lambda$16/2104285708.apply(Unknown Source)
    at java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1853)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.createNode(AbstractJCloudsCloudProvider.java:95)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.lambda$createNodeAsync$3(AbstractJCloudsCloudProvider.java:172)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider$$Lambda$14/1751500625.get(Unknown Source)
    at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:476)
    at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:902)
    at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1689)
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1644)
    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: org.jclouds.http.HttpResponseException: command: POST http://127.0.0.1:2375/v1.18/images/create?fromImage=eap HTTP/1.1 failed with response: HTTP/1.1 404 Not Found; content: [repository eap not found: does not exist or no pull access
]
    at org.jclouds.docker.handlers.DockerErrorHandler.handleError(DockerErrorHandler.java:50)
    at org.jclouds.http.handlers.DelegatingErrorHandler.handleError(DelegatingErrorHandler.java:65)
    at org.jclouds.http.internal.BaseHttpCommandExecutorService.shouldContinue(BaseHttpCommandExecutorService.java:140)
    at org.jclouds.http.internal.BaseHttpCommandExecutorService.invoke(BaseHttpCommandExecutorService.java:109)
    at org.jclouds.rest.internal.InvokeHttpMethod.invoke(InvokeHttpMethod.java:90)
    at org.jclouds.rest.internal.InvokeHttpMethod.apply(InvokeHttpMethod.java:73)
    at org.jclouds.rest.internal.InvokeHttpMethod.apply(InvokeHttpMethod.java:44)
    at org.jclouds.reflect.FunctionalReflection$FunctionalInvocationHandler.handleInvocation(FunctionalReflection.java:117)
    at com.google.common.reflect.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:87)
    at com.sun.proxy.$Proxy63.createImage(Unknown Source)
    at org.wildfly.extras.sunstone.api.impl.docker.DockerNode.<init>(DockerNode.java:90)
    at org.wildfly.extras.sunstone.api.impl.docker.DockerCloudProvider.createNodeInternal(DockerCloudProvider.java:68)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.lambda$createNode$0(AbstractJCloudsCloudProvider.java:100)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider$$Lambda$16/2104285708.apply(Unknown Source)
    at java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1853)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.createNode(AbstractJCloudsCloudProvider.java:95)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.lambda$createNodeAsync$3(AbstractJCloudsCloudProvider.java:172)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider$$Lambda$14/1751500625.get(Unknown Source)
    at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:476)
    at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:902)
    at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1689)
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1644)
    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)

disconnectJournalOnNfsCheckBroker(org.jboss.qa.messaging.tests.eap7.NfsNetworkFailureTestCase)  Time elapsed: 1.53 sec  <<< ERROR!
java.lang.RuntimeException: java.util.concurrent.CompletionException: org.jclouds.rest.ResourceNotFoundException: repository eap not found: does not exist or no pull access

    at org.jboss.qa.messaging.MessagingTestBase.setUp(MessagingTestBase.java:166)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
    at org.junit.rules.RunRules.evaluate(RunRules.java:20)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:283)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:173)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:128)
    at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
Caused by: java.util.concurrent.CompletionException: org.jclouds.rest.ResourceNotFoundException: repository eap not found: does not exist or no pull access

    at java.util.concurrent.CompletableFuture.internalComplete(CompletableFuture.java:205)
    at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:482)
    at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:902)
    at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1689)
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1644)
    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: org.jclouds.rest.ResourceNotFoundException: repository eap not found: does not exist or no pull access

    at org.jclouds.docker.handlers.DockerErrorHandler.handleError(DockerErrorHandler.java:73)
    at org.jclouds.http.handlers.DelegatingErrorHandler.handleError(DelegatingErrorHandler.java:65)
    at org.jclouds.http.internal.BaseHttpCommandExecutorService.shouldContinue(BaseHttpCommandExecutorService.java:140)
    at org.jclouds.http.internal.BaseHttpCommandExecutorService.invoke(BaseHttpCommandExecutorService.java:109)
    at org.jclouds.rest.internal.InvokeHttpMethod.invoke(InvokeHttpMethod.java:90)
    at org.jclouds.rest.internal.InvokeHttpMethod.apply(InvokeHttpMethod.java:73)
    at org.jclouds.rest.internal.InvokeHttpMethod.apply(InvokeHttpMethod.java:44)
    at org.jclouds.reflect.FunctionalReflection$FunctionalInvocationHandler.handleInvocation(FunctionalReflection.java:117)
    at com.google.common.reflect.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:87)
    at com.sun.proxy.$Proxy63.createImage(Unknown Source)
    at org.wildfly.extras.sunstone.api.impl.docker.DockerNode.<init>(DockerNode.java:90)
    at org.wildfly.extras.sunstone.api.impl.docker.DockerCloudProvider.createNodeInternal(DockerCloudProvider.java:68)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.lambda$createNode$0(AbstractJCloudsCloudProvider.java:100)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider$$Lambda$16/2104285708.apply(Unknown Source)
    at java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1853)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.createNode(AbstractJCloudsCloudProvider.java:95)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.lambda$createNodeAsync$3(AbstractJCloudsCloudProvider.java:172)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider$$Lambda$14/1751500625.get(Unknown Source)
    at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:476)
    at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:902)
    at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1689)
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1644)
    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: org.jclouds.http.HttpResponseException: command: POST http://127.0.0.1:2375/v1.18/images/create?fromImage=eap HTTP/1.1 failed with response: HTTP/1.1 404 Not Found; content: [repository eap not found: does not exist or no pull access
]
    at org.jclouds.docker.handlers.DockerErrorHandler.handleError(DockerErrorHandler.java:50)
    at org.jclouds.http.handlers.DelegatingErrorHandler.handleError(DelegatingErrorHandler.java:65)
    at org.jclouds.http.internal.BaseHttpCommandExecutorService.shouldContinue(BaseHttpCommandExecutorService.java:140)
    at org.jclouds.http.internal.BaseHttpCommandExecutorService.invoke(BaseHttpCommandExecutorService.java:109)
    at org.jclouds.rest.internal.InvokeHttpMethod.invoke(InvokeHttpMethod.java:90)
    at org.jclouds.rest.internal.InvokeHttpMethod.apply(InvokeHttpMethod.java:73)
    at org.jclouds.rest.internal.InvokeHttpMethod.apply(InvokeHttpMethod.java:44)
    at org.jclouds.reflect.FunctionalReflection$FunctionalInvocationHandler.handleInvocation(FunctionalReflection.java:117)
    at com.google.common.reflect.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:87)
    at com.sun.proxy.$Proxy63.createImage(Unknown Source)
    at org.wildfly.extras.sunstone.api.impl.docker.DockerNode.<init>(DockerNode.java:90)
    at org.wildfly.extras.sunstone.api.impl.docker.DockerCloudProvider.createNodeInternal(DockerCloudProvider.java:68)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.lambda$createNode$0(AbstractJCloudsCloudProvider.java:100)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider$$Lambda$16/2104285708.apply(Unknown Source)
    at java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1853)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.createNode(AbstractJCloudsCloudProvider.java:95)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.lambda$createNodeAsync$3(AbstractJCloudsCloudProvider.java:172)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider$$Lambda$14/1751500625.get(Unknown Source)
    at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:476)
    at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:902)
    at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1689)
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1644)
    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)

disconnectJournalOnNfs41CheckIOError(org.jboss.qa.messaging.tests.eap7.NfsNetworkFailureTestCase)  Time elapsed: 1.505 sec  <<< ERROR!
java.lang.RuntimeException: java.util.concurrent.CompletionException: org.jclouds.rest.ResourceNotFoundException: repository eap not found: does not exist or no pull access

    at org.jboss.qa.messaging.MessagingTestBase.setUp(MessagingTestBase.java:166)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
    at org.junit.rules.RunRules.evaluate(RunRules.java:20)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:283)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:173)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:128)
    at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
Caused by: java.util.concurrent.CompletionException: org.jclouds.rest.ResourceNotFoundException: repository eap not found: does not exist or no pull access

    at java.util.concurrent.CompletableFuture.internalComplete(CompletableFuture.java:205)
    at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:482)
    at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:902)
    at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1689)
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1644)
    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: org.jclouds.rest.ResourceNotFoundException: repository eap not found: does not exist or no pull access

    at org.jclouds.docker.handlers.DockerErrorHandler.handleError(DockerErrorHandler.java:73)
    at org.jclouds.http.handlers.DelegatingErrorHandler.handleError(DelegatingErrorHandler.java:65)
    at org.jclouds.http.internal.BaseHttpCommandExecutorService.shouldContinue(BaseHttpCommandExecutorService.java:140)
    at org.jclouds.http.internal.BaseHttpCommandExecutorService.invoke(BaseHttpCommandExecutorService.java:109)
    at org.jclouds.rest.internal.InvokeHttpMethod.invoke(InvokeHttpMethod.java:90)
    at org.jclouds.rest.internal.InvokeHttpMethod.apply(InvokeHttpMethod.java:73)
    at org.jclouds.rest.internal.InvokeHttpMethod.apply(InvokeHttpMethod.java:44)
    at org.jclouds.reflect.FunctionalReflection$FunctionalInvocationHandler.handleInvocation(FunctionalReflection.java:117)
    at com.google.common.reflect.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:87)
    at com.sun.proxy.$Proxy63.createImage(Unknown Source)
    at org.wildfly.extras.sunstone.api.impl.docker.DockerNode.<init>(DockerNode.java:90)
    at org.wildfly.extras.sunstone.api.impl.docker.DockerCloudProvider.createNodeInternal(DockerCloudProvider.java:68)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.lambda$createNode$0(AbstractJCloudsCloudProvider.java:100)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider$$Lambda$16/2104285708.apply(Unknown Source)
    at java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1853)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.createNode(AbstractJCloudsCloudProvider.java:95)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.lambda$createNodeAsync$3(AbstractJCloudsCloudProvider.java:172)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider$$Lambda$14/1751500625.get(Unknown Source)
    at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:476)
    at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:902)
    at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1689)
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1644)
    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: org.jclouds.http.HttpResponseException: command: POST http://127.0.0.1:2375/v1.18/images/create?fromImage=eap HTTP/1.1 failed with response: HTTP/1.1 404 Not Found; content: [repository eap not found: does not exist or no pull access
]
    at org.jclouds.docker.handlers.DockerErrorHandler.handleError(DockerErrorHandler.java:50)
    at org.jclouds.http.handlers.DelegatingErrorHandler.handleError(DelegatingErrorHandler.java:65)
    at org.jclouds.http.internal.BaseHttpCommandExecutorService.shouldContinue(BaseHttpCommandExecutorService.java:140)
    at org.jclouds.http.internal.BaseHttpCommandExecutorService.invoke(BaseHttpCommandExecutorService.java:109)
    at org.jclouds.rest.internal.InvokeHttpMethod.invoke(InvokeHttpMethod.java:90)
    at org.jclouds.rest.internal.InvokeHttpMethod.apply(InvokeHttpMethod.java:73)
    at org.jclouds.rest.internal.InvokeHttpMethod.apply(InvokeHttpMethod.java:44)
    at org.jclouds.reflect.FunctionalReflection$FunctionalInvocationHandler.handleInvocation(FunctionalReflection.java:117)
    at com.google.common.reflect.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:87)
    at com.sun.proxy.$Proxy63.createImage(Unknown Source)
    at org.wildfly.extras.sunstone.api.impl.docker.DockerNode.<init>(DockerNode.java:90)
    at org.wildfly.extras.sunstone.api.impl.docker.DockerCloudProvider.createNodeInternal(DockerCloudProvider.java:68)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.lambda$createNode$0(AbstractJCloudsCloudProvider.java:100)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider$$Lambda$16/2104285708.apply(Unknown Source)
    at java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1853)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.createNode(AbstractJCloudsCloudProvider.java:95)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.lambda$createNodeAsync$3(AbstractJCloudsCloudProvider.java:172)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider$$Lambda$14/1751500625.get(Unknown Source)
    at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:476)
    at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:902)
    at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1689)
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1644)
    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)

disconnectJournalOnNfs41CheckBroker(org.jboss.qa.messaging.tests.eap7.NfsNetworkFailureTestCase)  Time elapsed: 1.541 sec  <<< ERROR!
java.lang.RuntimeException: java.util.concurrent.CompletionException: org.jclouds.rest.ResourceNotFoundException: repository eap not found: does not exist or no pull access

    at org.jboss.qa.messaging.MessagingTestBase.setUp(MessagingTestBase.java:166)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
    at org.junit.rules.RunRules.evaluate(RunRules.java:20)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:283)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:173)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:128)
    at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
Caused by: java.util.concurrent.CompletionException: org.jclouds.rest.ResourceNotFoundException: repository eap not found: does not exist or no pull access

    at java.util.concurrent.CompletableFuture.internalComplete(CompletableFuture.java:205)
    at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:482)
    at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:902)
    at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1689)
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1644)
    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: org.jclouds.rest.ResourceNotFoundException: repository eap not found: does not exist or no pull access

    at org.jclouds.docker.handlers.DockerErrorHandler.handleError(DockerErrorHandler.java:73)
    at org.jclouds.http.handlers.DelegatingErrorHandler.handleError(DelegatingErrorHandler.java:65)
    at org.jclouds.http.internal.BaseHttpCommandExecutorService.shouldContinue(BaseHttpCommandExecutorService.java:140)
    at org.jclouds.http.internal.BaseHttpCommandExecutorService.invoke(BaseHttpCommandExecutorService.java:109)
    at org.jclouds.rest.internal.InvokeHttpMethod.invoke(InvokeHttpMethod.java:90)
    at org.jclouds.rest.internal.InvokeHttpMethod.apply(InvokeHttpMethod.java:73)
    at org.jclouds.rest.internal.InvokeHttpMethod.apply(InvokeHttpMethod.java:44)
    at org.jclouds.reflect.FunctionalReflection$FunctionalInvocationHandler.handleInvocation(FunctionalReflection.java:117)
    at com.google.common.reflect.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:87)
    at com.sun.proxy.$Proxy63.createImage(Unknown Source)
    at org.wildfly.extras.sunstone.api.impl.docker.DockerNode.<init>(DockerNode.java:90)
    at org.wildfly.extras.sunstone.api.impl.docker.DockerCloudProvider.createNodeInternal(DockerCloudProvider.java:68)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.lambda$createNode$0(AbstractJCloudsCloudProvider.java:100)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider$$Lambda$16/2104285708.apply(Unknown Source)
    at java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1853)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.createNode(AbstractJCloudsCloudProvider.java:95)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.lambda$createNodeAsync$3(AbstractJCloudsCloudProvider.java:172)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider$$Lambda$14/1751500625.get(Unknown Source)
    at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:476)
    at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:902)
    at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1689)
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1644)
    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: org.jclouds.http.HttpResponseException: command: POST http://127.0.0.1:2375/v1.18/images/create?fromImage=eap HTTP/1.1 failed with response: HTTP/1.1 404 Not Found; content: [repository eap not found: does not exist or no pull access
]
    at org.jclouds.docker.handlers.DockerErrorHandler.handleError(DockerErrorHandler.java:50)
    at org.jclouds.http.handlers.DelegatingErrorHandler.handleError(DelegatingErrorHandler.java:65)
    at org.jclouds.http.internal.BaseHttpCommandExecutorService.shouldContinue(BaseHttpCommandExecutorService.java:140)
    at org.jclouds.http.internal.BaseHttpCommandExecutorService.invoke(BaseHttpCommandExecutorService.java:109)
    at org.jclouds.rest.internal.InvokeHttpMethod.invoke(InvokeHttpMethod.java:90)
    at org.jclouds.rest.internal.InvokeHttpMethod.apply(InvokeHttpMethod.java:73)
    at org.jclouds.rest.internal.InvokeHttpMethod.apply(InvokeHttpMethod.java:44)
    at org.jclouds.reflect.FunctionalReflection$FunctionalInvocationHandler.handleInvocation(FunctionalReflection.java:117)
    at com.google.common.reflect.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:87)
    at com.sun.proxy.$Proxy63.createImage(Unknown Source)
    at org.wildfly.extras.sunstone.api.impl.docker.DockerNode.<init>(DockerNode.java:90)
    at org.wildfly.extras.sunstone.api.impl.docker.DockerCloudProvider.createNodeInternal(DockerCloudProvider.java:68)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.lambda$createNode$0(AbstractJCloudsCloudProvider.java:100)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider$$Lambda$16/2104285708.apply(Unknown Source)
    at java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1853)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.createNode(AbstractJCloudsCloudProvider.java:95)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.lambda$createNodeAsync$3(AbstractJCloudsCloudProvider.java:172)
    at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider$$Lambda$14/1751500625.get(Unknown Source)
    at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:476)
    at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:902)
    at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1689)
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1644)
    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)


Results :

Tests in error:

Test suite fails with JDK 9+

Trying with Oracle JDK 9.0.4, the tests fail with:

Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.783 sec <<< FAILURE! - in org.wildfly.extras.sunstone.api.impl.docker.NodeGroupTest
test(org.wildfly.extras.sunstone.api.impl.docker.NodeGroupTest)  Time elapsed: 0.75 sec  <<< ERROR!
com.google.inject.internal.util.$ComputationException: com.google.inject.internal.util.$ComputationException: java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
	at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:553)
	at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:419)
	at com.google.inject.internal.util.$CustomConcurrentHashMap$ComputingImpl.get(CustomConcurrentHashMap.java:2041)
	at com.google.inject.internal.FailableCache.get(FailableCache.java:50)
	at com.google.inject.internal.ConstructorInjectorStore.get(ConstructorInjectorStore.java:49)
	at com.google.inject.internal.ConstructorBindingImpl.initialize(ConstructorBindingImpl.java:125)
	at com.google.inject.internal.InjectorImpl.initializeJitBinding(InjectorImpl.java:521)
	at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:847)
	at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:772)
	at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:256)
	at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:205)
	at com.google.inject.internal.InjectorImpl.getInternalFactory(InjectorImpl.java:853)
	at com.google.inject.internal.FactoryProxy.notify(FactoryProxy.java:46)
	at com.google.inject.internal.ProcessedBindingData.runCreationListeners(ProcessedBindingData.java:50)
	at com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:133)
	at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:106)
	at com.google.inject.Guice.createInjector(Guice.java:95)
	at org.jclouds.ContextBuilder.buildInjector(ContextBuilder.java:405)
	at org.jclouds.ContextBuilder.buildInjector(ContextBuilder.java:328)
	at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.<init>(AbstractJCloudsCloudProvider.java:65)
	at org.wildfly.extras.sunstone.api.impl.docker.DockerCloudProvider.<init>(DockerCloudProvider.java:35)
	at org.wildfly.extras.sunstone.api.CloudProvider.create(CloudProvider.java:152)
	at org.wildfly.extras.sunstone.api.CloudProvider.create(CloudProvider.java:134)
	at org.wildfly.extras.sunstone.api.impl.docker.NodeGroupTest.test(NodeGroupTest.java:16)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:564)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:367)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:274)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:238)
	at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:161)
	at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:290)
	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:242)
	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:121)
Caused by: com.google.inject.internal.util.$ComputationException: java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
	at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:553)
	at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:419)
	at com.google.inject.internal.util.$CustomConcurrentHashMap$ComputingImpl.get(CustomConcurrentHashMap.java:2041)
	at com.google.inject.internal.FailableCache.get(FailableCache.java:50)
	at com.google.inject.internal.ConstructorInjectorStore.get(ConstructorInjectorStore.java:49)
	at com.google.inject.internal.ConstructorBindingImpl.initialize(ConstructorBindingImpl.java:125)
	at com.google.inject.internal.InjectorImpl.initializeJitBinding(InjectorImpl.java:521)
	at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:847)
	at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:772)
	at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:256)
	at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:205)
	at com.google.inject.internal.InjectorImpl.createImplementedByBinding(InjectorImpl.java:732)
	at com.google.inject.internal.InjectorImpl.createUninitializedBinding(InjectorImpl.java:618)
	at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:845)
	at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:772)
	at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:256)
	at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:205)
	at com.google.inject.internal.InjectorImpl.getInternalFactory(InjectorImpl.java:853)
	at com.google.inject.internal.InjectorImpl.createParameterInjector(InjectorImpl.java:925)
	at com.google.inject.internal.InjectorImpl.getParametersInjectors(InjectorImpl.java:913)
	at com.google.inject.internal.ConstructorInjectorStore.createConstructor(ConstructorInjectorStore.java:69)
	at com.google.inject.internal.ConstructorInjectorStore.access$000(ConstructorInjectorStore.java:28)
	at com.google.inject.internal.ConstructorInjectorStore$1.create(ConstructorInjectorStore.java:36)
	at com.google.inject.internal.ConstructorInjectorStore$1.create(ConstructorInjectorStore.java:32)
	at com.google.inject.internal.FailableCache$1.apply(FailableCache.java:39)
	at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:549)
	... 47 more
Caused by: java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
	at java.base/java.lang.Class.getDeclaredConstructors0(Native Method)
	at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3110)
	at java.base/java.lang.Class.getDeclaredConstructors(Class.java:2314)
	at com.google.inject.spi.InjectionPoint.forConstructorOf(InjectionPoint.java:243)
	at com.google.inject.internal.ConstructorBindingImpl.create(ConstructorBindingImpl.java:96)
	at com.google.inject.internal.InjectorImpl.createUninitializedBinding(InjectorImpl.java:629)
	at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:845)
	at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:772)
	at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:256)
	at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:205)
	at com.google.inject.internal.InjectorImpl.createImplementedByBinding(InjectorImpl.java:732)
	at com.google.inject.internal.InjectorImpl.createUninitializedBinding(InjectorImpl.java:618)
	at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:845)
	at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:772)
	at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:256)
	at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:205)
	at com.google.inject.internal.InjectorImpl.getInternalFactory(InjectorImpl.java:853)
	at com.google.inject.internal.InjectorImpl.createParameterInjector(InjectorImpl.java:925)
	at com.google.inject.internal.InjectorImpl.getParametersInjectors(InjectorImpl.java:913)
	at com.google.inject.internal.ConstructorInjectorStore.createConstructor(ConstructorInjectorStore.java:69)
	at com.google.inject.internal.ConstructorInjectorStore.access$000(ConstructorInjectorStore.java:28)
	at com.google.inject.internal.ConstructorInjectorStore$1.create(ConstructorInjectorStore.java:36)
	at com.google.inject.internal.ConstructorInjectorStore$1.create(ConstructorInjectorStore.java:32)
	at com.google.inject.internal.FailableCache$1.apply(FailableCache.java:39)
	at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:549)
	... 72 more
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
	... 97 more

Unify execution of on-boot scripts

Internal ID: 76

This is an extension of the user-data functionality for EC2 and Azure. The idea is that the support should be across all providers and should be unified in behavior.

One idea is to implement this via ExecBuilder.

This issue should also give the user a way to work around #19

Unify waiting for start ports

Move waiting for start ports from Node constructor to the cloud provider before bootScript handler.

We should also add possibility to wait for ports after a bootScript is executed.

copyFileFromNode can truncate file names

It's been observed that in some cases, file names have been truncated after files being moved with the copy functions. There's no manipulation with the file names in Sunstone, but apparently, tar used to truncate file names in older systems. We need to find a way to work around this. Users of these methods don't necessarily expect that the methods will tar the files prior to copying them.

AzureTest intermittent failures

The AzureTest sometime hangs during node.kill() call (i.e. 2nd suspend of the VM).

We could try if the behavior change depending on deallocating the VM in Azure.

Add possibility to configure the sudo command for the node

When we use Windows images with Cygwin, then sudo is not available, so we should have possibility to omit it completely or replace it with another command - e.g. cygstart.exe --action=runas.

The onBootScript is currently launched with sudo. This could/should be also configurable.

DockerNode copyFromNode() depends on file permissions

Internal ID: 38

DockerNode.copyFromNode() uses Docker copy API internally, so it shouldn't care about file permissions. Nevertheless, the checks in the implemented method executes file-type tests under the configured user. When the container's user doesn't have permissions to see the file, the operation results in FileNotFoundException.

Let's decide

if (it's a bug) {
  fixIt();
} else {
  documentIt();
}

Log retriever capability

A suggestion by @jmartisk

A LogRetriever class could be implemented that would be capable of opening a continuous stream of bytes from a remote text file after being passed the location of the text file and a handler class that would consume the bytes. Declarative approach could be used to specify the handlers and remote files.

@jmartisk could you specify how you imagined this would work? Thanks!

Add support for async node destroying

Internal ID: 96

... and use it e.g. in CreatedNodes.close() method.

@Ladicek commented:

CreatedNodes.close could be made parallel internally, without async node destroying. So unless people are demanding async node destroy itself, I wouldn't add it.

Investigate EC2 machines not getting a public IP address

I've caught this twice today:

10:16:44.907 [ForkJoinPool.commonPool-worker-1] INFO  sunstone.core - Started Amazon EC2 node 'node1' from image us-east-1/ami-6445c773, its public IP address is null

My test then fails because the IP address can't be null:

Caused by: java.lang.IllegalStateException: node does not have IP addresses configured: {redacted}
	at com.google.common.base.Preconditions.checkState(Preconditions.java:199)
	at org.jclouds.compute.util.ConcurrentOpenSocketFinder.checkNodeHasIps(ConcurrentOpenSocketFinder.java:191)
	at org.jclouds.compute.util.ConcurrentOpenSocketFinder.findOpenSocketOnNode(ConcurrentOpenSocketFinder.java:82)
	at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsNode.waitForPorts(AbstractJCloudsNode.java:191)
	at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsNode.waitForStartPorts(AbstractJCloudsNode.java:182)
	at org.wildfly.extras.sunstone.api.impl.ec2.EC2Node.<init>(EC2Node.java:91)
	at org.wildfly.extras.sunstone.api.impl.ec2.EC2CloudProvider.createNodeInternal(EC2CloudProvider.java:73)
	at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.lambda$createNode$0(AbstractJCloudsCloudProvider.java:100)
	at java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1853)
	at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.createNode(AbstractJCloudsCloudProvider.java:95)
	at org.wildfly.extras.sunstone.api.impl.AbstractJCloudsCloudProvider.lambda$createNodeAsync$3(AbstractJCloudsCloudProvider.java:164)
	at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1590)
	... 5 more

I'll assign myself because I intend to investigate this in time, but if someone wants to take it, sure, go ahead. Ask me if you want instructions on how to reproduce it, but know that the fail is random.

SSH requires NOPASSWD sudo permissions from user

In JCloudsSshClient, there is a code

ExecResponse sudoersResult = jcloudsSshClient.exec("sh -c '" + SshUtils.FileType.getShellTestStr("/etc/sudoers") + "'");
SshUtils.FileType sudoersFile = SshUtils.FileType.fromExitCode(sudoersResult.getExitStatus());
if (sudoersFile == SshUtils.FileType.FILE) {
     // see https://bugzilla.redhat.com/show_bug.cgi?id=1020147
     LOGGER.trace("Removing 'Defaults requiretty' from /etc/sudoers so that sudo works without a PTY");
     ExecResponse result = jcloudsSshClient.exec("sudo sed -i -e 's/Defaults    requiretty/#Defaults    requiretty/' /etc/sudoers");
     if (result.getExitStatus() != 0) {
           LOGGER.warn("Failed removing 'Defaults requiretty' from /etc/sudoers, running with sudo might not work");
           LOGGER.debug("stdout: {}", result.getOutput());
           LOGGER.debug("stderr: {}", result.getError());
      }
}

This code requires that the user must have sudo permissions which can be used without password. If normal user tries to connect via SSH, the sudo sed... command hangs for 5 minutes, because sudo asks a password.

I understand why this is needed, but maybe we should consider to move this "hack" somewhere else. Would be possible to remove the line in /etc/sudoers in bootScript?

Support for SSH keys protected by passphrase

Internal ID: 50

It's not possible to use SSH key protected by passphrase. Following exception is thrown:

java.lang.IllegalStateException: Optional.get() cannot be called on an absent value
  at com.google.common.base.Absent.get(Absent.java:47)
  at org.jclouds.crypto.ASN1Codec.createASN1Sequence(ASN1Codec.java:84)
  at org.jclouds.crypto.ASN1Codec.decodeRSAPrivateKey(ASN1Codec.java:64)
  at org.jclouds.crypto.Pems$DecodeRSAPrivateCrtKeySpec.parseResult(Pems.java:238)
  at org.jclouds.crypto.Pems$DecodeRSAPrivateCrtKeySpec.parseResult(Pems.java:233)
  at org.jclouds.crypto.Pems$PemProcessor.getResult(Pems.java:98)
  at com.google.common.io.ByteSource$ByteArrayByteSource.read(ByteSource.java:532)
  at org.jclouds.crypto.Pems.fromPem(Pems.java:195)
  at org.jclouds.crypto.Pems.privateKeySpec(Pems.java:214)
  at org.jclouds.crypto.Pems.privateKeySpec(Pems.java:252)
  at org.jclouds.ssh.SshKeys.fingerprintPrivateKey(SshKeys.java:211)
  at org.jclouds.openstack.nova.v2_0.compute.strategy.ApplyNovaTemplateOptionsCreateNodesWithGroupEncodedIntoNameThenAddToSet.execute(ApplyNovaTemplateOptionsCreateNodesWithGroupEncodedIntoNameThenAddToSet.java:128)
  at org.jclouds.compute.internal.BaseComputeService.createNodesInGroup(BaseComputeService.java:217)

Users hit this on OpenStack, but it can be a general issue.

Workaround exists - to use an unprotected key.

WildFly Node should be able to create management user automaticaly

When using creaper from WildFly node, it uses auth version which expects to have properly defined user on EAP. This user creation should be created automatically to simplify usage.

User doesn't want to need to track how it is defined across different images when it can be handled automatically. There is no issue in having defined multiple management users on EAP/WildFly server => there can be added one by the sunstone library automatically for usage by creaper.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.