/* * Copyright 2014 by SCSK Corporation. * * This file is part of PrimeCloud Controller(TM). * * PrimeCloud Controller(TM) is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * PrimeCloud Controller(TM) is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PrimeCloud Controller(TM). If not, see <http://www.gnu.org/licenses/>. */ package jp.primecloud.auto.iaasgw; import java.io.File; import java.util.ArrayList; import java.util.List; import jp.primecloud.auto.exception.AutoException; import jp.primecloud.auto.log.EventLogger; import jp.primecloud.auto.util.MessageUtils; import jp.primecloud.auto.util.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class IaasGatewayWrapper{ protected Long platformNo; protected Long userNo; protected Log log = LogFactory.getLog(getClass()); protected EventLogger eventLogger; public IaasGatewayWrapper(Long userNo, Long platformNo, EventLogger eventLogger){ this.platformNo = platformNo; this.userNo = userNo; this.eventLogger = eventLogger; } public String excGateway(String gwMod, List<String> gwParams){ try{ //パスは環境によって異なります 引数は //1 : Python.exeのパス Ex."/C:/Python27/python" //2 : 実行モジュールパス Ex."./StartInstance.py" //3 : 利用ユーザ //4 : プラットフォーム //5 : 以降は呼び出すGatewayの仕様に沿ってください List<String> params = new ArrayList<String>(); StringBuilder logstr = new StringBuilder(""); params.add(System.getenv().get("PYTHON_HOME")); params.add(System.getenv().get("IAASGW_HOME") + File.separatorChar + gwMod); params.add(String.valueOf(this.userNo)); params.add(String.valueOf(this.platformNo)); if (gwParams != null && gwParams.size() > 0) { params.addAll(gwParams); for (String item: gwParams) { if(!"".equals(logstr)){ logstr.append(","); } logstr.append(item); } } ProcessBuilder pb = new ProcessBuilder(params); pb.redirectErrorStream(true); Process p = pb.start(); if (log.isInfoEnabled()) { log.info(MessageUtils.format("Call start IaasGateway (Method={0}, Params={1}) ", gwMod, logstr.toString())); } StreamThread is = new StreamThread(p.getInputStream()); StreamThread es = new StreamThread(p.getErrorStream()); is.start(); es.start(); //プロセスの終了待ち p.waitFor(); //InputStreamのスレッド終了待ち is.join(); es.join(); String processOut = ""; if(p.exitValue() == 0){ //標準出力の内容を出力 for (String s : is.getStringList()) { if(s.startsWith("RESULT:")){ //リザルト出力を受け取る processOut = s.replace("RESULT:", ""); } } }else{ //標準エラーの内容を出力 String rastErrMsg = ""; for (String s : es.getStringList()) { rastErrMsg = s; } //エラー出力から取れない場合は標準出力からとる if ("".equals(rastErrMsg)){ for (String s : is.getStringList()) { rastErrMsg = s; } } log.error(MessageUtils.format("IAAS GATEWAY ERR:{0}",rastErrMsg)); throw new IaasgwException(rastErrMsg); } //リザルトはこのような形→itemi1#item2##itemi1#item2 if (log.isInfoEnabled()) { log.info(MessageUtils.format("Call nomal end IaasGateway (Method={0}, Params={1}) ", gwMod, logstr.toString())); } return processOut; }catch (Exception e){ throw handleException(e, gwMod, gwParams); } } public String describeKeyPairs() { return excGateway("DescribeKeyPairs.py", null); } public String describeSecurityGroups(String vpcId) { List<String> params = new ArrayList<String>(); if(vpcId != null && !vpcId.equals("")) { params.add(String.valueOf(vpcId)); } return excGateway("DescribeSecurityGroups.py", params); } public String describeAvailabilityZones() { return excGateway("DescribeAvailabilityZones.py", null); } public String describeSubnets(String vpcId) { List<String> params = new ArrayList<String>(); if(vpcId != null && !vpcId.equals("")) { params.add(String.valueOf(vpcId)); } return excGateway("DescribeSubnets.py", params); } public String describeNetworks() { List<String> params = new ArrayList<String>(); return excGateway("DescribeNetworks.py", params); } public String describeAzureSubnets(String networkName) { List<String> params = new ArrayList<String>(); if(networkName != null && !networkName.equals("")) { params.add(String.valueOf(networkName)); } return excGateway("DescribeAzureSubnets.py", params); } public String describeFlavors(String flavorIds) { List<String> params = new ArrayList<String>(); if(flavorIds != null && !flavorIds.equals("")) { params.add(String.valueOf(flavorIds)); } return excGateway("DescribeFlavors.py", params); } /***************************** * MyCloud *****************************/ //Create VCloud vApp public void createMyCloud(String farmName) { List<String> params = new ArrayList<String>(); params.add(farmName); excGateway("CreateMyCloud.py", params); } //Delete VCloud vApp public void deleteMyCloud(Long farmNo) { List<String> params = new ArrayList<String>(); params.add(String.valueOf(farmNo)); excGateway("DeleteMyCloud.py", params); } /***************************** * Instances *****************************/ public void startInstance(Long instanceNo) { List<String> params = new ArrayList<String>(); params.add(String.valueOf(instanceNo)); excGateway("StartInstance.py", params); } public void stopInstance(Long instanceNo) { List<String> params = new ArrayList<String>(); params.add(String.valueOf(instanceNo)); excGateway("StopInstance.py", params); } public void terminateInstance(String instanceId) { List<String> params = new ArrayList<String>(); params.add(instanceId); excGateway("TerminateInstance.py", params); } /***************************** * Volume *****************************/ public void stopVolume(Long instanceNo, Long volumeNo) { List<String> params = new ArrayList<String>(); params.add(String.valueOf(instanceNo)); params.add(String.valueOf(volumeNo)); excGateway("StopVolume.py", params); } public void startVolume(Long instanceNo, Long volumeNo) { List<String> params = new ArrayList<String>(); params.add(String.valueOf(instanceNo)); params.add(String.valueOf(volumeNo)); excGateway("StartVolume.py", params); } public void deleteVolume(String volumeId) { List<String> params = new ArrayList<String>(); params.add(volumeId); excGateway("DeleteVolume.py", params); } /***************************** * Addresses *****************************/ public String allocateAddress() { List<String> params = new ArrayList<String>(); return excGateway("AllocateAddress.py", params); } public void releaseAddress(String publicIp) { List<String> params = new ArrayList<String>(); params.add(publicIp); excGateway("ReleaseAddress.py", params); } /***************************** * KeyPairs *****************************/ public String createKeyPair(String keyName) { List<String> params = new ArrayList<String>(); params.add(keyName); return excGateway("CreateKeyPair.py", params); } public void deleteKeyPair(String keyName) { List<String> params = new ArrayList<String>(); params.add(keyName); excGateway("DeleteKeyPair.py", params); } public void importKeyPair(String keyName, String publicKeyMaterial) { List<String> params = new ArrayList<String>(); params.add(keyName); params.add(publicKeyMaterial); excGateway("ImportKeyPair.py", params); } /***************************** * Snapshot *****************************/ public String createSnapshot(String volumeId) { List<String> params = new ArrayList<String>(); params.add(volumeId); return excGateway("CreateSnapshot.py", params); } public void deleteSnapshot(String snapshotId) { List<String> params = new ArrayList<String>(); params.add(snapshotId); excGateway("DeleteSnapshot.py", params); } /***************************** * LoadBalancer *****************************/ public void startLoadBalancer(Long loadBalancerNo) { List<String> params = new ArrayList<String>(); params.add(String.valueOf(loadBalancerNo)); excGateway("StartLoadBalancer.py", params); } public void stopLoadBalancer(Long loadBalancerNo) { List<String> params = new ArrayList<String>(); params.add(String.valueOf(loadBalancerNo)); excGateway("StopLoadBalancer.py", params); } public void configureLoadBalancer(Long loadBalancerNo) { List<String> params = new ArrayList<String>(); params.add(String.valueOf(loadBalancerNo)); excGateway("ConfigureLoadBalancer.py", params); } /***************************** * Other *****************************/ public String getPasswordData(String instanceNo) { List<String> params = new ArrayList<String>(); params.add(instanceNo); return excGateway("GetPasswordData.py", params); } public boolean synchronizeCloud(Long farmNo) { List<String> params = new ArrayList<String>(); params.add(String.valueOf(farmNo)); excGateway("SynchronizeCloud.py", params); return true; } /***************************** * handleException *****************************/ protected AutoException handleException(Exception exception, String actionName) { return handleException(exception, actionName, null); } protected AutoException handleException(Exception exception, String actionName, Object param) { if (exception instanceof IaasgwException){ // イベントログ出力 if (eventLogger != null) { eventLogger.error("SystemError", new Object[] { exception.getMessage() }); } } String str = StringUtils.reflectToString(param); return new AutoException("EIAASGWP-300001", exception, actionName, str); } }