mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	Remove maven standard module (which only a few were using) and get ride of maven customization for the projects structure. - moved all directories to src/main/java, src/main/resources, src/main/scripts, src/test/java, src/test/resources - grep scan to search for src/com and src/org left over - grep for <project>/scripts to fix pom.xml configuration - remove custom <build> configuration in pom.xml Signed-off-by: Marc-Aurèle Brothier <m@brothier.org>
		
			
				
	
	
		
			189 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			189 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| // 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 com.cloud.sample;
 | |
| 
 | |
| import java.io.FileInputStream;
 | |
| import java.net.URLEncoder;
 | |
| import java.util.ArrayList;
 | |
| import java.util.Collections;
 | |
| import java.util.List;
 | |
| import java.util.Properties;
 | |
| import java.util.StringTokenizer;
 | |
| 
 | |
| import javax.crypto.Mac;
 | |
| import javax.crypto.spec.SecretKeySpec;
 | |
| 
 | |
| import org.apache.commons.codec.binary.Base64;
 | |
| import org.apache.commons.httpclient.HttpClient;
 | |
| import org.apache.commons.httpclient.HttpMethod;
 | |
| import org.apache.commons.httpclient.methods.GetMethod;
 | |
| 
 | |
| /**
 | |
|  *
 | |
|  *
 | |
|  *
 | |
|  *
 | |
|  *
 | |
|  *
 | |
|  *
 | |
|  *
 | |
|  *
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * Sample CloudStack Management User API Executor.
 | |
|  *
 | |
|  * Prerequisites: - Edit usercloud.properties to include your host, apiUrl, apiKey, and secretKey - Use ./executeUserAPI.sh to
 | |
|  * execute this test class
 | |
|  *
 | |
|  *
 | |
|  */
 | |
| public class UserCloudAPIExecutor {
 | |
|     public static void main(String[] args) {
 | |
|         // Host
 | |
|         String host = null;
 | |
| 
 | |
|         // Fully qualified URL with http(s)://host:port
 | |
|         String apiUrl = null;
 | |
| 
 | |
|         // ApiKey and secretKey as given by your CloudStack vendor
 | |
|         String apiKey = null;
 | |
|         String secretKey = null;
 | |
| 
 | |
|         try {
 | |
|             Properties prop = new Properties();
 | |
|             prop.load(new FileInputStream("usercloud.properties"));
 | |
| 
 | |
|             // host
 | |
|             host = prop.getProperty("host");
 | |
|             if (host == null) {
 | |
|                 System.out.println("Please specify a valid host in the format of http(s)://:/client/api in your usercloud.properties file.");
 | |
|             }
 | |
| 
 | |
|             // apiUrl
 | |
|             apiUrl = prop.getProperty("apiUrl");
 | |
|             if (apiUrl == null) {
 | |
|                 System.out.println("Please specify a valid API URL in the format of command=¶m1=¶m2=... in your usercloud.properties file.");
 | |
|             }
 | |
| 
 | |
|             // apiKey
 | |
|             apiKey = prop.getProperty("apiKey");
 | |
|             if (apiKey == null) {
 | |
|                 System.out.println("Please specify your API Key as provided by your CloudStack vendor in your usercloud.properties file.");
 | |
|             }
 | |
| 
 | |
|             // secretKey
 | |
|             secretKey = prop.getProperty("secretKey");
 | |
|             if (secretKey == null) {
 | |
|                 System.out.println("Please specify your secret Key as provided by your CloudStack vendor in your usercloud.properties file.");
 | |
|             }
 | |
| 
 | |
|             if (apiUrl == null || apiKey == null || secretKey == null) {
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             System.out.println("Constructing API call to host = '" + host + "' with API command = '" + apiUrl + "' using apiKey = '" + apiKey + "' and secretKey = '" +
 | |
|                 secretKey + "'");
 | |
| 
 | |
|             // Step 1: Make sure your APIKey is URL encoded
 | |
|             String encodedApiKey = URLEncoder.encode(apiKey, "UTF-8");
 | |
| 
 | |
|             // Step 2: URL encode each parameter value, then sort the parameters and apiKey in
 | |
|             // alphabetical order, and then toLowerCase all the parameters, parameter values and apiKey.
 | |
|             // Please note that if any parameters with a '&' as a value will cause this test client to fail since we are using
 | |
|             // '&' to delimit
 | |
|             // the string
 | |
|             List<String> sortedParams = new ArrayList<String>();
 | |
|             sortedParams.add("apikey=" + encodedApiKey.toLowerCase());
 | |
|             StringTokenizer st = new StringTokenizer(apiUrl, "&");
 | |
|             String url = null;
 | |
|             boolean first = true;
 | |
|             while (st.hasMoreTokens()) {
 | |
|                 String paramValue = st.nextToken();
 | |
|                 String param = paramValue.substring(0, paramValue.indexOf("="));
 | |
|                 String value = URLEncoder.encode(paramValue.substring(paramValue.indexOf("=") + 1, paramValue.length()), "UTF-8");
 | |
|                 if (first) {
 | |
|                     url = param + "=" + value;
 | |
|                     first = false;
 | |
|                 } else {
 | |
|                     url = url + "&" + param + "=" + value;
 | |
|                 }
 | |
|                 sortedParams.add(param.toLowerCase() + "=" + value.toLowerCase());
 | |
|             }
 | |
|             Collections.sort(sortedParams);
 | |
| 
 | |
|             System.out.println("Sorted Parameters: " + sortedParams);
 | |
| 
 | |
|             // Step 3: Construct the sorted URL and sign and URL encode the sorted URL with your secret key
 | |
|             String sortedUrl = null;
 | |
|             first = true;
 | |
|             for (String param : sortedParams) {
 | |
|                 if (first) {
 | |
|                     sortedUrl = param;
 | |
|                     first = false;
 | |
|                 } else {
 | |
|                     sortedUrl = sortedUrl + "&" + param;
 | |
|                 }
 | |
|             }
 | |
|             System.out.println("sorted URL : " + sortedUrl);
 | |
|             String encodedSignature = signRequest(sortedUrl, secretKey);
 | |
| 
 | |
|             // Step 4: Construct the final URL we want to send to the CloudStack Management Server
 | |
|             // Final result should look like:
 | |
|             // http(s)://://client/api?&apiKey=&signature=
 | |
|             String finalUrl = host + "?" + url + "&apiKey=" + apiKey + "&signature=" + encodedSignature;
 | |
|             System.out.println("final URL : " + finalUrl);
 | |
| 
 | |
|             // Step 5: Perform a HTTP GET on this URL to execute the command
 | |
|             HttpClient client = new HttpClient();
 | |
|             HttpMethod method = new GetMethod(finalUrl);
 | |
|             int responseCode = client.executeMethod(method);
 | |
|             if (responseCode == 200) {
 | |
|                 // SUCCESS!
 | |
|                 System.out.println("Successfully executed command");
 | |
|             } else {
 | |
|                 // FAILED!
 | |
|                 System.out.println("Unable to execute command with response code: " + responseCode);
 | |
|             }
 | |
| 
 | |
|         } catch (Throwable t) {
 | |
|             System.out.println(t);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * 1. Signs a string with a secret key using SHA-1 2. Base64 encode the result 3. URL encode the final result
 | |
|      *
 | |
|      * @param request
 | |
|      * @param key
 | |
|      * @return
 | |
|      */
 | |
|     public static String signRequest(String request, String key) {
 | |
|         try {
 | |
|             Mac mac = Mac.getInstance("HmacSHA1");
 | |
|             SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "HmacSHA1");
 | |
|             mac.init(keySpec);
 | |
|             mac.update(request.getBytes());
 | |
|             byte[] encryptedBytes = mac.doFinal();
 | |
|             return URLEncoder.encode(Base64.encodeBase64String(encryptedBytes), "UTF-8");
 | |
|         } catch (Exception ex) {
 | |
|             System.out.println(ex);
 | |
|         }
 | |
|         return null;
 | |
|     }
 | |
| }
 |