Repository: incubator-ignite
Updated Branches:
  refs/heads/ignite-790 cc08687a9 -> 26fda31b7


ignite-790: fixes, improvements, tests


Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/79861b59
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/79861b59
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/79861b59

Branch: refs/heads/ignite-790
Commit: 79861b59bc5d025e56a55097be731422af1d6e35
Parents: cc08687
Author: Denis Magda <dma...@gridgain.com>
Authored: Fri Apr 24 14:12:18 2015 +0300
Committer: Denis Magda <dma...@gridgain.com>
Committed: Fri Apr 24 14:12:18 2015 +0300

----------------------------------------------------------------------
 modules/cloud/pom.xml                           | 53 +++++++++++
 .../cloud/TcpDiscoveryCloudNodesIpFinder.java   | 90 +++++++++++--------
 .../TcpDiscoveryCloudNodesIpFinderSelfTest.java | 92 ++++++++++++++++++++
 .../tcp/ipfinder/cloud/package-info.java        | 22 +++++
 .../ignite/testsuites/IgniteCloudTestSuite.java | 69 +++++++++++++++
 5 files changed, 289 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/79861b59/modules/cloud/pom.xml
----------------------------------------------------------------------
diff --git a/modules/cloud/pom.xml b/modules/cloud/pom.xml
index 61bdf22..a555dce 100644
--- a/modules/cloud/pom.xml
+++ b/modules/cloud/pom.xml
@@ -51,6 +51,24 @@
         </dependency>
 
         <dependency>
+            <groupId>org.apache.jclouds.labs</groupId>
+            <artifactId>google-compute-engine</artifactId>
+            <version>${jcloud.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.jclouds.labs</groupId>
+            <artifactId>docker</artifactId>
+            <version>${jcloud.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.jclouds.provider</groupId>
+            <artifactId>cloudsigma-zrh</artifactId>
+            <version>1.8.0</version>
+        </dependency>
+
+        <dependency>
             <groupId>org.apache.jclouds.driver</groupId>
             <artifactId>jclouds-sshj</artifactId>
             <version>${jcloud.version}</version>
@@ -62,6 +80,41 @@
             <version>${jcloud.version}</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.ignite</groupId>
+            <artifactId>ignite-core</artifactId>
+            <version>${project.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-beans</artifactId>
+            <version>${spring.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+            <version>${spring.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-core</artifactId>
+            <version>${spring.version}</version>
+            <scope>test</scope>
+        </dependency>
+
     </dependencies>
 
 </project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/79861b59/modules/cloud/src/main/java/org/apache/ignite/spi/discovery/tcp/ipfinder/cloud/TcpDiscoveryCloudNodesIpFinder.java
----------------------------------------------------------------------
diff --git 
a/modules/cloud/src/main/java/org/apache/ignite/spi/discovery/tcp/ipfinder/cloud/TcpDiscoveryCloudNodesIpFinder.java
 
b/modules/cloud/src/main/java/org/apache/ignite/spi/discovery/tcp/ipfinder/cloud/TcpDiscoveryCloudNodesIpFinder.java
index d542b6d..72b23d0 100644
--- 
a/modules/cloud/src/main/java/org/apache/ignite/spi/discovery/tcp/ipfinder/cloud/TcpDiscoveryCloudNodesIpFinder.java
+++ 
b/modules/cloud/src/main/java/org/apache/ignite/spi/discovery/tcp/ipfinder/cloud/TcpDiscoveryCloudNodesIpFinder.java
@@ -17,33 +17,29 @@
 
 package org.apache.ignite.spi.discovery.tcp.ipfinder.cloud;
 
-import com.google.common.base.Charsets;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.io.Files;
-import com.google.inject.Module;
-import org.apache.ignite.internal.IgniteInterruptedCheckedException;
-import org.apache.ignite.internal.util.tostring.GridToStringExclude;
-import org.apache.ignite.internal.util.typedef.internal.U;
-import org.apache.ignite.spi.IgniteSpiConfiguration;
-import org.apache.ignite.spi.IgniteSpiException;
-import org.apache.ignite.spi.discovery.tcp.TcpClientDiscoverySpi;
-import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
-import org.apache.ignite.spi.discovery.tcp.ipfinder.*;
-import org.jclouds.ContextBuilder;
-import org.jclouds.compute.ComputeService;
-import org.jclouds.compute.ComputeServiceContext;
-import org.jclouds.compute.domain.ComputeMetadata;
-import org.jclouds.compute.domain.NodeMetadata;
-import org.jclouds.sshj.config.SshjSshClientModule;
+import com.google.common.base.*;
+import com.google.common.collect.*;
+import com.google.common.io.*;
+import com.google.inject.*;
+
+import org.jclouds.*;
+import org.jclouds.compute.*;
+import org.jclouds.compute.domain.*;
+import org.jclouds.sshj.config.*;
 import org.jclouds.logging.log4j.config.*;
 
-import java.io.File;
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.atomic.AtomicBoolean;
+import org.apache.ignite.internal.*;
+import org.apache.ignite.internal.util.tostring.*;
+import org.apache.ignite.internal.util.typedef.internal.*;
+import org.apache.ignite.spi.*;
+import org.apache.ignite.spi.discovery.tcp.*;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.*;
+
+import java.io.*;
+import java.net.*;
+import java.util.*;
+import java.util.concurrent.*;
+import java.util.concurrent.atomic.*;
 
 /**
  * IP finder for automatic lookup of nodes running in a cloud.
@@ -80,10 +76,14 @@ public class TcpDiscoveryCloudNodesIpFinder extends 
TcpDiscoveryIpFinderAdapter
     /* Cloud specific identity (user name, email address, etc.). */
     private String identity;
 
-    /* Cloud specific credential (password, secrets key, etc.). */
+    /* Cloud specific credential (password, access key, etc.). */
     @GridToStringExclude
     private String credential;
 
+    /* Path to a cloud specific credential. */
+    @GridToStringExclude
+    private String credentialPath;
+
     /* Port to use to connect to nodes across a cluster. */
     private Integer discoveryPort;
 
@@ -168,7 +168,7 @@ public class TcpDiscoveryCloudNodesIpFinder extends 
TcpDiscoveryIpFinderAdapter
 
     /**
      * Sets credential that is used during authentication on the cloud.
-     * Depending on a cloud platform it can be a password, path to a secrets 
file, etc.
+     * Depending on a cloud platform it can be a password or access key.
      *
      * Refer to <a href="http://jclouds.apache.org/guides/";>Apache jclouds 
guide</a> to get concrete information on
      * what is used as an credential for a particular cloud platform.
@@ -181,6 +181,24 @@ public class TcpDiscoveryCloudNodesIpFinder extends 
TcpDiscoveryIpFinderAdapter
     }
 
     /**
+     * Sets the path to a credential that is used during authentication on the 
cloud.
+     *
+     * This method should be used when an access key or private key is stored 
in a plain or PEM file without
+     * a passphrase.
+     * Content of the file, referred by @{code credentialPath}, is fully read 
and used as a access key or private key
+     * during authentication.
+     *
+     * Refer to <a href="http://jclouds.apache.org/guides/";>Apache jclouds 
guide</a> to get concrete information on
+     * what is used as an credential for a particular cloud platform.
+     *
+     * @param credentialPath Path to the credential to use during 
authentication on the cloud.
+     */
+    @IgniteSpiConfiguration(optional = true)
+    public void setCredentialPath(String credentialPath) {
+        this.credentialPath = credentialPath;
+    }
+
+    /**
      * Sets the port that is used to discover other nodes running Apache 
Ignite in the cloud.
      * If doesn't set, a default port number is used.
      *
@@ -205,12 +223,11 @@ public class TcpDiscoveryCloudNodesIpFinder extends 
TcpDiscoveryIpFinderAdapter
                 if (identity == null)
                     throw new IgniteSpiException("Cloud identity is not set.");
 
-                if (provider.equals("google-compute-engine")) {
-                    if (credential == null)
-                        throw new IgniteSpiException("Cloud credential is not 
set.");
-                    else 
-                        credential = getPrivateKeyFromFile(credential);
-                }
+                if (credential != null && credentialPath != null)
+                    throw new IgniteSpiException("Both credential and 
credentialPath are set. Use only one method.");
+
+                if (credentialPath != null)
+                    credential = getPrivateKeyFromFile();
 
                 try {
                     ContextBuilder ctxBuilder = 
ContextBuilder.newBuilder(provider);
@@ -246,15 +263,14 @@ public class TcpDiscoveryCloudNodesIpFinder extends 
TcpDiscoveryIpFinderAdapter
     /**
      * Retrieves a private key from the secrets file.
      *
-     * @param filePath Full path to the file.
      * @return Private key
      */
-    private String getPrivateKeyFromFile(String filePath) throws 
IgniteSpiException {
+    private String getPrivateKeyFromFile() throws IgniteSpiException {
         try {
-            return Files.toString(new File(filePath), Charsets.UTF_8);
+            return Files.toString(new File(credentialPath), Charsets.UTF_8);
         }
         catch (IOException e) {
-            throw new IgniteSpiException("Failed to retrieve a private key 
from the file: " + filePath, e);
+            throw new IgniteSpiException("Failed to retrieve the private key 
from the file: " + credentialPath, e);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/79861b59/modules/cloud/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/cloud/TcpDiscoveryCloudNodesIpFinderSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/cloud/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/cloud/TcpDiscoveryCloudNodesIpFinderSelfTest.java
 
b/modules/cloud/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/cloud/TcpDiscoveryCloudNodesIpFinderSelfTest.java
new file mode 100644
index 0000000..e63d73e
--- /dev/null
+++ 
b/modules/cloud/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/cloud/TcpDiscoveryCloudNodesIpFinderSelfTest.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.spi.discovery.tcp.ipfinder.cloud;
+
+import com.google.common.collect.*;
+import org.apache.ignite.internal.util.typedef.internal.*;
+import org.apache.ignite.spi.discovery.tcp.*;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.*;
+import org.apache.ignite.testsuites.*;
+
+import java.net.*;
+import java.util.*;
+
+/**
+ * TcpDiscoveryCloudNodesIpFinder test.
+ */
+public class TcpDiscoveryCloudNodesIpFinderSelfTest extends
+    TcpDiscoveryIpFinderAbstractSelfTest<TcpDiscoveryCloudNodesIpFinder> {
+    /**
+     * Constructor.
+     *
+     * @throws Exception If any error occurs.
+     */
+    public TcpDiscoveryCloudNodesIpFinderSelfTest() throws Exception {
+        // No-op.
+    }
+
+    @Override protected void beforeTest() throws Exception {
+        // No-op.
+    }
+
+    /* {@inheritDoc} */
+    @Override protected TcpDiscoveryCloudNodesIpFinder ipFinder() throws 
Exception {
+        // No-op.
+        return null;
+    }
+
+    /* {@inheritDoc} */
+    @Override public void testIpFinder() throws Exception {
+        TcpDiscoveryCloudNodesIpFinder ipFinder;
+        String[] providers = {"google-compute-engine", "aws-ec2", 
"rackspace-cloudservers-us"};
+
+        for (String provider : providers) {
+            U.log(log, "Testing provider: " + provider);
+
+            ipFinder = new TcpDiscoveryCloudNodesIpFinder();
+            injectLogger(ipFinder);
+
+            ipFinder.setProvider(provider);
+            ipFinder.setIdentity(IgniteCloudTestSuite.getAccessKey(provider));
+
+            if (provider.equals("google-compute-engine"))
+                
ipFinder.setCredentialPath(IgniteCloudTestSuite.getSecretKey(provider));
+            else {
+                
ipFinder.setCredential(IgniteCloudTestSuite.getSecretKey(provider));
+            }
+
+            ipFinder.setDiscoveryPort(TcpDiscoverySpi.DFLT_PORT);
+
+            Collection<InetSocketAddress> addresses = 
ipFinder.getRegisteredAddresses();
+
+            assert addresses.size() > 0;
+
+            for (InetSocketAddress addr: addresses)
+                U.log(log, "Registered instance: " + 
addr.getAddress().getHostAddress() + ":" + addr.getPort());
+
+            ipFinder.unregisterAddresses(addresses);
+
+            assert addresses.size() == 
ipFinder.getRegisteredAddresses().size();
+
+            ipFinder.registerAddresses(ImmutableList.<InetSocketAddress>of(
+                new InetSocketAddress("192.168.0.1", 
TcpDiscoverySpi.DFLT_PORT)));
+
+            assert addresses.size() == 
ipFinder.getRegisteredAddresses().size();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/79861b59/modules/cloud/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/cloud/package-info.java
----------------------------------------------------------------------
diff --git 
a/modules/cloud/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/cloud/package-info.java
 
b/modules/cloud/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/cloud/package-info.java
new file mode 100644
index 0000000..05aeb1c
--- /dev/null
+++ 
b/modules/cloud/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/cloud/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * <!-- Package description. -->
+ * Contains internal tests or test related classes and interfaces.
+ */
+package org.apache.ignite.spi.discovery.tcp.ipfinder.cloud;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/79861b59/modules/cloud/src/test/java/org/apache/ignite/testsuites/IgniteCloudTestSuite.java
----------------------------------------------------------------------
diff --git 
a/modules/cloud/src/test/java/org/apache/ignite/testsuites/IgniteCloudTestSuite.java
 
b/modules/cloud/src/test/java/org/apache/ignite/testsuites/IgniteCloudTestSuite.java
new file mode 100644
index 0000000..576e4f9
--- /dev/null
+++ 
b/modules/cloud/src/test/java/org/apache/ignite/testsuites/IgniteCloudTestSuite.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.testsuites;
+
+import junit.framework.*;
+import 
org.apache.ignite.spi.discovery.tcp.ipfinder.cloud.TcpDiscoveryCloudNodesIpFinderSelfTest;
+
+/**
+ * Ignite Cloud integration test.
+ */
+public class IgniteCloudTestSuite extends TestSuite {
+    /**
+     * @return Test suite.
+     * @throws Exception Thrown in case of the failure.
+     */
+    public static TestSuite suite() throws Exception {
+        TestSuite suite = new TestSuite("Cloud Integration Test Suite");
+
+        // Cloud Nodes IP finder.
+        suite.addTest(new 
TestSuite(TcpDiscoveryCloudNodesIpFinderSelfTest.class));
+
+        return suite;
+    }
+
+    /**
+     * <a href="http://jclouds.apache.org/guides/google/";>Service Account 
email<a/> for GCE.
+     * <a href="http://jclouds.apache.org/guides/aws/";>Access Key ID</a> for 
Amazon.
+     * <a href="http://jclouds.apache.org/guides/rackspace/";>Username</a> for 
Rackspace.
+     *
+     * @return Access key.
+     */
+    public static String getAccessKey(String provider) {
+        String key = System.getenv("test." + provider + ".access.key");
+
+        assert key != null : "Environment variable 'test." + provider + 
".access.key' is not set";
+        
+        return key;
+    }
+
+    /**
+     * <a href="http://jclouds.apache.org/guides/google/";>Path to pkcs12 
file<a/> for GCE.
+     * <a href="http://jclouds.apache.org/guides/aws/";>Access Key</a> for 
Amazon.
+     * <a href="http://jclouds.apache.org/guides/rackspace/";>API key</a> for 
Rackspace.
+     *
+     * @return Secret key.
+     */
+    public static String getSecretKey(String provider) {
+        String key = System.getenv("test." + provider + ".secret.key");
+
+        assert key != null : "Environment variable 'test." + provider + 
".secret.key' is not set";
+
+        return key;
+    }
+}

Reply via email to