/* * 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.process.puppet; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; import jp.primecloud.auto.common.component.FreeMarkerGenerator; import jp.primecloud.auto.common.component.PasswordEncryptor; import jp.primecloud.auto.common.constant.PCCConstant; import jp.primecloud.auto.common.log.LoggingUtils; import jp.primecloud.auto.common.status.ComponentInstanceStatus; import jp.primecloud.auto.config.Config; import jp.primecloud.auto.entity.crud.AwsInstance; import jp.primecloud.auto.entity.crud.AwsVolume; import jp.primecloud.auto.entity.crud.AzureDisk; import jp.primecloud.auto.entity.crud.AzureInstance; import jp.primecloud.auto.entity.crud.CloudstackInstance; import jp.primecloud.auto.entity.crud.CloudstackVolume; import jp.primecloud.auto.entity.crud.Component; import jp.primecloud.auto.entity.crud.ComponentConfig; import jp.primecloud.auto.entity.crud.ComponentInstance; import jp.primecloud.auto.entity.crud.ComponentType; import jp.primecloud.auto.entity.crud.Farm; import jp.primecloud.auto.entity.crud.Image; import jp.primecloud.auto.entity.crud.Instance; import jp.primecloud.auto.entity.crud.InstanceConfig; import jp.primecloud.auto.entity.crud.NiftyInstance; import jp.primecloud.auto.entity.crud.NiftyVolume; import jp.primecloud.auto.entity.crud.OpenstackInstance; import jp.primecloud.auto.entity.crud.OpenstackVolume; import jp.primecloud.auto.entity.crud.PccSystemInfo; import jp.primecloud.auto.entity.crud.Platform; import jp.primecloud.auto.entity.crud.PlatformAws; import jp.primecloud.auto.entity.crud.PuppetInstance; import jp.primecloud.auto.entity.crud.User; import jp.primecloud.auto.entity.crud.VcloudDisk; import jp.primecloud.auto.entity.crud.VcloudInstance; import jp.primecloud.auto.entity.crud.VmwareDisk; import jp.primecloud.auto.entity.crud.VmwareInstance; import jp.primecloud.auto.exception.AutoException; import jp.primecloud.auto.exception.MultiCauseException; import jp.primecloud.auto.iaasgw.IaasGatewayFactory; import jp.primecloud.auto.iaasgw.IaasGatewayWrapper; import jp.primecloud.auto.log.EventLogger; import jp.primecloud.auto.nifty.process.NiftyProcessClient; import jp.primecloud.auto.nifty.process.NiftyProcessClientFactory; import jp.primecloud.auto.process.ComponentConstants; import jp.primecloud.auto.process.ComponentProcessContext; import jp.primecloud.auto.process.ProcessLogger; import jp.primecloud.auto.process.aws.AwsProcessClient; import jp.primecloud.auto.process.aws.AwsProcessClientFactory; import jp.primecloud.auto.process.aws.AwsVolumeProcess; import jp.primecloud.auto.process.hook.ProcessHook; import jp.primecloud.auto.process.nifty.NiftyVolumeProcess; import jp.primecloud.auto.process.vmware.VmwareDiskProcess; import jp.primecloud.auto.process.vmware.VmwareProcessClient; import jp.primecloud.auto.process.vmware.VmwareProcessClientFactory; import jp.primecloud.auto.process.zabbix.ZabbixHostProcess; import jp.primecloud.auto.puppet.PuppetClient; import jp.primecloud.auto.service.ServiceSupport; import jp.primecloud.auto.util.MessageUtils; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.StringUtils; /** * <p> * TODO: クラスコメントを記述 * </p> * */ public class PuppetComponentProcess extends ServiceSupport { protected File manifestDir; protected FreeMarkerGenerator freeMarkerGenerator; protected PuppetClient puppetClient; protected IaasGatewayFactory iaasGatewayFactory; protected AwsProcessClientFactory awsProcessClientFactory; protected AwsVolumeProcess awsVolumeProcess; protected VmwareProcessClientFactory vmwareProcessClientFactory; protected ExecutorService executorService; protected VmwareDiskProcess vmwareDiskProcess; protected ZabbixHostProcess zabbixHostProcess; protected PuppetNodeProcess puppetNodeProcess; protected ProcessLogger processLogger; protected EventLogger eventLogger; protected String componentTypeName; protected String awsVolumeDevice; protected String cloudStackDiskofferingid; protected Integer vmwareDiskScsiId; protected Integer vcloudDiskUnitNo; protected NiftyProcessClientFactory niftyProcessClientFactory; protected NiftyVolumeProcess niftyVolumeProcess; protected ProcessHook processHook; public String getComponentTypeName() { return componentTypeName; } public void createNodeManifest(ComponentProcessContext context) { // ノード用マニフェストの生成 Farm farm = farmDao.read(context.getFarmNo()); User user = userDao.read(farm.getUserNo()); List<Component> components = componentDao.readByFarmNo(context.getFarmNo()); Map<Long, Component> componentMap = new HashMap<Long, Component>(); for (Component component: components) { componentMap.put(component.getComponentNo(), component); } List<Instance> instances = instanceDao.readInInstanceNos(context.getRunningInstanceNos()); Map<Long, Instance> instanceMap = new HashMap<Long, Instance>(); for (Instance instance: instances) { instanceMap.put(instance.getInstanceNo(), instance); } List<ComponentType> componentTypes = componentTypeDao.readAll(); Map<Long, ComponentType> componentTypeMap = new HashMap<Long, ComponentType>(); for (ComponentType componentType: componentTypes) { componentTypeMap.put(componentType.getComponentTypeNo(), componentType); } // myCloud内のデータベースサーバリスト List<Instance> allDbInstances = new ArrayList<Instance>(); // myCloud内のアプリケーションサーバリスト List<Instance> allApInstances = new ArrayList<Instance>(); // myCloud内のWEBサーバリスト List<Instance> allWebInstances = new ArrayList<Instance>(); // 自サービスと同じデータベースサーバリストのマップ Map<Long, List<Instance>> dbInstancesMap = new HashMap<Long, List<Instance>>(); // 自サービスと同じアプリケーションサーバのマップ Map<Long, List<Instance>> apInstancesMap = new HashMap<Long, List<Instance>>(); // 自サービスと同じWEBサーバリストのマップ Map<Long, List<Instance>> webInstancesMap = new HashMap<Long, List<Instance>>(); // myCloud内のすべてのコンポーネント List<ComponentInstance> allComponentInstances = componentInstanceDao.readInInstanceNos(context.getRunningInstanceNos()); for (ComponentInstance componentInstance : allComponentInstances) { // 無効な関連は除外 if (BooleanUtils.isNotTrue(componentInstance.getEnabled()) || BooleanUtils.isNotTrue(componentInstance.getAssociate())) { continue; } Component component = componentMap.get(componentInstance.getComponentNo()); Instance instance = instanceMap.get(componentInstance.getInstanceNo()); ComponentType componentType = componentTypeMap.get(component.getComponentTypeNo()); if (ComponentConstants.LAYER_NAME_DB.equals(componentType.getLayer())) { allDbInstances.add(instance); List<Instance> dbInstances = dbInstancesMap.get(component.getComponentNo()); if (dbInstances == null) { dbInstances = new ArrayList<Instance>(); } dbInstances.add(instance); dbInstancesMap.put(component.getComponentNo(), dbInstances); } else if (ComponentConstants.LAYER_NAME_AP_JAVA.equals(componentType.getLayer())) { allApInstances.add(instance); List<Instance> apInstances = apInstancesMap.get(component.getComponentNo()); if (apInstances == null) { apInstances = new ArrayList<Instance>(); } apInstances.add(instance); apInstancesMap.put(component.getComponentNo(), apInstances); } else if (ComponentConstants.LAYER_NAME_WEB.equals(componentType.getLayer())) { allWebInstances.add(instance); List<Instance> webInstances = webInstancesMap.get(component.getComponentNo()); if (webInstances == null) { webInstances = new ArrayList<Instance>(); } webInstances.add(instance); webInstancesMap.put(component.getComponentNo(), webInstances); } } for (Instance instance : instances) { Platform platform = platformDao.read(instance.getPlatformNo()); //OSがwindowsの場合は作成しない Image image = imageDao.read(instance.getImageNo()); if (StringUtils.startsWithIgnoreCase(image.getOs(), PCCConstant.OS_NAME_WIN)) { continue; } Map<String, Object> rootMap = new HashMap<String, Object>(); rootMap.put("farm", farm); rootMap.put("user", user); rootMap.put("components", components); rootMap.put("instance", instance); rootMap.put("platform", platform); // 関連するコンポーネント List<Component> associatedComponents = new ArrayList<Component>(); List<ComponentType> associatedComponentTypes = new ArrayList<ComponentType>(); List<ComponentInstance> componentInstances = componentInstanceDao .readByInstanceNo(instance.getInstanceNo()); for (ComponentInstance componentInstance : componentInstances) { // 無効な関連は除外 if (BooleanUtils.isNotTrue(componentInstance.getEnabled()) || BooleanUtils.isNotTrue(componentInstance.getAssociate())) { continue; } Component component = componentMap.get(componentInstance.getComponentNo()); ComponentType componentType = componentTypeMap.get(component.getComponentTypeNo()); associatedComponents.add(component); associatedComponentTypes.add(componentType); } rootMap.put("associatedComponents", associatedComponents); rootMap.put("associatedComponentTypes", associatedComponentTypes); // 自サービスと同じデータベースサーバリスト List<Instance> dbInstances = new ArrayList<Instance>(); // 自サービスと同じアプリケーションサーバリスト List<Instance> apInstances = new ArrayList<Instance>(); // 自サービスと同じWEBサーバリスト List<Instance> webInstances = new ArrayList<Instance>(); for (Component component: associatedComponents) { ComponentType componentType = componentTypeMap.get(component.getComponentTypeNo()); if (ComponentConstants.LAYER_NAME_DB.equals(componentType.getLayer())) { dbInstances = dbInstancesMap.get(component.getComponentNo()); } else if (ComponentConstants.LAYER_NAME_AP_JAVA.equals(componentType.getLayer())) { apInstances = apInstancesMap.get(component.getComponentNo()); } else if (ComponentConstants.LAYER_NAME_WEB.equals(componentType.getLayer())) { webInstances = webInstancesMap.get(component.getComponentNo()); } } rootMap.put("dbInstances", dbInstances); rootMap.put("apInstances", apInstances); rootMap.put("webInstances", webInstances); rootMap.put("allDbInstances", allDbInstances); rootMap.put("allApInstances", allApInstances); rootMap.put("allWebInstances", allWebInstances); File manifestFile = new File(manifestDir, instance.getFqdn() + ".pp"); generateManifest("node.ftl", rootMap, manifestFile, "UTF-8"); } } public void startComponent(Long componentNo, ComponentProcessContext context) { // コンポーネントを開始するサーバがない場合はスキップ List<Long> instanceNos = context.getEnableInstanceNoMap().get(componentNo); if (instanceNos == null || instanceNos.isEmpty()) { return; } Component component = componentDao.read(componentNo); if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100211", componentNo, component.getComponentName())); } // コンポーネントの開始処理を実行 configureInstances(componentNo, context, true, instanceNos); if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100212", componentNo, component.getComponentName())); } } public void stopComponent(Long componentNo, ComponentProcessContext context) { // コンポーネントを停止するサーバがない場合はスキップ List<Long> instanceNos = context.getDisableInstanceNoMap().get(componentNo); if (instanceNos == null || instanceNos.isEmpty()) { return; } Component component = componentDao.read(componentNo); if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100213", componentNo, component.getComponentName())); } try { // コンポーネントの停止処理を実行 configureInstances(componentNo, context, false, instanceNos); } catch (RuntimeException ignore) { // 処理に失敗した場合、警告ログを出力する log.warn(ignore.getMessage()); } if (log.isInfoEnabled()) { log.info(MessageUtils.getMessage("IPROCESS-100214", componentNo, component.getComponentName())); } } protected void configureInstances(final Long componentNo, final ComponentProcessContext context, final boolean start, List<Long> instanceNos) { Component component = componentDao.read(componentNo); List<Instance> instances = instanceDao.readInInstanceNos(instanceNos); Map<Long, Instance> instanceMap = new HashMap<Long, Instance>(); for (Instance instance : instances) { instanceMap.put(instance.getInstanceNo(), instance); } List<ComponentInstance> componentInstances = componentInstanceDao.readByComponentNo(componentNo); Map<Long, ComponentInstance> componentInstanceMap = new HashMap<Long, ComponentInstance>(); for (ComponentInstance componentInstance : componentInstances) { componentInstanceMap.put(componentInstance.getInstanceNo(), componentInstance); } // 停止を行う場合、既に停止しているサービスは除外する if (!start) { List<Long> tmpInstanceNos = new ArrayList<Long>(); for (Long instanceNo : instanceNos) { ComponentInstance componentInstance = componentInstanceMap.get(instanceNo); ComponentInstanceStatus status = ComponentInstanceStatus.fromStatus(componentInstance.getStatus()); if (status == ComponentInstanceStatus.STOPPED) { // 設定フラグを無効にする if (BooleanUtils.isTrue(componentInstance.getConfigure())) { componentInstance.setConfigure(false); componentInstanceDao.update(componentInstance); } } else { tmpInstanceNos.add(instanceNo); } } instanceNos = tmpInstanceNos; } if (instanceNos.isEmpty()) { return; } // フック処理の実行 Farm farm = farmDao.read(component.getFarmNo()); if (start) { processHook.execute("pre-start-component", farm.getUserNo(), farm.getFarmNo(), componentNo); } else { processHook.execute("pre-stop-component", farm.getUserNo(), farm.getFarmNo(), componentNo); } for (Long instanceNo : instanceNos) { ComponentInstance componentInstance = componentInstanceMap.get(instanceNo); ComponentInstanceStatus status = ComponentInstanceStatus.fromStatus(componentInstance.getStatus()); // ステータスを変更 if (start) { if (status == ComponentInstanceStatus.RUNNING) { status = ComponentInstanceStatus.CONFIGURING; } else { status = ComponentInstanceStatus.STARTING; } } else { status = ComponentInstanceStatus.STOPPING; } componentInstance.setStatus(status.toString()); componentInstanceDao.update(componentInstance); // イベントログ出力 if (BooleanUtils.isTrue(componentInstance.getConfigure())) { Instance instance = instanceMap.get(instanceNo); if (status == ComponentInstanceStatus.STARTING) { processLogger.info(component, instance, "ComponentStart", null); } else if (status == ComponentInstanceStatus.CONFIGURING) { processLogger.info(component, instance, "ComponentReload", null); } else if (status == ComponentInstanceStatus.STOPPING) { processLogger.info(component, instance, "ComponentStop", null); } } } // マニフェスト用情報モデルの作成 final Map<String, Object> rootMap = createComponentMap(componentNo, context, start); // 並列実行 List<Callable<Void>> callables = new ArrayList<Callable<Void>>(); final Map<String, Object> loggingContext = LoggingUtils.getContext(); for (final Long instanceNo : instanceNos) { Callable<Void> callable = new Callable<Void>() { @Override public Void call() throws Exception { LoggingUtils.setContext(loggingContext); try { doConfigureInstance(componentNo, context, start, instanceNo, rootMap); } catch (Exception e) { log.error(e.getMessage(), e); // イベントログ出力 eventLogger.error("SystemError", new Object[] { e.getMessage() }); throw e; } finally { LoggingUtils.removeContext(); } return null; } }; callables.add(callable); } try { List<Future<Void>> futures = executorService.invokeAll(callables); // 並列実行で例外発生時の処理 List<Throwable> throwables = new ArrayList<Throwable>(); for (Future<Void> future : futures) { try { future.get(); } catch (ExecutionException e) { throwables.add(e.getCause()); } catch (InterruptedException ignore) { } } // 例外を処理する if (throwables.size() > 0) { throw new MultiCauseException(throwables.toArray(new Throwable[throwables.size()])); } } catch (InterruptedException e) { } finally { // フック処理の実行 if (start) { processHook.execute("post-start-component", farm.getUserNo(), farm.getFarmNo(), componentNo); } else { processHook.execute("post-stop-component", farm.getUserNo(), farm.getFarmNo(), componentNo); } } } private void doConfigureInstance(Long componentNo, ComponentProcessContext context, boolean start, Long instanceNo, Map<String, Object> rootMap) { Component component = componentDao.read(componentNo); Instance instance = instanceDao.read(instanceNo); // ログ用情報を格納 LoggingUtils.setInstanceNo(instanceNo); LoggingUtils.setInstanceName(instance.getInstanceName()); LoggingUtils.setInstanceType(processLogger.getInstanceType(instanceNo, instance.getPlatformNo())); LoggingUtils.setPlatformNo(instance.getPlatformNo()); if (log.isInfoEnabled()) { String code = start ? "IPROCESS-100221" : "IPROCESS-100223"; log.info(MessageUtils.getMessage(code, componentNo, instanceNo, component.getComponentName(), instance .getInstanceName())); } // マニフェストファイルのリストア restoreManifest(componentNo, instanceNo); try { configureInstance(componentNo, context, start, instanceNo, rootMap); } catch (RuntimeException e) { if (start) { ComponentInstance componentInstance = componentInstanceDao.read(componentNo, instanceNo); ComponentInstanceStatus status = ComponentInstanceStatus.fromStatus(componentInstance.getStatus()); // イベントログ出力 if (BooleanUtils.isTrue(componentInstance.getConfigure())) { if (status == ComponentInstanceStatus.STARTING) { processLogger.info(component, instance, "ComponentStartFail", null); } else if (status == ComponentInstanceStatus.CONFIGURING) { processLogger.info(component, instance, "ComponentReloadFail", null); } else if (status == ComponentInstanceStatus.STOPPING) { processLogger.info(component, instance, "ComponentStopFail", null); } } // ステータス更新 if (status != ComponentInstanceStatus.WARNING || BooleanUtils.isTrue(componentInstance.getConfigure())) { componentInstance.setStatus(ComponentInstanceStatus.WARNING.toString()); componentInstance.setConfigure(false); componentInstanceDao.update(componentInstance); } throw e; } else { // 処理に失敗した場合、警告ログを出力する log.warn(e.getMessage()); } } finally { if (start) { // マニフェストファイルのバックアップ backupManifest(componentNo, instanceNo); } else { // コンポーネントのマニフェスト削除 deleteManifest(componentNo, instanceNo); } } ComponentInstance componentInstance = componentInstanceDao.read(componentNo, instanceNo); ComponentInstanceStatus status = ComponentInstanceStatus.fromStatus(componentInstance.getStatus()); // イベントログ出力 if (BooleanUtils.isTrue(componentInstance.getConfigure())) { if (status == ComponentInstanceStatus.STARTING) { processLogger.info(component, instance, "ComponentStartFinish", null); } else if (status == ComponentInstanceStatus.CONFIGURING) { processLogger.info(component, instance, "ComponentReloadFinish", null); } else if (status == ComponentInstanceStatus.STOPPING) { processLogger.info(component, instance, "ComponentStopFinish", null); } } // ステータスを変更 if (start) { if (status == ComponentInstanceStatus.CONFIGURING || status == ComponentInstanceStatus.STARTING || BooleanUtils.isTrue(componentInstance.getConfigure())) { componentInstance.setStatus(ComponentInstanceStatus.RUNNING.toString()); componentInstance.setConfigure(false); componentInstanceDao.update(componentInstance); } } else { if (status == ComponentInstanceStatus.STOPPING || BooleanUtils.isTrue(componentInstance.getConfigure())) { componentInstance.setStatus(ComponentInstanceStatus.STOPPED.toString()); componentInstance.setConfigure(false); componentInstanceDao.update(componentInstance); } } if (!start) { // コンポーネントとインスタンスの関連付けを削除 deleteAssociate(componentNo, instanceNo); } if (log.isInfoEnabled()) { String code = start ? "IPROCESS-100222" : "IPROCESS-100224"; log.info(MessageUtils.getMessage(code, componentNo, instanceNo, component.getComponentName(), instance .getInstanceName())); } } protected void configureInstance(Long componentNo, ComponentProcessContext context, boolean start, Long instanceNo, Map<String, Object> rootMap) { Component component = componentDao.read(componentNo); Instance instance = instanceDao.read(instanceNo); ComponentInstance componentInstance = componentInstanceDao.read(componentNo, instanceNo); if (start) { // ボリュームの開始処理 startVolume(componentNo, instanceNo); } else { // Zabbixテンプレートの終了処理 stopZabbixTemplate(componentNo, instanceNo); } // マニフェスト用情報モデルにインスタンス情報固有を追加 rootMap = createInstanceMap(componentNo, context, start, instanceNo, rootMap); // マニフェストの出力 ComponentType componentType = componentTypeDao.read(component.getComponentTypeNo()); File manifestName = new File(manifestDir, instance.getFqdn() + "." + component.getComponentName() + ".pp"); // 既にあるマニフェストファイルのダイジェストを求める String digest = getFileDigest(manifestName, "UTF-8"); // コンポーネント停止時でマニフェストが存在しない場合、スキップする if (digest == null && !start) { return; } // マニフェストの生成 String templateName = componentType.getComponentTypeName() + ".ftl"; generateManifest(templateName, rootMap, manifestName, "UTF-8"); // 強制設定をしない場合 if (BooleanUtils.isNotTrue(componentInstance.getConfigure())) { // 既にあるマニフェストファイルのダイジェストと、生成したマニフェストファイルのダイジェストと比較する if (digest != null) { String newDigest = getFileDigest(manifestName, "UTF-8"); if (digest.equals(newDigest)) { // マニフェストファイルに変更がない場合 if (log.isDebugEnabled()) { log.debug(MessageUtils.format("Not changed manifest.(file={0})", manifestName.getName())); } return; } } } // Puppetクライアントの設定更新指示 runPuppet(instance, component); if (!start) { // ボリュームの終了処理 stopVolume(componentNo, instanceNo); } else { // Zabbixテンプレートの開始処理 startZabbixTemplate(componentNo, instanceNo); } } protected void generateManifest(String templateName, Map<String, Object> rootMap, File file, String encoding) { String data = freeMarkerGenerator.generate(templateName, rootMap); // 改行コードの変換(PuppetはLFでないと読み込めないことへの対応) data = data.replaceAll("\r\n", "\n"); // 出力先ディレクトリの作成 if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } // ファイル出力 try { FileUtils.writeStringToFile(file, data, encoding); } catch (IOException e) { throw new RuntimeException(e); } } protected void runPuppet(Instance instance, Component component) { ComponentType componentType = componentTypeDao.read(component.getComponentTypeNo()); String type = componentType.getComponentTypeName(); // Puppetクライアントの設定更新処理を実行 try { processLogger.debug(component, instance, "PuppetManifestApply", new String[] { instance.getFqdn(), type }); puppetClient.runClient(instance.getFqdn()); } catch (RuntimeException e) { processLogger.debug(component, instance, "PuppetManifestApplyFail", new String[] { instance.getFqdn(), type }); // マニフェスト適用に失敗した場合、警告ログ出力した後にリトライする String code = (e instanceof AutoException) ? AutoException.class.cast(e).getCode() : null; if ("EPUPPET-000003".equals(code) || "EPUPPET-000007".equals(code)) { log.warn(e.getMessage()); processLogger.debug(component, instance, "PuppetManifestApply", new String[] { instance.getFqdn(), type }); try { puppetClient.runClient(instance.getFqdn()); } catch (RuntimeException e2) { processLogger.debug(component, instance, "PuppetManifestApplyFail", new String[] { instance.getFqdn(), type }); throw e2; } } else { throw e; } } processLogger.debug(component, instance, "PuppetManifestApplyFinish", new String[] { instance.getFqdn(), type }); } protected Map<String, Object> createComponentMap(Long componentNo, ComponentProcessContext context, boolean start) { Map<String, Object> map = new HashMap<String, Object>(); map.put("start", start); // Component Component component = componentDao.read(componentNo); map.put("component", component); // Farm Farm farm = farmDao.read(component.getFarmNo()); map.put("farm", farm); // User User user = userDao.read(farm.getUserNo()); PccSystemInfo pccSystemInfo = pccSystemInfoDao.read(); PasswordEncryptor encryptor = new PasswordEncryptor(); user.setPassword(encryptor.decrypt(user.getPassword(), pccSystemInfo.getSecretKey())); map.put("user", user); // ComponentConfig List<ComponentConfig> componentConfigs = componentConfigDao.readByComponentNo(componentNo); Map<String, Object> configs = new HashMap<String, Object>(); for (ComponentConfig componentConfig : componentConfigs) { configs.put(componentConfig.getConfigName(), componentConfig.getConfigValue()); if (ComponentConstants.CONFIG_NAME_CUSTOM_PARAM_1.equals(componentConfig.getConfigName())) { map.put("customParam1", componentConfig.getConfigValue()); } if (ComponentConstants.CONFIG_NAME_CUSTOM_PARAM_2.equals(componentConfig.getConfigName())) { map.put("customParam2", componentConfig.getConfigValue()); } if (ComponentConstants.CONFIG_NAME_CUSTOM_PARAM_3.equals(componentConfig.getConfigName())) { map.put("customParam3", componentConfig.getConfigValue()); } } map.put("configs", configs); // Instances of same component List<ComponentInstance> componentInstances = componentInstanceDao.readByComponentNo(componentNo); List<Long> instanceNos = new ArrayList<Long>(); for (ComponentInstance componentInstance : componentInstances) { if (BooleanUtils.isNotTrue(componentInstance.getEnabled())) { continue; } if (!context.getRunningInstanceNos().contains(componentInstance.getInstanceNo())) { continue; } instanceNos.add(componentInstance.getInstanceNo()); } List<Instance> instances = instanceDao.readInInstanceNos(instanceNos); Collections.sort(instances, new Comparator<Instance>() { @Override public int compare(Instance o1, Instance o2) { return o1.getInstanceNo().compareTo(o2.getInstanceNo()); } }); map.put("sameComponentInstances", instances); return map; } protected Map<String, Object> createInstanceMap(Long componentNo, ComponentProcessContext context, boolean start, Long instanceNo, Map<String, Object> rootMap) { Map<String, Object> map = new HashMap<String, Object>(rootMap); // Instance Instance instance = instanceDao.read(instanceNo); map.put("instance", instance); // PuppetInstance PuppetInstance puppetInstance = puppetInstanceDao.read(instanceNo); map.put("puppetInstance", puppetInstance); // InstanceConfig List<InstanceConfig> instanceConfigs = instanceConfigDao.readByInstanceNo(instanceNo); Map<String, Object> configs = new HashMap<String, Object>(); for (InstanceConfig instanceConfig : instanceConfigs) { if (componentNo.equals(instanceConfig.getComponentNo())) { configs.put(instanceConfig.getConfigName(), instanceConfig.getConfigValue()); } } map.put("instanceConfigs", configs); // Platform Platform platform = platformDao.read(instance.getPlatformNo()); map.put("platform", platform); // TODO CLOUD BRANCHING if (PCCConstant.PLATFORM_TYPE_AWS.equals(platform.getPlatformType())) { // AwsInstance AwsInstance awsInstance = awsInstanceDao.read(instanceNo); map.put("awsInstance", awsInstance); // AwsVolume AwsVolume awsVolume = awsVolumeDao.readByComponentNoAndInstanceNo(componentNo, instanceNo); if (awsVolume != null) { map.put("awsVolume", awsVolume); } } else if (PCCConstant.PLATFORM_TYPE_CLOUDSTACK.equals(platform.getPlatformType())) { // CloudStackInstance CloudstackInstance cloudstackInstance = cloudstackInstanceDao.read(instanceNo); map.put("cloudstackInstance", cloudstackInstance); // CloudStackVolume CloudstackVolume cloudstackVolume = cloudstackVolumeDao.readByComponentNoAndInstanceNo(componentNo, instanceNo); if (cloudstackVolume != null) { map.put("cloudstackVolume", cloudstackVolume); } } else if (PCCConstant.PLATFORM_TYPE_VMWARE.equals(platform.getPlatformType())) { // VmwareInstance VmwareInstance vmwareInstance = vmwareInstanceDao.read(instanceNo); map.put("vmwareInstance", vmwareInstance); // VmwareDisk VmwareDisk vmwareDisk = vmwareDiskDao.readByComponentNoAndInstanceNo(componentNo, instanceNo); if (vmwareDisk != null) { map.put("vmwareDisk", vmwareDisk); } } else if (PCCConstant.PLATFORM_TYPE_NIFTY.equals(platform.getPlatformType())) { // NiftyInstance NiftyInstance niftyInstance = niftyInstanceDao.read(instanceNo); map.put("niftyInstance", niftyInstance); // NiftyVolume NiftyVolume niftyVolume = niftyVolumeDao.readByComponentNoAndInstanceNo(componentNo, instanceNo); if (niftyVolume != null) { map.put("niftyVolume", niftyVolume); } } else if (PCCConstant.PLATFORM_TYPE_VCLOUD.equals(platform.getPlatformType())) { // VcloudInstance VcloudInstance vcloudInstance = vcloudInstanceDao.read(instanceNo); map.put("vcloudInstance", vcloudInstance); // VcloudDisk VcloudDisk vcloudDisk = null; List<VcloudDisk> vcloudDisks = vcloudDiskDao.readByComponentNo(componentNo); for (VcloudDisk tmpVcloudDisk: vcloudDisks) { if (tmpVcloudDisk.getInstanceNo().equals(instanceNo)) { vcloudDisk = tmpVcloudDisk; break; } } if (vcloudDisk != null) { map.put("vcloudDisk", vcloudDisk); } } else if (PCCConstant.PLATFORM_TYPE_AZURE.equals(platform.getPlatformType())) { // AzureInstance AzureInstance azureInstance = azureInstanceDao.read(instanceNo); map.put("azureInstance", azureInstance); // AzureDisk AzureDisk azureDisk = azureDiskDao.readByComponentNoAndInstanceNo(componentNo, instanceNo); if (azureDisk != null) { map.put("azureDisk", azureDisk); } } else if (PCCConstant.PLATFORM_TYPE_OPENSTACK.equals(platform.getPlatformType())) { // OpenstackInstance OpenstackInstance openstackInstance = openstackInstanceDao.read(instanceNo); map.put("openstackInstance", openstackInstance); // OpenstackVolume OpenstackVolume openstackVolume = openstackVolumeDao.readByComponentNoAndInstanceNo(componentNo, instanceNo); if(openstackVolume != null) { map.put("openstackVolume", openstackVolume); } } // アクセスIP List<Instance> runningInstances = instanceDao.readInInstanceNos(context.getRunningInstanceNos()); Map<String, String> accessIps = new HashMap<String, String>(); for (Instance runningInstance : runningInstances) { // 基本はpublicIpでアクセスする String accessIp = runningInstance.getPublicIp(); if (instance.getPlatformNo().equals(runningInstance.getPlatformNo())) { // 同一のプラットフォームの場合 // TODO CLOUD BRANCHING if (PCCConstant.PLATFORM_TYPE_AWS.equals(platform.getPlatformType())) { PlatformAws platformAws = platformAwsDao.read(runningInstance.getPlatformNo()); if (BooleanUtils.isFalse(platformAws.getVpc())) { // VPCを使用しない場合はprivateIpでアクセスする accessIp = runningInstance.getPrivateIp(); } } else if (PCCConstant.PLATFORM_TYPE_CLOUDSTACK.equals(platform.getPlatformType())) { // CloudstackはpublicIpでアクセスする accessIp = runningInstance.getPublicIp(); } else if (PCCConstant.PLATFORM_TYPE_VMWARE.equals(platform.getPlatformType())) { // VMwareプラットフォームの場合はprivateIpでアクセスする accessIp = runningInstance.getPrivateIp(); } else if (PCCConstant.PLATFORM_TYPE_NIFTY.equals(platform.getPlatformType())) { // ニフティクラウドプラットフォームの場合はprivateIpでアクセスする accessIp = runningInstance.getPrivateIp(); } else if (PCCConstant.PLATFORM_TYPE_VCLOUD.equals(platform.getPlatformType())) { // VCloudプラットフォームの場合はprivateIpでアクセスする accessIp = runningInstance.getPrivateIp(); } else if (PCCConstant.PLATFORM_TYPE_AZURE.equals(platform.getPlatformType())) { // Azureプラットフォームの場合はprivateIpでアクセスする accessIp = runningInstance.getPrivateIp(); } else if (PCCConstant.PLATFORM_TYPE_OPENSTACK.equals(platform.getPlatformType())) { // OpenstackはpublicIpでアクセスする accessIp = runningInstance.getPublicIp(); } } accessIps.put(runningInstance.getInstanceNo().toString(), accessIp); } map.put("accessIps", accessIps); // ボリュームをデタッチしないかどうか boolean unDetachVolume = BooleanUtils.toBoolean(Config.getProperty("unDetachVolume")); map.put("unDetachVolume", unDetachVolume); return map; } protected String getFileDigest(File file, String encoding) { if (!file.exists()) { return null; } try { String content = FileUtils.readFileToString(file, encoding); return DigestUtils.shaHex(content); } catch (Exception e) { throw new RuntimeException(e); } } protected void restoreManifest(Long componentNo, Long instanceNo) { Component component = componentDao.read(componentNo); Instance instance = instanceDao.read(instanceNo); File manifestFile = new File(manifestDir, instance.getFqdn() + "." + component.getComponentName() + ".pp"); // マニフェストファイルのリストア File backupDir = new File(manifestDir, "backup"); File backupFile = new File(backupDir, manifestFile.getName()); if (!backupFile.exists()) { return; } try { if (manifestFile.exists()) { FileUtils.forceDelete(manifestFile); } FileUtils.moveFile(backupFile, manifestFile); } catch (IOException e) { // マニフェストファイルのリストア失敗時 log.warn(e.getMessage()); } } protected void backupManifest(Long componentNo, Long instanceNo) { Component component = componentDao.read(componentNo); Instance instance = instanceDao.read(instanceNo); File manifestFile = new File(manifestDir, instance.getFqdn() + "." + component.getComponentName() + ".pp"); if (!manifestFile.exists()) { return; } // マニフェストファイルのバックアップ File backupDir = new File(manifestDir, "backup"); File backupFile = new File(backupDir, manifestFile.getName()); try { if (!backupDir.exists()) { backupDir.mkdir(); } if (backupFile.exists()) { FileUtils.forceDelete(backupFile); } FileUtils.moveFile(manifestFile, backupFile); } catch (IOException e) { // マニフェストファイルのバックアップ失敗時 log.warn(e.getMessage()); } } protected void deleteManifest(Long componentNo, Long instanceNo) { Component component = componentDao.read(componentNo); Instance instance = instanceDao.read(instanceNo); // マニフェストファイルを削除する File file = new File(manifestDir, instance.getFqdn() + "." + component.getComponentName() + ".pp"); if (!file.exists()) { return; } try { FileUtils.forceDelete(file); } catch (IOException e) { // マニフェストファイルの削除失敗時 log.warn(e.getMessage()); } } protected void deleteAssociate(Long componentNo, Long instanceNo) { ComponentInstance componentInstance = componentInstanceDao.read(componentNo, instanceNo); // コンポーネントとインスタンスの関連付けが無効で、コンポーネントが停止している場合、レコードを削除する if (BooleanUtils.isNotTrue(componentInstance.getAssociate())) { ComponentInstanceStatus status = ComponentInstanceStatus.fromStatus(componentInstance.getStatus()); if (status == ComponentInstanceStatus.STOPPED) { componentInstanceDao.delete(componentInstance); } } } protected String getAwsVolumeDevice() { return awsVolumeDevice; } protected Integer getVmwareDiskScsiId() { return vmwareDiskScsiId; } protected String getCloudStackDiskofferingid() { return cloudStackDiskofferingid; } protected Integer getVcloudDiskUnitNo() { return vcloudDiskUnitNo; } protected void startVolume(Long componentNo, Long instanceNo) { Instance instance = instanceDao.read(instanceNo); Platform platform = platformDao.read(instance.getPlatformNo()); // TODO CLOUD BRANCHING if (PCCConstant.PLATFORM_TYPE_AWS.equals(platform.getPlatformType())) { startAwsVolume(componentNo, instanceNo); }else if (PCCConstant.PLATFORM_TYPE_CLOUDSTACK.equals(platform.getPlatformType())) { startCloudStackVolume(componentNo, instanceNo); } else if (PCCConstant.PLATFORM_TYPE_VMWARE.equals(platform.getPlatformType())) { startVmwareDisk(componentNo, instanceNo); } else if (PCCConstant.PLATFORM_TYPE_VCLOUD.equals(platform.getPlatformType())) { startVcloudDisk(componentNo, instanceNo); } else if (PCCConstant.PLATFORM_TYPE_AZURE.equals(platform.getPlatformType())) { startAzureDisk(componentNo, instanceNo); } else if (PCCConstant.PLATFORM_TYPE_OPENSTACK.equals(platform.getPlatformType())) { startOpenstackVolume(componentNo, instanceNo); } else if (PCCConstant.PLATFORM_TYPE_NIFTY.equals(platform.getPlatformType())) { startNiftyVolume(componentNo, instanceNo); } } protected void startAwsVolume(Long componentNo, Long instanceNo) { // デバイス名の取得 String device = getAwsVolumeDevice(); if (StringUtils.isEmpty(device)) { // デバイス名を取得できない場合はスキップ return; } // ボリューム情報の取得 AwsVolume awsVolume = awsVolumeDao.readByComponentNoAndInstanceNo(componentNo, instanceNo); // ボリューム情報がない場合は作成する if (awsVolume == null) { // ディスクサイズの取得 Integer diskSize = null; ComponentConfig diskSizeConfig = componentConfigDao.readByComponentNoAndConfigName(componentNo, ComponentConstants.CONFIG_NAME_DISK_SIZE); if (diskSizeConfig != null) { try { diskSize = Integer.valueOf(diskSizeConfig.getConfigValue()); } catch (NumberFormatException ignore) { } } if (diskSize == null) { // ディスクサイズが指定されていない場合はスキップ return; } Instance instance = instanceDao.read(instanceNo); AwsInstance awsInstance = awsInstanceDao.read(instanceNo); awsVolume = new AwsVolume(); awsVolume.setFarmNo(instance.getFarmNo()); awsVolume.setVolumeName("vol"); awsVolume.setPlatformNo(instance.getPlatformNo()); awsVolume.setComponentNo(componentNo); awsVolume.setInstanceNo(instanceNo); awsVolume.setSize(diskSize); awsVolume.setAvailabilityZone(awsInstance.getAvailabilityZone()); awsVolume.setDevice(device); awsVolumeDao.create(awsVolume); } // ディスクがアタッチされておらず、アタッチするデバイスが異なる場合は変更する else if (StringUtils.isEmpty(awsVolume.getInstanceId()) && !StringUtils.equals(device, awsVolume.getDevice())) { awsVolume.setDevice(device); awsVolumeDao.update(awsVolume); } // AwsProcessClientの作成 Farm farm = farmDao.read(awsVolume.getFarmNo()); AwsProcessClient awsProcessClient = awsProcessClientFactory.createAwsProcessClient(farm.getUserNo(), awsVolume .getPlatformNo()); // ボリュームの開始処理 awsVolumeProcess.startVolume(awsProcessClient, instanceNo, awsVolume.getVolumeNo()); } protected void startCloudStackVolume(Long componentNo, Long instanceNo) { // ボリューム情報の取得 CloudstackVolume cloudstackVolume = cloudstackVolumeDao.readByComponentNoAndInstanceNo(componentNo, instanceNo); // ボリューム情報がない場合は作成する if (cloudstackVolume == null) { // ディスクサイズの取得 Integer diskSize = null; ComponentConfig diskSizeConfig = componentConfigDao.readByComponentNoAndConfigName(componentNo, ComponentConstants.CONFIG_NAME_DISK_SIZE); if (diskSizeConfig != null) { try { diskSize = Integer.valueOf(diskSizeConfig.getConfigValue()); } catch (NumberFormatException ignore) { } } if (diskSize == null) { // ディスクサイズが指定されていない場合はスキップ return; } Instance instance = instanceDao.read(instanceNo); CloudstackInstance cloudstackInstance = cloudstackInstanceDao.read(instanceNo); //NAME ZONEID SIZE SNAPSHOTID DISKOFFERINGID が必要 // DISKOFFERINGID と SNAPSHOTID のいずれか一方が必要 cloudstackVolume = new CloudstackVolume(); cloudstackVolume.setFarmNo(instance.getFarmNo()); cloudstackVolume.setName("vol"); cloudstackVolume.setPlatformNo(instance.getPlatformNo()); cloudstackVolume.setComponentNo(componentNo); cloudstackVolume.setInstanceNo(instanceNo); cloudstackVolume.setSize(diskSize); cloudstackVolume.setZoneid(cloudstackInstance.getZoneid()); cloudstackVolumeDao.create(cloudstackVolume); }else if (cloudstackVolume.getInstanceId() != null && !"".equals(cloudstackVolume.getInstanceId())){ //すでにアタッチ済みの場合は処理を行わない //AWS等はGWでチェックし何もせずリターンするがPuppetの処理の都合上ここでリターンする return; } // IaasGatewayWrapperの作成 Farm farm = farmDao.read(cloudstackVolume.getFarmNo()); IaasGatewayWrapper gateway = iaasGatewayFactory.createIaasGateway(farm.getUserNo(), cloudstackVolume.getPlatformNo()); // //再起動を掛ける為、Puppet終了設定処理 // try { // // 終了設定処理 // if (puppetInstanceDao.countByInstanceNo(instanceNo) > 0) { // puppetNodeProcess.stopNode(instanceNo); // } // } catch (RuntimeException e) { // log.warn(e.getMessage()); // } // ボリュームの開始処理 gateway.startVolume(instanceNo, cloudstackVolume.getVolumeNo()); // // Puppet初期設定処理 // if (puppetInstanceDao.countByInstanceNo(instanceNo) > 0) { // log.info("Puppet 終了設定処理"); // puppetNodeProcess.startNode(instanceNo); // } } protected void startVmwareDisk(Long componentNo, Long instanceNo) { // SCSI IDの取得 Integer scsiId = getVmwareDiskScsiId(); if (scsiId == null) { // SCSI IDを取得できない場合はスキップ return; } // ディスク情報の取得 VmwareDisk vmwareDisk = vmwareDiskDao.readByComponentNoAndInstanceNo(componentNo, instanceNo); // ディスク情報がない場合は作成する if (vmwareDisk == null) { // ディスクサイズの取得 Integer diskSize = null; ComponentConfig diskSizeConfig = componentConfigDao.readByComponentNoAndConfigName(componentNo, ComponentConstants.CONFIG_NAME_DISK_SIZE); if (diskSizeConfig != null) { try { diskSize = Integer.valueOf(diskSizeConfig.getConfigValue()); } catch (NumberFormatException ignore) { } } if (diskSize == null) { // ディスクサイズが指定されていない場合はスキップ return; } Instance instance = instanceDao.read(instanceNo); vmwareDisk = new VmwareDisk(); vmwareDisk.setFarmNo(instance.getFarmNo()); vmwareDisk.setPlatformNo(instance.getPlatformNo()); vmwareDisk.setComponentNo(componentNo); vmwareDisk.setInstanceNo(instanceNo); vmwareDisk.setSize(diskSize); vmwareDisk.setScsiId(scsiId); vmwareDiskDao.create(vmwareDisk); } // ディスクがアタッチされておらず、アタッチするSCSI IDが異なる場合は変更する else if (BooleanUtils.isNotTrue(vmwareDisk.getAttached()) && !scsiId.equals(vmwareDisk.getScsiId())) { vmwareDisk.setScsiId(scsiId); vmwareDiskDao.update(vmwareDisk); } // VmwareProcessClientの作成 VmwareProcessClient vmwareProcessClient = vmwareProcessClientFactory.createVmwareProcessClient(vmwareDisk.getPlatformNo()); try { // ディスクの開始処理 vmwareDiskProcess.attachDisk(vmwareProcessClient, instanceNo, vmwareDisk.getDiskNo()); } finally { vmwareProcessClient.getVmwareClient().logout(); } } protected void startVcloudDisk(Long componentNo, Long instanceNo) { // ディスク情報の取得 VcloudDisk vcloudDisk = null; List<VcloudDisk> vcloudDisks = vcloudDiskDao.readByComponentNo(componentNo); for (VcloudDisk tmpVcloudDisk: vcloudDisks) { if (tmpVcloudDisk.getInstanceNo().equals(instanceNo)) { vcloudDisk = tmpVcloudDisk; break; } } // ディスク情報がない場合は作成する if (vcloudDisk == null) { // ディスクサイズの取得 Integer diskSize = null; ComponentConfig diskSizeConfig = componentConfigDao.readByComponentNoAndConfigName(componentNo, ComponentConstants.CONFIG_NAME_DISK_SIZE); if (diskSizeConfig != null) { try { diskSize = Integer.valueOf(diskSizeConfig.getConfigValue()); } catch (NumberFormatException ignore) { } } if (diskSize == null) { // ディスクサイズが指定されていない場合はスキップ return; } Instance instance = instanceDao.read(instanceNo); vcloudDisk = new VcloudDisk(); vcloudDisk.setFarmNo(instance.getFarmNo()); vcloudDisk.setPlatformNo(instance.getPlatformNo()); vcloudDisk.setComponentNo(componentNo); vcloudDisk.setInstanceNo(instanceNo); vcloudDisk.setSize(diskSize); //UNIT NOはIaasGateWayでディスクをアタッチした後に動的に決定するので、NULLで登録 vcloudDisk.setUnitNo(null); vcloudDisk.setAttached(false); //サービスで追加されるディスクはデータディスクではないのでfalseを設定 vcloudDisk.setDataDisk(false); vcloudDiskDao.create(vcloudDisk); } // ディスクがアタッチされていない場合は UNIT NO が変わる可能性があるので明示的にNULLに変更する // IaasGateWayでアタッチ後UNIT NOが設定される else if (BooleanUtils.isNotTrue(vcloudDisk.getAttached())) { vcloudDisk.setUnitNo(null); vcloudDiskDao.update(vcloudDisk); } // IaasGatewayWrapperの作成 Farm farm = farmDao.read(vcloudDisk.getFarmNo()); IaasGatewayWrapper gateway = iaasGatewayFactory.createIaasGateway(farm.getUserNo(), vcloudDisk.getPlatformNo()); // ボリューム(ディスク)の開始処理 gateway.startVolume(instanceNo, vcloudDisk.getDiskNo()); } protected void startAzureDisk(Long componentNo, Long instanceNo) { // ボリューム情報の取得 AzureDisk azureDisk = azureDiskDao.readByComponentNoAndInstanceNo(componentNo, instanceNo); // ボリューム情報がない場合は作成する if (azureDisk == null) { // ディスクサイズの取得 Integer diskSize = null; ComponentConfig diskSizeConfig = componentConfigDao.readByComponentNoAndConfigName(componentNo, ComponentConstants.CONFIG_NAME_DISK_SIZE); if (diskSizeConfig != null) { try { diskSize = Integer.valueOf(diskSizeConfig.getConfigValue()); } catch (NumberFormatException ignore) { } } if (diskSize == null) { // ディスクサイズが指定されていない場合はスキップ return; } Instance instance = instanceDao.read(instanceNo); //AzureInstance azureInstance = azureInstanceDao.read(instanceNo); //NAME ZONEID SIZE SNAPSHOTID DISKOFFERINGID が必要 // DISKOFFERINGID と SNAPSHOTID のいずれか一方が必要 azureDisk = new AzureDisk(); azureDisk.setFarmNo(instance.getFarmNo()); azureDisk.setPlatformNo(instance.getPlatformNo()); azureDisk.setComponentNo(componentNo); azureDisk.setInstanceNo(instanceNo); //azureDisk.setDiskName(diskName); //azureDisk.setInstanceName(azureInstance.getInstanceName()); //azureDisk.setLun(lun); azureDisk.setSize(diskSize); azureDiskDao.create(azureDisk); }else if (azureDisk.getInstanceName() != null && !"".equals(azureDisk.getInstanceName())){ //すでにアタッチ済みの場合は処理を行わない //AWS等はGWでチェックし何もせずリターンするがPuppetの処理の都合上ここでリターンする return; } // IaasGatewayWrapperの作成 Farm farm = farmDao.read(azureDisk.getFarmNo()); IaasGatewayWrapper gateway = iaasGatewayFactory.createIaasGateway(farm.getUserNo(), azureDisk.getPlatformNo()); // ボリュームの開始処理 gateway.startVolume(instanceNo, azureDisk.getDiskNo()); } protected void startOpenstackVolume(Long componentNo, Long instanceNo) { // ボリューム情報の取得 OpenstackVolume openstackVolume = openstackVolumeDao.readByComponentNoAndInstanceNo(componentNo, instanceNo); // ボリューム情報がない場合は作成する if (openstackVolume == null) { // ディスクサイズの取得 Integer diskSize = null; ComponentConfig diskSizeConfig = componentConfigDao.readByComponentNoAndConfigName(componentNo, ComponentConstants.CONFIG_NAME_DISK_SIZE); if (diskSizeConfig != null) { try { diskSize = Integer.valueOf(diskSizeConfig.getConfigValue()); } catch (NumberFormatException ignore) { } } if (diskSize == null) { // ディスクサイズが指定されていない場合はスキップ return; } StringBuilder sb = new StringBuilder(); Instance instance = instanceDao.read(instanceNo); OpenstackInstance openstackInstance = openstackInstanceDao.read(instanceNo); //コンポーネント情報の取得 Component component = componentDao.read(componentNo); String compName = null; //FQDNが設定されている場合 if (StringUtils.isNotEmpty(instance.getFqdn())) { //ボリューム名称としてFQDNを設定 sb.append(instance.getFqdn()); //コンポーネント名称がある場合、FQDN_コンポーネント名称の形式に編集 if (StringUtils.isNotEmpty(component.getComponentName())) { sb.append("_"); sb.append(component.getComponentName()); } compName = sb.toString(); } else { compName = "vol"; } openstackVolume = new OpenstackVolume(); openstackVolume.setFarmNo(instance.getFarmNo()); openstackVolume.setVolumeName(compName); openstackVolume.setPlatformNo(instance.getPlatformNo()); openstackVolume.setComponentNo(componentNo); openstackVolume.setInstanceNo(instanceNo); openstackVolume.setSize(diskSize); openstackVolume.setAvailabilityZone(openstackInstance.getAvailabilityZone()); openstackVolumeDao.create(openstackVolume); } // AwsProcessClientの作成 Farm farm = farmDao.read(openstackVolume.getFarmNo()); IaasGatewayWrapper gateway = iaasGatewayFactory.createIaasGateway(farm.getUserNo(), openstackVolume.getPlatformNo()); // ボリュームの開始処理 gateway.startVolume(instanceNo, openstackVolume.getVolumeNo()); } protected void startNiftyVolume(Long componentNo, Long instanceNo) { // ボリューム情報の取得 NiftyVolume niftyVolume = niftyVolumeDao.readByComponentNoAndInstanceNo(componentNo, instanceNo); Instance instance = instanceDao.read(instanceNo); Farm farm = farmDao.read(instance.getFarmNo()); // ボリューム情報がない場合は作成する if (niftyVolume == null) { // ディスクサイズの取得 Integer diskSize = null; ComponentConfig diskSizeConfig = componentConfigDao.readByComponentNoAndConfigName(componentNo, ComponentConstants.CONFIG_NAME_DISK_SIZE); if (diskSizeConfig != null) { try { diskSize = Integer.valueOf(diskSizeConfig.getConfigValue()); } catch (NumberFormatException ignore) { } } if (diskSize == null) { // ディスクサイズが指定されていない場合はスキップ return; } StringBuilder sb = new StringBuilder(); //コンポーネント情報の取得 Component component = componentDao.read(componentNo); String compName = null; //FQDNが設定されている場合 if (StringUtils.isNotEmpty(instance.getFqdn())) { //ボリューム名称としてFQDNを設定 sb.append(instance.getFqdn()); //コンポーネント名称がある場合、FQDN_コンポーネント名称の形式に編集 if (StringUtils.isNotEmpty(component.getComponentName())) { sb.append("_"); sb.append(component.getComponentName()); } compName = sb.toString(); } else { compName = "vol"; } niftyVolume = new NiftyVolume(); niftyVolume.setFarmNo(instance.getFarmNo()); niftyVolume.setVolumeName(compName); niftyVolume.setPlatformNo(instance.getPlatformNo()); niftyVolume.setComponentNo(componentNo); niftyVolume.setInstanceNo(instanceNo); niftyVolume.setSize(diskSize); niftyVolumeDao.create(niftyVolume); } // NiftyProcessClientの作成 String clientType; clientType = PCCConstant.NIFTYCLIENT_TYPE_DISK; NiftyProcessClient niftyProcessClient = niftyProcessClientFactory.createNiftyProcessClient(farm.getUserNo(), niftyVolume.getPlatformNo(), clientType); // ディスクの開始処理 niftyVolumeProcess.startVoiume(niftyProcessClient, instanceNo, niftyVolume.getVolumeNo()); } protected void stopVolume(Long componentNo, Long instanceNo) { // デタッチ処理を行わない場合はスキップ boolean unDetachVolume = BooleanUtils.toBoolean(Config.getProperty("unDetachVolume")); if (unDetachVolume) { return; } Instance instance = instanceDao.read(instanceNo); Platform platform = platformDao.read(instance.getPlatformNo()); // TODO CLOUD BRANCHING if (PCCConstant.PLATFORM_TYPE_AWS.equals(platform.getPlatformType())) { stopAwsVolume(componentNo, instanceNo); } else if (PCCConstant.PLATFORM_TYPE_CLOUDSTACK.equals(platform.getPlatformType())) { stopCloudStackVolume(componentNo, instanceNo); } else if (PCCConstant.PLATFORM_TYPE_VMWARE.equals(platform.getPlatformType())) { stopVmwareDisk(componentNo, instanceNo); } else if (PCCConstant.PLATFORM_TYPE_VCLOUD.equals(platform.getPlatformType())) { stopVcloudDisk(componentNo, instanceNo); } else if (PCCConstant.PLATFORM_TYPE_AZURE.equals(platform.getPlatformType())) { stopAzureDisk(componentNo, instanceNo); } else if (PCCConstant.PLATFORM_TYPE_OPENSTACK.equals(platform.getPlatformType())) { stopOpenstackVolume(componentNo, instanceNo); } else if (PCCConstant.PLATFORM_TYPE_NIFTY.equals(platform.getPlatformType())) { stopNiftyVolume(componentNo, instanceNo); } } protected void stopAwsVolume(Long componentNo, Long instanceNo) { AwsVolume awsVolume = awsVolumeDao.readByComponentNoAndInstanceNo(componentNo, instanceNo); if (awsVolume == null) { // ボリュームがない場合はスキップ return; } // AwsProcessClientの作成 Farm farm = farmDao.read(awsVolume.getFarmNo()); AwsProcessClient awsProcessClient = awsProcessClientFactory.createAwsProcessClient(farm.getUserNo(), awsVolume .getPlatformNo()); // ボリュームの終了処理 awsVolumeProcess.stopVolume(awsProcessClient, instanceNo, awsVolume.getVolumeNo()); } protected void stopCloudStackVolume(Long componentNo, Long instanceNo) { CloudstackVolume cloudstackVolume = cloudstackVolumeDao.readByComponentNoAndInstanceNo(componentNo, instanceNo); if (cloudstackVolume == null) { // ボリュームがない場合はスキップ return; } // IaasGatewayWrapperの作成 Farm farm = farmDao.read(cloudstackVolume.getFarmNo()); IaasGatewayWrapper gateway = iaasGatewayFactory.createIaasGateway(farm.getUserNo(), cloudstackVolume.getPlatformNo()); // ボリュームの終了処理 gateway.stopVolume(instanceNo, cloudstackVolume.getVolumeNo()); } protected void stopVmwareDisk(Long componentNo, Long instanceNo) { VmwareDisk vmwareDisk = vmwareDiskDao.readByComponentNoAndInstanceNo(componentNo, instanceNo); if (vmwareDisk == null) { // ディスクがない場合はスキップ return; } // VmwareProcessClientの作成 VmwareProcessClient vmwareProcessClient = vmwareProcessClientFactory.createVmwareProcessClient(vmwareDisk.getPlatformNo()); try { // ディスクの終了処理 vmwareDiskProcess.detachDisk(vmwareProcessClient, instanceNo, vmwareDisk.getDiskNo()); } finally { vmwareProcessClient.getVmwareClient().logout(); } } protected void stopVcloudDisk(Long componentNo, Long instanceNo) { VcloudDisk vcloudDisk = null; List<VcloudDisk> vcloudDisks = vcloudDiskDao.readByComponentNo(componentNo); for (VcloudDisk tmpVcloudDisk: vcloudDisks) { if (tmpVcloudDisk.getInstanceNo().equals(instanceNo)) { vcloudDisk = tmpVcloudDisk; break; } } if (vcloudDisk == null) { // ディスクがない場合はスキップ return; } // IaasGatewayWrapperの作成 Farm farm = farmDao.read(vcloudDisk.getFarmNo()); IaasGatewayWrapper gateway = iaasGatewayFactory.createIaasGateway(farm.getUserNo(), vcloudDisk.getPlatformNo()); // ボリューム(ディスク)の停止処理 gateway.stopVolume(instanceNo, vcloudDisk.getDiskNo()); } protected void stopAzureDisk(Long componentNo, Long instanceNo) { AzureDisk azureDisk = azureDiskDao.readByComponentNoAndInstanceNo(componentNo, instanceNo); if (azureDisk == null) { // ボリュームがない場合はスキップ return; } // IaasGatewayWrapperの作成 Farm farm = farmDao.read(azureDisk.getFarmNo()); IaasGatewayWrapper gateway = iaasGatewayFactory.createIaasGateway(farm.getUserNo(), azureDisk.getPlatformNo()); // ボリュームの終了処理 gateway.stopVolume(instanceNo, azureDisk.getDiskNo()); } protected void stopOpenstackVolume(Long componentNo, Long instanceNo) { OpenstackVolume openstackVolume = openstackVolumeDao.readByComponentNoAndInstanceNo(componentNo, instanceNo); if (openstackVolume == null) { // ボリュームがない場合はスキップ return; } // AwsProcessClientの作成 Farm farm = farmDao.read(openstackVolume.getFarmNo()); IaasGatewayWrapper gateway = iaasGatewayFactory.createIaasGateway(farm.getUserNo(), openstackVolume.getPlatformNo()); // ボリュームの終了処理 gateway.stopVolume(instanceNo, openstackVolume.getVolumeNo()); } protected void stopNiftyVolume(Long componentNo, Long instanceNo) { NiftyVolume niftyVolume = niftyVolumeDao.readByComponentNoAndInstanceNo(componentNo, instanceNo); if (niftyVolume == null) { // ボリュームがない場合はスキップ return; } // NiftyProcessClientの作成 Farm farm = farmDao.read(niftyVolume.getFarmNo()); String clientType; clientType = PCCConstant.NIFTYCLIENT_TYPE_DISK; NiftyProcessClient niftyProcessClient = niftyProcessClientFactory.createNiftyProcessClient(farm.getUserNo(), niftyVolume.getPlatformNo(), clientType); // デタッチ処理 niftyVolumeProcess.stopVolume(niftyProcessClient, instanceNo, niftyVolume.getVolumeNo()); } protected void startZabbixTemplate(Long componentNo, Long instanceNo) { if (zabbixInstanceDao.countByInstanceNo(instanceNo) > 0) { zabbixHostProcess.startTemplate(instanceNo, componentNo); } } protected void stopZabbixTemplate(Long componentNo, Long instanceNo) { if (zabbixInstanceDao.countByInstanceNo(instanceNo) > 0) { try { zabbixHostProcess.stopTemplate(instanceNo, componentNo); } catch (Exception e) { log.warn(e.getMessage()); } } } /** * manifestDirを設定します。 * * @param manifestDir manifestDir */ public void setManifestDir(File manifestDir) { this.manifestDir = manifestDir; } /** * freeMarkerGeneratorを設定します。 * * @param freeMarkerGenerator freeMarkerGenerator */ public void setFreeMarkerGenerator(FreeMarkerGenerator freeMarkerGenerator) { this.freeMarkerGenerator = freeMarkerGenerator; } /** * puppetClientを設定します。 * * @param puppetClient puppetClient */ public void setPuppetClient(PuppetClient puppetClient) { this.puppetClient = puppetClient; } /** * iaasGatewayFactoryを設定します。 * * @param iaasGatewayFactory iaasGatewayFactory */ public void setIaasGatewayFactory(IaasGatewayFactory iaasGatewayFactory) { this.iaasGatewayFactory = iaasGatewayFactory; } public void setAwsProcessClientFactory(AwsProcessClientFactory awsProcessClientFactory) { this.awsProcessClientFactory = awsProcessClientFactory; } public void setAwsVolumeProcess(AwsVolumeProcess awsVolumeProcess) { this.awsVolumeProcess = awsVolumeProcess; } /** * vmwareProcessClientFactoryを設定します。 * * @param vmwareProcessClientFactory vmwareProcessClientFactory */ public void setVmwareProcessClientFactory(VmwareProcessClientFactory vmwareProcessClientFactory) { this.vmwareProcessClientFactory = vmwareProcessClientFactory; } /** * executorServiceを設定します。 * * @param executorService executorService */ public void setExecutorService(ExecutorService executorService) { this.executorService = executorService; } /** * vmwareDiskProcessを設定します。 * * @param vmwareDiskProcess vmwareDiskProcess */ public void setVmwareDiskProcess(VmwareDiskProcess vmwareDiskProcess) { this.vmwareDiskProcess = vmwareDiskProcess; } /** * zabbixHostProcessを設定します。 * * @param zabbixHostProcess zabbixHostProcess */ public void setZabbixHostProcess(ZabbixHostProcess zabbixHostProcess) { this.zabbixHostProcess = zabbixHostProcess; } /** * puppetNodeProcessを設定します。 * * @param puppetNodeProcess puppetNodeProcess */ public void setPuppetNodeProcess(PuppetNodeProcess puppetNodeProcess) { this.puppetNodeProcess = puppetNodeProcess; } /** * processLoggerを設定します。 * * @param processLogger processLogger */ public void setProcessLogger(ProcessLogger processLogger) { this.processLogger = processLogger; } /** * eventLoggerを設定します。 * * @param eventLogger eventLogger */ public void setEventLogger(EventLogger eventLogger) { this.eventLogger = eventLogger; } /** * componentTypeNameを設定します。 * * @param componentTypeName componentTypeName */ public void setComponentTypeName(String componentTypeName) { this.componentTypeName = componentTypeName; } /** * awsVolumeDeviceを設定します。 * * @param awsVolumeDevice awsVolumeDevice */ public void setAwsVolumeDevice(String awsVolumeDevice) { this.awsVolumeDevice = awsVolumeDevice; } /** * cloudStackDiskofferingidを設定します。 * * @param cloudStackDiskofferingid cloudStackDiskofferingid */ public void setCloudStackDiskofferingid(String cloudStackDiskofferingid) { this.cloudStackDiskofferingid = cloudStackDiskofferingid; } /** * vmwareDiskScsiIdを設定します。 * * @param vmwareDiskScsiId vmwareDiskScsiId */ public void setVmwareDiskScsiId(Integer vmwareDiskScsiId) { this.vmwareDiskScsiId = vmwareDiskScsiId; } /** * vcloudDiskUnitNoを設定します。 * * @param vcloudDiskUnitNo vcloudDiskUnitNo */ public void setVcloudDiskUnitNo(Integer vcloudDiskUnitNo) { this.vcloudDiskUnitNo = vcloudDiskUnitNo; } /** * niftyProcessClientFactoryを設定します。 * @param niftyProcessClientFactory niftyProcessClientFactory */ public void setNiftyProcessClientFactory(NiftyProcessClientFactory niftyProcessClientFactory) { this.niftyProcessClientFactory = niftyProcessClientFactory; } /** * niftyVolumeProcessを設定します。 * @param niftyVolumeProcess niftyVolumeProcess */ public void setNiftyVolumeProcess(NiftyVolumeProcess niftyVolumeProcess) { this.niftyVolumeProcess = niftyVolumeProcess; } /** * processHookを設定します。 * * @param processHook processHook */ public void setProcessHook(ProcessHook processHook) { this.processHook = processHook; } }