/*
* 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.ui;
import java.util.Arrays;
import jp.primecloud.auto.common.constant.PCCConstant;
import jp.primecloud.auto.common.status.LoadBalancerStatus;
import jp.primecloud.auto.exception.AutoApplicationException;
import jp.primecloud.auto.service.LoadBalancerService;
import jp.primecloud.auto.service.ProcessService;
import jp.primecloud.auto.service.dto.LoadBalancerDto;
import jp.primecloud.auto.ui.DialogConfirm.Buttons;
import jp.primecloud.auto.ui.DialogConfirm.Result;
import jp.primecloud.auto.ui.util.BeanContext;
import jp.primecloud.auto.ui.util.Icons;
import jp.primecloud.auto.ui.util.OperationLogger;
import jp.primecloud.auto.ui.util.ViewContext;
import jp.primecloud.auto.ui.util.ViewMessages;
import jp.primecloud.auto.ui.util.ViewProperties;
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.CssLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Window;
import com.vaadin.ui.Window.CloseEvent;
/**
* <p>
* ロードバランサ画面の中央にあるロードバランさ追加ボタンからストップボタンまでを生成します。
* </p>
*
*/
@SuppressWarnings("serial")
public class LoadBalancerButtonsBottom extends CssLayout {
private MainView sender;
private Button addButton;
private Button editButton;
private Button deleteButton;
private Button startButton;
private Button stopButton;
public LoadBalancerButtonsBottom(MainView sender) {
this.sender = sender;
}
@Override
public void attach() {
addStyleName("loadbalancer-table-operation");
setWidth("100%");
setMargin(true);
// Addボタン
addButton = new Button(ViewProperties.getCaption("button.addLoadBalancer"));
addButton.setDescription(ViewProperties.getCaption("description.addLoadBalancer"));
addButton.setIcon(Icons.ADD.resource());
addButton.addStyleName("left");
addButton.addListener(new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
addButtonClick(event);
}
});
addComponent(addButton);
// スペースを入れる
Label spacer = new Label(" ", Label.CONTENT_XHTML);
spacer.setWidth("30px");
spacer.addStyleName("left");
addComponent(spacer);
// Editボタン
editButton = new Button(ViewProperties.getCaption("button.editLoadBalancer"));
editButton.setDescription(ViewProperties.getCaption("description.editLoadBalancer"));
editButton.setWidth("90px");
editButton.setIcon(Icons.EDITMINI.resource());
editButton.addStyleName("left");
editButton.addListener(new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
editButtonClick(event);
}
});
addComponent(editButton);
// Deleteボタン
deleteButton = new Button(ViewProperties.getCaption("button.deleteLoadBalancer"));
deleteButton.setDescription(ViewProperties.getCaption("description.deleteLoadBalancer"));
deleteButton.setWidth("90px");
deleteButton.setIcon(Icons.DELETEMINI.resource());
deleteButton.addStyleName("left");
deleteButton.addListener(new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
deleteButtonClick(event);
}
});
addComponent(deleteButton);
// Stopボタン
stopButton = new Button(ViewProperties.getCaption("button.stopLoadBalancer"));
stopButton.setDescription(ViewProperties.getCaption("description.stopLoadBalancer"));
stopButton.setWidth("90px");
stopButton.setIcon(Icons.STOPMINI.resource());
stopButton.addStyleName("right");
stopButton.addListener(new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
stopButtonClick(event);
}
});
addComponent(stopButton);
// Startボタン
startButton = new Button(ViewProperties.getCaption("button.startLoadBalancer"));
startButton.setDescription(ViewProperties.getCaption("description.startLoadBalancer"));
startButton.setWidth("90px");
startButton.setIcon(Icons.PLAYMINI.resource());
startButton.addStyleName("right");
startButton.addListener(new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
startButtonClick(event);
}
});
addComponent(startButton);
initialize();
}
public void initialize() {
addButton.setEnabled(true);
editButton.setEnabled(false);
deleteButton.setEnabled(false);
startButton.setEnabled(false);
stopButton.setEnabled(false);
}
public void show(LoadBalancerDto loadBalancerDto) {
// ステータスによってボタンの活性状態を切り替える
LoadBalancerStatus status = LoadBalancerStatus.fromStatus(loadBalancerDto.getLoadBalancer().getStatus());
// Startボタン
if (status == LoadBalancerStatus.STOPPED || status == LoadBalancerStatus.RUNNING) {
startButton.setEnabled(true);
} else {
startButton.setEnabled(false);
}
// Stopボタン
if (status == LoadBalancerStatus.RUNNING || status == LoadBalancerStatus.WARNING) {
stopButton.setEnabled(true);
} else {
stopButton.setEnabled(false);
}
// Editボタン
if (status == LoadBalancerStatus.STOPPED || status == LoadBalancerStatus.RUNNING) {
editButton.setEnabled(true);
} else {
editButton.setEnabled(false);
}
// Deleteボタン
if (status == LoadBalancerStatus.STOPPED) {
deleteButton.setEnabled(true);
} else {
deleteButton.setEnabled(false);
}
}
private void refreshTable() {
// 選択されているロードバランサを保持する
Long selectedLoadBalancerNo = null;
if (sender.loadBalancerPanel.loadBalancerTable.getValue() != null) {
LoadBalancerDto loadBalancer = (LoadBalancerDto) sender.loadBalancerPanel.loadBalancerTable.getValue();
selectedLoadBalancerNo = loadBalancer.getLoadBalancer().getLoadBalancerNo();
}
int index = sender.loadBalancerPanel.loadBalancerTable.getCurrentPageFirstItemIndex();
// 表示を更新
sender.refreshTable();
// 選択されていたサーバを選択し直す
if (selectedLoadBalancerNo != null) {
for (Object itemId : sender.loadBalancerPanel.loadBalancerTable.getItemIds()) {
LoadBalancerDto loadBalancer = (LoadBalancerDto) itemId;
if (selectedLoadBalancerNo.equals(loadBalancer.getLoadBalancer().getLoadBalancerNo())) {
sender.loadBalancerPanel.loadBalancerTable.select(itemId);
sender.loadBalancerPanel.loadBalancerTable.setCurrentPageFirstItemIndex(index);
break;
}
}
}
}
private void addButtonClick(ClickEvent event) {
WinLoadBalancerAdd winLoadBalancerAdd = new WinLoadBalancerAdd();
winLoadBalancerAdd.addListener(new Window.CloseListener() {
@Override
public void windowClose(CloseEvent e) {
refreshTable();
}
});
getWindow().addWindow(winLoadBalancerAdd);
}
private void startButtonClick(ClickEvent event) {
final LoadBalancerDto loadBalancer = (LoadBalancerDto) sender.loadBalancerPanel.loadBalancerTable.getValue();
// AWSロードバランサでVPCの場合、サブネットを設定していることを確認
if (PCCConstant.LOAD_BALANCER_ELB.equals(loadBalancer.getLoadBalancer().getType())) {
if (BooleanUtils.isTrue(loadBalancer.getPlatform().getPlatformAws().getVpc())) {
if (StringUtils.isEmpty(loadBalancer.getAwsLoadBalancer().getSubnetId())) {
throw new AutoApplicationException("IUI-000111");
}
}
}
// 確認ダイアログを表示
LoadBalancerStatus status = LoadBalancerStatus.fromStatus(loadBalancer.getLoadBalancer().getStatus());
String code = status == LoadBalancerStatus.STOPPED ? "IUI-000057" : "IUI-000059";
String message = ViewMessages.getMessage(code, loadBalancer.getLoadBalancer().getLoadBalancerName());
DialogConfirm dialog = new DialogConfirm(ViewProperties.getCaption("dialog.confirm"), message, Buttons.OKCancel);
dialog.setCallback(new DialogConfirm.Callback() {
@Override
public void onDialogResult(Result result) {
if (result != Result.OK) {
return;
}
start(loadBalancer.getLoadBalancer().getLoadBalancerNo());
}
});
getApplication().getMainWindow().addWindow(dialog);
}
private void start(Long loadBalancerNo) {
// オペレーションログ
OperationLogger.writeLoadBalancer("LOAD_BALANCER", "Start Load_Balancer", loadBalancerNo, null);
// ロードバランサを起動
ProcessService processService = BeanContext.getBean(ProcessService.class);
processService.startLoadBalancers(ViewContext.getFarmNo(), Arrays.asList(loadBalancerNo));
// 表示を更新
refreshTable();
}
private void stopButtonClick(ClickEvent event) {
final LoadBalancerDto loadBalancer = (LoadBalancerDto) sender.loadBalancerPanel.loadBalancerTable.getValue();
// 確認ダイアログを表示
String message = ViewMessages.getMessage("IUI-000058", loadBalancer.getLoadBalancer().getLoadBalancerName());
DialogConfirm dialog = new DialogConfirm(ViewProperties.getCaption("dialog.confirm"), message, Buttons.OKCancel);
dialog.setCallback(new DialogConfirm.Callback() {
@Override
public void onDialogResult(Result result) {
if (result != Result.OK) {
return;
}
stop(loadBalancer.getLoadBalancer().getLoadBalancerNo());
}
});
getApplication().getMainWindow().addWindow(dialog);
}
private void stop(Long loadBalancerNo) {
// オペレーションログ
OperationLogger.writeLoadBalancer("LOAD_BALANCER", "Stop Load_Balancer", loadBalancerNo, null);
// ロードバランサを停止
ProcessService processService = BeanContext.getBean(ProcessService.class);
processService.stopLoadBalancers(ViewContext.getFarmNo(), Arrays.asList(loadBalancerNo));
// 表示を更新
refreshTable();
}
private void editButtonClick(ClickEvent event) {
LoadBalancerDto loadBalancer = (LoadBalancerDto) sender.loadBalancerPanel.loadBalancerTable.getValue();
Window winLoadBalancerEdit;
if (PCCConstant.PLATFORM_TYPE_CLOUDSTACK.equals(loadBalancer.getLoadBalancer().getType())) {
winLoadBalancerEdit = new WinCloudStackLoadBalancerEdit(loadBalancer.getLoadBalancer().getLoadBalancerNo());
} else {
winLoadBalancerEdit = new WinLoadBalancerEdit(loadBalancer.getLoadBalancer().getLoadBalancerNo());
}
winLoadBalancerEdit.addListener(new Window.CloseListener() {
@Override
public void windowClose(CloseEvent e) {
refreshTable();
}
});
getWindow().addWindow(winLoadBalancerEdit);
}
private void deleteButtonClick(ClickEvent event) {
final LoadBalancerDto dto = (LoadBalancerDto) sender.loadBalancerPanel.loadBalancerTable.getValue();
String message = ViewMessages.getMessage("IUI-000056", dto.getLoadBalancer().getLoadBalancerName());
DialogConfirm dialog = new DialogConfirm(ViewProperties.getCaption("dialog.confirm"), message, Buttons.OKCancel);
dialog.setCallback(new DialogConfirm.Callback() {
@Override
public void onDialogResult(Result result) {
if (result != Result.OK) {
return;
}
delete(dto.getLoadBalancer().getLoadBalancerNo());
}
});
getApplication().getMainWindow().addWindow(dialog);
}
private void delete(Long loadBalancerNo) {
// オペレーションログ
OperationLogger.writeLoadBalancer("LOAD_BALANCER", "Delete Load_Balancer", loadBalancerNo, null);
// ロードバランサを削除
LoadBalancerService loadBalancerService = BeanContext.getBean(LoadBalancerService.class);
loadBalancerService.deleteLoadBalancer(loadBalancerNo);
// ロードバランサの選択を解除
sender.loadBalancerPanel.loadBalancerTable.select(null);
// 表示を更新
refreshTable();
}
}