Java tutorial
/* * 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.nifty.process; import java.util.ArrayList; import java.util.List; import jp.primecloud.auto.exception.AutoException; import jp.primecloud.auto.nifty.dto.InstanceDto; import jp.primecloud.auto.nifty.dto.VolumeDto; import jp.primecloud.auto.util.MessageUtils; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.builder.ReflectionToStringBuilder; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.nifty.cloud.sdk.NiftyClientException; import com.nifty.cloud.sdk.NiftyServiceException; import com.nifty.cloud.sdk.disk.NiftyDiskClient; import com.nifty.cloud.sdk.disk.model.AttachVolumeRequest; import com.nifty.cloud.sdk.disk.model.AttachVolumeResult; import com.nifty.cloud.sdk.disk.model.CreateVolumeRequest; import com.nifty.cloud.sdk.disk.model.CreateVolumeResult; import com.nifty.cloud.sdk.disk.model.DeleteVolumeRequest; import com.nifty.cloud.sdk.disk.model.DeleteVolumeResult; import com.nifty.cloud.sdk.disk.model.DescribeVolumesRequest; import com.nifty.cloud.sdk.disk.model.DescribeVolumesResult; import com.nifty.cloud.sdk.disk.model.DetachVolumeRequest; import com.nifty.cloud.sdk.disk.model.DetachVolumeResult; import com.nifty.cloud.sdk.server.NiftyServerClient; import com.nifty.cloud.sdk.server.model.DescribeInstancesRequest; import com.nifty.cloud.sdk.server.model.DescribeInstancesResult; import com.nifty.cloud.sdk.server.model.Instance; import com.nifty.cloud.sdk.server.model.InstanceIdSet; import com.nifty.cloud.sdk.server.model.InstanceStateChange; import com.nifty.cloud.sdk.server.model.Reservation; import com.nifty.cloud.sdk.server.model.RunInstancesRequest; import com.nifty.cloud.sdk.server.model.RunInstancesResult; import com.nifty.cloud.sdk.server.model.StartInstancesRequest; import com.nifty.cloud.sdk.server.model.StartInstancesResult; import com.nifty.cloud.sdk.server.model.StopInstancesRequest; import com.nifty.cloud.sdk.server.model.StopInstancesResult; import com.nifty.cloud.sdk.server.model.TerminateInstancesRequest; import com.nifty.cloud.sdk.server.model.TerminateInstancesResult; /** * <p> * TODO: * </p> * */ public class NiftyProcessClient { protected Log log = LogFactory.getLog(getClass()); protected NiftyServerClient niftyServerClient; protected NiftyDiskClient niftyDiskClient; protected Long platformNo; protected Integer describeInterval; private final static Object lock = new Object(); public NiftyProcessClient(NiftyServerClient niftyServerClient, Long platformNo) { this.niftyServerClient = niftyServerClient; this.platformNo = platformNo; } public NiftyProcessClient(NiftyDiskClient niftyDiskClient, Long platformNo) { this.niftyDiskClient = niftyDiskClient; this.platformNo = platformNo; } public NiftyProcessClient(NiftyServerClient niftyServerClient, Long platformNo, Integer describeInterval) { this(niftyServerClient, platformNo); this.describeInterval = describeInterval; } public NiftyProcessClient(NiftyDiskClient niftyDiskClient, Long platformNo, Integer describeInterval) { this(niftyDiskClient, platformNo); this.describeInterval = describeInterval; } public NiftyServerClient getNiftyServerClient() { return niftyServerClient; } public NiftyDiskClient getNiftyDiskClient() { return niftyDiskClient; } public Long getPlatformNo() { return platformNo; } public List<Instance> describeAllInstances() { // ?? DescribeInstancesRequest request = new DescribeInstancesRequest(); try { Thread.sleep(1000 * describeInterval); } catch (InterruptedException ignore) { } DescribeInstancesResult result = niftyServerClient.describeInstances(request); List<Reservation> reservations = result.getReservations(); List<Instance> instances = new ArrayList<Instance>(); for (Reservation reservation : reservations) { instances.addAll(reservation.getInstances()); } return instances; } public InstanceDto describeInstance(String instanceId) { // ??? DescribeInstancesRequest request = new DescribeInstancesRequest(); request.withInstanceIds(instanceId); try { Thread.sleep(1000 * describeInterval); } catch (InterruptedException ignore) { } DescribeInstancesResult result = niftyServerClient.describeInstances(request); List<Reservation> reservations = result.getReservations(); // API?? if (reservations.size() == 0) { // ????? throw new AutoException("EPROCESS-000601", instanceId); } else if (reservations.size() > 1) { // ?????? AutoException exception = new AutoException("EPROCESS-000602", instanceId); exception.addDetailInfo("result=" + reservations); throw exception; } List<Instance> instances = reservations.get(0).getInstances(); if (instances.size() == 0) { // ????? throw new AutoException("EPROCESS-000601", instanceId); } else if (instances.size() > 1) { // ?????? AutoException exception = new AutoException("EPROCESS-000603", instanceId); exception.addDetailInfo("result=" + instances); throw exception; } return new InstanceDto(instances.get(0)); } public InstanceDto waitInstance(String instanceId) { // ??? String[] stableStatus = new String[] { "running", "stopped" }; // TODO: API??? warning ?API?????? String[] unstableStatus = new String[] { "pending", "warning" };// InstanceDto instance; while (true) { instance = describeInstance(instanceId); String status = instance.getState().getName(); if (ArrayUtils.contains(stableStatus, status)) { break; } if (!ArrayUtils.contains(unstableStatus, status)) { // ??? AutoException exception = new AutoException("EPROCESS-000604", instanceId, status); exception.addDetailInfo("result=" + ReflectionToStringBuilder.toString(instance)); throw exception; } } return instance; } public InstanceDto runInstance(String imageId, String keyName, String instanceType, String password) { // ? RunInstancesRequest request = new RunInstancesRequest(); request.setImageId(imageId); request.setMinCount(1); request.setMaxCount(1); request.setKeyName(keyName); request.setInstanceType(instanceType); request.setAccountingType("2"); // ? request.setPassword(password); request.setDisableApiTermination(false); // API??????? RunInstancesResult result = new RunInstancesResult(); try { result = niftyServerClient.runInstances(request); } catch (NiftyServiceException e) { // throw new AutoException("EPROCESS-000605"); } catch (NiftyClientException e) { // throw new AutoException("EPROCESS-000605"); } if (result.getReservation() == null || result.getReservation().getInstances().size() != 1) { // throw new AutoException("EPROCESS-000605"); } InstanceDto instance = new InstanceDto(result.getReservation().getInstances().get(0)); String instanceId = instance.getInstanceId(); // if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100511", instanceId)); } return instance; } public InstanceDto waitRunInstance(String instanceId) { // TODO: API??RunInstances??????????????????????? long timeout = 600 * 1000L; long startTime = System.currentTimeMillis(); while (true) { boolean exist = false; List<Instance> instances = describeAllInstances(); for (Instance instance : instances) { if (StringUtils.equals(instanceId, instance.getInstanceId())) { exist = true; break; } } if (exist) { break; } if (System.currentTimeMillis() - startTime > timeout) { // ???????? throw new AutoException("EPROCESS-000605", instanceId); } } InstanceDto instance = waitInstance(instanceId); String state = instance.getState().getName(); if (!"running".equals(state)) { // AutoException exception = new AutoException("EPROCESS-000606", instanceId, state); exception.addDetailInfo("result=" + ReflectionToStringBuilder.toString(instance)); throw exception; } // if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100512", instanceId)); } return instance; } public InstanceStateChange startInstance(String instanceId, String instanceType) { // ? StartInstancesRequest request = new StartInstancesRequest(); List<InstanceIdSet> instances = new ArrayList<InstanceIdSet>(); InstanceIdSet instanceIdSet = new InstanceIdSet(); instanceIdSet.setInstanceId(instanceId); instanceIdSet.setInstanceType(instanceType); instances.add(instanceIdSet); request.setInstances(instances); StartInstancesResult result = new StartInstancesResult(); try { result = niftyServerClient.startInstances(request); } catch (NiftyServiceException e) { // throw new AutoException("EPROCESS-000610", instanceId); } catch (NiftyClientException e) { // throw new AutoException("EPROCESS-000610", instanceId); } // API?? if (result.getStartingInstances() == null || result.getStartingInstances().size() == 0) { // throw new AutoException("EPROCESS-000610", instanceId); } else if (result.getStartingInstances().size() > 1) { // ????? AutoException exception = new AutoException("EPROCESS-000612", instanceId); exception.addDetailInfo("result=" + result.getStartingInstances()); throw exception; } // if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100513", instanceId)); } return result.getStartingInstances().get(0); } public InstanceDto waitStartInstance(String instanceId) { // TODO: API??StartInstances?stopped?????????stopped????? long timeout = 600 * 1000L; long startTime = System.currentTimeMillis(); while (true) { InstanceDto instance = describeInstance(instanceId); if (!"stopped".equals(instance.getState().getName())) { break; } if (System.currentTimeMillis() - startTime > timeout) { // ???????? throw new AutoException("EPROCESS-000610", instanceId); } } InstanceDto instance = waitInstance(instanceId); String state = instance.getState().getName(); if (!"running".equals(state)) { // AutoException exception = new AutoException("EPROCESS-000611", instanceId, state); exception.addDetailInfo("result=" + ReflectionToStringBuilder.toString(instance)); throw exception; } // if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100514", instanceId)); } return instance; } public InstanceStateChange stopInstance(String instanceId) { // ?? StopInstancesRequest request = new StopInstancesRequest(); List<String> instanceIds = new ArrayList<String>(); instanceIds.add(instanceId); request.setInstanceIds(instanceIds); request.setForce(false); StopInstancesResult result = new StopInstancesResult(); try { result = niftyServerClient.stopInstances(request); } catch (NiftyServiceException e) { // ? throw new AutoException("EPROCESS-000613", instanceId); } catch (NiftyClientException e) { // ? throw new AutoException("EPROCESS-000613", instanceId); } // API?? if (result.getStoppingInstances() == null || result.getStoppingInstances().size() == 0) { // ? throw new AutoException("EPROCESS-000613", instanceId); } else if (result.getStoppingInstances().size() > 1) { // ?????? AutoException exception = new AutoException("EPROCESS-000615", instanceId); exception.addDetailInfo("result=" + result.getStoppingInstances()); throw exception; } // if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100515", instanceId)); } return result.getStoppingInstances().get(0); } public InstanceDto waitStopInstance(String instanceId) { // TODO: API??StopInstances?running?????????running????? long timeout = 600 * 1000L; long startTime = System.currentTimeMillis(); while (true) { InstanceDto instance = describeInstance(instanceId); if (!"running".equals(instance.getState().getName())) { break; } if (System.currentTimeMillis() - startTime > timeout) { // ????????? throw new AutoException("EPROCESS-000613", instanceId); } } InstanceDto instance = waitInstance(instanceId); String state = instance.getState().getName(); if (!"stopped".equals(state)) { // ? AutoException exception = new AutoException("EPROCESS-000614", instanceId, state); exception.addDetailInfo("result=" + ReflectionToStringBuilder.toString(instance)); throw exception; } // if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100516", instanceId)); } return instance; } public InstanceStateChange terminateInstance(String instanceId) { // ?? TerminateInstancesRequest request = new TerminateInstancesRequest(); List<String> instanceIds = new ArrayList<String>(); instanceIds.add(instanceId); request.setInstanceIds(instanceIds); TerminateInstancesResult result = new TerminateInstancesResult(); try { result = niftyServerClient.terminateInstances(request); } catch (NiftyServiceException e) { // throw new AutoException("EPROCESS-000607", instanceId); } catch (NiftyClientException e) { // throw new AutoException("EPROCESS-000607", instanceId); } // API?? if (result.getTerminatingInstances() == null || result.getTerminatingInstances().size() == 0) { // ? throw new AutoException("EPROCESS-000607", instanceId); } else if (result.getTerminatingInstances().size() > 1) { // ?????? AutoException exception = new AutoException("EPROCESS-000608", instanceId); exception.addDetailInfo("result=" + result.getTerminatingInstances()); throw exception; } // if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100517", instanceId)); } return result.getTerminatingInstances().get(0); } public void waitTerminateInstance(String instanceId) { // TODO: API??StopInstances?running?????????running????? long timeout = 600 * 1000L; long startTime = System.currentTimeMillis(); while (true) { try { describeInstance(instanceId); } catch (AutoException e) { // ???????????????????? if ("EPROCESS-000601".equals(e.getCode())) { break; } throw e; } if (System.currentTimeMillis() - startTime > timeout) { // ???????? throw new AutoException("EPROCESS-000608", instanceId); } } // if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100518", instanceId)); } } public VolumeDto createVolume(Integer size, String instanceId) { // ????? int editSize; editSize = 0; for (int i = 1; i < 11; i++) { if (size == 0) { editSize = 0; break; } if (size <= i * 100) { editSize = i; break; } } // ?1GB1000GB???? if (editSize == 0) { // ?? throw new AutoException("EPROCESS-000617"); } // ?? CreateVolumeRequest request = new CreateVolumeRequest(); request.setSize(String.valueOf(editSize)); request.setDiskType("3"); // Disk200A request.setInstanceId(instanceId); request.setAccountingType("2"); // ? CreateVolumeResult result = new CreateVolumeResult(); try { result = niftyDiskClient.createVolume(request); } catch (NiftyServiceException e) { // ?? throw new AutoException("EPROCESS-000617"); } catch (NiftyClientException e) { // ?? throw new AutoException("EPROCESS-000617"); } if (result.getVolume() == null) { // ?? throw new AutoException("EPROCESS-000617"); } VolumeDto volume = new VolumeDto(result.getVolume()); // if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100521", volume.getVolumeId())); } return volume; } public VolumeDto waitCreateVolume(String volumeId) { // ??? VolumeDto volume = null; volume = waitVolume(volumeId); String status = volume.getStatus(); if (!"in-use".equals(status)) { // ? AutoException exception = new AutoException("EPROCESS-000621", volumeId, status); exception.addDetailInfo("result=" + ReflectionToStringBuilder.toString(volume)); throw exception; } // if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100522", volumeId)); } return volume; } protected VolumeDto waitVolume(String volumeId) { // Volume??? String[] stableStatus = new String[] { "available", "in-use" }; String[] unstableStatus = new String[] { "creating" }; VolumeDto volume = null; while (true) { volume = describeVolume(volumeId); String status; status = volume.getStatus(); if (ArrayUtils.contains(stableStatus, status)) { break; } if (!ArrayUtils.contains(unstableStatus, status)) { // ??? AutoException exception = new AutoException("EPROCESS-000620", volumeId, status); exception.addDetailInfo("result=" + ReflectionToStringBuilder.toString(volume)); throw exception; } } return volume; } protected VolumeDto describeVolume(String volumeId) { // ? DescribeVolumesRequest request = new DescribeVolumesRequest(); List<String> volumeIds = new ArrayList<String>(); volumeIds.add(volumeId); request.setVolumeIds(volumeIds); DescribeVolumesResult result = niftyDiskClient.describeVolumes(request); // API?? if (result.getVolumes() == null || result.getVolumes().size() == 0) { // ????? throw new AutoException("EPROCESS-000618", volumeId); } else if (result.getVolumes().size() > 1) { // ?????? AutoException exception = new AutoException("EPROCESS-000619", volumeId); exception.addDetailInfo("result=" + result.getVolumes()); throw exception; } return new VolumeDto(result.getVolumes().get(0)); } public void attachVolume(String volumeId, String instanceId) { // ?? AttachVolumeRequest request = new AttachVolumeRequest(); request.setVolumeId(volumeId); request.setInstanceId(instanceId); AttachVolumeResult result = new AttachVolumeResult(); try { result = niftyDiskClient.attachVolume(request); } catch (NiftyServiceException e) { // ? throw new AutoException("EPROCESS-000622", instanceId, volumeId); } catch (NiftyClientException e) { // ? throw new AutoException("EPROCESS-000622", instanceId, volumeId); } if (result.getAttachment() == null) { // ? throw new AutoException("EPROCESS-000622", instanceId, volumeId); } // if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100523", volumeId, instanceId)); } } public VolumeDto waitAttachVolume(String volumeId, String instanceId) { // TODO: API?????????????? VolumeDto volume = null; long timeout = 600 * 1000L; long startTime = System.currentTimeMillis(); while (true) { volume = waitVolume(volumeId); if ("in-use".equals(volume.getStatus())) { break; } if (System.currentTimeMillis() - startTime > timeout) { // ????????? throw new AutoException("EPROCESS-000623", instanceId, volumeId, volume.getStatus()); } } if (!"in-use".equals(volume.getStatus())) { // ? AutoException exception = new AutoException("EPROCESS-000623", instanceId, volumeId, volume.getStatus()); exception.addDetailInfo("result=" + ReflectionToStringBuilder.toString(volume)); throw exception; } // if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100524", volumeId, instanceId)); } return volume; } public void detachVolume(String volumeId, String instanceId) { // ?? DetachVolumeRequest request = new DetachVolumeRequest(); request.setVolumeId(volumeId); request.setInstanceId(instanceId); request.setAgreement(true); // DetachVolumeResult result = new DetachVolumeResult(); try { result = niftyDiskClient.detachVolume(request); } catch (NiftyServiceException e) { // ? throw new AutoException("EPROCESS-000624", instanceId, volumeId); } catch (NiftyClientException e) { // ? throw new AutoException("EPROCESS-000624", instanceId, volumeId); } if (result.getAttachment() == null) { // ? throw new AutoException("EPROCESS-000624", instanceId, volumeId); } // if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100525", volumeId, instanceId)); } } public VolumeDto waitDetachVolume(String volumeId, String instanceId) { // TODO: API?????????????? VolumeDto volume = null; long timeout = 600 * 1000L; long startTime = System.currentTimeMillis(); while (true) { volume = waitVolume(volumeId); if ("available".equals(volume.getStatus())) { break; } if (System.currentTimeMillis() - startTime > timeout) { // ????????? throw new AutoException("EPROCESS-000625", instanceId, volumeId, volume.getStatus()); } } if (!"available".equals(volume.getStatus())) { // ? AutoException exception = new AutoException("EPROCESS-000625", instanceId, volumeId, volume.getStatus()); exception.addDetailInfo("result=" + ReflectionToStringBuilder.toString(volume)); throw exception; } // if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100526", volumeId, instanceId)); } return volume; } public void deleteVolume(String volumeId) { // (api??????) synchronized (lock) { // DeleteVolumeRequest request = new DeleteVolumeRequest(); request.setVolumeId(volumeId); DeleteVolumeResult result = new DeleteVolumeResult(); try { result = niftyDiskClient.deleteVolume(request); } catch (NiftyServiceException e) { // throw new AutoException("EPROCESS-000626", volumeId); } catch (NiftyClientException e) { // throw new AutoException("EPROCESS-000626", volumeId); } if (result.getReturn() == null) { // throw new AutoException("EPROCESS-000626", volumeId); } // if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100527", volumeId)); } } } }