Adding the cloud-provisioning project

Project: http://git-wip-us.apache.org/repos/asf/airavata/repo
Commit: http://git-wip-us.apache.org/repos/asf/airavata/commit/975edba0
Tree: http://git-wip-us.apache.org/repos/asf/airavata/tree/975edba0
Diff: http://git-wip-us.apache.org/repos/asf/airavata/diff/975edba0

Branch: refs/heads/master
Commit: 975edba02f87e52fa036cf6f6d21231888e44ced
Parents: 232d346
Author: Mangirish Wagle <[email protected]>
Authored: Tue Apr 12 00:40:12 2016 -0400
Committer: Suresh Marru <[email protected]>
Committed: Fri Apr 15 15:29:57 2016 -0400

----------------------------------------------------------------------
 modules/cloud/cloud-provisioning/README         |   7 +
 modules/cloud/cloud-provisioning/pom.xml        |  52 ++++++
 .../airavata/cloud/intf/CloudInterface.java     |  72 ++++++++
 .../cloud/intf/impl/OpenstackIntfImpl.java      | 172 +++++++++++++++++++
 .../cloud/openstack/OS4JClientProvider.java     | 117 +++++++++++++
 .../apache/airavata/cloud/util/CloudRef.java    |  40 +++++
 .../apache/airavata/cloud/util/Constants.java   |  34 ++++
 .../main/resources/jetstream_openrc.properties  |  29 ++++
 .../airavata/cloud/test/CloudIntfTest.java      | 118 +++++++++++++
 .../src/test/resources/test_data.properties     |  27 +++
 10 files changed, 668 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/airavata/blob/975edba0/modules/cloud/cloud-provisioning/README
----------------------------------------------------------------------
diff --git a/modules/cloud/cloud-provisioning/README 
b/modules/cloud/cloud-provisioning/README
new file mode 100644
index 0000000..1b161a0
--- /dev/null
+++ b/modules/cloud/cloud-provisioning/README
@@ -0,0 +1,7 @@
+This is the initial project created as an interface to various clouds.
+Currently supporting, Openstack on Jetstream using Openstack4j.
+
+To Test Run:-
+1) Replace the credentials in src/main/resources/jetstream_openrc.properties 
with the Jetstream credentials.
+2) Update the publicKeyFile, jetstream_imageId, jetstream_flavorId and 
jetstream_networkId to the local path in 
src/test/resources/test_data.properties. This are the parameters used by the 
unit tests.
+3) Run JUnit Test org.apache.airavata.cloud.test.CloudIntfTest.

http://git-wip-us.apache.org/repos/asf/airavata/blob/975edba0/modules/cloud/cloud-provisioning/pom.xml
----------------------------------------------------------------------
diff --git a/modules/cloud/cloud-provisioning/pom.xml 
b/modules/cloud/cloud-provisioning/pom.xml
new file mode 100644
index 0000000..0554f0c
--- /dev/null
+++ b/modules/cloud/cloud-provisioning/pom.xml
@@ -0,0 +1,52 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+       <modelVersion>4.0.0</modelVersion>
+       <groupId>org.apache.airavata.cloud</groupId>
+       <artifactId>cloud-provisioning</artifactId>
+       <version>0.0.1</version>
+
+       <dependencies>
+               <dependency>
+                       <groupId>org.pacesys</groupId>
+                       <artifactId>openstack4j</artifactId>
+                       <version>2.0.9</version>
+                       <classifier>withdeps</classifier>
+               </dependency>
+               <dependency>
+                       <groupId>junit</groupId>
+                       <artifactId>junit</artifactId>
+                       <version>4.12</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.slf4j</groupId>
+                       <artifactId>slf4j-api</artifactId>
+                       <version>1.7.21</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.slf4j</groupId>
+                       <artifactId>slf4j-simple</artifactId>
+                       <version>1.7.21</version>
+               </dependency>
+       </dependencies>
+
+       <build>
+               <directory>target</directory>
+               <outputDirectory>target/classes</outputDirectory>
+               <finalName>${project.artifactId}-${project.version}</finalName>
+               <testOutputDirectory>target/test-classes</testOutputDirectory>
+               <sourceDirectory>src/main/java</sourceDirectory>
+               <testSourceDirectory>src/test/java</testSourceDirectory>
+               <resources>
+                       <resource>
+                               <directory>src/main/resources</directory>
+                       </resource>
+               </resources>
+               <testResources>
+                       <testResource>
+                               <directory>src/test/resources</directory>
+                       </testResource>
+               </testResources>
+               <plugins>
+               </plugins>
+       </build>
+</project>

http://git-wip-us.apache.org/repos/asf/airavata/blob/975edba0/modules/cloud/cloud-provisioning/src/main/java/org/apache/airavata/cloud/intf/CloudInterface.java
----------------------------------------------------------------------
diff --git 
a/modules/cloud/cloud-provisioning/src/main/java/org/apache/airavata/cloud/intf/CloudInterface.java
 
b/modules/cloud/cloud-provisioning/src/main/java/org/apache/airavata/cloud/intf/CloudInterface.java
new file mode 100644
index 0000000..f9d9520
--- /dev/null
+++ 
b/modules/cloud/cloud-provisioning/src/main/java/org/apache/airavata/cloud/intf/CloudInterface.java
@@ -0,0 +1,72 @@
+/*
+ *
+ * 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.airavata.cloud.intf;
+
+import org.openstack4j.model.compute.Keypair;
+import org.openstack4j.model.compute.Server;
+
+public interface CloudInterface {
+
+       /**
+        * Method to create Server.
+        * @param serverName
+        * @param imageId
+        * @param flavorId
+        * @param networkId
+        * @param keyPairName
+        * @return Server object.
+        */
+       public Server createServer(String serverName, String imageId, String 
flavorId, String networkId, String keyPairName);
+
+       /**
+        * Returns the Server object pertaining to the serverId.
+        * @param serverId
+        * @return
+        */
+       public Server getServer(String serverId);
+
+       /**
+        * Method to delete Server.
+        * @param serverId
+        * @return
+        */
+       public void deleteServer(String serverId);
+
+       /**
+        * Creates a public key pair on the cloud
+        * @param publicKey
+        */
+       public Keypair createKeyPair(String keyPairName, String publicKey);
+
+       /**
+        * Returns the keypair object associated to the keyPairName.
+        * @param keyPairName
+        * @return
+        */
+       public Keypair getKeyPair(String keyPairName);
+
+       /**
+        * Deletes a public key pair on the cloud
+        * @param publicKey
+        */
+       public void deleteKeyPair(String keyPairName);
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/975edba0/modules/cloud/cloud-provisioning/src/main/java/org/apache/airavata/cloud/intf/impl/OpenstackIntfImpl.java
----------------------------------------------------------------------
diff --git 
a/modules/cloud/cloud-provisioning/src/main/java/org/apache/airavata/cloud/intf/impl/OpenstackIntfImpl.java
 
b/modules/cloud/cloud-provisioning/src/main/java/org/apache/airavata/cloud/intf/impl/OpenstackIntfImpl.java
new file mode 100644
index 0000000..cb202c4
--- /dev/null
+++ 
b/modules/cloud/cloud-provisioning/src/main/java/org/apache/airavata/cloud/intf/impl/OpenstackIntfImpl.java
@@ -0,0 +1,172 @@
+/*
+ *
+ * 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.airavata.cloud.intf.impl;
+
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.airavata.cloud.intf.CloudInterface;
+import org.apache.airavata.cloud.openstack.OS4JClientProvider;
+import org.openstack4j.api.Builders;
+import org.openstack4j.api.OSClient;
+import org.openstack4j.model.compute.Keypair;
+import org.openstack4j.model.compute.Server;
+import org.openstack4j.model.compute.ServerCreate;
+
+public class OpenstackIntfImpl implements CloudInterface {
+
+       /** The properties. */
+       private String propertiesFile;
+       private Properties properties;
+
+       OSClient os = null;
+
+       /**
+        * Default Constructor
+        * Initializing the properties.
+        */
+       public OpenstackIntfImpl(String propFile) {
+               try {
+
+                       this.propertiesFile = propFile;
+                       InputStream inputStream = getClass().getClassLoader()
+                                       .getResourceAsStream(propertiesFile);
+
+                       if(inputStream != null) {
+                               properties = new Properties();
+                               properties.load(inputStream);
+                       }
+                       else {
+                               throw new FileNotFoundException("property file: 
" + propertiesFile + " not found!");
+                       }
+
+                       // Initialize the OSClient.
+                       os = OS4JClientProvider.getOSClient(properties);
+               }
+               catch(Exception ex) {
+                       ex.printStackTrace();
+                       // TODO: Check with the team on how to handle 
exceptions.
+               }
+       }
+
+       @Override
+       public Server createServer(String serverName, String imageId, String 
flavorId, String networkId, String keyPairName) {
+               try {
+
+
+                       List<String> srvNet = new LinkedList<String>();
+                       srvNet.add(networkId);
+
+                       ServerCreate sc = Builders.server()
+                                       .name(serverName)
+                                       .flavor(flavorId)
+                                       .image(imageId)
+                                       .networks(srvNet)
+                                       .keypairName(keyPairName)
+                                       .addPersonality("/etc/motd", "Welcome 
to the new VM! Restricted access only")
+                                       .build();
+
+                       //Boot the Server
+                       Server newServer = os.compute().servers().boot(sc);
+
+                       return newServer;
+               }
+               catch( Exception ex ) {
+                       ex.printStackTrace();
+                       // TODO: Check with the team on how to handle 
exceptions.
+                       return null;
+               }
+       }
+
+       @Override
+       public Server getServer(String serverId) {
+               try {
+
+                       Server server = os.compute().servers().get(serverId);
+
+                       return server;
+               }
+               catch( Exception ex ) {
+                       ex.printStackTrace();
+                       // TODO: Check with the team on how to handle 
exceptions.
+                       return null;
+               }
+       }
+
+       @Override
+       public void deleteServer(String serverId) {
+               try {
+
+                       os.compute().servers().delete(serverId);
+               }
+               catch( Exception ex ) {
+                       ex.printStackTrace();
+                       // TODO: Check with the team on how to handle 
exceptions.
+               }
+       }
+
+       @Override
+       public Keypair createKeyPair(String keyPairName, String publicKey) {
+               try {
+
+                       Keypair keyp = 
os.compute().keypairs().create(keyPairName, publicKey);
+
+                       return keyp;
+               }
+               catch( Exception ex ) {
+                       ex.printStackTrace();
+                       // TODO: Check with the team on how to handle 
exceptions.
+                       return null;
+               }
+       }
+
+       @Override
+       public Keypair getKeyPair(String keyPairName) {
+               try {
+
+                       Keypair keyp = os.compute().keypairs().get(keyPairName);
+
+                       return keyp;
+               }
+               catch( Exception ex ) {
+                       ex.printStackTrace();
+                       // TODO: Check with the team on how to handle 
exceptions.
+                       return null;
+               }
+       }
+
+       @Override
+       public void deleteKeyPair(String keyPairName) {
+               try {
+
+                       os.compute().keypairs().delete(keyPairName);
+               }
+               catch( Exception ex ) {
+                       ex.printStackTrace();
+                       // TODO: Check with the team on how to handle 
exceptions.
+               }
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/975edba0/modules/cloud/cloud-provisioning/src/main/java/org/apache/airavata/cloud/openstack/OS4JClientProvider.java
----------------------------------------------------------------------
diff --git 
a/modules/cloud/cloud-provisioning/src/main/java/org/apache/airavata/cloud/openstack/OS4JClientProvider.java
 
b/modules/cloud/cloud-provisioning/src/main/java/org/apache/airavata/cloud/openstack/OS4JClientProvider.java
new file mode 100644
index 0000000..394d1bf
--- /dev/null
+++ 
b/modules/cloud/cloud-provisioning/src/main/java/org/apache/airavata/cloud/openstack/OS4JClientProvider.java
@@ -0,0 +1,117 @@
+/*
+ *
+ * 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.airavata.cloud.openstack;
+
+import java.util.Properties;
+
+import org.apache.airavata.cloud.util.Constants;
+import org.openstack4j.api.OSClient;
+import org.openstack4j.model.common.Identifier;
+import org.openstack4j.openstack.OSFactory;
+
+public class OS4JClientProvider {
+
+       private static OSClient os = null;
+       private static Integer apiVersion = null;
+
+
+       public static OSClient getOSClient(Properties properties) {
+
+               try {
+                       String endPoint = 
properties.getProperty(Constants.OS_AUTH_URL);
+                       String userName = 
properties.getProperty(Constants.OS_USERNAME);
+                       String password = 
properties.getProperty(Constants.OS_PASSWORD);
+                       String domain = 
properties.getProperty(Constants.OS_USER_DOMAIN_NAME);
+                       String apiVersion = 
properties.getProperty(Constants.OS_IDENTITY_API_VERSION);
+
+                       // Initialize client for api version 3.
+                       if( apiVersion.equals("3") ) {
+                               String project = 
properties.getProperty(Constants.OS_PROJECT_DOMAIN_NAME);
+                               getOSClientV3(endPoint, userName, password, 
domain, project);
+                       }
+                       // Initialize client for api version 2.
+                       else if( apiVersion.equals("2") ) {
+                               getOSClientV2(endPoint, userName, password, 
domain);
+                       }
+                       else {
+                               throw new Exception("Non- supported Openstack 
API version " + properties.getProperty("OS_IDENTITY_API_VERSION"));
+                       }
+               }
+               catch(Exception ex) {
+                       ex.printStackTrace();
+                       // TODO: Check with the team on how to handle 
exceptions.
+               }
+               return os;
+       }
+
+       /**
+        * Function that authenticates to openstack using v3 APIs.
+        * @param endPoint
+        * @param userName
+        * @param password
+        * @param domain
+        * @param project
+        * @return OSClient object that can be used for other OpenStack 
operations.
+        */
+       public static void getOSClientV3(String endPoint, String userName, 
String password,
+                       String domain, String project) {
+
+               if(os == null || apiVersion == null ||apiVersion != 3 || ! 
os.getEndpoint().equals(endPoint)) {
+
+                       Identifier domainIdentifier = Identifier.byName(domain);
+                       Identifier projectIdentifier = 
Identifier.byName(project);
+                       os = OSFactory.builderV3()
+                                       .scopeToProject(projectIdentifier, 
domainIdentifier)
+                                       .endpoint(endPoint)
+                                       .credentials(userName, password, 
domainIdentifier)
+                                       .authenticate();
+
+                       apiVersion = 3;
+               }
+       }
+
+       /**
+        * Function that authenticates to openstack using v2 APIs.
+        * @param endPoint
+        * @param userName
+        * @param password
+        * @param domain
+        * @param project
+        * @return OSClient object that can be used for other Openstack 
operations.
+        */
+       public static void getOSClientV2(String endPoint, String userName, 
String password,
+                       String domain) {
+
+               if(os == null || apiVersion == null ||apiVersion != 2 || ! 
os.getEndpoint().equals(endPoint)) {
+
+                       Identifier domainIdentifier = Identifier.byName(domain);
+                       //Identifier projectIdentifier = 
Identifier.byName(project);
+                       os = OSFactory.builderV3()
+                                       //.scopeToProject(projectIdentifier, 
domainIdentifier)
+                                       .endpoint(endPoint)
+                                       .credentials(userName, password, 
domainIdentifier)
+                                       .authenticate();
+
+                       apiVersion = 2;
+               }
+       }
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/975edba0/modules/cloud/cloud-provisioning/src/main/java/org/apache/airavata/cloud/util/CloudRef.java
----------------------------------------------------------------------
diff --git 
a/modules/cloud/cloud-provisioning/src/main/java/org/apache/airavata/cloud/util/CloudRef.java
 
b/modules/cloud/cloud-provisioning/src/main/java/org/apache/airavata/cloud/util/CloudRef.java
new file mode 100644
index 0000000..e2a7c36
--- /dev/null
+++ 
b/modules/cloud/cloud-provisioning/src/main/java/org/apache/airavata/cloud/util/CloudRef.java
@@ -0,0 +1,40 @@
+/*
+ *
+ * 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.airavata.cloud.util;
+
+public enum CloudRef {
+
+       JETSTREAM("jetstream"),
+       AMAZON("amazon"),
+       COMET("comet");
+
+       String cloudType;
+
+       private CloudRef(String type) {
+               this.cloudType = type;
+       }
+
+       @Override
+       public String toString() {
+               return this.cloudType;
+       }
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/975edba0/modules/cloud/cloud-provisioning/src/main/java/org/apache/airavata/cloud/util/Constants.java
----------------------------------------------------------------------
diff --git 
a/modules/cloud/cloud-provisioning/src/main/java/org/apache/airavata/cloud/util/Constants.java
 
b/modules/cloud/cloud-provisioning/src/main/java/org/apache/airavata/cloud/util/Constants.java
new file mode 100644
index 0000000..275a0e7
--- /dev/null
+++ 
b/modules/cloud/cloud-provisioning/src/main/java/org/apache/airavata/cloud/util/Constants.java
@@ -0,0 +1,34 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with tproperties.getProperty("OS_PROJECT_DOMAIN_NAME")his 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.airavata.cloud.util;
+
+public class Constants {
+
+       // OpenStack openrc string constants.
+       public static final String OS_AUTH_URL = "OS_AUTH_URL";
+       public static final String OS_IDENTITY_API_VERSION = 
"OS_IDENTITY_API_VERSION";
+       public static final String OS_USERNAME = "OS_USERNAME";
+       public static final String OS_PASSWORD = "OS_PASSWORD";
+       public static final String OS_USER_DOMAIN_NAME = "OS_USER_DOMAIN_NAME";
+       public static final String OS_PROJECT_DOMAIN_NAME = 
"OS_PROJECT_DOMAIN_NAME";
+
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/975edba0/modules/cloud/cloud-provisioning/src/main/resources/jetstream_openrc.properties
----------------------------------------------------------------------
diff --git 
a/modules/cloud/cloud-provisioning/src/main/resources/jetstream_openrc.properties
 
b/modules/cloud/cloud-provisioning/src/main/resources/jetstream_openrc.properties
new file mode 100644
index 0000000..9487bc1
--- /dev/null
+++ 
b/modules/cloud/cloud-provisioning/src/main/resources/jetstream_openrc.properties
@@ -0,0 +1,29 @@
+#
+#
+# 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.
+#
+
+# Authentication properties
+OS_PROJECT_DOMAIN_NAME=scigap
+OS_USER_DOMAIN_NAME=tacc
+OS_PROJECT_NAME=scigap
+OS_TENANT_NAME=scigap
+OS_USERNAME=scigap
+OS_PASSWORD=xxxxxxxx
+OS_AUTH_URL=https://jblb.jetstream-cloud.org:35357/v3
+OS_IDENTITY_API_VERSION=3

http://git-wip-us.apache.org/repos/asf/airavata/blob/975edba0/modules/cloud/cloud-provisioning/src/test/java/org/apache/airavata/cloud/test/CloudIntfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/cloud/cloud-provisioning/src/test/java/org/apache/airavata/cloud/test/CloudIntfTest.java
 
b/modules/cloud/cloud-provisioning/src/test/java/org/apache/airavata/cloud/test/CloudIntfTest.java
new file mode 100644
index 0000000..71a8a53
--- /dev/null
+++ 
b/modules/cloud/cloud-provisioning/src/test/java/org/apache/airavata/cloud/test/CloudIntfTest.java
@@ -0,0 +1,118 @@
+/*
+ *
+ * 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.airavata.cloud.test;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.util.Properties;
+import java.util.Scanner;
+
+import org.apache.airavata.cloud.intf.CloudInterface;
+import org.apache.airavata.cloud.intf.impl.OpenstackIntfImpl;
+import org.junit.Test;
+import org.openstack4j.model.compute.Keypair;
+import org.openstack4j.model.compute.Server;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CloudIntfTest {
+
+       /** The properties. */
+       private String propertiesFile = "test_data.properties";
+       private Properties properties;
+
+       // Initializing Logger
+       private Logger logger = LoggerFactory.getLogger(CloudIntfTest.class);
+
+       public CloudIntfTest() {
+               try {
+
+                       InputStream inputStream = getClass().getClassLoader()
+                                       .getResourceAsStream(propertiesFile);
+
+                       if(inputStream != null) {
+                               properties = new Properties();
+                               properties.load(inputStream);
+                       }
+                       else {
+                               throw new FileNotFoundException("property file: 
" + propertiesFile + " not found!");
+                       }
+
+               }
+               catch(Exception ex) {
+                       ex.printStackTrace();
+                       // TODO: Check with the team on how to handle 
exceptions.
+               }
+       }
+
+       /**
+        * Test that will create keypair, create server with keypair, delete 
server, delete keypair.
+        */
+       @Test
+       public void jetstreamCreateDeleteServerTest() {
+               try {
+                       CloudInterface cloudIntf = new 
OpenstackIntfImpl("jetstream_openrc.properties");
+                       // Sample data. This can be determined by the inputs 
from Airavata.
+                       String imageId = 
properties.getProperty("jetstream_imageId");
+                       String flavorId = 
properties.getProperty("jetstream_flavorId");
+                       String networkId = 
properties.getProperty("jetstream_networkId");
+
+                       /* Create Keypair */
+                       String publicKeyFile = 
properties.getProperty("publicKeyFile");
+                       String keyPairName = "testKey";
+
+                       Scanner fileScan = new Scanner(new 
FileInputStream(publicKeyFile));
+                       String publicKey = fileScan.nextLine();
+
+                       Keypair kp = cloudIntf.getKeyPair(keyPairName);
+                       if(kp == null) {
+                               kp = cloudIntf.createKeyPair(keyPairName, 
publicKey);
+                       }
+
+                       logger.info("Keypair created/ retrieved: " + 
kp.getFingerprint());
+
+                       /* Create Server */
+                       Server newServer = 
cloudIntf.createServer("AiravataTest", imageId, flavorId, networkId, 
kp.getName());
+                       logger.info("Server Created: " + newServer.getId());
+
+                       /* Delete Server */
+                       cloudIntf.deleteServer(newServer.getId());
+                       logger.info("Server deleted: " + newServer.getId());
+
+                       Server deleted = cloudIntf.getServer(newServer.getId());
+
+                       /* Delete Keypair */
+                       cloudIntf.deleteKeyPair(kp.getName());
+                       logger.info("Keypair deleted: " + kp.getName());
+
+                       assertTrue(newServer != null && deleted == null);
+               }
+               catch( Exception ex ) {
+                       ex.printStackTrace();
+                       fail();
+               }
+       }
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/975edba0/modules/cloud/cloud-provisioning/src/test/resources/test_data.properties
----------------------------------------------------------------------
diff --git 
a/modules/cloud/cloud-provisioning/src/test/resources/test_data.properties 
b/modules/cloud/cloud-provisioning/src/test/resources/test_data.properties
new file mode 100644
index 0000000..2ebf7c7
--- /dev/null
+++ b/modules/cloud/cloud-provisioning/src/test/resources/test_data.properties
@@ -0,0 +1,27 @@
+#
+#
+# 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.
+#
+
+# Common properties
+publicKeyFile=/path/id_rsa.pub
+
+# Jetstream properties
+jetstream_imageId=7048bb41-bbbbb-4caa-9370-xxxxxxxxxxx
+jetstream_flavorId=3
+jetstream_networkId=4367cd20-cccc-4dc2-97e8-kkkkkkkkkkk

Reply via email to