diff --git a/agent-simulator/tomcatconf/components-simulator.xml.in b/agent-simulator/tomcatconf/components-simulator.xml.in index c92c6420d4c..011bc71892b 100755 --- a/agent-simulator/tomcatconf/components-simulator.xml.in +++ b/agent-simulator/tomcatconf/components-simulator.xml.in @@ -4,13 +4,6 @@ true - - - - - - - diff --git a/api/src/com/cloud/api/ApiConstants.java b/api/src/com/cloud/api/ApiConstants.java index 4ed625c40f7..665bfac9527 100755 --- a/api/src/com/cloud/api/ApiConstants.java +++ b/api/src/com/cloud/api/ApiConstants.java @@ -325,7 +325,6 @@ public class ApiConstants { public static final String TRAFFIC_TYPE_IMPLEMENTOR = "traffictypeimplementor"; public static final String KEYWORD = "keyword"; public static final String LIST_ALL = "listall"; - public static final String IS_ELASTIC = "iselastic"; public static final String SPECIFY_IP_RANGES = "specifyipranges"; public static final String IS_SOURCE_NAT = "issourcenat"; public static final String IS_STATIC_NAT = "isstaticnat"; diff --git a/api/src/com/cloud/api/commands/CreateIpForwardingRuleCmd.java b/api/src/com/cloud/api/commands/CreateIpForwardingRuleCmd.java index 859144f775f..1d3d38c86c6 100644 --- a/api/src/com/cloud/api/commands/CreateIpForwardingRuleCmd.java +++ b/api/src/com/cloud/api/commands/CreateIpForwardingRuleCmd.java @@ -124,7 +124,7 @@ public class CreateIpForwardingRuleCmd extends BaseAsyncCreateCmd implements Sta result = result && _rulesService.applyStaticNatRules(ipAddressId, UserContext.current().getCaller()); rule = _entityMgr.findById(FirewallRule.class, getEntityId()); - StaticNatRule staticNatRule = _rulesService.buildStaticNatRule(rule); + StaticNatRule staticNatRule = _rulesService.buildStaticNatRule(rule, false); IpForwardingRuleResponse fwResponse = _responseGenerator.createIpForwardingRuleResponse(staticNatRule); fwResponse.setResponseName(getCommandName()); this.setResponseObject(fwResponse); diff --git a/api/src/com/cloud/api/commands/ListIpForwardingRulesCmd.java b/api/src/com/cloud/api/commands/ListIpForwardingRulesCmd.java index e064c5bdec4..692f341845a 100644 --- a/api/src/com/cloud/api/commands/ListIpForwardingRulesCmd.java +++ b/api/src/com/cloud/api/commands/ListIpForwardingRulesCmd.java @@ -87,7 +87,7 @@ public class ListIpForwardingRulesCmd extends BaseListProjectAndAccountResources ListResponse response = new ListResponse(); List ipForwardingResponses = new ArrayList(); for (FirewallRule rule : result) { - StaticNatRule staticNatRule = _rulesService.buildStaticNatRule(rule); + StaticNatRule staticNatRule = _rulesService.buildStaticNatRule(rule, false); IpForwardingRuleResponse resp = _responseGenerator.createIpForwardingRuleResponse(staticNatRule); if (resp != null) { ipForwardingResponses.add(resp); diff --git a/api/src/com/cloud/api/commands/ListNetworkOfferingsCmd.java b/api/src/com/cloud/api/commands/ListNetworkOfferingsCmd.java index 692f923abeb..98ffe270d91 100644 --- a/api/src/com/cloud/api/commands/ListNetworkOfferingsCmd.java +++ b/api/src/com/cloud/api/commands/ListNetworkOfferingsCmd.java @@ -84,11 +84,12 @@ public class ListNetworkOfferingsCmd extends BaseListCmd { @Parameter(name=ApiConstants.SOURCE_NAT_SUPPORTED, type=CommandType.BOOLEAN, description="true if need to list only netwok offerings where source nat is supported, false otherwise") private Boolean sourceNatSupported; - - @Parameter(name=ApiConstants.SPECIFY_IP_RANGES, type=CommandType.BOOLEAN, description="true if need to list only network offerings which support specifying ip ranges") private Boolean specifyIpRanges; + @Parameter(name=ApiConstants.TAGS, type=CommandType.STRING, description="list network offerings by tags", length=4096) + private String tags; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -149,7 +150,11 @@ public class ListNetworkOfferingsCmd extends BaseListCmd { return specifyIpRanges; } - ///////////////////////////////////////////////////// + public String getTags() { + return tags; + } + + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// @Override diff --git a/api/src/com/cloud/api/response/IPAddressResponse.java b/api/src/com/cloud/api/response/IPAddressResponse.java index 0617aef844a..b78c16ead2d 100644 --- a/api/src/com/cloud/api/response/IPAddressResponse.java +++ b/api/src/com/cloud/api/response/IPAddressResponse.java @@ -71,8 +71,8 @@ public class IPAddressResponse extends BaseResponse implements ControlledEntityR @SerializedName("isstaticnat") @Param(description="true if this ip is for static nat, false otherwise") private Boolean staticNat; - @SerializedName(ApiConstants.IS_ELASTIC) @Param(description="true if this ip is elastic ip (was allocated as a part of deployVm or createLbRule)") - private Boolean isElastic; + @SerializedName(ApiConstants.IS_SYSTEM) @Param(description="true if this ip is system ip (was allocated as a part of deployVm or createLbRule)") + private Boolean isSystem; @SerializedName(ApiConstants.VIRTUAL_MACHINE_ID) @Param(description="virutal machine id the ip address is assigned to (not null only for static nat Ip)") private IdentityProxy virtualMachineId = new IdentityProxy("vm_instance"); @@ -95,7 +95,7 @@ public class IPAddressResponse extends BaseResponse implements ControlledEntityR @SerializedName(ApiConstants.PHYSICAL_NETWORK_ID) @Param(description="the physical network this belongs to") private IdentityProxy physicalNetworkId = new IdentityProxy("physical_network"); - @SerializedName(ApiConstants.PURPOSE) @Param(description="purpose of the IP address. In Acton this value is not null for Elastic IPs only, and can have either StaticNat or LB value") + @SerializedName(ApiConstants.PURPOSE) @Param(description="purpose of the IP address. In Acton this value is not null for Ips with isSystem=true, and can have either StaticNat or LB value") private String purpose; /* @@ -210,8 +210,8 @@ public class IPAddressResponse extends BaseResponse implements ControlledEntityR this.physicalNetworkId.setValue(physicalNetworkId); } - public void setIsElastic(Boolean isElastic) { - this.isElastic = isElastic; + public void setIsSystem(Boolean isSystem) { + this.isSystem = isSystem; } public void setPurpose(String purpose) { diff --git a/api/src/com/cloud/api/response/IsoVmResponse.java b/api/src/com/cloud/api/response/IsoVmResponse.java deleted file mode 100755 index 1da14f9fdd7..00000000000 --- a/api/src/com/cloud/api/response/IsoVmResponse.java +++ /dev/null @@ -1,146 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It 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 3 of the License, or any later version. - * This program 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 this program. If not, see . - * - */ -package com.cloud.api.response; - -import com.cloud.api.IdentityProxy; -import com.cloud.serializer.Param; -import com.google.gson.annotations.SerializedName; - -public class IsoVmResponse extends BaseResponse { - @SerializedName("id") @Param(description="the ISO ID") - private IdentityProxy id = new IdentityProxy("vm_template"); - - @SerializedName("name") @Param(description="the ISO name") - private String name; - - @SerializedName("displaytext") @Param(description="the ISO display text") - private String displayText; - - @SerializedName("bootable") @Param(description="true if the ISO is bootable, false otherwise") - private Boolean bootable; - - @SerializedName("isfeatured") @Param(description="true if this template is a featured template, false otherwise") - private Boolean featured; - - @SerializedName("ostypeid") @Param(description="the ID of the OS type for this template.") - private IdentityProxy osTypeId = new IdentityProxy("guest_os"); - - @SerializedName("ostypename") @Param(description="the name of the OS type for this template.") - private String osTypeName; - - @SerializedName("virtualmachineid") @Param(description="id of the virtual machine") - private IdentityProxy virtualMachineId = new IdentityProxy("vm_instance"); - - @SerializedName("vmname") @Param(description="name of the virtual machine") - private String virtualMachineName; - - @SerializedName("vmdisplayname") @Param(description="display name of the virtual machine") - private String virtualMachineDisplayName; - - @SerializedName("vmstate") @Param(description="state of the virtual machine") - private String virtualMachineState; - - - public Long getOsTypeId() { - return osTypeId.getValue(); - } - - public void setOsTypeId(Long osTypeId) { - this.osTypeId.setValue(osTypeId); - } - - public String getOsTypeName() { - return osTypeName; - } - - public void setOsTypeName(String osTypeName) { - this.osTypeName = osTypeName; - } - - public Long getId() { - return id.getValue(); - } - - public void setId(Long id) { - this.id.setValue(id); - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getDisplayText() { - return displayText; - } - - public void setDisplayText(String displayText) { - this.displayText = displayText; - } - - public Boolean isBootable() { - return bootable; - } - - public void setBootable(Boolean bootable) { - this.bootable = bootable; - } - - public Boolean isFeatured() { - return featured; - } - - public void setFeatured(Boolean featured) { - this.featured = featured; - } - - public Long getVirtualMachineId() { - return virtualMachineId.getValue(); - } - - public void setVirtualMachineId(Long virtualMachineId) { - this.virtualMachineId.setValue(virtualMachineId); - } - - public String getVirtualMachineName() { - return virtualMachineName; - } - - public void setVirtualMachineName(String virtualMachineName) { - this.virtualMachineName = virtualMachineName; - } - - public String getVirtualMachineDisplayName() { - return virtualMachineDisplayName; - } - - public void setVirtualMachineDisplayName(String virtualMachineDisplayName) { - this.virtualMachineDisplayName = virtualMachineDisplayName; - } - - public String getVirtualMachineState() { - return virtualMachineState; - } - - public void setVirtualMachineState(String virtualMachineState) { - this.virtualMachineState = virtualMachineState; - } -} diff --git a/api/src/com/cloud/network/IpAddress.java b/api/src/com/cloud/network/IpAddress.java index e4eefe89d6b..d60a43537b5 100644 --- a/api/src/com/cloud/network/IpAddress.java +++ b/api/src/com/cloud/network/IpAddress.java @@ -83,6 +83,6 @@ public interface IpAddress extends ControlledEntity { Long getAllocatedInDomainId(); - boolean getElastic(); + boolean getSystem(); } diff --git a/api/src/com/cloud/network/NetworkService.java b/api/src/com/cloud/network/NetworkService.java index bbb102c6f46..4d7e6b68192 100755 --- a/api/src/com/cloud/network/NetworkService.java +++ b/api/src/com/cloud/network/NetworkService.java @@ -42,7 +42,7 @@ public interface NetworkService { List getIsolatedNetworksOwnedByAccountInZone(long zoneId, Account owner); - IpAddress allocateIP(long networkId, Account ipOwner, boolean isElastic) throws ResourceAllocationException, InsufficientAddressCapacityException, ConcurrentOperationException; + IpAddress allocateIP(long networkId, Account ipOwner, boolean isSystem) throws ResourceAllocationException, InsufficientAddressCapacityException, ConcurrentOperationException; /** * Associates a public IP address for a router. diff --git a/api/src/com/cloud/network/rules/RulesService.java b/api/src/com/cloud/network/rules/RulesService.java index 55439632be3..c91b1263bbe 100644 --- a/api/src/com/cloud/network/rules/RulesService.java +++ b/api/src/com/cloud/network/rules/RulesService.java @@ -77,7 +77,7 @@ public interface RulesService { boolean applyStaticNatRules(long ipAdddressId, Account caller) throws ResourceUnavailableException; - StaticNatRule buildStaticNatRule(FirewallRule rule); + StaticNatRule buildStaticNatRule(FirewallRule rule, boolean forRevoke); List getSourceCidrs(long ruleId); diff --git a/client/WEB-INF/classes/resources/messages.properties b/client/WEB-INF/classes/resources/messages.properties index 45b46b284b4..66cd415b0e5 100644 --- a/client/WEB-INF/classes/resources/messages.properties +++ b/client/WEB-INF/classes/resources/messages.properties @@ -1,4 +1,27 @@ #new labels (begin) ********************************************************************************************** +label.add.compute.offering=Add compute offering +label.compute.offering=Compute offering +label.compute.offerings=Compute offerings +label.select.offering=Select offering +label.menu.infrastructure=Infrastructure +label.sticky.tablesize=Table size +label.sticky.expire=Expires +label.sticky.cookie-name=Cookie name +label.sticky.mode=Mode +label.sticky.length=Length +label.sticky.holdtime=Hold time +label.sticky.request-learn=Request learn +label.sticky.prefix=Prefix +label.sticky.nocache=No cache +label.sticky.indirect=Indirect +label.sticky.postonly=Post only +label.sticky.domain=Domain +state.Allocating=Allocating +state.Migrating=Migrating +error.please.specify.physical.network.tags=Network offerings is not available until you specify tags for this physical network. +#new labels (end) ************************************************************************************************ + + state.Stopping=Stopping message.add.load.balancer.under.ip=The load balancer rule has been added under IP: message.select.instance=Please select an instance. @@ -182,7 +205,7 @@ message.disable.vpn=Are you sure you want to disable VPN? label.disable.vpn=Disable VPN message.enable.vpn=Please confirm that you want VPN access enabled for this IP address. label.enable.vpn=Enable VPN -message.acquire.new.ip=Please confirm that you would like to acquire a net IP for this network. +message.acquire.new.ip=Please confirm that you would like to acquire a new IP for this network. label.elastic=Elastic label.my.network=My network label.add.vms=Add VMs @@ -299,7 +322,7 @@ label.guest.type=Guest Type label.specify.IP.ranges=Specify IP ranges label.conserve.mode=Conserve mode label.created.by.system=Created by system -label.menu.system.service.offerings=System Service Offerings +label.menu.system.service.offerings=System Offerings label.add.system.service.offering=Add System Service Offering label.redundant.router.capability=Redundant router capability label.supported.source.NAT.type=Supported Source NAT type @@ -420,7 +443,7 @@ label.physical.network=Physical Network label.public.traffic=Public traffic label.guest.traffic=Guest Traffic label.storage.traffic=Storage Traffic -message.setup.physical.network.during.zone.creation=When adding an advanced zone, you need to set up one or more physical networks. Each network corresponds to a NIC on the management server. Each physical network can carry one or more types of traffic, with certain restrictions on how they may be combined.

Drag and drop one or more traffic types onto each physical network. +message.setup.physical.network.during.zone.creation=When adding an advanced zone, you need to set up one or more physical networks. Each network corresponds to a NIC on the hypervisor. Each physical network can carry one or more types of traffic, with certain restrictions on how they may be combined.

Drag and drop one or more traffic types onto each physical network. label.add.physical.network=Add physical network label.traffic.types=Traffic Types label.management=Management @@ -451,8 +474,8 @@ label.total.hosts=Total Hosts label.total.CPU=Total CPU label.total.memory=Total Memory label.total.storage=Total Storage +label.purpose=Purpose -#new labels (end) ********************************************************************************************** @@ -1236,7 +1259,7 @@ message.add.pod=Add a new pod for zone , pod message.add.primary=Please specify the following parameters to add a new primary storage message.add.secondary.storage=Add a new storage for zone -message.add.service.offering=Please fill in the following data to add a new service offering. +message.add.service.offering=Please fill in the following data to add a new compute offering. message.add.template=Please enter the following data to create your new template message.add.volume=Please fill in the following data to add a new volume. message.additional.networks.desc=Please select additional network(s) that your virtual instance will be connected to. diff --git a/client/WEB-INF/classes/resources/messages_ja.properties b/client/WEB-INF/classes/resources/messages_ja.properties index 5dfb3db092d..5eb8fcd8a22 100644 --- a/client/WEB-INF/classes/resources/messages_ja.properties +++ b/client/WEB-INF/classes/resources/messages_ja.properties @@ -1,1316 +1,1334 @@ #new labels (begin) ********************************************************************************************** -state.Stopping=停止 -message.add.load.balancer.under.ip=ロードバランサのルールは、IPの下に追加されました。 +label.sticky.tablesize=Table size +label.sticky.expire=Expires +label.sticky.cookie-name=Cookie name +label.sticky.mode=Mode +label.sticky.length=Length +label.sticky.holdtime=Hold time +label.sticky.request-learn=Request learn +label.sticky.prefix=Prefix +label.sticky.nocache=No cache +label.sticky.indirect=Indirect +label.sticky.postonly=Post only +label.sticky.domain=Domain +state.Allocating=Allocating +state.Migrating=Migrating +error.please.specify.physical.network.tags=Network offerings is not available until you specify tags for this physical network. +#new labels (end) ************************************************************************************************ + + + +state.Stopping=停止しています +message.add.load.balancer.under.ip=負荷分散規則が次の IP アドレスに対して追加されました: message.select.instance=インスタンスを選択してください。 -label.select=選択する -label.select.vm.for.static.nat=スタティックNATのためにVMを選択します。 -label.select.instance=インスタンスを選択します。 -label.nat.port.range=NATのポート範囲 -label.static.nat.vm.details=スタティックNAT仮想マシンの詳細 -label.edit.lb.rule=LBルールを編集する -message.migrate.instance.to.host=別のホストにインスタンスを移行することを確認してください。 -label.migrate.instance.to.host=別のホストにインスタンスを移行する -message.migrate.instance.to.ps=別のプライマリ·ストレージにインスタンスを移行することを確認してください。 -label.migrate.instance.to.ps=別のプライマリストレージにインスタンスを移行する -label.corrections.saved=修正が保存され -message.installWizard.copy.whatIsSecondaryStorage=セカンダリストレージは、ゾーンに関連付けられており、それは次のように格納されてい:
  • テンプレート - OSイメージのVMを起動すると、インストール済みのアプリケーションなどの追加の構成情報を含めることができます使用することができます
  • ISOイメージ - ブートまたは非ブートできるOSイメージ
  • ディスクボリュームのスナップショット - データ復旧のために使用することができ、VMデータのコピーを保存したり、新しいテンプレートを作成する
-message.installWizard.copy.whatIsPrimaryStorage=プライマリストレージとセカンダリストレージ:CloudStack™クラウド·インフラストラクチャは、ストレージの2つのタイプを使用しています。これらの両方は、iSCSIまたはNFSサーバー、またはlocaldiskすることができます。

プライマリ·ストレージは、クラスタに関連付けられており、そのクラスタ内のホスト上で実行されているすべてのVMの各ゲストVMのディスクボリュームに格納されています。プライマリ·ストレージ·サーバーは通常、ホストの近くに位置しています。 -message.installWizard.copy.whatIsAHost=ホストは、単一のコンピュータです。ホストは、ゲスト仮想マシンを実行するコンピューティングリソースを提供しています。各ホストは、ゲストVMを(高度なインストレーション·ガイドで説明する特殊なケースであるベアメタルホストを除く)を管理するためにそれにインストールされているソフトウェアをハイパーバイザしています。たとえば、Linux KVM対応のサーバーは、Citrix XenServerサーバ、およびESXiサーバがホストです。基本インストールでは、我々は、XenServerを実行する単一ホストを使用します。

ホストはCloudStack™展開内で最小の組織単位です。ホストがクラスタ内に含まれている、クラスタは、ポッド内に含まれており、ポッドは、ゾーン内に含まれています。 -message.installWizard.copy.whatIsACluster=クラスタは、グループのホストにする方法を提供します。クラスタ内のホストはすべて同一のハードウェアを持っている、同じハイパーバイザー実行したのと同じサブネット上にあり、同じ共有ストレージにアクセスすることができます。仮想マシン·インスタンス(VMS)は、ユーザーにサービスを中断することなく、同じクラスタ内の別のホストからのライブ移行することができます。クラスタは、CloudStack内サード最大の組織単位™展開です。クラスタは、ポッド内に含まれており、ポッドは、ゾーン内に含まれています。

CloudStack™は、クラウドの展開で複数のクラスタを使用できますが、基本的なインストールのために、私達は1つのクラスタのみを必要としています。 -message.installWizard.copy.whatIsAPod=ポッドは、多くの場合、単一のラックを表しています。同じポッド内のホストが同じサブネット内にあります。

ポッドはCloudStack内で二番目に大きい組織単位™展開です。ポッドは、ゾーン内に含まれています。各ゾーンは、1つまたは複数のポッドを含めることができます。基本インストールでは、あなたのゾーンのひとつポッドを持っています。 -message.installWizard.copy.whatIsAZone=ゾーンはCloudStack内で最大の組織単位™展開です。それはデータセンター内の複数のゾーンを持つことが許されているが、ゾーンは、通常、単一のデータセンターに対応しています。ゾーンにインフラを整理することの利点は、物理的な分離と冗長性を提供することです。たとえば、各ゾーンは独自の電源とネットワークのアップリンクを持つことができ、ゾーンが広く(これは必須ではありませんが)地理的に分離することができます。 -message.installWizard.copy.whatIsCloudStack=CloudStack™は、プール·コンピューティング·リソースがサービス(IaaSの)雲のように、パブリック、プライベート、ハイブリッドインフラストラクチャを構築することがソフトウェアプラットフォームです。 CloudStack™は、ネットワーク、ストレージ、クラウドインフラストラクチャを構成する計算ノードを管理します。展開、管理、およびクラウドコンピューティング環境を構成するためにCloudStack™を使用しています。

コモディティ·ハードウェア上で実行されている個々の仮想マシンのイメージを超えて拡張すると、CloudStack™は、サービスとしての仮想データセンターを実現するためのターンキー·クラウド·インフラストラクチャ·ソフトウェア·スタックを提供します - マルチティアとマルチテナント型のクラウドを構築、デプロイ、および管理するために不可欠なすべてのコンポーネントを提供アプリケーション。オープンソースとプレミアムバージョンの両方がほぼ同じ機能を提供するオープンソースのバージョンでは、用意されています。 -message.installWizard.tooltip.addSecondaryStorage.path=あなたは上記で指定したサーバー上にあるエクスポートされたパス、 -message.installWizard.tooltip.addSecondaryStorage.nfsServer=セカンダリ·ストレージをホストしているNFSサーバのIPアドレス -message.installWizard.tooltip.addPrimaryStorage.path=(NFS)のNFSでは、これはサーバーからエクスポートされたパスです。パス(SharedMountPoint用)。 KVMでこれは、このプライマリ·ストレージがマウントされている場所は、各ホスト上のパスです。たとえば、 /mnt/primary。 -message.installWizard.tooltip.addPrimaryStorage.server=(NFS、iSCSI、またはPreSetup)のIPアドレスまたはストレージデバイスのDNS名。 -message.installWizard.tooltip.addPrimaryStorage.name=ストレージデバイスの名前を入力します。 -message.installWizard.tooltip.addHost.password=これは上記の名前のユーザのパスワード(XenServerのインストールから)です。 -message.installWizard.tooltip.addHost.username=通常ルート。 -message.installWizard.tooltip.addHost.hostname=DNS名またはホストのIPアドレス。 -message.installWizard.tooltip.addCluster.name=クラスタの名前。これは任意のテキストにすることができ、CloudStack使用されていません。 -message.installWizard.tooltip.addPod.reservedSystemEndIp=これはCloudStackは、セカンダリストレージの仮想マシンとコンソールのプロキシ仮想マシンを管理するために使用するプライベートネットワーク内のIP範囲です。これらのIPアドレスは、コンピューティング·サーバーと同じサブネットから取得されます。 -message.installWizard.tooltip.addPod.reservedSystemStartIp=これはCloudStackは、セカンダリストレージの仮想マシンとコンソールのプロキシ仮想マシンを管理するために使用するプライベートネットワーク内のIP範囲です。これらのIPアドレスは、コンピューティング·サーバーと同じサブネットから取得されます。 -message.installWizard.tooltip.addPod.reservedSystemNetmask=お客様が使用されるサブネットで使用中のマスク。 -message.installWizard.tooltip.addPod.reservedSystemGateway=そのポッド内のホストに対するゲートウェイ。 -message.installWizard.tooltip.addPod.name=ポッドの名前 -message.installWizard.tooltip.configureGuestTraffic.guestEndIp=このゾーンのゲストへの割り当てのために利用できるようになりますIPアドレスの範囲。つのNICが使用されている場合、これらのIPはポッドCIDR CIDRと同じである必要があります。 -message.installWizard.tooltip.configureGuestTraffic.guestStartIp=このゾーンのゲストへの割り当てのために利用できるようになりますIPアドレスの範囲。つのNICが使用されている場合、これらのIPはポッドCIDR CIDRと同じである必要があります。 -message.installWizard.tooltip.configureGuestTraffic.guestNetmask=ゲストが使用する必要があるサブネットで使用中のマスク -message.installWizard.tooltip.configureGuestTraffic.guestGateway=ゲストが使用するゲートウェイ -message.installWizard.tooltip.configureGuestTraffic.description=ネットワークの説明 -message.installWizard.tooltip.configureGuestTraffic.name=あなたのネットワークの名前 -message.installWizard.tooltip.addZone.internaldns2=これらは、ゾーン内のシステムのVMで使用するためのDNSサーバです。これらのDNSサーバーは、システムのVMのプライベート·ネットワーク·インタフェースを介してアクセスされます。あなたはポッドを提供するプライベートIPアドレスは、ここという名前のDNSサーバへのルートを持っている必要があります。 -message.installWizard.tooltip.addZone.internaldns1=これらは、ゾーン内のシステムのVMで使用するためのDNSサーバです。これらのDNSサーバーは、システムのVMのプライベート·ネットワーク·インタフェースを介してアクセスされます。あなたはポッドを提供するプライベートIPアドレスは、ここという名前のDNSサーバへのルートを持っている必要があります。 -message.installWizard.tooltip.addZone.dns2=これらは、ゾーン内のゲストVMで使用するためのDNSサーバです。これらのDNSサーバーは、後で追加され、パブリックネットワークを介してアクセスされます。ゾーンのパブリックIPアドレスは、ここで名前のDNSサーバへのルートを持っている必要があります。 -message.installWizard.tooltip.addZone.name=ゾーンの名前 -message.installWizard.tooltip.addZone.dns1=これらは、ゾーン内のゲストVMで使用するためのDNSサーバです。これらのDNSサーバーは、後で追加され、パブリックネットワークを介してアクセスされます。ゾーンのパブリックIPアドレスは、ここで名前のDNSサーバへのルートを持っている必要があります。 -message.setup.successful=雲のセットアップに成功! -label.may.continue=あなたは今継続することができます。 -error.installWizard.message=何かが間違っていた、元に戻ってすべてのエラーを訂正することができる -message.installWizard.now.building=今すぐあなたのクラウドを構築... -message.installWizard.click.retry=起動を再試行する]ボタンをクリックします。 -label.launch=起動する -label.installWizard.click.launch=起動ボタンをクリックします。 -label.congratulations=おめでとう! -label.installWizard.addSecondaryStorageIntro.subtitle=二次記憶装置とは何ですか? -label.installWizard.addSecondaryStorageIntro.title=のがセカンダリ·ストレージを追加してみましょう -label.installWizard.addPrimaryStorageIntro.subtitle=プライマリストレージとは何ですか? -label.installWizard.addPrimaryStorageIntro.title=のは、プライマリ·ストレージを追加してみましょう -label.installWizard.addHostIntro.subtitle=ホストとは何ですか? -label.installWizard.addHostIntro.title=のホストを追加してみましょう -label.installWizard.addClusterIntro.subtitle=クラスタとは何ですか? -label.installWizard.addClusterIntro.title=のクラスタを追加してみましょう -label.installWizard.addPodIntro.subtitle=ポッドとは何ですか? -label.installWizard.addPodIntro.title=のは、ポッドを追加してみましょう -label.installWizard.addZone.title=ゾーンを追加する -label.installWizard.addZoneIntro.subtitle=ゾーンとは何ですか? -label.installWizard.addZoneIntro.title=ゾーンを追加する -error.password.not.match=パスワードフィールドが一致しません -label.confirm.password=パスワードを確認 +label.select=選択 +label.select.vm.for.static.nat=静的 NAT 用 VM の選択 +label.select.instance=インスタンスの選択 +label.nat.port.range=NAT ポートの範囲 +label.static.nat.vm.details=静的 NAT VM の詳細 +label.edit.lb.rule=負荷分散規則の編集 +message.migrate.instance.to.host=別のホストにインスタンスを移行してもよろしいですか? +label.migrate.instance.to.host=別のホストへのインスタンスの移行 +message.migrate.instance.to.ps=別のプライマリ ストレージにインスタンスを移行してもよろしいですか? +label.migrate.instance.to.ps=別のプライマリ ストレージへのインスタンスの移行 +label.corrections.saved=接続が保存されました +message.installWizard.copy.whatIsSecondaryStorage=セカンダリ ストレージはゾーンと関連付けられ、次の項目を格納します。
  • テンプレート - VM の起動に使用できる OS イメージで、アプリケーションのインストールなど追加の構成を含めることができます。
  • ISO イメージ - 起動可能または起動不可の OS イメージです。
  • ディスク ボリュームのスナップショット - VM データの保存コピーです。データの復元または新しいテンプレートの作成に使用できます。
+message.installWizard.copy.whatIsPrimaryStorage=CloudStack™ のクラウド インフラストラクチャでは、プライマリ ストレージとセカンダリ ストレージの 2 種類のストレージを使用します。どちらのストレージにも、iSCSI、NFS サーバー、またはローカル ディスクを使用できます。

プライマリ ストレージはクラスターに関連付けられ、そのクラスター内のホストで動作するすべての VM の各ゲスト VM のディスク ボリュームを格納します。通常、プライマリ ストレージ サーバーはホストの近くに設置します。 +message.installWizard.copy.whatIsAHost=ホストは単一のコンピューターです。ホストは、ゲスト仮想マシンを実行するコンピューティング リソースを提供します。ベア メタル ホストを除いて、各ホストにはゲスト仮想マシンを管理するためのハイパーバイザー ソフトウェアをインストールします。ベア メタル ホストについては、『インストールガイド上級編』で特殊例として説明します。たとえば、KVM が有効な Linux サーバー、Citrix XenServer が動作するサーバー、および ESXi サーバーがホストです。基本インストールでは、XenServer を実行する単一のホストを使用します。

ホストは CloudStack™ 環境内の最小の組織単位です。ホストはクラスターに含まれ、クラスターはポッドに含まれ、ポッドはゾーンに含まれます。 +message.installWizard.copy.whatIsACluster=クラスターはホストをグループ化する方法です。1 つのクラスター内のホストはすべて同一のハードウェアから構成され、同じハイパーバイザーを実行し、同じサブネット上にあり、同じ共有ストレージにアクセスします。同じクラスター内のホスト間では、ユーザーへのサービスを中断せずに、仮想マシン インスタンスをライブ マイグレーションすることができます。クラスターは CloudStack™ 環境内の 3 番目に大きな組織単位です。クラスターはポッドに含まれ、ポッドはゾーンに含まれます。

CloudStack™ では 1 つのクラウド環境に複数のクラスターを持たせることができますが、基本インストールでは、クラスターは 1 つです。 +message.installWizard.copy.whatIsAPod=通常、1 つのポッドは単一のラックを表します。同じポッド内のホストは同じサブネット内にあります。

ポッドは CloudStack™ 環境内の 2 番目に大きな組織単位です。ポッドはゾーンに含まれます。各ゾーンは 1 つ以上のポッドを含むことができます。基本インストールでは、ゾーン内のポッドは 1 つです。 +message.installWizard.copy.whatIsAZone=ゾーンは CloudStack™ 環境内の最大の組織単位です。1 つのデータセンター内に複数のゾーンを持たせることはできますが、通常、ゾーンは単一のデータセンターに相当します。インフラストラクチャをゾーンに組織化すると、ゾーンを物理的に分離して冗長にすることができます。たとえば、各ゾーンに電源とネットワーク アップリンクを配備します。必須ではありませんが、ゾーンは遠隔地に分散することができます。 +message.installWizard.copy.whatIsCloudStack=CloudStack™ はコンピューティング リソースをプールするソフトウェア プラットフォームで、パブリック、プライベート、およびハイブリッドの Infrastructure as a Service (IaaS) クラウドを構築することができます。CloudStack™ を使用して、クラウド インフラストラクチャを構成するネットワーク、ストレージ、およびコンピューティング ノードを管理し、クラウド コンピューティング環境を展開、管理、および構成します。

コモディティ化したハードウェア上で動作する個別の仮想マシン イメージを超えて拡張する、CloudStack™ の簡単な設定で動作するクラウド インフラストラクチャのソフトウェア スタックにより、サービスとして仮想データセンターを、つまり多層型のマルチテナント クラウド アプリケーションを構築し、展開し、管理するために不可欠なコンポーネントがすべて提供されます。オープン ソース バージョンとプレミアム バージョンの両方が提供されますが、オープン ソース バージョンでもほとんどの機能を使用できます。 +message.installWizard.tooltip.addSecondaryStorage.path=上に指定したサーバーに存在する、エクスポートされたパスです。 +message.installWizard.tooltip.addSecondaryStorage.nfsServer=セカンダリ ストレージをホストする NFS サーバーの IP アドレスです。 +message.installWizard.tooltip.addPrimaryStorage.path=(NFS の場合) サーバーからエクスポートされたパスです。(SharedMountPoint の場合) パスです。KVM ではこのプライマリ ストレージがマウントされる各ホスト上のパスです。たとえば、/mnt/primary です。 +message.installWizard.tooltip.addPrimaryStorage.server=(NFS、iSCSI、または PreSetup の場合) ストレージ デバイスの IP アドレスまたは DNS 名です。 +message.installWizard.tooltip.addPrimaryStorage.name=ストレージ デバイスの名前です。 +message.installWizard.tooltip.addHost.password=XenServer 側で指定した、上のユーザー名に対するパスワードです。 +message.installWizard.tooltip.addHost.username=通常は root です。 +message.installWizard.tooltip.addHost.hostname=ホストの DNS 名または IP アドレスです。 +message.installWizard.tooltip.addCluster.name=クラスターの名前です。CloudStack で使用されていない、任意のテキストを指定できます。 +message.installWizard.tooltip.addPod.reservedSystemEndIp=これは、セカンダリ ストレージ VM およびコンソール プロキシ VM を管理するために CloudStack で使用する、プライベート ネットワーク内の IP アドレスの範囲です。これらの IP アドレスはコンピューティング サーバーと同じサブネットから割り当てます。 +message.installWizard.tooltip.addPod.reservedSystemStartIp=これは、セカンダリ ストレージ VM およびコンソール プロキシ VM を管理するために CloudStack で使用する、プライベート ネットワーク内の IP アドレスの範囲です。これらの IP アドレスはコンピューティング サーバーと同じサブネットから割り当てます。 +message.installWizard.tooltip.addPod.reservedSystemNetmask=ゲストの使用するサブネット上で使用されるネットマスクです。 +message.installWizard.tooltip.addPod.reservedSystemGateway=このポッド内のホストのゲートウェイです。 +message.installWizard.tooltip.addPod.name=ポッドの名前です。 +message.installWizard.tooltip.configureGuestTraffic.guestEndIp=このゾーンのゲストに割り当てることができる IP アドレスの範囲です。使用する NIC が 1 つの場合は、これらの IP アドレスはポッドの CIDR と同じ CIDR に含まれている必要があります。 +message.installWizard.tooltip.configureGuestTraffic.guestStartIp=このゾーンのゲストに割り当てることができる IP アドレスの範囲です。使用する NIC が 1 つの場合は、これらの IP アドレスはポッドの CIDR と同じ CIDR に含まれている必要があります。 +message.installWizard.tooltip.configureGuestTraffic.guestNetmask=ゲストの使用するサブネット上で使用されるネットマスクです。 +message.installWizard.tooltip.configureGuestTraffic.guestGateway=ゲストの使用するゲートウェイです。 +message.installWizard.tooltip.configureGuestTraffic.description=ネットワークの説明です。 +message.installWizard.tooltip.configureGuestTraffic.name=ネットワークの名前です。 +message.installWizard.tooltip.addZone.internaldns2=ゾーン内のシステム VM で使用する DNS サーバーです。これらの DNS サーバーは、システム VM のプライベート ネットワーク インターフェイスを介してアクセスされます。ポッドのプライベート IP アドレスから、ここで指定する DNS サーバーに通信できる必要があります。 +message.installWizard.tooltip.addZone.internaldns1=ゾーン内のシステム VM で使用する DNS サーバーです。これらの DNS サーバーは、システム VM のプライベート ネットワーク インターフェイスを介してアクセスされます。ポッドのプライベート IP アドレスから、ここで指定する DNS サーバーに通信できる必要があります。 +message.installWizard.tooltip.addZone.dns2=ゾーン内の VM で使用する DNS サーバーです。これらの DNS サーバーには、後で追加するパブリック ネットワーク経由でアクセスします。ゾーンのパブリック IP アドレスから、ここで指定するパブリック DNS サーバーに通信できる必要があります。 +message.installWizard.tooltip.addZone.name=ゾーンの名前です。 +message.installWizard.tooltip.addZone.dns1=ゾーン内の VM で使用する DNS サーバーです。これらの DNS サーバーには、後で追加するパブリック ネットワーク経由でアクセスします。ゾーンのパブリック IP アドレスから、ここで指定するパブリック DNS サーバーに通信できる必要があります。 +message.setup.successful=クラウドがセットアップされました。 +label.may.continue=続行できます。 +error.installWizard.message=問題が発生しました。戻ってエラーを修正できます。 +message.installWizard.now.building=クラウドを構築しています... +message.installWizard.click.retry=起動を再試行するにはボタンをクリックしてください。 +label.launch=起動 +label.installWizard.click.launch=[起動] をクリックしてください。 +label.congratulations=おめでとうございます。 +label.installWizard.addSecondaryStorageIntro.subtitle=セカンダリ ストレージについて +label.installWizard.addSecondaryStorageIntro.title=セカンダリ ストレージを追加しましょう +label.installWizard.addPrimaryStorageIntro.subtitle=プライマリ ストレージについて +label.installWizard.addPrimaryStorageIntro.title=プライマリ ストレージを追加しましょう +label.installWizard.addHostIntro.subtitle=ホストについて +label.installWizard.addHostIntro.title=ホストを追加しましょう +label.installWizard.addClusterIntro.subtitle=クラスターについて +label.installWizard.addClusterIntro.title=クラスターを追加しましょう +label.installWizard.addPodIntro.subtitle=ポッドについて +label.installWizard.addPodIntro.title=ポッドを追加しましょう +label.installWizard.addZone.title=ゾーンの追加 +label.installWizard.addZoneIntro.subtitle=ゾーンについて +label.installWizard.addZoneIntro.title=ゾーンを追加しましょう +error.password.not.match=パスワードが一致しません +label.confirm.password=パスワードの確認入力 message.change.password=パスワードを変更してください。 label.save.and.continue=保存して続行 -label.skip.guide=このガイドをスキップする前に、私はCloudStack使用している -label.continue.basic.install=基本的なインストールを続行し -label.introduction.to.cloudstack=CloudStack™するために導入 -label.what.is.cloudstack=CloudStack™ は何ですか? +label.skip.guide=CloudStack を使用したことがあるので、このガイドをスキップする +label.continue.basic.install=基本インストールを続行する +label.introduction.to.cloudstack=CloudStack™ の紹介 +label.what.is.cloudstack=CloudStack™ について label.hints=ヒント -label.installWizard.subtitle=このツアーでは、あなたのCloudStack™ のインストールを設定する際に役立ちます -label.continue=続ける -label.installWizard.title=こんにちは、CloudStack™ へようこそ。 +label.installWizard.subtitle=このガイド ツアーは CloudStack™ 環境のセットアップに役立ちます +label.continue=続行 +label.installWizard.title=CloudStack™ へようこそ label.agree=同意する label.license.agreement=ライセンス契約 -label.license.agreement.subtitle=インストールする前に、CloudStack™ ライセンスに同意してください。 -label.manage.resources=リソースを管理する -label.port.forwarding.policies=ポートフォワーディングのポリシー -label.load.balancing.policies=バランサポリシーをロードする +label.license.agreement.subtitle=インストールの前に CloudStack™ エンド ユーザー ライセンス契約に同意してください。 +label.manage.resources=リソースの管理 +label.port.forwarding.policies=ポート転送ポリシー +label.load.balancing.policies=負荷分散ポリシー label.networking.and.security=ネットワークとセキュリティ label.bandwidth=帯域幅 label.virtual.machines=仮想マシン label.compute.and.storage=コンピューティングとストレージ -label.task.completed=タスクが完了する -label.update.project.resources=プロジェクトリソースを更新 -label.remove.project.account=プロジェクト·アカウントを削除します。 -label.item.listing=アイテムリスト +label.task.completed=タスクが完了しました +label.update.project.resources=プロジェクト リソースの更新 +label.remove.project.account=プロジェクト アカウントの削除 +label.item.listing=項目一覧 message.select.item=項目を選択してください。 -label.removing=削除する +label.removing=削除しています label.invite=招待 -label.add.by=して追加 -label.max.vms=最大ユーザーのVM -label.max.public.ips=最大のパブリックIP -label.max.volumes=最大ボリューム -label.max.snapshots=最大スナップショット -label.max.templates=最大のテンプレート -label.project.dashboard=プロジェクトダッシュボード -label.remind.later=私に後で通知する -label.invited.accounts=招待アカウント -label.invite.to=への招待 -label.add.accounts.to=にアカウントを追加します。 -label.add.accounts=アカウントを追加する +label.add.by=追加単位 +label.max.vms=最大ユーザー VM 数 +label.max.public.ips=最大パブリック IP アドレス数 +label.max.volumes=最大ボリューム数 +label.max.snapshots=最大スナップショット数 +label.max.templates=最大テンプレート数 +label.project.dashboard=プロジェクト ダッシュボード +label.remind.later=再表示する +label.invited.accounts=招待済みアカウント +label.invite.to=招待: +label.add.accounts.to=アカウントの追加: +label.add.accounts=アカウントの追加 label.project.name=プロジェクト名 -label.create.project=プロジェクトを作成します。 +label.create.project=プロジェクトの作成 label.networks=ネットワーク -label.launch.vm=VMを起動します。 -label.new.vm=新しいVM +label.launch.vm=VM の起動 +label.new.vm=新しい VM label.previous=前 -label.add.to.group=グループに追加する -message.vm.review.launch=次の情報を確認して、仮想インスタンスが起動する前に、正しいことを確認してください。 -message.select.security.groups=新しいVMのセキュリティグループを選択してください。 -label.new=新しい +label.add.to.group=グループへの追加 +message.vm.review.launch=次の情報を参照して、仮想インスタンスが正しいことを確認してから起動してください。 +message.select.security.groups=新しい仮想マシンのセキュリティ グループを選択してください。 +label.new=新規 message.please.select.networks=仮想マシンのネットワークを選択してください。 -message.please.proceed=次のステップに進んでください。 -message.zone.no.network.selection=あなたが選択したゾーンは、ネットワークの選択の任意の選択肢を持っていません。 -label.no.thanks=遠慮します -label.my.templates=私のテンプレート -message.select.template=新しい仮想インスタンス用のテンプレートを選択してください。 -message.select.iso=新しい仮想インスタンスは、ISOを選択してください。 -message.template.desc=VMを起動するために使用することができ、OSイメージ -message.iso.desc=データやOSのブータブルメディアを含むディスクイメージ -label.select.iso.or.template=を選択し、ISOまたはテンプレート -message.select.a.zone=ゾーンは、通常、単一のデータセンターに対応しています。複数のゾーンは、物理的な隔離と冗長性を提供することにより、クラウドの信頼性を高める。 -label.select.a.zone=ゾーンを選択します -label.review=レビュー -label.select.a.template=テンプレートを選択します。 +message.please.proceed=次の手順に進んでください。 +message.zone.no.network.selection=選択したゾーンでは、ネットワークを選択できません。 +label.no.thanks=いいえ結構です +label.my.templates=マイ テンプレート +message.select.template=新しい仮想インスタンスのテンプレートを選択してください。 +message.select.iso=新しい仮想インスタンスの ISO を選択してください。 +message.template.desc=VM の起動に使用できる OS イメージ +message.iso.desc=データまたは OS 起動可能メディアを含むディスク イメージ +label.select.iso.or.template=ISO またはテンプレートの選択 +message.select.a.zone=ゾーンは通常、単一のデータセンターに相当します。複数のゾーンを設定し、物理的に分離して冗長性を持たせることにより、クラウドの信頼性を高めます。 +label.select.a.zone=ゾーンの選択 +label.review=確認 +label.select.a.template=テンプレートの選択 label.setup=セットアップ -state.Allocated=割り当てられた +state.Allocated=割り当て済み changed.item.properties=変更された項目のプロパティ -label.apply=適用される +label.apply=適用 label.default=デフォルト label.viewing=表示 -label.move.to.top=トップに移動 -label.move.up.row=1行上に移動 -label.move.down.row=1行下に移動 +label.move.to.top=最上位に移動 +label.move.up.row=1 行上に移動 +label.move.down.row=1 行下に移動 label.drag.new.position=新しい位置にドラッグ -label.order=オーダー +label.order=順序 label.no.data=表示するデータがありません -label.change.value=値を変更する -label.clear.list=一覧をクリアする -label.full.path=フルパス -message.add.domain=このドメインの下に作成するサブドメインを指定してください -message.delete.user=このユーザーを削除したいことを確認してください。 -message.enable.user=このユーザーを有効にしたいことを確認してください。 -message.disable.user=このユーザーを無効にしたいことを確認してください。 -message.generate.keys=このユーザーの新しい鍵を生成したいことを確認してください。 -message.update.resource.count=このアカウントのリソースカウントを更新することを確認してください。 -message.edit.account=編集( "-1"リソース作成の量に制限がないことを示します) -label.total.of.vm=VMの合計 -label.total.of.ip=IPアドレスの合計 -state.enabled=使用可能 -message.action.download.iso=このISOイメージをダウンロードすることを確認してください。 -message.action.download.template=このテンプレートをダウンロードすることを確認してください。 -label.destination.zone=宛先ゾーン +label.change.value=値の変更 +label.clear.list=一覧の消去 +label.full.path=フル パス +message.add.domain=このドメインに作成するサブドメインを指定してください。 +message.delete.user=このユーザーを削除してもよろしいですか? +message.enable.user=このユーザーを有効にしてもよろしいですか? +message.disable.user=このユーザーを無効にしてもよろしいですか? +message.generate.keys=このユーザーに新しいキーを生成してもよろしいですか? +message.update.resource.count=このアカウントのリソース数を更新してもよろしいですか? +message.edit.account=編集 ("-1" は、リソース作成の量に制限がないことを示します) +label.total.of.vm=VM 合計 +label.total.of.ip=IP アドレス合計 +state.enabled=有効 +message.action.download.iso=この ISO イメージをダウンロードしてもよろしいですか? +message.action.download.template=このテンプレートをダウンロードしてもよろしいですか? +label.destination.zone=コピー先ゾーン label.keyboard.type=キーボードの種類 -label.nic.adapter.type=NICアダプタの種類 -label.root.disk.controller=ルート·ディスク·コントローラ +label.nic.adapter.type=NIC アダプターの種類 +label.root.disk.controller=ルート ディスク コントローラー label.community=コミュニティ -label.remove.egress.rule=出力ルールを削除する -label.add.egress.rule=出力ルールを追加 -label.egress.rule=出力ルール -label.remove.ingress.rule=入力規則を削除する -label.delete.vpn.user=VPNユーザを削除します。 -label.add.vpn.user=VPNユーザを追加します。 -label.remove.pf=ポートフォワーディングルールを削除する -label.remove.vm.from.lb=ロード·バランサのルールからVMを削除します。 -label.add.vms.to.lb=バランサのルールをロードするためにVM(s)を追加する -label.add.vm=VMを追加します。 -label.remove.static.nat.rule=スタティックNATルールを削除します。 -label.remove.rule=ルールを削除する -label.add.static.nat.rule=スタティックNATルールを追加します。 -label.add.rule=ルールを追加します。 -label.configuration=設定 -message.disable.vpn=あなたは、VPNを無効にしてもよろしいですか? -label.disable.vpn=VPNを無効にします。 -message.enable.vpn=あなたがこのIPアドレスに対して有効になってVPNアクセスが必要であることを確認してください。 -label.enable.vpn=VPNを有効にする -message.acquire.new.ip=あなたはこのネットワークのネットのIPアドレスを取得したいことを確認してください。 +label.remove.egress.rule=送信規則の削除 +label.add.egress.rule=送信規則の追加 +label.egress.rule=送信規則 +label.remove.ingress.rule=受信規則の削除 +label.delete.vpn.user=VPN ユーザーの削除 +label.add.vpn.user=VPN ユーザーの追加 +label.remove.pf=ポート転送規則の削除 +label.remove.vm.from.lb=負荷分散規則からの VM の削除 +label.add.vms.to.lb=負荷分散規則への VM の追加 +label.add.vm=VM の追加 +label.remove.static.nat.rule=静的 NAT 規則の削除 +label.remove.rule=規則の削除 +label.add.static.nat.rule=静的 NAT 規則の追加 +label.add.rule=規則の追加 +label.configuration=構成 +message.disable.vpn=VPN を無効にしてもよろしいですか? +label.disable.vpn=VPN の無効化 +message.enable.vpn=この IP アドレスに対する VPN アクセスを有効にしてもよろしいですか? +label.enable.vpn=VPN の有効化 +message.acquire.new.ip=このネットワークのネット IP アドレスを取得してもよろしいですか? label.elastic=エラスティック -label.my.network=私のネットワーク -label.add.vms=VMを追加する -label.configure=設定する -label.stickiness=粘り +label.my.network=マイ ネットワーク +label.add.vms=VM の追加 +label.configure=構成 +label.stickiness=持続性 label.source=ソース label.least.connections=最小接続 label.round.robin=ラウンドロビン -label.network.domain.text=ネットワーク·ドメインのテキスト -label.restart.required=必要な再起動 -label.clean.up=クリーンアップ -message.restart.network=あなたは、ネットワークを再起動することを確認してください -label.restart.network=ネットワークを再起動します -label.edit.network.details=ネットワークの詳細を編集 -label.add.guest.network=ゲストネットワークを追加します。 -label.guest.networks=ゲストネットワーク -message.ip.address.changed=あなたのIPアドレスが変更されている場合があります。あなたは、リストをリフレッシュしたいですか?このケースでは、詳細ペインを閉じることに注意してください。 -state.BackingUp=バックアップ -state.BackedUp=バックアップ -label.done=行われ -label.vm.name=VMの名前 -message.migrate.volume=別のプライマリ·ストレージにボリュームを移行することを確認してください。 -label.migrate.volume=別のプライマリ·ストレージへのボリュームの移行 -message.create.template=あなたがテンプレートを作成してもよろしいですか? -label.create.template=テンプレートを作成する -message.download.volume.confirm=あなたはこのボリュームをダウンロードすることを確認してください。 -message.detach.disk=あなたは、このディスクをデタッチしてもよろしいですか? -state.ready=レディ -state.Ready=レディ -label.vm.display.name=VMの表示名 -label.select-view=ビューを選択します。 -label.local.storage=ローカルストレージ -label.direct.ips=直接IPアドレス -label.view.all=すべてを見る +label.network.domain.text=ネットワーク ドメイン テキスト +label.restart.required=再起動が必要です +label.clean.up=クリーン アップ +message.restart.network=ネットワークを再起動してもよろしいですか? +label.restart.network=ネットワークの再起動 +label.edit.network.details=ネットワークの詳細の編集 +label.add.guest.network=ゲスト ネットワークの追加 +label.guest.networks=ゲスト ネットワーク +message.ip.address.changed=お使いの IP アドレスが変更されている可能性があります。一覧を更新しますか? その場合は、詳細ペインが閉じることに注意してください。 +state.BackingUp=バックアップ中 +state.BackedUp=バックアップ済み +label.done=完了 +label.vm.name=VM 名 +message.migrate.volume=別のプライマリ ストレージにボリュームを移行してもよろしいですか? +label.migrate.volume=別のプライマリ ストレージへのボリュームの移行 +message.create.template=テンプレートを作成してもよろしいですか? +label.create.template=テンプレートの作成 +message.download.volume.confirm=このボリュームをダウンロードしてもよろしいですか? +message.detach.disk=このディスクをデタッチしてもよろしいですか? +state.ready=準備完了 +state.Ready=準備完了 +label.vm.display.name=VM 表示名 +label.select-view=ビューの選択 +label.local.storage=ローカル ストレージ +label.direct.ips=直接 IP アドレス +label.view.all=すべて表示 label.zone.details=ゾーンの詳細 message.alert.state.detected=アラート状態が検出されました -state.Starting=出発 -state.Expunging=抹消 -state.Creating=作成 -message.decline.invitation=このプロジェクトに招待を辞退してもよろしいですか? -label.decline.invitation=衰退への招待 -message.confirm.join.project=あなたはこのプロジェクトに参加したい確認してください。 -message.join.project=これで、プロジェクトに参加しています。プロジェクトを参照するビューをプロジェクトに切り替えてください。 -label.accept.project.invitation=プロジェクトへの招待を受け入れる +state.Starting=開始中 +state.Expunging=抹消中 +state.Creating=作成中 +message.decline.invitation=このプロジェクトへの招待を辞退してもよろしいですか? +label.decline.invitation=招待の辞退 +message.confirm.join.project=このプロジェクトに参加してもよろしいですか? +message.join.project=これで、プロジェクトに参加しました。プロジェクトを参照するにはプロジェクト ビューに切り替えてください。 +label.accept.project.invitation=プロジェクトへの招待の承諾 label.token=トークン -label.project.id=プロジェクトID -message.enter.token=あなたがあなたの招待状を電​​子メールで与えられているトークンを入力してください。 -label.enter.token=トークンを入力します。 -state.Accepted=受け入れ -state.Pending=ペンディング -state.Completed=完了する -state.Declined=減少しました +label.project.id=プロジェクト ID +message.enter.token=電子メールの招待状に記載されているトークンを入力してください。 +label.enter.token=トークンの入力 +state.Accepted=承諾済み +state.Pending=保留 +state.Completed=完了 +state.Declined=辞退 label.project=プロジェクト label.invitations=招待状 -label.delete.project=プロジェクトを削除します。 -message.delete.project=このプロジェクトを削除してもよろしいですか? -message.activate.project=あなたはこのプロジェクトをアクティブにしてもよろしいですか? -label.activate.project=プロジェクトをアクティブにする -label.suspend.project=プロジェクトを一時停止 -message.suspend.project=あなたはこのプロジェクトを中断してもよろしいですか? -state.Suspended=サスペンド -label.edit.project.details=プロジェクトの詳細を編集します。 +label.delete.project=プロジェクトの削除 +message.delete.project=このプロジェクトを削除してもよろしいですか? +message.activate.project=このプロジェクトをアクティブにしてもよろしいですか? +label.activate.project=プロジェクトのアクティブ化 +label.suspend.project=プロジェクトの一時停止 +message.suspend.project=このプロジェクトを一時停止してもよろしいですか? +state.Suspended=一時停止 +label.edit.project.details=プロジェクトの詳細の編集 label.new.project=新規プロジェクト state.Active=アクティブ -state.Disabled=無効にする +state.Disabled=無効 label.projects=プロジェクト -label.make.project.owner=アカウントのプロジェクトの所有者を作る -label.remove.project.account=プロジェクトからアカウントを削除する -message.project.invite.sent=ユーザーに送信される招待し、彼らが招待を受け入れた後、彼らがプロジェクトに追加されます -label.add.account.to.project=プロジェクトにアカウントを追加する -label.revoke.project.invite=招待を取り消す +label.make.project.owner=アカウントのプロジェクト所有者設定 +label.remove.project.account=アカウントのプロジェクトからの削除 +message.project.invite.sent=ユーザーに招待状が送信されました。ユーザーが招待を承諾すると、プロジェクトに追加されます。 +label.add.account.to.project=アカウントのプロジェクトへの追加 +label.revoke.project.invite=招待の取り消し label.project.invite=プロジェクトへの招待 -label.select.project=プロジェクトを選択します。 -message.no.projects=任意のプロジェクトを持っていません。
プロジェクトセクションから新しいものを作成してください。 -message.no.projects.adminOnly=任意のプロジェクトを持っていません。
新しいプロジェクトを作成するには、管理者にお問い合わせください。 -message.pending.projects.1=あなたは、プロジェクトへの招待を保留されている。 -message.pending.projects.2=表示するには、プロジェクトの項を参照してくださいし、ドロップダウンからの招待を選択します。 -message.instanceWizard.noTemplates=使用可能な任意のテンプレートを持っていません。インスタンスウィザードを互換性のあるテンプレートを追加してください、再起動します。 +label.select.project=プロジェクトの選択 +message.no.projects=プロジェクトがありません。
プロジェクト セクションから新しいプロジェクトを作成してください。 +message.no.projects.adminOnly=プロジェクトがありません。
管理者に新しいプロジェクトの作成を依頼してください。 +message.pending.projects.1=保留中のプロジェクト招待状があります。 +message.pending.projects.2=表示するにはプロジェクト セクションに移動して、一覧から招待状を選択します。 +message.instanceWizard.noTemplates=使用可能なテンプレートがありません。互換性のあるテンプレートを追加して、インスタンスウィザードを再起動してください。 label.view=ビュー -create.template.complete=テンプレートが正常に作成された -create.template.confirm=テンプレートを作成することを確認してください。 -create.template.notification=新しいテンプレートを作成する -create.template.success=新しいテンプレートが作成されています -instances.actions.reboot.label=再起動のインスタンス -label.filterBy=によるフィルタ -label.ok=[OK] -notification.reboot.instance=再起動のインスタンス -notification.start.instance=インスタンスを起動します。 -notification.stop.instance=インスタンスを停止します。 +create.template.complete=テンプレートが正常に作成されました。 +create.template.confirm=テンプレートを作成してもよろしいですか? +create.template.notification=新しいテンプレートを作成しています +create.template.success=新しいテンプレートの作成中です +instances.actions.reboot.label=インスタンスの再起動 +label.filterBy=フィルター項目 +label.ok=OK +notification.reboot.instance=インスタンスの再起動 +notification.start.instance=インスタンスの起動 +notification.stop.instance=インスタンスの停止 label.display.name=表示名 label.zone.name=ゾーン名 ui.listView.filters.all=すべて -ui.listView.filters.mine=鉱山 -state.Running=ランニング +ui.listView.filters.mine=自分のもの +state.Running=実行中 state.Stopped=停止 -state.Destroyed=破壊された +state.Destroyed=破棄済み state.Error=エラー -message.reset.password.warning.notPasswordEnabled=このインスタンスが作成されたテンプレートには、パスワードは有効ではありません -message.reset.password.warning.notStopped=インスタンスは、その現在のパスワードを変更しようとする前に停止する必要があります。 +message.reset.password.warning.notPasswordEnabled=このインスタンスの作成に使用されたテンプレートは、パスワード管理が有効ではありません。 +message.reset.password.warning.notStopped=現在のパスワードを変更する前にインスタンスを停止する必要があります。 label.notifications=通知 -label.default.view=デフォルトのビュー -label.project.view=プロジェクトビュー +label.default.view=デフォルト ビュー +label.project.view=プロジェクト ビュー -message.add.system.service.offering=新しいシステム·サービスの提供を追加するには、次のデータを記入してください。 -message.action.delete.system.service.offering=このシステムサービスの提供を削除することを確認してください。 -label.action.delete.system.service.offering=削除システムサービスの提供 -label.hypervisor.capabilities=機能をハイパーバイザ -label.hypervisor.version=のバージョンをハイパーバイザ -label.max.guest.limit=最大ゲストの制限 -label.add.network.offering=ネットワークの提供を追加します。 -label.supported.services=サポートされているサービス -label.service.capabilities=サービス機能 +message.add.system.service.offering=新しいシステム サービス オファリングを追加するために、次のデータを入力してください。 +message.action.delete.system.service.offering=このシステム サービス オファリングを削除してもよろしいですか? +label.action.delete.system.service.offering=システム サービス オファリングの削除 +label.hypervisor.capabilities=ハイパーバイザーの機能 +label.hypervisor.version=ハイパーバイザーのバージョン +label.max.guest.limit=最大ゲスト制限 +label.add.network.offering=ネットワーク オファリングの追加 +label.supported.services=サポートされるサービス +label.service.capabilities=サービスの機能 label.guest.type=ゲストの種類 -label.specify.IP.ranges=指定したIPの範囲 -label.conserve.mode=モードを節約 -label.created.by.system=システムによって作成され -label.menu.system.service.offerings=システムサービスの提供 -label.add.system.service.offering=システムサービスの提供を追加します。 -label.redundant.router.capability=Redundant router capability -label.supported.source.NAT.type=Supported Source NAT type -label.elastic.LB=Elastic LB -label.LB.isolation=LB isolation -label.elastic.IP=Elastic IP -label.network.label.display.for.blank.value=デフォルトゲートウェイを使用する -label.xen.traffic.label=XenServerのトラフィックのラベル -label.kvm.traffic.label=KVMトラフィックのラベル -label.vmware.traffic.label=VMwareのトラフィックのラベル -label.start.IP=IPアドレスの範囲を起動します。 -label.end.IP=終了IPアドレスの範囲 -label.remove.ip.range=IPアドレス範囲を削除します。 -label.ip.ranges=IP範囲 -label.start.vlan=スタートVLAN -label.end.vlan=エンドVLAN -label.broadcast.domain.range=ドメインの範囲をブロードキャスト -label.compute=計算 -message.add.guest.network=あなたがゲストネットワークを追加したいことを確認してください -label.subdomain.access=サブドメインアクセス -label.guest.start.ip=ゲストの開始IP -label.guest.end.ip=ゲストの終了IP -label.virtual.router=Virtual Router -label.physical.network.ID=物理的なネットワークID -label.destination.physical.network.id=先の物理的なネットワークID +label.specify.IP.ranges=IP アドレスの範囲の指定 +label.conserve.mode=節約モード +label.created.by.system=システム作成 +label.menu.system.service.offerings=システム サービス オファリング +label.add.system.service.offering=システム サービス オファリングの追加 +label.redundant.router.capability=冗長ルーター機能 +label.supported.source.NAT.type=サポートされる送信元 NAT の種類 +label.elastic.LB=エラスティック負荷分散 +label.LB.isolation=負荷分散分離 +label.elastic.IP=エラスティック IP アドレス +label.network.label.display.for.blank.value=デフォルト ゲートウェイの使用 +label.xen.traffic.label=XenServer トラフィックのラベル +label.kvm.traffic.label=KVM トラフィックのラベル +label.vmware.traffic.label=VMware トラフィックのラベル +label.start.IP=開始 IP アドレス +label.end.IP=終了 IP アドレス +label.remove.ip.range=IP アドレスの範囲の削除 +label.ip.ranges=IP アドレスの範囲 +label.start.vlan=開始 VLAN +label.end.vlan=終了 VLAN +label.broadcast.domain.range=ブロードキャスト ドメインの範囲 +label.compute=コンピューティング +message.add.guest.network=ゲスト ネットワークを追加してもよろしいですか? +label.subdomain.access=サブドメイン アクセス +label.guest.start.ip=ゲストの開始 IP アドレス +label.guest.end.ip=ゲストの終了 IP アドレス +label.virtual.router=仮想ルーター +label.physical.network.ID=物理ネットワーク ID +label.destination.physical.network.id=ブリッジ先物理ネットワーク ID label.dhcp=DHCP -label.destroy.router=ルータを破壊する -message.confirm.destroy.router=このルータを破壊することを確認してください -label.change.service.offering=サービス·オファリングを変更する -label.view.console=コンソールを表示する +label.destroy.router=ルーターの破棄 +message.confirm.destroy.router=このルーターを破棄してもよろしいですか? +label.change.service.offering=サービス オファリングの変更 +label.view.console=コンソールの表示 label.redundant.state=冗長状態 -label.enable.provider=プロバイダを有効にする -message.confirm.enable.provider=このプロバイダを有効にしたいことを確認してください -label.disable.provider=プロバイダを無効にする -message.confirm.disable.provider=このプロバイダを無効にしたいことを確認してください -label.shutdown.provider=シャットダウン·プロバイダー -message.confirm.shutdown.provider=このプロバイダをシャットダウンすることを確認してください +label.enable.provider=プロバイダーの有効化 +message.confirm.enable.provider=このプロバイダーを有効にしてもよろしいですか? +label.disable.provider=プロバイダーの無効化 +message.confirm.disable.provider=このプロバイダーを無効にしてもよろしいですか? +label.shutdown.provider=プロバイダーのシャットダウン +message.confirm.shutdown.provider=このプロバイダーをシャットダウンしてもよろしいですか? label.netScaler=NetScaler -label.add.new.NetScaler=新しいNetScalerを追加する -number.of.retries=再試行の回数 +label.add.new.NetScaler=新しい NetScaler の追加 label.capacity=容量 -label.dedicated=専用の +label.dedicated=専用 label.f5=F5 -label.add.new.F5=新しいF5キーを追加する +label.add.new.F5=新しい F5 の追加 label.srx=SRX label.providers=プロバイダー -label.add.new.SRX=新しいSRXを追加します。 +label.add.new.SRX=新しい SRX の追加 label.timeout=タイムアウト -label.public.network=パブリックネットワーク -label.private.network=プライベートネットワーク -label.enable.swift=スウィフトを有効にする -confirm.enable.swift=スウィフトのサポートを有効にするには、次の情報を入力してください。 -message.after.enable.swift=スウィフトは、設定されています。注:このページを出るときは、もう一度再構成するスウィフトにはできません。 +label.public.network=パブリック ネットワーク +label.private.network=プライベート ネットワーク +label.enable.swift=Swift の有効化 +confirm.enable.swift=Swift のサポートを有効にするには、次の情報を入力してください。 +message.after.enable.swift=Swift が構成されました。注: このページを閉じると、Swift を再構成することはできません。 label.key=キー -label.delete.NetScaler=削除NetScalerは -message.confirm.delete.NetScaler=あなたがNetScalerを削除したいことを確認してください -label.delete.F5=削除F5 -message.confirm.delete.F5=F5キーを削除したいことを確認してください -label.delete.SRX=削除SRX -message.confirm.delete.SRX=あなたはSRXを削除したいことを確認してください +label.delete.NetScaler=NetScaler の削除 +message.confirm.delete.NetScaler=NetScaler を削除してもよろしいですか? +label.delete.F5=F5 の削除 +message.confirm.delete.F5=F5 を削除してもよろしいですか? +label.delete.SRX=SRX の削除 +message.confirm.delete.SRX=SRX を削除してもよろしいですか? label.pods=ポッド label.pod.name=ポッド名 -label.reserved.system.gateway=予約システムのゲートウェイ -label.reserved.system.netmask=予約システムのネットマスク -label.start.reserved.system.IP=予約システムのIPを起動します。 -label.end.reserved.system.IP=最後の予約システムのIP -label.clusters=クラスタ -label.cluster.name=クラスタ名 -label.host.MAC=ホストのMAC -label.agent.username=エージェントのユーザー名 -label.agent.password=エージェントのパスワード -message.confirm.action.force.reconnect=このホストを再接続を強制することを確認してください。 +label.reserved.system.gateway=予約済みシステム ゲートウェイ +label.reserved.system.netmask=予約済みシステム ネットマスク +label.start.reserved.system.IP=予約済み開始システム IP アドレス +label.end.reserved.system.IP=予約済み終了システム IP アドレス +label.clusters=クラスター +label.cluster.name=クラスター名 +label.host.MAC=ホストの MAC +label.agent.username=エージェント ユーザー名 +label.agent.password=エージェント パスワード +message.confirm.action.force.reconnect=このホストを強制再接続してもよろしいですか? label.resource.state=リソースの状態 -label.LUN.number=LUN # -message.confirm.remove.IP.range=あなたがこのIPアドレス範囲の削除を希望することを確認してください。 -message.tooltip.zone.name=ゾーンの名前を入力します。 -message.tooltip.dns.1=ゾーン内のVMで使用するためにDNSサーバーの名前を指定します。ゾーンのパブリックIPアドレスは、このサーバへのルートを持っている必要があります。 -message.tooltip.dns.2=ゾーン内のVMで使用するための二次DNSサーバー名を指定します。ゾーンのパブリックIPアドレスは、このサーバへのルートを持っている必要があります -message.tooltip.internal.dns.1=ゾーン内のCloudStack内部システムのVMによって使用されるDNSサーバーの名前を指定します。ポッド用のプライベートIPアドレスはこのサーバへのルートを持っている必要があります。 -message.tooltip.internal.dns.2=ゾーン内のCloudStack内部システムのVMによって使用されるDNSサーバーの名前を指定します。ポッド用のプライベートIPアドレスはこのサーバへのルートを持っている必要があります。 -message.tooltip.network.domain=ゲストVMによってアクセスされるネットワーク用のカスタムドメイン名を作成するDNSサフィックスです。 -message.tooltip.pod.name=このポッドの名前を入力します。 -message.tooltip.reserved.system.gateway=ポッド内のホストに対するゲートウェイ。 -message.tooltip.reserved.system.netmask=ポッドサブネットを定義するネットワーク接頭辞。 CIDR表記を使用しています。 -message.creating.zone=ゾーンを作成する -message.creating.physical.networks=物理的なネットワークを作成する -message.configuring.physical.networks=物理的なネットワークを構成する -message.adding.Netscaler.device=NetScalerのデバイスを追加する -message.creating.pod=ポッドを作成する -message.configuring.public.traffic=公共交通を構成する -message.configuring.storage.traffic=ストレージ·トラフィックの設定 -message.configuring.guest.traffic=ゲストのトラフィックを設定する -message.creating.cluster=クラスタの作成 -message.adding.host=ホストを追加する -message.creating.primary.storage=プライマリ·ストレージを作成する -message.creating.secondary.storage=セカンダリ·ストレージを作成する -message.Zone.creation.complete=完全なゾーンの作成 -message.enabling.zone=Enabling zone -error.something.went.wrong.please.correct.the.following=Something went wrong; please correct the following -error.could.not.enable.zone=Could not enable zone -message.zone.creation.complete.would.you.like.to.enable.this.zone=Zone creation complete. Would you like to enable this zone? -message.please.add.at.lease.one.traffic.range=Please add at lease one traffic range. -message.you.must.have.at.least.one.physical.network=You must have at least one physical network -message.please.select.a.different.public.and.management.network.before.removing=Please select a different public and management network before removing +label.LUN.number=LUN 番号 +message.confirm.remove.IP.range=この IP アドレスの範囲を削除してもよろしいですか? +message.tooltip.zone.name=ゾーンの名前です。 +message.tooltip.dns.1=ゾーン内の VM で使用する DNS サーバーの名前です。ゾーンのパブリック IP アドレスから、このサーバーに通信できる必要があります。 +message.tooltip.dns.2=ゾーン内の VM で使用する 2 番目の DNS サーバーの名前です。ゾーンのパブリック IP アドレスから、このサーバーに通信できる必要があります。 +message.tooltip.internal.dns.1=ゾーン内の CloudStack 内部システム VM で使用する DNS サーバーの名前です。ポッドのプライベート IP アドレスから、このサーバーに通信できる必要があります。 +message.tooltip.internal.dns.2=ゾーン内の CloudStack 内部システム VM で使用する DNS サーバーの名前です。ポッドのプライベート IP アドレスから、このサーバーに通信できる必要があります。 +message.tooltip.network.domain=DNS サフィックスです。このサフィックスからゲスト VM でアクセスするネットワークのカスタム ドメイン名が作成されます。 +message.tooltip.pod.name=このポッドの名前です。 +message.tooltip.reserved.system.gateway=ポッド内のホストのゲートウェイです。 +message.tooltip.reserved.system.netmask=ポッドのサブネットを定義するネットワーク プレフィックスです。CIDR 表記を使用します。 +message.creating.zone=ゾーンを作成しています +message.creating.physical.networks=物理ネットワークを作成しています +message.configuring.physical.networks=物理ネットワークを構成しています +message.adding.Netscaler.device=Netscaler デバイスを追加しています +message.creating.pod=ポッドを作成しています +message.configuring.public.traffic=パブリック トラフィックを構成しています +message.configuring.storage.traffic=ストレージ トラフィックを構成しています +message.configuring.guest.traffic=ゲスト トラフィックを構成しています +message.creating.cluster=クラスターを作成しています +message.adding.host=ホストを追加しています +message.creating.primary.storage=プライマリ ストレージを作成しています +message.creating.secondary.storage=セカンダリ ストレージを作成しています +message.Zone.creation.complete=ゾーンが作成されました +message.enabling.zone=ゾーンを有効にしています +error.something.went.wrong.please.correct.the.following=問題が発生しました。次の内容を修正してください +error.could.not.enable.zone=ゾーンを有効にできませんでした +message.zone.creation.complete.would.you.like.to.enable.this.zone=ゾーンが作成されました。このゾーンを有効にしてもよろしいですか? +message.please.add.at.lease.one.traffic.range=少なくとも 1 つトラフィックの範囲を追加してください。 +message.you.must.have.at.least.one.physical.network=少なくとも 1 つ物理ネットワークが必要です +message.please.select.a.different.public.and.management.network.before.removing=削除の前に異なるパブリックおよび管理ネットワークを選択してください。 -label.zone.type=Zone Type -label.setup.zone=Setup Zone -label.setup.network=Setup Network -label.add.resources=Add Resources -label.launch=Launch -label.set.up.zone.type=Set up zone type -message.please.select.a.configuration.for.your.zone=Please select a configuration for your zone. -message.desc.basic.zone=Provide a single network where each VM instance is assigned an IP directly from the network. Guest isolation can be provided through layer-3 means such as security groups (IP address source filtering) -label.basic=Basic -message.desc.advanced.zone=For more sophisticated network topologies. This network model provides the most flexibility in defining guest networks and providing custom network offerings such as firewall, VPN, or load balancer support. -label.advanced=Advanced -message.desc.zone=A zone is the largest organizational unit in CloudStack, and it typically corresponds to a single datacenter. Zones provide physical isolation and redundancy. A zone consists of one or more pods (each of which contains hosts and primary storage servers) and a secondary storage server which is shared by all pods in the zone. -label.physical.network=Physical Network -label.public.traffic=Public traffic -label.guest.traffic=Guest Traffic -label.storage.traffic=Storage Traffic -message.setup.physical.network.during.zone.creation=When adding an advanced zone, you need to set up one or more physical networks. Each network corresponds to a NIC on the management server. Each physical network can carry one or more types of traffic, with certain restrictions on how they may be combined.

Drag and drop one or more traffic types onto each physical network. -label.add.physical.network=Add physical network -label.traffic.types=Traffic Types -label.management=Management -label.guest=Guest -label.please.specify.netscaler.info=Please specify Netscaler info -message.public.traffic.in.advanced.zone=Public traffic is generated when VMs in the cloud access the internet. Publicly-accessible IPs must be allocated for this purpose. End users can use the CloudStack UI to acquire these IPs to implement NAT between their guest network and their public network.

Provide at lease one range of IP addresses for internet traffic. -message.public.traffic.in.basic.zone=Public traffic is generated when VMs in the cloud access the Internet or provide services to clients over the Internet. Publicly accessible IPs must be allocated for this purpose. When a instance is created, an IP from this set of Public IPs will be allocated to the instance in addition to the guest IP address. Static 1-1 NAT will be set up automatically between the public IP and the guest IP. End users can also use the CloudStack UI to acquire additional IPs to implement static NAT between their instances and the public IP. -message.add.pod.during.zone.creation=Each zone must contain in one or more pods, and we will add the first pod now. A pod contains hosts and primary storage servers, which you will add in a later step. First, configure a range of reserved IP addresses for CloudStack's internal management traffic. The reserved IP range must be unique for each zone in the cloud. -message.guest.traffic.in.advanced.zone=Guest network traffic is communication between end-user virtual machines. Specify a range of VLAN IDs to carry guest traffic for each physical network. -message.guest.traffic.in.basic.zone=Guest network traffic is communication between end-user virtual machines. Specify a range of IP addresses that CloudStack can assign to guest VMs. Make sure this range does not overlap the reserved system IP range. -message.storage.traffic=Traffic between CloudStack's internal resources, including any components that communicate with the Management Server, such as hosts and CloudStack system VMs. Please configure storage traffic here. -message.desc.cluster=Each pod must contain one or more clusters, and we will add the first cluster now. A cluster provides a way to group hosts. The hosts in a cluster all have identical hardware, run the same hypervisor, are on the same subnet, and access the same shared storage. Each cluster consists of one or more hosts and one or more primary storage servers. -message.desc.host=Each cluster must contain at lease one host (computer) for guest VMs to run on, and we will add the first host now. For a host to function in CloudStack, you must install hypervisor software on the host, assign an IP address to the host, and ensure the host is connected to the CloudStack management server.

Give the host's DNS or IP address, the user name (usually root) and password, and any labels you use to categorize hosts. -message.desc.primary.storage=Each cluster must contain one or more primary storage servers, and we will add the first one now. Primary storage contains the disk volumes for all the VMs running on hosts in the cluster. Use any standards-compliant protocol that is supported by the underlying hypervisor. -message.desc.secondary.storage=Each zone must have at lease one NFS or secondary storage server, and we will add the first one now. Secondary storage stores VM templates, ISO images, and VM disk volume snapshots. This server must be available to all hosts in the zone.

Provide the IP address and exported path. -label.launch.zone=Launch zone -message.please.wait.while.zone.is.being.created=Please wait while your zone is being created; this may take a while... +label.zone.type=ゾーンの種類 +label.setup.zone=ゾーンのセットアップ +label.setup.network=ネットワークのセットアップ +label.add.resources=リソースの追加 +label.launch=起動 +label.set.up.zone.type=ゾーンの種類のセットアップ +message.please.select.a.configuration.for.your.zone=ゾーンの構成を選択してください。 +message.desc.basic.zone=各 VM インスタンスに IP アドレスがネットワークから直接割り当てられる、単一のネットワークを提供します。セキュリティ グループ (発信元 IP アドレスのフィルター) のようなレイヤー 3 レベルの方法でゲストを分離できます。 +label.basic=基本 +message.desc.advanced.zone=より洗練されたネットワーク技術をサポートします。このネットワーク モデルを選択すると、より柔軟にゲストのネットワークを定義し、ファイアウォール、VPN、負荷分散装置のサポートのようなカスタマイズしたネットワーク オファリングを提供できます。 +label.advanced=詳細 +message.desc.zone=ゾーンは CloudStack 環境内の最大の組織単位で、通常、単一のデータセンターに相当します。ゾーンによって物理的な分離と冗長性が提供されます。ゾーンは 1 つ以上のポッド (各ポッドはホストとプライマリ ストレージ サーバーから構成されます) と、ゾーン内のすべてのポッドで共有されるセカンダリ ストレージ サーバーから構成されます。 +label.physical.network=物理ネットワーク +label.public.traffic=パブリック トラフィック +label.guest.traffic=ゲスト トラフィック +label.storage.traffic=ストレージ トラフィック +message.setup.physical.network.during.zone.creation=拡張ゾーンを追加するときは、1 つ以上の物理ネットワークをセットアップする必要があります。各ネットワークは管理サーバー上の 1 つの NIC に対応します。各物理ネットワークでは、組み合わせに制限がありますが、1 つ以上の種類のトラフィックを通信できます。

各物理ネットワークに対してトラフィックの種類をドラッグアンドドロップしてください。 +label.add.physical.network=物理ネットワークの追加 +label.traffic.types=トラフィックの種類 +label.management=管理 +label.guest=ゲスト +label.please.specify.netscaler.info=Netscaler 情報を指定してください +message.public.traffic.in.advanced.zone=クラウド内の VM がインターネットにアクセスすると、パブリック トラフィックが生成されます。このために、一般にアクセス可能な IP アドレスを割り当てる必要があります。エンド ユーザーは CloudStack のユーザー インターフェイスを使用してこれらの IP アドレスを取得し、ゲスト ネットワークとパブリック ネットワークの間に NAT を実装することができます。

インターネット トラフィックのために、少なくとも 1 つ IP アドレスの範囲を入力してください。 +message.public.traffic.in.basic.zone=クラウド内の VM がインターネットにアクセスするかインターネット経由でクライアントにサービスを提供すると、パブリック トラフィックが生成されます。このために、一般にアクセス可能な IP アドレスを割り当てる必要があります。インスタンスを作成すると、ゲスト IP アドレスのほかにこのパブリック IP アドレスの範囲からアドレスが 1 つインスタンスに割り当てられます。パブリック IP アドレスとゲスト IP アドレスの間に、静的な 1 対 1 の NAT が自動的にセットアップされます。エンド ユーザーは CloudStack のユーザー インターフェイスを使用して追加の IP アドレスを取得し、インスタンスとパブリック IP アドレスの間に静的 NAT を実装することもできます。 +message.add.pod.during.zone.creation=各ゾーンには 1 つ以上のポッドが必要です。今ここで最初のポッドを追加します。ポッドはホストとプライマリ ストレージ サーバーから構成されますが、これらは後の手順で追加します。最初に、CloudStack の内部管理トラフィックのために IP アドレスの範囲を予約します。IP アドレスの範囲は、クラウド内の各ゾーンで重複しないように予約する必要があります。 +message.guest.traffic.in.advanced.zone=ゲスト ネットワーク トラフィックは、エンド ユーザーの仮想マシン間の通信です。各物理ネットワークのゲスト トラフィックを通信するための VLAN ID の範囲を指定してください。 +message.guest.traffic.in.basic.zone=ゲスト ネットワーク トラフィックは、エンド ユーザーの仮想マシン間の通信です。CloudStack でゲスト VM に割り当てられる IP アドレスの範囲を指定してください。この範囲が予約済みのシステム IP アドレスの範囲と重複しないように注意してください。 +message.storage.traffic=ホストや CloudStack システム VM など、管理サーバーと通信する CloudStack の内部リソース間のトラフィックです。ここでストレージ トラフィックを構成してください。 +message.desc.cluster=各ポッドには 1 つ以上のクラスターが必要です。今ここで最初のクラスターを追加します。クラスターはホストをグループ化する方法です。1 つのクラスター内のホストはすべて同一のハードウェアから構成され、同じハイパーバイザーを実行し、同じサブネット上にあり、同じ共有ストレージにアクセスします。各クラスターは 1 つ以上のホストと 1 つ以上のプライマリ ストレージ サーバーから構成されます。 +message.desc.host=各クラスターには少なくとも 1 つ、ゲスト VM を実行するためのホスト (コンピューター) が必要です。今ここで最初のホストを追加します。CloudStack でホストを機能させるには、ホストにハイパーバイザーをインストールして IP アドレスを割り当て、ホストが CloudStack 管理サーバーに接続していることを確認します。

ホストの DNS 名または IP アドレス、ユーザー名 (通常は root) とパスワード、およびホストの分類に使用するラベルを入力してください。 +message.desc.primary.storage=各クラスターには少なくとも 1 つ、プライマリ ストレージ サーバーが必要です。今ここで最初のサーバーを追加します。プライマリ ストレージは、クラスター内のホスト上で動作するすべての VM のディスク ボリュームを格納します。基礎となるハイパーバイザーでサポートされる、標準に準拠したプロトコルを使用してください。 +message.desc.secondary.storage=各ゾーンには少なくとも 1 つ、NFS つまりセカンダリ ストレージ サーバーが必要です。今ここで最初のサーバーを追加します。セカンダリ ストレージは VM テンプレート、ISO イメージ、およびVM ディスク ボリュームのスナップショットを格納します。このサーバーはゾーン内のすべてのホストで使用できる必要があります。

IP アドレスとエクスポートされたパスを入力してください。 +label.launch.zone=ゾーンの起動 +message.please.wait.while.zone.is.being.created=ゾーンが作成されるまでしばらくお待ちください... -label.load.balancing=ロード·バランシング; -label.static.nat.enabled=Static NAT Enabled -label.zones=Zones -label.view.more=View more -label.number.of.zones=Number of Zones -label.number.of.pods=Number of Pods -label.number.of.clusters=Number of Clusters -label.number.of.hosts=Number of Hosts -label.total.hosts=Total Hosts -label.total.CPU=Total CPU -label.total.memory=Total Memory -label.total.storage=Total Storage - -#new labels (end) ********************************************************************************************** +label.load.balancing=負荷分散 +label.static.nat.enabled=静的 NAT 有効 +label.zones=ゾーン +label.view.more=さらに表示 +label.number.of.zones=ゾーン数 +label.number.of.pods=ポッド数 +label.number.of.clusters=クラスター数 +label.number.of.hosts=ホスト数 +label.total.hosts=ホスト合計 +label.total.CPU=CPU 合計 +label.total.memory=メモリ合計 +label.total.storage=ストレージ合計 +label.purpose=目的 -label.action.migrate.router=ルータを移行する -label.action.migrate.router.processing=ルータの移行.... -message.migrate.router.confirm=あなたがするようにルータを移行したいホストを確認してください。 -label.migrate.router.to=にルータを移行する -label.action.migrate.systemvm=システムVMを移行する -label.action.migrate.systemvm.processing=システムのVMを移行.... -message.migrate.systemvm.confirm=あなたがシステムのVMを移行するホストを確認してください。 -label.migrate.systemvm.to=システムVMへの移行 +label.action.migrate.router=ルーターの移行 +label.action.migrate.router.processing=ルーターを移行しています... +message.migrate.router.confirm=ルーターの移行先は次のホストでよろしいですか? +label.migrate.router.to=ルーターの移行: + +label.action.migrate.systemvm=システムVM の移行 +label.action.migrate.systemvm.processing=システム VM を移行しています... +message.migrate.systemvm.confirm=システム VM の移行先は次のホストでよろしいですか? +label.migrate.systemvm.to=システム VM の移行: -mode=モードの -side.by.side=サイドからサイド -inline=インライン +mode=モード +side.by.side=並列 +inline=直列 -extractable=抽出可能な +extractable=抽出可能 label.ocfs2=OCFS2 -label.action.edit.host=ホストを編集する +label.action.edit.host=ホストの編集 network.rate=ネットワーク速度 -ICMP.type=ICMPタイプ -ICMP.code=ICMPコード +ICMP.type=ICMP の種類 +ICMP.code=ICMP コード image.directory=画像ディレクトリ -label.action.create.template.from.vm=VMからのテンプレートを作成する -label.action.create.template.from.volume=ボリュームからのテンプレートを作成する +label.action.create.template.from.vm=VM からのテンプレート作成 +label.action.create.template.from.volume=ボリュームからのテンプレート作成 -message.vm.create.template.confirm=テンプレートの作成は自動的にVMを再起動します。 +message.vm.create.template.confirm=テンプレートを作成すると VM が自動的に再起動されます。 -label.action.manage.cluster=クラスタ管理 -message.action.manage.cluster=クラスタを管理登録してもよろしいですか? -label.action.manage.cluster.processing=クラスタを管理登録しています.... +label.action.manage.cluster=クラスターの管理 +message.action.manage.cluster=クラスターを管理対象にしてもよろしいですか? +label.action.manage.cluster.processing=クラスターを管理対象に登録しています... -label.action.unmanage.cluster=非管理対象クラスタ -message.action.unmanage.cluster=クラスタを非管理対象にしてもよろしいですか? -label.action.unmanage.cluster.processing=クラスタを非管理対象にしています.... +label.action.unmanage.cluster=管理対象外のクラスター +message.action.unmanage.cluster=クラスターを管理対象から外してもよろしいですか? +label.action.unmanage.cluster.processing=クラスターを管理対象から登録解除しています... -label.allocation.state=アロケーション状態 -managed.state=管理された状態 +label.allocation.state=割り当て状態 +managed.state=管理対象状態 label.default.use=デフォルト使用 -label.host.tags=ホストタグ +label.host.tags=ホスト タグ label.cidr=CIDR -label.cidr.list=ソースCIDR +label.cidr.list=発信元 CIDR -label.storage.tags=ストレージタグ +label.storage.tags=ストレージ タグ -label.redundant.router=冗長化ルータ +label.redundant.router=冗長ルーター label.is.redundant.router=冗長 force.delete=強制削除 -force.delete.domain.warning=警告:このオプションを選択すると、すべての子ドメインおよび関連するすべてのアカウントとそのリソースは削除されます。 +force.delete.domain.warning=警告: このオプションを選択すると、すべての子ドメインおよび関連するすべてのアカウントとそのリソースが削除されます。 -force.remove=強制削除 -force.remove.host.warning=警告:このオプションを選択すると、実行中のすべての仮想マシンを強制的に停止して、クラスタからホストを削除します。 +force.remove=強制解除 +force.remove.host.warning=警告: このオプションを選択すると、実行中のすべての仮想マシンが強制的に停止され、クラスターからこのホストが強制的に解除されます。 force.stop=強制停止 -force.stop.instance.warning=警告:このインスタンスの停止を強制すると、あなたの最後のオプションでなければなりません。それは、データの損失だけでなく、仮想マシンの状態の一貫性のない動作が発生する可能性があります。 +force.stop.instance.warning=警告: インスタンスの強制停止は、最終手段にしてください。データを損失するだけでなく、仮想マシンの動作が一貫しなくなる可能性があります。 label.PreSetup=PreSetup -label.SR.name=SR名-ラベル -label.SharedMountPoint = SharedMountPoint +label.SR.name = SR 名ラベル +label.SharedMountPoint=SharedMountPoint label.clvm=CLVM -label.volgroup=Volume Group -label.VMFS.datastore=VMFSデータストア +label.volgroup=ボリューム グループ +label.VMFS.datastore=VMFS データストア -label.network.device=ネットワークデバイス -label.add.network.device=ネットワークデバイス追加 -label.network.device.type=ネットワークデバイスの種類 -label.DHCP.server.type=DHCPサーバの種類 -label.Pxe.server.type=PXEサーバの種類 -label.PING.storage.IP=PING対象ストレージのIPアドレス -label.PING.dir=PING対象ディレクトリ -label.TFTP.dir=TFTP対象ディレクトリ -label.PING.CIFS.username=PING CIFS ユーザ名 +label.network.device=ネットワーク デバイス +label.add.network.device=ネットワーク デバイスの追加 +label.network.device.type=ネットワーク デバイスの種類 +label.DHCP.server.type=DHCP サーバーの種類 +label.Pxe.server.type=PXE サーバーの種類 +label.PING.storage.IP=PING 対象のストレージ IP アドレス +label.PING.dir=PING ディレクトリ +label.TFTP.dir=TFTP ディレクトリ +label.PING.CIFS.username=PING CIFS ユーザー名 label.PING.CIFS.password=PING CIFS パスワード -label.CPU.cap=CPU Cap +label.CPU.cap=CPU 制限 -label.network.domain=ネットワークドメイン -label.action.enable.zone=ゾーン有効化 -label.action.enable.zone.processing=ゾーンを有効化しています.... -message.action.enable.zone=このゾーンを有効にすることを確認してください。 -label.action.disable.zone=ゾーン無効化 -label.action.disable.zone.processing=ゾーンを無効化しています.... -message.action.disable.zone=このゾーンを無効にすることを確認してください。 +label.action.enable.zone=ゾーンの有効化 +label.action.enable.zone.processing=ゾーンを有効にしています... +message.action.enable.zone=このゾーンを有効にしてもよろしいですか? +label.action.disable.zone=ゾーンの無効化 +label.action.disable.zone.processing=ゾーンを無効にしています... +message.action.disable.zone=このゾーンを無効にしてもよろしいですか? -label.action.enable.pod=Pod有効化 -label.action.enable.pod.processing=Podを有効化しています.... -message.action.enable.pod=このPodを有効にすることを確認してください。 -label.action.disable.pod=Pod無効化 -label.action.disable.pod.processing=Podを無効化しています.... -message.action.disable.pod=このPodを無効にすることを確認してください。 +label.action.enable.pod=ポッドの有効化 +label.action.enable.pod.processing=ポッドを有効にしています... +message.action.enable.pod=このポッドを有効にしてもよろしいですか? +label.action.disable.pod=ポッドの無効化 +label.action.disable.pod.processing=ポッドを無効にしています... +message.action.disable.pod=このポッドを無効にしてもよろしいですか? -label.action.enable.cluster=クラスタ有効化 -label.action.enable.cluster.processing=クラスタを有効化しています.... -message.action.enable.cluster=このクラスタを有効にすることを確認してください。 -label.action.disable.cluster=クラスタ無効化 -label.action.disable.cluster.processing=クラスタを無効化しています.... -message.action.disable.cluster=このクラスタを無効にすることを確認してください。 +label.action.enable.cluster=クラスターの有効化 +label.action.enable.cluster.processing=クラスターを有効にしています... +message.action.enable.cluster=クラスターを有効にしてもよろしいですか? +label.action.disable.cluster=クラスターの無効化 +label.action.disable.cluster.processing=クラスターを無効にしています... +message.action.disable.cluster=クラスターを無効にしてもよろしいですか? -label.account =アカウント -label.account.id =アカウントID -label.account.name =アカウント名 -label.account.specific =アカウント固有 -label.accounts =アカウント -label.acquire.new.ip =新規IPアドレス取得 -label.show.ingress.rule=イングレスルールを表示する -label.hide.ingress.rule=イングレスルールを表示しない -label.action.attach.disk.processing =ディスクをアタッチしています.... -label.action.attach.disk=ディスクをアタッチ -label.action.attach.iso.processing =ISOをアタッチしています.... -label.action.attach.iso= ISOをアタッチ -label.action.cancel.maintenance.mode =メンテナンスモードをキャンセル -label.action.cancel.maintenance.mode.processing =メンテナンスモードをキャンセルしています.... -label.action.change.password =パスワード変更 -label.action.change.service =サービス変更 -label.action.change.service.processingは=サービスを変更しています.... -label.action.copy.ISO =ISOコピー -label.action.copy.ISO.processing =ISOをコピーしています.... -label.action.copy.template =テンプレートコピー -label.action.copy.template.processing =テンプレートをコピーしています.... -label.action.create.template =テンプレート作成 -label.action.create.template.processing =テンプレートを作成しています.... -label.action.create.vm.processing= VMを作成しています.... -label.action.create.vm=VM作成 -label.action.create.volume.processing =ボリュームを作成しています.... -label.action.create.volume=ボリューム作成 -label.action.delete.IP.range =IPアドレス範囲削除 -label.action.delete.IP.range.processing=IPアドレス範囲を削除しています.... -label.action.delete.ISO =ISO削除 -label.action.delete.ISO.processing=ISOを削除しています.... -label.action.delete.account =アカウント削除 -label.action.delete.account.processing=アカウントを削除しています.... -label.action.delete.cluster =クラスタ削除 -label.action.delete.cluster.processing=クラスタを削除しています.... -label.action.delete.disk.offering =ディスクオファリング削除 -label.action.delete.disk.offering.processing=ディスクオファリングを削除しています.... +label.account.id=アカウント ID +label.account.name=アカウント名 +label.account.specific=アカウント固有 +label.account=アカウント +label.accounts=アカウント +label.acquire.new.ip=新しい IP アドレスの取得 +label.show.ingress.rule=受信規則の表示 +label.hide.ingress.rule=受信規則を隠す +label.action.attach.disk.processing=ディスクをアタッチしています... +label.action.attach.disk=ディスクのアタッチ +label.action.attach.iso.processing=ISO をアタッチしています... +label.action.attach.iso=ISO のアタッチ +label.action.cancel.maintenance.mode.processing=保守モードをキャンセルしています... +label.action.cancel.maintenance.mode=保守モードのキャンセル +label.action.change.password=パスワードの変更 +label.action.change.service.processing=サービスを変更しています... +label.action.change.service=サービスの変更 +label.action.copy.ISO.processing=ISO をコピーしています... +label.action.copy.ISO=ISO のコピー +label.action.copy.template.processing=テンプレートをコピーしています... +label.action.copy.template=テンプレートのコピー +label.action.create.template.processing=テンプレートを作成しています... +label.action.create.template=テンプレートの作成 +label.action.create.vm.processing=VM を作成しています... +label.action.create.vm=VM の作成 +label.action.create.volume.processing=ボリュームを作成しています... +label.action.create.volume=ボリュームの作成 +label.action.delete.IP.range.processing=IP アドレスの範囲を削除しています... +label.action.delete.IP.range=IP アドレスの範囲の削除 +label.action.delete.ISO.processing=ISO を削除しています... +label.action.delete.ISO=ISO の削除 +label.action.delete.account.processing=アカウントを削除しています... +label.action.delete.account=アカウントの削除 +label.action.delete.cluster.processing=クラスターを削除しています... +label.action.delete.cluster=クラスターの削除 +label.action.delete.disk.offering.processing=ディスク オファリングを削除しています... +label.action.delete.disk.offering=ディスク オファリングの削除 -label.action.update.resource.count=アップデートリソースカウント -label.action.update.resource.count.processing=リソースのカウントを更新.... +label.action.update.resource.count=リソース数の更新 +label.action.update.resource.count.processing=リソース数を更新しています... -label.action.delete.domain =ドメイン削除 -label.action.delete.domain.processing=ドメインを削除しています.... -label.action.delete.firewall =ファイアウォール削除 -label.action.delete.firewall.processing=ファイアウォールを削除しています.... -label.action.delete.ingress.rule =イングレスルール削除 -label.action.delete.ingress.rule.processing=イングレスルールを削除しています.... -label.action.delete.load.balancer =ロードバランサ削除 -label.action.delete.load.balancer.processing=ロードバランサを削除しています... -label.action.edit.network=ネットワークを編集する -label.action.delete.network =ネットワーク削除 -label.action.delete.network.processing=ネットワークを削除しています.... -label.action.delete.pod =Pod削除 -label.action.delete.pod.processing=Podを削除しています.... -label.action.delete.primary.storage =プライマリストレージ削除 -label.action.delete.primary.storage.processing =プライマリストレージを削除しています.... -label.action.delete.secondary.storage =セカンダリストレージ削除 -label.action.delete.secondary.storage.processing =セカンダリストレージを削除しています.... -label.action.delete.security.group =セキュリティグループ削除 -label.action.delete.security.group.processing=セキュリティグループを削除しています.... -label.action.delete.service.offering =サービスオファリングを削除 -label.action.delete.service.offering.processing=サービスオファリングを削除しています.... -label.action.delete.snapshot =スナップショット削除 -label.action.delete.snapshot.processing=スナップショットを削除しています.... -label.action.delete.template =テンプレート削除 -label.action.delete.template.processing =テンプレートを削除しています.... -label.action.delete.user =ユーザ削除 -label.action.delete.user.processing =ユーザを削除しています.... -label.action.delete.volume =ボリューム削除 -label.action.delete.volume.processing =ボリュームを削除しています.... -label.action.delete.zone =Zone削除 -label.action.delete.zone.processing=Zoneを削除しています.... -label.action.destroy.instance =インスタンス破棄 -label.action.destroy.instance.processing =インスタンスを破棄しています.... -label.action.destroy.systemvm.processing=システムVMを破棄しています.... -label.action.destroy.systemvm=システムVM破棄 -label.action.detach.disk =ディスクをデタッチ -label.action.detach.disk.processing =ディスクをデタッチしています.... -label.action.detach.iso =ISOをデタッチ -label.action.detach.iso.processing =ISOをデタッチしています.... -label.action.disable.account =アカウント無効化 -label.action.disable.account.processing =アカウントを無効化しています.... -label.action.disable.static.NAT =スタティックNAT無効化 -label.action.disable.static.NAT.processing =スタティックNATを無効化しています.... -label.action.disable.user =ユーザ無効化 -label.action.disable.user.processing =ユーザを無効化しています.... -label.action.download.ISO =ISOダウンロード -label.action.download.template =テンプレートダウンロード -label.action.download.volume =ボリュームダウンロード -label.action.download.volume.processing =ボリュームをダウンロードしています.... -label.action.edit.ISO=ISO編集 -label.action.edit.account=アカウント編集 -label.action.edit.disk.offering=ディスクオファリング編集 -label.action.edit.domain=ドメイン編集 -label.action.edit.global.setting=グローバル設定編集 -label.action.edit.instance=インスタンス編集 -label.action.edit.network.offering=ネットワークオファリング編集 -label.action.edit.pod=Pod編集 -label.action.edit.primary.storage=プライマリストレージ編集 -label.action.edit.resource.limits =リソース制限編集 -label.action.edit.service.offering=サービスオファリング編集 -label.action.edit.template=テンプレート編集 -label.action.edit.user=ユーザ編集 -label.action.edit.zone=Zone編集 -label.action.enable.account =アカウント有効化 -label.action.enable.account.processing =アカウントを有効にしています.... -label.action.enable.maintenance.mode =メンテナンスモードに移行 -label.action.enable.maintenance.mode.processing =メンテナンスモードに移行しています.... -label.action.enable.static.NAT =スタティックNAT有効化 -label.action.enable.static.NAT.processing =スタティックNATを有効化しています.... -label.action.enable.user =ユーザ有効化 -label.action.enable.user.processing =ユーザを有効化しています.... -label.action.force.reconnect.processing =再接続しています.... +label.action.delete.domain=ドメインの削除 +label.action.delete.domain.processing=ドメインを削除しています... + +label.action.delete.firewall.processing=ファイアウォールを削除しています... +label.action.delete.firewall=ファイアウォール規則の削除 +label.action.delete.ingress.rule.processing=受信規則を削除しています... +label.action.delete.ingress.rule=受信規則の削除 +label.action.delete.load.balancer.processing=負荷分散装置を削除しています... +label.action.delete.load.balancer=負荷分散規則の削除 +label.action.edit.network.processing=ネットワークを編集しています... +label.action.edit.network=ネットワークの編集 +label.action.delete.network.processing=ネットワークを削除しています... +label.action.delete.network=ネットワークの削除 +label.action.delete.pod.processing=ポッドを削除しています... +label.action.delete.pod=ポッドの削除 +label.action.delete.primary.storage.processing=プライマリ ストレージを削除しています... +label.action.delete.primary.storage=プライマリ ストレージの削除 +label.action.delete.secondary.storage.processing=セカンダリ ストレージを削除しています... +label.action.delete.secondary.storage=セカンダリ ストレージの削除 +label.action.delete.security.group.processing=セキュリティ グループを削除しています... +label.action.delete.security.group=セキュリティ グループの削除 +label.action.delete.service.offering.processing=サービス オファリングを削除しています... +label.action.delete.service.offering=サービス オファリングの削除 +label.action.delete.snapshot.processing=スナップショットを削除しています... +label.action.delete.snapshot=スナップショットの削除 +label.action.delete.template.processing=テンプレートを削除しています... +label.action.delete.template=テンプレートの削除 +label.action.delete.user.processing=ユーザーを削除しています... +label.action.delete.user=ユーザーの削除 +label.action.delete.volume.processing=ボリュームを削除しています... +label.action.delete.volume=ボリュームの削除 +label.action.delete.zone.processing=ゾーンを削除しています... +label.action.delete.zone=ゾーンの削除 +label.action.destroy.instance.processing=インスタンスを破棄しています... +label.action.destroy.instance=インスタンスの破棄 +label.action.destroy.systemvm.processing=システム VM を破棄しています... +label.action.destroy.systemvm=システム VM の破棄 +label.action.detach.disk.processing=ディスクをデタッチしています... +label.action.detach.disk=ディスクのデタッチ +label.action.detach.iso.processing=ISO をデタッチしています... +label.action.detach.iso=ISO のデタッチ +label.action.disable.account.processing=アカウントを無効にしています... +label.action.disable.account=アカウントの無効 +label.action.disable.static.NAT.processing=静的 NAT を無効にしています... +label.action.disable.static.NAT=静的 NAT の無効化 +label.action.disable.user.processing=ユーザーを無効にしています... +label.action.disable.user=ユーザーの無効化 +label.action.download.ISO=ISO のダウンロード +label.action.download.template=テンプレートのダウンロード +label.action.download.volume.processing=ボリュームをダウンロードしています... +label.action.download.volume=ボリュームのダウンロード +label.action.edit.ISO=ISO の編集 +label.action.edit.account=アカウントの編集 +label.action.edit.disk.offering=ディスク オファリングの編集 +label.action.edit.domain=ドメインの編集 +label.action.edit.global.setting=グローバル設定の編集 +label.action.edit.instance=インスタンスの編集 +label.action.edit.network.offering=ネットワーク オファリングの編集 +label.action.edit.pod=ポッドの編集 +label.action.edit.primary.storage=プライマリ ストレージの編集 +label.action.edit.resource.limits=リソース制限の編集 +label.action.edit.service.offering=サービス オファリングの編集 +label.action.edit.template=テンプレートの編集 +label.action.edit.user=ユーザーの編集 +label.action.edit.zone=ゾーンの編集 +label.action.enable.account.processing=アカウントを有効にしています... +label.action.enable.account=アカウントの有効化 +label.action.enable.maintenance.mode.processing=保守モードを有効にしています... +label.action.enable.maintenance.mode=保守モードの有効化 +label.action.enable.static.NAT.processing=静的 NAT を有効にしています... +label.action.enable.static.NAT=静的 NAT の有効化 +label.action.enable.user.processing=ユーザーを有効にしています... +label.action.enable.user=ユーザーの有効化 +label.action.force.reconnect.processing=再接続しています... label.action.force.reconnect=強制再接続 -label.action.generate.keys =キー生成 -label.action.generate.keys.processing =キーを生成しています.... -label.action.lock.account =アカウントロック -label.action.lock.account.processing =アカウントをロックしています.... -label.action.migrate.instance=インスタンス移行 -label.action.migrate.instance.processing = インスタンスを移行しています.... -label.action.reboot.instance =インスタンス再起動 -label.action.reboot.instance.processing =インスタンスを再起動しています.... -label.action.reboot.router =ルータ再起動 -label.action.reboot.router.processing =ルータを再起動しています.... -label.action.reboot.systemvm =システムVM再起動 -label.action.reboot.systemvm.processing =システムVMを再起動しています.... -label.action.recurring.snapshot =定期スナップショット -label.action.release.ip =IPアドレス解放 -label.action.release.ip.processing =IPアドレスを解放しています.... -label.action.remove.host.processing =ホストを削除しています.... -label.action.remove.host=ホスト削除 -label.action.reset.password =パスワードリセット -label.action.reset.password.processing =パスワードをリセットしています.... -label.action.resource.limits =リソース制限 -label.action.restore.instance.processing =インスタンスをリストアしています.... -label.action.restore.instance=インスタンスリストア -label.action.start.instance =インスタンス起動 -label.action.start.instance.processing=インスタンスを起動しています.... -label.action.start.router =ルータ起動 -label.action.start.router.processing=ルータを起動しています.... -label.action.start.systemvm =システムVM開始 -label.action.start.systemvm.processing=はシステムVMを起動しています.... -label.action.stop.instance =インスタンス停止 -label.action.stop.instance.processing =インスタンスを停止しています.... -label.action.stop.router =ルータ停止 -label.action.stop.router.processing =ルータを停止しています.... -label.action.stop.systemvm =システムVM停止 -label.action.stop.systemvm.processing =システムVMを指定しています.... -label.action.take.snapshot.processing=スナップショットを作成しています.... -label.action.take.snapshot=スナップショット作成 -label.action.update.OS.preference = OS優先設定アップデート -label.action.update.OS.preference.processing =OS優先設定をアップデートしています.... -label.actions =アクション -label.active.sessions =アクティブセッション -label.add =追加 -label.add.account =アカウント追加 -label.add.by.cidr=CIDR毎追加 -label.add.by.group =グループ毎追加 -label.add.cluster =クラスタ追加 -label.add.direct.iprange =ダイレクトIPアドレス範囲追加 -label.add.disk.offering =ディスクオファリング追加 -label.add.domain =ドメイン追加 -label.add.firewall =ファイアウォール追加 -label.add.host = ホスト追加 -label.add.ingress.rule =イングレスルール追加 -label.add.ip.range =IPアドレス範囲追加 -label.add.iso =ISO追加 -label.add.load.balancer =ロードバランサ追加 -label.add.more=その他追加 -label.add.network =ネットワーク追加 -label.add.pod =Pod追加 -label.add.primary.storage=プライマリストレージ追加 -label.add.secondary.storage=セカンダリストレージ追加 -label.add.security.group =セキュリティグループ追加 -label.add.service.offering =サービスオファリング追加 -label.add.template =テンプレート追加 -label.add.user =ユーザ追加 -label.add.vlan = VLAN追加 -label.add.volume=ボリューム追加 -label.add.zone =Zone追加 -label.adding =追加 -label.adding.cluster =クラスタ追加 -label.adding.failed =追加失敗 -label.adding.pod =Pod追加 -label.adding.processing=追加しています.... -label.adding.succeeded=追加成功 -label.adding.user =ユーザ追加 -label.adding.zone =Zone追加 -label.additional.networks =追加ネットワーク -label.admin =管理者 -label.admin.accounts =管理者アカウント -label.advanced =アドバンス -label.advanced.mode =アドバンスモード -label.advanced.search =アドバンス検索 +label.action.generate.keys.processing=キーを生成しています... +label.action.generate.keys=キーの生成 +label.action.lock.account.processing=アカウントをロックしています... +label.action.lock.account=アカウントのロック +label.action.migrate.instance=インスタンスの移行 +label.action.migrate.instance.processing=インスタンスを移行しています... +label.action.reboot.instance.processing=インスタンスを再起動しています... +label.action.reboot.instance=インスタンスの再起動 +label.action.reboot.router.processing=ルーターを再起動しています... +label.action.reboot.router=ルーターの再起動 +label.action.reboot.systemvm.processing=システム VM を再起動しています... +label.action.reboot.systemvm=システム VM の再起動 +label.action.recurring.snapshot=定期スナップショット +label.action.release.ip.processing=IP アドレスを解放しています... +label.action.release.ip=IP アドレスの解放 +label.action.remove.host.processing=ホストを削除しています... +label.action.remove.host=ホストの削除 +label.action.reset.password.processing=パスワードをリセットしています... +label.action.reset.password=パスワードのリセット +label.action.resource.limits=リソース制限 +label.action.restore.instance.processing=インスタンスを復元しています... +label.action.restore.instance=インスタンスの復元 +label.action.start.instance.processing=インスタンスを起動しています... +label.action.start.instance=インスタンスの起動 +label.action.start.router.processing=ルーターを起動しています... +label.action.start.router=ルーターの起動 +label.action.start.systemvm.processing=システム VM を起動しています... +label.action.start.systemvm=システム VM の起動 +label.action.stop.instance.processing=インスタンスを停止しています... +label.action.stop.instance=インスタンスの停止 +label.action.stop.router.processing=ルーターを停止しています... +label.action.stop.router=ルーターの停止 +label.action.stop.systemvm.processing=システム VM を停止しています... +label.action.stop.systemvm=システム VM の停止 +label.action.take.snapshot.processing=スナップショットを作成しています.... +label.action.take.snapshot=スナップショットの作成 +label.action.update.OS.preference.processing=OS 基本設定を更新しています... +label.action.update.OS.preference=OS 基本設定の更新 +label.actions=操作 +label.active.sessions=アクティブなセッション +label.add.account=アカウントの追加 +label.add.by.cidr=CIDR で追加 +label.add.by.group=グループで追加 +label.add.cluster=クラスターの追加 +label.add.direct.iprange=直接 IP アドレスの範囲の追加 +label.add.disk.offering=ディスク オファリングの追加 +label.add.domain=ドメインの追加 +label.add.firewall=ファイアウォール規則の追加 +label.add.host=ホストの追加 +label.add.ingress.rule=受信規則の追加 +label.add.ip.range=IP アドレスの範囲の追加 +label.add.iso=ISO の追加 +label.add.load.balancer=負荷分散装置の追加 +label.add.more=そのほかの項目の追加 +label.add.network=ネットワークの追加 +label.add.pod=ポッドの追加 +label.add.primary.storage=プライマリ ストレージの追加 +label.add.secondary.storage=セカンダリ ストレージの追加 +label.add.security.group=セキュリティ グループの追加 +label.add.service.offering=サービス オファリングの追加 +label.add.template=テンプレートの追加 +label.add.user=ユーザーの追加 +label.add.vlan=VLAN の追加 +label.add.volume=ボリュームの追加 +label.add.zone=ゾーンの追加 +label.add=追加 +label.adding.cluster=クラスターを追加しています +label.adding.failed=追加できませんでした +label.adding.pod=ポッドを追加しています +label.adding.processing=追加しています... +label.adding.succeeded=追加しました +label.adding.user=ユーザーを追加しています +label.adding.zone=ゾーンを追加しています +label.adding=追加しています +label.additional.networks=追加のネットワーク +label.admin.accounts=管理者アカウント +label.admin=管理者 +label.advanced.mode=詳細モード +label.advanced.search=高度な検索 +label.advanced=詳細 label.alert=アラート -label.algorithm =アルゴリズム -label.allocated=割り当て -label.api.key = APIキー -label.assign.to.load.balancer =ロードバランサにインスタンスを割り当てています +label.algorithm=アルゴリズム +label.allocated=割り当て済み +label.api.key=API キー +label.assign.to.load.balancer=負荷分散装置にインスタンスを割り当てています label.assign=割り当て -label.associated.network.id =関連ネットワークID -label.attached.iso=アタッチされたISO -label.availability =アベイラビリティ -label.availability.zone =アベイラビリティZone -label.available.public.ips =使用可能パブリックIPアドレス -label.available=可能 -label.back =戻る -label.basic.mode =基本モード -label.bootable =ブータブル -label.broadcast.domain.type =ブロードキャストドメイン種類 +label.associated.network.id=関連づけられたネットワーク ID +label.attached.iso=アタッチされた ISO +label.availability.zone=利用可能ゾーン +label.availability=可用性 +label.available.public.ips=使用できるパブリック IP アドレス +label.available=使用可能 +label.back=戻る +label.basic.mode=基本モード +label.bootable=起動可能 +label.broadcast.domain.type=ブロードキャスト ドメインの種類 label.by.account=アカウント -label.by.availability =アベイラビリティ +label.by.availability=可用性 label.by.domain=ドメイン label.by.end.date=終了日 -label.by.level =レベル -label.by.pod=Pod -label.by.role =ロール +label.by.level=レベル +label.by.pod=ポッド +label.by.role=役割 label.by.start.date=開始日 -label.by.state =状態 -label.by.traffic.type =トラフィックタイプ -label.by.type.id=タイプID -label.by.type=タイプ +label.by.state=状態 +label.by.traffic.type=トラフィックの種類 +label.by.type.id=種類 ID +label.by.type=種類 label.by.zone=ゾーン -label.bytes.received =受信バイト数 -label.bytes.sent =送信バイト数 -label.cancel =キャンセル +label.bytes.received=受信バイト +label.bytes.sent=送信バイト +label.cancel=キャンセル label.certificate=証明書 -label.privatekey=PKCS#8秘密鍵 -label.domain.suffix=DNSドメインサフィックス(例:xyz.com) -label.character =キャラクタ -label.cidr.account = CIDRまたはアカウント/セキュリティグループ -label.close =閉じる -label.cloud.console=CloudStack管理コンソール -label.cloud.managed = Cloud.com 管理 -label.cluster =クラスタ -label.cluster.type =クラスタ種類 -label.code =コード +label.privatekey=PKC#8 秘密キー +label.domain.suffix=DNS ドメイン サフィックス (例: xyz.com) +label.character=文字 +label.cidr.account=CIDR またはアカウント/セキュリティ グループ +label.close=閉じる +label.cloud.console=クラウド管理コンソール +label.cloud.managed=Cloud.com による管理 +label.cluster.type=クラスターの種類 +label.cluster=クラスター +label.code=コード label.confirmation=確認 -label.cpu = CPU -label.cpu.allocated = CPU割り当て -label.cpu.allocated.for.VMs=VMへのCPU割り当て -label.cpu.mhz =CPU(MHz) -label.cpu.utilized=CPU利用率 -label.created=作成日付 -label.cross.zones =クロスZone -label.custom.disk.size =ディスクサイズ変更 -label.daily =毎日 -label.data.disk.offering=データディスクオファリング -label.date =日付 -label.day.of.month =日(月毎) -label.day.of.week =日(週毎) -label.delete =削除 -label.deleting.failed =削除失敗 -label.deleting.processing=削除しています.... -label.description =説明 -label.detaching.disk =ディスクをデタッチ +label.cpu.allocated.for.VMs=VM に割り当て済みの CPU +label.cpu.allocated=割り当て済みの CPU +label.cpu.mhz=CPU (MHz 単位) +label.cpu.utilized=CPU 使用率 +label.cpu=CPU +label.created=作成日時 +label.cross.zones=クロス ゾーン +label.custom.disk.size=カスタム ディスク サイズ +label.daily=毎日 +label.data.disk.offering=データ ディスク オファリング +label.date=日付 +label.day.of.month=毎月指定日 +label.day.of.week=毎週指定日 +label.delete=削除 +label.deleting.failed=削除できませんでした +label.deleting.processing=削除しています... +label.description=説明 +label.detaching.disk=ディスクをデタッチしています label.details=詳細 -label.device.id =デバイスID +label.device.id=デバイス ID label.disabled=無効 -label.disabling.vpn.access =VPNアクセスを無効化しています -label.disk.allocated =ディスク割り当て -label.disk.offering =ディスクオファリング -label.disk.size =ディスクサイズ -label.disk.size.gb =ディスクサイズ(GB単位) -label.disk.total =総ディスク容量 -label.disk.volume =ディスクボリューム -label.display.text =表示テキスト -label.dns.1 = DNS1 -label.dns.2 = DNS2 -label.domain =ドメイン -label.domain.admin =ドメイン管理者 -label.domain.id =ドメインID -label.domain.name =ドメイン名 -label.double.quotes.are.not.allowed =二重引用符は使用できません +label.disabling.vpn.access=VPN アクセスを無効にしています +label.disk.allocated=割り当て済みのディスク +label.disk.offering=ディスク オファリング +label.disk.size.gb=ディスク サイズ (GB 単位) +label.disk.size=ディスク サイズ +label.disk.total=ディスク合計 +label.disk.volume=ディスク ボリューム +label.display.text=表示テキスト +label.dns.1=DNS 1 +label.dns.2=DNS 2 +label.domain.admin=ドメイン管理者 +label.domain.id=ドメイン ID +label.domain.name=ドメイン名 +label.domain=ドメイン +label.double.quotes.are.not.allowed=二重引用符は使用できません label.download.progress=ダウンロードの進捗状況 -label.edit =編集 -label.email =メールアドレス -label.enabling.vpn =VPN有効化 -label.enabling.vpn.access =VPNアクセスを有効化しています -label.end.port =終了ポート -label.endpoint.or.operation =エンドポイントまたは操作 -label.error =エラー -label.error.code =エラーコード -label.esx.host = ESX/ESXiのホスト -label.example =例 +label.edit=編集 +label.email=電子メール +label.enabling.vpn.access=VPN アクセスを有効にしています +label.enabling.vpn=VPN を有効にしています +label.end.port=終了ポート +label.endpoint.or.operation=エンドポイントまたは操作 +label.error.code=エラー コード +label.error=エラー +label.esx.host=ESX/ESXi ホスト +label.example=例 label.failed=失敗 -label.featured =おすすめ -label.firewall =ファイアウォール -label.first.name = 名 -label.format =フォーマット -label.friday =金曜日 -label.full=フル -label.gateway =ゲートウェイ -label.general.alerts =一般的なアラート -label.generating.url =URLを生成しています -label.generating.url =URLを生成しています -label.go.step.2 = 2に進みます -label.go.step.3 = 3に進みます -label.go.step.4 = 4に進みます -label.go.step.5 = 5に進みます -label.group =グループ -label.group.optional =グループ(オプション) -label.guest.cidr =ゲストCIDR -label.guest.gateway =ゲストゲートウェイ -label.guest.ip =ゲストIPアドレス -label.guest.ip.range =ゲストIPアドレス範囲 -label.guest.netmask =ゲストネットマスク -label.ha.enabled = HA有効 -label.help =ヘルプ -label.host =ホスト -label.host.alerts =ホストのアラート -label.host.name =ホスト名 -label.hosts =ホスト -label.hourly =毎時 -label.hypervisor =ハイパーバイザ -label.hypervisor.type =ハイパーバイザ種類 -label.id = ID -label.info =情報 -label.ingress.rule = イングレスルール -label.initiated.by =イニシエータ -label.instance =インスタンス -label.instance.limits =インスタンス制限 -label.instance.name =インスタンス名 -label.instances =インスタンス -label.internal.dns.1 =内部DNS1 -label.internal.dns.2 =内部DNS2 -label.interval.type =間隔種別 -label.invalid.integer =無効な整数 -label.invalid.number =無効な番号 -label.ip = IPアドレス -label.ip.address = IPアドレス -label.ip.allocations = IPアドレス割り当て -label.ip.limits =パブリックIPアドレス制限 -label.ip.or.fqdn = IPアドレスまたはFQDN -label.ip.range = IPアドレス範囲 -label.ips = IPアドレス +label.featured=おすすめ +label.firewall=ファイアウォール +label.first.name=名 +label.format=形式 +label.friday=金曜日 +label.full=完全 +label.gateway=ゲートウェイ +label.general.alerts=一般アラート +label.generating.url=URL を生成しています +label.go.step.2=手順 2 に進む +label.go.step.3=手順 3 に進む +label.go.step.4=手順 4 に進む +label.go.step.5=手順 5 に進む +label.group.optional=グループ (オプション) +label.group=グループ +label.guest.cidr=ゲスト CIDR +label.guest.gateway=ゲスト ゲートウェイ +label.guest.ip.range=ゲスト IP アドレスの範囲 +label.guest.ip=ゲスト IP アドレス +label.guest.netmask=ゲスト ネットマスク +label.ha.enabled=高可用性有効 +label.help=ヘルプ +label.host.alerts=ホスト アラート +label.host.name=ホスト名 +label.host=ホスト +label.hosts=ホスト +label.hourly=毎時 +label.hypervisor.type=ハイパーバイザーの種類 +label.hypervisor=ハイパーバイザー +label.id=ID +label.info=情報 +label.ingress.rule=受信規則 +label.initiated.by=開始ユーザー +label.instance.limits=インスタンス制限 +label.instance.name=インスタンス名 +label.instance=インスタンス +label.instances=インスタンス +label.internal.dns.1=内部 DNS 1 +label.internal.dns.2=内部 DNS 2 +label.interval.type=間隔の種類 +label.invalid.integer=無効な整数 +label.invalid.number=無効な数 +label.ip.address=IP アドレス +label.ip.allocations=IP アドレスの割り当て +label.ip.limits=パブリック IP アドレスの制限 +label.ip.or.fqdn=IP アドレスまたは FQDN +label.ip.range=IP アドレスの範囲 +label.ip=IP +label.ips=IP label.is.default=デフォルト label.is.shared=共有 label.is.system=システム -label.iscsi =iSCSI -label.iso.boot=ISOブート +label.iscsi=iSCSI +label.iso.boot=ISO 起動 label.iso=ISO label.isolation.mode=分離モード -label.keep =保持 -label.lang.chinese =中国語(簡体字) -label.lang.english =英語 +label.keep=維持 +label.lang.chinese=簡体字中国語 +label.lang.english=英語 label.lang.japanese=日本語 label.lang.spanish=スペイン語 -label.last.disconnected =最終ログイン -label.last.name =姓 -label.level =レベル -label.linklocal.ip=リンクローカルIPアドレス -label.load.balancer = ロードバランサ -label.loading =読み込んでいます -label.local =ローカル -label.login =ログイン -label.logout =ログアウト -label.lun = LUN -label.manage =管理 -label.maximum =最大 -label.memory =メモリ -label.memory.allocated=メモリ割り当て -label.memory.mb =メモリ(MB) -label.memory.total =メモリ合計 -label.memory.used =メモリ使用 -label.menu.accounts =アカウント -label.menu.alerts =アラート -label.menu.all.accounts =すべてのアカウント -label.menu.all.instances =すべてのインスタンス -label.menu.community.isos =コミュニティISO -label.menu.community.templates =コミュニティテンプレート -label.menu.configuration =構成 -label.menu.dashboard =ダッシュボード -label.menu.destroyed.instances =破棄されたインスタンス -label.menu.disk.offerings =ディスクオファリング -label.menu.domains =ドメイン -label.menu.events =イベント -label.menu.featured.isos =フィーチャーISO -label.menu.featured.templates =フィーチャーテンプレート -label.menu.global.settings =グローバル設定 -label.menu.instances =インスタンス -label.menu.ipaddresses = IPアドレス -label.menu.isos = ISO -label.menu.my.accounts =マイアカウント -label.menu.my.instances =マイインスタンス -label.menu.my.isos =マイISO -label.menu.my.templates =マイテンプレート -label.menu.network =ネットワーク -label.menu.network.offerings =ネットワークオファリング -label.menu.physical.resources =物理リソース -label.menu.running.instances=実行中インスタンス -label.menu.security.groups =セキュリティグループ -label.menu.service.offerings =サービスオファリング -label.menu.snapshots =スナップショット -label.menu.stopped.instances =停止インスタンス -label.menu.storage =ストレージ -label.menu.system =システム -label.menu.system.vms =システムVM -label.menu.templates =テンプレート -label.menu.virtual.appliances =仮想アプライアンス -label.menu.virtual.resources =仮想リソース -label.menu.volumes =ボリューム -label.migrate.instance.to=インスタンス移行先 -label.minimum =最小 -label.minute.past.hour =分 -label.monday =月曜日 -label.monthly =毎月 -label.more.templates =その他のテンプレート -label.my.account =マイアカウント -label.name =名前 -label.name.optional =名(オプション) -label.netmask =ネットマスク -label.network =ネットワーク -label.network.desc =ネットワーク説明 -label.network.domain =ネットワークドメイン -label.network.id =ネットワークID -label.network.name =ネットワーク名 -label.network.offering =ネットワークオファリング -label.network.offering.display.text =ネットワークオファリング表示テキスト -label.network.offering.id =ネットワークオファリングID -label.network.offering.name =ネットワークオファリング名 -label.network.rate =ネットワークレート -label.network.read =ネットワーク受信量 -label.network.type =ネットワークタイプ -label.network.write =ネットワーク送信量 -label.new.password =新しいパスワード -label.next =次 -label.nfs = NFS -label.nfs.server = NFSサーバ -label.nfs.storage = NFSストレージ -label.nics =NIC -label.no =いいえ -label.no.actions =使用可能アクションはありません -label.no.alerts =最近のアラートはありません -label.no.errors =最近のエラーはありません -label.no.isos =利用可能はISOはありません -label.no.items =使用可能なアイテムはありません -label.no.security.groups =利用可能なセキュリティグループはありません -label.no.thanks =必要ありません +label.last.disconnected=最終切断日時 +label.last.name=姓 +label.level=レベル +label.linklocal.ip=リンク ローカル IP アドレス +label.load.balancer=負荷分散装置 +label.loading=ロードしています +label.local=ローカル +label.login=ログオン +label.logout=ログオフ +label.lun=LUN +label.manage=管理 +label.maximum=最大 +label.memory.allocated=割り当て済みのメモリ +label.memory.mb=メモリ (MB 単位) +label.memory.total=メモリ合計 +label.memory.used=メモリ使用量 +label.memory=メモリ +label.menu.accounts=アカウント +label.menu.alerts=アラート +label.menu.all.accounts=すべてのアカウント +label.menu.all.instances=すべてのインスタンス +label.menu.community.isos=コミュニティ ISO +label.menu.community.templates=コミュニティ テンプレート +label.menu.configuration=構成 +label.menu.dashboard=ダッシュボード +label.menu.destroyed.instances=破棄されたインスタンス +label.menu.disk.offerings=ディスク オファリング +label.menu.domains=ドメイン +label.menu.events=イベント +label.menu.featured.isos=おすすめの ISO +label.menu.featured.templates=おすすめのテンプレート +label.menu.global.settings=グローバル設定 +label.menu.instances=インスタンス +label.menu.ipaddresses=IP アドレス +label.menu.isos=ISO +label.menu.my.accounts=マイ アカウント +label.menu.my.instances=マイ インスタンス +label.menu.my.isos=マイ ISO +label.menu.my.templates=マイ テンプレート +label.menu.network.offerings=ネットワーク オファリング +label.menu.network=ネットワーク +label.menu.physical.resources=物理リソース +label.menu.running.instances=実行中のインスタンス +label.menu.security.groups=セキュリティ グループ +label.menu.service.offerings=サービス オファリング +label.menu.snapshots=スナップショット +label.menu.stopped.instances=停止されたインスタンス +label.menu.storage=ストレージ +label.menu.system.vms=システム VM +label.menu.system=システム +label.menu.templates=テンプレート +label.menu.virtual.appliances=仮想アプライアンス +label.menu.virtual.resources=仮想リソース +label.menu.volumes=ボリューム +label.migrate.instance.to=インスタンスの移行: +label.minimum=最小 +label.minute.past.hour=分 (毎時) +label.monday=月曜日 +label.monthly=毎月 +label.more.templates=そのほかのテンプレート +label.my.account=マイ アカウント +label.name.optional=名前 (オプション) +label.name=名前 +label.netmask=ネットマスク +label.network.desc=ネットワークの説明 +label.network.domain=ネットワーク ドメイン +label.network.id=ネットワーク ID +label.network.name=ネットワーク名 +label.network.offering.display.text=ネットワーク オファリング表示テキスト +label.network.offering.id=ネットワーク オファリング ID +label.network.offering.name=ネットワーク オファリング名 +label.network.offering=ネットワーク オファリング +label.network.rate=ネットワーク速度 +label.network.read=ネットワークの読み取り +label.network.type=ネットワークの種類 +label.network.write=ネットワークの書き込み +label.network=ネットワーク +label.new.password=新しいパスワード +label.next=次へ +label.nfs.server=NFS サーバー +label.nfs.storage=NFS ストレージ +label.nfs=NFS +label.nics=NIC +label.no.actions=実行できる操作はありません +label.no.alerts=最近のアラートはありません +label.no.errors=最近のエラーはありません +label.no.isos=使用できる ISO はありません +label.no.items=使用できる項目はありません +label.no.security.groups=使用できるセキュリティ グループはありません +label.no.thanks=いいえ結構です +label.no=いいえ label.none=なし -label.not.found=が見つかりません -label.num.cpu.cores= CPUコア数 +label.not.found=見つかりません +label.num.cpu.cores=CPU コア数 label.numretries=再試行回数 -label.offer.ha =HA -label.optional =オプション -label.os.preference = OS優先設定 -label.os.type = OSタイプ -label.owned.public.ips =割り当て済みパブリックIPアドレス -label.owner.account =所有者アカウント +label.offer.ha=高可用性の提供 +label.optional=オプション +label.os.preference=OS 基本設定 +label.os.type=OS の種類 +label.owned.public.ips=所有するパブリック IP アドレス +label.owner.account=所有者アカウント label.owner.domain=所有者ドメイン -label.parent.domain =親ドメイン -label.password =パスワード -label.password.enabled = パスワード有効 -label.path =パス +label.parent.domain=親ドメイン +label.password.enabled=パスワード管理有効 +label.password=パスワード +label.path=パス label.please.wait=お待ちください -label.pod =Pod -label.port.forwarding =ポート転送 -label.port.range =ポート範囲 -label.prev =前のページ -label.primary.allocated=プライマリストレージ割り当て -label.primary.network =プライマリネットワーク -label.primary.storage =プライマリストレージ -label.primary.used=プライマリストレージ使用量 -label.private.interface =プライベートインタフェイス -label.private.ip =プライベートIPアドレス -label.private.ip.range =プライベートIPアドレス範囲 -label.private.ips =プライベートIPアドレス -label.private.port =プライベートポート -label.private.zone =プライベートZone -label.protocol =プロトコル -label.protocol =プロトコル -label.public =パブリック -label.public.interface =パブリックインタフェイス -label.public.ip =パブリックIPアドレス -label.public.ips =パブリックIPアドレス -label.public.port =パブリックポート -label.public.zone =パブリックZone -label.recent.errors =最近のエラー -label.refresh =リフレッシュ -label.related =関連 -label.remove.from.load.balancer =ロードバランサからインスタンスを削除しています -label.removing.user =ユーザ削除 +label.pod=ポッド +label.port.forwarding=ポート転送 +label.port.range=ポートの範囲 +label.prev=戻る +label.primary.allocated=割り当て済みのプライマリ ストレージ +label.primary.network=プライマリ ネットワーク +label.primary.storage=プライマリ ストレージ +label.primary.used=プライマリ ストレージ使用量 +label.private.interface=プライベート インターフェイス +label.private.ip.range=プライベート IP アドレスの範囲 +label.private.ip=プライベート IP アドレス +label.private.ips=プライベート IP アドレス +label.private.port=プライベート ポート +label.private.zone=プライベート ゾーン +label.protocol=プロトコル +label.public.interface=パブリック インターフェイス +label.public.ip=パブリック IP アドレス +label.public.ips=パブリック IP アドレス +label.public.port=パブリック ポート +label.public.zone=パブリック ゾーン +label.public=パブリック +label.recent.errors=最近のエラー +label.refresh=更新 +label.related=関連 +label.remove.from.load.balancer=負荷分散装置からインスタンスを削除しています +label.removing.user=ユーザーを削除しています label.required=必須 -label.reserved.system.ip =予約済みシステムIPアドレス -label.resource =リソース -label.resource.limits =リソース制限 -label.resources =リソース -label.role =ロール -label.root.disk.offering=ルートディスクオファリング -label.running.vms= 実行中VM -label.saturday =土曜日 -label.save =保存 -label.saving.processingに=保存しています.... -label.scope =スコープ -label.search =検索 -label.secondary.storage =セカンダリストレージ -label.secondary.used=セカンダリストレージ使用量 -label.secret.key =秘密鍵 -label.security.group =セキュリティグループ -label.security.group.name =セキュリティグループ名 -label.security.groups =セキュリティグループ -label.security.groups.enabled=セキュリティグループ有効 -label.sent =送信 -label.server =サーバ -label.service.offering =サービスオファリング -label.session.expired=セッション期限切れ -label.shared =共有 -label.size =サイズ -label.snapshot =スナップショット -label.snapshot.limits =スナップショット制限 -label.snapshot.name =スナップショット名 -label.snapshot.s =スナップショット -label.snapshot.schedule=スナップショットスケジュール -label.snapshots =スナップショット -label.source.nat =ソースNAT -label.specify.vlan = VLAN指定 -label.start.port =開始ポート -label.state =状態 -label.static.nat =スタティックNAT -label.static.nat.to =スタティックNAT先 -label.statistics =統計 -label.status =ステータス -label.step.1 =ステップ1 -label.step.1.title =ステップ1:テンプレートを選択してください -label.step.2 =ステップ2 -label.step.2.title =ステップ2:サービスオファリング -label.step.3 =ステップ3 -label.step.3.title =ステップ3:ディスクオファリングを選択してください -label.step.4 =ステップ4 -label.step.4.title =ステップ4:ネットワーク -label.step.5 =ステップ5 -label.step.5.title =ステップ5:確認 -label.stopped.vms =停止VM -label.storage =ストレージ -label.storage.type =ストレージ種類 -label.submit =送信 -label.submitted.by = [送信者:] +label.reserved.system.ip=予約済みシステム IP アドレス +label.resource.limits=リソース制限 +label.resource=リソース +label.resources=リソース +label.role=役割 +label.root.disk.offering=ルート ディスク オファリング +label.running.vms=実行中の VM +label.saturday=土曜日 +label.save=保存 +label.saving.processing=保存しています... +label.scope=スコープ +label.search=検索 +label.secondary.storage=セカンダリ ストレージ +label.secondary.used=セカンダリ ストレージ使用量 +label.secret.key=秘密キー +label.security.group.name=セキュリティ グループ名 +label.security.group=セキュリティ グループ +label.security.groups.enabled=セキュリティ グループ有効 +label.security.groups=セキュリティ グループ +label.sent=送信済み +label.server=サーバー +label.service.offering=サービス オファリング +label.system.service.offering=システム サービス オファリング +label.session.expired=セッションの有効期限が切れました +label.shared=共有 +label.size=サイズ +label.snapshot.limits=スナップショット制限 +label.snapshot.name=スナップショット名 +label.snapshot.s=スナップショット +label.snapshot.schedule=定期スナップショットのセットアップ +label.snapshot=スナップショット +label.snapshots=スナップショット +label.source.nat=送信元 NAT +label.specify.vlan=VLAN の指定 +label.start.port=開始ポート +label.state=状態 +label.static.nat.to=静的 NAT の設定先: +label.static.nat=静的 NAT +label.statistics=統計 +label.status=状態 +label.step.1.title=手順 1. テンプレートの選択 +label.step.1=手順 1 +label.step.2.title=手順 2. サービス オファリング +label.step.2=手順 2 +label.step.3.title=手順 3. ディスク オファリングの選択 +label.step.3=手順 3 +label.step.4.title=手順 4. ネットワーク +label.step.4=手順 4 +label.step.5.title=手順 5. 確認 +label.step.5=手順 5 +label.stopped.vms=停止された VM +label.storage.type=ストレージの種類 +label.storage=ストレージ +label.submit=送信 +label.submitted.by=[送信ユーザー: ] label.succeeded=成功 -label.sunday =日曜日 -label.system.capacity =システム全体の容量 -label.system.vm =システムVM -label.system.vm.type =システムVM種類 -label.system.vm.type =システムVM種類 -label.system.vms =システムVM -label.tagged=タグ -label.tags =タグ -label.target.iqn =ターゲットIQN -label.template =テンプレート -label.template.limits =テンプレート制限 -label.theme.default =デフォルトテーマ -label.theme.grey =カスタム - グレー -label.theme.lightblue=カスタム - ライトブルー -label.thursday =木曜日 -label.time =時間 +label.sunday=日曜日 +label.system.capacity=システム容量 +label.system.vm.type=システム VM の種類 +label.system.vm=システム VM +label.system.vms=システム VM +label.tagged=タグあり +label.tags=タグ +label.target.iqn=ターゲット IQN +label.template.limits=テンプレート制限 +label.template=テンプレート +label.theme.default=デフォルト テーマ +label.theme.grey=カスタム - グレー +label.theme.lightblue=カスタム - ライト ブルー +label.thursday=木曜日 label.time.zone=タイムゾーン -label.timeout.in.second=タイムアウト(秒) -label.timezone =タイムゾーン -label.total.cpu=CPUの合計 -label.total.vms =VMの合計 -label.traffic.type =トラフィックタイプ -label.tuesday =火曜日 -label.type =タイプ -label.type.id =タイプID -label.unavailable =使用不可 +label.time=時間 +label.timeout.in.second = タイムアウト (秒) +label.timezone=タイムゾーン +label.total.cpu=CPU 合計 +label.total.vms=VM 合計 +label.traffic.type=トラフィックの種類 +label.tuesday=火曜日 +label.type.id=種類 ID +label.type=種類 +label.unavailable=使用不能 label.unlimited=無制限 label.untagged=タグなし -label.update.ssl =SSL証明書更新 -label.update.ssl.cert =SSL証明書更新 -label.updating=更新しています -label.url =URL -label.usage.interface =使用インタフェイス -label.used=使用 -label.user =ユーザ -label.username =ユーザ名 -label.users =ユーザ -label.value =値 -label.vcenter.cluster =vCenterクラスタ -label.vcenter.datacenter =vCenterデータセンタ -label.vcenter.datastore =vCenterデータストア -label.vcenter.host =vCenterホスト -label.vcenter.password =vCenterパスワード -label.vcenter.username =vCenterユーザ名 -label.version =バージョン -label.virtual.appliance =仮想アプライアンス -label.virtual.appliances =仮想アプライアンス -label.virtual.network =仮想ネットワーク -label.vlan = VLAN -label.vlan.id = VLAN ID -label.vlan.range = VLAN ID範囲 -label.vm.add =インスタンス追加 -label.vm.destroy =破棄 -label.vm.reboot =再起動 -label.vm.start =開始 -label.vm.stop =停止 -label.vmfs =VMFS -label.vms = VM -label.volume =ボリューム -label.volume.limits =ボリューム制限 -label.volume.name =ボリューム名 -label.volumes =ボリューム -label.vpn = VPN -label.vsphere.managed = vSphere管理 -label.waiting =お待ちください -label.warn =警告 -label.wednesday =水曜日 -label.weekly =毎週 +label.update.ssl.cert=SSL 証明書の更新 +label.update.ssl=SSL 証明書の更新 +label.updating=更新しています +label.url=URL +label.usage.interface=使用状況測定インターフェイス +label.used=使用中 +label.user=ユーザー +label.username=ユーザー名 +label.users=ユーザー +label.value=値 +label.vcenter.cluster=vCenter クラスター +label.vcenter.datacenter=vCenter データセンター +label.vcenter.datastore=vCenter データストア +label.vcenter.host=vCenter ホスト +label.vcenter.password=vCenter パスワード +label.vcenter.username=vCenter ユーザー名 +label.version=バージョン +label.virtual.appliance=仮想アプライアンス +label.virtual.appliances=仮想アプライアンス +label.virtual.network=仮想ネットワーク +label.vlan.id=VLAN ID +label.vlan.range=VLAN の範囲 +label.vlan=VLAN +label.vm.add=インスタンスの追加 +label.vm.destroy=破棄 +label.vm.reboot=再起動 +label.vm.start=起動 +label.vm.stop=停止 +label.vmfs=VMFS +label.vms=VM +label.volume.limits=ボリューム制限 +label.volume.name=ボリューム名 +label.volume=ボリューム +label.volumes=ボリューム +label.vpn=VPN +label.vsphere.managed=vSphere による管理 +label.waiting=待機しています +label.warn=警告 +label.wednesday=水曜日 +label.weekly=毎週 label.welcome.cloud.console=管理コンソールへようこそ label.welcome=ようこそ -label.yes =はい -label.zone =Zone -label.zone.id =Zone ID -label.zone.step.1.title =ステップ1:ネットワーク選択 -label.zone.step.2.title =ステップ2:Zone追加 -label.zone.step.3.title =ステップ3:Pod追加 -label.zone.step.4.title =ステップ4:IPアドレス範囲追加 -label.zone.wide =Zone全体 +label.yes=はい +label.zone.id=ゾーン ID +label.zone.step.1.title=手順 1. ネットワークの選択 +label.zone.step.2.title=手順 2. ゾーンの追加 +label.zone.step.3.title=手順 3. ポッドの追加 +label.zone.step.4.title=手順 4. IP アドレス範囲の追加 +label.zone.wide=ゾーン全体 +label.zone=ゾーン #Messages -message.acquire.public.ip =新しいIPアドレスを取得するZoneを選択してください。 -message.action.cancel.maintenance=あなたのホストはメンテナンスのために正常にキャンセルされました。このプロセスは数分かかることがあります。 -message.action.cancel.maintenance.mode=メンテナンスをキャンセルしてもよろしいですか? -message.action.delete.ISO.for.all.zones= そのISOは全てのZoneで使用されます。全てのZoneから削除してもよろしいですか? -message.action.delete.ISO=ISOを削除してもよろしいですか? -message.action.delete.cluster=クラスタを削除してもよろしいですか? -message.action.delete.disk.offering=ディスクオファリングを削除してもよろしいですか? -message.action.delete.domain=ドメインを削除してもよろしいですか? -message.action.delete.external.firewall=この外部ファイアウォールを削除してもよろしいですか? 警告:同じ外部ファイアウォールの再度追加を計画している場合は、デバイスの使用状況データをリセットする必要があります。 -message.action.delete.external.load.balancer=この外部ロードバランサを削除してもよろしいですか? 警告:同じ外部ロードバランサの再度追加を計画している場合は、デバイスの使用状況データをリセットする必要があります。 -message.action.delete.ingress.rule=イングレスルールを削除してもよろしいですか? -message.action.delete.network=ネットワークを削除してもよろしいですか? -message.action.delete.pod=Podを削除してもよろしいですか? -message.action.delete.primary.storage=プライマリストレージを削除してもよろしいですか? -message.action.delete.secondary.storage=セカンダリストレージを削除してもよろしいですか? -message.action.delete.security.group=セキュリティグループを削除してもよろしいですか? -message.action.delete.service.offering=サービスオファリングを削除してもよろしいですか? -message.action.delete.snapshot=スナップショットを削除してもよろしいですか? -message.action.delete.template.for.all.zonesは=テンプレートは全てのゾーンで使用されます。すべてのゾーンから削除してもよろしいですか? -message.action.delete.template=テンプレートを削除してもよろしいですか? -message.action.delete.volume=ボリュームを削除してもよろしいですか? -message.action.delete.zone=Zoneを削除してもよろしいですか? -message.action.destroy.instance=インスタンスを破棄してもよろしいですか? -message.action.destroy.systemvm=システムVMを破棄してもよろしいですか? -message.action.disable.static.NAT=スタティックNATを無効化してもよろしいですか? -message.action.enable.maintenanceは=ホストはメンテナンスの準備を行っています。この処理には数分かかることがあります。(ホスト上のVMの数によって異なります) -message.action.force.reconnect=ホストは再接続を行っています。このプロセスは数分かかることがあります。 -message.action.force.reconnect=ホストに強制的に再接続してもよろしいですか? -message.action.host.enable.maintenance.mode =メンテナンスモードを有効にすると、ホスト上で実行中のすべてのインスタンスを他の使用可能なホストへライブマイグレーションする原因となります。 -message.action.instance.reset.password=この仮想マシンのルートパスワードを変更してもよろしいですか? -message.action.primarystorage.enable.maintenance.mode =警告:プライマリストレージをメンテナンスモードにすると、そのプライマリストレージ上のボリュームを使用している全てのVMが停止します。このまま続けてもよろしいですか? -message.action.reboot.instance=インスタンスを再起動してもよろしいですか? -message.action.reboot.router=ルータを再起動してもよろしいですか? -message.action.reboot.systemvm=システムVMを再起動してもよろしいですか? -message.action.release.ip=IPアドレスを解放してもよろしいですか? -message.action.remove.host=クラスタ内の最後に残った唯一のホストを削除して、再インストールすると、作業環境およびデータベースが破壊され、VMゲストが使用できなくなります。 -message.action.restore.instance=インスタンスをリストアしてもよろしいですか? -message.action.start.instance=インスタンスを起動してもよろしいですか? -message.action.start.router=ルータを起動してもよろしいですか? -message.action.start.systemvm=システムVMを起動してもよろしいですか? -message.action.stop.instance=インスタンスを停止してもよろしいですか? -message.action.stop.router=ルータを停止してもよろしいですか? -message.action.stop.systemvm=システムVMを停止してもよろしいですか? -message.action.take.snapshot=スナップショットを作成してもよろしいですか? -message.add.cluster.zone=Zone にクラスタで管理されたハイパーバイザを追加 -message.add.cluster=Zone , Pod にクラスタで管理されたハイパーバイザを追加 -message.add.disk.offering=新しいディスクオファリングを追加するために、次のパラメータを指定してください -message.add.firewall=Zoneにファイアウォールを追加 -message.add.host=新しいホストを追加するために、次のパラメータを指定してください -message.add.ip.range.direct.network=Zone のダイレクトネットワークに新しいIPアドレス範囲を追加 -message.add.ip.range.to.pod=

Pod にIPアドレス範囲を追加

-message.add.ip.range=Zone内のパブリックネットワークにIPアドレス範囲を追加 -message.add.load.balancer=Zoneにロードバランサを追加 -message.add.network=Zone に新しいネットワークを追加 -message.add.pod=Zone に新しいPodを追加 -message.add.primary.storage=Zone , Pod に新しいプライマリストレージを追加 -message.add.primary=新しいプライマリストレージを追加するために、次のパラメータを指定してください -message.add.secondary.storage=Zone に新しいストレージを追加 -message.add.service.offering =新しいサービスオファリングを追加するために、次のデータを入力してください。 -message.add.template=新しいテンプレートを作成するために、次のデータを入力してください。 -message.add.volume=新しいボリュームを追加するために、次のデータを入力してください。 -message.additional.networks.desc=仮想インスタンスが接続する追加ネットワークを選択してください。 -message.advanced.mode.desc=VLANサポートを有効化したい場合はこのネットワークモデルを選択してください。このネットワークモデルは、管理者が最もフレキシブルにネットワークオファリングを定義できるモデルで、ダイレクトネットワークと仮想ネットワークをサポートし、ファイアウォール、VPN、またはロードバランサ等を提供することができます。 -message.advanced.security.group=ゲストVMのアイソレーションを提供するためにセキュリティグループを使用する場合はこのオプションを選択してください。 -message.advanced.virtual=ゲストVMのアイソレーションを提供するためにゾーン全体のVLANを使用する場合はこのオプションを選択してください。 -message.allow.vpn.access=VPNアクセスを許可するユーザのユーザ名とパスワードを入力してください。 -message.attach.iso.confirm=仮想インスタンスにISOファイルをアタッチしてもよろしいですか? -message.attach.volume=新しいボリュームをアタッチするために、次のデータを入力してください。Windowsベースの仮想マシンにディスクボリュームをアタッチする場合、接続されたディスクを確認するためにインスタンスの再起動が必要です。 -message.basic.mode.desc=VLANサポートが必要でない場合はこのネットワークモデルを選択してください。このネットワークモデルの下で作成されたすべての仮想インスタンスには安全に分離されたネットワークとセキュリティグループからダイレクトにIPアドレスが割り当てられます。 -message.change.offering.confirmは=仮想インスタンスのサービスオファリングを変更してもよろしいですか? -message.copy.iso.confirm=ISOをコピーしてもよろしいですか? -message.copy.template =テンプレート XXXをZoneからコピーしてもよろしいですか? -message.create.template.vm =テンプレートからVMを作成してもよろしいですか? -message.create.template.volume=ディスクボリュームのテンプレートを作成する前に、以下の情報を指定してください。テンプレートの作成は、ボリュームのサイズに応じて数分からより長い間隔で設定可能です。 +message.acquire.public.ip=新しい IP アドレスを取得するゾーンを選択してください。 +message.action.cancel.maintenance.mode=この保守をキャンセルしてもよろしいですか? +message.action.cancel.maintenance=ホストの保守は正常にキャンセルされました。この処理には数分かかる可能性があります。 +message.action.delete.ISO.for.all.zones=その ISO はすべてのゾーンで使用されています。すべてのゾーンから削除してもよろしいですか? +message.action.delete.ISO=この ISO を削除してもよろしいですか? +message.action.delete.cluster=このクラスターを削除してもよろしいですか? +message.action.delete.disk.offering=このディスク オファリングを削除してもよろしいですか? +message.action.delete.domain=このドメインを削除してもよろしいですか? +message.action.delete.external.firewall=この外部ファイアウォールを削除してもよろしいですか? 警告: 同じ外部ファイアウォールを再度追加する予定である場合は、デバイスの使用状況データをリセットする必要があります。 +message.action.delete.external.load.balancer=この外部負荷分散装置を削除してもよろしいですか? 警告: 同じ外部負荷分散装置を再度追加する予定である場合は、デバイスの使用状況データをリセットする必要があります。 +message.action.delete.ingress.rule=この受信規則を削除してもよろしいですか? +message.action.delete.network=このネットワークを削除してもよろしいですか? +message.action.delete.pod=このポッドを削除してもよろしいですか? +message.action.delete.primary.storage=このプライマリ ストレージを削除してもよろしいですか? +message.action.delete.secondary.storage=このセカンダリ ストレージを削除してもよろしいですか? +message.action.delete.security.group=このセキュリティ グループを削除してもよろしいですか? +message.action.delete.service.offering=このサービス オファリングを削除してもよろしいですか? +message.action.delete.snapshot=このスナップショットを削除してもよろしいですか? +message.action.delete.template.for.all.zones=そのテンプレートはすべてのゾーンで使用されています。すべてのゾーンから削除してもよろしいですか? +message.action.delete.template=このテンプレートを削除してもよろしいですか? +message.action.delete.volume=このボリュームを削除してもよろしいですか? +message.action.delete.zone=このゾーンを削除してもよろしいですか? +message.action.destroy.instance=このインスタンスを破棄してもよろしいですか? +message.action.destroy.systemvm=このシステム VM を破棄してもよろしいですか? +message.action.disable.static.NAT=静的 NAT を無効にしてもよろしいですか? +message.action.enable.maintenance=ホストを保守する準備ができました。このホスト上の VM 数によっては、この処理には数分以上かかる可能性があります。 +message.action.force.reconnect=ホストは強制的に再接続しました。この処理には数分かかる可能性があります。 +message.action.host.enable.maintenance.mode=保守モードを有効にすると、このホストで実行中のすべてのインスタンスがほかの使用できるホストにライブ マイグレーションされます。 +message.action.instance.reset.password=この仮想マシンのルート パスワードを変更してもよろしいですか? +message.action.primarystorage.enable.maintenance.mode=警告: プライマリ ストレージを保守モードにすると、そのストレージ上のボリュームを使用するすべての VM が停止します。続行してもよろしいですか? +message.action.reboot.instance=このインスタンスを再起動してもよろしいですか? +message.action.reboot.router=このルーターを再起動してもよろしいですか? +message.action.reboot.systemvm=このシステム VM を再起動してもよろしいですか? +message.action.release.ip=この IP アドレスを解放してもよろしいですか? +message.action.remove.host=クラスター内に最後まで残った唯一のホストを削除して再インストールすると、ホスト上の作業環境およびデータベースが破棄され、VM ゲストが使用できなくなります。 +message.action.restore.instance=このインスタンスを復元してもよろしいですか? +message.action.start.instance=このインスタンスを起動してもよろしいですか? +message.action.start.router=このルーターを起動してもよろしいですか? +message.action.start.systemvm=このシステム VM を起動してもよろしいですか? +message.action.stop.instance=このインスタンスを停止してもよろしいですか? +message.action.stop.router=このルーターを停止してもよろしいですか? +message.action.stop.systemvm=このシステム VM を停止してもよろしいですか? +message.action.take.snapshot=このボリュームのスナップショットを作成してもよろしいですか? +message.add.cluster.zone=ゾーン にハイパーバイザーで管理されるクラスターを追加します +message.add.cluster=ゾーン のポッド にハイパーバイザーで管理されるクラスターを追加します +message.add.disk.offering=新しいディスク オファリングを追加するために、次のパラメーターを指定してください。 +message.add.firewall=ゾーンにファイアウォールを追加します +message.add.host=新しいホストを追加するために、次のパラメーターを指定してください。 +message.add.ip.range.direct.network=ゾーン の直接ネットワークに新しい IP アドレスの範囲を追加します +message.add.ip.range.to.pod=

ポッド に IP アドレスの範囲を追加します

+message.add.ip.range=ゾーンのパブリック ネットワークに IP アドレスの範囲を追加します +message.add.load.balancer=ゾーンに負荷分散装置を追加します +message.add.network=ゾーン に新しいネットワークを追加します +message.add.pod=ゾーン に新しいポッドを追加します +message.add.primary.storage=ゾーン のポッド に新しいプライマリ ストレージを追加します +message.add.primary=新しいプライマリ ストレージを追加するために、次のパラメーターを指定してください。 +message.add.secondary.storage=ゾーン に新しいストレージを追加します +message.add.service.offering=新しいサービス オファリングを追加するために、次のデータを入力してください。 +message.add.template=新しいテンプレートを作成するために、次のデータを入力してください。 +message.add.volume=新しいボリュームを追加するために、次のデータを入力してください。 +message.additional.networks.desc=仮想インスタンスが接続する追加のネットワークを選択してください。 +message.advanced.mode.desc=VLAN サポートを有効にする場合は、このネットワーク モデルを選択してください。このモデルでは最も柔軟にカスタム ネットワーク オファリングを提供でき、ファイアウォール、VPN、負荷分散装置のサポートのほかに、直接ネットワークと仮想ネットワークも有効にすることができます。 +message.advanced.security.group=ゲスト VM を分離するためにセキュリティ グループを使用する場合は、このオプションを選択してください。 +message.advanced.virtual=ゲスト VM を分離するためにゾーン全体の VLAN を使用する場合は、このオプションを選択してください。 +message.allow.vpn.access=VPN アクセスを許可するユーザーのユーザー名とパスワードを入力してください。 +message.attach.iso.confirm=この仮想インスタンスに ISO ファイルをアタッチしてもよろしいですか? +message.attach.volume=新しいボリュームをアタッチするために、次のデータを入力してください。Windows ベースの仮想マシンにディスク ボリュームをアタッチする場合は、アタッチしたディスクを認識するためにインスタンスを再起動する必要があります。 +message.basic.mode.desc=VLAN サポートが不要である場合は、このネットワーク モデルを選択してください。このネットワーク モデルで作成されるすべての仮想インスタンスにネットワークから直接 IP アドレスが割り当てられ、セキュリティ グループを使用してセキュリティと分離が提供されます。 +message.change.offering.confirm=この仮想インスタンスのサービス オファリングを変更してもよろしいですか? +message.copy.iso.confirm=ISO を次の場所にコピーしてもよろしいですか? +message.copy.template=ゾーン からテンプレート XXX を次の場所にコピーします: +message.create.template.vm=テンプレート から仮想マシンを作成します +message.create.template.volume=ディスク ボリューム のテンプレートを作成する前に、次の情報を指定してください。ボリューム サイズによっては、テンプレートの作成には数分以上かかる可能性があります。 message.delete.account=このアカウントを削除してもよろしいですか? -message.detach.iso.confirm=仮想インスタンスからISOをデタッチしてもよろしいですか? -message.disable.account=このアカウントを無効にしてもよろしいですか? アカウントを無効にすることにより、このアカウントのすべてのユーザーはクラウドリソースにアクセスできなくなります。実行中のすべての仮想マシンはすぐにシャットダウンされます。 -message.disable.vpn.access=VPNアクセスを無効にしてもよろしいですか? -message.download.ISO=ISOをダウンロードするために00000をクリックしてください。 -message.download.template=テンプレートをダウンロードするために00000をクリックしてください。 -message.download.volume=ボリュームをダウンロードするために00000をクリックしてください。 -message.edit.confirm="保存" をクリックする前に変更内容を確認してください -message.edit.limits =以下のリソースへの制限を指定してください。"-1"はリソースの生成に制限がないことを示しています。 -message.enable.account=このアカウントを有効にしてもよろしいですか? -message.enable.vpn.access = 現在、VPNはこのIPアドレスに対して無効になっています。VPNアクセスを有効にしますか? -message.enable.vpn= 現在、VPNアクセスは有効ではありません。ここををクリックするとVPNが有効になります。 -message.enabled.vpn.ip.sec =IPSec事前共有キーは、 -message.enabled.vpn=現在、VPNアクセスは有効になっています。次のIP経由でアクセスすることができます -message.launch.vm.on.private.networkは=あなた自身の専用のプライベートネットワーク上のインスタンスを起動したいですか? -message.lock.account=このアカウントをロックしてもよろしいですか? アカウントをロックすると、このアカウントのすべてのユーザーはクラウドリソースを管理することができなくなります。既存のリソースにはアクセスすることができます。 -message.migrate.instance.confirm=インスタンスを移行するホストを確認してください。 -message.new.user =アカウントに新しいユーザーを追加するために、次の情報を設定してください -message.no.network.support =選択されたハイパーバイザ、vSphereには追加ネットワーク機能がありません。手順5に進んでください。 -message.no.network.support.configuration.not.true=セキュリティグループが有効なゾーンが無いため、追加のネットワーク機能はありません。手順5に進んでください。 -message.number.clusters=

# -- クラスタ

-message.number.hosts=

# -- ホスト

-message.number.pods=

# -- Pod

-message.number.storage=

# -- プライマリストレージ

-message.number.zones=

# -- Zone

-message.remove.vpn.access=次のユーザからのVPNアクセスを削除してもよろしいですか? -message.restart.mgmt.server=新しい設定を有効にするために、管理サーバ(複数可)を再起動してください。 -message.security.group.usage=全ての該当するセキュリティグループを選択するには、 Ctrlキーを押しながらクリックしてください。 -message.snapshot.schedule =以下のオプションからポリシーを適用することにより、定期的なスナップショットのスケジュールを設定できます。 -message.step.1.continue=テンプレートまたはISOを選択して続行してください -message.step.1.desc=新しい仮想インスタンス用のテンプレートを選択してください。ISOがインストールされているブランクのテンプレートを選択することもできます。 -message.step.2.continue=サービスオファリングを選択して続行してください -message.step.2.desc = -message.step.3.continue=ディスクオファリングを選択して続行してください -message.step.3.desc = -message.step.4.continue=少なくとも1つのネットワークを選択して続行してください -message.step.4.desc=仮想インスタンスに接続するプライマリネットワークを選択してください。 -message.update.os.preference=このホストの優先OS設定を選択してください。同様の設定を持つすべてのインスタンスはこのホストへ優先的に割り当てられます。 -message.update.ssl=各コンソールプロキシの仮想インスタンスを更新するためのX.509に準拠したSSL証明書を提出してください: -message.virtual.network.desc=アカウント用の専用仮想ネットワークです。ブロードキャストドメインはVLAN内に置かれ、すべてのパブリックネットワークへのアクセスは仮想ルータによってルーティングされます。 -message.volume.create.template.confirm=このディスクボリューム用のテンプレートを作成してもよろしいですか?テンプレートの作成はボリュームのサイズに応じて数分~より長い間隔で指定できます。 -message.zone.step.1.desc=Zoneのネットワークモデルを選択してください。 -message.zone.step.2.desc=新しいZoneを追加するために、次の情報を入力してください。 -message.zone.step.3.desc=新しいPodを追加するために、次の情報を入力してください。 -message.apply.snapshot.policy=現在のスナップショットのポリシーを更新しました。 -message.disable.snapshot.policy=現在のスナップショットのポリシーを無効にしました。 -message.action.change.service.warning=サービスの提供を変更する前にインスタンスを停止する必要があります。 -message.action.reset.password.warning=パスワードを変更する前にインスタンスを停止する必要があります。 -message.action.reset.password.off=インスタンスはこの機能をサポートしていません。 +message.detach.iso.confirm=この仮想インスタンスから ISO ファイルをデタッチしてもよろしいですか? +message.disable.account=このアカウントを無効にしてもよろしいですか? アカウントを無効にすることにより、このアカウントのすべてのユーザーがクラウド リソースにアクセスできなくなります。実行中のすべての仮想マシンは今すぐにシャットダウンされます。 +message.disable.vpn.access=VPN アクセスを無効にしてもよろしいですか? +message.download.ISO=ISO をダウンロードするには
00000 をクリックします +message.download.template=テンプレートをダウンロードするには 00000 をクリックします +message.download.volume=ボリュームをダウンロードするには 00000 をクリックします +message.edit.confirm=[保存] をクリックする前に変更内容を確認してください。 +message.edit.limits=次のリソースに制限を指定してください。「-1」は、リソース作成に制限がないことを示します。 +message.enable.account=このアカウントを有効にしてもよろしいですか? +message.enable.vpn.access=現在この IP アドレスに対する VPN は無効です。VPN アクセスを有効にしてもよろしいですか? +message.enabled.vpn.ip.sec=IPSec 事前共有キー: +message.enabled.vpn=現在、VPN アクセスが有効になっています。次の IP アドレス経由でアクセスできます。 +message.launch.vm.on.private.network=プライベートな専用ネットワークでインスタンスを起動しますか? +message.lock.account=このアカウントをロックしてもよろしいですか? アカウントをロックすることにより、このアカウントのすべてのユーザーがクラウド リソースを管理できなくなります。その後も既存のリソースにはアクセスできます。 +message.migrate.instance.confirm=仮想インスタンスの移行先は次のホストでよろしいですか? +message.new.user=アカウントに新しいユーザーを追加するために、次の情報を指定してください。 +message.no.network.support.configuration.not.true=セキュリティ グループが有効なゾーンが無いため、追加のネットワーク機能はありません。手順 5. に進んでください。 +message.no.network.support=ハイパーバイザーとして vSphere を選択しましたが、このハイパーバイザーに追加のネットワーク機能はありません。手順 5. に進んでください。 +message.number.clusters=

クラスター

+message.number.hosts=

ホスト

+message.number.pods=

ポッド

+message.number.storage=

プライマリ ストレージ ボリューム

+message.number.zones=

ゾーン

+message.remove.vpn.access=次のユーザーから VPN アクセスを削除してもよろしいですか? +message.restart.mgmt.server=新しい設定を有効にするために、管理サーバーを再起動してください。 +message.security.group.usage=該当するセキュリティ グループをすべて選択するには、Ctrl キーを押しながらクリックしてください。 +message.snapshot.schedule=次の使用できるオプションから選択してポリシーの基本設定を適用することにより、定期スナップショットのスケジュールをセットアップできます。 +message.step.1.continue=続行するにはテンプレートまたは ISO を選択してください +message.step.1.desc=新しい仮想インスタンス用のテンプレートを選択してください。ISO をインストールできる空白のテンプレートを選択することもできます。 +message.step.2.continue=続行するにはサービス オファリングを選択してください +message.step.2.desc= +message.step.3.continue=続行するにはディスク オファリングを選択してください +message.step.3.desc= +message.step.4.continue=続行するにはネットワークを少なくとも 1 つ選択してください +message.step.4.desc=仮想インスタンスが接続するプライマリ ネットワークを選択してください。 +message.update.os.preference=このホストの OS 基本設定を選択してください。同様の基本設定を持つすべての仮想インスタンスは、別のホストを選択する前にまずこのホストに割り当てられます。 +message.update.ssl=各コンソール プロキシの仮想インスタンスで更新する、X.509 準拠の新しい SSL 証明書を送信してください: +message.virtual.network.desc=アカウントの専用仮想ネットワークです。ブロードキャスト ドメインは VLAN 内に配置され、パブリック ネットワークへのアクセスはすべて仮想ルーターによってルーティングされます。 +message.volume.create.template.confirm=このディスク ボリュームのテンプレートを作成してもよろしいですか? ボリューム サイズによっては、テンプレートの作成には数分以上かかる可能性があります。 +message.zone.step.1.desc=ゾーンのネットワーク モデルを選択してください。 +message.zone.step.2.desc=新しいゾーンを追加するために、次の情報を入力してください。 +message.zone.step.3.desc=新しいポッドを追加するために、次の情報を入力してください。 +message.apply.snapshot.policy=現在のスナップショット ポリシーを更新しました。 +message.disable.snapshot.policy=現在のスナップショット ポリシーを無効にしました。 +message.action.change.service.warning.for.instance=現在のサービス オファリングを変更する前にインスタンスを停止する必要があります。 +message.action.change.service.warning.for.router=現在のサービス オファリングを変更する前にルーターを停止する必要があります。 +message.action.reset.password.warning=現在のパスワードを変更する前にインスタンスを停止する必要があります。 +message.action.reset.password.off=インスタンスは現在この機能をサポートしていません。 #Errors -error.login=ユーザ名/パスワードが記録と一致しません -error.menu.select=アイテムが選択されていないためアクションを実行することができません -error.mgmt.server.inaccessible=Management Serverにアクセスできません。後で、もう一度やり直してください -error.session.expired=セッション有効期限が切れています -error.unresolved.internet.name=名前解決に失敗しました +error.login=ユーザー名/パスワードが記録と一致しません。 +error.menu.select=項目が選択されていないため操作を実行できません。 +error.mgmt.server.inaccessible=管理サーバーにアクセスできません。後で再実行してください。 +error.session.expired=セッションの有効期限が切れました。 +error.unresolved.internet.name=インターネット名を解決できません。 + + diff --git a/core/src/com/cloud/event/UsageEventVO.java b/core/src/com/cloud/event/UsageEventVO.java index d717233e651..24d3801e4ac 100644 --- a/core/src/com/cloud/event/UsageEventVO.java +++ b/core/src/com/cloud/event/UsageEventVO.java @@ -94,7 +94,7 @@ public class UsageEventVO implements UsageEvent { } //IPAddress usage event - public UsageEventVO(String usageType, long accountId, long zoneId, long ipAddressId, String ipAddress, boolean isSourceNat, String guestType, boolean isElastic) { + public UsageEventVO(String usageType, long accountId, long zoneId, long ipAddressId, String ipAddress, boolean isSourceNat, String guestType, boolean isSystem) { this.type = usageType; this.accountId = accountId; this.zoneId = zoneId; @@ -102,7 +102,7 @@ public class UsageEventVO implements UsageEvent { this.resourceName = ipAddress; this.size = (isSourceNat ? 1L : 0L); this.resourceType = guestType; - this.templateId = (isElastic ? 1L : 0L); + this.templateId = (isSystem ? 1L : 0L); } public UsageEventVO(String usageType, long accountId, long zoneId, long resourceId, String resourceName, Long offeringId, Long templateId, String resourceType) { diff --git a/core/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java b/core/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java index b699cbc31e7..61d21bdc7df 100644 --- a/core/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java +++ b/core/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java @@ -124,7 +124,7 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager { copyTemplateFromSecondaryToPrimary(hyperHost, primaryStorageDatastoreMo, secondaryStorageUrl, - mountPoint, templateUuidName); + mountPoint, templateName, templateUuidName); } else { s_logger.info("Template " + templateName + " has already been setup, skip the template setup process in primary storage"); } @@ -410,9 +410,11 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager { return new CreateVolumeFromSnapshotAnswer(cmd, success, details, newVolumeName); } - + + // templateName: name in secondary storage + // templateUuid: will be used at hypervisor layer private void copyTemplateFromSecondaryToPrimary(VmwareHypervisorHost hyperHost, DatastoreMO datastoreMo, String secondaryStorageUrl, - String templatePathAtSecondaryStorage, String templateName) throws Exception { + String templatePathAtSecondaryStorage, String templateName, String templateUuid) throws Exception { s_logger.info("Executing copyTemplateFromSecondaryToPrimary. secondaryStorage: " + secondaryStorageUrl + ", templatePathAtSecondaryStorage: " + templatePathAtSecondaryStorage @@ -425,30 +427,45 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager { templateName + "." + ImageFormat.OVA.getFileExtension(); String srcFileName = getOVFFilePath(srcOVAFileName); - if(srcFileName == null) { + if(srcFileName == null) { + Script command = new Script("tar", 0, s_logger); + command.add("--no-same-owner"); + command.add("-xf", srcOVAFileName); + command.setWorkDir(secondaryMountPoint + "/" + templatePathAtSecondaryStorage); + s_logger.info("Executing command: " + command.toString()); + String result = command.execute(); + if(result != null) { + String msg = "Unable to unpack snapshot OVA file at: " + srcOVAFileName; + s_logger.error(msg); + throw new Exception(msg); + } + } + + srcFileName = getOVFFilePath(srcOVAFileName); + if(srcFileName == null) { String msg = "Unable to locate OVF file in template package directory: " + srcOVAFileName; s_logger.error(msg); throw new Exception(msg); } - String vmName = templateName; + String vmName = templateUuid; hyperHost.importVmFromOVF(srcFileName, vmName, datastoreMo, "thin"); VirtualMachineMO vmMo = hyperHost.findVmOnHyperHost(vmName); if(vmMo == null) { String msg = "Failed to import OVA template. secondaryStorage: " + secondaryStorageUrl + ", templatePathAtSecondaryStorage: " + templatePathAtSecondaryStorage - + ", templateName: " + templateName; + + ", templateName: " + templateName + ", templateUuid: " + templateUuid; s_logger.error(msg); throw new Exception(msg); } if(vmMo.createSnapshot("cloud.template.base", "Base snapshot", false, false)) { - vmMo.setCustomFieldValue(CustomFieldConstants.CLOUD_UUID, templateName); + vmMo.setCustomFieldValue(CustomFieldConstants.CLOUD_UUID, templateUuid); vmMo.markAsTemplate(); } else { vmMo.destroy(); - String msg = "Unable to create base snapshot for template: " + templateName; + String msg = "Unable to create base snapshot for template, templateName: " + templateName + ", templateUuid: " + templateUuid; s_logger.error(msg); throw new Exception(msg); } diff --git a/core/src/com/cloud/network/resource/F5BigIpResource.java b/core/src/com/cloud/network/resource/F5BigIpResource.java index 27745aedd2f..e904117919d 100644 --- a/core/src/com/cloud/network/resource/F5BigIpResource.java +++ b/core/src/com/cloud/network/resource/F5BigIpResource.java @@ -27,8 +27,11 @@ import iControl.CommonVirtualServerDefinition; import iControl.Interfaces; import iControl.LocalLBLBMethod; import iControl.LocalLBNodeAddressBindingStub; +import iControl.LocalLBPersistenceMode; import iControl.LocalLBPoolBindingStub; import iControl.LocalLBProfileContextType; +import iControl.LocalLBProfilePersistenceBindingStub; +import iControl.LocalLBProfileULong; import iControl.LocalLBVirtualServerBindingStub; import iControl.LocalLBVirtualServerVirtualServerPersistence; import iControl.LocalLBVirtualServerVirtualServerProfile; @@ -78,6 +81,7 @@ import com.cloud.host.Host; import com.cloud.network.rules.LbStickinessMethod.StickinessMethodType; import com.cloud.resource.ServerResource; import com.cloud.utils.NumbersUtil; +import com.cloud.utils.Pair; import com.cloud.utils.exception.ExecutionException; import com.cloud.utils.net.NetUtils; @@ -128,6 +132,7 @@ public class F5BigIpResource implements ServerResource { private NetworkingSelfIPBindingStub _selfIpApi; private NetworkingRouteDomainBindingStub _routeDomainApi; private SystemConfigSyncBindingStub _configSyncApi; + private LocalLBProfilePersistenceBindingStub _persistenceProfileApi; private String _objectNamePathSep = "-"; private String _routeDomainIdentifier = "%"; @@ -614,6 +619,7 @@ public class F5BigIpResource implements ServerResource { _selfIpApi = _interfaces.getNetworkingSelfIP(); _routeDomainApi = _interfaces.getNetworkingRouteDomain(); _configSyncApi = _interfaces.getSystemConfigSync(); + _persistenceProfileApi = _interfaces.getLocalLBProfilePersistence(); } catch (Exception e) { throw new ExecutionException("Failed to log in to BigIp appliance due to " + e.getMessage()); } @@ -635,9 +641,28 @@ public class F5BigIpResource implements ServerResource { if ((stickyPolicies != null) && (stickyPolicies.length > 0) && (stickyPolicies[0] != null)){ StickinessPolicyTO stickinessPolicy = stickyPolicies[0]; if (StickinessMethodType.LBCookieBased.getName().equalsIgnoreCase(stickinessPolicy.getMethodName())) { - _virtualServerApi.add_persistence_profile(genStringArray(virtualServerName), genPersistenceProfile("cookie")); - } else if (StickinessMethodType.SourceBased.getName().equalsIgnoreCase(stickinessPolicy.getMethodName())) { - _virtualServerApi.add_persistence_profile(genStringArray(virtualServerName), genPersistenceProfile("source_addr")); + + String[] profileNames = genStringArray("Cookie-profile-" + virtualServerName); + if (!persistenceProfileExists(profileNames[0])) { + LocalLBPersistenceMode[] lbPersistenceMode = new iControl.LocalLBPersistenceMode[1]; + lbPersistenceMode[0] = iControl.LocalLBPersistenceMode.PERSISTENCE_MODE_COOKIE; + _persistenceProfileApi.create(profileNames, lbPersistenceMode); + _virtualServerApi.add_persistence_profile(genStringArray(virtualServerName), genPersistenceProfile(profileNames[0])); + } + + List> paramsList = stickinessPolicy.getParams(); + for(Pair param : paramsList) { + if ("holdtime".equalsIgnoreCase(param.first())) { + long timeout = 180; //F5 default + if (param.second() != null) { + timeout = Long.parseLong(param.second()); + } + LocalLBProfileULong[] cookieTimeout = new LocalLBProfileULong[1]; + cookieTimeout[0] = new LocalLBProfileULong(); + cookieTimeout[0].setValue(timeout); + _persistenceProfileApi.set_cookie_expiration(profileNames, cookieTimeout); + } + } } } else { _virtualServerApi.remove_all_persistence_profiles(genStringArray(virtualServerName)); @@ -697,7 +722,24 @@ public class F5BigIpResource implements ServerResource { throw new ExecutionException(e.getMessage()); } } - + + private boolean persistenceProfileExists(String profileName) throws ExecutionException { + try { + String[] persistenceProfileArray = _persistenceProfileApi.get_list(); + if (persistenceProfileArray == null) { + return false; + } + for (String profile: persistenceProfileArray) { + if (profile.equalsIgnoreCase(profileName)) { + return true; + } + } + return false; + } catch (RemoteException e) { + throw new ExecutionException(e.getMessage()); + } + } + private iControl.CommonVirtualServerDefinition[] genVirtualServerDefinition(String name, LbProtocol protocol, String srcIp, long srcPort) { CommonVirtualServerDefinition vsDefs[] = {new CommonVirtualServerDefinition()}; vsDefs[0].setName(name); diff --git a/core/src/com/cloud/network/resource/JuniperSrxResource.java b/core/src/com/cloud/network/resource/JuniperSrxResource.java index 1fc5b1e9eef..3d680c29a39 100644 --- a/core/src/com/cloud/network/resource/JuniperSrxResource.java +++ b/core/src/com/cloud/network/resource/JuniperSrxResource.java @@ -622,7 +622,7 @@ public class JuniperSrxResource implements ServerResource { String guestVlanSubnet = NetUtils.getCidrSubNet(guestVlanGateway, cidrSize); Long publicVlanTag = null; - if (!ip.getVlanId().equals("untagged")) { + if (ip.getVlanId() != null && !ip.getVlanId().equals("untagged")) { try { publicVlanTag = Long.parseLong(ip.getVlanId()); } catch (Exception e) { diff --git a/core/src/com/cloud/network/resource/TrafficSentinelResource.java b/core/src/com/cloud/network/resource/TrafficSentinelResource.java index 23ce64b0def..18e33d0a3f3 100644 --- a/core/src/com/cloud/network/resource/TrafficSentinelResource.java +++ b/core/src/com/cloud/network/resource/TrafficSentinelResource.java @@ -229,11 +229,13 @@ public class TrafficSentinelResource implements ServerResource { in.close(); } catch (MalformedURLException e1) { s_logger.info("Invalid Traffic Sentinel URL",e1); + throw new ExecutionException(e1.getMessage()); } catch (IOException e) { s_logger.debug("Error in direct network usage accounting",e); + throw new ExecutionException(e.getMessage()); } } catch (Exception e) { - s_logger.error(e); + s_logger.debug(e); throw new ExecutionException(e.getMessage()); } return answer; diff --git a/ovm/scripts/vm/hypervisor/ovm/OvmHostModule.py b/ovm/scripts/vm/hypervisor/ovm/OvmHostModule.py index 910eff24e4d..10ae9760918 100755 --- a/ovm/scripts/vm/hypervisor/ovm/OvmHostModule.py +++ b/ovm/scripts/vm/hypervisor/ovm/OvmHostModule.py @@ -205,10 +205,14 @@ class OvmHost(OvmObject): dct = {} host = OvmHost() for name, id in l: - vmPath = host._getVmPathFromPrimaryStorage(name) - vmStatus = db_get_vm(vmPath) - dct[name] = vmStatus['status'] - + try: + vmPath = host._getVmPathFromPrimaryStorage(name) + vmStatus = db_get_vm(vmPath) + dct[name] = vmStatus['status'] + except Exception, e: + logger.debug(OvmHost.getAllVms, "Cannot find link for %s on primary storage, treat it as Error"%name) + dct[name] = 'ERROR' + scanStoppedVmOnPrimaryStorage(dct) rs = toGson(dct) logger.info(OvmHost.getAllVms, rs) diff --git a/ovm/scripts/vm/hypervisor/ovm/OvmStoragePoolModule.py b/ovm/scripts/vm/hypervisor/ovm/OvmStoragePoolModule.py index 06cf38054ee..2da53128039 100755 --- a/ovm/scripts/vm/hypervisor/ovm/OvmStoragePoolModule.py +++ b/ovm/scripts/vm/hypervisor/ovm/OvmStoragePoolModule.py @@ -374,6 +374,7 @@ if this doesn't resolve the problem, please check oracle manual to see how to of def copyToPrimary(secMountPoint, volumeFolderOnSecStorage, volumePath, primaryMountPath): srcPath = join(secMountPoint, volumeFolderOnSecStorage.lstrip("/"), volumePath.lstrip("/")) + if not srcPath.endswith(".raw"): srcPath = srcPath + ".raw" if not isfile(srcPath): raise Exception("Cannot find volume at %s"%srcPath) if not exists(primaryMountPath): raise Exception("Primary storage(%s) seems to have gone"%primaryMountPath) OvmStoragePool()._checkDirSizeForImage(primaryMountPath, srcPath) diff --git a/ovm/scripts/vm/hypervisor/ovm/OvmVmModule.py b/ovm/scripts/vm/hypervisor/ovm/OvmVmModule.py index 7257b6b8778..d4f81d73f5a 100755 --- a/ovm/scripts/vm/hypervisor/ovm/OvmVmModule.py +++ b/ovm/scripts/vm/hypervisor/ovm/OvmVmModule.py @@ -298,8 +298,13 @@ class OvmVm(OvmObject): return SUCC() logger.info(OvmVm.stop, "Stop vm %s"%vmName) - vmPath = OvmHost()._vmNameToPath(vmName) - # set the VM to RUNNING before starting, OVS agent will check this status + try: + vmPath = OvmHost()._vmNameToPath(vmName) + except Exception, e: + errmsg = fmt_err_msg(e) + logger.info(OvmVm.stop, "Cannot find link for vm %s on primary storage, treating it as stopped\n %s"%(vmName, errmsg)) + return SUCC() + # set the VM to RUNNING before stopping, OVS agent will check this status set_vm_status(vmPath, 'RUNNING') raiseExceptionIfFail(stop_vm(vmPath)) return SUCC() diff --git a/ovm/src/com/cloud/ovm/hypervisor/OvmResourceBase.java b/ovm/src/com/cloud/ovm/hypervisor/OvmResourceBase.java index b7ab51e21f1..8782de9e8be 100755 --- a/ovm/src/com/cloud/ovm/hypervisor/OvmResourceBase.java +++ b/ovm/src/com/cloud/ovm/hypervisor/OvmResourceBase.java @@ -695,7 +695,14 @@ public class OvmResourceBase implements ServerResource, HypervisorResource { } try { - OvmVm.Details vm = OvmVm.getDetails(_conn, vmName); + OvmVm.Details vm = null; + try { + vm = OvmVm.getDetails(_conn, vmName); + } catch (XmlRpcException e) { + s_logger.debug("Unable to get details of vm: " + vmName + ", treating it as stopped", e); + return new StopAnswer(cmd, "success", 0, 0L, 0L); + } + deleteAllNetworkRulesForVm(vmName); OvmVm.stop(_conn, vmName); cleanup(vm); diff --git a/patches/systemvm/debian/config/etc/iptables/iptables-router b/patches/systemvm/debian/config/etc/iptables/iptables-router index 5ac162a7b85..e1972e3a12d 100644 --- a/patches/systemvm/debian/config/etc/iptables/iptables-router +++ b/patches/systemvm/debian/config/etc/iptables/iptables-router @@ -22,6 +22,8 @@ COMMIT -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i eth0 -o eth2 -j ACCEPT -A FORWARD -i eth2 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT +-A FORWARD -i eth0 -o eth0 -m state --state NEW -j ACCEPT +-A FORWARD -i eth0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT COMMIT *mangle :PREROUTING ACCEPT [0:0] diff --git a/patches/systemvm/debian/config/root/firewall.sh b/patches/systemvm/debian/config/root/firewall.sh index 7cc9ab5a30a..4dd0e9eb6c6 100755 --- a/patches/systemvm/debian/config/root/firewall.sh +++ b/patches/systemvm/debian/config/root/firewall.sh @@ -48,6 +48,22 @@ ip_to_dev() { return 1 } +doHairpinNat () { + local vrGuestIPNetwork=$(sudo ip addr show dev eth0 | grep inet | grep eth0 | awk '{print $2}' ) + local vrGuestIP=$(echo $vrGuestIPNetwork | awk -F'/' '{print $1}') + + local publicIp=$1 + local prot=$2 + local port=$3 + local guestVmIp=$4 + local guestPort=$(echo $5 | sed 's/:/-/') + local op=$6 + logger -t cloud "$(basename $0): create HairPin entry : public ip=$publicIp \ + instance ip=$guestVmIp proto=$proto portRange=$guestPort op=$op" + + (sudo iptables -t nat $op PREROUTING -d $publicIp -i eth0 -p $prot --dport $port -j DNAT --to-destination $guestVmIp:$guestPort &>> $OUTFILE || [ "$op" == "-D" ]) && + (sudo iptables -t nat $op POSTROUTING -s $vrGuestIPNetwork -p $prot --dport $port -d $guestVmIp -j SNAT -o eth0 --to-source $vrGuestIP &>> $OUTFILE || [ "$op" == "-D" ]) +} #Port (address translation) forwarding for tcp or udp tcp_or_udp_entry() { @@ -78,6 +94,7 @@ tcp_or_udp_entry() { --destination-port $port -j MARK --set-mark $tableNo &>> $OUTFILE || [ "$op" == "-D" ]) && (sudo iptables -t mangle $op PREROUTING --proto $proto -i $dev -d $publicIp \ --destination-port $port -m state --state NEW -j CONNMARK --save-mark &>> $OUTFILE || [ "$op" == "-D" ]) && + (doHairpinNat $publicIp $proto $port $instIp $dport0 $op) && (sudo iptables -t nat $op OUTPUT --proto $proto -d $publicIp \ --destination-port $port -j DNAT \ --to-destination $instIp:$dport &>> $OUTFILE || [ "$op" == "-D" ]) && @@ -141,6 +158,7 @@ one_to_one_fw_entry() { (sudo iptables -t nat $op PREROUTING -i $dev -d $publicIp --proto $proto \ --destination-port $portRange -j DNAT \ --to-destination $instIp &>> $OUTFILE || [ "$op" == "-D" ]) && + (doHairpinNat $publicIp $proto $portRange $instIp $portRange $op) && (sudo iptables $op FORWARD -i $dev -o eth0 -d $instIp --proto $proto \ --destination-port $portRange -m state \ --state NEW -j ACCEPT &>> $OUTFILE ) diff --git a/patches/systemvm/debian/config/root/ipassoc.sh b/patches/systemvm/debian/config/root/ipassoc.sh index 0ea90004405..3fdc3f17d9f 100644 --- a/patches/systemvm/debian/config/root/ipassoc.sh +++ b/patches/systemvm/debian/config/root/ipassoc.sh @@ -214,7 +214,7 @@ add_snat() { local ipNoMask=$(echo $1 | awk -F'/' '{print $1}') logger -t cloud "$(basename $0):Added SourceNAT $pubIp on interface $ethDev" sudo iptables -t nat -D POSTROUTING -j SNAT -o $ethDev --to-source $ipNoMask ; - sudo iptables -t nat -I POSTROUTING -j SNAT -o $ethDev --to-source $ipNoMask ; + sudo iptables -t nat -A POSTROUTING -j SNAT -o $ethDev --to-source $ipNoMask ; return $? } remove_snat() { diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index 0049a44cec0..071479b71fb 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -715,7 +715,7 @@ public class ApiResponseHelper implements ResponseGenerator { ipResponse.setZoneId(zoneId); ipResponse.setZoneName(ApiDBUtils.findZoneById(ipAddress.getDataCenterId()).getName()); ipResponse.setSourceNat(ipAddress.isSourceNat()); - ipResponse.setIsElastic(ipAddress.getElastic()); + ipResponse.setIsSystem(ipAddress.getSystem()); // get account information populateOwner(ipResponse, ipAddress); @@ -727,7 +727,11 @@ public class ApiResponseHelper implements ResponseGenerator { UserVm vm = ApiDBUtils.findUserVmById(ipAddress.getAssociatedWithVmId()); ipResponse.setVirtualMachineId(vm.getId()); ipResponse.setVirtualMachineName(vm.getHostName()); - ipResponse.setVirtualMachineDisplayName(vm.getDisplayName()); + if (vm.getDisplayName() != null) { + ipResponse.setVirtualMachineDisplayName(vm.getDisplayName()); + } else { + ipResponse.setVirtualMachineDisplayName(vm.getHostName()); + } } ipResponse.setAssociatedNetworkId(ipAddress.getAssociatedWithNetworkId()); @@ -760,7 +764,7 @@ public class ApiResponseHelper implements ResponseGenerator { ipResponse.setVlanName(ApiDBUtils.findVlanById(ipAddress.getVlanId()).getVlanTag()); } - if (ipAddress.getElastic()) { + if (ipAddress.getSystem()) { if (ipAddress.isOneToOneNat()) { ipResponse.setPurpose(IpAddress.Purpose.StaticNat.toString()); } else { @@ -972,7 +976,11 @@ public class ApiResponseHelper implements ResponseGenerator { volResponse.setVirtualMachineName(vm.getHostName()); UserVm userVm = ApiDBUtils.findUserVmById(vm.getId()); if (userVm != null) { - volResponse.setVirtualMachineDisplayName(userVm.getDisplayName()); + if (userVm.getDisplayName() != null) { + volResponse.setVirtualMachineDisplayName(userVm.getDisplayName()); + } else { + volResponse.setVirtualMachineDisplayName(userVm.getHostName()); + } volResponse.setVirtualMachineState(vm.getState().toString()); } else { s_logger.error("User Vm with Id: " + instanceId + " does not exist for volume " + volume.getId()); @@ -1175,7 +1183,12 @@ public class ApiResponseHelper implements ResponseGenerator { if (vm != null) { response.setVirtualMachineId(vm.getId()); response.setVirtualMachineName(vm.getHostName()); - response.setVirtualMachineDisplayName(vm.getDisplayName()); + + if (vm.getDisplayName() != null) { + response.setVirtualMachineDisplayName(vm.getDisplayName()); + } else { + response.setVirtualMachineDisplayName(vm.getHostName()); + } } } FirewallRule.State state = fwRule.getState(); @@ -1203,7 +1216,11 @@ public class ApiResponseHelper implements ResponseGenerator { if (vm != null) {// vm might be destroyed response.setVirtualMachineId(vm.getId()); response.setVirtualMachineName(vm.getHostName()); - response.setVirtualMachineDisplayName(vm.getDisplayName()); + if (vm.getDisplayName() != null) { + response.setVirtualMachineDisplayName(vm.getDisplayName()); + } else { + response.setVirtualMachineDisplayName(vm.getHostName()); + } } } FirewallRule.State state = fwRule.getState(); diff --git a/server/src/com/cloud/api/commands/GetUsageRecordsCmd.java b/server/src/com/cloud/api/commands/GetUsageRecordsCmd.java index 968c7792d62..0e217b6e2f0 100644 --- a/server/src/com/cloud/api/commands/GetUsageRecordsCmd.java +++ b/server/src/com/cloud/api/commands/GetUsageRecordsCmd.java @@ -261,8 +261,8 @@ public class GetUsageRecordsCmd extends BaseListCmd { } else if(usageRecord.getUsageType() == UsageTypes.IP_ADDRESS){ //isSourceNAT usageRecResponse.setSourceNat((usageRecord.getType().equals("SourceNat"))?true:false); - //isElastic - usageRecResponse.setElastic((usageRecord.getSize() == 1)?true:false); + //isSystem + usageRecResponse.setSystem((usageRecord.getSize() == 1)?true:false); //IP Address ID usageRecResponse.setUsageId(identityDao.getIdentityUuid("user_ip_address", usageRecord.getUsageId().toString())); diff --git a/server/src/com/cloud/capacity/CapacityManagerImpl.java b/server/src/com/cloud/capacity/CapacityManagerImpl.java index 7563a0ebfa9..5f6dae15516 100755 --- a/server/src/com/cloud/capacity/CapacityManagerImpl.java +++ b/server/src/com/cloud/capacity/CapacityManagerImpl.java @@ -633,7 +633,7 @@ public class CapacityManagerImpl implements CapacityManager, StateListener supportedServicesStr = cmd.getSupportedServices(); Object specifyIpRanges = cmd.getSpecifyIpRanges(); + String tags = cmd.getTags(); if (zoneId != null) { zone = getZone(zoneId); @@ -3483,6 +3484,14 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura if (id != null) { sc.addAnd("id", SearchCriteria.Op.EQ, id); } + + if (tags != null) { + if (tags.isEmpty()) { + sc.addAnd("tags", SearchCriteria.Op.NULL); + } else { + sc.addAnd("tags", SearchCriteria.Op.EQ, tags); + } + } List offerings = _networkOfferingDao.search(sc, searchFilter); Boolean sourceNatSupported = cmd.getSourceNatSupported(); diff --git a/server/src/com/cloud/configuration/DefaultComponentLibrary.java b/server/src/com/cloud/configuration/DefaultComponentLibrary.java index 5ae6226fd5b..6f0b0f07367 100755 --- a/server/src/com/cloud/configuration/DefaultComponentLibrary.java +++ b/server/src/com/cloud/configuration/DefaultComponentLibrary.java @@ -72,7 +72,7 @@ import com.cloud.keystore.KeystoreDaoImpl; import com.cloud.keystore.KeystoreManagerImpl; import com.cloud.maint.UpgradeManagerImpl; import com.cloud.maint.dao.AgentUpgradeDaoImpl; -import com.cloud.network.ExternalLoadBalancerDeviceManagerImpl; +import com.cloud.network.ExternalLoadBalancerUsageManagerImpl; import com.cloud.network.NetworkManagerImpl; import com.cloud.network.StorageNetworkManagerImpl; import com.cloud.network.dao.ExternalFirewallDeviceDaoImpl; @@ -388,7 +388,7 @@ public class DefaultComponentLibrary extends ComponentLibraryBase implements Com addManager("ElasticLoadBalancerManager", ElasticLoadBalancerManagerImpl.class); addManager("SwiftManager", SwiftManagerImpl.class); addManager("StorageNetworkManager", StorageNetworkManagerImpl.class); - addManager("ExternalLoadBalancerDeviceManager", ExternalLoadBalancerDeviceManagerImpl.class); + addManager("ExternalLoadBalancerUsageManager", ExternalLoadBalancerUsageManagerImpl.class); addManager("HA Manager", HighAvailabilityManagerImpl.class); } diff --git a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManager.java b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManager.java index 075e94b21a3..6614d8455d7 100644 --- a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManager.java +++ b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManager.java @@ -101,11 +101,4 @@ public interface ExternalLoadBalancerDeviceManager extends Manager{ public boolean manageGuestNetworkWithExternalLoadBalancer(boolean add, Network guestConfig) throws ResourceUnavailableException, InsufficientCapacityException; - /** - * updates the network usage stats for a LB rule, associated with an external LB device, that is being revoked as part of Delete LB rule or release IP actions - * @param loadBalancerRuleId - */ - public void updateExternalLoadBalancerNetworkUsageStats(long loadBalancerRuleId); - - } diff --git a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java index 86822b781c2..9a05e575dc9 100644 --- a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java +++ b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java @@ -25,19 +25,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; -import javax.ejb.Local; import javax.naming.ConfigurationException; import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; -import com.cloud.agent.api.ExternalNetworkResourceUsageAnswer; -import com.cloud.agent.api.ExternalNetworkResourceUsageCommand; import com.cloud.agent.api.StartupCommand; import com.cloud.agent.api.StartupExternalLoadBalancerCommand; import com.cloud.agent.api.routing.CreateLoadBalancerApplianceCommand; @@ -108,28 +102,22 @@ import com.cloud.resource.UnableDeleteHostException; import com.cloud.server.api.response.ExternalLoadBalancerResponse; import com.cloud.user.Account; import com.cloud.user.AccountManager; -import com.cloud.user.AccountVO; -import com.cloud.user.UserStatisticsVO; import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.UserStatisticsDao; import com.cloud.utils.NumbersUtil; import com.cloud.utils.component.AdapterBase; import com.cloud.utils.component.Inject; -import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.db.DB; import com.cloud.utils.db.GlobalLock; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.exception.ExecutionException; import com.cloud.utils.net.NetUtils; import com.cloud.utils.net.UrlUtil; -import com.cloud.vm.DomainRouterVO; import com.cloud.vm.Nic.ReservationStrategy; import com.cloud.vm.Nic.State; import com.cloud.vm.NicVO; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.NicDao; -@Local(value = { ExternalLoadBalancerDeviceManager.class }) public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase implements ExternalLoadBalancerDeviceManager, ResourceStateAdapter { @Inject @@ -189,8 +177,6 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase @Inject protected HostPodDao _podDao = null; - ScheduledExecutorService _executor; - private int _externalNetworkStatsInterval; private long _defaultLbCapacity; private static final org.apache.log4j.Logger s_logger = Logger.getLogger(ExternalLoadBalancerDeviceManagerImpl.class); @@ -1005,11 +991,6 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase @Override public boolean configure(String name, Map params) throws ConfigurationException { super.configure(name, params); - _externalNetworkStatsInterval = NumbersUtil.parseInt(_configDao.getValue(Config.ExternalNetworkStatsInterval.key()), 300); - if (_externalNetworkStatsInterval > 0) { - _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("ExternalNetworkMonitor")); - } - _defaultLbCapacity = NumbersUtil.parseLong(_configDao.getValue(Config.DefaultExternalLoadBalancerCapacity.key()), 50); _resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this); return true; @@ -1017,9 +998,6 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase @Override public boolean start() { - if (_externalNetworkStatsInterval > 0) { - _executor.scheduleAtFixedRate(new ExternalLoadBalancerDeviceNetworkUsageTask(), _externalNetworkStatsInterval, _externalNetworkStatsInterval, TimeUnit.SECONDS); - } return true; } @@ -1028,382 +1006,6 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase return true; } - protected class ExternalLoadBalancerDeviceNetworkUsageTask implements Runnable { - - public ExternalLoadBalancerDeviceNetworkUsageTask() { - - } - - @Override - public void run() { - GlobalLock scanLock = GlobalLock.getInternLock("ExternalLoadBalancerDeviceManagerImpl"); - try { - if (scanLock.lock(20)) { - try { - runExternalLoadBalancerNetworkUsageTask(); - } finally { - scanLock.unlock(); - } - } - } catch (Exception e) { - s_logger.warn("Problems while getting external load balancer device usage", e); - } finally { - scanLock.releaseRef(); - } - } - - private void runExternalLoadBalancerNetworkUsageTask() { - s_logger.debug("External load balancer devices stats collector is running..."); - - for (DataCenterVO zone : _dcDao.listAll()) { - List domainRoutersInZone = _routerDao.listByDataCenter(zone.getId()); - if (domainRoutersInZone == null) { - continue; - } - Map lbDeviceUsageAnswerMap = new HashMap(); - List accountsProcessed = new ArrayList(); - - for (DomainRouterVO domainRouter : domainRoutersInZone) { - long accountId = domainRouter.getAccountId(); - - if (accountsProcessed.contains(new Long(accountId))) { - if (s_logger.isTraceEnabled()) { - s_logger.trace("Networks for Account " + accountId + " are already processed for external network usage, so skipping usage check."); - } - continue; - } - - long zoneId = zone.getId(); - - List networksForAccount = _networkDao.listBy(accountId, zoneId, Network.GuestType.Isolated); - if (networksForAccount == null) { - continue; - } - - for (NetworkVO network : networksForAccount) { - if (!_networkMgr.networkIsConfiguredForExternalNetworking(zoneId, network.getId())) { - s_logger.debug("Network " + network.getId() + " is not configured for external networking, so skipping usage check."); - continue; - } - - ExternalLoadBalancerDeviceVO lbDeviceVO = getExternalLoadBalancerForNetwork(network); - if (lbDeviceVO == null) { - continue; - } - - // Get network stats from the external load balancer - ExternalNetworkResourceUsageAnswer lbAnswer = null; - HostVO externalLoadBalancer = _hostDao.findById(lbDeviceVO.getHostId()); - if (externalLoadBalancer != null) { - Long lbDeviceId = new Long(externalLoadBalancer.getId()); - if (!lbDeviceUsageAnswerMap.containsKey(lbDeviceId)) { - ExternalNetworkResourceUsageCommand cmd = new ExternalNetworkResourceUsageCommand(); - lbAnswer = (ExternalNetworkResourceUsageAnswer) _agentMgr.easySend(externalLoadBalancer.getId(), cmd); - if (lbAnswer == null || !lbAnswer.getResult()) { - String details = (lbAnswer != null) ? lbAnswer.getDetails() : "details unavailable"; - String msg = "Unable to get external load balancer stats for " + zone.getName() + " due to: " + details + "."; - s_logger.error(msg); - continue; - } - lbDeviceUsageAnswerMap.put(lbDeviceId, lbAnswer); - } else { - if (s_logger.isTraceEnabled()) { - s_logger.trace("Reusing usage Answer for device id " + lbDeviceId + "for Network " + network.getId()); - } - lbAnswer = lbDeviceUsageAnswerMap.get(lbDeviceId); - } - } - - AccountVO account = _accountDao.findById(accountId); - if (account == null) { - s_logger.debug("Skipping stats update for account with ID " + accountId); - continue; - } - - if (!manageStatsEntries(true, accountId, zoneId, network, externalLoadBalancer, lbAnswer)) { - continue; - } - - manageStatsEntries(false, accountId, zoneId, network, externalLoadBalancer, lbAnswer); - } - - accountsProcessed.add(new Long(accountId)); - } - } - } - - private boolean updateBytes(UserStatisticsVO userStats, long newCurrentBytesSent, long newCurrentBytesReceived) { - long oldNetBytesSent = userStats.getNetBytesSent(); - long oldNetBytesReceived = userStats.getNetBytesReceived(); - long oldCurrentBytesSent = userStats.getCurrentBytesSent(); - long oldCurrentBytesReceived = userStats.getCurrentBytesReceived(); - String warning = "Received an external network stats byte count that was less than the stored value. Zone ID: " + userStats.getDataCenterId() + ", account ID: " + userStats.getAccountId() + "."; - - userStats.setCurrentBytesSent(newCurrentBytesSent); - if (oldCurrentBytesSent > newCurrentBytesSent) { - s_logger.warn(warning + "Stored bytes sent: " + oldCurrentBytesSent + ", new bytes sent: " + newCurrentBytesSent + "."); - userStats.setNetBytesSent(oldNetBytesSent + oldCurrentBytesSent); - } - - userStats.setCurrentBytesReceived(newCurrentBytesReceived); - if (oldCurrentBytesReceived > newCurrentBytesReceived) { - s_logger.warn(warning + "Stored bytes received: " + oldCurrentBytesReceived + ", new bytes received: " + newCurrentBytesReceived + "."); - userStats.setNetBytesReceived(oldNetBytesReceived + oldCurrentBytesReceived); - } - - return _userStatsDao.update(userStats.getId(), userStats); - } - - // Creates a new stats entry for the specified parameters, if one doesn't already exist. - private boolean createStatsEntry(long accountId, long zoneId, long networkId, String publicIp, long hostId) { - HostVO host = _hostDao.findById(hostId); - UserStatisticsVO userStats = _userStatsDao.findBy(accountId, zoneId, networkId, publicIp, hostId, host.getType().toString()); - if (userStats == null) { - return (_userStatsDao.persist(new UserStatisticsVO(accountId, zoneId, publicIp, hostId, host.getType().toString(), networkId)) != null); - } else { - return true; - } - } - - // Updates an existing stats entry with new data from the specified usage answer. - private boolean updateStatsEntry(long accountId, long zoneId, long networkId, String publicIp, long hostId, ExternalNetworkResourceUsageAnswer answer) { - AccountVO account = _accountDao.findById(accountId); - DataCenterVO zone = _dcDao.findById(zoneId); - NetworkVO network = _networkDao.findById(networkId); - HostVO host = _hostDao.findById(hostId); - String statsEntryIdentifier = "account " + account.getAccountName() + ", zone " + zone.getName() + ", network ID " + networkId + ", host ID " + host.getName(); - - long newCurrentBytesSent = 0; - long newCurrentBytesReceived = 0; - - if (publicIp != null) { - long[] bytesSentAndReceived = null; - statsEntryIdentifier += ", public IP: " + publicIp; - - if (host.getType().equals(Host.Type.ExternalLoadBalancer) && externalLoadBalancerIsInline(host)) { - // Look up stats for the guest IP address that's mapped to the public IP address - InlineLoadBalancerNicMapVO mapping = _inlineLoadBalancerNicMapDao.findByPublicIpAddress(publicIp); - - if (mapping != null) { - NicVO nic = _nicDao.findById(mapping.getNicId()); - String loadBalancingIpAddress = nic.getIp4Address(); - bytesSentAndReceived = answer.ipBytes.get(loadBalancingIpAddress); - - if (bytesSentAndReceived != null) { - bytesSentAndReceived[0] = 0; - } - } - } else { - bytesSentAndReceived = answer.ipBytes.get(publicIp); - } - - if (bytesSentAndReceived == null) { - s_logger.debug("Didn't get an external network usage answer for public IP " + publicIp); - } else { - newCurrentBytesSent += bytesSentAndReceived[0]; - newCurrentBytesReceived += bytesSentAndReceived[1]; - } - } else { - URI broadcastURI = network.getBroadcastUri(); - if (broadcastURI == null) { - s_logger.debug("Not updating stats for guest network with ID " + network.getId() + " because the network is not implemented."); - return true; - } else { - long vlanTag = Integer.parseInt(broadcastURI.getHost()); - long[] bytesSentAndReceived = answer.guestVlanBytes.get(String.valueOf(vlanTag)); - - if (bytesSentAndReceived == null) { - s_logger.warn("Didn't get an external network usage answer for guest VLAN " + vlanTag); - } else { - newCurrentBytesSent += bytesSentAndReceived[0]; - newCurrentBytesReceived += bytesSentAndReceived[1]; - } - } - } - - UserStatisticsVO userStats; - try { - userStats = _userStatsDao.lock(accountId, zoneId, networkId, publicIp, hostId, host.getType().toString()); - } catch (Exception e) { - s_logger.warn("Unable to find user stats entry for " + statsEntryIdentifier); - return false; - } - - if (updateBytes(userStats, newCurrentBytesSent, newCurrentBytesReceived)) { - s_logger.debug("Successfully updated stats for " + statsEntryIdentifier); - return true; - } else { - s_logger.debug("Failed to update stats for " + statsEntryIdentifier); - return false; - } - } - - private boolean createOrUpdateStatsEntry(boolean create, long accountId, long zoneId, long networkId, String publicIp, long hostId, ExternalNetworkResourceUsageAnswer answer) { - if (create) { - return createStatsEntry(accountId, zoneId, networkId, publicIp, hostId); - } else { - return updateStatsEntry(accountId, zoneId, networkId, publicIp, hostId, answer); - } - } - - /* - * Creates/updates all necessary stats entries for an account and zone. - * Stats entries are created for source NAT IP addresses, static NAT rules, port forwarding rules, and load - * balancing rules - */ - private boolean manageStatsEntries(boolean create, long accountId, long zoneId, Network network, - HostVO externalLoadBalancer, ExternalNetworkResourceUsageAnswer lbAnswer) { - String accountErrorMsg = "Failed to update external network stats entry. Details: account ID = " + accountId; - Transaction txn = Transaction.open(Transaction.CLOUD_DB); - try { - txn.start(); - String networkErrorMsg = accountErrorMsg + ", network ID = " + network.getId(); - - // If an external load balancer is added, manage one entry for each load balancing rule in this network - if (externalLoadBalancer != null && lbAnswer != null) { - List loadBalancers = _loadBalancerDao.listByNetworkId(network.getId()); - for (LoadBalancerVO loadBalancer : loadBalancers) { - String publicIp = _networkMgr.getIp(loadBalancer.getSourceIpAddressId()).getAddress().addr(); - if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), publicIp, externalLoadBalancer.getId(), lbAnswer)) { - throw new ExecutionException(networkErrorMsg + ", load balancing rule public IP = " + publicIp); - } - } - } - return txn.commit(); - } catch (Exception e) { - s_logger.warn("Exception: ", e); - txn.rollback(); - return false; - } finally { - txn.close(); - } - } - } - - @Override - public void updateExternalLoadBalancerNetworkUsageStats(long loadBalancerRuleId){ - - LoadBalancerVO lb = _loadBalancerDao.findById(loadBalancerRuleId); - if(lb == null){ - if(s_logger.isDebugEnabled()){ - s_logger.debug("Cannot update usage stats, LB rule is not found"); - } - return; - } - long networkId = lb.getNetworkId(); - Network network = _networkDao.findById(networkId); - if(network == null){ - if(s_logger.isDebugEnabled()){ - s_logger.debug("Cannot update usage stats, Network is not found"); - } - return; - } - ExternalLoadBalancerDeviceVO lbDeviceVO = getExternalLoadBalancerForNetwork(network); - if (lbDeviceVO == null) { - if(s_logger.isDebugEnabled()){ - s_logger.debug("Cannot update usage stats, No external LB device found"); - } - return; - } - - // Get network stats from the external load balancer - ExternalNetworkResourceUsageAnswer lbAnswer = null; - HostVO externalLoadBalancer = _hostDao.findById(lbDeviceVO.getHostId()); - if (externalLoadBalancer != null) { - ExternalNetworkResourceUsageCommand cmd = new ExternalNetworkResourceUsageCommand(); - lbAnswer = (ExternalNetworkResourceUsageAnswer) _agentMgr.easySend(externalLoadBalancer.getId(), cmd); - if (lbAnswer == null || !lbAnswer.getResult()) { - String details = (lbAnswer != null) ? lbAnswer.getDetails() : "details unavailable"; - String msg = "Unable to get external load balancer stats for network" + networkId + " due to: " + details + "."; - s_logger.error(msg); - return; - } - } - - long accountId = lb.getAccountId(); - AccountVO account = _accountDao.findById(accountId); - if (account == null) { - s_logger.debug("Skipping stats update for external LB for account with ID " + accountId); - return; - } - - String publicIp = _networkMgr.getIp(lb.getSourceIpAddressId()).getAddress().addr(); - DataCenterVO zone = _dcDao.findById(network.getDataCenterId()); - String statsEntryIdentifier = "account " + account.getAccountName() + ", zone " + zone.getName() + ", network ID " + networkId + ", host ID " + externalLoadBalancer.getName(); - - long newCurrentBytesSent = 0; - long newCurrentBytesReceived = 0; - - if (publicIp != null) { - long[] bytesSentAndReceived = null; - statsEntryIdentifier += ", public IP: " + publicIp; - - if (externalLoadBalancer.getType().equals(Host.Type.ExternalLoadBalancer) && externalLoadBalancerIsInline(externalLoadBalancer)) { - // Look up stats for the guest IP address that's mapped to the public IP address - InlineLoadBalancerNicMapVO mapping = _inlineLoadBalancerNicMapDao.findByPublicIpAddress(publicIp); - - if (mapping != null) { - NicVO nic = _nicDao.findById(mapping.getNicId()); - String loadBalancingIpAddress = nic.getIp4Address(); - bytesSentAndReceived = lbAnswer.ipBytes.get(loadBalancingIpAddress); - - if (bytesSentAndReceived != null) { - bytesSentAndReceived[0] = 0; - } - } - } else { - bytesSentAndReceived = lbAnswer.ipBytes.get(publicIp); - } - - if (bytesSentAndReceived == null) { - s_logger.debug("Didn't get an external network usage answer for public IP " + publicIp); - } else { - newCurrentBytesSent += bytesSentAndReceived[0]; - newCurrentBytesReceived += bytesSentAndReceived[1]; - } - - UserStatisticsVO userStats; - final Transaction txn = Transaction.currentTxn(); - try { - txn.start(); - userStats = _userStatsDao.lock(accountId, zone.getId(), networkId, publicIp, externalLoadBalancer.getId(), externalLoadBalancer.getType().toString()); - - if(userStats != null){ - long oldNetBytesSent = userStats.getNetBytesSent(); - long oldNetBytesReceived = userStats.getNetBytesReceived(); - long oldCurrentBytesSent = userStats.getCurrentBytesSent(); - long oldCurrentBytesReceived = userStats.getCurrentBytesReceived(); - String warning = "Received an external network stats byte count that was less than the stored value. Zone ID: " + userStats.getDataCenterId() + ", account ID: " + userStats.getAccountId() + "."; - - userStats.setCurrentBytesSent(newCurrentBytesSent); - if (oldCurrentBytesSent > newCurrentBytesSent) { - s_logger.warn(warning + "Stored bytes sent: " + oldCurrentBytesSent + ", new bytes sent: " + newCurrentBytesSent + "."); - userStats.setNetBytesSent(oldNetBytesSent + oldCurrentBytesSent); - } - - userStats.setCurrentBytesReceived(newCurrentBytesReceived); - if (oldCurrentBytesReceived > newCurrentBytesReceived) { - s_logger.warn(warning + "Stored bytes received: " + oldCurrentBytesReceived + ", new bytes received: " + newCurrentBytesReceived + "."); - userStats.setNetBytesReceived(oldNetBytesReceived + oldCurrentBytesReceived); - } - - if (_userStatsDao.update(userStats.getId(), userStats)) { - s_logger.debug("Successfully updated stats for " + statsEntryIdentifier); - } else { - s_logger.debug("Failed to update stats for " + statsEntryIdentifier); - } - }else { - s_logger.warn("Unable to find user stats entry for " + statsEntryIdentifier); - } - - txn.commit(); - }catch (final Exception e) { - txn.rollback(); - throw new CloudRuntimeException("Problem getting stats after reboot/stop ", e); - } - } - } - @Override public HostVO createHostVOForConnectedAgent(HostVO host, StartupCommand[] cmd) { // TODO Auto-generated method stub diff --git a/server/src/com/cloud/network/ExternalLoadBalancerUsageManager.java b/server/src/com/cloud/network/ExternalLoadBalancerUsageManager.java new file mode 100644 index 00000000000..0d75d439984 --- /dev/null +++ b/server/src/com/cloud/network/ExternalLoadBalancerUsageManager.java @@ -0,0 +1,36 @@ +/** + * * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved +* + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It 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 3 of the License, or any later version. + * This program 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 this program. If not, see . + * + */ + +package com.cloud.network; + +import com.cloud.utils.component.Manager; + +/* ExternalLoadBalancerUsageManager implements a periodic task that retrieves and updates the network usage stats from all external load balancer devices. + */ + +public interface ExternalLoadBalancerUsageManager extends Manager{ + + /** + * updates the network usage stats for a LB rule, associated with an external LB device, that is being revoked as part of Delete LB rule or release IP actions + * @param loadBalancerRuleId + */ + public void updateExternalLoadBalancerNetworkUsageStats(long loadBalancerRuleId); + + +} diff --git a/server/src/com/cloud/network/ExternalLoadBalancerUsageManagerImpl.java b/server/src/com/cloud/network/ExternalLoadBalancerUsageManagerImpl.java new file mode 100644 index 00000000000..488f64aaac3 --- /dev/null +++ b/server/src/com/cloud/network/ExternalLoadBalancerUsageManagerImpl.java @@ -0,0 +1,546 @@ +package com.cloud.network; + +import java.net.URI; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import javax.ejb.Local; +import javax.naming.ConfigurationException; + +import org.apache.log4j.Logger; + +import com.cloud.agent.AgentManager; +import com.cloud.agent.api.ExternalNetworkResourceUsageAnswer; +import com.cloud.agent.api.ExternalNetworkResourceUsageCommand; +import com.cloud.configuration.Config; +import com.cloud.configuration.dao.ConfigurationDao; +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.dc.dao.HostPodDao; +import com.cloud.dc.dao.VlanDao; +import com.cloud.host.DetailVO; +import com.cloud.host.Host; +import com.cloud.host.HostVO; +import com.cloud.host.dao.HostDao; +import com.cloud.host.dao.HostDetailsDao; +import com.cloud.network.dao.ExternalFirewallDeviceDao; +import com.cloud.network.dao.ExternalLoadBalancerDeviceDao; +import com.cloud.network.dao.IPAddressDao; +import com.cloud.network.dao.InlineLoadBalancerNicMapDao; +import com.cloud.network.dao.LoadBalancerDao; +import com.cloud.network.dao.NetworkDao; +import com.cloud.network.dao.NetworkExternalFirewallDao; +import com.cloud.network.dao.NetworkExternalLoadBalancerDao; +import com.cloud.network.dao.NetworkServiceMapDao; +import com.cloud.network.dao.PhysicalNetworkDao; +import com.cloud.network.dao.PhysicalNetworkServiceProviderDao; +import com.cloud.network.rules.dao.PortForwardingRulesDao; +import com.cloud.offerings.dao.NetworkOfferingDao; +import com.cloud.resource.ResourceManager; +import com.cloud.user.AccountManager; +import com.cloud.user.AccountVO; +import com.cloud.user.UserStatisticsVO; +import com.cloud.user.dao.AccountDao; +import com.cloud.user.dao.UserStatisticsDao; +import com.cloud.utils.NumbersUtil; +import com.cloud.utils.component.Inject; +import com.cloud.utils.concurrency.NamedThreadFactory; +import com.cloud.utils.db.GlobalLock; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.exception.ExecutionException; +import com.cloud.vm.DomainRouterVO; +import com.cloud.vm.NicVO; +import com.cloud.vm.dao.DomainRouterDao; +import com.cloud.vm.dao.NicDao; + +@Local(value = { ExternalLoadBalancerUsageManager.class }) +public class ExternalLoadBalancerUsageManagerImpl implements ExternalLoadBalancerUsageManager { + + String _name; + @Inject + NetworkExternalLoadBalancerDao _networkExternalLBDao; + @Inject + ExternalLoadBalancerDeviceDao _externalLoadBalancerDeviceDao; + @Inject + HostDao _hostDao; + @Inject + DataCenterDao _dcDao; + @Inject + NetworkManager _networkMgr; + @Inject + InlineLoadBalancerNicMapDao _inlineLoadBalancerNicMapDao; + @Inject + NicDao _nicDao; + @Inject + AgentManager _agentMgr; + @Inject + ResourceManager _resourceMgr; + @Inject + IPAddressDao _ipAddressDao; + @Inject + VlanDao _vlanDao; + @Inject + NetworkOfferingDao _networkOfferingDao; + @Inject + AccountDao _accountDao; + @Inject + PhysicalNetworkDao _physicalNetworkDao; + @Inject + PhysicalNetworkServiceProviderDao _physicalNetworkServiceProviderDao; + @Inject + AccountManager _accountMgr; + @Inject + UserStatisticsDao _userStatsDao; + @Inject + NetworkDao _networkDao; + @Inject + DomainRouterDao _routerDao; + @Inject + LoadBalancerDao _loadBalancerDao; + @Inject + PortForwardingRulesDao _portForwardingRulesDao; + @Inject + ConfigurationDao _configDao; + @Inject + HostDetailsDao _hostDetailDao; + @Inject + NetworkExternalLoadBalancerDao _networkLBDao; + @Inject + NetworkServiceMapDao _ntwkSrvcProviderDao; + @Inject + NetworkExternalFirewallDao _networkExternalFirewallDao; + @Inject + ExternalFirewallDeviceDao _externalFirewallDeviceDao; + @Inject + protected HostPodDao _podDao = null; + + ScheduledExecutorService _executor; + private int _externalNetworkStatsInterval; + private static final org.apache.log4j.Logger s_logger = Logger.getLogger(ExternalLoadBalancerUsageManagerImpl.class); + + @Override + public boolean configure(String name, Map params) throws ConfigurationException { + _externalNetworkStatsInterval = NumbersUtil.parseInt(_configDao.getValue(Config.ExternalNetworkStatsInterval.key()), 300); + if (_externalNetworkStatsInterval > 0) { + _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("ExternalNetworkMonitor")); + } + return true; + + } + + @Override + public boolean start() { + if (_externalNetworkStatsInterval > 0) { + _executor.scheduleAtFixedRate(new ExternalLoadBalancerDeviceNetworkUsageTask(), _externalNetworkStatsInterval, _externalNetworkStatsInterval, TimeUnit.SECONDS); + } + return true; + } + + @Override + public boolean stop() { + return true; + } + + @Override + public String getName() { + return _name; + } + + private ExternalLoadBalancerDeviceVO getExternalLoadBalancerForNetwork(Network network) { + NetworkExternalLoadBalancerVO lbDeviceForNetwork = _networkExternalLBDao.findByNetworkId(network.getId()); + if (lbDeviceForNetwork != null) { + long lbDeviceId = lbDeviceForNetwork.getExternalLBDeviceId(); + ExternalLoadBalancerDeviceVO lbDeviceVo = _externalLoadBalancerDeviceDao.findById(lbDeviceId); + assert (lbDeviceVo != null); + return lbDeviceVo; + } + return null; + } + + private boolean externalLoadBalancerIsInline(HostVO externalLoadBalancer) { + DetailVO detail = _hostDetailDao.findDetail(externalLoadBalancer.getId(), "inline"); + return (detail != null && detail.getValue().equals("true")); + } + + @Override + public void updateExternalLoadBalancerNetworkUsageStats(long loadBalancerRuleId){ + + LoadBalancerVO lb = _loadBalancerDao.findById(loadBalancerRuleId); + if(lb == null){ + if(s_logger.isDebugEnabled()){ + s_logger.debug("Cannot update usage stats, LB rule is not found"); + } + return; + } + long networkId = lb.getNetworkId(); + Network network = _networkDao.findById(networkId); + if(network == null){ + if(s_logger.isDebugEnabled()){ + s_logger.debug("Cannot update usage stats, Network is not found"); + } + return; + } + ExternalLoadBalancerDeviceVO lbDeviceVO = getExternalLoadBalancerForNetwork(network); + if (lbDeviceVO == null) { + if(s_logger.isDebugEnabled()){ + s_logger.debug("Cannot update usage stats, No external LB device found"); + } + return; + } + + // Get network stats from the external load balancer + ExternalNetworkResourceUsageAnswer lbAnswer = null; + HostVO externalLoadBalancer = _hostDao.findById(lbDeviceVO.getHostId()); + if (externalLoadBalancer != null) { + ExternalNetworkResourceUsageCommand cmd = new ExternalNetworkResourceUsageCommand(); + lbAnswer = (ExternalNetworkResourceUsageAnswer) _agentMgr.easySend(externalLoadBalancer.getId(), cmd); + if (lbAnswer == null || !lbAnswer.getResult()) { + String details = (lbAnswer != null) ? lbAnswer.getDetails() : "details unavailable"; + String msg = "Unable to get external load balancer stats for network" + networkId + " due to: " + details + "."; + s_logger.error(msg); + return; + } + } + + long accountId = lb.getAccountId(); + AccountVO account = _accountDao.findById(accountId); + if (account == null) { + s_logger.debug("Skipping stats update for external LB for account with ID " + accountId); + return; + } + + String publicIp = _networkMgr.getIp(lb.getSourceIpAddressId()).getAddress().addr(); + DataCenterVO zone = _dcDao.findById(network.getDataCenterId()); + String statsEntryIdentifier = "account " + account.getAccountName() + ", zone " + zone.getName() + ", network ID " + networkId + ", host ID " + externalLoadBalancer.getName(); + + long newCurrentBytesSent = 0; + long newCurrentBytesReceived = 0; + + if (publicIp != null) { + long[] bytesSentAndReceived = null; + statsEntryIdentifier += ", public IP: " + publicIp; + + if (externalLoadBalancer.getType().equals(Host.Type.ExternalLoadBalancer) && externalLoadBalancerIsInline(externalLoadBalancer)) { + // Look up stats for the guest IP address that's mapped to the public IP address + InlineLoadBalancerNicMapVO mapping = _inlineLoadBalancerNicMapDao.findByPublicIpAddress(publicIp); + + if (mapping != null) { + NicVO nic = _nicDao.findById(mapping.getNicId()); + String loadBalancingIpAddress = nic.getIp4Address(); + bytesSentAndReceived = lbAnswer.ipBytes.get(loadBalancingIpAddress); + + if (bytesSentAndReceived != null) { + bytesSentAndReceived[0] = 0; + } + } + } else { + bytesSentAndReceived = lbAnswer.ipBytes.get(publicIp); + } + + if (bytesSentAndReceived == null) { + s_logger.debug("Didn't get an external network usage answer for public IP " + publicIp); + } else { + newCurrentBytesSent += bytesSentAndReceived[0]; + newCurrentBytesReceived += bytesSentAndReceived[1]; + } + + UserStatisticsVO userStats; + final Transaction txn = Transaction.currentTxn(); + try { + txn.start(); + userStats = _userStatsDao.lock(accountId, zone.getId(), networkId, publicIp, externalLoadBalancer.getId(), externalLoadBalancer.getType().toString()); + + if(userStats != null){ + long oldNetBytesSent = userStats.getNetBytesSent(); + long oldNetBytesReceived = userStats.getNetBytesReceived(); + long oldCurrentBytesSent = userStats.getCurrentBytesSent(); + long oldCurrentBytesReceived = userStats.getCurrentBytesReceived(); + String warning = "Received an external network stats byte count that was less than the stored value. Zone ID: " + userStats.getDataCenterId() + ", account ID: " + userStats.getAccountId() + "."; + + userStats.setCurrentBytesSent(newCurrentBytesSent); + if (oldCurrentBytesSent > newCurrentBytesSent) { + s_logger.warn(warning + "Stored bytes sent: " + oldCurrentBytesSent + ", new bytes sent: " + newCurrentBytesSent + "."); + userStats.setNetBytesSent(oldNetBytesSent + oldCurrentBytesSent); + } + + userStats.setCurrentBytesReceived(newCurrentBytesReceived); + if (oldCurrentBytesReceived > newCurrentBytesReceived) { + s_logger.warn(warning + "Stored bytes received: " + oldCurrentBytesReceived + ", new bytes received: " + newCurrentBytesReceived + "."); + userStats.setNetBytesReceived(oldNetBytesReceived + oldCurrentBytesReceived); + } + + if (_userStatsDao.update(userStats.getId(), userStats)) { + s_logger.debug("Successfully updated stats for " + statsEntryIdentifier); + } else { + s_logger.debug("Failed to update stats for " + statsEntryIdentifier); + } + }else { + s_logger.warn("Unable to find user stats entry for " + statsEntryIdentifier); + } + + txn.commit(); + }catch (final Exception e) { + txn.rollback(); + throw new CloudRuntimeException("Problem getting stats after reboot/stop ", e); + } + } + } + + protected class ExternalLoadBalancerDeviceNetworkUsageTask implements Runnable { + + public ExternalLoadBalancerDeviceNetworkUsageTask() { + + } + + @Override + public void run() { + GlobalLock scanLock = GlobalLock.getInternLock("ExternalLoadBalancerUsageManagerImpl"); + try { + if (scanLock.lock(20)) { + try { + runExternalLoadBalancerNetworkUsageTask(); + } finally { + scanLock.unlock(); + } + } + } catch (Exception e) { + s_logger.warn("Problems while getting external load balancer device usage", e); + } finally { + scanLock.releaseRef(); + } + } + + private void runExternalLoadBalancerNetworkUsageTask() { + s_logger.debug("External load balancer devices stats collector is running..."); + + for (DataCenterVO zone : _dcDao.listAll()) { + List domainRoutersInZone = _routerDao.listByDataCenter(zone.getId()); + if (domainRoutersInZone == null) { + continue; + } + Map lbDeviceUsageAnswerMap = new HashMap(); + List accountsProcessed = new ArrayList(); + + for (DomainRouterVO domainRouter : domainRoutersInZone) { + long accountId = domainRouter.getAccountId(); + + if (accountsProcessed.contains(new Long(accountId))) { + if (s_logger.isTraceEnabled()) { + s_logger.trace("Networks for Account " + accountId + " are already processed for external network usage, so skipping usage check."); + } + continue; + } + + long zoneId = zone.getId(); + + List networksForAccount = _networkDao.listBy(accountId, zoneId, Network.GuestType.Isolated); + if (networksForAccount == null) { + continue; + } + + for (NetworkVO network : networksForAccount) { + if (!_networkMgr.networkIsConfiguredForExternalNetworking(zoneId, network.getId())) { + s_logger.debug("Network " + network.getId() + " is not configured for external networking, so skipping usage check."); + continue; + } + + ExternalLoadBalancerDeviceVO lbDeviceVO = getExternalLoadBalancerForNetwork(network); + if (lbDeviceVO == null) { + continue; + } + + // Get network stats from the external load balancer + ExternalNetworkResourceUsageAnswer lbAnswer = null; + HostVO externalLoadBalancer = _hostDao.findById(lbDeviceVO.getHostId()); + if (externalLoadBalancer != null) { + Long lbDeviceId = new Long(externalLoadBalancer.getId()); + if (!lbDeviceUsageAnswerMap.containsKey(lbDeviceId)) { + ExternalNetworkResourceUsageCommand cmd = new ExternalNetworkResourceUsageCommand(); + lbAnswer = (ExternalNetworkResourceUsageAnswer) _agentMgr.easySend(externalLoadBalancer.getId(), cmd); + if (lbAnswer == null || !lbAnswer.getResult()) { + String details = (lbAnswer != null) ? lbAnswer.getDetails() : "details unavailable"; + String msg = "Unable to get external load balancer stats for " + zone.getName() + " due to: " + details + "."; + s_logger.error(msg); + continue; + } + lbDeviceUsageAnswerMap.put(lbDeviceId, lbAnswer); + } else { + if (s_logger.isTraceEnabled()) { + s_logger.trace("Reusing usage Answer for device id " + lbDeviceId + "for Network " + network.getId()); + } + lbAnswer = lbDeviceUsageAnswerMap.get(lbDeviceId); + } + } + + AccountVO account = _accountDao.findById(accountId); + if (account == null) { + s_logger.debug("Skipping stats update for account with ID " + accountId); + continue; + } + + if (!manageStatsEntries(true, accountId, zoneId, network, externalLoadBalancer, lbAnswer)) { + continue; + } + + manageStatsEntries(false, accountId, zoneId, network, externalLoadBalancer, lbAnswer); + } + + accountsProcessed.add(new Long(accountId)); + } + } + } + + private boolean updateBytes(UserStatisticsVO userStats, long newCurrentBytesSent, long newCurrentBytesReceived) { + long oldNetBytesSent = userStats.getNetBytesSent(); + long oldNetBytesReceived = userStats.getNetBytesReceived(); + long oldCurrentBytesSent = userStats.getCurrentBytesSent(); + long oldCurrentBytesReceived = userStats.getCurrentBytesReceived(); + String warning = "Received an external network stats byte count that was less than the stored value. Zone ID: " + userStats.getDataCenterId() + ", account ID: " + userStats.getAccountId() + "."; + + userStats.setCurrentBytesSent(newCurrentBytesSent); + if (oldCurrentBytesSent > newCurrentBytesSent) { + s_logger.warn(warning + "Stored bytes sent: " + oldCurrentBytesSent + ", new bytes sent: " + newCurrentBytesSent + "."); + userStats.setNetBytesSent(oldNetBytesSent + oldCurrentBytesSent); + } + + userStats.setCurrentBytesReceived(newCurrentBytesReceived); + if (oldCurrentBytesReceived > newCurrentBytesReceived) { + s_logger.warn(warning + "Stored bytes received: " + oldCurrentBytesReceived + ", new bytes received: " + newCurrentBytesReceived + "."); + userStats.setNetBytesReceived(oldNetBytesReceived + oldCurrentBytesReceived); + } + + return _userStatsDao.update(userStats.getId(), userStats); + } + + // Creates a new stats entry for the specified parameters, if one doesn't already exist. + private boolean createStatsEntry(long accountId, long zoneId, long networkId, String publicIp, long hostId) { + HostVO host = _hostDao.findById(hostId); + UserStatisticsVO userStats = _userStatsDao.findBy(accountId, zoneId, networkId, publicIp, hostId, host.getType().toString()); + if (userStats == null) { + return (_userStatsDao.persist(new UserStatisticsVO(accountId, zoneId, publicIp, hostId, host.getType().toString(), networkId)) != null); + } else { + return true; + } + } + + // Updates an existing stats entry with new data from the specified usage answer. + private boolean updateStatsEntry(long accountId, long zoneId, long networkId, String publicIp, long hostId, ExternalNetworkResourceUsageAnswer answer) { + AccountVO account = _accountDao.findById(accountId); + DataCenterVO zone = _dcDao.findById(zoneId); + NetworkVO network = _networkDao.findById(networkId); + HostVO host = _hostDao.findById(hostId); + String statsEntryIdentifier = "account " + account.getAccountName() + ", zone " + zone.getName() + ", network ID " + networkId + ", host ID " + host.getName(); + + long newCurrentBytesSent = 0; + long newCurrentBytesReceived = 0; + + if (publicIp != null) { + long[] bytesSentAndReceived = null; + statsEntryIdentifier += ", public IP: " + publicIp; + + if (host.getType().equals(Host.Type.ExternalLoadBalancer) && externalLoadBalancerIsInline(host)) { + // Look up stats for the guest IP address that's mapped to the public IP address + InlineLoadBalancerNicMapVO mapping = _inlineLoadBalancerNicMapDao.findByPublicIpAddress(publicIp); + + if (mapping != null) { + NicVO nic = _nicDao.findById(mapping.getNicId()); + String loadBalancingIpAddress = nic.getIp4Address(); + bytesSentAndReceived = answer.ipBytes.get(loadBalancingIpAddress); + + if (bytesSentAndReceived != null) { + bytesSentAndReceived[0] = 0; + } + } + } else { + bytesSentAndReceived = answer.ipBytes.get(publicIp); + } + + if (bytesSentAndReceived == null) { + s_logger.debug("Didn't get an external network usage answer for public IP " + publicIp); + } else { + newCurrentBytesSent += bytesSentAndReceived[0]; + newCurrentBytesReceived += bytesSentAndReceived[1]; + } + } else { + URI broadcastURI = network.getBroadcastUri(); + if (broadcastURI == null) { + s_logger.debug("Not updating stats for guest network with ID " + network.getId() + " because the network is not implemented."); + return true; + } else { + long vlanTag = Integer.parseInt(broadcastURI.getHost()); + long[] bytesSentAndReceived = answer.guestVlanBytes.get(String.valueOf(vlanTag)); + + if (bytesSentAndReceived == null) { + s_logger.warn("Didn't get an external network usage answer for guest VLAN " + vlanTag); + } else { + newCurrentBytesSent += bytesSentAndReceived[0]; + newCurrentBytesReceived += bytesSentAndReceived[1]; + } + } + } + + UserStatisticsVO userStats; + try { + userStats = _userStatsDao.lock(accountId, zoneId, networkId, publicIp, hostId, host.getType().toString()); + } catch (Exception e) { + s_logger.warn("Unable to find user stats entry for " + statsEntryIdentifier); + return false; + } + + if (updateBytes(userStats, newCurrentBytesSent, newCurrentBytesReceived)) { + s_logger.debug("Successfully updated stats for " + statsEntryIdentifier); + return true; + } else { + s_logger.debug("Failed to update stats for " + statsEntryIdentifier); + return false; + } + } + + private boolean createOrUpdateStatsEntry(boolean create, long accountId, long zoneId, long networkId, String publicIp, long hostId, ExternalNetworkResourceUsageAnswer answer) { + if (create) { + return createStatsEntry(accountId, zoneId, networkId, publicIp, hostId); + } else { + return updateStatsEntry(accountId, zoneId, networkId, publicIp, hostId, answer); + } + } + + /* + * Creates/updates all necessary stats entries for an account and zone. + * Stats entries are created for source NAT IP addresses, static NAT rules, port forwarding rules, and load + * balancing rules + */ + private boolean manageStatsEntries(boolean create, long accountId, long zoneId, Network network, + HostVO externalLoadBalancer, ExternalNetworkResourceUsageAnswer lbAnswer) { + String accountErrorMsg = "Failed to update external network stats entry. Details: account ID = " + accountId; + Transaction txn = Transaction.open(Transaction.CLOUD_DB); + try { + txn.start(); + String networkErrorMsg = accountErrorMsg + ", network ID = " + network.getId(); + + // If an external load balancer is added, manage one entry for each load balancing rule in this network + if (externalLoadBalancer != null && lbAnswer != null) { + List loadBalancers = _loadBalancerDao.listByNetworkId(network.getId()); + for (LoadBalancerVO loadBalancer : loadBalancers) { + String publicIp = _networkMgr.getIp(loadBalancer.getSourceIpAddressId()).getAddress().addr(); + if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), publicIp, externalLoadBalancer.getId(), lbAnswer)) { + throw new ExecutionException(networkErrorMsg + ", load balancing rule public IP = " + publicIp); + } + } + } + return txn.commit(); + } catch (Exception e) { + s_logger.warn("Exception: ", e); + txn.rollback(); + return false; + } finally { + txn.close(); + } + } + } +} diff --git a/server/src/com/cloud/network/IPAddressVO.java b/server/src/com/cloud/network/IPAddressVO.java index db0aa8b8060..cc72aef50ac 100644 --- a/server/src/com/cloud/network/IPAddressVO.java +++ b/server/src/com/cloud/network/IPAddressVO.java @@ -96,8 +96,8 @@ public class IPAddressVO implements IpAddress, Identity { @Column(name="physical_network_id") private Long physicalNetworkId; - @Column(name="is_elastic") - private boolean elastic; + @Column(name="is_system") + private boolean system; @Column(name="account_id") @Transient @@ -269,14 +269,12 @@ public class IPAddressVO implements IpAddress, Identity { this.physicalNetworkId = physicalNetworkId; } - - @Override - public boolean getElastic() { - return elastic; + public boolean getSystem() { + return system; } - public void setElastic(boolean isElastic) { - this.elastic = isElastic; + public void setSystem(boolean isSystem) { + this.system = isSystem; } } diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index 3948b3045d3..6cff9ee8654 100755 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -81,7 +81,7 @@ public interface NetworkManager extends NetworkService { * @throws InsufficientAddressCapacityException */ - PublicIp assignPublicIpAddress(long dcId, Long podId, Account owner, VlanType type, Long networkId, String requestedIp, boolean isElastic) throws InsufficientAddressCapacityException; + PublicIp assignPublicIpAddress(long dcId, Long podId, Account owner, VlanType type, Long networkId, String requestedIp, boolean isSystem) throws InsufficientAddressCapacityException; /** * assigns a source nat ip address to an account within a network. @@ -289,11 +289,11 @@ public interface NetworkManager extends NetworkService { Provider getDefaultUniqueProviderForService(String serviceName); - IpAddress assignElasticIp(long networkId, Account owner, + IpAddress assignSystemIp(long networkId, Account owner, boolean forElasticLb, boolean forElasticIp) throws InsufficientAddressCapacityException; - boolean handleElasticIpRelease(IpAddress ip); + boolean handleSystemIpRelease(IpAddress ip); void checkNetworkPermissions(Account owner, Network network); diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 7c962c4ca67..9d4cd3d61b3 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -354,12 +354,12 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } @Override - public PublicIp assignPublicIpAddress(long dcId, Long podId, Account owner, VlanType type, Long networkId, String requestedIp, boolean isElastic) throws InsufficientAddressCapacityException { - return fetchNewPublicIp(dcId, podId, null, owner, type, networkId, false, true, requestedIp, isElastic); + public PublicIp assignPublicIpAddress(long dcId, Long podId, Account owner, VlanType type, Long networkId, String requestedIp, boolean isSystem) throws InsufficientAddressCapacityException { + return fetchNewPublicIp(dcId, podId, null, owner, type, networkId, false, true, requestedIp, isSystem); } @DB - public PublicIp fetchNewPublicIp(long dcId, Long podId, Long vlanDbId, Account owner, VlanType vlanUse, Long networkId, boolean sourceNat, boolean assign, String requestedIp, boolean isElastic) + public PublicIp fetchNewPublicIp(long dcId, Long podId, Long vlanDbId, Account owner, VlanType vlanUse, Long networkId, boolean sourceNat, boolean assign, String requestedIp, boolean isSystem) throws InsufficientAddressCapacityException { StringBuilder errorMessage = new StringBuilder("Unable to get ip adress in "); Transaction txn = Transaction.currentTxn(); @@ -414,7 +414,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag addr.setAllocatedTime(new Date()); addr.setAllocatedInDomainId(owner.getDomainId()); addr.setAllocatedToAccountId(owner.getId()); - addr.setElastic(isElastic); + addr.setSystem(isSystem); if (assign) { markPublicIpAsAllocated(addr); @@ -459,7 +459,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag String guestType = vlan.getVlanType().toString(); - UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_NET_IP_ASSIGN, owner.getId(), addr.getDataCenterId(), addr.getId(), addr.getAddress().toString(), addr.isSourceNat(), guestType, addr.getElastic()); + UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_NET_IP_ASSIGN, owner.getId(), addr.getDataCenterId(), addr.getId(), addr.getAddress().toString(), addr.isSourceNat(), guestType, addr.getSystem()); _usageEventDao.persist(usageEvent); // don't increment resource count for direct ip addresses if (addr.getAssociatedWithNetworkId() != null) { @@ -946,7 +946,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag @Override @DB @ActionEvent(eventType = EventTypes.EVENT_NET_IP_ASSIGN, eventDescription = "allocating Ip", create = true) - public IpAddress allocateIP(long networkId, Account ipOwner, boolean isElastic) throws ResourceAllocationException, InsufficientAddressCapacityException, ConcurrentOperationException { + public IpAddress allocateIP(long networkId, Account ipOwner, boolean isSystem) throws ResourceAllocationException, InsufficientAddressCapacityException, ConcurrentOperationException { Account caller = UserContext.current().getCaller(); long userId = UserContext.current().getCallerUserId(); @@ -1025,7 +1025,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } } - ip = fetchNewPublicIp(zone.getId(), null, null, ipOwner, vlanType, network.getId(), isSourceNat, assign, null, isElastic); + ip = fetchNewPublicIp(zone.getId(), null, null, ipOwner, vlanType, network.getId(), isSourceNat, assign, null, isSystem); if (ip == null) { throw new InsufficientAddressCapacityException("Unable to find available public IP addresses", DataCenter.class, zone.getId()); @@ -1953,9 +1953,9 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag throw new InvalidParameterValueException("Ip address id=" + ipAddressId + " belongs to Account wide IP pool and cannot be disassociated"); } - // don't allow releasing elastic ip address - if (ipVO.getElastic()) { - throw new InvalidParameterValueException("Can't release elastic IP address " + ipVO); + // don't allow releasing system ip address + if (ipVO.getSystem()) { + throw new InvalidParameterValueException("Can't release system IP address " + ipVO); } boolean success = releasePublicIpAddress(ipAddressId, userId, caller); @@ -1964,7 +1964,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag NetworkOffering offering = _configMgr.getNetworkOffering(guestNetwork.getNetworkOfferingId()); Long vmId = ipVO.getAssociatedWithVmId(); if (offering.getElasticIp() && vmId != null) { - _rulesMgr.enableElasticIpAndStaticNatForVm(_userVmDao.findById(vmId), true); + _rulesMgr.getSystemIpAndEnableStaticNatForVm(_userVmDao.findById(vmId), true); return true; } return true; @@ -3569,7 +3569,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag addr.setAllocatedTime(new Date()); addr.setAllocatedInDomainId(owner.getDomainId()); addr.setAllocatedToAccountId(owner.getId()); - addr.setElastic(false); + addr.setSystem(false); addr.setState(IpAddress.State.Allocating); markPublicIpAsAllocated(addr); } @@ -3798,7 +3798,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag String guestType = vlan.getVlanType().toString(); - UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_NET_IP_RELEASE, ip.getAllocatedToAccountId(), ip.getDataCenterId(), addrId, ip.getAddress().addr(), ip.isSourceNat(), guestType, ip.getElastic()); + UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_NET_IP_RELEASE, ip.getAllocatedToAccountId(), ip.getDataCenterId(), addrId, ip.getAddress().addr(), ip.isSourceNat(), guestType, ip.getSystem()); _usageEventDao.persist(usageEvent); } @@ -6130,28 +6130,28 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } } - public IpAddress assignElasticIp(long networkId, Account owner, boolean forElasticLb, boolean forElasticIp) throws InsufficientAddressCapacityException { + public IpAddress assignSystemIp(long networkId, Account owner, boolean forElasticLb, boolean forElasticIp) throws InsufficientAddressCapacityException { Network guestNetwork = getNetwork(networkId); NetworkOffering off = _configMgr.getNetworkOffering(guestNetwork.getNetworkOfferingId()); IpAddress ip = null; if ((off.getElasticLb() && forElasticLb) || (off.getElasticIp() && forElasticIp)) { try { - s_logger.debug("Allocating elastic IP address for load balancer rule..."); + s_logger.debug("Allocating system IP address for load balancer rule..."); // allocate ip ip = allocateIP(networkId, owner, true); // apply ip associations ip = associateIP(ip.getId()); } catch (ResourceAllocationException ex) { - throw new CloudRuntimeException("Failed to allocate elastic ip due to ", ex); + throw new CloudRuntimeException("Failed to allocate system ip due to ", ex); } catch (ConcurrentOperationException ex) { - throw new CloudRuntimeException("Failed to allocate elastic lb ip due to ", ex); + throw new CloudRuntimeException("Failed to allocate system lb ip due to ", ex); } catch (ResourceUnavailableException ex) { - throw new CloudRuntimeException("Failed to allocate elastic lb ip due to ", ex); + throw new CloudRuntimeException("Failed to allocate system lb ip due to ", ex); } if (ip == null) { - throw new CloudRuntimeException("Failed to allocate elastic ip"); + throw new CloudRuntimeException("Failed to allocate system ip"); } } @@ -6159,17 +6159,17 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } @Override - public boolean handleElasticIpRelease(IpAddress ip) { + public boolean handleSystemIpRelease(IpAddress ip) { boolean success = true; Long networkId = ip.getAssociatedWithNetworkId(); if (networkId != null) { - if (ip.getElastic()) { + if (ip.getSystem()) { UserContext ctx = UserContext.current(); if (!releasePublicIpAddress(ip.getId(), ctx.getCallerUserId(), ctx.getCaller())) { - s_logger.warn("Unable to release elastic ip address id=" + ip.getId()); + s_logger.warn("Unable to release system ip address id=" + ip.getId()); success = false; } else { - s_logger.warn("Successfully released elastic ip address id=" + ip.getId()); + s_logger.warn("Successfully released system ip address id=" + ip.getId()); } } } diff --git a/server/src/com/cloud/network/NetworkUsageManagerImpl.java b/server/src/com/cloud/network/NetworkUsageManagerImpl.java index fd8c7c11a83..2501ca1cadd 100755 --- a/server/src/com/cloud/network/NetworkUsageManagerImpl.java +++ b/server/src/com/cloud/network/NetworkUsageManagerImpl.java @@ -372,8 +372,8 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager, ResourceSta } List collectedStats = new ArrayList(); - - //Get usage for Ips for which were assigned for the entire duration + + //Get usage for Ips which were assigned for the entire duration if(fullDurationIpUsage.size() > 0){ DirectNetworkUsageCommand cmd = new DirectNetworkUsageCommand(IpList, lastCollection, now); DirectNetworkUsageAnswer answer = (DirectNetworkUsageAnswer) _agentMgr.easySend(host.getId(), cmd); @@ -381,6 +381,7 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager, ResourceSta String details = (answer != null) ? answer.getDetails() : "details unavailable"; String msg = "Unable to get network usage stats from " + host.getId() + " due to: " + details + "."; s_logger.error(msg); + return false; } else { for(UsageIPAddressVO usageIp : fullDurationIpUsage){ String publicIp = usageIp.getAddress(); @@ -403,7 +404,7 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager, ResourceSta } } - //Get usage for Ips for which were assigned for part of the duration period + //Get usage for Ips which were assigned for part of the duration period for(UsageIPAddressVO usageIp : IpPartialUsage){ IpList = new ArrayList() ; IpList.add(usageIp.getAddress()); @@ -413,6 +414,7 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager, ResourceSta String details = (answer != null) ? answer.getDetails() : "details unavailable"; String msg = "Unable to get network usage stats from " + host.getId() + " due to: " + details + "."; s_logger.error(msg); + return false; } else { String publicIp = usageIp.getAddress(); long[] bytesSentRcvd = answer.get(publicIp); @@ -434,6 +436,10 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager, ResourceSta } } + if(collectedStats.size() == 0){ + s_logger.debug("No new direct network stats. No need to persist"); + return false; + } //Persist all the stats and last_collection time in a single transaction Transaction txn = Transaction.open(Transaction.CLOUD_DB); try { diff --git a/server/src/com/cloud/network/addr/PublicIp.java b/server/src/com/cloud/network/addr/PublicIp.java index 91e1eea453f..473764b2791 100644 --- a/server/src/com/cloud/network/addr/PublicIp.java +++ b/server/src/com/cloud/network/addr/PublicIp.java @@ -183,7 +183,7 @@ public class PublicIp implements PublicIpAddress { } @Override - public boolean getElastic() { - return _addr.getElastic(); + public boolean getSystem() { + return _addr.getSystem(); } } diff --git a/server/src/com/cloud/network/dao/IPAddressDaoImpl.java b/server/src/com/cloud/network/dao/IPAddressDaoImpl.java index eb897ca632a..3f5678bad89 100755 --- a/server/src/com/cloud/network/dao/IPAddressDaoImpl.java +++ b/server/src/com/cloud/network/dao/IPAddressDaoImpl.java @@ -146,7 +146,7 @@ public class IPAddressDaoImpl extends GenericDaoBase implemen address.setAssociatedWithVmId(null); address.setState(State.Free); address.setAssociatedWithNetworkId(null); - address.setElastic(false); + address.setSystem(false); update(ipAddressId, address); } diff --git a/server/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java b/server/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java index 676f2b53c8a..0590298810c 100644 --- a/server/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java +++ b/server/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java @@ -213,11 +213,7 @@ public class F5ExternalLoadBalancerElement extends ExternalLoadBalancerDeviceMan List methodList = new ArrayList(); method = new LbStickinessMethod(StickinessMethodType.LBCookieBased, "This is cookie based sticky method, can be used only for http"); methodList.add(method); - method.addParam("holdtime", false, "time period for which persistence is in effect.", false); - - method = new LbStickinessMethod(StickinessMethodType.SourceBased, "This is source based sticky method, can be used for any type of protocol."); - methodList.add(method); - method.addParam("holdtime", false, "time period for which persistence is in effect.", false); + method.addParam("holdtime", false, "time period (in seconds) for which persistence is in effect.", false); Gson gson = new Gson(); String stickyMethodList = gson.toJson(methodList); diff --git a/server/src/com/cloud/network/element/JuniperSRXExternalFirewallElement.java b/server/src/com/cloud/network/element/JuniperSRXExternalFirewallElement.java index 37f07d72b26..d40ad6cd4b8 100644 --- a/server/src/com/cloud/network/element/JuniperSRXExternalFirewallElement.java +++ b/server/src/com/cloud/network/element/JuniperSRXExternalFirewallElement.java @@ -286,7 +286,7 @@ public class JuniperSRXExternalFirewallElement extends ExternalFirewallDeviceMan Map sourceNatCapabilities = new HashMap(); // Specifies that this element supports either one source NAT rule per account, or no source NAT rules at all; // in the latter case a shared interface NAT rule will be used - sourceNatCapabilities.put(Capability.SupportedSourceNatTypes, "per account, per zone"); + sourceNatCapabilities.put(Capability.SupportedSourceNatTypes, "peraccount, perzone"); capabilities.put(Service.SourceNat, sourceNatCapabilities); // Specifies that port forwarding rules are supported by this element diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java index c84b4e20a90..3766c16694e 100755 --- a/server/src/com/cloud/network/element/VirtualRouterElement.java +++ b/server/src/com/cloud/network/element/VirtualRouterElement.java @@ -521,7 +521,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl capabilities.put(Service.Gateway, null); Map sourceNatCapabilities = new HashMap(); - sourceNatCapabilities.put(Capability.SupportedSourceNatTypes, "per account"); + sourceNatCapabilities.put(Capability.SupportedSourceNatTypes, "peraccount"); sourceNatCapabilities.put(Capability.RedundantRouter, "true"); capabilities.put(Service.SourceNat, sourceNatCapabilities); diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java index 660b5aeec61..ffbb35d329c 100755 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java @@ -52,8 +52,8 @@ import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.NetworkRuleConflictException; import com.cloud.exception.PermissionDeniedException; import com.cloud.exception.ResourceUnavailableException; -import com.cloud.network.ExternalLoadBalancerDeviceManager; import com.cloud.network.dao.NetworkServiceMapDao; +import com.cloud.network.ExternalLoadBalancerUsageManager; import com.cloud.network.IPAddressVO; import com.cloud.network.IpAddress; import com.cloud.network.LBStickinessPolicyVO; @@ -161,7 +161,7 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesMa @Inject ConfigurationManager _configMgr; @Inject - ExternalLoadBalancerDeviceManager _externalLBMgr; + ExternalLoadBalancerUsageManager _externalLBUsageMgr; @Inject NetworkServiceMapDao _ntwkSrvcDao; @@ -637,7 +637,7 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesMa NetworkVO network = _networkDao.findById(lb.getNetworkId()); if (network != null) { if (_networkMgr.networkIsConfiguredForExternalNetworking(network.getDataCenterId(), network.getId())) { - _externalLBMgr.updateExternalLoadBalancerNetworkUsageStats(loadBalancerId); + _externalLBUsageMgr.updateExternalLoadBalancerNetworkUsageStats(loadBalancerId); } } @@ -721,17 +721,20 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesMa Network guestNetwork = _networkMgr.getNetwork(lb.getNetworkId()); NetworkOffering off = _configMgr.getNetworkOffering(guestNetwork.getNetworkOfferingId()); if (off.getElasticLb() && ipAddressVo == null) { - ip = _networkMgr.assignElasticIp(lb.getNetworkId(), lbOwner, true, false); + ip = _networkMgr.assignSystemIp(lb.getNetworkId(), lbOwner, true, false); lb.setSourceIpAddressId(ip.getId()); } try { result = createLoadBalancer(lb, openFirewall); } catch (Exception ex) { s_logger.warn("Failed to create load balancer due to ", ex); + if (ex instanceof NetworkRuleConflictException) { + throw (NetworkRuleConflictException) ex; + } } finally { if (result == null && ip != null) { - s_logger.debug("Releasing elastic IP address " + ip + " as corresponding lb rule failed to create"); - _networkMgr.handleElasticIpRelease(ip); + s_logger.debug("Releasing system IP address " + ip + " as corresponding lb rule failed to create"); + _networkMgr.handleSystemIpRelease(ip); } } } @@ -911,13 +914,13 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesMa long count = _firewallDao.countRulesByIpId(lb.getSourceIpAddressId()); if (count == 0) { try { - success = handleElasticLBIpRelease(lb); + success = handleSystemLBIpRelease(lb); } catch (Exception ex) { - s_logger.warn("Failed to release elastic ip as a part of lb rule " + lb + " deletion due to exception ", ex); + s_logger.warn("Failed to release system ip as a part of lb rule " + lb + " deletion due to exception ", ex); success = false; } finally { if (!success) { - s_logger.warn("Failed to release elastic ip as a part of lb rule " + lb + " deletion"); + s_logger.warn("Failed to release system ip as a part of lb rule " + lb + " deletion"); } } } @@ -928,16 +931,16 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesMa return true; } - protected boolean handleElasticLBIpRelease(LoadBalancerVO lb) { + protected boolean handleSystemLBIpRelease(LoadBalancerVO lb) { IpAddress ip = _ipAddressDao.findById(lb.getSourceIpAddressId()); boolean success = true; - if (ip.getElastic()) { - s_logger.debug("Releasing elastic ip address " + lb.getSourceIpAddressId() + " as a part of delete lb rule"); + if (ip.getSystem()) { + s_logger.debug("Releasing system ip address " + lb.getSourceIpAddressId() + " as a part of delete lb rule"); if (!_networkMgr.releasePublicIpAddress(lb.getSourceIpAddressId(), UserContext.current().getCallerUserId(), UserContext.current().getCaller())) { - s_logger.warn("Unable to release elastic ip address id=" + lb.getSourceIpAddressId() + " as a part of delete lb rule"); + s_logger.warn("Unable to release system ip address id=" + lb.getSourceIpAddressId() + " as a part of delete lb rule"); success = false; } else { - s_logger.warn("Successfully released elastic ip address id=" + lb.getSourceIpAddressId() + " as a part of delete lb rule"); + s_logger.warn("Successfully released system ip address id=" + lb.getSourceIpAddressId() + " as a part of delete lb rule"); } } diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index fe79cd871d0..f0a4ae690bb 100755 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -1188,7 +1188,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian DataCenterDeployment plan = new DataCenterDeployment(dcId); boolean isPodBased = (dest.getDataCenter().getNetworkType() == NetworkType.Basic || _networkMgr.areServicesSupportedInNetwork(guestNetwork.getId(), Service.SecurityGroup)) && guestNetwork.getTrafficType() == TrafficType.Guest; boolean publicNetwork = false; - if (_networkMgr.areServicesSupportedInNetwork(guestNetwork.getId(), Service.SourceNat)) { + if (_networkMgr.isProviderSupportServiceInNetwork(guestNetwork.getId(), Service.SourceNat, Provider.VirtualRouter)) { publicNetwork = true; } if (isRedundant && !publicNetwork) { @@ -1882,7 +1882,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian if (!staticNatFirewallRules.isEmpty()) { List staticNatRules = new ArrayList(); for (FirewallRule rule : staticNatFirewallRules) { - staticNatRules.add(_rulesMgr.buildStaticNatRule(rule)); + staticNatRules.add(_rulesMgr.buildStaticNatRule(rule, false)); } createApplyStaticNatRulesCommands(staticNatRules, router, cmds); } diff --git a/server/src/com/cloud/network/rules/RulesManager.java b/server/src/com/cloud/network/rules/RulesManager.java index eee213785b2..3b3e6a1277b 100644 --- a/server/src/com/cloud/network/rules/RulesManager.java +++ b/server/src/com/cloud/network/rules/RulesManager.java @@ -33,7 +33,7 @@ public interface RulesManager extends RulesService { boolean applyPortForwardingRules(long ipAddressId, boolean continueOnError, Account caller); - boolean applyStaticNatRules(long sourceIpId, boolean continueOnError, Account caller); + boolean applyStaticNatRulesForIp(long sourceIpId, boolean continueOnError, Account caller, boolean forRevoke); boolean applyPortForwardingRulesForNetwork(long networkId, boolean continueOnError, Account caller); @@ -74,7 +74,7 @@ public interface RulesManager extends RulesService { boolean applyStaticNatsForNetwork(long networkId, boolean continueOnError, Account caller); - void enableElasticIpAndStaticNatForVm(UserVm vm, boolean getNewIp) throws InsufficientAddressCapacityException; + void getSystemIpAndEnableStaticNatForVm(UserVm vm, boolean getNewIp) throws InsufficientAddressCapacityException; boolean disableStaticNat(long ipAddressId, Account caller, long callerUserId, boolean releaseIpIfElastic) throws ResourceUnavailableException; diff --git a/server/src/com/cloud/network/rules/RulesManagerImpl.java b/server/src/com/cloud/network/rules/RulesManagerImpl.java index af5a70086ba..a8fb6894d61 100755 --- a/server/src/com/cloud/network/rules/RulesManagerImpl.java +++ b/server/src/com/cloud/network/rules/RulesManagerImpl.java @@ -495,7 +495,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { boolean success = false; if (apply) { - success = applyStaticNatRules(rule.getSourceIpAddressId(), true, caller); + success = applyStaticNatRulesForIp(rule.getSourceIpAddressId(), true, caller, true); } else { success = true; } @@ -563,7 +563,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { // apply rules for all ip addresses for (Long ipId : ipsToReprogram) { s_logger.debug("Applying static nat rules for ip address id=" + ipId + " as a part of vm expunge"); - if (!applyStaticNatRules(ipId, true, _accountMgr.getSystemAccount())) { + if (!applyStaticNatRulesForIp(ipId, true, _accountMgr.getSystemAccount(), true)) { success = false; s_logger.warn("Failed to apply static nat rules for ip id=" + ipId); } @@ -654,7 +654,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { } @Override - public boolean applyStaticNatRules(long sourceIpId, boolean continueOnError, Account caller) { + public boolean applyStaticNatRulesForIp(long sourceIpId, boolean continueOnError, Account caller, boolean forRevoke) { List rules = _firewallDao.listByIpAndPurpose(sourceIpId, Purpose.StaticNat); List staticNatRules = new ArrayList(); @@ -664,7 +664,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { } for (FirewallRule rule : rules) { - staticNatRules.add(buildStaticNatRule(rule)); + staticNatRules.add(buildStaticNatRule(rule, forRevoke)); } if (caller != null) { @@ -722,7 +722,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { } for (FirewallRuleVO rule : rules) { - staticNatRules.add(buildStaticNatRule(rule)); + staticNatRules.add(buildStaticNatRule(rule, false)); } try { @@ -833,7 +833,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { @Override @ActionEvent(eventType = EventTypes.EVENT_NET_RULE_ADD, eventDescription = "applying static nat rule", async = true) public boolean applyStaticNatRules(long ipId, Account caller) throws ResourceUnavailableException { - if (!applyStaticNatRules(ipId, false, caller)) { + if (!applyStaticNatRulesForIp(ipId, false, caller, false)) { throw new CloudRuntimeException("Failed to apply static nat rule"); } return true; @@ -869,7 +869,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { success = success && applyPortForwardingRules(ipId, true, caller); // revoke all all static nat rules - success = success && applyStaticNatRules(ipId, true, caller); + success = success && applyStaticNatRulesForIp(ipId, true, caller, true); // revoke static nat for the ip address success = success && applyStaticNatForIp(ipId, false, caller, true); @@ -1028,8 +1028,8 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { IPAddressVO ipAddress = _ipAddressDao.findById(ipId); checkIpAndUserVm(ipAddress, null, caller); - if (ipAddress.getElastic()) { - throw new InvalidParameterValueException("Can't disable static nat for elastic IP address " + ipAddress); + if (ipAddress.getSystem()) { + throw new InvalidParameterValueException("Can't disable static nat for system IP address " + ipAddress); } Long vmId = ipAddress.getAssociatedWithVmId(); @@ -1043,7 +1043,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { Network guestNetwork = _networkMgr.getNetwork(ipAddress.getAssociatedWithNetworkId()); NetworkOffering offering = _configMgr.getNetworkOffering(guestNetwork.getNetworkOfferingId()); if (offering.getElasticIp()) { - enableElasticIpAndStaticNatForVm(_vmDao.findById(vmId), true); + getSystemIpAndEnableStaticNatForVm(_vmDao.findById(vmId), true); return true; } else { return disableStaticNat(ipId, caller, ctx.getCallerUserId(), false); @@ -1080,17 +1080,17 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { } if (success) { - boolean isIpElastic = ipAddress.getElastic(); + boolean isIpSystem = ipAddress.getSystem(); ipAddress.setOneToOneNat(false); ipAddress.setAssociatedWithVmId(null); - if (isIpElastic && !releaseIpIfElastic) { - ipAddress.setElastic(false); + if (isIpSystem && !releaseIpIfElastic) { + ipAddress.setSystem(false); } _ipAddressDao.update(ipAddress.getId(), ipAddress); - if (isIpElastic && releaseIpIfElastic && !_networkMgr.handleElasticIpRelease(ipAddress)) { - s_logger.warn("Failed to release elastic ip address " + ipAddress); + if (isIpSystem && releaseIpIfElastic && !_networkMgr.handleSystemIpRelease(ipAddress)) { + s_logger.warn("Failed to release system ip address " + ipAddress); success = false; } @@ -1112,15 +1112,20 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { } @Override - public StaticNatRule buildStaticNatRule(FirewallRule rule) { + public StaticNatRule buildStaticNatRule(FirewallRule rule, boolean forRevoke) { IpAddress ip = _ipAddressDao.findById(rule.getSourceIpAddressId()); FirewallRuleVO ruleVO = _firewallDao.findById(rule.getId()); if (ip == null || !ip.isOneToOneNat() || ip.getAssociatedWithVmId() == null) { throw new InvalidParameterValueException("Source ip address of the rule id=" + rule.getId() + " is not static nat enabled"); } - - String dstIp = _networkMgr.getIpInNetwork(ip.getAssociatedWithVmId(), rule.getNetworkId()); + + String dstIp; + if (forRevoke) { + dstIp = _networkMgr.getIpInNetworkIncludingRemoved(ip.getAssociatedWithVmId(), rule.getNetworkId()); + } else { + dstIp = _networkMgr.getIpInNetwork(ip.getAssociatedWithVmId(), rule.getNetworkId()); + } return new StaticNatRuleImpl(ruleVO, dstIp); } @@ -1177,7 +1182,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { } @Override - public void enableElasticIpAndStaticNatForVm(UserVm vm, boolean getNewIp) throws InsufficientAddressCapacityException { + public void getSystemIpAndEnableStaticNatForVm(UserVm vm, boolean getNewIp) throws InsufficientAddressCapacityException { boolean success = true; // enable static nat if eIp capability is supported @@ -1189,17 +1194,17 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { // check if there is already static nat enabled if (_ipAddressDao.findByAssociatedVmId(vm.getId()) != null && !getNewIp) { - s_logger.debug("Vm " + vm + " already has elastic ip associated with it in guest network " + guestNetwork); + s_logger.debug("Vm " + vm + " already has ip associated with it in guest network " + guestNetwork); continue; } - s_logger.debug("Allocating elastic ip and enabling static nat for it for the vm " + vm + " in guest network " + guestNetwork); - IpAddress ip = _networkMgr.assignElasticIp(guestNetwork.getId(), _accountMgr.getAccount(vm.getAccountId()), false, true); + s_logger.debug("Allocating system ip and enabling static nat for it for the vm " + vm + " in guest network " + guestNetwork); + IpAddress ip = _networkMgr.assignSystemIp(guestNetwork.getId(), _accountMgr.getAccount(vm.getAccountId()), false, true); if (ip == null) { - throw new CloudRuntimeException("Failed to allocate elastic ip for vm " + vm + " in guest network " + guestNetwork); + throw new CloudRuntimeException("Failed to allocate system ip for vm " + vm + " in guest network " + guestNetwork); } - s_logger.debug("Allocated elastic ip " + ip + ", now enabling static nat on it for vm " + vm); + s_logger.debug("Allocated system ip " + ip + ", now enabling static nat on it for vm " + vm); try { success = enableStaticNat(ip.getId(), vm.getId()); @@ -1212,11 +1217,11 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { } if (!success) { - s_logger.warn("Failed to enable static nat on elastic ip " + ip + " for the vm " + vm + ", releasing the ip..."); - _networkMgr.handleElasticIpRelease(ip); - throw new CloudRuntimeException("Failed to enable static nat on elastic ip for the vm " + vm); + s_logger.warn("Failed to enable static nat on system ip " + ip + " for the vm " + vm + ", releasing the ip..."); + _networkMgr.handleSystemIpRelease(ip); + throw new CloudRuntimeException("Failed to enable static nat on system ip for the vm " + vm); } else { - s_logger.warn("Succesfully enabled static nat on elastic ip " + ip + " for the vm " + vm); + s_logger.warn("Succesfully enabled static nat on system ip " + ip + " for the vm " + vm); } } } diff --git a/server/src/com/cloud/server/api/response/UsageRecordResponse.java b/server/src/com/cloud/server/api/response/UsageRecordResponse.java index 6f1aed58273..9ad62ba624d 100644 --- a/server/src/com/cloud/server/api/response/UsageRecordResponse.java +++ b/server/src/com/cloud/server/api/response/UsageRecordResponse.java @@ -91,8 +91,8 @@ public class UsageRecordResponse extends BaseResponse implements ControlledEntit @SerializedName("issourcenat") @Param(description="True if the IPAddress is source NAT") private Boolean isSourceNat; - @SerializedName("iselastic") @Param(description="True if the IPAddress is elastic") - private Boolean isElastic; + @SerializedName(ApiConstants.IS_SYSTEM) @Param(description="True if the IPAddress is system IP - allocated during vm deploy or lb rule create") + private Boolean isSystem; @SerializedName("networkid") @Param(description="id of the network") private String networkId; @@ -174,8 +174,8 @@ public class UsageRecordResponse extends BaseResponse implements ControlledEntit this.isSourceNat = isSourceNat; } - public void setElastic(Boolean isElastic) { - this.isElastic = isElastic; + public void setSystem(Boolean isSystem) { + this.isSystem = isSystem; } @Override diff --git a/server/src/com/cloud/usage/UsageIPAddressVO.java b/server/src/com/cloud/usage/UsageIPAddressVO.java index cc6375a3626..478981b1b72 100644 --- a/server/src/com/cloud/usage/UsageIPAddressVO.java +++ b/server/src/com/cloud/usage/UsageIPAddressVO.java @@ -48,8 +48,8 @@ public class UsageIPAddressVO { @Column(name="is_source_nat") private boolean isSourceNat = false; - @Column(name="is_elastic") - private boolean isElastic = false; + @Column(name="is_system") + private boolean isSystem = false; @Column(name="assigned") @Temporal(value=TemporalType.TIMESTAMP) @@ -62,14 +62,14 @@ public class UsageIPAddressVO { protected UsageIPAddressVO() { } - public UsageIPAddressVO(long id, long accountId, long domainId, long zoneId, String address, boolean isSourceNat, boolean isElastic, Date assigned, Date released) { + public UsageIPAddressVO(long id, long accountId, long domainId, long zoneId, String address, boolean isSourceNat, boolean isSystem, Date assigned, Date released) { this.id = id; this.accountId = accountId; this.domainId = domainId; this.zoneId = zoneId; this.address = address; this.isSourceNat = isSourceNat; - this.isElastic = isElastic; + this.isSystem = isSystem; this.assigned = assigned; this.released = released; } @@ -105,8 +105,8 @@ public class UsageIPAddressVO { return isSourceNat; } - public boolean isElastic() { - return isElastic; + public boolean isSystem() { + return isSystem; } public Date getAssigned() { diff --git a/server/src/com/cloud/usage/dao/UsageIPAddressDaoImpl.java b/server/src/com/cloud/usage/dao/UsageIPAddressDaoImpl.java index 29145ec49a4..aeac0da44a8 100644 --- a/server/src/com/cloud/usage/dao/UsageIPAddressDaoImpl.java +++ b/server/src/com/cloud/usage/dao/UsageIPAddressDaoImpl.java @@ -41,15 +41,15 @@ public class UsageIPAddressDaoImpl extends GenericDaoBase= ?)))"; - protected static final String GET_USAGE_RECORDS_BY_DOMAIN = "SELECT id, account_id, domain_id, zone_id, public_ip_address, is_source_nat, is_elastic, assigned, released " + + protected static final String GET_USAGE_RECORDS_BY_DOMAIN = "SELECT id, account_id, domain_id, zone_id, public_ip_address, is_source_nat, is_system, assigned, released " + "FROM usage_ip_address " + "WHERE domain_id = ? AND ((released IS NULL AND assigned <= ?) OR (assigned BETWEEN ? AND ?) OR " + " (released BETWEEN ? AND ?) OR ((assigned <= ?) AND (released >= ?)))"; - protected static final String GET_ALL_USAGE_RECORDS = "SELECT id, account_id, domain_id, zone_id, public_ip_address, is_source_nat, is_elastic, assigned, released " + + protected static final String GET_ALL_USAGE_RECORDS = "SELECT id, account_id, domain_id, zone_id, public_ip_address, is_source_nat, is_system, assigned, released " + "FROM usage_ip_address " + "WHERE (released IS NULL AND assigned <= ?) OR (assigned BETWEEN ? AND ?) OR " + " (released BETWEEN ? AND ?) OR ((assigned <= ?) AND (released >= ?))"; @@ -119,7 +119,7 @@ public class UsageIPAddressDaoImpl extends GenericDaoBase profile, StopAnswer answer) { //release elastic IP here IPAddressVO ip = _ipAddressDao.findByAssociatedVmId(profile.getId()); - if (ip != null && ip.getElastic()) { + if (ip != null && ip.getSystem()) { UserContext ctx = UserContext.current(); try { _rulesMgr.disableStaticNat(ip.getId(), ctx.getCaller(), ctx.getCallerUserId(), true); } catch (Exception ex) { - s_logger.warn("Failed to disable static nat and release elastic ip " + ip + " as a part of vm " + profile.getVirtualMachine() + " stop due to exception ", ex); + s_logger.warn("Failed to disable static nat and release system ip " + ip + " as a part of vm " + profile.getVirtualMachine() + " stop due to exception ", ex); } } } diff --git a/server/test/com/cloud/network/MockNetworkManagerImpl.java b/server/test/com/cloud/network/MockNetworkManagerImpl.java index 50c130e7c79..2a2470a30af 100755 --- a/server/test/com/cloud/network/MockNetworkManagerImpl.java +++ b/server/test/com/cloud/network/MockNetworkManagerImpl.java @@ -770,7 +770,7 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS @Override public IpAddress allocateIP(long networkId, Account ipOwner, - boolean isElastic) throws ResourceAllocationException, + boolean isSystem) throws ResourceAllocationException, InsufficientAddressCapacityException, ConcurrentOperationException { // TODO Auto-generated method stub return null; @@ -778,7 +778,7 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS @Override public PublicIp assignPublicIpAddress(long dcId, Long podId, Account owner, - VlanType type, Long networkId, String requestedIp, boolean isElastic) + VlanType type, Long networkId, String requestedIp, boolean isSystem) throws InsufficientAddressCapacityException { // TODO Auto-generated method stub return null; @@ -798,7 +798,7 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS } @Override - public IpAddress assignElasticIp(long networkId, Account owner, + public IpAddress assignSystemIp(long networkId, Account owner, boolean forElasticLb, boolean forElasticIp) throws InsufficientAddressCapacityException { // TODO Auto-generated method stub @@ -806,7 +806,7 @@ public class MockNetworkManagerImpl implements NetworkManager, Manager, NetworkS } @Override - public boolean handleElasticIpRelease(IpAddress ip) { + public boolean handleSystemIpRelease(IpAddress ip) { // TODO Auto-generated method stub return false; } diff --git a/setup/db/create-schema-premium.sql b/setup/db/create-schema-premium.sql index 2056005c4f8..b472699c70a 100644 --- a/setup/db/create-schema-premium.sql +++ b/setup/db/create-schema-premium.sql @@ -96,7 +96,7 @@ CREATE TABLE `cloud_usage`.`usage_ip_address` ( `zone_id` bigint unsigned NOT NULL, `public_ip_address` varchar(15) NOT NULL, `is_source_nat` smallint(1) NOT NULL, - `is_elastic` smallint(1) NOT NULL, + `is_system` smallint(1) NOT NULL, `assigned` DATETIME NOT NULL, `released` DATETIME NULL, UNIQUE KEY (`id`, `assigned`) diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index 44cb8ca3f11..875525ddc43 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -921,7 +921,7 @@ CREATE TABLE `cloud`.`user_ip_address` ( `source_network_id` bigint unsigned NOT NULL COMMENT 'network id ip belongs to', `network_id` bigint unsigned COMMENT 'network this public ip address is associated with', `physical_network_id` bigint unsigned NOT NULL COMMENT 'physical network id that this configuration is based on', - `is_elastic` int(1) unsigned NOT NULL default '0', + `is_system` int(1) unsigned NOT NULL default '0', PRIMARY KEY (`id`), UNIQUE (`public_ip_address`, `source_network_id`), CONSTRAINT `fk_user_ip_address__source_network_id` FOREIGN KEY (`source_network_id`) REFERENCES `networks`(`id`), diff --git a/setup/db/templates.sql b/setup/db/templates.sql index 716afbd82ee..ec02890c72a 100755 --- a/setup/db/templates.sql +++ b/setup/db/templates.sql @@ -14,12 +14,12 @@ # along with this program. If not, see . # INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones, hypervisor_type) - VALUES (1, 'routing-1', 'SystemVM Template (XenServer)', 0, now(), 'SYSTEM', 0, 64, 1, 'http://download.cloud.com/templates/acton/acton-systemvm-01062012.vhd.bz2', '59bb270c3a028abd86cc580274020a14', 0, 'SystemVM Template (XenServer)', 'VHD', 15, 0, 1, 'XenServer'); + VALUES (1, 'routing-1', 'SystemVM Template (XenServer)', 0, now(), 'SYSTEM', 0, 64, 1, 'http://download.cloud.com/templates/acton/acton-systemvm-02062012.vhd.bz2', 'f613f38c96bf039f2e5cbf92fa8ad4f8', 0, 'SystemVM Template (XenServer)', 'VHD', 15, 0, 1, 'XenServer'); INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, removed, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones, hypervisor_type, extractable) VALUES (2, 'centos53-x86_64', 'CentOS 5.3(64-bit) no GUI (XenServer)', 1, now(), now(), 'BUILTIN', 0, 64, 1, 'http://download.cloud.com/templates/builtin/f59f18fb-ae94-4f97-afd2-f84755767aca.vhd.bz2', 'b63d854a9560c013142567bbae8d98cf', 0, 'CentOS 5.3(64-bit) no GUI (XenServer)', 'VHD', 12, 1, 1, 'XenServer', 1); INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones, hypervisor_type) - VALUES (3, 'routing-3', 'SystemVM Template (KVM)', 0, now(), 'SYSTEM', 0, 64, 1, 'http://download.cloud.com/templates/acton/acton-systemvm-01062012.qcow2.bz2', 'abccb541342fb058d06f70f372fc30b5', 0, 'SystemVM Template (KVM)', 'QCOW2', 15, 0, 1, 'KVM'); + VALUES (3, 'routing-3', 'SystemVM Template (KVM)', 0, now(), 'SYSTEM', 0, 64, 1, 'http://download.cloud.com/templates/acton/acton-systemvm-02062012.qcow2.bz2', '2755de1f9ef2ce4d6f2bee2efbb4da92', 0, 'SystemVM Template (KVM)', 'QCOW2', 15, 0, 1, 'KVM'); INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, display_text, enable_password, format, guest_os_id, featured, cross_zones, hypervisor_type, extractable) VALUES (4, 'centos55-x86_64', 'CentOS 5.5(64-bit) no GUI (KVM)', 1, now(), 'BUILTIN', 0, 64, 1, 'http://download.cloud.com/releases/2.2.0/eec2209b-9875-3c8d-92be-c001bd8a0faf.qcow2.bz2', 'ed0e788280ff2912ea40f7f91ca7a249', 'CentOS 5.5(64-bit) no GUI (KVM)', 0, 'QCOW2', 112, 1, 1, 'KVM', 1); @@ -31,10 +31,10 @@ INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, VALUES (7, 'centos53-x64', 'CentOS 5.3(64-bit) no GUI (vSphere)', 1, now(), 'BUILTIN', 0, 64, 1, 'http://download.cloud.com/releases/2.2.0/CentOS5.3-x86_64.ova', 'f6f881b7f2292948d8494db837fe0f47', 0, 'CentOS 5.3(64-bit) no GUI (vSphere)', 'OVA', 12, 1, 1, 'VMware', 1); INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones, hypervisor_type) - VALUES (8, 'routing-8', 'SystemVM Template (vSphere)', 0, now(), 'SYSTEM', 0, 32, 1, 'http://download.cloud.com/templates/acton/acton-systemvm-01062012.ova', 'ae7900950ff2e9820f6cde2fd58691e5', 0, 'SystemVM Template (vSphere)', 'OVA', 15, 0, 1, 'VMware'); + VALUES (8, 'routing-8', 'SystemVM Template (vSphere)', 0, now(), 'SYSTEM', 0, 32, 1, 'http://download.cloud.com/templates/acton/acton-systemvm-02062012.ova', 'e72b21c9541d005600297cb92d241434', 0, 'SystemVM Template (vSphere)', 'OVA', 15, 0, 1, 'VMware'); INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones, hypervisor_type) - VALUES (9, 'routing-9', 'SystemVM Template (HyperV)', 0, now(), 'SYSTEM', 0, 32, 1, 'http://download.cloud.com/templates/acton/acton-systemvm-01062012.vhd.bz2', '59bb270c3a028abd86cc580274020a14', 0, 'SystemVM Template (HyperV)', 'VHD', 15, 0, 1, 'Hyperv'); + VALUES (9, 'routing-9', 'SystemVM Template (HyperV)', 0, now(), 'SYSTEM', 0, 32, 1, 'http://download.cloud.com/templates/acton/acton-systemvm-02062012.vhd.bz2', 'f613f38c96bf039f2e5cbf92fa8ad4f8', 0, 'SystemVM Template (HyperV)', 'VHD', 15, 0, 1, 'Hyperv'); INSERT INTO `cloud`.`guest_os_category` (id, name) VALUES (1, 'CentOS'); INSERT INTO `cloud`.`guest_os_category` (id, name) VALUES (2, 'Debian'); diff --git a/tools/testClient/deployDataCenter.py b/tools/testClient/deployDataCenter.py index eaa25d11eaf..0439cc827c1 100644 --- a/tools/testClient/deployDataCenter.py +++ b/tools/testClient/deployDataCenter.py @@ -213,7 +213,7 @@ class deployDataCenters(): def enableZone(self, zoneid, allocation_state="Enabled"): zoneCmd = updateZone.updateZoneCmd() - zoneCmd.zoneid = zoneid + zoneCmd.id = zoneid zoneCmd.allocationstate = allocation_state return self.apiClient.updateZone(zoneCmd) @@ -227,22 +227,19 @@ class deployDataCenters(): createzone.name = zone.name createzone.securitygroupenabled = zone.securitygroupenabled createzone.networktype = zone.networktype + createzone.guestcidraddress = zone.guestcidraddress zoneresponse = self.apiClient.createZone(createzone) zoneId = zoneresponse.id phynetwrk = self.createPhysicalNetwork(zone.name + "-pnet", \ - zoneId, zone.vlan) + zoneId) - if zone.networktype == "Advanced": - self.addTrafficTypes(phynetwrk.id, ["Guest", "Public", \ + self.addTrafficTypes(phynetwrk.id, ["Guest", "Public", \ "Management"]) - elif zone.networktype == "Basic": - self.addTrafficTypes(phynetwrk.id, ["Guest", "Public", \ - "Management", "Storage"]) self.configureProviders(phynetwrk, zone) - self.updatePhysicalNetwork(phynetwrk.id, "Enabled") + self.updatePhysicalNetwork(phynetwrk.id, "Enabled", vlan=zone.vlan) if zone.networktype == "Basic": listnetworkoffering = \ diff --git a/tools/testClient/sandbox/simulator/sandbox.cfg b/tools/testClient/sandbox/simulator/sandbox.cfg index 049787524af..ee87b0d1a75 100644 --- a/tools/testClient/sandbox/simulator/sandbox.cfg +++ b/tools/testClient/sandbox/simulator/sandbox.cfg @@ -1,273 +1,65 @@ { "zones": [ { - "name": "Sandbox-Simulator", + "name": "Sandbox-simulator", "guestcidraddress": "10.1.1.0/24", - "dns2": "10.223.110.254", - "dns1": "4.2.2.2", - "vlan": "100-300", + "providers": [ + { + "broadcastdomainrange": "ZONE", + "name": "VirtualRouter" + } + ], + "dns1": "10.147.28.6", + "vlan": "100-500", "ipranges": [ { - "startip": "172.1.2.2", - "endip": "172.1.2.200", + "startip": "172.2.1.2", + "endip": "172.2.1.252", "netmask": "255.255.255.0", "vlan": "30", - "gateway": "172.1.2.1" + "gateway": "172.2.1.1" } ], "networktype": "Advanced", "pods": [ { - "endip": "172.1.1.200", + "endip": "172.1.2.252", "name": "POD0", - "startip": "172.1.1.2", + "startip": "172.1.2.2", "netmask": "255.255.255.0", "clusters": [ { - "clustername": "POD1-CLUSTER1", - "hypervisor": "Simulator", + "clustername": "C0", + "hypervisor": "simulator", "hosts": [ { "username": "root", - "url": "http://sim/test-1", - "password": "password" - }, - { - "username": "root", - "url": "http://sim/test-2", + "url": "http://sim", "password": "password" } ], "clustertype": "CloudManaged", "primaryStorages": [ { - "url": "nfs://172.16.24.32/export/path/1", - "name": "spool1" - } - ] - }, - { - "clustername": "POD1-CLUSTER2", - "hypervisor": "Simulator", - "hosts": [ - { - "username": "root", - "url": "http://sim/test-3", - "password": "password" - }, - { - "username": "root", - "url": "http://sim/test-4", - "password": "password" - } - ], - "clustertype": "CloudManaged", - "primaryStorages": [ - { - "url": "nfs://172.16.24.32/export/path/2", - "name": "spool2" - } - ] - }, - { - "clustername": "POD1-CLUSTER3", - "hypervisor": "Simulator", - "hosts": [ - { - "username": "root", - "url": "http://sim/test-5", - "password": "password" - }, - { - "username": "root", - "url": "http://sim/test-6", - "password": "password" - } - ], - "clustertype": "CloudManaged", - "primaryStorages": [ - { - "url": "nfs://172.16.24.32/export/path/3", - "name": "spool3" - } - ] - }, - { - "clustername": "POD1-CLUSTER4", - "hypervisor": "Simulator", - "hosts": [ - { - "username": "root", - "url": "http://sim/test-7", - "password": "password" - }, - { - "username": "root", - "url": "http://sim/test-8", - "password": "password" - } - ], - "clustertype": "CloudManaged", - "primaryStorages": [ - { - "url": "nfs://172.16.24.32/export/path/4", - "name": "spool4" - } - ] - }, - { - "clustername": "POD1-CLUSTER5", - "hypervisor": "Simulator", - "hosts": [ - { - "username": "root", - "url": "http://sim/test-9", - "password": "password" - }, - { - "username": "root", - "url": "http://sim/test-10", - "password": "password" - } - ], - "clustertype": "CloudManaged", - "primaryStorages": [ - { - "url": "nfs://172.16.24.32/export/path/5", - "name": "spool5" - } - ] - }, - { - "clustername": "POD1-CLUSTER6", - "hypervisor": "Simulator", - "hosts": [ - { - "username": "root", - "url": "http://sim/test-11", - "password": "password" - }, - { - "username": "root", - "url": "http://sim/test-12", - "password": "password" - } - ], - "clustertype": "CloudManaged", - "primaryStorages": [ - { - "url": "nfs://172.16.24.32/export/path/6", - "name": "spool6" - } - ] - }, - { - "clustername": "POD1-CLUSTER7", - "hypervisor": "Simulator", - "hosts": [ - { - "username": "root", - "url": "http://sim/test-13", - "password": "password" - }, - { - "username": "root", - "url": "http://sim/test-14", - "password": "password" - } - ], - "clustertype": "CloudManaged", - "primaryStorages": [ - { - "url": "nfs://172.16.24.32/export/path/7", - "name": "spool7" - } - ] - }, - { - "clustername": "POD1-CLUSTER8", - "hypervisor": "Simulator", - "hosts": [ - { - "username": "root", - "url": "http://sim/test-15", - "password": "password" - }, - { - "username": "root", - "url": "http://sim/test-16", - "password": "password" - } - ], - "clustertype": "CloudManaged", - "primaryStorages": [ - { - "url": "nfs://172.16.24.32/export/path/8", - "name": "spool8" - } - ] - }, - { - "clustername": "POD1-CLUSTER9", - "hypervisor": "Simulator", - "hosts": [ - { - "username": "root", - "url": "http://sim/test-17", - "password": "password" - }, - { - "username": "root", - "url": "http://sim/test-18", - "password": "password" - } - ], - "clustertype": "CloudManaged", - "primaryStorages": [ - { - "url": "nfs://172.16.24.32/export/path/9", - "name": "spool9" - } - ] - }, - { - "clustername": "POD1-CLUSTER10", - "hypervisor": "Simulator", - "hosts": [ - { - "username": "root", - "url": "http://sim/test-19", - "password": "password" - }, - { - "username": "root", - "url": "http://sim/test-20", - "password": "password" - } - ], - "clustertype": "CloudManaged", - "primaryStorages": [ - { - "url": "nfs://172.16.24.32/export/path/10", - "name": "spool10" + "url": "nfs://172.2.2.6:/export/home/primary", + "name": "PS0" } ] } ], - "gateway": "172.1.1.1" + "gateway": "172.1.2.1" } ], "internaldns1": "10.147.28.6", - "internaldns2": "10.223.110.254", "secondaryStorages": [ { - "url": "nfs://172.16.25.32/secondary/path" + "url": "nfs://172.2.2.6:/export/home/secondary" } ] } ], "dbSvr": { - "dbSvr": "10.147.28.40", + "dbSvr": "localhost", "passwd": "cloud", "db": "cloud", "port": 3306, @@ -285,61 +77,61 @@ ], "globalConfig": [ { - "name": "use.user.concentrated.pod.allocation", - "value": "false" + "name": "storage.cleanup.interval", + "value": "300" + }, + { + "name": "vm.op.wait.interval", + "value": "5" }, { "name": "default.page.size", "value": "10000" }, + { + "name": "instance.name", + "value": "QA" + }, + { + "name": "workers", + "value": "10" + }, { "name": "direct.agent.load.size", "value": "1000" }, + { + "name": "account.cleanup.interval", + "value": "600" + }, + { + "name": "guest.domain.suffix", + "value": "sandbox.simulator" + }, { "name": "expunge.delay", "value": "60" }, { "name": "vm.allocation.algorithm", - "value": "random" - }, - { - "name": "check.pod.cidrs", - "value": "false" - }, - { - "name": "instance.name", - "value": "SIMQA" - }, - { - "name": "workers", - "value": "10" - }, - { - "name": "vm.op.wait.interval", - "value": "5" - }, - { - "name": "guest.domain.suffix", - "value": "sandbox.simulator" + "value": "userdispersing" }, { "name": "expunge.interval", "value": "60" }, - { - "name": "linkLocalIp.nums", - "value": "10" - }, { "name": "expunge.workers", "value": "3" + }, + { + "name": "check.pod.cidrs", + "value": "true" } ], "mgtSvr": [ { - "mgtSvrIp": "10.147.28.40", + "mgtSvrIp": "localhost", "port": 8096 } ] diff --git a/tools/testClient/sandbox/simulator/setup.py b/tools/testClient/sandbox/simulator/setup.py index 3dda7d62a3b..507df4c84f4 100644 --- a/tools/testClient/sandbox/simulator/setup.py +++ b/tools/testClient/sandbox/simulator/setup.py @@ -31,10 +31,7 @@ def describeResources(config): z.name = 'Sandbox-%s'%(config.get('environment', 'hypervisor')) z.networktype = 'Advanced' z.guestcidraddress = '10.1.1.0/24' - - prov = provider() - prov.vlan = config.get('cloudstack','guest.vlan') - z.providers.append(prov) + z.vlan = config.get('cloudstack','guest.vlan') p = pod() p.name = 'POD0' diff --git a/ui/css/cloudstack3-ie7.css b/ui/css/cloudstack3-ie7.css index 56d7256e998..47166e1d207 100644 --- a/ui/css/cloudstack3-ie7.css +++ b/ui/css/cloudstack3-ie7.css @@ -13,20 +13,36 @@ div.panel div.list-view div.fixed-header { top: expression(this.offsetParent.scrollTop + 30); } +.detail-view div.list-view div.fixed-header { + top: 29px !important; + left: 12px !important; +} + div.panel div.list-view div.data-table table.body { top: 78px; } .detail-view .main-groups { - width: 554px; + width: 96%; + height: 416px; position: relative; overflow-x: hidden; + margin-top: -18px; } .detail-view .ui-widget-content { overflow-x: hidden !important; } +.tree-view { + position: relative; + top: expression(this.offsetParent.scrollTop); +} + +.tree-view li .name { + margin: 0px !important; +} + .detail-view .button.done { /*+placement:shift 0px 459px;*/ position: relative; @@ -92,3 +108,28 @@ table th { vertical-align: middle; } +.detail-view > .toolbar { + position: relative; + float: left; + left: -14px; +} + +.detail-view .list-view > .toolbar { + width: 100% !important; +} + +.system-chart ul.resources li .label { + /*+placement:shift 3px 9px;*/ + position: relative; + left: 3px; + top: 9px; + position: absolute; +} + +.system-chart ul.resources li .button.view-all .view-all-label { + /*+placement:shift 6px 5px;*/ + position: relative; + left: 6px; + top: 5px; +} + diff --git a/ui/css/cloudstack3.css b/ui/css/cloudstack3.css index c6cfc47e524..3418c30da3d 100644 --- a/ui/css/cloudstack3.css +++ b/ui/css/cloudstack3.css @@ -1205,7 +1205,7 @@ div.list-view td.state.off span { .ui-tabs li a { float: left; padding: 15px; - width: 91px; + min-width: 91px; text-align: center; font-size: 11px; margin-right: 1px; @@ -2040,6 +2040,9 @@ div.detail-group.actions td { .detail-view .ui-tabs-panel div.toolbar { width: 768px; + background: none; + border: none; + margin-top: 8px; } .project-view div.toolbar { @@ -6099,7 +6102,8 @@ label.error { /*Tree view*/ .tree-view { - height: 100%; + width: 24%; + height: 98%; overflow: auto; } diff --git a/ui/index.jsp b/ui/index.jsp index 0dde35ca9a4..59dfa4dd203 100644 --- a/ui/index.jsp +++ b/ui/index.jsp @@ -68,7 +68,7 @@
  • 1
  • 2
  • -
  • 3
  • +
  • 3
  • 4
  • 5
  • 6
  • @@ -260,7 +260,7 @@
    -
    +
    @@ -362,7 +362,7 @@
    - +
    @@ -1614,6 +1614,26 @@ diff --git a/ui/scripts/accounts.js b/ui/scripts/accounts.js index 73b2d0e92a8..46dd9ba992d 100644 --- a/ui/scripts/accounts.js +++ b/ui/scripts/accounts.js @@ -522,7 +522,7 @@ }, vmtotal: { label: 'label.total.of.vm' }, - iptotal: { label: 'label.totoal.of.ip' }, + iptotal: { label: 'label.total.of.ip' }, receivedbytes: { label: 'label.bytes.received', converter: function(args) { diff --git a/ui/scripts/configuration.js b/ui/scripts/configuration.js index a8a4cea3cec..0de26ed9a11 100644 --- a/ui/scripts/configuration.js +++ b/ui/scripts/configuration.js @@ -4,15 +4,15 @@ var networkServiceObjs = [], serviceCheckboxNames = []; cloudStack.sections.configuration = { - title: 'label.configuration', + title: 'label.menu.service.offerings', id: 'configuration', sectionSelect: { - label: 'label.select-view' + label: 'label.select.offering' }, sections: { serviceOfferings: { type: 'select', - title: 'label.menu.service.offerings', + title: 'label.compute.offerings', listView: { id: 'serviceOfferings', label: 'label.menu.service.offerings', @@ -25,19 +25,19 @@ actions: { add: { - label: 'label.add.service.offering', + label: 'label.add.compute.offering', messages: { confirm: function(args) { return 'message.add.service.offering'; }, notification: function(args) { - return 'label.add.service.offering'; + return 'label.add.compute.offering'; } }, createForm: { - title: 'label.add.service.offering', + title: 'label.add.compute.offering', fields: { name: { label: 'label.name', @@ -892,95 +892,7 @@ } } } - }, - - hypervisorCapabilities: { - type: 'select', - title: 'label.hypervisor.capabilities', - listView: { - id: 'hypervisorCapabilities', - label: 'label.hypervisor.capabilities', - fields: { - hypervisor: { label: 'label.hypervisor' }, - hypervisorversion: { label: 'label.hypervisor.version' }, - maxguestslimit: { label: 'label.max.guest.limit' } - }, - dataProvider: function(args) { - var array1 = []; - if(args.filterBy != null) { - if(args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) { - switch(args.filterBy.search.by) { - case "name": - if(args.filterBy.search.value.length > 0) - array1.push("&keyword=" + args.filterBy.search.value); - break; - } - } - } - - $.ajax({ - url: createURL("listHypervisorCapabilities&page=" + args.page + "&pagesize=" + pageSize + array1.join("")), - dataType: "json", - async: true, - success: function(json) { - var items = json.listhypervisorcapabilitiesresponse.hypervisorCapabilities; - args.response.success({data:items}); - }, - error: function(data) { - args.response.error(parseXMLHttpResponse(data)); - } - }); - }, - - detailView: { - name: 'label.details', - actions: { - edit: { - label: 'label.edit', - action: function(args) { - var array1 = []; - array1.push("&maxguestslimit=" + todb(args.data.maxguestslimit)); - $.ajax({ - url: createURL("updateHypervisorCapabilities&id=" + args.context.hypervisorCapabilities[0].id + array1.join("")), - dataType: "json", - success: function(json) { - var item = json.updatehypervisorcapabilitiesresponse['null']; - args.response.success({data: item}); - }, - error: function(data) { - args.response.error(parseXMLHttpResponse(data)); - } - }); - } - } - }, - - tabs: { - details: { - title: 'label.details', - fields: [ - { - id: { label: 'label.id' }, - hypervisor: { label: 'label.hypervisor' }, - hypervisorversion: { label: 'label.hypervisor.version' }, - maxguestslimit: { - label: 'label.max.guest.limit', - isEditable: true - } - } - ], - dataProvider: function(args) { - args.response.success( - { - data:args.context.hypervisorCapabilities[0] - } - ); - } - } - } - } - } - }, + }, networkOfferings: { type: 'select', @@ -1245,7 +1157,7 @@ //show or hide upon checked services and selected providers above (begin) serviceOfferingId: { - label: 'label.service.offering', + label: 'label.compute.offering', select: function(args) { $.ajax({ url: createURL('listServiceOfferings&issystem=true'), diff --git a/ui/scripts/globalSettings.js b/ui/scripts/globalSettings.js index c315ca148fe..fbfa79fc255 100644 --- a/ui/scripts/globalSettings.js +++ b/ui/scripts/globalSettings.js @@ -2,58 +2,154 @@ cloudStack.sections['global-settings'] = { title: 'label.menu.global.settings', id: 'global-settings', - listView: { - label: 'label.menu.global.settings', - actions: { - edit: { - label: 'label.change.value', - action: function(args) { - var name = args.data.jsonObj.name; - var value = args.data.value; + sectionSelect: { + label: 'label.select-view' + }, + sections: { + globalSettings: { + type: 'select', + title: 'label.menu.global.settings', + listView: { + label: 'label.menu.global.settings', + actions: { + edit: { + label: 'label.change.value', + action: function(args) { + var name = args.data.jsonObj.name; + var value = args.data.value; + + $.ajax({ + url: createURL( + 'updateConfiguration&name=' + name + '&value=' + value + ), + dataType: 'json', + async: true, + success: function(json) { + var item = json.updateconfigurationresponse.configuration; + cloudStack.dialog.notice({ message: _l('message.restart.mgmt.server') }); + args.response.success({data: item}); + }, + error: function(json) { + args.response.error(parseXMLHttpResponse(json)); + } + }); + } + } + }, + fields: { + name: { label: 'label.name', id: true }, + description: { label: 'label.description' }, + value: { label: 'label.value', editable: true } + }, + dataProvider: function(args) { + var data = { + page: args.page, + pagesize: pageSize + }; + + if (args.filterBy.search.value) { + data.name = args.filterBy.search.value; + } $.ajax({ - url: createURL( - 'updateConfiguration&name=' + name + '&value=' + value - ), - dataType: 'json', + url: createURL('listConfigurations'), + data: data, + dataType: "json", async: true, - success: function(json) { - var item = json.updateconfigurationresponse.configuration; - cloudStack.dialog.notice({ message: _l('message.restart.mgmt.server') }); - args.response.success({data: item}); - }, - error: function(json) { - args.response.error(parseXMLHttpResponse(json)); + success: function(json) { + var items = json.listconfigurationsresponse.configuration; + args.response.success({ data: items }); } }); } } }, - fields: { - name: { label: 'label.name', id: true }, - description: { label: 'label.description' }, - value: { label: 'label.value', editable: true } - }, - dataProvider: function(args) { - var data = { - page: args.page, - pagesize: pageSize - }; + hypervisorCapabilities: { + type: 'select', + title: 'label.hypervisor.capabilities', + listView: { + id: 'hypervisorCapabilities', + label: 'label.hypervisor.capabilities', + fields: { + hypervisor: { label: 'label.hypervisor' }, + hypervisorversion: { label: 'label.hypervisor.version' }, + maxguestslimit: { label: 'label.max.guest.limit' } + }, + dataProvider: function(args) { + var array1 = []; + if(args.filterBy != null) { + if(args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) { + switch(args.filterBy.search.by) { + case "name": + if(args.filterBy.search.value.length > 0) + array1.push("&keyword=" + args.filterBy.search.value); + break; + } + } + } + + $.ajax({ + url: createURL("listHypervisorCapabilities&page=" + args.page + "&pagesize=" + pageSize + array1.join("")), + dataType: "json", + async: true, + success: function(json) { + var items = json.listhypervisorcapabilitiesresponse.hypervisorCapabilities; + args.response.success({data:items}); + }, + error: function(data) { + args.response.error(parseXMLHttpResponse(data)); + } + }); + }, - if (args.filterBy.search.value) { - data.name = args.filterBy.search.value; - } + detailView: { + name: 'label.details', + actions: { + edit: { + label: 'label.edit', + action: function(args) { + var array1 = []; + array1.push("&maxguestslimit=" + todb(args.data.maxguestslimit)); + $.ajax({ + url: createURL("updateHypervisorCapabilities&id=" + args.context.hypervisorCapabilities[0].id + array1.join("")), + dataType: "json", + success: function(json) { + var item = json.updatehypervisorcapabilitiesresponse['null']; + args.response.success({data: item}); + }, + error: function(data) { + args.response.error(parseXMLHttpResponse(data)); + } + }); + } + } + }, - $.ajax({ - url: createURL('listConfigurations'), - data: data, - dataType: "json", - async: true, - success: function(json) { - var items = json.listconfigurationsresponse.configuration; - args.response.success({ data: items }); + tabs: { + details: { + title: 'label.details', + fields: [ + { + id: { label: 'label.id' }, + hypervisor: { label: 'label.hypervisor' }, + hypervisorversion: { label: 'label.hypervisor.version' }, + maxguestslimit: { + label: 'label.max.guest.limit', + isEditable: true + } + } + ], + dataProvider: function(args) { + args.response.success( + { + data:args.context.hypervisorCapabilities[0] + } + ); + } + } + } } - }); + } } } }; diff --git a/ui/scripts/installWizard.js b/ui/scripts/installWizard.js index e394e54ac01..902cb720a2a 100644 --- a/ui/scripts/installWizard.js +++ b/ui/scripts/installWizard.js @@ -252,13 +252,14 @@ var services = $.map(networkOffering.service, function(service) { return service.name; }); - - return $.inArray('SecurityGroup', services) == -1; + + //pick the network offering including SecurityGroup, but excluding Lb and StaticNat. (bug 13665) + return (($.inArray('SecurityGroup', services) != -1) && ($.inArray('Lb', services) == -1) && ($.inArray('StaticNat', services) == -1)) ; } - )[0]; + )[0]; } }); - + cloudStack.zoneWizard.action($.extend(true, {}, args, { // Plug in hard-coded values specific to quick install data: { @@ -266,7 +267,11 @@ networkType: 'Basic', domain: 1, networkOfferingId: selectedNetworkOffering.id - } + }, + pluginFrom: { + name: 'installWizard', + selectedNetworkOfferingHavingSG: true + } }, response: { success: function(args) { diff --git a/ui/scripts/instances.js b/ui/scripts/instances.js index 66f2aa63bf6..e1716d34b42 100644 --- a/ui/scripts/instances.js +++ b/ui/scripts/instances.js @@ -997,8 +997,10 @@ edit: { label: 'Edit', action: function(args) { - var array1 = []; - array1.push("&displayName=" + args.data.displayname); + var array1 = []; + if(args.data.displayname != args.context.instances[0].name) + array1.push("&displayName=" + args.data.displayname); + array1.push("&group=" + args.data.group); array1.push("&ostypeid=" + args.data.guestosid); //array1.push("&haenable=" + haenable); @@ -1181,7 +1183,7 @@ desc: '', fields: { serviceOffering: { - label: 'label.service.offering', + label: 'label.compute.offering', select: function(args) { $.ajax({ url: createURL("listServiceOfferings&VirtualMachineId=" + args.context.instances[0].id), @@ -1483,6 +1485,11 @@ else { hiddenFields = ["hypervisor"]; } + + if (!args.context.instances[0].publicip) { + hiddenFields.push('publicip'); + } + return hiddenFields; }, @@ -1491,6 +1498,7 @@ id: { label: 'label.id', isEditable: false }, displayname: { label: 'label.display.name', isEditable: true }, state: { label: 'label.state', isEditable: false }, + publicip: { label: 'label.public.ip', isEditable: false }, zonename: { label: 'label.zone.name', isEditable: false }, hypervisor: { label: 'label.hypervisor', isEditable: false }, templatename: { label: 'label.template', isEditable: false }, @@ -1514,7 +1522,7 @@ } }, - serviceofferingname: { label: 'label.service.offering', isEditable: false }, + serviceofferingname: { label: 'label.compute.offering', isEditable: false }, group: { label: 'label.group', isEditable: true }, hostname: { label: 'label.host', isEditable: false}, haenable: { label: 'label.ha.enabled', isEditable: false, converter:cloudStack.converters.toBooleanText }, diff --git a/ui/scripts/lbStickyPolicy.js b/ui/scripts/lbStickyPolicy.js index 2e8455a9c23..de2710545f8 100644 --- a/ui/scripts/lbStickyPolicy.js +++ b/ui/scripts/lbStickyPolicy.js @@ -19,21 +19,24 @@ )[0].value); var baseFields = { - stickyName: { label: 'Sticky Name', validation: { required: true } }, - name: { label: 'Name', validation: { required: true }, isHidden: true }, - mode: { label: 'Mode', isHidden: true }, - length: { label: 'Length', validation: { required: true }, isHidden: true }, - holdtime: { label: 'Hold Time', validation: { required: true }, isHidden: true }, - tablesize: { label: 'Table size', isHidden: true }, - expire: { label: 'Expire', isHidden: true }, - requestlearn: { label: 'Request-Learn', isBoolean: true, isHidden: true }, - prefix: { label: 'Prefix', isBoolean: true, isHidden: true }, - nocache: { label: 'No cache', isBoolean: true, isHidden: true }, - indirect: { label: 'Indirect', isBoolean: true, isHidden: true }, - postonly: { label: 'Is post-only', isBoolean: true, isHidden: true }, - domain: { label: 'Domain', isBoolean: true, isHidden: true } + stickyName: { label: 'Sticky Name', validation: { required: true } } }; + $.map( + $.map( + stickinessCapabilities, + function(c) { return c.paramlist; } + ), + function(p) { + baseFields[p.paramname] = { + label: _l('label.sticky.' + p.paramname), + isHidden: true, + isBoolean: p.isflag, + validation: { required: p.required } + }; + } + ); + var conditionalFields = { methodname: { label: 'Stickiness method', @@ -123,7 +126,7 @@ }, after: function(args) { // Remove fields not applicable to sticky method - args.$form.find('.form-item:hidden').remove() + args.$form.find('.form-item:hidden').remove(); var data = cloudStack.serializeForm(args.$form); diff --git a/ui/scripts/network.js b/ui/scripts/network.js index bddd7778208..bfe582f5b10 100644 --- a/ui/scripts/network.js +++ b/ui/scripts/network.js @@ -1,3 +1,4 @@ + (function(cloudStack, $) { var ipChangeNotice = function() { cloudStack.dialog.confirm({ @@ -32,7 +33,7 @@ status == 'Creating' || status == 'Allocating' || item.account == 'system' || - item.iselastic == true ) { + item.issystem == true ) { disallowedActions = allowedActions; } @@ -42,10 +43,16 @@ disallowedActions.push('disableStaticNAT'); } - if (item.vpnenabled) { - disallowedActions.push('enableVPN'); + if ($.inArray('Vpn', $.map(args.context.networks[0].service, + function(service) { return service.name; })) > -1) { + if (item.vpnenabled) { + disallowedActions.push('enableVPN'); + } else { + disallowedActions.push('disableVPN'); + } } else { disallowedActions.push('disableVPN'); + disallowedActions.push('enableVPN'); } if (item.issourcenat){ @@ -896,9 +903,8 @@ } }, zonename: { label: 'label.zone' }, - //vlanname: { label: 'VLAN' }, - iselastic: { label: 'label.elastic', converter: cloudStack.converters.toBooleanText }, - account: { label: 'label.account' }, + //vlanname: { label: 'VLAN' }, + virtualmachinedisplayname: { label: 'label.vm.name' }, state: { converter: function(str) { // For localization @@ -1051,7 +1057,7 @@ if (!ipAddress.vpnenabled) { disabledTabs.push('vpn'); } - if(ipAddress.iselastic == true) { + if(ipAddress.issystem == true) { disabledTabs.push('vpn'); if(ipAddress.isstaticnat == true || ipAddress.virtualmachineid != null) @@ -1320,6 +1326,25 @@ tabs: { details: { title: 'label.details', + + preFilter: function(args) { + var hiddenFields = []; + var zoneObj; + $.ajax({ + url: createURL("listZones&id=" + args.context.ipAddresses[0].zoneid), + dataType: "json", + async: false, + success: function(json) { + zoneObj = json.listzonesresponse.zone[0]; + } + }); + if(zoneObj.networktype == "Advanced") { + hiddenFields.push("issystem"); + hiddenFields.push("purpose"); + } + return hiddenFields; + }, + fields: [ { ipaddress: { label: 'IP' } @@ -1333,7 +1358,8 @@ state: { label: 'label.state' }, issourcenat: { label: 'label.source.nat', converter: cloudStack.converters.toBooleanText }, isstaticnat: { label: 'label.static.nat', converter: cloudStack.converters.toBooleanText }, - iselastic: { label: 'label.elastic', converter: cloudStack.converters.toBooleanText }, + issystem: { label: 'label.is.system', converter: cloudStack.converters.toBooleanText }, //(basic zone only) + purpose: { label: 'label.purpose' }, //(basic zone only) When an IP is system-generated, the purpose it serves can be Lb or static nat. virtualmachinedisplayname: { label: 'label.vm.name' }, domain: { label: 'label.domain' }, account: { label: 'label.account' }, @@ -1454,11 +1480,18 @@ }); if ($(this).val() == 'icmp') { + $icmpFields.show(); $icmpFields.attr('disabled', false); $otherFields.attr('disabled', 'disabled'); + $otherFields.hide(); + $otherFields.parent().find('label.error').hide(); } else { + $otherFields.show(); + $otherFields.parent().find('label.error').hide(); $otherFields.attr('disabled', false); $icmpFields.attr('disabled', 'disabled'); + $icmpFields.hide(); + $icmpFields.parent().find('label.error').hide(); } }); @@ -1684,6 +1717,7 @@ $.ajax({ url: createURL('listIpForwardingRules'), data: { + listAll: true, ipaddressid: args.context.ipAddresses[0].id }, dataType: 'json', diff --git a/ui/scripts/projects.js b/ui/scripts/projects.js index 34014f0147a..b444cd09e83 100644 --- a/ui/scripts/projects.js +++ b/ui/scripts/projects.js @@ -932,7 +932,7 @@ }, accept: { - label: 'message.accept.project.invitation', + label: 'label.accept.project.invitation', action: function(args) { $.ajax({ url: createURL('updateProjectInvitation'), @@ -954,7 +954,7 @@ }, messages: { confirm: function() { return 'message.confirm.join.project'; }, - notification: function() { return 'message.accept.project.invitation'; } + notification: function() { return 'label.accept.project.invitation'; } }, notification: { poll: pollAsyncJobResult } }, diff --git a/ui/scripts/system.js b/ui/scripts/system.js index c07e2ab1567..a2c82dcd5b6 100644 --- a/ui/scripts/system.js +++ b/ui/scripts/system.js @@ -1,6 +1,6 @@ (function($, cloudStack) { - var zoneObjs, podObjs, clusterObjs, domainObjs, networkOfferingObjs; + var zoneObjs, podObjs, clusterObjs, domainObjs, networkOfferingObjs, physicalNetworkObjs; var selectedClusterObj, selectedZoneObj, selectedPublicNetworkObj, selectedManagementNetworkObj, selectedPhysicalNetworkObj, selectedGuestNetworkObj; var naasStatusMap = {}; var nspMap = {}; @@ -79,7 +79,7 @@ }; cloudStack.sections.system = { - title: 'label.menu.system', + title: 'label.menu.infrastructure', id: 'system', // System dashboard @@ -1046,24 +1046,60 @@ label: 'label.network.offering', dependsOn: 'scope', select: function(args) { - var array1 = []; var apiCmd = "listNetworkOfferings&state=Enabled&zoneid=" + selectedZoneObj.id; - + var array1 = []; + + if(physicalNetworkObjs.length > 1) { //multiple physical networks + var guestTrafficTypeTotal = 0; + for(var i = 0; i < physicalNetworkObjs.length; i++) { + if(guestTrafficTypeTotal > 1) + break; + $.ajax({ + url: createURL("listTrafficTypes&physicalnetworkid=" + physicalNetworkObjs[i].id), + dataType: "json", + async: false, + success: function(json) { + var items = json.listtraffictypesresponse.traffictype; + for(var k = 0; k < items.length; k++) { + if(items[k].traffictype == "Guest") { + guestTrafficTypeTotal++; + break; + } + } + } + }); + } + + if(guestTrafficTypeTotal > 1) { + if(args.context.physicalNetworks[0].tags != null && args.context.physicalNetworks[0].tags.length > 0) { + array1.push("&tags=" + args.context.physicalNetworks[0].tags); + } + else { + alert(dictionary['error.please.specify.physical.network.tags']); + return; + } + } + } + //this tab (Network tab in guest network) only shows when it's under an Advanced zone if(args.scope == "zone-wide" || args.scope == "domain-specific") { - apiCmd += "&guestiptype=Shared"; + array1.push("&guestiptype=Shared"); } + var networkOfferingArray = []; $.ajax({ - url: createURL(apiCmd), + url: createURL(apiCmd + array1.join("")), dataType: "json", async: false, success: function(json) { - networkOfferingObjs = json.listnetworkofferingsresponse.networkoffering; + networkOfferingObjs = json.listnetworkofferingsresponse.networkoffering; if (networkOfferingObjs != null && networkOfferingObjs.length > 0) { for (var i = 0; i < networkOfferingObjs.length; i++) { + //if security groups provider is disabled, exclude network offerings that has "SecurityGroupProvider" in service - if(nspMap["securityGroups"].state == "Disabled"){ + //comment the following section becaues nspMap is empty unless network providers has been clicked. + /* + if(nspMap["securityGroups"].state == "Disabled"){ var includingSGP = false; var serviceObjArray = networkOfferingObjs[i].service; for(var k = 0; k < serviceObjArray.length; k++) { @@ -1075,6 +1111,7 @@ if(includingSGP == true) continue; //skip to next network offering } + */ //if args.scope == "account-specific" or "project-specific", exclude Isolated network offerings with SourceNat service (bug 12869) if(args.scope == "account-specific" || args.scope == "project-specific") { @@ -1090,13 +1127,13 @@ continue; //skip to next network offering } - array1.push({id: networkOfferingObjs[i].id, description: networkOfferingObjs[i].displaytext}); + networkOfferingArray.push({id: networkOfferingObjs[i].id, description: networkOfferingObjs[i].displaytext}); } } } }); - args.response.success({data: array1}); + args.response.success({data: networkOfferingArray}); args.$select.change(function(){ @@ -1603,6 +1640,7 @@ zoneid: args.context.zones[0].id }, success: function(json) { + physicalNetworkObjs = json.listphysicalnetworksresponse.physicalnetwork; args.response.success({ data: json.listphysicalnetworksresponse.physicalnetwork }); @@ -1857,6 +1895,20 @@ }); } }); + + // Get project routers + $.ajax({ + url: createURL("listRouters&zoneid=" + selectedZoneObj.id + "&listAll=true&page=" + args.page + "&pagesize=" + pageSize + array1.join("") + "&projectid=-1"), + dataType: 'json', + async: true, + success: function(json) { + var items = json.listroutersresponse.router; + args.response.success({ + actionFilter: routerActionfilter, + data: items + }); + } + }); }, detailView: { name: 'Virtual applicance details', @@ -1980,7 +2032,7 @@ desc: '', fields: { serviceOfferingId: { - label: 'label.service.offering', + label: 'label.compute.offering', select: function(args) { $.ajax({ url: createURL("listServiceOfferings&issystem=true&systemvmtype=domainrouter"), @@ -2121,18 +2173,26 @@ tabs: { details: { title: 'label.details', + preFilter: function(args) { + if (!args.context.routers[0].project) + return ['project', 'projectid']; + + return []; + }, fields: [ { - name: { label: 'label.name' } + name: { label: 'label.name' }, + project: { label: 'label.project' } }, { id: { label: 'label.id' }, + projectid: { label: 'label.project.id' }, state: { label: 'label.state' }, publicip: { label: 'label.public.ip' }, guestipaddress: { label: 'label.guest.ip' }, linklocalip: { label: 'label.linklocal.ip' }, hostname: { label: 'label.host' }, - serviceofferingname: { label: 'label.service.offering' }, + serviceofferingname: { label: 'label.compute.offering' }, networkdomain: { label: 'label.network.domain' }, domain: { label: 'label.domain' }, account: { label: 'label.account' }, @@ -2169,16 +2229,17 @@ url: createURL("updateNetworkServiceProvider&id=" + nspMap["virtualRouter"].id + "&state=Enabled"), dataType: "json", success: function(json) { - var jid = json.updatenetworkserviceproviderresponse.jobid; - args.response.success( + var jid = json.updatenetworkserviceproviderresponse.jobid; + args.response.success( {_custom: { - jobId: jid + jobId: jid, + getUpdatedItem: function(json) { + $(window).trigger('cloudStack.fullRefresh'); + } } } - ); - - $(window).trigger('cloudStack.fullRefresh'); + ); } }); }, @@ -2199,16 +2260,17 @@ url: createURL("updateNetworkServiceProvider&id=" + nspMap["virtualRouter"].id + "&state=Disabled"), dataType: "json", success: function(json) { - var jid = json.updatenetworkserviceproviderresponse.jobid; - args.response.success( + var jid = json.updatenetworkserviceproviderresponse.jobid; + args.response.success( {_custom: { - jobId: jid + jobId: jid, + getUpdatedItem: function(json) { + $(window).trigger('cloudStack.fullRefresh'); + } } } - ); - - $(window).trigger('cloudStack.fullRefresh'); + ); } }); }, @@ -2368,12 +2430,13 @@ args.response.success( {_custom: { - jobId: jid + jobId: jid, + getUpdatedItem: function(json) { + $(window).trigger('cloudStack.fullRefresh'); + } } } - ); - - $(window).trigger('cloudStack.fullRefresh'); + ); } }); }, @@ -2398,12 +2461,13 @@ args.response.success( {_custom: { - jobId: jid + jobId: jid, + getUpdatedItem: function(json) { + $(window).trigger('cloudStack.fullRefresh'); + } } } - ); - - $(window).trigger('cloudStack.fullRefresh'); + ); } }); }, @@ -2520,12 +2584,12 @@ capacity: { label: 'label.capacity', validation: { required: false, number: true } + }, + dedicated: { + label: 'label.dedicated', + isBoolean: true, + isChecked: false } - // dedicated: { - // label: 'label.dedicated', - // isBoolean: true, - // isChecked: false - // } } }, action: function(args) { @@ -2589,13 +2653,14 @@ var jid = json.updatenetworkserviceproviderresponse.jobid; args.response.success( {_custom: - { - jobId: jid - } + { + jobId: jid, + getUpdatedItem: function(json) { + $(window).trigger('cloudStack.fullRefresh'); + } + } } - ); - - $(window).trigger('cloudStack.fullRefresh'); + ); } }); }, @@ -2619,13 +2684,14 @@ var jid = json.updatenetworkserviceproviderresponse.jobid; args.response.success( {_custom: - { - jobId: jid - } + { + jobId: jid, + getUpdatedItem: function(json) { + $(window).trigger('cloudStack.fullRefresh'); + } + } } - ); - - $(window).trigger('cloudStack.fullRefresh'); + ); } }); }, @@ -2828,12 +2894,13 @@ args.response.success( {_custom: { - jobId: jid + jobId: jid, + getUpdatedItem: function(json) { + $(window).trigger('cloudStack.fullRefresh'); + } } } - ); - - $(window).trigger('cloudStack.fullRefresh'); + ); } }); }, @@ -2858,12 +2925,13 @@ args.response.success( {_custom: { - jobId: jid + jobId: jid, + getUpdatedItem: function(json) { + $(window).trigger('cloudStack.fullRefresh'); + } } } - ); - - $(window).trigger('cloudStack.fullRefresh'); + ); } }); }, @@ -2957,12 +3025,13 @@ args.response.success( {_custom: { - jobId: jid + jobId: jid, + getUpdatedItem: function(json) { + $(window).trigger('cloudStack.fullRefresh'); + } } } - ); - - $(window).trigger('cloudStack.fullRefresh'); + ); } }); }, @@ -2987,12 +3056,13 @@ args.response.success( {_custom: { - jobId: jid + jobId: jid, + getUpdatedItem: function(json) { + $(window).trigger('cloudStack.fullRefresh'); + } } } - ); - - $(window).trigger('cloudStack.fullRefresh'); + ); } }); }, @@ -3325,7 +3395,7 @@ }, compute: { - title: 'label.compute', + title: 'label.compute.and.storage', custom: cloudStack.uiCustom.systemChart('compute') }, network: { @@ -3941,12 +4011,12 @@ capacity: { label: 'label.capacity', validation: { required: false, number: true } + }, + dedicated: { + label: 'label.dedicated', + isBoolean: true, + isChecked: false } - // dedicated: { - // label: 'label.dedicated', - // isBoolean: true, - // isChecked: false - // } } }, action: function(args) { diff --git a/ui/scripts/ui/core.js b/ui/scripts/ui/core.js index b869f337bb1..1f39fcc0a28 100644 --- a/ui/scripts/ui/core.js +++ b/ui/scripts/ui/core.js @@ -53,7 +53,6 @@ * @param args CloudStack3 configuration */ var showSection = function(sectionID, args) { - var $panel; var $browser = $('#browser div.container'); var $navItem = $('#navigation').find('li').filter(function() { return $(this).hasClass(sectionID); @@ -66,25 +65,25 @@ // Reset browser panels $browser.cloudBrowser('removeAllPanels'); - $panel = $browser.cloudBrowser('addPanel', { + $browser.cloudBrowser('addPanel', { title: _l(data.title), - data: '' + data: '', + complete: function($panel) { + // Hide breadcrumb if this is the home section + if (args.home === sectionID) { + $('#breadcrumbs').find('li:first, div.end:last').hide(); + } + + // Append specified widget to view + if (data.show) + $panel.append(data.show(data)); + else if (data.treeView) + $panel.treeView(data, { context: args.context }); + else + $panel.listView(data, { context: args.context }); + } }); - // Hide breadcrumb if this is the home section - if (args.home === sectionID) { - $('#breadcrumbs').find('li:first, div.end:last').hide(); - } - - // Append specified widget to view - if (data.show) - $panel.append(data.show(data)); - else if (data.treeView) - $panel.treeView(data, { context: args.context }); - else - $panel.listView(data, { context: args.context }); - - return $navItem; }; diff --git a/ui/scripts/ui/widgets/cloudBrowser.js b/ui/scripts/ui/widgets/cloudBrowser.js index 53e53ccfe78..31d900379c4 100644 --- a/ui/scripts/ui/widgets/cloudBrowser.js +++ b/ui/scripts/ui/widgets/cloudBrowser.js @@ -357,6 +357,7 @@ * Clear all panels */ removeAllPanels: function(args) { + $('div.panel').stop(); // Prevent destroyed panels from animating this.element.find('div.panel').remove(); $('#breadcrumbs').find('ul li').remove(); $('#breadcrumbs').find('ul div.end').remove(); diff --git a/ui/scripts/ui/widgets/detailView.js b/ui/scripts/ui/widgets/detailView.js index 12fe68679ce..cbddc2b3e83 100644 --- a/ui/scripts/ui/widgets/detailView.js +++ b/ui/scripts/ui/widgets/detailView.js @@ -8,18 +8,20 @@ var $newRow; var jsonObj = $row.data('json-obj'); - $listView.listView('replaceItem', { - $row: $row, - data: $.extend(jsonObj, newData), - after: function($newRow) { - $detailView.data('list-view-row', $newRow); - - setTimeout(function() { - $('.data-table').dataTable('selectRow', $newRow.index()); - }, 100); - } - }); + if($listView.length > 0 ) { //$listView.length is 0 after calling $(window).trigger('cloudStack.fullRefresh') + $listView.listView('replaceItem', { + $row: $row, + data: $.extend(jsonObj, newData), + after: function($newRow) { + $detailView.data('list-view-row', $newRow); + setTimeout(function() { + $('.data-table').dataTable('selectRow', $newRow.index()); + }, 100); + } + }); + } + // Refresh detail view context $.extend( $detailView.data('view-args').context[ diff --git a/ui/scripts/ui/widgets/multiEdit.js b/ui/scripts/ui/widgets/multiEdit.js index c884d2e883a..44eecef0383 100644 --- a/ui/scripts/ui/widgets/multiEdit.js +++ b/ui/scripts/ui/widgets/multiEdit.js @@ -112,7 +112,7 @@ }).find('option').filter(function() { return $(this).val() == data[fieldName]; }).html())); - } else if (field.addButton && $.isArray(itemData) && !options.noSelect) { + } else if (field.addButton && !options.noSelect) { if (options.multipleAdd) { $addButton.click(function() { _medit.vmList($multi, @@ -670,7 +670,7 @@ var $range = $('
    ').addClass('range').appendTo($td); $(field.range).each(function() { - $('') + var $input = $('') .attr({ name: this, type: 'text' @@ -680,9 +680,11 @@ .appendTo( $('
    ').addClass('range-item').appendTo($range) ); + + if (field.isDisabled) $input.hide(); }); } else { - $('') + var $input = $('') .attr({ name: fieldName, type: field.isPassword ? 'password' : 'text' @@ -690,6 +692,8 @@ .addClass(!field.isOptional ? 'required' : null) .attr('disabled', field.isDisabled ? 'disabled' : false) .appendTo($td); + + if (field.isDisabled) $input.hide(); } } else if (field.custom) { $('
    ').addClass('button add-vm custom-action') diff --git a/ui/scripts/zoneWizard.js b/ui/scripts/zoneWizard.js index d64c66ebedb..fc812dd3467 100644 --- a/ui/scripts/zoneWizard.js +++ b/ui/scripts/zoneWizard.js @@ -1423,7 +1423,10 @@ $("body").stopTime(updateNetworkServiceProviderTimer); if (result.jobstatus == 1) { //alert("Virtual Router Provider is enabled"); - + + if(args.data.pluginFrom != null && args.data.pluginFrom.name == "installWizard") { + selectedNetworkOfferingHavingSG = args.data.pluginFrom.selectedNetworkOfferingHavingSG; + } if(selectedNetworkOfferingHavingSG == true) { //need to Enable security group provider first // get network service provider ID of Security Group var securityGroupProviderId; diff --git a/usage/src/com/cloud/usage/UsageManagerImpl.java b/usage/src/com/cloud/usage/UsageManagerImpl.java index b6f59b4a993..0879b22cb05 100644 --- a/usage/src/com/cloud/usage/UsageManagerImpl.java +++ b/usage/src/com/cloud/usage/UsageManagerImpl.java @@ -1028,8 +1028,8 @@ public class UsageManagerImpl implements UsageManager, Runnable { long id = event.getResourceId(); long sourceNat = event.getSize(); boolean isSourceNat = (sourceNat == 1) ? true : false ; - boolean isElastic = (event.getTemplateId() == null || event.getTemplateId() == 0) ? false : true ; - UsageIPAddressVO ipAddressVO = new UsageIPAddressVO(id, event.getAccountId(), acct.getDomainId(), zoneId, ipAddress, isSourceNat, isElastic, event.getCreateDate(), null); + boolean isSystem = (event.getTemplateId() == null || event.getTemplateId() == 0) ? false : true ; + UsageIPAddressVO ipAddressVO = new UsageIPAddressVO(id, event.getAccountId(), acct.getDomainId(), zoneId, ipAddress, isSourceNat, isSystem, event.getCreateDate(), null); m_usageIPAddressDao.persist(ipAddressVO); } else if (EventTypes.EVENT_NET_IP_RELEASE.equals(event.getType())) { SearchCriteria sc = m_usageIPAddressDao.createSearchCriteria(); diff --git a/usage/src/com/cloud/usage/parser/IPAddressUsageParser.java b/usage/src/com/cloud/usage/parser/IPAddressUsageParser.java index 0eb30676b5b..309fa087d95 100644 --- a/usage/src/com/cloud/usage/parser/IPAddressUsageParser.java +++ b/usage/src/com/cloud/usage/parser/IPAddressUsageParser.java @@ -78,7 +78,7 @@ public class IPAddressUsageParser { String key = ""+IpId; // store the info in the IP map - IPMap.put(key, new IpInfo(usageIp.getZoneId(), IpId, usageIp.getAddress(), usageIp.isSourceNat(), usageIp.isElastic())); + IPMap.put(key, new IpInfo(usageIp.getZoneId(), IpId, usageIp.getAddress(), usageIp.isSourceNat(), usageIp.isSystem())); Date IpAssignDate = usageIp.getAssigned(); Date IpReleaseDeleteDate = usageIp.getReleased(); @@ -104,7 +104,7 @@ public class IPAddressUsageParser { // Only create a usage record if we have a runningTime of bigger than zero. if (useTime > 0L) { IpInfo info = IPMap.get(ipIdKey); - createUsageRecord(info.getZoneId(), useTime, startDate, endDate, account, info.getIpId(), info.getIPAddress(), info.isSourceNat(), info.isElastic); + createUsageRecord(info.getZoneId(), useTime, startDate, endDate, account, info.getIpId(), info.getIPAddress(), info.isSourceNat(), info.isSystem); } } @@ -123,7 +123,7 @@ public class IPAddressUsageParser { usageDataMap.put(key, ipUsageInfo); } - private static void createUsageRecord(long zoneId, long runningTime, Date startDate, Date endDate, AccountVO account, long IpId, String IPAddress, boolean isSourceNat, boolean isElastic) { + private static void createUsageRecord(long zoneId, long runningTime, Date startDate, Date endDate, AccountVO account, long IpId, String IPAddress, boolean isSourceNat, boolean isSystem) { if (s_logger.isDebugEnabled()) { s_logger.debug("Total usage time " + runningTime + "ms"); } @@ -142,7 +142,7 @@ public class IPAddressUsageParser { // Create the usage record UsageVO usageRecord = new UsageVO(zoneId, account.getAccountId(), account.getDomainId(), usageDesc, usageDisplay + " Hrs", UsageTypes.IP_ADDRESS, new Double(usage), IpId, - (isElastic?1:0), (isSourceNat?"SourceNat":""), startDate, endDate); + (isSystem?1:0), (isSourceNat?"SourceNat":""), startDate, endDate); m_usageDao.persist(usageRecord); } @@ -151,14 +151,14 @@ public class IPAddressUsageParser { private long IpId; private String IPAddress; private boolean isSourceNat; - private boolean isElastic; + private boolean isSystem; - public IpInfo(long zoneId,long IpId, String IPAddress, boolean isSourceNat, boolean isElastic) { + public IpInfo(long zoneId,long IpId, String IPAddress, boolean isSourceNat, boolean isSystem) { this.zoneId = zoneId; this.IpId = IpId; this.IPAddress = IPAddress; this.isSourceNat = isSourceNat; - this.isElastic = isElastic; + this.isSystem = isSystem; } public long getZoneId() { @@ -176,10 +176,5 @@ public class IPAddressUsageParser { public boolean isSourceNat() { return isSourceNat; } - - public boolean isElastic() { - return isElastic; - } } - }