/** * This method returns list of EBS volumes which are available. * @return returns list of EBS volumes which are available. */ public List<Volume> getEBSVolumesAvailable(List<Volume> allEBSVolumes) { List<Volume> ebsVolumesAvailable = new ArrayList<>(); for(Volume volume: allEBSVolumes) { if(volume.getState().equalsIgnoreCase(VolumeState.Available.toString())) { ebsVolumesAvailable.add(volume); } } System.out.println("INFO : Number of EBS volumes not in use : " + ebsVolumesAvailable.size()); List<String> volumeIds = ebsVolumesAvailable.stream().map(e -> e.getVolumeId()).collect(Collectors.toList()); System.out.println("INFO: EBS volumes not in use : " + volumeIds); return ebsVolumesAvailable; }
/** * TODO: メソッドコメント * * @param awsProcessClient * @param instanceNo * @param volumeNo */ public void stopVolume(AwsProcessClient awsProcessClient, Long instanceNo, Long volumeNo) { AwsVolume awsVolume = awsVolumeDao.read(volumeNo); // インスタンスIDがある場合、インスタンスからデタッチする if (StringUtils.isNotEmpty(awsVolume.getInstanceId())) { try { // ボリュームのデタッチ detachVolume(awsProcessClient, instanceNo, volumeNo); // ボリュームのデタッチ待ち waitDetachVolume(awsProcessClient, instanceNo, volumeNo); } catch (AutoException ignore) { // 情報が不整合(インスタンス異常終了時など)の場合、警告ログと後始末のみ行う log.warn(ignore.getMessage()); awsVolume = awsVolumeDao.read(volumeNo); awsVolume.setStatus(VolumeState.Error.toString()); awsVolume.setInstanceId(null); awsVolumeDao.update(awsVolume); } } }
private Volume waitingTempVolumeStep(TaskEntry taskEntry) { checkThreadInterruption(taskEntry); setProgress(taskEntry, TaskProgress.WAITING_TEMP_VOLUME); Volume volumeDest = awsCommunication.waitForVolumeState(awsCommunication.getVolume(taskEntry.getTempVolumeId()), VolumeState.Available); LOG.info("Volume created: {}", volumeDest.toString()); return volumeDest; }
public Volume waitVolume(AwsProcessClient awsProcessClient, String volumeId) { // ボリュームの処理待ち Volume volume; while (true) { try { Thread.sleep(1000L * awsProcessClient.getDescribeInterval()); } catch (InterruptedException ignore) { } volume = describeVolume(awsProcessClient, volumeId); VolumeState state; try { state = VolumeState.fromValue(volume.getState()); } catch (IllegalArgumentException e) { // 予期しないステータス AutoException exception = new AutoException("EPROCESS-000112", volume, volume.getState()); exception.addDetailInfo("result=" + ReflectionToStringBuilder.toString(volume)); throw exception; } // 安定状態のステータスになったら終了 if (state == VolumeState.Available || state == VolumeState.InUse || state == VolumeState.Deleted || state == VolumeState.Error) { break; } } return volume; }
public void waitCreateVolume(AwsProcessClient awsProcessClient, Long instanceNo, Long volumeNo) { AwsVolume awsVolume = awsVolumeDao.read(volumeNo); String volumeId = awsVolume.getVolumeId(); // ボリュームの作成待ち Volume volume; try { volume = awsCommonProcess.waitVolume(awsProcessClient, volumeId); if (!StringUtils.equals(volume.getState(), VolumeState.Available.toString())) { // ボリューム作成失敗時 AutoException exception = new AutoException("EPROCESS-000113", volumeId, volume.getState()); exception.addDetailInfo("result=" + ReflectionToStringBuilder.toString(volume)); throw exception; } // ログ出力 if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100122", volumeId)); } } catch (AutoException e) { // ボリューム作成失敗時 awsVolume = awsVolumeDao.read(volumeNo); awsVolume.setVolumeId(null); awsVolume.setStatus(null); awsVolumeDao.update(awsVolume); throw e; } //イベントログ出力 Component component = null; if (awsVolume.getComponentNo() != null) { component = componentDao.read(awsVolume.getComponentNo()); } Instance instance = instanceDao.read(instanceNo); processLogger.debug(component, instance, "AwsEbsCreateFinish", new Object[] { awsProcessClient.getPlatform().getPlatformName(), awsVolume.getVolumeId(), awsVolume.getSize() }); // データベース更新 awsVolume = awsVolumeDao.read(volumeNo); awsVolume.setStatus(volume.getState()); awsVolumeDao.update(awsVolume); }
public void waitAttachVolume(AwsProcessClient awsProcessClient, Long instanceNo, Long volumeNo) { AwsVolume awsVolume = awsVolumeDao.read(volumeNo); String volumeId = awsVolume.getVolumeId(); Volume volume = null; try { // volume = awsProcessClient.waitAttachVolume(volumeId, instanceId); // TODO: アタッチ情報がすぐに更新されない問題に暫定的に対応 int retry = 6; for (int i = 0; i < retry; i++) { volume = awsCommonProcess.waitVolume(awsProcessClient, volumeId); if (StringUtils.equals(volume.getState(), VolumeState.InUse.toString())) { break; } } if (!StringUtils.equals(volume.getState(), VolumeState.InUse.toString())) { // アタッチに失敗した場合 AutoException exception = new AutoException("EPROCESS-000115", awsVolume.getInstanceId(), volumeId, volume.getState()); exception.addDetailInfo("result=" + ReflectionToStringBuilder.toString(volume)); throw exception; } // ログ出力 if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100124", volumeId, awsVolume.getInstanceId())); } } catch (AutoException e) { // アタッチに失敗した場合 awsVolume = awsVolumeDao.read(volumeNo); awsVolume.setStatus(VolumeState.Error.toString()); awsVolume.setInstanceId(null); awsVolumeDao.update(awsVolume); throw e; } //イベントログ出力 Component component = null; if (awsVolume.getComponentNo() != null) { component = componentDao.read(awsVolume.getComponentNo()); } Instance instance = instanceDao.read(instanceNo); processLogger.debug(component, instance, "AwsEbsAttachFinish", new Object[] { instance.getInstanceName(), awsVolume.getVolumeId(), awsVolume.getDevice() }); // データベースの更新 awsVolume = awsVolumeDao.read(volumeNo); awsVolume.setStatus(volume.getState()); awsVolumeDao.update(awsVolume); }
public void waitDetachVolume(AwsProcessClient awsProcessClient, Long instanceNo, Long volumeNo) { AwsVolume awsVolume = awsVolumeDao.read(volumeNo); String volumeId = awsVolume.getVolumeId(); String instanceId = awsVolume.getInstanceId(); Volume volume = null; try { // TODO: アタッチ情報がすぐに更新されない問題に暫定的に対応 int retry = 6; for (int i = 0; i < retry; i++) { volume = awsCommonProcess.waitVolume(awsProcessClient, volumeId); if (StringUtils.equals(volume.getState(), VolumeState.Available.toString())) { break; } } if (!StringUtils.equals(volume.getState(), VolumeState.Available.toString())) { // デタッチに失敗した場合 AutoException exception = new AutoException("EPROCESS-000116", instanceId, volumeId, volume.getState()); exception.addDetailInfo("result=" + ReflectionToStringBuilder.toString(volume)); throw exception; } // ログ出力 if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100126", volumeId, instanceId)); } } catch (AutoException e) { // デタッチに失敗した場合 awsVolume = awsVolumeDao.read(volumeNo); awsVolume.setStatus(VolumeState.Error.toString()); awsVolume.setInstanceId(null); awsVolumeDao.update(awsVolume); throw e; } //イベントログ出力 Component component = null; if (awsVolume.getComponentNo() != null) { component = componentDao.read(awsVolume.getComponentNo()); } Instance instance = instanceDao.read(instanceNo); processLogger.debug(component, instance, "AwsEbsDetachFinish", new Object[] { instance.getInstanceName(), awsVolume.getVolumeId(), awsVolume.getDevice() }); // データベースの更新 awsVolume = awsVolumeDao.read(volumeNo); awsVolume.setStatus(volume.getState()); awsVolume.setInstanceId(null); awsVolumeDao.update(awsVolume); }