/*
* Copyright 2016 by PrimeCloud Controller/OSS Community.
*
* 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.aws;
import jp.primecloud.auto.entity.crud.AwsInstance;
import jp.primecloud.auto.entity.crud.Image;
import jp.primecloud.auto.entity.crud.Instance;
import jp.primecloud.auto.entity.crud.Platform;
import jp.primecloud.auto.entity.crud.PlatformAws;
import jp.primecloud.auto.process.DnsProcessClient;
import jp.primecloud.auto.process.DnsProcessClientFactory;
import jp.primecloud.auto.process.ProcessLogger;
import jp.primecloud.auto.service.ServiceSupport;
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
/**
* <p>
* TODO: クラスコメントを記述
* </p>
*
*/
public class AwsDnsProcess extends ServiceSupport {
protected DnsProcessClientFactory dnsProcessClientFactory;
protected ProcessLogger processLogger;
/**
* TODO: メソッドコメント
*
* @param instanceNo
*/
public void startDns(Long instanceNo) {
Instance instance = instanceDao.read(instanceNo);
Platform platform = platformDao.read(instance.getPlatformNo());
if (BooleanUtils.isTrue(platform.getInternal())) {
// 内部のプラットフォームの場合
PlatformAws platformAws = platformAwsDao.read(platform.getPlatformNo());
if (BooleanUtils.isTrue(platformAws.getEuca())) {
// Eucalyptusの場合
startDnsEuca(instanceNo);
} else {
// Amazon EC2の場合
if (BooleanUtils.isTrue(platformAws.getVpc())) {
// VPC環境の場合
startDnsNormal(instanceNo);
} else {
// 非VPC環境の場合
startDnsClassic(instanceNo);
}
}
} else {
// 外部のプラットフォームの場合
Image image = imageDao.read(instance.getImageNo());
if (StringUtils.startsWithIgnoreCase(image.getOs(), "windows")) {
// Windowsイメージの場合、VPNを使用していないものとする
startDnsClassic(instanceNo);
} else {
// VPNを使用している場合
startDnsVpn(instanceNo);
}
}
// イベントログ出力
instance = instanceDao.read(instanceNo);
processLogger.debug(null, instance, "DnsRegist", new Object[] { instance.getFqdn(), instance.getPublicIp() });
}
/**
* TODO: メソッドコメント
*
* @param instanceNo
*/
public void stopDns(Long instanceNo) {
Instance instance = instanceDao.read(instanceNo);
Platform platform = platformDao.read(instance.getPlatformNo());
if (BooleanUtils.isTrue(platform.getInternal())) {
// 内部のプラットフォームの場合
PlatformAws platformAws = platformAwsDao.read(platform.getPlatformNo());
if (BooleanUtils.isTrue(platformAws.getEuca())) {
// Eucalyptusの場合
stopDnsNormal(instanceNo);
} else {
// Amazon EC2の場合
if (BooleanUtils.isTrue(platformAws.getVpc())) {
// VPC環境の場合
stopDnsNormal(instanceNo);
} else {
// 非VPC環境の場合
stopDnsClassic(instanceNo);
}
}
} else {
// 外部のプラットフォームの場合
Image image = imageDao.read(instance.getImageNo());
if (StringUtils.startsWithIgnoreCase(image.getOs(), "windows")) {
// Windowsイメージの場合、VPNを使用していないものとする
stopDnsClassic(instanceNo);
} else {
// VPNを使用している場合
stopDnsNormal(instanceNo);
}
}
// イベントログ出力
processLogger.debug(null, instance, "DnsUnregist", new Object[] { instance.getFqdn(), instance.getPublicIp() });
}
protected void startDnsNormal(Long instanceNo) {
Instance instance = instanceDao.read(instanceNo);
AwsInstance awsInstance = awsInstanceDao.read(instanceNo);
// InstanceにIPアドレスが登録済みの場合はスキップする
if (!StringUtils.isEmpty(instance.getPublicIp())) {
return;
}
DnsProcessClient dnsProcessClient = dnsProcessClientFactory.createDnsProcessClient();
// PrivateIpAddressをIPアドレスとする
String fqdn = instance.getFqdn();
String publicIp = awsInstance.getPrivateIpAddress();
String privateIp = awsInstance.getPrivateIpAddress();
// 正引きの追加
dnsProcessClient.addForward(fqdn, publicIp);
// 逆引きの追加
dnsProcessClient.addReverse(fqdn, publicIp);
// データベースの更新
instance.setPublicIp(publicIp);
instance.setPrivateIp(privateIp);
instanceDao.update(instance);
}
protected void startDnsClassic(Long instanceNo) {
Instance instance = instanceDao.read(instanceNo);
AwsInstance awsInstance = awsInstanceDao.read(instanceNo);
// 最新のAwsInstance情報がInstanceに登録されている場合はスキップする
if (StringUtils.equals(instance.getPublicIp(), awsInstance.getDnsName())) {
return;
}
DnsProcessClient dnsProcessClient = dnsProcessClientFactory.createDnsProcessClient();
String fqdn = instance.getFqdn();
String publicIp = awsInstance.getIpAddress();
String privateIp = awsInstance.getPrivateIpAddress();
// CNAMEの追加
dnsProcessClient.addCanonicalName(fqdn, awsInstance.getDnsName());
// データベースの更新
instance.setPublicIp(publicIp);
instance.setPrivateIp(privateIp);
instanceDao.update(instance);
}
protected void startDnsEuca(Long instanceNo) {
Instance instance = instanceDao.read(instanceNo);
AwsInstance awsInstance = awsInstanceDao.read(instanceNo);
// 最新のAwsInstance情報がInstanceに登録されている場合はスキップする
if (StringUtils.equals(instance.getPublicIp(), awsInstance.getDnsName())) {
return;
}
DnsProcessClient dnsProcessClient = dnsProcessClientFactory.createDnsProcessClient();
// DnsName, PrivateDnsNameをそのままIPアドレスとして使用する
String fqdn = instance.getFqdn();
String publicIp = awsInstance.getDnsName();
String privateIp = awsInstance.getPrivateDnsName();
// 正引きの追加
dnsProcessClient.addForward(fqdn, publicIp);
// 逆引きの追加
dnsProcessClient.addReverse(fqdn, publicIp);
// データベースの更新
instance.setPublicIp(publicIp);
instance.setPrivateIp(privateIp);
instanceDao.update(instance);
}
protected void startDnsVpn(Long instanceNo) {
Instance instance = instanceDao.read(instanceNo);
AwsInstance awsInstance = awsInstanceDao.read(instanceNo);
// InstanceにIPアドレスが登録済みの場合はスキップする
if (!StringUtils.isEmpty(instance.getPublicIp())) {
return;
}
DnsProcessClient dnsProcessClient = dnsProcessClientFactory.createDnsProcessClient();
// IPアドレスを正引きにより取得する(正引きの追加はインスタンス内で行う)
String fqdn = instance.getFqdn();
String publicIp = dnsProcessClient.resolveHost(fqdn); // VPNインタフェースのIPアドレス
String privateIp = awsInstance.getPrivateIpAddress();
// 逆引きの追加
dnsProcessClient.addReverse(fqdn, publicIp);
// データベースの更新
instance.setPublicIp(publicIp);
instance.setPrivateIp(privateIp);
instanceDao.update(instance);
}
protected void stopDnsNormal(Long instanceNo) {
Instance instance = instanceDao.read(instanceNo);
// IPアドレスがない場合はスキップ
if (StringUtils.isEmpty(instance.getPublicIp())) {
return;
}
DnsProcessClient dnsProcessClient = dnsProcessClientFactory.createDnsProcessClient();
String fqdn = instance.getFqdn();
String publicIp = instance.getPublicIp();
// 正引きの削除
dnsProcessClient.deleteForward(fqdn);
// 逆引きの削除
dnsProcessClient.deleteReverse(publicIp);
// データベースの更新
instance.setPublicIp(null);
instance.setPrivateIp(null);
instanceDao.update(instance);
}
protected void stopDnsClassic(Long instanceNo) {
Instance instance = instanceDao.read(instanceNo);
// IPアドレスがない場合はスキップ
if (StringUtils.isEmpty(instance.getPublicIp())) {
return;
}
DnsProcessClient dnsProcessClient = dnsProcessClientFactory.createDnsProcessClient();
String fqdn = instance.getFqdn();
// CNAMEの削除
dnsProcessClient.deleteCanonicalName(fqdn);
// データベースの更新
instance.setPublicIp(null);
instance.setPrivateIp(null);
instanceDao.update(instance);
}
public void setDnsProcessClientFactory(DnsProcessClientFactory dnsProcessClientFactory) {
this.dnsProcessClientFactory = dnsProcessClientFactory;
}
public void setProcessLogger(ProcessLogger processLogger) {
this.processLogger = processLogger;
}
}