/* * 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.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import jp.primecloud.auto.common.constant.PCCConstant; import jp.primecloud.auto.common.status.InstanceStatus; import jp.primecloud.auto.config.Config; import jp.primecloud.auto.entity.crud.AwsAddress; import jp.primecloud.auto.entity.crud.ComponentType; import jp.primecloud.auto.entity.crud.NiftyKeyPair; import jp.primecloud.auto.entity.crud.VcloudDisk; import jp.primecloud.auto.entity.crud.VcloudInstanceNetwork; import jp.primecloud.auto.entity.crud.VmwareAddress; import jp.primecloud.auto.entity.crud.VmwareKeyPair; import jp.primecloud.auto.exception.AutoApplicationException; import jp.primecloud.auto.process.aws.AwsAddressProcess; import jp.primecloud.auto.process.aws.AwsProcessClient; import jp.primecloud.auto.process.aws.AwsProcessClientFactory; import jp.primecloud.auto.service.AwsDescribeService; import jp.primecloud.auto.service.IaasDescribeService; import jp.primecloud.auto.service.InstanceService; import jp.primecloud.auto.service.NiftyDescribeService; import jp.primecloud.auto.service.VmwareDescribeService; import jp.primecloud.auto.service.dto.AddressDto; import jp.primecloud.auto.service.dto.ComponentInstanceDto; import jp.primecloud.auto.service.dto.DataDiskDto; import jp.primecloud.auto.service.dto.ImageDto; import jp.primecloud.auto.service.dto.InstanceDto; import jp.primecloud.auto.service.dto.InstanceNetworkDto; import jp.primecloud.auto.service.dto.KeyPairDto; import jp.primecloud.auto.service.dto.NetworkDto; import jp.primecloud.auto.service.dto.PlatformDto; import jp.primecloud.auto.service.dto.SecurityGroupDto; import jp.primecloud.auto.service.dto.StorageTypeDto; import jp.primecloud.auto.service.dto.SubnetDto; import jp.primecloud.auto.service.dto.VmwareAddressDto; import jp.primecloud.auto.service.dto.ZoneDto; import jp.primecloud.auto.ui.DialogConfirm.Buttons; import jp.primecloud.auto.ui.DialogConfirm.Callback; import jp.primecloud.auto.ui.DialogConfirm.Result; import jp.primecloud.auto.ui.util.BeanContext; import jp.primecloud.auto.ui.util.ContextUtils; import jp.primecloud.auto.ui.util.IconUtils; 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 jp.primecloud.auto.ui.validator.IntegerRangeValidator; import jp.primecloud.auto.util.IpAddressUtils; import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.NumberUtils; import com.amazonaws.services.ec2.model.AvailabilityZone; import com.amazonaws.services.ec2.model.KeyPairInfo; import com.amazonaws.services.ec2.model.SecurityGroup; import com.amazonaws.services.ec2.model.Subnet; import com.vaadin.data.Item; import com.vaadin.data.Property; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Property.ValueChangeListener; import com.vaadin.data.Validator; import com.vaadin.data.util.IndexedContainer; import com.vaadin.data.validator.RegexpValidator; import com.vaadin.data.validator.StringLengthValidator; import com.vaadin.event.ShortcutAction.KeyCode; import com.vaadin.ui.AbstractSelect; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.ComboBox; import com.vaadin.ui.CssLayout; import com.vaadin.ui.Form; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.OptionGroup; import com.vaadin.ui.Panel; import com.vaadin.ui.TabSheet; import com.vaadin.ui.Table; import com.vaadin.ui.TextField; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; import com.vmware.vim25.mo.ComputeResource; /** * <p> * サーバ編集画面を生成します。 * </p> * */ @SuppressWarnings("serial") public class WinServerEdit extends Window { private final String TAB_HEIGHT = "420px"; private Long instanceNo; private BasicTab basicTab; private AwsDetailTab awsDetailTab; private VmwareDetailTab vmwareDetailTab; private VmwareEditIpTab vmwareEditIpTab; private NiftyDetailTab niftyDetailTab; private CloudStackDetailTab cloudStackDetailTab; private VcloudDetailTab vcloudDetailTab; private VcloudNetworkTab vcloudNetworkTab; private AzureDetailTab azureDetailTab; private OpenStackDetailTab openStackDetailTab; private InstanceDto instance; private PlatformDto platform; private ImageDto image; public WinServerEdit(Long instanceNo) { this.instanceNo = instanceNo; } @Override public void attach() { // 初期データの取得 loadData(); // モーダルウインドウ setCaption(ViewProperties.getCaption("window.winServerEdit")); setModal(true); setWidth("600px"); setIcon(Icons.EDITMINI.resource()); VerticalLayout layout = (VerticalLayout) getContent(); layout.setMargin(false, true, false, true); layout.setSpacing(true); TabSheet tab = new TabSheet(); // 基本情報タブ basicTab = new BasicTab(instance, platform, image); tab.addTab(basicTab, ViewProperties.getCaption("tab.basic"), Icons.BASIC.resource()); layout.addComponent(tab); basicTab.loadData(); basicTab.initValidation(); basicTab.show(); // AWSの場合 if (PCCConstant.PLATFORM_TYPE_AWS.equals(platform.getPlatform().getPlatformType())) { // 詳細設定タブ awsDetailTab = new AwsDetailTab(instance, platform, image); tab.addTab(awsDetailTab, ViewProperties.getCaption("tab.detail"), Icons.DETAIL.resource()); awsDetailTab.loadData(); awsDetailTab.initValidation(); awsDetailTab.show(); } // VMwareの場合 else if (PCCConstant.PLATFORM_TYPE_VMWARE.equals(platform.getPlatform().getPlatformType())) { // 詳細設定タブ vmwareDetailTab = new VmwareDetailTab(instance, platform, image); tab.addTab(vmwareDetailTab, ViewProperties.getCaption("tab.detail"), Icons.DETAIL.resource()); vmwareDetailTab.loadData(); vmwareDetailTab.initValidation(); vmwareDetailTab.show(); // IP設定タブ boolean enableVmwareStaticIp = BooleanUtils.toBoolean(Config.getProperty("ui.enableVmwareEditIp")); if (BooleanUtils.isTrue(enableVmwareStaticIp)) { vmwareEditIpTab = new VmwareEditIpTab(instance); tab.addTab(vmwareEditIpTab, ViewProperties.getCaption("tab.editIp"), Icons.DETAIL.resource()); vmwareEditIpTab.initValidation(); vmwareEditIpTab.show(); } } // Niftyの場合 else if (PCCConstant.PLATFORM_TYPE_NIFTY.equals(platform.getPlatform().getPlatformType())) { // 詳細設定タブ niftyDetailTab = new NiftyDetailTab(instance, platform, image); tab.addTab(niftyDetailTab, ViewProperties.getCaption("tab.detail"), Icons.DETAIL.resource()); niftyDetailTab.loadData(); niftyDetailTab.initValidation(); niftyDetailTab.show(); } // CloudStackの場合 else if (PCCConstant.PLATFORM_TYPE_CLOUDSTACK.equals(platform.getPlatform().getPlatformType())) { // 詳細設定タブ cloudStackDetailTab = new CloudStackDetailTab(instance, platform, image); tab.addTab(cloudStackDetailTab, ViewProperties.getCaption("tab.detail"), Icons.DETAIL.resource()); cloudStackDetailTab.loadData(); cloudStackDetailTab.initValidation(); cloudStackDetailTab.show(); } // vCloudの場合 else if (PCCConstant.PLATFORM_TYPE_VCLOUD.equals(platform.getPlatform().getPlatformType())) { // 詳細設定タブ vcloudDetailTab = new VcloudDetailTab(instance, platform, image); tab.addTab(vcloudDetailTab, ViewProperties.getCaption("tab.detail"), Icons.DETAIL.resource()); vcloudDetailTab.loadData(); vcloudDetailTab.initValidation(); vcloudDetailTab.show(); // ネットワーク設定タブ vcloudNetworkTab = new VcloudNetworkTab(instance, platform); tab.addTab(vcloudNetworkTab, ViewProperties.getCaption("tab.network"), Icons.DETAIL.resource()); vcloudNetworkTab.loadData(); vcloudNetworkTab.show(); } // Azureの場合 else if (PCCConstant.PLATFORM_TYPE_AZURE.equals(platform.getPlatform().getPlatformType())) { // 詳細設定タブ azureDetailTab = new AzureDetailTab(instance, platform, image); tab.addTab(azureDetailTab, ViewProperties.getCaption("tab.detail"), Icons.DETAIL.resource()); azureDetailTab.loadData(); azureDetailTab.initValidation(); azureDetailTab.show(); } // OpenStackの場合 else if (PCCConstant.PLATFORM_TYPE_OPENSTACK.equals(platform.getPlatform().getPlatformType())) { // 詳細設定タブ openStackDetailTab = new OpenStackDetailTab(instance, platform, image); tab.addTab(openStackDetailTab, ViewProperties.getCaption("tab.detail"), Icons.DETAIL.resource()); openStackDetailTab.loadData(); openStackDetailTab.initValidation(); openStackDetailTab.show(); } // 下部のバー HorizontalLayout bottomLayout = new HorizontalLayout(); bottomLayout.setSpacing(true); bottomLayout.setMargin(false, false, true, false); layout.addComponent(bottomLayout); layout.setComponentAlignment(bottomLayout, Alignment.BOTTOM_RIGHT); // OKボタン Button okButton = new Button(ViewProperties.getCaption("button.ok")); okButton.setDescription(ViewProperties.getCaption("description.editServer.ok")); okButton.addListener(new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { okButtonClick(event); } }); bottomLayout.addComponent(okButton); okButton.setClickShortcut(KeyCode.ENTER); // [Enter]でokButtonクリック okButton.focus(); // Cancelボタン Button cancelButton = new Button(ViewProperties.getCaption("button.cancel")); cancelButton.setDescription(ViewProperties.getCaption("description.cancel")); cancelButton.addListener(new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { close(); } }); bottomLayout.addComponent(cancelButton); } private class BasicTab extends VerticalLayout { private InstanceDto instance; private PlatformDto platform; private ImageDto image; private TextField serverNameField; private TextField hostNameField; private TextField commentField; private Label cloudLabel; private Label imageLabel; private Label osLabel; private AvailableServiceTable serviceTable; private List<Long> componentNos; private boolean attachService = false; public BasicTab(InstanceDto instance, PlatformDto platform, ImageDto image) { this.instance = instance; this.platform = platform; this.image = image; } @Override public void attach() { setHeight(TAB_HEIGHT); setMargin(false, true, false, true); setSpacing(false); Form form = new Form(); form.setSizeFull(); form.addStyleName("win-server-edit-form"); // サーバ名 serverNameField = new TextField(ViewProperties.getCaption("field.serverName")); form.getLayout().addComponent(serverNameField); // ホスト名 hostNameField = new TextField(ViewProperties.getCaption("field.hostName")); hostNameField.setWidth("100%"); form.getLayout().addComponent(hostNameField); // コメント commentField = new TextField(ViewProperties.getCaption("field.comment")); commentField.setWidth("100%"); form.getLayout().addComponent(commentField); // プラットフォーム CssLayout cloudLayout = new CssLayout(); cloudLayout.setWidth("100%"); cloudLayout.setCaption(ViewProperties.getCaption("field.cloud")); cloudLabel = new Label(); cloudLayout.addComponent(cloudLabel); form.getLayout().addComponent(cloudLayout); // サーバ種別 CssLayout imageLayout = new CssLayout(); imageLayout.setWidth("100%"); imageLayout.setCaption(ViewProperties.getCaption("field.image")); imageLabel = new Label(); imageLayout.addComponent(imageLabel); form.getLayout().addComponent(imageLayout); // OS CssLayout osLayout = new CssLayout(); osLayout.setWidth("100%"); osLayout.setCaption(ViewProperties.getCaption("field.os")); osLabel = new Label(); osLayout.addComponent(osLabel); form.getLayout().addComponent(osLayout); // ロードバランサでない場合 if (BooleanUtils.isNotTrue(instance.getInstance().getLoadBalancer())) { // サービスを有効にするかどうか String enableService = Config.getProperty("ui.enableService"); // サービスを有効にする場合 if (StringUtils.isEmpty(enableService) || BooleanUtils.toBoolean(enableService)) { // 利用可能サービス Panel panel = new Panel(); serviceTable = new AvailableServiceTable(); panel.addComponent(serviceTable); form.getLayout().addComponent(panel); panel.setSizeFull(); // サービス選択ボタン Button attachServiceButton = new Button(ViewProperties.getCaption("button.serverAttachService")); attachServiceButton.setDescription(ViewProperties.getCaption("description.serverAttachService")); attachServiceButton.setIcon(Icons.SERVICETAB.resource()); attachServiceButton.addListener(new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { attachServiceButtonClick(event); } }); HorizontalLayout layout = new HorizontalLayout(); layout.setSpacing(true); layout.addComponent(attachServiceButton); Label label = new Label(ViewProperties.getCaption("label.serverAttachService")); layout.addComponent(label); layout.setComponentAlignment(label, Alignment.MIDDLE_LEFT); form.getLayout().addComponent(layout); } } addComponent(form); } private void loadData() { // サーバに関連付けられたサービスを取得 componentNos = new ArrayList<Long>(); List<ComponentInstanceDto> componentInstances = instance.getComponentInstances(); for (ComponentInstanceDto componentInstance : componentInstances) { if (BooleanUtils.isTrue(componentInstance.getComponentInstance().getAssociate())) { componentNos.add(componentInstance.getComponentInstance().getComponentNo()); } } } public void show() { // サーバ名 serverNameField.setReadOnly(false); serverNameField.setValue(instance.getInstance().getInstanceName()); serverNameField.setReadOnly(true); // ホスト名 hostNameField.setReadOnly(false); hostNameField.setValue(instance.getInstance().getFqdn()); hostNameField.setReadOnly(true); // コメント String comment = instance.getInstance().getComment(); if (comment != null) { commentField.setValue(comment); } // プラットフォーム String cloudName = platform.getPlatform().getPlatformNameDisp(); Icons cloudIcon = IconUtils.getPlatformIcon(platform); cloudLabel.setCaption(cloudName); cloudLabel.setIcon(cloudIcon.resource()); // サーバ種別 String imageName = image.getImage().getImageNameDisp(); Icons imageIcon = IconUtils.getImageIcon(image); imageLabel.setCaption(imageName); imageLabel.setIcon(imageIcon.resource()); // OS String osName = image.getImage().getOsDisp(); Icons osIcon = IconUtils.getOsIcon(image); osLabel.setCaption(osName); osLabel.setIcon(osIcon.resource()); // ロードバランサでない場合 if (BooleanUtils.isNotTrue(instance.getInstance().getLoadBalancer())) { // 利用可能サービス if (serviceTable != null) { serviceTable.show(image.getComponentTypes()); } } } private void initValidation() { String message = ViewMessages.getMessage("IUI-000003"); commentField.addValidator(new StringLengthValidator(message, -1, 100, true)); } private void attachServiceButtonClick(ClickEvent event) { WinServerAttachService winServerAttachService = new WinServerAttachService(instance, image, componentNos); winServerAttachService.addListener(new Window.CloseListener() { @Override @SuppressWarnings("unchecked") public void windowClose(Window.CloseEvent e) { List<Long> componentNos = (List<Long>) ContextUtils.getAttribute("componentNos"); if (componentNos != null) { ContextUtils.removeAttribute("componentNos"); BasicTab.this.componentNos = componentNos; attachService = true; } } }); getWindow().getApplication().getMainWindow().addWindow(winServerAttachService); } } private class AvailableServiceTable extends Table { @Override public void attach() { // テーブル基本設定 setCaption(ViewProperties.getCaption("table.availableService")); setWidth("100%"); setPageLength(3); setColumnHeaderMode(Table.COLUMN_HEADER_MODE_HIDDEN); setSortDisabled(true); setColumnReorderingAllowed(false); setColumnCollapsingAllowed(false); setSelectable(false); setMultiSelect(false); setImmediate(true); addStyleName("win-server-add-service"); // カラム設定 addContainerProperty("Service", Label.class, new Label()); addContainerProperty("Description", String.class, null); setColumnExpandRatio("Service", 100); setCellStyleGenerator(new StandardCellStyleGenerator()); } public void show(List<ComponentType> componentTypes) { removeAllItems(); if (componentTypes == null) { return; } for (ComponentType componentType : componentTypes) { // サービス名 String name = componentType.getComponentTypeNameDisp(); Icons nameIcon = Icons.fromName(componentType.getComponentTypeName()); Label slbl = new Label(IconUtils.createImageTag(getApplication(), nameIcon, name), Label.CONTENT_XHTML); slbl.setHeight("26px"); // サービス説明 String description = componentType.getLayerDisp(); addItem(new Object[] { slbl, description }, componentType.getComponentTypeNo()); } } } private class AwsDetailTab extends VerticalLayout { private InstanceDto instance; private PlatformDto platform; private ImageDto image; private Form form = new Form(); private ComboBox sizeSelect; private ComboBox keySelect; private ComboBox grpSelect; private ComboBox subnetSelect; private TextField privateIpField; private ComboBox zoneSelect; private TextField rootSizeField; private ComboBox elasticIpSelect; private List<String> keyNames; private List<String> groupNames; private List<AvailabilityZone> zones; private List<AwsAddress> elasticIps; private List<Subnet> subnets; private final String CIDR_BLOCK_CAPTION_ID = "cidrBlock"; private final String ZONE_CAPTION_ID = "zoneName"; private final String ELASTIC_IP_CAPTION_ID = "ElasticIP"; private final Long NULL_ADDRESS = Long.valueOf(-1L); private final String TEXT_WIDTH = "150px"; private final String COMBOBOX_WIDTH = "150px"; private final String IP_COMBOBOX_WIDTH = "220px"; private final String BUTTON_WIDTH = "150px"; public AwsDetailTab(InstanceDto instance, PlatformDto platform, ImageDto image) { this.instance = instance; this.platform = platform; this.image = image; } @Override public void attach() { setHeight(TAB_HEIGHT); setMargin(false, true, false, true); setSpacing(false); // サーバサイズ sizeSelect = new ComboBox(ViewProperties.getCaption("field.serverSize")); sizeSelect.setWidth(COMBOBOX_WIDTH); sizeSelect.setNullSelectionAllowed(false); form.getLayout().addComponent(sizeSelect); // キーペア keySelect = new ComboBox(ViewProperties.getCaption("field.keyPair")); keySelect.setWidth(COMBOBOX_WIDTH); keySelect.setNullSelectionAllowed(false); form.getLayout().addComponent(keySelect); // セキュリティグループ grpSelect = new ComboBox(ViewProperties.getCaption("field.securityGroup")); grpSelect.setWidth(COMBOBOX_WIDTH); grpSelect.setImmediate(true); grpSelect.setNullSelectionAllowed(false); form.getLayout().addComponent(grpSelect); // VPCの場合 if (BooleanUtils.isTrue(platform.getPlatformAws().getVpc())) { // サブネット subnetSelect = new ComboBox(ViewProperties.getCaption("field.subnet")); subnetSelect.setImmediate(true); subnetSelect.setWidth(COMBOBOX_WIDTH); subnetSelect.setNullSelectionAllowed(false); subnetSelect.addContainerProperty(CIDR_BLOCK_CAPTION_ID, String.class, null); subnetSelect.setItemCaptionPropertyId(CIDR_BLOCK_CAPTION_ID); subnetSelect.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY); form.getLayout().addComponent(subnetSelect); // プライベートIPアドレス privateIpField = new TextField(ViewProperties.getCaption("field.privateIp")); privateIpField.setImmediate(true); privateIpField.setWidth(TEXT_WIDTH); form.getLayout().addComponent(privateIpField); String enablePrivateIp = Config.getProperty("ui.aws.enablePrivateIp"); if (StringUtils.isNotEmpty(enablePrivateIp) && !BooleanUtils.toBoolean(enablePrivateIp)) { privateIpField.setEnabled(false); } } // 非VPCの場合 else { // ゾーン zoneSelect = new ComboBox(ViewProperties.getCaption("field.zone")); zoneSelect.setWidth(COMBOBOX_WIDTH); zoneSelect.setNullSelectionAllowed(false); zoneSelect.addContainerProperty(ZONE_CAPTION_ID, String.class, null); zoneSelect.setItemCaptionPropertyId(ZONE_CAPTION_ID); zoneSelect.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY); form.getLayout().addComponent(zoneSelect); } // ルートサイズ rootSizeField = new TextField(ViewProperties.getCaption("field.rootSize")); rootSizeField.setImmediate(true); rootSizeField.setWidth(TEXT_WIDTH); form.getLayout().addComponent(rootSizeField); // ElasticIp String enableElasticIp = Config.getProperty("ui.aws.enableElasticIp"); if (StringUtils.isEmpty(enableElasticIp) || BooleanUtils.toBoolean(enableElasticIp)) { Label spacer = new Label(" "); spacer.addStyleName("desc-padding-horizontal"); spacer.setHeight("5px"); form.getLayout().addComponent(spacer); elasticIpSelect = new ComboBox(ViewProperties.getCaption("field.elasticIp")); elasticIpSelect.setWidth(IP_COMBOBOX_WIDTH); elasticIpSelect.setNullSelectionAllowed(false); elasticIpSelect.addContainerProperty(ELASTIC_IP_CAPTION_ID, String.class, null); elasticIpSelect.setItemCaptionPropertyId(ELASTIC_IP_CAPTION_ID); elasticIpSelect.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY); form.getLayout().addComponent(elasticIpSelect); Button addButton = new Button(ViewProperties.getCaption("button.addElasticIp")); addButton.setDescription(ViewProperties.getCaption("description.addElasticIp")); addButton.setIcon(Icons.ADD.resource()); addButton.setWidth(BUTTON_WIDTH); addButton.addListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { addButtonClick(); } }); Button deleteButton = new Button(ViewProperties.getCaption("button.deleteElasticIp")); deleteButton.setDescription(ViewProperties.getCaption("description.deleteElasticIp")); deleteButton.setIcon(Icons.DELETEMINI.resource()); deleteButton.setWidth(BUTTON_WIDTH); deleteButton.addListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { deleteButtonClick(); } }); HorizontalLayout layout = new HorizontalLayout(); layout.setSpacing(true); layout.setMargin(false); layout.addComponent(addButton); layout.addComponent(deleteButton); form.getLayout().addComponent(layout); } addComponent(form); } private void loadData() { AwsDescribeService awsDescribeService = BeanContext.getBean(AwsDescribeService.class); Long platformNo = platform.getPlatform().getPlatformNo(); // キーペア情報を取得 List<KeyPairInfo> keyPairInfos = awsDescribeService.getKeyPairs(ViewContext.getUserNo(), platformNo); List<String> keyNames = new ArrayList<String>(); for (KeyPairInfo keyPairInfo : keyPairInfos) { keyNames.add(keyPairInfo.getKeyName()); } this.keyNames = keyNames; // セキュリティグループ情報を取得 List<String> groupNames = new ArrayList<String>(); List<SecurityGroup> securityGroups = awsDescribeService.getSecurityGroups(ViewContext.getUserNo(), platformNo); for (SecurityGroup securityGroup : securityGroups) { groupNames.add(securityGroup.getGroupName()); } this.groupNames = groupNames; // VPCの場合 if (BooleanUtils.isTrue(platform.getPlatformAws().getVpc())) { // サブネット情報の取得 List<Subnet> subnets = awsDescribeService.getSubnets(ViewContext.getUserNo(), platformNo); this.subnets = subnets; } // 非VPCの場合 else { // ゾーン情報の取得 List<AvailabilityZone> zones = awsDescribeService.getAvailabilityZones(ViewContext.getUserNo(), platformNo); if (BooleanUtils.isNotTrue(platform.getPlatformAws().getEuca())) { // EC2の場合、空行を先頭に追加してゾーンを無指定にできるようにする zones.add(0, new AvailabilityZone()); } this.zones = zones; } // ElasticIp情報の取得 List<AwsAddress> elasticIps = awsDescribeService.getAddresses(ViewContext.getUserNo(), platformNo); this.elasticIps = elasticIps; } private void initValidation() { String message; message = ViewMessages.getMessage("IUI-000027"); sizeSelect.setRequired(true); sizeSelect.setRequiredError(message); message = ViewMessages.getMessage("IUI-000028"); keySelect.setRequired(true); keySelect.setRequiredError(message); message = ViewMessages.getMessage("IUI-000029"); grpSelect.setRequired(true); grpSelect.setRequiredError(message); if (BooleanUtils.isTrue(platform.getPlatformAws().getEuca())) { // Eucalyptus の場合は入力必須 message = ViewMessages.getMessage("IUI-000050"); zoneSelect.setRequired(true); zoneSelect.setRequiredError(message); } if (BooleanUtils.isTrue(platform.getPlatformAws().getVpc())) { // VPCの場合 message = ViewMessages.getMessage("IUI-000108"); subnetSelect.setRequired(true); subnetSelect.setRequiredError(message); privateIpField.setRequired(false); Validator privateIpFieldValidator = new RegexpValidator( "^(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])$", ViewMessages.getMessage("IUI-000095", privateIpField.getCaption())); privateIpField.addValidator(privateIpFieldValidator); } if (BooleanUtils.isTrue(image.getImageAws().getEbsImage()) && image.getImageAws().getRootSize() != null) { int maxRootSize = NumberUtils.toInt(Config.getProperty("aws.maxRootSize"), 1024); message = ViewMessages.getMessage("IUI-000135", image.getImageAws().getRootSize(), maxRootSize); rootSizeField.setRequired(false); rootSizeField.addValidator(new IntegerRangeValidator(image.getImageAws().getRootSize(), maxRootSize, message)); } if (elasticIpSelect != null) { message = ViewMessages.getMessage("IUI-000063"); elasticIpSelect.setRequired(true); elasticIpSelect.setRequiredError(message); } } public void show() { // サーバサイズ for (String instanceType : image.getImageAws().getInstanceTypes().split(",")) { sizeSelect.addItem(instanceType.trim()); } sizeSelect.select(instance.getAwsInstance().getInstanceType()); // キーペア for (String keyName : keyNames) { keySelect.addItem(keyName); } keySelect.select(instance.getAwsInstance().getKeyName()); // セキュリティグループ for (String groupName : groupNames) { grpSelect.addItem(groupName); } grpSelect.select(instance.getAwsInstance().getSecurityGroups()); // VPCの場合 if (BooleanUtils.isTrue(platform.getPlatformAws().getVpc())) { // サブネット for (Subnet subnet : subnets) { Item item = subnetSelect.addItem(subnet.getSubnetId()); item.getItemProperty(CIDR_BLOCK_CAPTION_ID).setValue(subnet.getCidrBlock()); } subnetSelect.select(instance.getAwsInstance().getSubnetId()); // プライベートIPアドレス boolean enablePrivateIp = privateIpField.isEnabled(); if (!enablePrivateIp) { privateIpField.setEnabled(true); } privateIpField.setValue(instance.getAwsInstance().getPrivateIpAddress()); if (!enablePrivateIp) { privateIpField.setEnabled(false); } } // 非VPCの場合 else { // ゾーン for (AvailabilityZone zone : zones) { Item item = zoneSelect.addItem(zone.getZoneName()); item.getItemProperty(ZONE_CAPTION_ID).setValue(zone.getZoneName()); } zoneSelect.select(instance.getAwsInstance().getAvailabilityZone()); } // ルートディスクサイズ rootSizeField.setValue(ObjectUtils.toString(instance.getAwsInstance().getRootSize(), "")); if (BooleanUtils.isNotTrue(image.getImageAws().getEbsImage()) || image.getImageAws().getRootSize() == null) { rootSizeField.setEnabled(false); } // ElasticIP if (elasticIpSelect != null) { showElasticIp(); if (instance.getAwsAddress() != null) { elasticIpSelect.select(instance.getAwsAddress().getAddressNo()); } else { elasticIpSelect.select(NULL_ADDRESS); } } // サーバが停止していない場合、詳細設定タブ自体を変更できないようにする InstanceStatus status = InstanceStatus.fromStatus(instance.getInstance().getStatus()); if (status != InstanceStatus.STOPPED) { form.setEnabled(false); } // サーバが既に作成済みの場合、いくつかの項目を変更できないようにする if (StringUtils.isNotEmpty(instance.getAwsInstance().getInstanceId())) { keySelect.setEnabled(false); if (BooleanUtils.isTrue(platform.getPlatformAws().getVpc())) { subnetSelect.setEnabled(false); privateIpField.setEnabled(false); } else { grpSelect.setEnabled(false); // セキュリティグループは非VPCの場合のみ変更できない zoneSelect.setEnabled(false); } rootSizeField.setEnabled(false); } // サーバが作成済みの場合、ルートディスクサイズの入力チェックを無効にする if (StringUtils.isNotEmpty(instance.getAwsInstance().getInstanceId())) { List<Validator> validators = new ArrayList<Validator>(rootSizeField.getValidators()); for (Validator validator : validators) { rootSizeField.removeValidator(validator); } } // ボリュームが作成済みの場合、いくつかの項目を変更できないようにする if (instance.getAwsVolumes() != null && instance.getAwsVolumes().size() > 0) { if (BooleanUtils.isTrue(platform.getPlatformAws().getVpc())) { subnetSelect.setEnabled(false); } else { zoneSelect.setEnabled(false); } } } public void showElasticIp() { elasticIpSelect.removeAllItems(); String dynamic = ViewProperties.getCaption("field.elasticIp.dynamic"); String associated = ViewProperties.getCaption("field.elasticIp.associated"); { Item item = elasticIpSelect.addItem(NULL_ADDRESS); item.getItemProperty(ELASTIC_IP_CAPTION_ID).setValue(dynamic); } for (AwsAddress address : elasticIps) { Item item = elasticIpSelect.addItem(address.getAddressNo()); if (address.getInstanceNo() == null) { item.getItemProperty(ELASTIC_IP_CAPTION_ID).setValue(address.getPublicIp()); } else { item.getItemProperty(ELASTIC_IP_CAPTION_ID).setValue(address.getPublicIp() + " " + associated); } } } public Subnet findSubnet(String subnetId) { for (Subnet subnet : subnets) { if (subnet.getSubnetId().equals(subnetId)) { return subnet; } } return null; } public AwsAddress findAwsAddress(Long addressNo) { for (AwsAddress awsAddress : elasticIps) { if (addressNo.equals(awsAddress.getAddressNo())) { return awsAddress; } } return null; } private void addButtonClick() { // 新しいElasticIPを取得する AwsProcessClientFactory awsProcessClientFactory = BeanContext.getBean(AwsProcessClientFactory.class); AwsAddressProcess awsAddressProcess = BeanContext.getBean(AwsAddressProcess.class); AwsProcessClient awsProcessClient = awsProcessClientFactory.createAwsProcessClient(ViewContext.getUserNo(), instance.getInstance().getPlatformNo()); AwsAddress awsAddress = awsAddressProcess.createAddress(awsProcessClient); // ElasticIP情報を再取得して表示する AwsDescribeService awsDescribeService = BeanContext.getBean(AwsDescribeService.class); elasticIps = awsDescribeService.getAddresses(ViewContext.getUserNo(), instance.getInstance() .getPlatformNo()); showElasticIp(); elasticIpSelect.select(awsAddress.getAddressNo()); // 取得したElasticIPをダイアログ表示する String message = ViewMessages.getMessage("IUI-000061", awsAddress.getPublicIp()); DialogConfirm dialog = new DialogConfirm(ViewProperties.getCaption("dialog.confirm"), message, Buttons.OK); getApplication().getMainWindow().addWindow(dialog); } private void deleteButtonClick() { Long addressNo = (Long) elasticIpSelect.getValue(); // ElasticIPが選択されていない場合 if (addressNo == null || NULL_ADDRESS.equals(addressNo)) { throw new AutoApplicationException("IUI-000062"); } // 自サーバ以外に割り当てられているElasticIPが選択されている場合は削除できない final AwsAddress address = findAwsAddress(addressNo); if (address.getInstanceNo() != null && !address.getInstanceNo().equals(instance.getInstance().getInstanceNo())) { throw new AutoApplicationException("IUI-000064"); } String message = ViewMessages.getMessage("IUI-000060", address.getPublicIp()); DialogConfirm dialogConfirm = new DialogConfirm(ViewProperties.getCaption("dialog.confirm"), message, Buttons.OKCancel); dialogConfirm.setCallback(new Callback() { @Override public void onDialogResult(Result result) { if (result != Result.OK) { return; } // ElasticIPを削除する AwsProcessClientFactory awsProcessClientFactory = BeanContext .getBean(AwsProcessClientFactory.class); AwsAddressProcess awsAddressProcess = BeanContext.getBean(AwsAddressProcess.class); AwsProcessClient awsProcessClient = awsProcessClientFactory.createAwsProcessClient( address.getUserNo(), address.getPlatformNo()); awsAddressProcess.deleteAddress(awsProcessClient, address.getAddressNo()); // ElasticIP情報を再取得して表示する AwsDescribeService awsDescribeService = BeanContext.getBean(AwsDescribeService.class); elasticIps = awsDescribeService.getAddresses(ViewContext.getUserNo(), instance.getInstance() .getPlatformNo()); showElasticIp(); // 動的なIPを選択状態にする elasticIpSelect.select(NULL_ADDRESS); } }); getApplication().getMainWindow().addWindow(dialogConfirm); } } private class VmwareDetailTab extends VerticalLayout { private InstanceDto instance; private PlatformDto platform; private ImageDto image; private Form form = new Form(); private ComboBox sizeSelect; private ComboBox keySelect; private ComboBox clusterSelect; private TextField rootSizeField; private List<VmwareKeyPair> vmwareKeyPairs; private List<String> clusters; private final String KEY_CAPTION_ID = "keyName"; public VmwareDetailTab(InstanceDto instance, PlatformDto platform, ImageDto image) { this.instance = instance; this.platform = platform; this.image = image; } @Override public void attach() { setHeight(TAB_HEIGHT); setMargin(false, true, false, true); setSpacing(false); // サーバサイズ sizeSelect = new ComboBox(ViewProperties.getCaption("field.serverSize")); sizeSelect.setNullSelectionAllowed(false); form.getLayout().addComponent(sizeSelect); // キーペア keySelect = new ComboBox(ViewProperties.getCaption("field.keyPair")); keySelect.setNullSelectionAllowed(false); keySelect.addContainerProperty(KEY_CAPTION_ID, String.class, null); keySelect.setItemCaptionPropertyId(KEY_CAPTION_ID); keySelect.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY); // Windowsの場合はキーペアを無効にする if (StringUtils.startsWith(image.getImage().getOs(), PCCConstant.OS_NAME_WIN)) { keySelect.setEnabled(false); } form.getLayout().addComponent(keySelect); // クラスタ clusterSelect = new ComboBox(ViewProperties.getCaption("field.cluster")); clusterSelect.setNullSelectionAllowed(false); form.getLayout().addComponent(clusterSelect); // ルートサイズ rootSizeField = new TextField(ViewProperties.getCaption("field.rootSize")); rootSizeField.setImmediate(true); form.getLayout().addComponent(rootSizeField); addComponent(form); } private void loadData() { VmwareDescribeService vmwareDescribeService = BeanContext.getBean(VmwareDescribeService.class); Long platformNo = platform.getPlatform().getPlatformNo(); // キーペア情報を取得 List<VmwareKeyPair> vmwareKeyPairs = vmwareDescribeService.getKeyPairs(ViewContext.getUserNo(), platformNo); this.vmwareKeyPairs = vmwareKeyPairs; // クラスタ情報を取得 List<ComputeResource> computeResources = vmwareDescribeService.getComputeResources(platformNo); List<String> clusters = new ArrayList<String>(); for (ComputeResource computeResource : computeResources) { clusters.add(computeResource.getName()); } this.clusters = clusters; } private void initValidation() { String message; message = ViewMessages.getMessage("IUI-000028"); keySelect.setRequired(true); keySelect.setRequiredError(message); message = ViewMessages.getMessage("IUI-000034"); clusterSelect.setRequired(true); clusterSelect.setRequiredError(message); if (image.getImageVmware().getRootSize() != null) { int maxRootSize = NumberUtils.toInt(Config.getProperty("vmware.maxRootSize"), 1024); message = ViewMessages.getMessage("IUI-000135", image.getImageVmware().getRootSize(), maxRootSize); rootSizeField.setRequired(false); rootSizeField.addValidator(new IntegerRangeValidator(image.getImageVmware().getRootSize(), maxRootSize, message)); } } public void show() { // サーバサイズ for (String instanceType : image.getImageVmware().getInstanceTypes().split(",")) { sizeSelect.addItem(instanceType.trim()); } sizeSelect.select(instance.getVmwareInstance().getInstanceType()); // キーペア for (VmwareKeyPair vmwareKeyPair : vmwareKeyPairs) { Item item = keySelect.addItem(vmwareKeyPair.getKeyNo()); item.getItemProperty(KEY_CAPTION_ID).setValue(vmwareKeyPair.getKeyName()); } keySelect.select(instance.getVmwareInstance().getKeyPairNo()); // クラスタ clusterSelect.setContainerDataSource(new IndexedContainer(clusters)); clusterSelect.select(instance.getVmwareInstance().getComputeResource()); if (StringUtils.isNotEmpty(instance.getVmwareInstance().getDatastore())) { clusterSelect.setEnabled(false); } // ルートディスクサイズ rootSizeField.setValue(ObjectUtils.toString(instance.getVmwareInstance().getRootSize(), "")); if (image.getImageVmware().getRootSize() == null) { rootSizeField.setEnabled(false); } // サーバが停止していない場合、詳細設定タブ自体を変更できないようにする InstanceStatus status = InstanceStatus.fromStatus(instance.getInstance().getStatus()); if (status != InstanceStatus.STOPPED) { form.setEnabled(false); } // サーバが既に作成済みの場合、いくつかの項目を変更できないようにする if (StringUtils.isNotEmpty(instance.getVmwareInstance().getDatastore())) { rootSizeField.setEnabled(false); } // サーバが作成済みの場合、ルートディスクサイズの入力チェックを無効にする if (StringUtils.isNotEmpty(instance.getVmwareInstance().getDatastore())) { List<Validator> validators = new ArrayList<Validator>(rootSizeField.getValidators()); for (Validator validator : validators) { rootSizeField.removeValidator(validator); } } } } private class VmwareEditIpTab extends VerticalLayout { private InstanceDto instance; private Form form = new Form(); private OptionGroup ipOptionGroup; private TextField ipAddressField; private TextField subnetMaskField; private TextField defaultGatewayField; private final String IP_OPTION_CAPTION_ID = "ipOption"; private final String IP_OPTION_DHCP = "dhcp"; private final String IP_OPTION_STATIC = "static"; public VmwareEditIpTab(InstanceDto instance) { this.instance = instance; } @Override public void attach() { setHeight(TAB_HEIGHT); setMargin(false, true, false, true); setSpacing(false); // IPアドレス設定 ipOptionGroup = new OptionGroup(ViewProperties.getCaption("field.optionIp")); ipOptionGroup.setNullSelectionAllowed(false); ipOptionGroup.setImmediate(true); ipOptionGroup.addContainerProperty(IP_OPTION_CAPTION_ID, String.class, null); ipOptionGroup.setItemCaptionPropertyId(IP_OPTION_CAPTION_ID); ipOptionGroup.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY); Item ipOptionItem = ipOptionGroup.addItem(IP_OPTION_DHCP); ipOptionItem.getItemProperty(IP_OPTION_CAPTION_ID).setValue(ViewProperties.getCaption("field.dhcpIp")); Item ipOptionItem2 = ipOptionGroup.addItem(IP_OPTION_STATIC); ipOptionItem2.getItemProperty(IP_OPTION_CAPTION_ID).setValue(ViewProperties.getCaption("field.staticIp")); ipOptionGroup.addListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { String value = (String) event.getProperty().getValue(); if (IP_OPTION_DHCP.equals(value)) { ipAddressField.setEnabled(false); subnetMaskField.setEnabled(false); defaultGatewayField.setEnabled(false); } else { ipAddressField.setEnabled(true); subnetMaskField.setEnabled(true); defaultGatewayField.setEnabled(true); } } }); form.getLayout().addComponent(ipOptionGroup); // IPアドレス ipAddressField = new TextField(ViewProperties.getCaption("field.ipAddress")); ipAddressField.setWidth("100%"); form.getLayout().addComponent(ipAddressField); // サブネットマスク subnetMaskField = new TextField(ViewProperties.getCaption("field.subnetMask")); subnetMaskField.setWidth("100%"); form.getLayout().addComponent(subnetMaskField); // デフォルトゲートウェイ defaultGatewayField = new TextField(ViewProperties.getCaption("field.defaultGateway")); defaultGatewayField.setWidth("100%"); form.getLayout().addComponent(defaultGatewayField); addComponent(form); } private void initValidation() { String message; message = ViewMessages.getMessage("IUI-000094", ipAddressField.getCaption()); Validator ipAddressFieldValidator = new RegexpValidator( "^(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])$", ViewMessages.getMessage("IUI-000095", ipAddressField.getCaption())); ipAddressField.setRequired(true); ipAddressField.setRequiredError(message); ipAddressField.addValidator(ipAddressFieldValidator); message = ViewMessages.getMessage("IUI-000094", subnetMaskField.getCaption()); Validator subnetMaskFieldValidator = new RegexpValidator( "^(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])$", ViewMessages.getMessage("IUI-000095", subnetMaskField.getCaption())); subnetMaskField.setRequired(true); subnetMaskField.setRequiredError(message); subnetMaskField.addValidator(subnetMaskFieldValidator); message = ViewMessages.getMessage("IUI-000094", defaultGatewayField.getCaption()); Validator defaultGatewayFieldValidator = new RegexpValidator( "^(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])$", ViewMessages.getMessage("IUI-000095", defaultGatewayField.getCaption())); defaultGatewayField.setRequired(true); defaultGatewayField.setRequiredError(message); defaultGatewayField.addValidator(defaultGatewayFieldValidator); } public void show() { VmwareAddress vmwareAddress = instance.getVmwareAddress(); if (vmwareAddress == null) { ipOptionGroup.select(IP_OPTION_DHCP); } else { ipAddressField.setValue(vmwareAddress.getIpAddress()); subnetMaskField.setValue(vmwareAddress.getSubnetMask()); defaultGatewayField.setValue(vmwareAddress.getDefaultGateway()); if (BooleanUtils.isTrue(vmwareAddress.getEnabled())) { ipOptionGroup.select(IP_OPTION_STATIC); } else { ipOptionGroup.select(IP_OPTION_DHCP); } } // サーバがStopped以外の場合は、変更不可とする InstanceStatus status = InstanceStatus.fromStatus(instance.getInstance().getStatus()); if (InstanceStatus.STOPPED != status) { form.setEnabled(false); } } } private class NiftyDetailTab extends VerticalLayout { private InstanceDto instance; private PlatformDto platform; private ImageDto image; private Form form = new Form(); private ComboBox sizeSelect; private ComboBox keySelect; private List<NiftyKeyPair> niftyKeyPairs; public NiftyDetailTab(InstanceDto instance, PlatformDto platform, ImageDto image) { this.instance = instance; this.platform = platform; this.image = image; } @Override public void attach() { setHeight(TAB_HEIGHT); setMargin(false, true, false, true); setSpacing(false); // サーバサイズ sizeSelect = new ComboBox(ViewProperties.getCaption("field.serverSize")); sizeSelect.setNullSelectionAllowed(false); form.getLayout().addComponent(sizeSelect); // キーペア keySelect = new ComboBox(ViewProperties.getCaption("field.keyPair")); keySelect.setNullSelectionAllowed(false); form.getLayout().addComponent(keySelect); addComponent(form); } private void loadData() { NiftyDescribeService niftyDescribeService = BeanContext.getBean(NiftyDescribeService.class); // キーペア情報を取得 List<NiftyKeyPair> niftyKeyPairs = niftyDescribeService.getKeyPairs(ViewContext.getUserNo(), platform .getPlatform().getPlatformNo()); this.niftyKeyPairs = niftyKeyPairs; } private void initValidation() { String message; message = ViewMessages.getMessage("IUI-000027"); sizeSelect.setRequired(true); sizeSelect.setRequiredError(message); message = ViewMessages.getMessage("IUI-000028"); keySelect.setRequired(true); keySelect.setRequiredError(message); } public void show() { // サーバサイズ for (String instanceType : image.getImageNifty().getInstanceTypes().split(",")) { sizeSelect.addItem(instanceType.trim()); } sizeSelect.select(instance.getNiftyInstance().getInstanceType()); // キーペア for (NiftyKeyPair niftyKeyPair : niftyKeyPairs) { keySelect.addItem(niftyKeyPair.getKeyName()); } keySelect.select(instance.getNiftyKeyPair().getKeyName()); // サーバが停止していない場合、詳細設定タブ自体を変更できないようにする InstanceStatus status = InstanceStatus.fromStatus(instance.getInstance().getStatus()); if (status != InstanceStatus.STOPPED) { form.setEnabled(false); } // サーバが既に作成済みの場合、キーペアを変更できないようにする if (StringUtils.isNotEmpty(instance.getNiftyInstance().getInstanceId())) { keySelect.setEnabled(false); } } } private class CloudStackDetailTab extends VerticalLayout { private InstanceDto instance; private PlatformDto platform; private ImageDto image; private Form form = new Form(); private ComboBox networkSelect; private ComboBox keySelect; private ComboBox grpSelect; private ComboBox sizeSelect; private ComboBox zoneSelect; private ComboBox elasticIpSelect; private List<String> keyPairs; private List<String> securityGroups; private List<String> instanceTypes; private List<ZoneDto> zones; private List<String> networks; private List<AddressDto> elasticIps; private final String ELASTIC_IP_CAPTION_ID = "ElasticIP"; private final String ZONE_CAPTION_ID = "zoneName"; private final AddressDto NULL_ADDRESS = new AddressDto(); private final String COMBOBOX_WIDTH = "150px"; private final String IP_COMBOBOX_WIDTH = "220px"; private final String BUTTON_WIDTH = "150px"; public CloudStackDetailTab(InstanceDto instance, PlatformDto platform, ImageDto image) { this.instance = instance; this.platform = platform; this.image = image; setHeight(TAB_HEIGHT); setMargin(false, true, false, true); setSpacing(false); networkSelect = new ComboBox(ViewProperties.getCaption("field.netWork")); networkSelect.setWidth(COMBOBOX_WIDTH); networkSelect.setNullSelectionAllowed(false); keySelect = new ComboBox(ViewProperties.getCaption("field.keyPair")); keySelect.setWidth(COMBOBOX_WIDTH); keySelect.setNullSelectionAllowed(false); grpSelect = new ComboBox(ViewProperties.getCaption("field.securityGroup")); grpSelect.setWidth(COMBOBOX_WIDTH); grpSelect.setNullSelectionAllowed(false); sizeSelect = new ComboBox(ViewProperties.getCaption("field.serverSize")); sizeSelect.setWidth(COMBOBOX_WIDTH); sizeSelect.setNullSelectionAllowed(false); zoneSelect = new ComboBox(ViewProperties.getCaption("field.zone")); zoneSelect.setWidth(COMBOBOX_WIDTH); zoneSelect.setNullSelectionAllowed(false); zoneSelect.setItemCaptionPropertyId(ZONE_CAPTION_ID); zoneSelect.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY); elasticIpSelect = new ComboBox(ViewProperties.getCaption("field.elasticIp")); elasticIpSelect.setWidth(IP_COMBOBOX_WIDTH); elasticIpSelect.setNullSelectionAllowed(false); elasticIpSelect.setItemCaptionPropertyId(ELASTIC_IP_CAPTION_ID); elasticIpSelect.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY); Label spacer = new Label(" "); spacer.addStyleName("desc-padding-horizontal"); spacer.setHeight("5px"); form.getLayout().addComponent(zoneSelect); form.getLayout().addComponent(keySelect); form.getLayout().addComponent(sizeSelect); form.getLayout().addComponent(networkSelect); form.getLayout().addComponent(grpSelect); form.getLayout().addComponent(spacer); form.getLayout().addComponent(elasticIpSelect); HorizontalLayout layout = new HorizontalLayout(); layout.setSpacing(true); layout.setMargin(false); Button addElasticIp = new Button(ViewProperties.getCaption("button.addElasticIp")); addElasticIp.setDescription(ViewProperties.getCaption("description.addElasticIp")); addElasticIp.setIcon(Icons.ADD.resource()); addElasticIp.setWidth(BUTTON_WIDTH); addElasticIp.addListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { addButtonClick(); } }); Button deleteElasticIp = new Button(ViewProperties.getCaption("button.deleteElasticIp")); deleteElasticIp.setDescription(ViewProperties.getCaption("description.deleteElasticIp")); deleteElasticIp.setIcon(Icons.DELETEMINI.resource()); deleteElasticIp.setWidth(BUTTON_WIDTH); deleteElasticIp.addListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { deleteButtonClick(); } }); layout.addComponent(addElasticIp); layout.addComponent(deleteElasticIp); form.getLayout().addComponent(layout); addComponent(form); InstanceStatus status = InstanceStatus.fromStatus(instance.getInstance().getStatus()); if (status != InstanceStatus.STOPPED) { // サーバがStopped以外の場合は、詳細設定タブ自体を変更不可とする form.setEnabled(false); } else { // 既に作成済みの場合、いくつかの項目を変更不可とする if (StringUtils.isNotEmpty(instance.getCloudstackInstance().getInstanceId())) { // 既に作成済みの場合、いくつかの項目を変更不可とする grpSelect.setEnabled(false); zoneSelect.setEnabled(false); networkSelect.setEnabled(false); } elasticIpSelect.setEnabled(false); addElasticIp.setEnabled(false); deleteElasticIp.setEnabled(false); } } private void loadData() { // CloudStack情報を取得 // 情報を取得 // TODO: ロジックを必ずリファクタリングすること IaasDescribeService describeService = BeanContext.getBean(IaasDescribeService.class); List<KeyPairDto> infos = describeService.getKeyPairs(ViewContext.getUserNo(), platform.getPlatform() .getPlatformNo()); List<String> keyPairs = new ArrayList<String>(); for (KeyPairDto info : infos) { keyPairs.add(info.getKeyName()); } this.keyPairs = keyPairs; List<String> networks = new ArrayList<String>(); for (String network : platform.getPlatformCloudstack().getNetworkId().split(",")) { networks.add(network); } this.networks = networks; List<String> securityGroups = new ArrayList<String>(); if (StringUtils.isEmpty(instance.getCloudstackInstance().getNetworkid())) { List<SecurityGroupDto> groups = describeService.getSecurityGroups(ViewContext.getUserNo(), platform .getPlatform().getPlatformNo(), null); for (SecurityGroupDto group : groups) { securityGroups.add(group.getGroupName()); } } this.securityGroups = securityGroups; List<String> instanceTypes = new ArrayList<String>(); for (String instanceType : image.getImageCloudstack().getInstanceTypes().split(",")) { instanceTypes.add(instanceType.trim()); } this.instanceTypes = instanceTypes; List<ZoneDto> zones = describeService.getAvailabilityZones(ViewContext.getUserNo(), platform.getPlatform() .getPlatformNo()); this.zones = zones; List<AddressDto> elasticIps = new ArrayList<AddressDto>(); List<AddressDto> addresses = describeService.getAddresses(ViewContext.getUserNo(), platform.getPlatform() .getPlatformNo()); for (AddressDto address : addresses) { elasticIps.add(address); } this.elasticIps = elasticIps; } private void initValidation() { String message; message = ViewMessages.getMessage("IUI-000100"); networkSelect.setRequired(true); networkSelect.setRequiredError(message); message = ViewMessages.getMessage("IUI-000027"); sizeSelect.setRequired(true); sizeSelect.setRequiredError(message); message = ViewMessages.getMessage("IUI-000050"); zoneSelect.setRequired(true); zoneSelect.setRequiredError(message); message = ViewMessages.getMessage("IUI-000063"); elasticIpSelect.setRequired(true); elasticIpSelect.setRequiredError(message); } public void show() { networkSelect.setContainerDataSource(new IndexedContainer(networks)); networkSelect.select(instance.getCloudstackInstance().getNetworkid()); keySelect.setContainerDataSource(new IndexedContainer(keyPairs)); keySelect.select(instance.getCloudstackInstance().getKeyName()); grpSelect.setContainerDataSource(new IndexedContainer(securityGroups)); grpSelect.select(instance.getCloudstackInstance().getSecuritygroup()); sizeSelect.setContainerDataSource(new IndexedContainer(instanceTypes)); sizeSelect.select(instance.getCloudstackInstance().getInstanceType()); zoneSelect.setContainerDataSource(createZoneContainer()); for (ZoneDto zone : zones) { if (zone.isSameById(instance.getCloudstackInstance().getZoneid())) { zoneSelect.select(zone); } } //マッピングされたボリュームが存在する場合は変更不可 if (instance.getCloudstackVolumes() != null && instance.getCloudstackVolumes().size() > 0) { zoneSelect.setEnabled(false); } elasticIpSelect.setContainerDataSource(createElasticIpContainer()); if (null != instance.getCloudstackAddress()) { elasticIpSelect.select(new AddressDto((instance.getCloudstackAddress()))); } else { elasticIpSelect.select(NULL_ADDRESS); } } private IndexedContainer createElasticIpContainer() { IndexedContainer elasticIpContainer = new IndexedContainer(); elasticIpContainer.addContainerProperty(ELASTIC_IP_CAPTION_ID, String.class, null); String dynamic = ViewProperties.getCaption("field.elasticIp.dynamic"); String associated = ViewProperties.getCaption("field.elasticIp.associated"); // ElasticIP無しの項目 Item item = elasticIpContainer.addItem(NULL_ADDRESS); item.getItemProperty(ELASTIC_IP_CAPTION_ID).setValue(dynamic); for (AddressDto address : elasticIps) { item = elasticIpContainer.addItem(address); //InstanceNoがNullならPool状態 if (null == address.getInstanceNo()) { item.getItemProperty(ELASTIC_IP_CAPTION_ID).setValue(address.getPublicIp()); } else { item.getItemProperty(ELASTIC_IP_CAPTION_ID).setValue(address.getPublicIp() + " " + associated); } } return elasticIpContainer; } private IndexedContainer createZoneContainer() { IndexedContainer elasticIpContainer = new IndexedContainer(); elasticIpContainer.addContainerProperty(ZONE_CAPTION_ID, String.class, null); for (ZoneDto cluster : zones) { Item item = elasticIpContainer.addItem(cluster); item.getItemProperty(ZONE_CAPTION_ID).setValue(cluster.getZoneName()); } return elasticIpContainer; } private void addButtonClick() { // ElasticIPを取得する IaasDescribeService describeService = BeanContext.getBean(IaasDescribeService.class); Long addressNo = describeService.createAddress(ViewContext.getUserNo(), instance.getInstance() .getPlatformNo()); //ElasticIPをリセット resetElasticIps(); // 取得したAddressを抽出する AddressDto address = null; for (AddressDto tmpAddress : elasticIps) { if (tmpAddress.getAddressNo().equals(addressNo)) { address = tmpAddress; break; } } // 取得したElasticIPを選択状態にする elasticIpSelect.select(address); //取得したPublicIPを表示する String message = ViewMessages.getMessage("IUI-000061", address.getPublicIp()); DialogConfirm dialog = new DialogConfirm(ViewProperties.getCaption("dialog.confirm"), message, Buttons.OK); getApplication().getMainWindow().addWindow(dialog); return; } private void deleteButtonClick() { final AddressDto address = (AddressDto) elasticIpSelect.getValue(); // ElasticIPが選択されていない場合 if (address == null || NULL_ADDRESS.equals(address)) { throw new AutoApplicationException("IUI-000062"); } //すでに設定されているElasticIPでなく、かつ割り当て済の場合は削除できない if (null != address.getInstanceNo()) { if (null == instance.getCloudstackAddress() || !instance.getCloudstackAddress().getAddressNo().equals(address.getAddressNo())) { throw new AutoApplicationException("IUI-000064"); } } String message = ViewMessages.getMessage("IUI-000060", address.getPublicIp()); DialogConfirm dialogConfirm = new DialogConfirm(ViewProperties.getCaption("dialog.confirm"), message, Buttons.OKCancel); dialogConfirm.setCallback(new Callback() { @Override public void onDialogResult(Result result) { if (result == Result.OK) { // ElasticIPを削除する IaasDescribeService describeService = BeanContext.getBean(IaasDescribeService.class); describeService.deleteAddress(address.getUserNo(), address.getPlatformNo(), address.getAddressNo()); //ElasticIPをリセット resetElasticIps(); // 動的なIPを選択状態にする elasticIpSelect.select(NULL_ADDRESS); } } }); getApplication().getMainWindow().addWindow(dialogConfirm); } private void resetElasticIps() { // Addressの情報を取り直す IaasDescribeService describeService = BeanContext.getBean(IaasDescribeService.class); List<AddressDto> addresses = describeService.getAddresses(ViewContext.getUserNo(), instance.getInstance() .getPlatformNo()); elasticIps = addresses; elasticIpSelect.setContainerDataSource(createElasticIpContainer()); } } private class VcloudDetailTab extends VerticalLayout { private final String CID_STORAGE_TYPE = "StorageType"; private final String CID_KEY_PAIR = "KeyPair"; private final String WIDTH_COMBOBOX = "220px"; private final String KEY_PAIR_WIDTH_COMBOBOX = "150px"; private InstanceDto instance; private PlatformDto platform; private ImageDto image; private Form form = new Form(); private ComboBox storageTypeSelect; private ComboBox sizeSelect; private ComboBox keySelect; private DataDiskTable dataDiskTable; private DataDiskTableButtons dataDiskTableButtons; private List<String> instanceTypes; private List<KeyPairDto> vcloudKeyPairs; private List<StorageTypeDto> storageTypes; private List<DataDiskDto> dataDisks; public VcloudDetailTab(InstanceDto instance, PlatformDto platform, ImageDto image) { this.instance = instance; this.platform = platform; this.image = image; setHeight(TAB_HEIGHT); setMargin(false, true, false, true); setSpacing(false); //ストレージタイプ storageTypeSelect = new ComboBox(ViewProperties.getCaption("field.storageType")); storageTypeSelect.setWidth(WIDTH_COMBOBOX); storageTypeSelect.setNullSelectionAllowed(false); storageTypeSelect.setItemCaptionPropertyId(CID_STORAGE_TYPE); storageTypeSelect.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY); //サーバサイズ sizeSelect = new ComboBox(ViewProperties.getCaption("field.serverSize")); sizeSelect.setWidth(WIDTH_COMBOBOX); sizeSelect.setNullSelectionAllowed(false); //キーペア keySelect = new ComboBox(ViewProperties.getCaption("field.keyPair")); keySelect.setWidth(KEY_PAIR_WIDTH_COMBOBOX); keySelect.setNullSelectionAllowed(false); keySelect.setItemCaptionPropertyId(CID_KEY_PAIR); keySelect.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY); // Windowsの場合はキーペアを無効にする if (StringUtils.startsWith(image.getImage().getOs(), PCCConstant.OS_NAME_WIN)) { keySelect.setEnabled(false); } Label spacer = new Label(" "); spacer.addStyleName("desc-padding-horizontal"); spacer.setHeight("5px"); //データディスクテーブル dataDiskTable = new DataDiskTable(); //データディスクボタン dataDiskTableButtons = new DataDiskTableButtons(); form.getLayout().addComponent(storageTypeSelect); form.getLayout().addComponent(sizeSelect); form.getLayout().addComponent(keySelect); form.getLayout().addComponent(spacer); form.getLayout().addComponent(dataDiskTable); form.getLayout().addComponent(dataDiskTableButtons); addComponent(form); // サーバがStopped以外の場合は、変更不可とする InstanceStatus status = InstanceStatus.fromStatus(instance.getInstance().getStatus()); if (status != InstanceStatus.STOPPED) { storageTypeSelect.setEnabled(false); sizeSelect.setEnabled(false); keySelect.setEnabled(false); } } private void loadData() { // VCloud情報を取得 IaasDescribeService describeService = BeanContext.getBean(IaasDescribeService.class); //StorageType List<StorageTypeDto> storageTypes = describeService.getStorageTypes(ViewContext.getUserNo(), platform .getPlatform().getPlatformNo()); this.storageTypes = storageTypes; //KeyPair List<KeyPairDto> vcloudKeyPairs = describeService.getKeyPairs(ViewContext.getUserNo(), platform .getPlatform().getPlatformNo()); this.vcloudKeyPairs = vcloudKeyPairs; //InstanceType List<String> instanceTypes = new ArrayList<String>(); for (String instanceType : image.getImageVcloud().getInstanceTypes().split(",")) { instanceTypes.add(instanceType.trim()); } this.instanceTypes = instanceTypes; //DataDisk List<DataDiskDto> dataDisks = new ArrayList<DataDiskDto>(); List<VcloudDisk> vcloudDisks = instance.getVcloudDisks(); for (VcloudDisk vcloudDisk : vcloudDisks) { if (BooleanUtils.isTrue(vcloudDisk.getDataDisk())) { DataDiskDto diskDto = new DataDiskDto(); diskDto.setDiskNo(vcloudDisk.getDiskNo()); diskDto.setDiskSize(vcloudDisk.getSize()); diskDto.setUnitNo(vcloudDisk.getUnitNo()); dataDisks.add(diskDto); } } this.dataDisks = dataDisks; } public void show() { //ストレージタイプ StorageTypeDto selectedStorageType = null; for (StorageTypeDto storageTypeDto : storageTypes) { if (storageTypeDto.getStorageTypeNo().equals(instance.getVcloudInstance().getStorageTypeNo())) { selectedStorageType = storageTypeDto; break; } } storageTypeSelect.setContainerDataSource(createStorageTypeContainer()); storageTypeSelect.select(selectedStorageType.getStorageTypeNo()); //インスタンスタイプ sizeSelect.setContainerDataSource(new IndexedContainer(instanceTypes)); sizeSelect.select(instance.getVcloudInstance().getInstanceType()); //キーペア KeyPairDto selectedKeyPair = null; for (KeyPairDto keyPairDto : vcloudKeyPairs) { if (keyPairDto.getKeyNo().equals(instance.getVcloudInstance().getKeyPairNo())) { selectedKeyPair = keyPairDto; break; } } keySelect.setContainerDataSource(createKeyPairContainer()); keySelect.select(selectedKeyPair.getKeyNo()); //データディスク dataDiskTable.show(); } private IndexedContainer createKeyPairContainer() { IndexedContainer keyPairContainer = new IndexedContainer(); keyPairContainer.addContainerProperty(CID_KEY_PAIR, String.class, null); for (KeyPairDto keyPairDto : vcloudKeyPairs) { Item item = keyPairContainer.addItem(keyPairDto.getKeyNo()); item.getItemProperty(CID_KEY_PAIR).setValue(keyPairDto.getKeyName()); } return keyPairContainer; } private IndexedContainer createStorageTypeContainer() { IndexedContainer storageTypeContainer = new IndexedContainer(); storageTypeContainer.addContainerProperty(CID_STORAGE_TYPE, String.class, null); for (StorageTypeDto storageTypeDto : storageTypes) { Item item = storageTypeContainer.addItem(storageTypeDto.getStorageTypeNo()); item.getItemProperty(CID_STORAGE_TYPE).setValue(storageTypeDto.getStorageTypeName()); } return storageTypeContainer; } private void initValidation() { String message; //ストレージタイプ message = ViewMessages.getMessage("IUI-000123"); storageTypeSelect.setRequired(true); storageTypeSelect.setRequiredError(message); //インスタンスタイプ message = ViewMessages.getMessage("IUI-000027"); sizeSelect.setRequired(true); sizeSelect.setRequiredError(message); //キーペア message = ViewMessages.getMessage("IUI-000028"); keySelect.setRequired(true); keySelect.setRequiredError(message); } private class DataDiskTable extends Table { private final String PID_UNIT_NO = "UnitNo"; private final String PID_DISK_SIZE = "DiskSize"; private final int WIDTH_UNIT_NO = 194; private final int WIDTH_DISK_SIZE = 194; public DataDiskTable() { //テーブル基本設定 setCaption(ViewProperties.getCaption("table.diskData")); setWidth("100%"); setPageLength(3); setSortDisabled(true); setColumnHeaderMode(COLUMN_HEADER_MODE_EXPLICIT); setColumnReorderingAllowed(false); setColumnCollapsingAllowed(false); setSelectable(true); setMultiSelect(false); setNullSelectionAllowed(false); setImmediate(true); addStyleName("win-server-edit-datadisk"); //カラム設定 addContainerProperty(PID_UNIT_NO, String.class, null); addContainerProperty(PID_DISK_SIZE, Integer.class, null); //ヘッダー設定 setColumnHeaders(new String[] { ViewProperties.getCaption("field.unitNo"), ViewProperties.getCaption("field.diskSize") }); //ヘッダーサイズ設定 setColumnWidth(PID_UNIT_NO, WIDTH_UNIT_NO); setColumnWidth(PID_DISK_SIZE, WIDTH_DISK_SIZE); //テーブルのカラムに対してStyleNameを設定 setCellStyleGenerator(new StandardCellStyleGenerator()); // 行が選択されたときのイベント addListener(new Property.ValueChangeListener() { @Override public void valueChange(Property.ValueChangeEvent event) { DataDiskDto selectDto = (DataDiskDto) getValue(); if (selectDto == null) { dataDiskTableButtons.btnEdit.setEnabled(false); dataDiskTableButtons.btnDelete.setEnabled(false); } else { dataDiskTableButtons.btnEdit.setEnabled(true); dataDiskTableButtons.btnDelete.setEnabled(true); } } }); } private void loadData() { //InstanceDto取得 //ただし、変数「instance」は変更せず、 InstanceService instanceService = BeanContext.getBean(InstanceService.class); InstanceDto instanceDto = instanceService.getInstance(instance.getInstance().getInstanceNo()); //DataDisk dataDisks = new ArrayList<DataDiskDto>(); List<VcloudDisk> vcloudDisks = instanceDto.getVcloudDisks(); for (VcloudDisk vcloudDisk : vcloudDisks) { if (BooleanUtils.isTrue(vcloudDisk.getDataDisk())) { DataDiskDto diskDto = new DataDiskDto(); diskDto.setDiskNo(vcloudDisk.getDiskNo()); diskDto.setDiskSize(vcloudDisk.getSize()); diskDto.setUnitNo(vcloudDisk.getUnitNo()); dataDisks.add(diskDto); } } } public void show() { removeAllItems(); for (DataDiskDto diskDto : dataDisks) { String unitNo = ViewProperties.getCaption("field.unattached"); if (diskDto.getUnitNo() != null) { unitNo = String.valueOf(diskDto.getUnitNo()); } addItem(new Object[] { unitNo, diskDto.getDiskSize() }, diskDto); } } } private class DataDiskTableButtons extends HorizontalLayout { private Button btnAdd; private Button btnEdit; private Button btnDelete; public DataDiskTableButtons() { setMargin(false); setSpacing(true); //Addボタン btnAdd = new Button(ViewProperties.getCaption("button.add")); btnAdd.setIcon(Icons.ADD.resource()); btnAdd.setDescription(ViewProperties.getCaption("description.add")); btnAdd.addListener(new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { addButtonClick(event); } }); //Editボタン btnEdit = new Button(ViewProperties.getCaption("button.edit")); btnEdit.setIcon(Icons.EDITMINI.resource()); btnEdit.setDescription(ViewProperties.getCaption("description.edit")); btnEdit.addListener(new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { editButtonClick(event); } }); btnEdit.setEnabled(false); //Deleteボタン btnDelete = new Button(ViewProperties.getCaption("button.delete")); btnDelete.setIcon(Icons.DELETEMINI.resource()); btnDelete.setDescription(ViewProperties.getCaption("description.delete")); btnDelete.addListener(new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { deleteButtonClick(event); } }); btnDelete.setEnabled(false); addComponent(btnAdd); addComponent(btnEdit); addComponent(btnDelete); setComponentAlignment(btnAdd, Alignment.MIDDLE_LEFT); setComponentAlignment(btnEdit, Alignment.MIDDLE_LEFT); setComponentAlignment(btnDelete, Alignment.MIDDLE_LEFT); } private void addButtonClick(ClickEvent event) { WinServerDataDiskConfig winServerDataDiskConfig = new WinServerDataDiskConfig(getApplication(), instance.getInstance().getInstanceNo(), null); winServerDataDiskConfig.addListener(new Window.CloseListener() { @Override public void windowClose(CloseEvent e) { dataDiskTable.loadData(); dataDiskTable.show(); } }); getWindow().getApplication().getMainWindow().addWindow(winServerDataDiskConfig); } private void editButtonClick(ClickEvent event) { DataDiskDto dataDiskDto = (DataDiskDto) dataDiskTable.getValue(); WinServerDataDiskConfig winServerDataDiskConfig = new WinServerDataDiskConfig(getApplication(), instance.getInstance().getInstanceNo(), dataDiskDto); winServerDataDiskConfig.addListener(new Window.CloseListener() { @Override public void windowClose(CloseEvent e) { dataDiskTable.loadData(); dataDiskTable.show(); } }); getWindow().getApplication().getMainWindow().addWindow(winServerDataDiskConfig); } private void deleteButtonClick(ClickEvent event) { String message = ViewMessages.getMessage("IUI-000124"); 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; } //ディスク削除 // 更新処理 & IaasGateWay処理(ディスクデタッチ) DataDiskDto dataDiskDto = (DataDiskDto) dataDiskTable.getValue(); InstanceService instanceService = BeanContext.getBean(InstanceService.class); instanceService.detachDataDisk(instance.getInstance().getInstanceNo(), dataDiskDto.getDiskNo()); //データ取得&テーブル再表示 dataDiskTable.loadData(); dataDiskTable.show(); } }); getApplication().getMainWindow().addWindow(dialog); } } } private class VcloudNetworkTab extends VerticalLayout { private InstanceDto instance; private PlatformDto platform; private Form form = new Form(); private NetworkTable networkTable; private NetworkTableButtons networkTableButtons; private Map<String, NetworkDto> networkMap; private List<InstanceNetworkDto> instanceNetworks; public VcloudNetworkTab(InstanceDto instance, PlatformDto platform) { this.instance = instance; this.platform = platform; setHeight(TAB_HEIGHT); setMargin(false, true, false, true); setSpacing(false); //テーブル networkTable = new NetworkTable(); form.getLayout().addComponent(networkTable); //ボタン networkTableButtons = new NetworkTableButtons(); form.getLayout().addComponent(networkTableButtons); addComponent(form); // サーバがStopped以外の場合は、変更不可とする InstanceStatus status = InstanceStatus.fromStatus(instance.getInstance().getStatus()); if (status != InstanceStatus.STOPPED) { form.setEnabled(false); } } private void loadData() { IaasDescribeService describeService = BeanContext.getBean(IaasDescribeService.class); //Network List<NetworkDto> networkDtos = describeService.getNetworks(ViewContext.getUserNo(), platform.getPlatform() .getPlatformNo()); Map<String, NetworkDto> networkMap = new HashMap<String, NetworkDto>(); for (NetworkDto networkDto : networkDtos) { networkMap.put(networkDto.getNetworkName(), networkDto); } this.networkMap = networkMap; //InstanceNetwork List<InstanceNetworkDto> instanceNetworks = new ArrayList<InstanceNetworkDto>(); List<VcloudInstanceNetwork> tmpInstanceNetworks = instance.getVcloudInstanceNetworks(); for (VcloudInstanceNetwork instanceNetwork : tmpInstanceNetworks) { InstanceNetworkDto instanceNetworkDto = new InstanceNetworkDto(); instanceNetworkDto.setNetworkNo(instanceNetwork.getNetworkNo()); instanceNetworkDto.setNetworkName(instanceNetwork.getNetworkName()); instanceNetworkDto.setNew(false); instanceNetworkDto.setDelete(false); instanceNetworkDto.setIpMode(instanceNetwork.getIpMode()); instanceNetworkDto.setIpAddress(instanceNetwork.getIpAddress()); instanceNetworkDto.setRequired(networkMap.get(instanceNetwork.getNetworkName()).isPcc()); instanceNetworkDto.setPrimary(BooleanUtils.isTrue(instanceNetwork.getIsPrimary())); instanceNetworks.add(instanceNetworkDto); } this.instanceNetworks = instanceNetworks; } public void show() { networkTable.show(); } private class NetworkTable extends Table { private final String PID_NETWORK_NAME = "NetworkName"; private final String PID_IP_MODE = "IpMode"; private final String PID_IP_ADDRESS = "IpAddress"; private final String PID_PRIMARY = "Primary"; private final int WIDTH_NETWORK_NAME = 180; private final int WIDTH_IP_MOD = 114; private final int WIDTH_IP_ADDRESS = 97; private final int WIDTH_PRIMARY = 67; public NetworkTable() { //テーブル基本設定 setWidth("100%"); setPageLength(3); setSortDisabled(true); setColumnHeaderMode(COLUMN_HEADER_MODE_EXPLICIT); setColumnReorderingAllowed(false); setColumnCollapsingAllowed(false); setSelectable(true); setMultiSelect(false); setNullSelectionAllowed(false); setImmediate(true); addStyleName("win-server-edit-network"); //カラム設定 addContainerProperty(PID_NETWORK_NAME, String.class, null); addContainerProperty(PID_IP_MODE, String.class, null); addContainerProperty(PID_IP_ADDRESS, String.class, null); addContainerProperty(PID_PRIMARY, Label.class, null); //ヘッダー設定 setColumnHeaders(new String[] { ViewProperties.getCaption("field.networkName"), ViewProperties.getCaption("field.ipMode"), ViewProperties.getCaption("field.ipAddress"), ViewProperties.getCaption("field.primary") }); //ヘッダーサイズ設定 setColumnWidth(PID_NETWORK_NAME, WIDTH_NETWORK_NAME); setColumnWidth(PID_IP_MODE, WIDTH_IP_MOD); setColumnWidth(PID_IP_ADDRESS, WIDTH_IP_ADDRESS); setColumnWidth(PID_PRIMARY, WIDTH_PRIMARY); //テーブルのカラムに対してStyleNameを設定 setCellStyleGenerator(new StandardCellStyleGenerator()); // 行が選択されたときのイベント addListener(new Property.ValueChangeListener() { @Override public void valueChange(Property.ValueChangeEvent event) { InstanceNetworkDto selectDto = (InstanceNetworkDto) getValue(); if (selectDto == null) { networkTableButtons.btnEdit.setEnabled(false); networkTableButtons.btnDelete.setEnabled(false); } else { networkTableButtons.btnEdit.setEnabled(true); //PCCネットワークまたはプライマリの場合は削除不可 networkTableButtons.btnDelete .setEnabled((!selectDto.isRequired() && !selectDto.isPrimary())); } } }); } private void loadData() { //InstanceDto取得 //ただし、変数「instance」は変更せず、 IaasDescribeService describeService = BeanContext.getBean(IaasDescribeService.class); InstanceService instanceService = BeanContext.getBean(InstanceService.class); InstanceDto instanceDto = instanceService.getInstance(instance.getInstance().getInstanceNo()); //Network networkMap = new HashMap<String, NetworkDto>(); List<NetworkDto> networkDtos = describeService.getNetworks(ViewContext.getUserNo(), instanceDto .getInstance().getPlatformNo()); for (NetworkDto networkDto : networkDtos) { networkMap.put(networkDto.getNetworkName(), networkDto); } } public void show() { removeAllItems(); for (int i = 0; i < instanceNetworks.size(); i++) { InstanceNetworkDto instanceNetwork = instanceNetworks.get(i); if (instanceNetwork.isDelete()) { //削除対象ネットワーク continue; } NetworkDto network = networkMap.get(instanceNetwork.getNetworkName()); String ipModeName = null; if ("POOL".equals(instanceNetwork.getIpMode())) { ipModeName = ViewProperties.getCaption("field.ipMode.pool"); } else if ("MANUAL".equals(instanceNetwork.getIpMode())) { ipModeName = ViewProperties.getCaption("field.ipMode.manual"); } else if ("DHCP".equals(instanceNetwork.getIpMode())) { ipModeName = ViewProperties.getCaption("field.ipMode.dhcp"); } Label slbl = new Label(""); if (BooleanUtils.isTrue(instanceNetwork.isPrimary())) { slbl = new Label(IconUtils.createImageTag(getApplication(), Icons.SELECTMINI), Label.CONTENT_XHTML); } addItem(new Object[] { network.getNetworkName(), ipModeName, instanceNetwork.getIpAddress(), slbl }, instanceNetwork); } } } private class NetworkTableButtons extends HorizontalLayout { private Button btnAdd; private Button btnEdit; private Button btnDelete; public NetworkTableButtons() { setMargin(false); setSpacing(true); //Addボタン btnAdd = new Button(ViewProperties.getCaption("button.add")); btnAdd.setIcon(Icons.ADD.resource()); btnAdd.setDescription(ViewProperties.getCaption("description.add")); btnAdd.addListener(new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { addButtonClick(event); } }); //Editボタン btnEdit = new Button(ViewProperties.getCaption("button.edit")); btnEdit.setIcon(Icons.EDITMINI.resource()); btnEdit.setDescription(ViewProperties.getCaption("description.edit")); btnEdit.addListener(new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { editButtonClick(event); } }); btnEdit.setEnabled(false); //Deleteボタン btnDelete = new Button(ViewProperties.getCaption("button.delete")); btnDelete.setIcon(Icons.DELETEMINI.resource()); btnDelete.setDescription(ViewProperties.getCaption("description.delete")); btnDelete.addListener(new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { deleteButtonClick(event); } }); btnDelete.setEnabled(false); addComponent(btnAdd); addComponent(btnEdit); addComponent(btnDelete); setComponentAlignment(btnAdd, Alignment.MIDDLE_LEFT); setComponentAlignment(btnEdit, Alignment.MIDDLE_LEFT); setComponentAlignment(btnDelete, Alignment.MIDDLE_LEFT); } private void addButtonClick(ClickEvent event) { WinServerNetworkConfig winServerDataDiskConfig = new WinServerNetworkConfig(getApplication(), instance .getInstance().getInstanceNo(), instance.getInstance().getPlatformNo(), null, instanceNetworks); winServerDataDiskConfig.addListener(new Window.CloseListener() { @Override public void windowClose(CloseEvent e) { //テーブル再表示 networkTable.loadData(); networkTable.show(); } }); getWindow().getApplication().getMainWindow().addWindow(winServerDataDiskConfig); } private void editButtonClick(ClickEvent event) { InstanceNetworkDto instanceNetwork = (InstanceNetworkDto) networkTable.getValue(); WinServerNetworkConfig winServerDataDiskConfig = new WinServerNetworkConfig(getApplication(), instance .getInstance().getInstanceNo(), instance.getInstance().getPlatformNo(), instanceNetwork, instanceNetworks); winServerDataDiskConfig.addListener(new Window.CloseListener() { @Override public void windowClose(CloseEvent e) { //テーブル再表示 networkTable.loadData(); networkTable.show(); } }); getWindow().getApplication().getMainWindow().addWindow(winServerDataDiskConfig); } private void deleteButtonClick(ClickEvent event) { String message = ViewMessages.getMessage("IUI-000127"); 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; } //ディスク削除 InstanceNetworkDto instanceNetwork = (InstanceNetworkDto) networkTable.getValue(); if (instanceNetwork.isNew()) { //VCloudInstanceNetworkにレコードが存在しない場合(新規追加→削除) instanceNetworks.remove(instanceNetwork); } else { //VCloudInstanceNetworkにレコードが存在する場合(削除) instanceNetwork.setDelete(true); } //テーブル再表示 networkTable.loadData(); networkTable.show(); } }); getApplication().getMainWindow().addWindow(dialog); } } } private class AzureDetailTab extends VerticalLayout { private InstanceDto instance; private PlatformDto platform; private ImageDto image; private Form form = new Form(); private ComboBox sizeSelect; private ComboBox availabilitySetSelect; private TextField locationField; private TextField affinityField; private TextField cloudServiceField; private ComboBox subnetSelect; private TextField storageAccountField; private List<String> instanceTypes; private List<SubnetDto> subnets; private List<String> availabilitySets; private final String COMBOBOX_WIDTH = "150px"; private final String TEXT_WIDTH = "150px"; private final String CIDR_BLOCK_CAPTION_ID = "cidrBlock"; public AzureDetailTab(InstanceDto instance, PlatformDto platform, ImageDto image) { this.instance = instance; this.platform = platform; this.image = image; setHeight(TAB_HEIGHT); setMargin(false, true, false, true); setSpacing(false); sizeSelect = new ComboBox(ViewProperties.getCaption("field.serverSize")); sizeSelect.setWidth(COMBOBOX_WIDTH); sizeSelect.setNullSelectionAllowed(false); availabilitySetSelect = new ComboBox(ViewProperties.getCaption("field.availabilitySet")); availabilitySetSelect.setWidth(COMBOBOX_WIDTH); availabilitySetSelect.setNullSelectionAllowed(false); locationField = new TextField(ViewProperties.getCaption("field.location")); locationField.setImmediate(true); locationField.setWidth(TEXT_WIDTH); affinityField = new TextField(ViewProperties.getCaption("field.affinityGroup")); affinityField.setImmediate(true); affinityField.setWidth(TEXT_WIDTH); cloudServiceField = new TextField(ViewProperties.getCaption("field.cloudService")); cloudServiceField.setImmediate(true); cloudServiceField.setWidth(TEXT_WIDTH); subnetSelect = new ComboBox(ViewProperties.getCaption("field.subnet")); subnetSelect.setImmediate(true); subnetSelect.setWidth(COMBOBOX_WIDTH); subnetSelect.setNullSelectionAllowed(false); subnetSelect.setItemCaptionPropertyId(CIDR_BLOCK_CAPTION_ID); subnetSelect.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY); storageAccountField = new TextField(ViewProperties.getCaption("field.storageAccount")); storageAccountField.setImmediate(true); storageAccountField.setWidth(COMBOBOX_WIDTH); Label spacer = new Label(" "); spacer.addStyleName("desc-padding-horizontal"); spacer.setHeight("5px"); form.getLayout().addComponent(sizeSelect); form.getLayout().addComponent(availabilitySetSelect); form.getLayout().addComponent(subnetSelect); form.getLayout().addComponent(spacer); HorizontalLayout layout = new HorizontalLayout(); layout.setSpacing(true); layout.setMargin(false); form.getLayout().addComponent(layout); addComponent(form); InstanceStatus status = InstanceStatus.fromStatus(instance.getInstance().getStatus()); if (status != InstanceStatus.STOPPED) { // サーバがStopped以外の場合は、詳細設定タブ自体を変更不可とする form.setEnabled(false); } else { // 停止時は、いくつかの項目を変更不可とする locationField.setEnabled(false); // サーバが作成済みのとき、変更不可 if (StringUtils.isNotEmpty(instance.getAzureInstance().getInstanceName())) { subnetSelect.setEnabled(false); // TODO 可用性セットが設定済みの場合も変更可能かもしれないが、 // 現段階では、APIから可用性セットの情報を取得できないのでサーバー作成済みの場合、変更不可とする availabilitySetSelect.setEnabled(false); } } } private void loadData() { // Azure情報を取得 // 情報を取得 IaasDescribeService describeService = BeanContext.getBean(IaasDescribeService.class); List<String> instanceTypes = new ArrayList<String>(); for (String instanceType : image.getImageAzure().getInstanceTypes().split(",")) { instanceTypes.add(instanceType.trim()); } this.instanceTypes = instanceTypes; // 可用性セット List<String> availabilitySets = new ArrayList<String>(); for (String availabilitySet : platform.getPlatformAzure().getAvailabilitySets().split(",")) { availabilitySets.add(availabilitySet.trim()); } this.availabilitySets = availabilitySets; //サブネット List<SubnetDto> subnets = describeService.getAzureSubnets(ViewContext.getUserNo(), platform.getPlatform() .getPlatformNo(), platform.getPlatformAzure().getNetworkName()); this.subnets = subnets; } private void initValidation() { String message; message = ViewMessages.getMessage("IUI-000027"); sizeSelect.setRequired(true); sizeSelect.setRequiredError(message); message = ViewMessages.getMessage("IUI-000129"); locationField.setRequired(true); locationField.setRequiredError(message); message = ViewMessages.getMessage("IUI-000130"); affinityField.setRequired(true); affinityField.setRequiredError(message); message = ViewMessages.getMessage("IUI-000131"); cloudServiceField.setRequired(true); cloudServiceField.setRequiredError(message); message = ViewMessages.getMessage("IUI-000108"); subnetSelect.setRequired(true); subnetSelect.setRequiredError(message); message = ViewMessages.getMessage("IUI-000132"); storageAccountField.setRequired(true); storageAccountField.setRequiredError(message); } private void show() { sizeSelect.setContainerDataSource(new IndexedContainer(instanceTypes)); sizeSelect.select(instance.getAzureInstance().getInstanceType()); availabilitySetSelect.setContainerDataSource(new IndexedContainer(availabilitySets)); availabilitySetSelect.select(instance.getAzureInstance().getAvailabilitySet()); subnetSelect.setContainerDataSource(createSubnetContainer()); for (SubnetDto subnetDto : subnets) { if (subnetDto.getSubnetId().equals(instance.getAzureInstance().getSubnetId())) { subnetSelect.select(subnetDto); break; } } } private IndexedContainer createSubnetContainer() { IndexedContainer subnetContainer = new IndexedContainer(); subnetContainer.addContainerProperty(CIDR_BLOCK_CAPTION_ID, String.class, null); for (SubnetDto subnetDto : subnets) { Item item = subnetContainer.addItem(subnetDto); item.getItemProperty(CIDR_BLOCK_CAPTION_ID).setValue(subnetDto.getCidrBlock()); } return subnetContainer; } } private class OpenStackDetailTab extends VerticalLayout { private InstanceDto instance; private PlatformDto platform; private ImageDto image; private Form form = new Form(); private ComboBox sizeSelect; private ComboBox zoneSelect; private ComboBox grpSelect; private ComboBox keySelect; private List<String> keyPairs; private List<String> securityGroups; private List<String> instanceTypes; private List<ZoneDto> zones; private final String ZONE_CAPTION_ID = "zoneName"; private final String COMBOBOX_WIDTH = "150px"; public OpenStackDetailTab(InstanceDto instance, PlatformDto platform, ImageDto image) { this.instance = instance; this.platform = platform; this.image = image; setHeight(TAB_HEIGHT); setMargin(false, true, false, true); setSpacing(false); sizeSelect = new ComboBox(ViewProperties.getCaption("field.serverSize")); sizeSelect.setWidth(COMBOBOX_WIDTH); sizeSelect.setNullSelectionAllowed(false); zoneSelect = new ComboBox(ViewProperties.getCaption("field.zone")); zoneSelect.setWidth(COMBOBOX_WIDTH); zoneSelect.setNullSelectionAllowed(false); zoneSelect.setItemCaptionPropertyId(ZONE_CAPTION_ID); zoneSelect.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY); grpSelect = new ComboBox(ViewProperties.getCaption("field.securityGroup")); grpSelect.setWidth(COMBOBOX_WIDTH); grpSelect.setImmediate(true); grpSelect.setNullSelectionAllowed(false); keySelect = new ComboBox(ViewProperties.getCaption("field.keyPair")); keySelect.setWidth(COMBOBOX_WIDTH); keySelect.setNullSelectionAllowed(false); Label spacer = new Label(" "); spacer.addStyleName("desc-padding-horizontal"); spacer.setHeight("5px"); form.getLayout().addComponent(sizeSelect); form.getLayout().addComponent(zoneSelect); form.getLayout().addComponent(grpSelect); form.getLayout().addComponent(keySelect); form.getLayout().addComponent(spacer); HorizontalLayout layout = new HorizontalLayout(); layout.setSpacing(true); layout.setMargin(false); form.getLayout().addComponent(layout); addComponent(form); InstanceStatus status = InstanceStatus.fromStatus(instance.getInstance().getStatus()); if (status != InstanceStatus.STOPPED) { // サーバがStopped以外の場合は、詳細設定タブ自体を変更不可とする form.setEnabled(false); } else { // 停止時は、いくつかの項目を変更不可とする if (StringUtils.isNotEmpty(instance.getOpenstackInstance().getInstanceId())) { // 一度でも起動した場合、項目を変更不可とする form.setEnabled(false); } } } private void loadData() { // 情報を取得 IaasDescribeService describeService = BeanContext.getBean(IaasDescribeService.class); //instanceTypes List<String> instanceTypes = new ArrayList<String>(); for (String instanceType : image.getImageOpenstack().getInstanceTypes().split(",")) { //IDで取得されるため、今後名称に変換する必要有り instanceTypes.add(instanceType.trim()); } this.instanceTypes = instanceTypes; // Availablility Zone List<ZoneDto> zones = describeService.getAvailabilityZones(ViewContext.getUserNo(), platform.getPlatform() .getPlatformNo()); this.zones = zones; //セキュリティグループ List<String> securityGroups = new ArrayList<String>(); List<SecurityGroupDto> groups; groups = describeService.getSecurityGroups(ViewContext.getUserNo(), platform.getPlatform().getPlatformNo(), null); for (SecurityGroupDto group : groups) { securityGroups.add(group.getGroupName()); } this.securityGroups = securityGroups; //キーペア List<KeyPairDto> infos = describeService.getKeyPairs(ViewContext.getUserNo(), platform.getPlatform() .getPlatformNo()); List<String> keyPairs = new ArrayList<String>(); for (KeyPairDto info : infos) { keyPairs.add(info.getKeyName()); } this.keyPairs = keyPairs; } private void initValidation() { String message; message = ViewMessages.getMessage("IUI-000027"); sizeSelect.setRequired(true); sizeSelect.setRequiredError(message); } public void show() { sizeSelect.setContainerDataSource(new IndexedContainer(instanceTypes)); sizeSelect.select(instance.getOpenstackInstance().getInstanceType()); zoneSelect.setContainerDataSource(createZoneContainer()); for (ZoneDto zoneDto : zones) { if (StringUtils.equals(zoneDto.getZoneName(), instance.getOpenstackInstance().getAvailabilityZone())) { zoneSelect.select(zoneDto); break; } } if (instance.getOpenstackVolumes() != null && instance.getOpenstackVolumes().size() > 0) { //ボリュームが存在する場合は編集不可 zoneSelect.setEnabled(false); } grpSelect.setContainerDataSource(new IndexedContainer(securityGroups)); grpSelect.select(instance.getOpenstackInstance().getSecurityGroups()); keySelect.setContainerDataSource(new IndexedContainer(keyPairs)); keySelect.select(instance.getOpenstackInstance().getKeyName()); } private IndexedContainer createZoneContainer() { IndexedContainer zoneContainer = new IndexedContainer(); zoneContainer.addContainerProperty(ZONE_CAPTION_ID, String.class, null); for (ZoneDto zoneDto : zones) { Item item = zoneContainer.addItem(zoneDto); item.getItemProperty(ZONE_CAPTION_ID).setValue(zoneDto.getZoneName()); } return zoneContainer; } } private void loadData() { // サーバ情報を取得 InstanceService instanceService = BeanContext.getBean(InstanceService.class); this.instance = instanceService.getInstance(instanceNo); // プラットフォーム情報を取得 List<PlatformDto> platforms = instanceService.getPlatforms(ViewContext.getUserNo()); for (PlatformDto platform : platforms) { if (instance.getInstance().getPlatformNo().equals(platform.getPlatform().getPlatformNo())) { this.platform = platform; break; } } // サーバ種別情報 for (ImageDto image : platform.getImages()) { if (instance.getInstance().getImageNo().equals(image.getImage().getImageNo())) { this.image = image; break; } } // 有効でないサービス情報情報を除外 List<ComponentType> componentTypes = image.getComponentTypes(); for (int i = componentTypes.size() - 1; i >= 0; i--) { if (BooleanUtils.isNotTrue(componentTypes.get(i).getSelectable())) { componentTypes.remove(i); } } // 利用可能なサービス情報をソート Collections.sort(componentTypes, new Comparator<ComponentType>() { @Override public int compare(ComponentType o1, ComponentType o2) { int order1 = (o1.getViewOrder() != null) ? o1.getViewOrder() : Integer.MAX_VALUE; int order2 = (o2.getViewOrder() != null) ? o2.getViewOrder() : Integer.MAX_VALUE; return order1 - order2; } }); } private void okButtonClick(ClickEvent event) { if (PCCConstant.PLATFORM_TYPE_AWS.equals(platform.getPlatform().getPlatformType())) { updateAwsInstance(); } else if (PCCConstant.PLATFORM_TYPE_VMWARE.equals(platform.getPlatform().getPlatformType())) { updateVmwareInstance(); } else if (PCCConstant.PLATFORM_TYPE_NIFTY.equals(platform.getPlatform().getPlatformType())) { updateNiftyInstance(); } else if (PCCConstant.PLATFORM_TYPE_CLOUDSTACK.equals(platform.getPlatform().getPlatformType())) { updateCloudstackInstance(); } else if (PCCConstant.PLATFORM_TYPE_VCLOUD.equals(platform.getPlatform().getPlatformType())) { updateVcloudInstance(); } else if (PCCConstant.PLATFORM_TYPE_AZURE.equals(platform.getPlatform().getPlatformType())) { updateAzureInstance(); } else if (PCCConstant.PLATFORM_TYPE_OPENSTACK.equals(platform.getPlatform().getPlatformType())) { updateOpenstackInstance(); } } private void updateAwsInstance() { // 入力値を取得 String comment = (String) basicTab.commentField.getValue(); String keyName = (String) awsDetailTab.keySelect.getValue(); String groupName = (String) awsDetailTab.grpSelect.getValue(); String serverSize = (String) awsDetailTab.sizeSelect.getValue(); String zoneName = null; String subnetId = null; String privateIp = null; String rootSize = (String) awsDetailTab.rootSizeField.getValue(); Long addressNo = (awsDetailTab.elasticIpSelect == null) ? null : (Long) awsDetailTab.elasticIpSelect.getValue(); Subnet subnet = null; if (BooleanUtils.isTrue(platform.getPlatformAws().getVpc())) { subnetId = (String) awsDetailTab.subnetSelect.getValue(); subnet = awsDetailTab.findSubnet(subnetId); zoneName = subnet.getAvailabilityZone(); privateIp = (String) awsDetailTab.privateIpField.getValue(); } else { zoneName = (String) awsDetailTab.zoneSelect.getValue(); } if (awsDetailTab.NULL_ADDRESS.equals(addressNo)) { addressNo = null; } // 入力チェック basicTab.commentField.validate(); awsDetailTab.sizeSelect.validate(); awsDetailTab.keySelect.validate(); awsDetailTab.grpSelect.validate(); if (BooleanUtils.isTrue(platform.getPlatformAws().getVpc())) { awsDetailTab.subnetSelect.validate(); awsDetailTab.privateIpField.validate(); } else { awsDetailTab.zoneSelect.validate(); } awsDetailTab.rootSizeField.validate(); if (awsDetailTab.elasticIpSelect != null) { awsDetailTab.elasticIpSelect.validate(); } // プライベートIPアドレスがサブネット内で有効かどうかをチェック if (BooleanUtils.isTrue(platform.getPlatformAws().getVpc()) && StringUtils.isNotEmpty(privateIp)) { long privateIpAddress = IpAddressUtils.parse(privateIp); long networkAddress = IpAddressUtils.getNetworkAddress(subnet.getCidrBlock()); long broadcastAddress = IpAddressUtils.getBroadcastAddress(subnet.getCidrBlock()); // AWSのサブネットの最初の4つと最後の1つのIPアドレスは予約されているため使用できない if (privateIpAddress < networkAddress + 4 || broadcastAddress - 1 < privateIpAddress) { throw new AutoApplicationException("IUI-000109", IpAddressUtils.format(networkAddress + 4), IpAddressUtils.format(broadcastAddress - 1)); } } // 自身以外に割り当て済みのElasticIPアドレスは利用できない if (addressNo != null) { AwsAddress awsAddress = awsDetailTab.findAwsAddress(addressNo); if (awsAddress.getInstanceNo() != null) { if (instance.getAwsAddress() == null || !instance.getAwsAddress().getAddressNo().equals(awsAddress.getAddressNo())) { throw new AutoApplicationException("IUI-000064"); } } } Integer rootSize2 = null; try { rootSize2 = Integer.valueOf(rootSize); } catch (Exception ignore) { } // オペレーションログ OperationLogger.writeInstance("SERVER", "Edit Server", instanceNo, null); // AWSサーバを更新 InstanceService instanceService = BeanContext.getBean(InstanceService.class); instanceService.updateAwsInstance(instanceNo, instance.getInstance().getInstanceName(), comment, keyName, serverSize, groupName, zoneName, addressNo, subnetId, rootSize2, privateIp); // サーバにサービスを関連付ける if (basicTab.componentNos != null && basicTab.attachService) { instanceService.associateComponents(instanceNo, basicTab.componentNos); } // 画面を閉じる close(); } private void updateVmwareInstance() { // 入力値を取得 String comment = (String) basicTab.commentField.getValue(); Long keyNo = (Long) vmwareDetailTab.keySelect.getValue(); String serverSize = (String) vmwareDetailTab.sizeSelect.getValue(); String cluster = (String) vmwareDetailTab.clusterSelect.getValue(); String rootSize = (String) vmwareDetailTab.rootSizeField.getValue(); VmwareAddressDto vmwareAddressDto = null; Boolean isStaticipSelected = false; if (vmwareEditIpTab != null) { String ipOption = (String) vmwareEditIpTab.ipOptionGroup.getValue(); if (vmwareEditIpTab.IP_OPTION_STATIC.equals(ipOption)) { String ipAddress = (String) vmwareEditIpTab.ipAddressField.getValue(); String subnetMask = (String) vmwareEditIpTab.subnetMaskField.getValue(); String defaultGateway = (String) vmwareEditIpTab.defaultGatewayField.getValue(); vmwareAddressDto = new VmwareAddressDto(); vmwareAddressDto.setIpAddress(ipAddress); vmwareAddressDto.setSubnetMask(subnetMask); vmwareAddressDto.setDefaultGateway(defaultGateway); } } // 入力チェック basicTab.commentField.validate(); vmwareDetailTab.keySelect.validate(); vmwareDetailTab.clusterSelect.validate(); vmwareDetailTab.sizeSelect.validate(); vmwareDetailTab.rootSizeField.validate(); if (BooleanUtils.isTrue(isStaticipSelected)) { vmwareEditIpTab.ipAddressField.validate(); vmwareEditIpTab.subnetMaskField.validate(); vmwareEditIpTab.defaultGatewayField.validate(); } Integer rootSize2 = null; try { rootSize2 = Integer.valueOf(rootSize); } catch (Exception ignore) { } // オペレーションログ OperationLogger.writeInstance("SERVER", "Edit Server", instanceNo, null); // VMwareサーバを更新 InstanceService instanceService = BeanContext.getBean(InstanceService.class); instanceService.updateVmwareInstance(instanceNo, instance.getInstance().getInstanceName(), comment, serverSize, cluster, null, keyNo, rootSize2, vmwareAddressDto); // サーバにサービスを関連付ける if (basicTab.componentNos != null && basicTab.attachService) { instanceService.associateComponents(instanceNo, basicTab.componentNos); } // 画面を閉じる close(); } private void updateNiftyInstance() { // 入力値を取得 String comment = (String) basicTab.commentField.getValue(); String keyName = (String) niftyDetailTab.keySelect.getValue(); String serverSize = (String) niftyDetailTab.sizeSelect.getValue(); NiftyKeyPair selectedKeyPair = null; for (NiftyKeyPair niftyKeyPair : niftyDetailTab.niftyKeyPairs) { if (niftyKeyPair.getKeyName().equals(keyName)) { selectedKeyPair = niftyKeyPair; break; } } // 入力チェック basicTab.commentField.validate(); niftyDetailTab.keySelect.validate(); niftyDetailTab.sizeSelect.validate(); // オペレーションログ OperationLogger.writeInstance("SERVER", "Edit Server", instanceNo, null); // Niftyサーバを更新 InstanceService instanceService = BeanContext.getBean(InstanceService.class); instanceService.updateNiftyInstance(instanceNo, instance.getInstance().getInstanceName(), comment, serverSize, selectedKeyPair.getKeyNo()); // サーバにサービスを関連付ける if (basicTab.componentNos != null && basicTab.attachService) { instanceService.associateComponents(instanceNo, basicTab.componentNos); } // 画面を閉じる close(); } private void updateCloudstackInstance() { // 入力値を取得 String comment = (String) basicTab.commentField.getValue(); String keyName = (String) cloudStackDetailTab.keySelect.getValue(); String groupName = (String) cloudStackDetailTab.grpSelect.getValue(); String serverSize = (String) cloudStackDetailTab.sizeSelect.getValue(); ZoneDto zoneDto = (ZoneDto) cloudStackDetailTab.zoneSelect.getValue(); String zoneId = null; AddressDto address = (AddressDto) cloudStackDetailTab.elasticIpSelect.getValue(); if (zoneDto != null) { zoneId = zoneDto.getZoneId(); } // 入力チェック basicTab.commentField.validate(); cloudStackDetailTab.sizeSelect.validate(); cloudStackDetailTab.zoneSelect.validate(); cloudStackDetailTab.elasticIpSelect.validate(); // 自身以外に割り当て済みのElasticIPアドレスは利用できない if (!cloudStackDetailTab.NULL_ADDRESS.equals(address) && address.getInstanceNo() != null) { if (instance.getCloudstackAddress() == null || !instance.getCloudstackAddress().getAddressNo().equals(address.getAddressNo())) { throw new AutoApplicationException("IUI-000064"); } } // オペレーションログ OperationLogger.writeInstance("SERVER", "Edit Server", instanceNo, null); // CloudStackサーバを更新 InstanceService instanceService = BeanContext.getBean(InstanceService.class); instanceService.updateCloudstackInstance(instanceNo, instance.getInstance().getInstanceName(), comment, keyName, serverSize, groupName, zoneId, address.getAddressNo()); // サーバにサービスを関連付ける if (basicTab.componentNos != null && basicTab.attachService) { instanceService.associateComponents(instanceNo, basicTab.componentNos); } // 画面を閉じる close(); } private void updateVcloudInstance() { // 入力値を取得 String comment = (String) basicTab.commentField.getValue(); Long keyNo = (Long) vcloudDetailTab.keySelect.getValue(); String serverSize = (String) vcloudDetailTab.sizeSelect.getValue(); Long storageTypeNo = (Long) vcloudDetailTab.storageTypeSelect.getValue(); // 入力チェック basicTab.commentField.validate(); vcloudDetailTab.storageTypeSelect.validate(); vcloudDetailTab.keySelect.validate(); vcloudDetailTab.sizeSelect.validate(); // オペレーションログ OperationLogger.writeInstance("SERVER", "Edit Server", instanceNo, null); // VCloudサーバを更新 InstanceService instanceService = BeanContext.getBean(InstanceService.class); instanceService.updateVcloudInstance(instanceNo, instance.getInstance().getInstanceName(), comment, storageTypeNo, keyNo, serverSize, vcloudNetworkTab.instanceNetworks); // サーバにサービスを関連付ける if (basicTab.componentNos != null && basicTab.attachService) { instanceService.associateComponents(instanceNo, basicTab.componentNos); } // 画面を閉じる close(); } private void updateAzureInstance() { // 入力値を取得 String comment = (String) basicTab.commentField.getValue(); String serverSize = (String) azureDetailTab.sizeSelect.getValue(); SubnetDto subnetDto = (SubnetDto) azureDetailTab.subnetSelect.getValue(); String subnetId = null; String availabilitySet = (String) azureDetailTab.availabilitySetSelect.getValue(); if (subnetDto != null) { subnetId = subnetDto.getSubnetId(); } // 入力チェック basicTab.commentField.validate(); azureDetailTab.sizeSelect.validate(); azureDetailTab.subnetSelect.validate(); // オペレーションログ OperationLogger.writeInstance("SERVER", "Edit Server", instanceNo, null); // Azureサーバを更新 InstanceService instanceService = BeanContext.getBean(InstanceService.class); instanceService.updateAzureInstance(instanceNo, instance.getInstance().getInstanceName(), comment, serverSize, availabilitySet, subnetId); // サーバにサービスを関連付ける if (basicTab.componentNos != null && basicTab.attachService) { instanceService.associateComponents(instanceNo, basicTab.componentNos); } // 画面を閉じる close(); } private void updateOpenstackInstance() { // 入力値を取得 String comment = (String) basicTab.commentField.getValue(); String keyName = (String) openStackDetailTab.keySelect.getValue(); String groupName = (String) openStackDetailTab.grpSelect.getValue(); String serverSize = (String) openStackDetailTab.sizeSelect.getValue(); ZoneDto zoneDto = (ZoneDto) openStackDetailTab.zoneSelect.getValue(); String zoneName = null; if (zoneDto != null) { zoneName = zoneDto.getZoneName(); } // 入力チェック basicTab.commentField.validate(); openStackDetailTab.sizeSelect.validate(); // オペレーションログ OperationLogger.writeInstance("SERVER", "Edit Server", instanceNo, null); // OpenStackサーバを更新 InstanceService instanceService = BeanContext.getBean(InstanceService.class); instanceService.updateOpenStackInstance(instanceNo, instance.getInstance().getInstanceName(), comment, serverSize, zoneName, groupName, keyName); // サーバにサービスを関連付ける if (basicTab.componentNos != null && basicTab.attachService) { instanceService.associateComponents(instanceNo, basicTab.componentNos); } // 画面を閉じる close(); } }