diff --git a/agent/src/com/cloud/agent/resource/computing/KVMGuestOsMapper.java b/agent/src/com/cloud/agent/resource/computing/KVMGuestOsMapper.java index b03ab934b2b..4132d145be2 100644 --- a/agent/src/com/cloud/agent/resource/computing/KVMGuestOsMapper.java +++ b/agent/src/com/cloud/agent/resource/computing/KVMGuestOsMapper.java @@ -95,20 +95,22 @@ public class KVMGuestOsMapper { s_mapper.put("Fedora 8", "Fedora 8"); s_mapper.put("Ubuntu 10.04 (32-bit)", "Ubuntu 10.04"); s_mapper.put("Ubuntu 10.04 (64-bit)", "Ubuntu 10.04"); + s_mapper.put("Ubuntu 10.10 (32-bit)", "Ubuntu 10.10"); + s_mapper.put("Ubuntu 10.10 (64-bit)", "Ubuntu 10.10"); s_mapper.put("Ubuntu 9.10 (32-bit)", "Ubuntu 9.10"); s_mapper.put("Ubuntu 9.10 (64-bit)", "Ubuntu 9.10"); s_mapper.put("Ubuntu 9.04 (32-bit)", "Ubuntu 9.04"); s_mapper.put("Ubuntu 9.04 (64-bit)", "Ubuntu 9.04"); s_mapper.put("Ubuntu 8.10 (32-bit)", "Ubuntu 8.10"); s_mapper.put("Ubuntu 8.10 (64-bit)", "Ubuntu 8.10"); - s_mapper.put("Ubuntu 8.04 (32-bit)", "Ubuntu 8.04"); - s_mapper.put("Ubuntu 8.04 (64-bit)", "Ubuntu 8.04"); - s_mapper.put("Debian GNU/Linux 5.0 (32-bit)", "Debian GNU/Linux 5"); - s_mapper.put("Debian GNU/Linux 5.0 (64-bit)", "Debian GNU/Linux 5"); - s_mapper.put("Debian GNU/Linux 4.0 (32-bit)", "Debian GNU/Linux 4"); - s_mapper.put("Debian GNU/Linux 4.0 (64-bit)", "Debian GNU/Linux 4"); - s_mapper.put("Debian GNU/Linux 6.0 (64-bit)", "Debian GNU/Linux 6"); - s_mapper.put("Debian GNU/Linux 6.0 (32-bit)", "Debian GNU/Linux 6"); + s_mapper.put("Ubuntu 8.04 (32-bit)", "Other Linux"); + s_mapper.put("Ubuntu 8.04 (64-bit)", "Other Linux"); + s_mapper.put("Debian GNU/Linux 5(32-bit)", "Debian GNU/Linux 5"); + s_mapper.put("Debian GNU/Linux 5(64-bit)", "Debian GNU/Linux 5"); + s_mapper.put("Debian GNU/Linux 4(32-bit)", "Debian GNU/Linux 4"); + s_mapper.put("Debian GNU/Linux 4(64-bit)", "Debian GNU/Linux 4"); + s_mapper.put("Debian GNU/Linux 6(64-bit)", "Debian GNU/Linux 6"); + s_mapper.put("Debian GNU/Linux 6(32-bit)", "Debian GNU/Linux 6"); s_mapper.put("Other 2.6x Linux (32-bit)", "Other 2.6x Linux"); s_mapper.put("Other 2.6x Linux (64-bit)", "Other 2.6x Linux"); s_mapper.put("Other Linux (32-bit)", "Other Linux"); diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java index a43df2f3d37..3c31eebd415 100755 --- a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java +++ b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java @@ -3614,9 +3614,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements return false; } String guestOSName = KVMGuestOsMapper.getGuestOsName(guestOS); - if (guestOSName.startsWith("Ubuntu 10.04") - || guestOSName.startsWith("Ubuntu 9") - || guestOSName.startsWith("Ubuntu 8.10") + if (guestOS.startsWith("Ubuntu") || guestOSName.startsWith("Fedora 13") || guestOSName.startsWith("Fedora 12") || guestOSName.startsWith("Fedora 11") @@ -3625,11 +3623,13 @@ public class LibvirtComputingResource extends ServerResourceBase implements || guestOSName.startsWith("CentOS 5.3") || guestOSName.startsWith("CentOS 5.4") || guestOSName.startsWith("CentOS 5.5") + || guestOS.startsWith("CentOS") + || guestOS.startsWith("Fedora") || guestOSName.startsWith("Red Hat Enterprise Linux 5.3") || guestOSName.startsWith("Red Hat Enterprise Linux 5.4") || guestOSName.startsWith("Red Hat Enterprise Linux 5.5") || guestOSName.startsWith("Red Hat Enterprise Linux 6") - || guestOSName.startsWith("Debian GNU/Linux") + || guestOS.startsWith("Debian GNU/Linux") || guestOSName.startsWith("Other PV")) { return true; } else { diff --git a/api/src/com/cloud/agent/api/NetworkUsageAnswer.java b/api/src/com/cloud/agent/api/NetworkUsageAnswer.java index 973bef08946..00b84ee29e5 100644 --- a/api/src/com/cloud/agent/api/NetworkUsageAnswer.java +++ b/api/src/com/cloud/agent/api/NetworkUsageAnswer.java @@ -34,6 +34,10 @@ public class NetworkUsageAnswer extends Answer { this.bytesSent = bytesSent; routerName = cmd.getDomRName(); } + + public NetworkUsageAnswer(Command command, Exception e) { + super(command, e); + } public void setBytesReceived(Long bytesReceived) { diff --git a/api/src/com/cloud/api/ApiConstants.java b/api/src/com/cloud/api/ApiConstants.java index 665bfac9527..49ef2b94ef5 100755 --- a/api/src/com/cloud/api/ApiConstants.java +++ b/api/src/com/cloud/api/ApiConstants.java @@ -331,6 +331,7 @@ public class ApiConstants { public static final String SORT_BY = "sortby"; public static final String CHANGE_CIDR = "changecidr"; public static final String PURPOSE = "purpose"; + public static final String IS_TAGGED = "istagged"; public enum HostDetails { all, capacity, events, stats, min; diff --git a/api/src/com/cloud/api/commands/ListNetworkOfferingsCmd.java b/api/src/com/cloud/api/commands/ListNetworkOfferingsCmd.java index 98ffe270d91..533da004414 100644 --- a/api/src/com/cloud/api/commands/ListNetworkOfferingsCmd.java +++ b/api/src/com/cloud/api/commands/ListNetworkOfferingsCmd.java @@ -28,7 +28,6 @@ import com.cloud.api.BaseListCmd; import com.cloud.api.IdentityMapper; import com.cloud.api.Implementation; import com.cloud.api.Parameter; -import com.cloud.api.BaseCmd.CommandType; import com.cloud.api.response.ListResponse; import com.cloud.api.response.NetworkOfferingResponse; import com.cloud.offering.NetworkOffering; @@ -88,7 +87,10 @@ public class ListNetworkOfferingsCmd extends BaseListCmd { private Boolean specifyIpRanges; @Parameter(name=ApiConstants.TAGS, type=CommandType.STRING, description="list network offerings by tags", length=4096) - private String tags; + private String tags; + + @Parameter(name=ApiConstants.IS_TAGGED, type=CommandType.BOOLEAN, description="true if offering has tags specified") + private Boolean isTagged; ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// @@ -154,6 +156,10 @@ public class ListNetworkOfferingsCmd extends BaseListCmd { return tags; } + public Boolean isTagged() { + return isTagged; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/api/src/com/cloud/api/commands/ListNetworksCmd.java b/api/src/com/cloud/api/commands/ListNetworksCmd.java index ae1e37bbc65..8724f784206 100644 --- a/api/src/com/cloud/api/commands/ListNetworksCmd.java +++ b/api/src/com/cloud/api/commands/ListNetworksCmd.java @@ -49,7 +49,7 @@ public class ListNetworksCmd extends BaseListProjectAndAccountResourcesCmd { @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.LONG, description="the Zone ID of the network") private Long zoneId; - @Parameter(name=ApiConstants.TYPE, type=CommandType.STRING, description="the type of the network") + @Parameter(name=ApiConstants.TYPE, type=CommandType.STRING, description="the type of the network. Supported values are: Isolated and Shared") private String guestIpType; @Parameter(name=ApiConstants.IS_SYSTEM, type=CommandType.BOOLEAN, description="true if network is system, false otherwise") diff --git a/api/src/com/cloud/api/commands/ListVMsCmd.java b/api/src/com/cloud/api/commands/ListVMsCmd.java index 132953b2f5d..4299b4b014b 100755 --- a/api/src/com/cloud/api/commands/ListVMsCmd.java +++ b/api/src/com/cloud/api/commands/ListVMsCmd.java @@ -85,7 +85,8 @@ public class ListVMsCmd extends BaseListProjectAndAccountResourcesCmd { @Parameter(name=ApiConstants.STORAGE_ID, type=CommandType.LONG, description="the storage ID where vm's volumes belong to") private Long storageId; - @Parameter(name=ApiConstants.DETAILS, type=CommandType.LIST, collectionType=CommandType.STRING, description="comma separated list of host details requested, value can be a list of [all, group, nics, stats, secgrp, tmpl, servoff, iso, volume, min]" ) + @Parameter(name=ApiConstants.DETAILS, type=CommandType.LIST, collectionType=CommandType.STRING, description="comma separated list of host details requested, " + + "value can be a list of [all, group, nics, stats, secgrp, tmpl, servoff, iso, volume, min]. If no parameter is passed in, the details will be defaulted to all" ) private List viewDetails; diff --git a/api/src/com/cloud/api/commands/MigrateVMCmd.java b/api/src/com/cloud/api/commands/MigrateVMCmd.java index a51604e99d2..df612696b5c 100644 --- a/api/src/com/cloud/api/commands/MigrateVMCmd.java +++ b/api/src/com/cloud/api/commands/MigrateVMCmd.java @@ -40,7 +40,7 @@ import com.cloud.user.UserContext; import com.cloud.uservm.UserVm; import com.cloud.vm.VirtualMachine; -@Implementation(description="Attempts Migration of a user virtual machine to the host specified.", responseObject=UserVmResponse.class) +@Implementation(description="Attempts Migration of a VM to a different host or Root volume of the vm to a different storage pool", responseObject=UserVmResponse.class) public class MigrateVMCmd extends BaseAsyncCmd { public static final Logger s_logger = Logger.getLogger(MigrateVMCmd.class.getName()); @@ -51,7 +51,7 @@ public class MigrateVMCmd extends BaseAsyncCmd { ///////////////////////////////////////////////////// @IdentityMapper(entityTableName="host") - @Parameter(name=ApiConstants.HOST_ID, type=CommandType.LONG, required=false, description="destination Host ID to migrate VM to") + @Parameter(name=ApiConstants.HOST_ID, type=CommandType.LONG, required=false, description="Destination Host ID to migrate VM to. Required for live migrating a VM from host to host") private Long hostId; @IdentityMapper(entityTableName="vm_instance") @@ -59,7 +59,7 @@ public class MigrateVMCmd extends BaseAsyncCmd { private Long virtualMachineId; @IdentityMapper(entityTableName="storage_pool") - @Parameter(name=ApiConstants.STORAGE_ID, type=CommandType.LONG, required=false, description="destination storage pool ID to migrate VM to") + @Parameter(name=ApiConstants.STORAGE_ID, type=CommandType.LONG, required=false, description="Destination storage pool ID to migrate VM volumes to. Required for migrating the root disk volume") private Long storageId; ///////////////////////////////////////////////////// diff --git a/api/src/com/cloud/deploy/DataCenterDeployment.java b/api/src/com/cloud/deploy/DataCenterDeployment.java index 222ab9a23cc..bac8e841bb6 100644 --- a/api/src/com/cloud/deploy/DataCenterDeployment.java +++ b/api/src/com/cloud/deploy/DataCenterDeployment.java @@ -18,6 +18,7 @@ package com.cloud.deploy; import com.cloud.deploy.DeploymentPlanner.ExcludeList; +import com.cloud.vm.ReservationContext; public class DataCenterDeployment implements DeploymentPlan { long _dcId; @@ -28,18 +29,24 @@ public class DataCenterDeployment implements DeploymentPlan { Long _physicalNetworkId; ExcludeList _avoids = null; boolean _recreateDisks; + ReservationContext _context; public DataCenterDeployment(long dataCenterId) { this(dataCenterId, null, null, null, null, null); } public DataCenterDeployment(long dataCenterId, Long podId, Long clusterId, Long hostId, Long poolId, Long physicalNetworkId) { + this(dataCenterId, podId, clusterId, hostId, poolId, physicalNetworkId, null); + } + + public DataCenterDeployment(long dataCenterId, Long podId, Long clusterId, Long hostId, Long poolId, Long physicalNetworkId, ReservationContext context) { _dcId = dataCenterId; _podId = podId; _clusterId = clusterId; _hostId = hostId; _poolId = poolId; _physicalNetworkId = physicalNetworkId; + _context = context; } @Override @@ -81,4 +88,10 @@ public class DataCenterDeployment implements DeploymentPlan { public Long getPhysicalNetworkId() { return _physicalNetworkId; } + + @Override + public ReservationContext getReservationContext() { + return _context; + } + } diff --git a/api/src/com/cloud/deploy/DeploymentPlan.java b/api/src/com/cloud/deploy/DeploymentPlan.java index 91ad5825ba5..1f90635d2d2 100644 --- a/api/src/com/cloud/deploy/DeploymentPlan.java +++ b/api/src/com/cloud/deploy/DeploymentPlan.java @@ -18,6 +18,7 @@ package com.cloud.deploy; import com.cloud.deploy.DeploymentPlanner.ExcludeList; +import com.cloud.vm.ReservationContext; /** * Describes how a VM should be deployed. @@ -65,4 +66,6 @@ public interface DeploymentPlan { public ExcludeList getAvoids(); Long getPhysicalNetworkId(); + + ReservationContext getReservationContext(); } diff --git a/api/src/com/cloud/storage/StorageService.java b/api/src/com/cloud/storage/StorageService.java index 60cd55c9d45..022f9ef4765 100644 --- a/api/src/com/cloud/storage/StorageService.java +++ b/api/src/com/cloud/storage/StorageService.java @@ -33,7 +33,7 @@ import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceInUseException; import com.cloud.exception.ResourceUnavailableException; -public interface StorageService { +public interface StorageService{ /** * Create StoragePool based on uri * diff --git a/build/eula.html b/build/license/eula.en.html similarity index 100% rename from build/eula.html rename to build/license/eula.en.html diff --git a/build/license/eula.ja.html b/build/license/eula.ja.html new file mode 100755 index 00000000000..75b4631414b --- /dev/null +++ b/build/license/eula.ja.html @@ -0,0 +1 @@ +

CITRIX® ライセンス契約書

この文書は、ライセンスを許諾されるユーザー (以下「お客様」といいます) と Citrix Systems, Inc、、Citrix Systems International GmbH、または Citrix Systems Asia Pacific Pty Ltd. との間で締結される法的に有効な契約 (以下「本契約」といいます) です。お客様がこの製品または Feature Release (以下、総称して「本製品」といいます) またはテクニカル サポート (以下「サポート」といいます) の引渡しを受ける具体的場所によって、本契約に基づく提供主体が決定されます (該当する法人を、以下「CITRIX」といいます)。アメリカ合衆国デラウェア州法人である Citrix Systems, Inc. は、北米、中米、および南米の各諸国ならびに日本において、本製品のライセンス許諾を提供し、北米、中米、および南米の各諸国において、サポートを提供しています。Citrix Systems, Inc. が全株式を保有するスイス連邦共和国法人である Citrix Systems International GmbH は、ヨーロッパ、中東、およびアフリカにおいて、本製品のライセンス許諾およびサポートを提供し、アジアおよび太平洋沿岸の各諸国 (日本を除く) において、本製品のライセンス許諾を提供しています。Citrix Systems Asia Pacific Pty Ltd. は、アジアおよび太平洋沿岸の各諸国 (日本を除く) において、サポートを提供しています。シトリックス・システムズ・ジャパン株式会社は、日本において、サポートを提供しています。本製品をインストールおよび/または使用することにより、お客様は本契約条項に同意されたものとします。本契約条項に同意いただけない場合、本製品をインストールおよび/または使用しないでください。

1. ライセンスの許諾。本製品は Citrix が所有権を有するソフトウェア プログラムであり、本契約に基づいてオブジェクト コード形式で配布されます。本製品のライセンスは、CPU ソケット モデルに基づいて許諾されます。ライセンス モデルで定義される、ソフトウェアを使用可能にするライセンス (以下「ライセンス」といいます) によって、本製品がアクティブ化されます。

CPU ソケット モデル条件では、「CPU ソケット」は、CPU を搭載するか否かにかかわらず、本製品を実行するサーバー上の個々の CPU ソケットを指します。

ほかの CITRIX 製品または本製品の別のエディションのライセンスを使って、本製品の許可される使用範囲を拡大することはできません。ライセンスは製品のバージョンごとに許諾されます。ライセンスのバージョンは、アクセスされる本製品と同じか新しいものである必要があります。CITRIX は、お客様に対し、本製品および付属文書 (以下、総称して「本ソフトウェア」といいます) について、次のとおり全世界での非独占的な権利を許諾します。

a. ライセンス。お客様は、合計して最大でお客様が購入されたライセンスに対応する数の CPU ソケットを搭載する複数のサーバー (以下「実稼働サーバー」といいます) に、本ソフトウェアをインストールすることができます。さらに、お客様は、実稼働サーバーで実行する本ソフトウェアをサポートするために、必要に応じて管理用サーバーに本ソフトウェアの管理部分をインストールすることができます。お客様は、内部ユーザーまたは第三者にクラウド サービスを提供するために、本ソフトウェアを使用することができます。実稼働環境と障害復旧環境の両方にインストールされている各ライセンスは、常に、いずれか一方の環境でのみ使用することができます。ただし、障害復旧環境の定期的なテストを行う場合に限り、当該ライセンスを両方の環境で同時に使用することができます。お客様は、本ソフトウェアの Web ユーザー インターフェイスのみをカスタマイズする権利を有します。

b. 永続的ライセンス。本ソフトウェアが「永続的ライセンス ソフトウェア」である場合は、本ソフトウェアは永続的に使用許諾され、サブスクリプション (下記第 2 条に定義します) による特典を受け取る権利が含まれるものとします。

c. 年間ライセンス。本ソフトウェアが「年間ライセンス ソフトウェア」である場合は、お客様のライセンスは 1 年間有効で、この期間中アップデートを受け取る権利が含まれます。ただし、サブスクリプション (下記第 2 条に定義します) に基づくものではありません。本契約においてアップデートとは、本ソフトウェア専用に一般に公開されたリリース版を意味するものとします。年間ライセンスの有効期間を延長するには、お客様は、現在のライセンスが失効する前に、新しいライセンスを購入しインストールしていただく必要があります。新しいライセンスを購入しインストールしていただけない場合は、年間ライセンス ソフトウェアを、ライセンスの有効期間失効後は使用いただけません。年間ライセンス ソフトウェアは、ライセンスの有効期間が失効した時点で自動的に無効となります。

d. パートナー デモ用ソフトウェア。本ソフトウェアに「Partner Demo (パートナー デモ用)」と記されている場合は、本契約の規定のいかんにかかわらず、お客様が現在 CITRIX 正規ディストリビューターまたは正規販売代理店である場合に限り、お客様の顧客の支援を目的として、デモンストレーション、テストまたは評価のためにのみ、本ソフトウェアを使用することができます。パートナー デモ用ソフトウェアは、お客様の顧客トレーニングを目的として使用することはできません。パートナー デモ用ソフトウェアは、ソフトウェア パッケージに記された期日に自動的に機能を停止します。

e. 評価用ソフトウェア。本ソフトウェアに「Evaluation (評価用)」と記されている場合は、本契約の規定のいかんにかかわらず、お客様自身の内部デモンストレーション、テストまたは評価のためにのみ、本ソフトウェアを使用することができます。評価用ソフトウェアは、ソフトウェア パッケージに記された期日に自動的に機能を停止します。

f. 保存用の複製。お客様は、バックアップのみを目的として、機械可読形態の本ソフトウェアの複製物を 1 部作成することができます。ただし、所有権に関するすべての表示を当該複製物に複写することを条件とします。

2. サブスクリプション権。永続的ライセンス ソフトウェアの初回サブスクリプション (以下「サブスクリプション」といいます) はサポートを含み、電子メールによるお客様に対するユーザー ライセンスの引渡日より開始します。サブスクリプションは、その後 1 年間存続しますが、毎年更新をご購入いただく必要があります (「サブスクリプション期間」)。最初のまたは更新されたサブスクリプション期間中、CITRIX は随時、アップデートを一般に公開する場合があります。サブスクリプション期間内にアップデートが公開された場合、CITRIX はお客様に対し、対象となるライセンスのアップデートを提供するものとします。お客様に引き渡される一切のアップデートは、本契約条項に基づく本ソフトウェアとみなされます。ただし、適用法令により許容される限度において、本ソフトウェアに適用される限定担保責任条項の対象外とします。本ソフトウェアに対する Subscription Advantage は、www.citrix.com に掲載される Citrix Product Lifecycle Support Policy (Citrix 製品ライフサイクル サポート ポリシー) に従って本ソフトウェアが提供されなくなるまでご購入いただけます。

お客様は、CITRIX が、本ソフトウェアの一部を使用し、本ソフトウェアの機能の一部または全部を実行できる、新規のもしくは異なるコンピューター プログラムまたは本ソフトウェアの別エディションを開発し販売できることを了承するものとします。本契約は、そのような新規もしくは異なるコンピューター プログラムまたはエディションに関する権利をお客様に許諾するものではありません。お客様は、CITRIX は、本契約によってアップデートを公開する義務を負わないことも了承するものとします。アップデートの引渡条件は、CITRIX の工場渡し条件 (Ex Works CITRIX) とします (2000 年インコタームズ準拠)。

3. サポート。サポートは、インシデント、テクニカル サポート コンタクト、対応時間、地理的な対応地域、テクニカル リレーションシップ マネジメント サービス、およびインフラストラクチャ評価オプションからなるさまざまな組み合わせにより販売されます。利用権の内容は、お客様が購入する商品により決定されます。「インシデント」とは、サポートを必要とする単一の問題およびその解決に必要とされる合理的な努力とします。最終的な解決策を見いだすためには、複数回の通話およびオフラインでの調査が必要となる可能性があります。インシデントの重大度によって、本ソフトウェアに対する対応レベルが決定されます。未使用のインシデントおよびそのほかの利用権は、各年間サポート期間の終了日に失効します。本ソフトウェアに対するサポートは、www.citrix.com に掲載される Citrix Product Lifecycle Support Policy (Citrix 製品ライフサイクル サポート ポリシー) に従って本ソフトウェアが提供されなくなるまでご購入いただけます。サポートは、CITRIX からお客様の所在地へ、リモートで提供されます。お客様の所在地への訪問が相互に合意された場合は、CITRIX は、お客様の出張規定に従って、妥当な旅費および滞在費をお客様に請求するものとします。CITRIX によるサポートの実施は、お客様に次の義務を履行いただくことを前提とします。(i) 主な管理担当者としてカスタマー サポート マネージャー (Customer Support Manager: 以下「CSM」といいます) を 1 名指名いただきます。(ii) ネームド コンタクト (CSM を含む) として、できれば CITRIX 認定資格を有する方を複数名指名いただきます。各ネームド コンタクト (CSM を除く) には、サポート担当者に連絡するための個別のサービス ID が提供されます。(iii) CITRIX の指示に従い、問題の特定および解決のための合理的な作業を行うことに同意いただきます。お客様には、このような要求に協力することに同意いただきます。(iv) ソフトウェアおよびデータの保全性および安全性を不正アクセスから保護するために必要な手続きを導入すること、および致命的なエラーにより消失または変更されたあらゆるファイルを再構築することに責任を負っていただきます。(v) お客様の所在地においてすべての機器、電話回線、通信インターフェイスおよびそのほかのハードウェアを調達、設置および保守すること、本ソフトウェアを操作するために、お客様の設備へのアクセスを CITRIX に必要に応じて提供すること、ならびに本契約により要求されるサービスを CITRIX が実施することを許可することに責任を負っていただきます。(vi) 現在入手可能および適用可能なすべての Hotfix、Hotfix ロールアップ パック、サービス パック等を、本ソフトウェアに時宜に即して適用いただきます。CITRIX は、次を原因とする問題に関連して、一切のサポート提供を要求されないものとします。(i) 本ソフトウェアに悪影響を与える、本ソフトウェア、オペレーティング システム、または環境に対するお客様または第三者による改変または追加。(ii) 異常または欠陥に対処しない、本ソフトウェアに対する CITRIX による改変または追加。(ii) CITRIX によって発行され、本製品に同封されている製品付属文書に定義されていない機能。(iii) 文書に定義されているプロセッサおよび周辺機器以外のプロセッサおよび周辺機器での本ソフトウェアの使用。(iv) 製造終了した本ソフトウェア。(v) 当事者によるコンサルティング成果物。「異常」とは、文書に定義されている機能に実質的に適合しない、本ソフトウェアにおける不具合のこととします。「欠陥」とは、文書に記載されている仕様に適合しない、本ソフトウェアにおける不具合のこととします。お客様の重大な問題に対して CITRIX が通常のサポート方法では十分な解決策を提供できない場合は、CITRIX はその製品開発チームに Private fix を作成させる場合があります。Private fix はお客様固有の状況に対処するために設計されるもので、CITRIX の書面による同意なしに、お客様の組織外で配布することはできません。CITRIX は、すべての Private fix に対するすべての権利、権原および利益を留保します。一切の Hotfix または Private fix は、本契約条項に基づく本ソフトウェアではなく、適用法令により許容される限度において、本ソフトウェアに適用される限定担保責任条項または知的財産権侵害補償条項の対象外とします。インフラストラクチャ評価またはそのほかのコンサルティング サービスについて、すべてのレポート、既存の著作物およびその二次的著作物、ならびに評価の実施にあたり作成、着想、創作、発見、発明または実用化される、インストール スクリプトその他成果物および開発成果にかかるすべての知的財産権は、CITRIX が単独かつ完全に有し続けるものとします。なお、お客様には、お客様の内部使用を目的に、この知的財産権に対する全世界での、非独占的な権利が許諾されます。

4. その他の権利、制限および義務。下記制限特約をすることが適用法令によって明示的に禁止されている限度を除き、お客様は、本ソフトウェアを譲渡、レンタル、タイムシェアリング、権利を許諾、およびリースすることはできません。お客様が本ソフトウェア以外の CITRIX ソフトウェアの CITRIX ライセンスと置き換えるために本ソフトウェアのライセンスを購入された場合で、この置換えが当該購入についての取引条件であるときは、お客様は、新しいライセンスおよび本ソフトウェアをインストールした後は、置き換えられた以前の CITRIX ライセンスを破棄し、いかなる複製物も保有しないことに合意するものとします。お客様は、ライセンスの追跡調査を目的として、当該置換対象ライセンスおよび置き換え後の対応ライセンスのシリアル番号を販売代理店または、請求ある場合、CITRIX に直接提供するものとします。本契約において明示的に許可される場合または下記制限特約をすることが適用法令によって明示的に禁止されている限度を除き、お客様は、本ソフトウェアを改変、翻訳、リバース エンジニア、逆コンパイル、逆アセンブル、本ソフトウェアに基づいた二次的著作物の作成、または複製物の作成をすることはできません。お客様は、本ソフトウェアから所有権に関する通知、ラベル、表示の一切を除去することはできません。お客様は、適用法令により許容される限度において、CITRIX が、事前通知をもって、お客様の通常営業時間内に本契約の遵守状況を調査することに同意いただくものとします。上記にかかわらず、本契約は、本ソフトウェアに含まれるかまたは共に提供される無償のオープン ソース コード、その関連文書および資料に対して、当該の無償のオープン ソース コード、その関連文書および資料を対象に適用される無償のオープン ソース ライセンスに基づいて、追加のまたは異なる権利をお客様が行使することを阻止または制限するものではありません。

明示的に許諾されていない本ソフトウェアのすべての権利は、CITRIX あるいはその製品供給者が留保します。

適用される強行法規 (たとえば、コンピューター プログラムの法的保護に関する EC 指令 91/250 に準拠した内国制定法) により、お客様が、CITRIX の同意を要せず、本ソフトウェアに係るある一定の情報を取得する権利を有する場合、お客様は、制定法上の当該権利を行使される前に先ず、CITRIX に対し書面でもって利用目的を明確にして当該情報を請求いただくものとします。CITRIX が、その単独の判断で当該情報の一部または全部の提供を拒否した場合に限り、お客様は、制定法上の当該権利を行使するものとします。

5. 侵害行為に対する補償。本ソフトウェア (オープン ソース ソフトウェアを除く) が第三者の特許または著作権を侵害するという申し立て (以下「侵害申立」といいます) に基づいて、お客様に対し提起される賠償請求、訴訟、または訴訟手続について、お客様が侵害申立についての通知を受けまたは発見したことを、CITRIX が当該の通知の遅れにより損害を受けないように速やかに CITRIX に書面で通知することを条件に、CITRIX は、当該の賠償請求、訴訟、または訴訟手続について、お客様の損失を補償し、また、CITRIX の選択により、訴訟追行または私的解決をするものとします。本第 5 条において「オープン ソース ソフトウェア」とは、オープン ソース ライセンス モデル (GNU General Public License、BSD、または Open Source Initiative により承認されるライセンスと同様のもの) に基づいて CITRIX により頒布されるソフトウェアを指します。CITRIX は、一切の侵害申立の訴訟追行または私的解決について単独の追行権限を有し、お客様は、侵害申立に対する攻撃・防禦について合理的な支援を提供するものとします。侵害申立の通知を受けて、または CITRIX が当該侵害申立の妥当性が高いと信じる場合、CITRIX は、その単独の費用と選択において、次の行為を行うことができます。(i) 侵害申立を受けた本ソフトウェアの使用を続行する権利をお客様のために獲得する、(ii) 本ソフトウェアを侵害しないものへ交換または変更する、または、(iii) 本ソフトウェアの返品を承認し、必要に応じて、お客様に返金する。以下の場合には、CITRIX は、あらゆる侵害申立または権利侵害の主張に対して、一切の責任を負いません。(i) 侵害申立により、本ソフトウェアの使用を停止すべきであると認識した後も、お客様が本ソフトウェアを使用した場合、(ii) お客様により、またはお客様の指示により本ソフトウェアが変更された場合、または (iii) 侵害申立が、本ソフトウェア単独の使用により避けられた場合に、CITRIX 製品でないプログラム、データ、ハードウェア、またはその他のものと、本ソフトウェアを組み合わせて使用した場合。上記内容は、あらゆる権利侵害主張に対するお客様の唯一の救済方法とします。

6. 限定担保責任および免責。CITRIX は、本ソフトウェアの引渡日から 90 日間、CITRIX によって発行され、本製品に同封されている製品付属文書どおりに本ソフトウェアが実質的に動作することを保証します。本限定担保責任条項に基づく CITRIX およびその製品供給者の全責任ならびにお客様の唯一の救済方法は、CITRIX 単独の選択および適用法令に従って、媒体または本ソフトウェアの交換、または購入金額の払戻と本契約の解約に限られます。ただし、お客様が本ソフトウェアを CITRIX またはその正規代理店に返品することが条件となります。本限定担保責任は、お客様による本ソフトウェアの一切の変更または関連問題についてはその対象といたしません。CITRIX は、専門職業的手法をもってお客様により要求されるサポートを提供しますが、お客様により提起されるすべての質問または問題が、一定の時間内に解決されることを保証するものではありません。コンサルティング サービスについて、本限定担保責任条項に基づく CITRIX およびその製品供給者の全責任ならびにお客様の唯一の救済方法は、サービスの再実施に限られます。

適用法令により許容される限度において、および本ソフトウェアに対する上記限定担保責任を除き、CITRIX およびその製品供給者は、明示、黙示、法令上その他いかなる担保責任または契約上の保証もお客様に付与するものではありません。また、CITRIX およびその製品供給者は、本ソフトウェア、アップデート、Subscription Advantage、およびサポートについて、品質、可用性、信頼性、安全性、またはコンピューター ウィルス、不具合、もしくは異常のないことに関わる一切の契約上の保証責任および、権原、平穏享有、平穏占有、商品性、第三者の権利を侵害しないこと、または特定目的への適合性を含む、一切の黙示の担保責任を否認します。本ソフトウェアは、その故障を直接の原因として人の生命、身体、財産または環境に係る深刻な被害をもたらすような装置との組合せによる使用または販売を目的として、設計、製造、または意図されたものではありません。お客様は、意図する結果を得るための本ソフトウェアおよびハードウェアの選択、ならびに、本ソフトウェアおよびハードウェアのインストール、使用、およびそれにより得られた結果について一切の責任を負うものとします。

7. 所有権。本ソフトウェアに係る権原および所有権は、お客様に譲渡されるものではありません。その改作物、変更物、翻訳、二次的著作物、および複製物を含め、本ソフトウェアに係るすべての知的財産権に係る一切の権原および所有権は、CITRIX および/またはそのライセンサーが保有し、留保します。お客様は、本ソフトウェアを使用するための限定的なライセンスを取得するものとします。

8. 輸出規制。お客様は、適切な政府の許可を得ずに、いかなる形態でも本ソフトウェアを輸出、再輸出または輸入しないことに合意します。お客様は、いかなる場合でも、アメリカ合衆国の禁輸対象国、アメリカ合衆国により取引の禁止を指定されている個人もしくは団体、またはアメリカ合衆国により特別に指定された同国人に対し、本ソフトウェアを輸出してはならないことを了解します。

9. 責任の限定。適用法令により許容される限度において、CITRIX もしくは、その関連会社、製品供給者、または正規ディストリビューターが、データまたは個人情報の喪失、収益の減損、機会または利益の逸失、回復費用、本ソフトウェアまたはサポートの使用により生じた損失、サードパーティ製ソフトウェアもしくはハードウェアの使用によって生じた損害、または、本契約に関連する、本ソフトウェアまたはサポート、関連資料、もしくは付属文書の使用によって生じた、またはお客様による本ソフトウェアの輸出、再輸出、もしくは輸入によって生じた、その他の特別、付随的、二次的、もしくは間接的な損害に対し、損害発生の態様またはその請求原因のいかんにかかわらず、一切責任を負わないものとします。この責任の限定は、CITRIX、その関連会社、製品供給者、または正規ディストリビューターが、当該損害の発生可能性を事前に通知されていた場合といえども、なお適用されるものとします。適用法令により許容される限度において、いかなる場合においても、CITRIX、その関連会社、製品供給者、または正規ディストリビューターの責任額は、問題となっている特定のソフトウェア、サブスクリプション (サポート付きのサブスクリプションを含む)、またはサポートを購入するためにお客様にお支払いいただいた金額を超えないものとします。お客様は、本ソフトウェアのライセンス料またはサポート料が、上記の危険負担を反映したものであることを了承するものとします。法域によっては、付随的または二次的損害に対する責任の限定または排除が認められていないことがあり、上記の責任の限定または排除がお客様に適用されない場合があります。本契約において「CITRIX の関連会社」とは、その 50% 以上の議決権を Citrix Systems, Inc. が直接または間接的に所有する法人をいいます。関連会社、製品供給者、および正規代理店は、本契約による利益を享受する第三受益者となります。

10. 解約。本契約は、本契約に基づき解約されない限り有効に存続するものとします。お客様は、本ソフトウェアをコンピューターから削除し、本ソフトウェアのすべての複製物を破棄し、解約するライセンスのシリアル番号を書面で CITRIX に通知することにより、いつでも本契約を解約することができます。CITRIX は、お客様の本契約に対する違反により、いつでも本契約を解約することができます。本ソフトウェアまたは付属文書の無許諾複製その他本契約に基づくライセンスの許諾条件に違反した場合、本契約は自動的に終了し、CITRIX はその他の一切の法的救済手段を講じることができるものとします。お客様は、本契約に対する重大な違反は、金銭損害賠償のみでは不十分な、回復不能な損害を CITRIX にもたらすこと、および、適用法令により許容される限度において、CITRIX が、保証金の支払いを要せず、差止命令による救済もしくは衡平法上の救済を受ける権利を有することに合意し、了承します。本契約の終了と同時に、本契約に基づいて許諾されたライセンスは終了するものとし、お客様は、直ちに本ソフトウェア、付属文書、およびすべてのバックアップ コピーを破棄しなければなりません。

11. お客様がアメリカ合衆国政府機関である場合。お客様がアメリカ合衆国政府機関である場合は、連邦調達規則第 12.212 条 (48 CFR 12.212 (1995 年 10 月)) ならびに国防連邦調達規則補遺第 227.7202-1 条および第 227.7202-3 条 (48 CFR 227.7202-1、227.7202-3 (1995 年 6 月)) に基づき、お客様は、本ソフトウェアが「商用コンピューター ソフトウェア」であり続けること、および、本契約により、本ソフトウェアのアメリカ合衆国政府またはその機関による使用、複製、および開示は、この標準的な商用ライセンス契約に定めるすべての条項、条件、制約、および制限に従うものとすることを了承するものとします。理由の如何を問わず、第 12.212 条、第 227.7202-1 条、または第 227.7202-3 条が適用法令とみなされない場合は、お客様は、アメリカ合衆国政府機関による本ソフトウェアの使用、複製、および開示の権利は、規定どおりに、48 CFR 第 52.227-19 条 (c) (1) および (2) 項 (1987 年 6 月)、または DFARS 第 252.227-7014 条 (a) (14) 項 (1995 年 6 月) に定義される「制限付き権利」に限定されることを了承するものとします。製造者は、Citrix Systems, Inc., 851 West Cypress Creek Road, Fort Lauderdale, Florida, 33309, United States of America です。

12. 正規ディストリビューターおよび正規販売代理店。CITRIX 正規ディストリビューターおよび販売代理店には、本契約を変更する権限、および CITRIX を拘束する一切の表明、約束、保証を行う権限はありません。

13. 準拠法および裁判籍の選択。提供者が Citrix Systems, Inc. の場合、本契約は、国際物品売買契約に関する国連条約の適用を排除し、かつ、抵触法の原則に関わりなく、アメリカ合衆国フロリダ州法に準拠するものとします。また、本契約に起因するいかなる紛争についても、お客様は、フロリダ州ブラウワード郡内の州裁判所および連邦裁判所が専属的に人的裁判管轄権ならびに裁判籍を有することに同意するものとします。提供者が Citrix Systems International GmbH の場合、本契約は、国際物品売買契約に関する国連条約の適用を排除し、かつ、抵触法の原則に関わりなく、スイス連邦共和国法に準拠するものとします。また、本契約に起因するいかなる紛争についても、お客様は、チューリッヒ州内の所管裁判所が専属的に人的裁判管轄権ならびに裁判籍を有することに同意するものとします。提供者が Citrix Systems Asia Pacific Pty Ltd の場合、本契約は、国際物品売買契約に関する国連条約の適用を排除し、オーストラリア連邦ニュー サウス ウェールズ州法に準拠するものとします。また、本契約に起因するいかなる紛争についても、お客様は、ニュー サウス ウェールズ州内の所管裁判所が専属的に人的裁判管轄権ならびに裁判籍を有することに同意するものとします。本契約の規定のいずれかが適用法令によって無効または強制不能であるとされた場合、その限度において、当該規定は削除、抹消されているものとみなし、本契約のその他すべての規定はなお有効に存続するものとします。当該規定が削除、抹消されているとみなす限りにおいて、両当事者は、本契約の当初の目的と整合性を有する方法で、本契約の残りの規定を遵守することに合意します。

14. CITRIX への連絡。本契約に関する質問その他 CITRIX へのお問い合わせは、CITRIX まで次の住所宛に書面でお送りください。Citrix Systems, Inc., Customer Service, 851 West Cypress Creek Road, Ft. Lauderdale, Florida 33309、Citrix Systems International GmbH, Rheinweg 9, CH-8200 Schaffhausen, Switzerland、または Citrix Systems Asia Pacific Pty Ltd., Level 3, 1 Julius Ave., Riverside Corporate Park, North Ryde NSW 2113, Sydney, Australia。

15. 商標。Citrix は、Citrix Systems, Inc. の米国およびそのほかの国における商標および/または登録商標です。

diff --git a/client/WEB-INF/classes/resources/messages.properties b/client/WEB-INF/classes/resources/messages.properties index 66cd415b0e5..a4e15e8d49a 100644 --- a/client/WEB-INF/classes/resources/messages.properties +++ b/client/WEB-INF/classes/resources/messages.properties @@ -1,4 +1,12 @@ #new labels (begin) ********************************************************************************************** +label.isolated.networks=Isolated networks +label.latest.events=Latest events +state.Enabled=Enabled +label.system.wide.capacity=System-wide capacity +label.network.service.providers=Network Service Providers +message.launch.zone=Zone is ready to launch; please proceed to the next step. +#new labels (end) ************************************************************************************************ + label.add.compute.offering=Add compute offering label.compute.offering=Compute offering label.compute.offerings=Compute offerings @@ -19,7 +27,6 @@ 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 diff --git a/client/WEB-INF/classes/resources/messages_ja.properties b/client/WEB-INF/classes/resources/messages_ja.properties index 5eb8fcd8a22..4314acd01fc 100644 --- a/client/WEB-INF/classes/resources/messages_ja.properties +++ b/client/WEB-INF/classes/resources/messages_ja.properties @@ -1,21 +1,32 @@ #new labels (begin) ********************************************************************************************** -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. +label.isolated.networks=Isolated networks +label.latest.events=Latest events +state.Enabled=Enabled +label.system.wide.capacity=System-wide capacity +label.network.service.providers=Network service providers +message.launch.zone=Zone is ready to launch; please proceed to the next step. #new labels (end) ************************************************************************************************ +label.add.compute.offering=コンピューティング オファリングの追加 +label.compute.offering=コンピューティング オファリング +label.compute.offerings=コンピューティング オファリング +label.select.offering=オファリングの選択 +label.menu.infrastructure=インフラストラクチャ +label.sticky.tablesize=テーブル サイズ +label.sticky.expire=失効 +label.sticky.cookie-name=Cookie 名 +label.sticky.mode=モード +label.sticky.length=長さ +label.sticky.holdtime=保持時間 +label.sticky.request-learn=ラーニングの要求 +label.sticky.prefix=プレフィックス +label.sticky.nocache=キャッシュなし +label.sticky.indirect=間接 +label.sticky.postonly=ポストのみ +label.sticky.domain=ドメイン +state.Allocating=割り当て中 +state.Migrating=移行中 +error.please.specify.physical.network.tags=この物理ネットワークのタグを指定しなければ、ネットワーク オファリングは使用できません。 state.Stopping=停止しています @@ -201,7 +212,7 @@ message.disable.vpn=VPN を無効にしてもよろしいですか? label.disable.vpn=VPN の無効化 message.enable.vpn=この IP アドレスに対する VPN アクセスを有効にしてもよろしいですか? label.enable.vpn=VPN の有効化 -message.acquire.new.ip=このネットワークのネット IP アドレスを取得してもよろしいですか? +message.acquire.new.ip=このネットワークの新しい IP アドレスを取得してもよろしいですか? label.elastic=エラスティック label.my.network=マイ ネットワーク label.add.vms=VM の追加 @@ -318,7 +329,7 @@ label.guest.type=ゲストの種類 label.specify.IP.ranges=IP アドレスの範囲の指定 label.conserve.mode=節約モード label.created.by.system=システム作成 -label.menu.system.service.offerings=システム サービス オファリング +label.menu.system.service.offerings=システム オファリング label.add.system.service.offering=システム サービス オファリングの追加 label.redundant.router.capability=冗長ルーター機能 label.supported.source.NAT.type=サポートされる送信元 NAT の種類 @@ -439,7 +450,7 @@ label.physical.network=物理ネットワーク label.public.traffic=パブリック トラフィック label.guest.traffic=ゲスト トラフィック label.storage.traffic=ストレージ トラフィック -message.setup.physical.network.during.zone.creation=拡張ゾーンを追加するときは、1 つ以上の物理ネットワークをセットアップする必要があります。各ネットワークは管理サーバー上の 1 つの NIC に対応します。各物理ネットワークでは、組み合わせに制限がありますが、1 つ以上の種類のトラフィックを通信できます。

各物理ネットワークに対してトラフィックの種類をドラッグアンドドロップしてください。 +message.setup.physical.network.during.zone.creation=拡張ゾーンを追加するときは、1 つ以上の物理ネットワークをセットアップする必要があります。各ネットワークはハイパーバイザー上の 1 つの NIC に対応します。各物理ネットワークでは、組み合わせに制限がありますが、1 つ以上の種類のトラフィックを通信できます。

各物理ネットワークに対してトラフィックの種類をドラッグ アンド ドロップしてください。 label.add.physical.network=物理ネットワークの追加 label.traffic.types=トラフィックの種類 label.management=管理 @@ -1255,7 +1266,7 @@ message.add.pod=ゾーン に新し message.add.primary.storage=ゾーン のポッド に新しいプライマリ ストレージを追加します message.add.primary=新しいプライマリ ストレージを追加するために、次のパラメーターを指定してください。 message.add.secondary.storage=ゾーン に新しいストレージを追加します -message.add.service.offering=新しいサービス オファリングを追加するために、次のデータを入力してください。 +message.add.service.offering=新しいコンピューティング オファリングを追加するために、次のデータを入力してください。 message.add.template=新しいテンプレートを作成するために、次のデータを入力してください。 message.add.volume=新しいボリュームを追加するために、次のデータを入力してください。 message.additional.networks.desc=仮想インスタンスが接続する追加のネットワークを選択してください。 diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 9078d5ed1ad..2f3ad9094d7 100755 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -248,7 +248,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe protected String _name; protected String _username; protected Queue _password=new LinkedList(); - protected final int _retry = 24; + protected final int _retry = 100; protected final int _sleep = 10000; protected long _dcId; protected String _pod; diff --git a/core/src/com/cloud/hypervisor/xen/resource/XenServer56Resource.java b/core/src/com/cloud/hypervisor/xen/resource/XenServer56Resource.java index 02f08f02c5d..5295de76d90 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/XenServer56Resource.java +++ b/core/src/com/cloud/hypervisor/xen/resource/XenServer56Resource.java @@ -169,15 +169,20 @@ public class XenServer56Resource extends CitrixResourceBase { } protected NetworkUsageAnswer execute(NetworkUsageCommand cmd) { - Connection conn = getConnection(); - if(cmd.getOption()!=null && cmd.getOption().equals("create") ){ - String result = networkUsage(conn, cmd.getPrivateIP(), "create", null); - NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, result, 0L, 0L); + try { + Connection conn = getConnection(); + if(cmd.getOption()!=null && cmd.getOption().equals("create") ){ + String result = networkUsage(conn, cmd.getPrivateIP(), "create", null); + NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, result, 0L, 0L); + return answer; + } + long[] stats = getNetworkStats(conn, cmd.getPrivateIP()); + NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, "", stats[0], stats[1]); return answer; + } catch (Exception ex) { + s_logger.warn("Failed to get network usage stats due to ", ex); + return new NetworkUsageAnswer(cmd, ex); } - long[] stats = getNetworkStats(conn, cmd.getPrivateIP()); - NetworkUsageAnswer answer = new NetworkUsageAnswer(cmd, "", stats[0], stats[1]); - return answer; } @Override diff --git a/core/src/com/cloud/hypervisor/xen/resource/XenServerConnectionPool.java b/core/src/com/cloud/hypervisor/xen/resource/XenServerConnectionPool.java index d2124fc9f55..a9f7f61505d 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/XenServerConnectionPool.java +++ b/core/src/com/cloud/hypervisor/xen/resource/XenServerConnectionPool.java @@ -667,11 +667,9 @@ public class XenServerConnectionPool { } PoolEmergencyResetMaster(ipAddress, mConn.getIp(), mConn.getUsername(), mConn.getPassword()); } catch (Exception e) { - String msg = "Master can not talk to Slave " + hostUuid + " IP " + ipAddress; - if (s_logger.isDebugEnabled()) { - s_logger.debug(msg); - } - throw new CloudRuntimeException(msg); + String msg = "Echo test failed on host " + hostUuid + " IP " + ipAddress; + s_logger.warn(msg, e); + throw new CloudRuntimeException(msg, e); } } } diff --git a/core/src/com/cloud/storage/template/VmdkProcessor.java b/core/src/com/cloud/storage/template/VmdkProcessor.java index f3dbbda3fea..2e1e1f42d06 100644 --- a/core/src/com/cloud/storage/template/VmdkProcessor.java +++ b/core/src/com/cloud/storage/template/VmdkProcessor.java @@ -64,7 +64,7 @@ public class VmdkProcessor implements Processor { File templateFile = new File(templateFileFullPath); Script command = new Script("tar", 0, s_logger); - command.add("--no-same-owner", templateFileFullPath); + command.add("--no-same-owner"); command.add("-xf", templateFileFullPath); command.setWorkDir(templateFile.getParent()); String result = command.execute(); diff --git a/debian/cloud-client.install b/debian/cloud-client.install index d182bed9ba5..4be024dcae4 100644 --- a/debian/cloud-client.install +++ b/debian/cloud-client.install @@ -15,6 +15,10 @@ /etc/cloud/management/web.xml /etc/cloud/management/server-nonssl.xml /etc/cloud/management/tomcat6-nonssl.conf +/etc/cloud/management/virtualrouter_commands.properties +/etc/cloud/management/f5bigip_commands.properties +/etc/cloud/management/junipersrx_commands.properties +/etc/cloud/management/netscalerloadbalancer_commands.properties /etc/cloud/management/Catalina /etc/cloud/management/Catalina/localhost /etc/cloud/management/Catalina/localhost/client diff --git a/docs/2.2/CloudStack2.2.13AdminGuide.docx b/docs/2.2/CloudStack2.2.13AdminGuide.docx index 6a4c56975e4..401e176a833 100644 Binary files a/docs/2.2/CloudStack2.2.13AdminGuide.docx and b/docs/2.2/CloudStack2.2.13AdminGuide.docx differ diff --git a/docs/2.2/CloudStack2.2.13InstallGuide.docx b/docs/2.2/CloudStack2.2.13InstallGuide.docx index ca036e04d88..c14719eba67 100644 Binary files a/docs/2.2/CloudStack2.2.13InstallGuide.docx and b/docs/2.2/CloudStack2.2.13InstallGuide.docx differ diff --git a/docs/2.2/CloudStack2.2.14ReleaseNotes.docx b/docs/2.2/CloudStack2.2.14ReleaseNotes.docx index ab1610d743c..c9266e2d785 100644 Binary files a/docs/2.2/CloudStack2.2.14ReleaseNotes.docx and b/docs/2.2/CloudStack2.2.14ReleaseNotes.docx differ diff --git a/docs/2.2/CloudStack2.2DeveloperGuide.docx b/docs/2.2/CloudStack2.2DeveloperGuide.docx index 49685c16fad..8cf81eb6217 100644 Binary files a/docs/2.2/CloudStack2.2DeveloperGuide.docx and b/docs/2.2/CloudStack2.2DeveloperGuide.docx differ diff --git a/docs/2.2/CloudStack2.2UserInterfaceCustomization.docx b/docs/2.2/CloudStack2.2UserInterfaceCustomization.docx index 63ff9106f76..545f3d1a150 100644 Binary files a/docs/2.2/CloudStack2.2UserInterfaceCustomization.docx and b/docs/2.2/CloudStack2.2UserInterfaceCustomization.docx differ diff --git a/docs/2.2/downloads.html b/docs/2.2/downloads.html index 50eb07da36a..c401ea64ac0 100644 --- a/docs/2.2/downloads.html +++ b/docs/2.2/downloads.html @@ -75,6 +75,10 @@
  • + Install Guide
  • + Administration Guide
  • + UI Customization Guide
  • +
  • + API documentation -- User role
  • +
  • + API documentation -- Domain Admin role
  • +
  • + API documentation -- Root Admin role
  • + diff --git a/docs/images/ChangePassword.png b/docs/images/ChangePassword.png new file mode 100644 index 00000000000..6d0e29b7911 Binary files /dev/null and b/docs/images/ChangePassword.png differ diff --git a/docs/images/DeleteButton.png b/docs/images/DeleteButton.png new file mode 100644 index 00000000000..668f04e00bf Binary files /dev/null and b/docs/images/DeleteButton.png differ diff --git a/docs/images/EditButton.png b/docs/images/EditButton.png new file mode 100644 index 00000000000..f329aef4a25 Binary files /dev/null and b/docs/images/EditButton.png differ diff --git a/docs/images/EnableStaticNAT.png b/docs/images/EnableStaticNAT.png new file mode 100644 index 00000000000..15693512ee5 Binary files /dev/null and b/docs/images/EnableStaticNAT.png differ diff --git a/docs/images/VMConsoleButton.png b/docs/images/VMConsoleButton.png new file mode 100644 index 00000000000..993aa4f2cf3 Binary files /dev/null and b/docs/images/VMConsoleButton.png differ diff --git a/patches/systemvm/debian/config/root/ipassoc.sh b/patches/systemvm/debian/config/root/ipassoc.sh index 3fdc3f17d9f..0e2c57764a6 100644 --- a/patches/systemvm/debian/config/root/ipassoc.sh +++ b/patches/systemvm/debian/config/root/ipassoc.sh @@ -114,7 +114,7 @@ convert_primary_to_32() { fi if [ "$mask" != "32" ] then - sudo ip addr add dev $ethDev $ipNoMask/32 + ip_addr_add $ethDev $ipNoMask/32 fi done #delete primaries @@ -170,6 +170,13 @@ copy_routes_from_main() { return 0; } +ip_addr_add() { + local dev="$1" + local ip="$2" + local brd=`TERM=linux ipcalc $ip|grep Broadcast|awk -F' ' '{print $2}'` + sudo ip addr add dev $dev $ip broadcast $brd +} + add_routing() { local pubIp=$1 logger -t cloud "$(basename $0):Add routing $pubIp on interface $ethDev" @@ -237,7 +244,7 @@ add_first_ip() { local old_state=$? convert_primary_to_32 $pubIp - sudo ip addr add dev $ethDev $pubIp + ip_addr_add $ethDev $pubIp if [ "$mask" != "32" ] && [ "$mask" != "" ] then # remove if duplicat ip with 32 mask, this happens when we are promting the ip to primary @@ -301,7 +308,7 @@ add_an_ip () { sudo ip link show $ethDev | grep "state DOWN" > /dev/null local old_state=$? - sudo ip addr add dev $ethDev $pubIp ; + ip_addr_add $ethDev $pubIp add_snat $1 if [ $if_keep_state -ne 1 -o $old_state -ne 0 ] then @@ -335,7 +342,7 @@ remove_an_ip () { if [ -n "$replaceIpMask" ]; then sudo ip addr del dev $ethDev $replaceIpMask; replaceIp=`echo $replaceIpMask | awk -F/ '{print $1}'`; - sudo ip addr add dev $ethDev $replaceIp/$existingMask; + ip_addr_add $ethDev $replaceIp/$existingMask fi result=$? fi diff --git a/scripts/vm/hypervisor/xenserver/fsimage.so b/scripts/vm/hypervisor/xenserver/fsimage.so deleted file mode 100755 index 05e0d041d91..00000000000 Binary files a/scripts/vm/hypervisor/xenserver/fsimage.so and /dev/null differ diff --git a/scripts/vm/hypervisor/xenserver/xenserver56/fsimage.so b/scripts/vm/hypervisor/xenserver/xenserver56/fsimage.so new file mode 100755 index 00000000000..a9f1cf9d5fd Binary files /dev/null and b/scripts/vm/hypervisor/xenserver/xenserver56/fsimage.so differ diff --git a/scripts/vm/hypervisor/xenserver/xenserver56/patch b/scripts/vm/hypervisor/xenserver/xenserver56/patch index 20f622778a7..ab91d515231 100644 --- a/scripts/vm/hypervisor/xenserver/xenserver56/patch +++ b/scripts/vm/hypervisor/xenserver/xenserver56/patch @@ -40,7 +40,7 @@ launch_hb.sh=..,0755,/opt/xensource/bin vhd-util=..,0755,/opt/xensource/bin vmopspremium=..,0755,/etc/xapi.d/plugins InterfaceReconfigure.py=.,0755,/opt/xensource/libexec -fsimage.so=..,0755,/usr/lib/fs/ext2fs-lib +fsimage.so=.,0755,/usr/lib/fs/ext2fs-lib create_privatetemplate_from_snapshot.sh=..,0755,/opt/xensource/bin upgrade_snapshot.sh=..,0755,/opt/xensource/bin cloud-clean-vlan.sh=..,0755,/opt/xensource/bin diff --git a/scripts/vm/hypervisor/xenserver/xenserver60/patch b/scripts/vm/hypervisor/xenserver/xenserver60/patch index a3c1f91e319..344b4d3d571 100644 --- a/scripts/vm/hypervisor/xenserver/xenserver60/patch +++ b/scripts/vm/hypervisor/xenserver/xenserver60/patch @@ -50,3 +50,4 @@ bumpUpPriority.sh=../../../../network/domr/,0755,/opt/xensource/bin getDomRVersion.sh=../../../../network/domr/,0755,/opt/xensource/bin swift=..,0755,/opt/xensource/bin swiftxen=..,0755,/etc/xapi.d/plugins +qemu-dm-wrapper=.,0755,/opt/xensource/libexec diff --git a/scripts/vm/hypervisor/xenserver/xenserver60/qemu-dm-wrapper b/scripts/vm/hypervisor/xenserver/xenserver60/qemu-dm-wrapper new file mode 100755 index 00000000000..1ebdbaa46f1 --- /dev/null +++ b/scripts/vm/hypervisor/xenserver/xenserver60/qemu-dm-wrapper @@ -0,0 +1,111 @@ +#!/usr/bin/python +# +# Copyright (c) Citrix Systems 2007-2011 +# Author: Gianni Tedesco and Dave Scott +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation; version 2.1 only. with the special +# exception on linking described in file LICENSE. +# +# 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 Lesser General Public License for more details. + +from xen.lowlevel import xs + +def do_cloexec(fd): + from fcntl import fcntl, F_GETFD, F_SETFD, FD_CLOEXEC + + ret = fcntl(fd, F_GETFD, FD_CLOEXEC) + if ret < 0: + return + fcntl(fd, F_SETFD, ret|FD_CLOEXEC) + +def write_dm_pid(domid, pid): + store = xs.xs() + store.write('', '/local/domain/%d/qemu-pid'%domid, '%d'%pid) + +def is_sdk(): + try: + store = xs.xs(socket=True) + domid_as_dom0 = int(store.read('', 'domid')) + store.close() + assert domid_as_dom0 == 0 + store = xs.xs(xenbus=True) + domid_on_host = int(store.read('', 'domid')) + store.close() + return domid_on_host != domid_as_dom0 + except: + return False + +def fake_dm(domid): + from time import sleep + from os import getpid + + store = xs.xs() + + store.write('', '/local/domain/%d/qemu-pid'%domid, '%d'%getpid()) + store.write('', '/local/domain/%d/device-misc/dm-ready'%domid, '1') + store.write('', '/local/domain/%d/console/vnc-port'%domid, '%d'%(domid)) + + while True: + sleep(600) + + return 0 + +def cleanup(domid): + from xen.lowlevel import xc + hcall = xc.xc() + + print 'Unexpected termination, cleaning up...' + + try: + hcall.domain_destroy(domid) + except xc.Error: + # we could have raced with another domain shutdown + pass + +def enable_core_dumps(): + from resource import getrlimit, RLIMIT_CORE, setrlimit + + limit = 64 * 1024 * 1024 + oldlimits = getrlimit(RLIMIT_CORE) + setrlimit(RLIMIT_CORE, (limit, oldlimits[1])) + return limit + +def main(argv): + import os + + qemu_env = os.environ + qemu_dm = '/usr/lib/xen/bin/qemu-dm' + domid = int(argv[1]) + qemu_args = ['qemu-dm-%d'%domid] + argv[2:] + try: + vnc_idx = qemu_args.index("-vnc") + del qemu_args[vnc_idx: vnc_idx+2] + qemu_args.insert(vnc_idx, "0.0.0.0:1") + qemu_args.insert(vnc_idx, "-vnc") + except ValueError, IndexError: + pass + + if is_sdk() is True: + return fake_dm(domid) + + print "qemu-dm-wrapper in python:" + print "Using domid: %d" % domid + print "Arguments: %s" % " ".join(argv[1:]) + print "everything else is from qemu-dm:" + + core_dump_limit = enable_core_dumps() + print "core dump limit: %d" % core_dump_limit + + write_dm_pid(domid, os.getpid()) + + os.dup2(1, 2) + os.execve(qemu_dm, qemu_args, qemu_env) + +if __name__ == '__main__': + from sys import argv + raise SystemExit, main(argv) diff --git a/server/src/com/cloud/api/doc/ApiXmlDocWriter.java b/server/src/com/cloud/api/doc/ApiXmlDocWriter.java index 10b87180014..4171f319205 100644 --- a/server/src/com/cloud/api/doc/ApiXmlDocWriter.java +++ b/server/src/com/cloud/api/doc/ApiXmlDocWriter.java @@ -394,7 +394,7 @@ public class ApiXmlDocWriter { apiCommand.setRequest(request); // Generate response - response.add(new Argument("success", "success if the logout action succeeded")); + response.add(new Argument("description", "success if the logout action succeeded")); apiCommand.setResponse(response); out.writeObject(apiCommand); diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 57cbe8ed28b..ddd7b7c64ea 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -3101,6 +3101,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura // populate providers Map> providerCombinationToVerify = new HashMap>(); Map> svcPrv = cmd.getServiceProviders(); + boolean isSrx = false; if (svcPrv != null) { for (String serviceStr : svcPrv.keySet()) { Network.Service service = Network.Service.getService(serviceStr); @@ -3117,11 +3118,10 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura throw new InvalidParameterValueException("Invalid service provider: " + prvNameStr); } - // Only VirtualRouter can be specified as a firewall provider - if (service == Service.Firewall && provider != Provider.VirtualRouter) { - throw new InvalidParameterValueException("Only Virtual router can be specified as a provider for the Firewall service"); + if (provider == Provider.JuniperSRX) { + isSrx = true; } - + providers.add(provider); Set serviceSet = null; @@ -3169,6 +3169,14 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura serviceCapabilityMap.put(Service.Lb, lbServiceCapabilityMap); serviceCapabilityMap.put(Service.SourceNat, sourceNatServiceCapabilityMap); serviceCapabilityMap.put(Service.StaticNat, staticNatServiceCapabilityMap); + + //if Firewall service is missing, and Juniper is a provider for any other service, add Firewall service/provider combination + if (isSrx) { + s_logger.debug("Adding Firewall service with provider " + Provider.JuniperSRX.getName()); + Set firewallProvider = new HashSet(); + firewallProvider.add(Provider.JuniperSRX); + serviceProviderMap.put(Service.Firewall, firewallProvider); + } return createNetworkOffering(userId, name, displayText, trafficType, tags, specifyVlan, availability, networkRate, serviceProviderMap, false, guestType, false, serviceOfferingId, conserveMode, serviceCapabilityMap, specifyIpRanges); @@ -3392,6 +3400,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura List supportedServicesStr = cmd.getSupportedServices(); Object specifyIpRanges = cmd.getSpecifyIpRanges(); String tags = cmd.getTags(); + Boolean isTagged = cmd.isTagged(); if (zoneId != null) { zone = getZone(zoneId); @@ -3486,15 +3495,35 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura } if (tags != null) { - if (tags.isEmpty()) { - sc.addAnd("tags", SearchCriteria.Op.NULL); + sc.addAnd("tags", SearchCriteria.Op.EQ, tags); + } + + if (isTagged != null) { + if (isTagged) { + sc.addAnd("tags", SearchCriteria.Op.NNULL); } else { - sc.addAnd("tags", SearchCriteria.Op.EQ, tags); + sc.addAnd("tags", SearchCriteria.Op.NULL); } } List offerings = _networkOfferingDao.search(sc, searchFilter); Boolean sourceNatSupported = cmd.getSourceNatSupported(); + List pNtwkTags = new ArrayList(); + boolean checkForTags = false; + if (zone != null) { + List pNtwks = _physicalNetworkDao.listByZoneAndTrafficType(zoneId, TrafficType.Guest); + if (pNtwks.size() > 1) { + checkForTags = true; + //go through tags + for (PhysicalNetworkVO pNtwk : pNtwks) { + List pNtwkTag = pNtwk.getTags(); + if (pNtwkTag == null || pNtwkTag.isEmpty()) { + throw new CloudRuntimeException("Tags are not defined for physical network in the zone id=" + zoneId); + } + pNtwkTags.addAll(pNtwkTag); + } + } + } // filter by supported services boolean listBySupportedServices = (supportedServicesStr != null && !supportedServicesStr.isEmpty() && !offerings.isEmpty()); @@ -3522,7 +3551,13 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura for (NetworkOfferingVO offering : offerings) { boolean addOffering = true; List checkForProviders = new ArrayList(); - + + if (checkForTags) { + if (!pNtwkTags.contains(offering.getTags())) { + continue; + } + } + if (listBySupportedServices) { addOffering = addOffering && _networkMgr.areServicesSupportedByNetworkOffering(offering.getId(), supportedServices); } @@ -3540,10 +3575,14 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura if (sourceNatSupported != null) { addOffering = addOffering && (_networkMgr.areServicesSupportedByNetworkOffering(offering.getId(), Network.Service.SourceNat) == sourceNatSupported); } + + if (addOffering) { supportedOfferings.add(offering); } + + } return supportedOfferings; diff --git a/server/src/com/cloud/deploy/FirstFitPlanner.java b/server/src/com/cloud/deploy/FirstFitPlanner.java index 1424f753337..a11c0bde033 100755 --- a/server/src/com/cloud/deploy/FirstFitPlanner.java +++ b/server/src/com/cloud/deploy/FirstFitPlanner.java @@ -69,11 +69,13 @@ import com.cloud.storage.dao.GuestOSDao; import com.cloud.storage.dao.StoragePoolDao; import com.cloud.storage.dao.StoragePoolHostDao; import com.cloud.storage.dao.VolumeDao; +import com.cloud.user.AccountManager; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; import com.cloud.utils.component.Adapters; import com.cloud.utils.component.Inject; import com.cloud.vm.DiskProfile; +import com.cloud.vm.ReservationContext; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.dao.UserVmDao; @@ -97,6 +99,7 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner { @Inject protected ConfigurationDao _configDao; @Inject protected StoragePoolDao _storagePoolDao; @Inject protected CapacityDao _capacityDao; + @Inject protected AccountManager _accountMgr; @Inject(adapter=StoragePoolAllocator.class) protected Adapters _storagePoolAllocators; @@ -152,7 +155,7 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner { } //search for storage under the zone, pod, cluster of the host. - DataCenterDeployment lastPlan = new DataCenterDeployment(host.getDataCenterId(), host.getPodId(), host.getClusterId(), hostIdSpecified, plan.getPoolId(), null); + DataCenterDeployment lastPlan = new DataCenterDeployment(host.getDataCenterId(), host.getPodId(), host.getClusterId(), hostIdSpecified, plan.getPoolId(), null, plan.getReservationContext()); Pair>, List> result = findSuitablePoolsForVolumes(vmProfile, lastPlan, avoid, HostAllocator.RETURN_UPTO_ALL); Map> suitableVolumeStoragePools = result.first(); @@ -507,7 +510,7 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner { s_logger.debug("Checking resources in Cluster: "+clusterId + " under Pod: "+clusterVO.getPodId()); //search for resources(hosts and storage) under this zone, pod, cluster. - DataCenterDeployment potentialPlan = new DataCenterDeployment(plan.getDataCenterId(), clusterVO.getPodId(), clusterVO.getId(), null, plan.getPoolId(), null); + DataCenterDeployment potentialPlan = new DataCenterDeployment(plan.getDataCenterId(), clusterVO.getPodId(), clusterVO.getId(), null, plan.getPoolId(), null, plan.getReservationContext()); //find suitable hosts under this cluster, need as many hosts as we get. List suitableHosts = findSuitableHosts(vmProfile, potentialPlan, avoid, HostAllocator.RETURN_UPTO_ALL); @@ -731,16 +734,18 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner { if(s_logger.isDebugEnabled()){ s_logger.debug("We need to allocate new storagepool for this volume"); } - if(!isEnabledForAllocation(plan.getDataCenterId(), plan.getPodId(), plan.getClusterId())){ - if(s_logger.isDebugEnabled()){ - s_logger.debug("Cannot allocate new storagepool for this volume in this cluster, allocation state is disabled"); - s_logger.debug("Cannot deploy to this specified plan, allocation state is disabled, returning."); + if(!isRootAdmin(plan.getReservationContext())){ + if(!isEnabledForAllocation(plan.getDataCenterId(), plan.getPodId(), plan.getClusterId())){ + if(s_logger.isDebugEnabled()){ + s_logger.debug("Cannot allocate new storagepool for this volume in this cluster, allocation state is disabled"); + s_logger.debug("Cannot deploy to this specified plan, allocation state is disabled, returning."); + } + //Cannot find suitable storage pools under this cluster for this volume since allocation_state is disabled. + //- remove any suitable pools found for other volumes. + //All volumes should get suitable pools under this cluster; else we cant use this cluster. + suitableVolumeStoragePools.clear(); + break; } - //Cannot find suitable storage pools under this cluster for this volume since allocation_state is disabled. - //- remove any suitable pools found for other volumes. - //All volumes should get suitable pools under this cluster; else we cant use this cluster. - suitableVolumeStoragePools.clear(); - break; } s_logger.debug("Calling StoragePoolAllocators to find suitable pools"); @@ -798,6 +803,17 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner { } + private boolean isRootAdmin(ReservationContext reservationContext) { + if(reservationContext != null){ + if(reservationContext.getAccount() != null){ + return _accountMgr.isRootAdmin(reservationContext.getAccount().getType()); + }else{ + return false; + } + } + return false; + } + @Override public boolean check(VirtualMachineProfile vm, DeploymentPlan plan, DeployDestination dest, ExcludeList exclude) { diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 9d4cd3d61b3..9c8547a032a 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -2924,7 +2924,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag List userVms = _userVmDao.listByNetworkIdAndStates(networkId); for (UserVmVO vm : userVms) { - if (!(vm.getState() == VirtualMachine.State.Error || (vm.getState() == VirtualMachine.State.Expunging && vm.getRemoved() != null))) { + if (!(vm.getState() == VirtualMachine.State.Expunging && vm.getRemoved() != null)) { s_logger.warn("Can't delete the network, not all user vms are expunged. Vm " + vm + " is in " + vm.getState() + " state"); return false; } @@ -5977,20 +5977,22 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag throw new InvalidParameterValueException("Unable to find the Network Element implementing the Service Provider '" + provider.getName() + "'"); } - Set enabledServices = providersMap.get(provider); + Set enabledServices = new HashSet(); + enabledServices.addAll(providersMap.get(provider)); if (enabledServices != null && !enabledServices.isEmpty()) { if (!element.canEnableIndividualServices()) { - Set requiredServices = element.getCapabilities().keySet(); + Set requiredServices = new HashSet(); + requiredServices.addAll(element.getCapabilities().keySet()); + if (requiredServices.contains(Network.Service.Gateway)) { requiredServices.remove(Network.Service.Gateway); } - - // Remove firewall from the list of services-to-compare + if (requiredServices.contains(Network.Service.Firewall)) { requiredServices.remove(Network.Service.Firewall); } - + if (enabledServices.contains(Network.Service.Firewall)) { enabledServices.remove(Network.Service.Firewall); } diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkDaoImpl.java b/server/src/com/cloud/network/dao/PhysicalNetworkDaoImpl.java index 6334871d801..17b5feb5680 100644 --- a/server/src/com/cloud/network/dao/PhysicalNetworkDaoImpl.java +++ b/server/src/com/cloud/network/dao/PhysicalNetworkDaoImpl.java @@ -26,9 +26,11 @@ import com.cloud.network.PhysicalNetworkVO; import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.JoinBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.SearchCriteria.Func; import com.cloud.utils.db.SearchCriteria.Op; @Local(value=PhysicalNetworkDao.class) @DB(txn=false) @@ -42,7 +44,6 @@ public class PhysicalNetworkDaoImpl extends GenericDaoBase rules = _portForwardingDao.listForApplication(ipId); if (rules.size() == 0) { - s_logger.debug("There are no firwall rules to apply for ip id=" + ipId); + s_logger.debug("There are no port forwarding rules to apply for ip id=" + ipId); return true; } @@ -646,7 +646,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { return false; } } catch (ResourceUnavailableException ex) { - s_logger.warn("Failed to apply firewall rules due to ", ex); + s_logger.warn("Failed to apply port forwarding rules for ip due to ", ex); return false; } @@ -659,7 +659,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { List staticNatRules = new ArrayList(); if (rules.size() == 0) { - s_logger.debug("There are no firwall rules to apply for ip id=" + sourceIpId); + s_logger.debug("There are no static nat rules to apply for ip id=" + sourceIpId); return true; } @@ -676,7 +676,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { return false; } } catch (ResourceUnavailableException ex) { - s_logger.warn("Failed to apply static nat rules due to ", ex); + s_logger.warn("Failed to apply static nat rules for ip due to ", ex); return false; } @@ -700,7 +700,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { return false; } } catch (ResourceUnavailableException ex) { - s_logger.warn("Failed to apply firewall rules due to ", ex); + s_logger.warn("Failed to apply port forwarding rules for network due to ", ex); return false; } @@ -730,7 +730,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { return false; } } catch (ResourceUnavailableException ex) { - s_logger.warn("Failed to apply firewall rules due to ", ex); + s_logger.warn("Failed to apply static nat rules for network due to ", ex); return false; } @@ -762,7 +762,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { return false; } } catch (ResourceUnavailableException ex) { - s_logger.warn("Failed to create static nat rule due to ", ex); + s_logger.warn("Failed to create static nat for network due to ", ex); return false; } diff --git a/server/src/com/cloud/server/ConfigurationServerImpl.java b/server/src/com/cloud/server/ConfigurationServerImpl.java index 43126b036cc..e65feb74946 100755 --- a/server/src/com/cloud/server/ConfigurationServerImpl.java +++ b/server/src/com/cloud/server/ConfigurationServerImpl.java @@ -583,7 +583,10 @@ public class ConfigurationServerImpl implements ConfigurationServer { return; } String already = _configDao.getValue("ssh.privatekey"); - String homeDir = Script.runSimpleBashScript("echo ~"); + String homeDir = Script.runSimpleBashScript("echo ~cloud"); + if (homeDir == null) { + throw new CloudRuntimeException("Cannot get home directory for account: cloud"); + } if (s_logger.isInfoEnabled()) { s_logger.info("Processing updateKeyPairs"); } diff --git a/server/src/com/cloud/storage/StorageManager.java b/server/src/com/cloud/storage/StorageManager.java index 78bd520678a..ea667f5371e 100755 --- a/server/src/com/cloud/storage/StorageManager.java +++ b/server/src/com/cloud/storage/StorageManager.java @@ -44,7 +44,7 @@ import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineProfile; -public interface StorageManager extends Manager { +public interface StorageManager extends StorageService, Manager { boolean canVmRestartOnAnotherServer(long vmId); /** Returns the absolute path of the specified ISO diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index db6e41220de..d4797c94bfe 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -198,7 +198,7 @@ import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.VMInstanceDao; @Local(value = { StorageManager.class, StorageService.class }) -public class StorageManagerImpl implements StorageManager, StorageService, Manager, ClusterManagerListener { +public class StorageManagerImpl implements StorageManager, Manager, ClusterManagerListener { private static final Logger s_logger = Logger.getLogger(StorageManagerImpl.class); protected String _name; diff --git a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java index f4c9d1f8ff3..0a9de2944f0 100755 --- a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java +++ b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java @@ -181,6 +181,8 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma private ResourceManager _resourceMgr; @Inject private DomainManager _domainMgr; + @Inject + private VolumeDao _volumeDao; String _name; private int _totalRetries; private int _pauseInterval; @@ -282,7 +284,7 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma String preSnapshotPath = null; SnapshotVO preSnapshotVO = null; - if (preId != 0) { + if (preId != 0 && !(volume.getLastPoolId() != null && !volume.getLastPoolId().equals(volume.getPoolId()))) { preSnapshotVO = _snapshotDao.findByIdIncludingRemoved(preId); if (preSnapshotVO != null && preSnapshotVO.getBackupSnapshotId() != null) { preSnapshotPath = preSnapshotVO.getPath(); @@ -337,6 +339,7 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma if (volume.getLastPoolId() != null && !volume.getLastPoolId().equals(volume.getPoolId())) { preSnapshotId = 0; volume.setLastPoolId(volume.getPoolId()); + _volumeDao.update(volume.getId(), volume); } snapshot = updateDBOnCreate(snapshotId, answer.getSnapshotPath(), preSnapshotId); } @@ -700,11 +703,9 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma @DB public void postCreateSnapshot(Long volumeId, Long snapshotId, Long policyId, boolean backedUp) { Long userId = getSnapshotUserId(); - SnapshotVO snapshot = _snapshotDao.findByIdIncludingRemoved(snapshotId); - // Even if the current snapshot failed, we should schedule the next - // recurring snapshot for this policy. + SnapshotVO snapshot = _snapshotDao.findById(snapshotId); - if (snapshot.isRecursive()) { + if (snapshot != null && snapshot.isRecursive()) { postCreateRecurringSnapshotForPolicy(userId, volumeId, snapshotId, policyId); } } diff --git a/server/src/com/cloud/user/AccountManagerImpl.java b/server/src/com/cloud/user/AccountManagerImpl.java index 9daafd2d48b..a00f9ae1d67 100755 --- a/server/src/com/cloud/user/AccountManagerImpl.java +++ b/server/src/com/cloud/user/AccountManagerImpl.java @@ -531,7 +531,7 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag for (VolumeVO volume : volumes) { if (!volume.getState().equals(Volume.State.Destroy)) { try { - _storageMgr.destroyVolume(volume); + _storageMgr.deleteVolume(volume.getId()); } catch (Exception ex) { s_logger.warn("Failed to cleanup volumes as a part of account id=" + accountId + " cleanup due to Exception: ", ex); accountCleanupNeeded = true; diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index d31b62d2c27..41129272a37 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -102,7 +102,6 @@ import com.cloud.event.UsageEventVO; import com.cloud.event.dao.EventDao; import com.cloud.event.dao.UsageEventDao; import com.cloud.exception.ConcurrentOperationException; -import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.ManagementServerException; @@ -137,14 +136,12 @@ import com.cloud.network.element.UserDataServiceProvider; import com.cloud.network.lb.LoadBalancingRulesManager; import com.cloud.network.router.VirtualNetworkApplianceManager; import com.cloud.network.rules.FirewallManager; -import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.FirewallRuleVO; import com.cloud.network.rules.PortForwardingRuleVO; import com.cloud.network.rules.RulesManager; import com.cloud.network.rules.dao.PortForwardingRulesDao; import com.cloud.network.security.SecurityGroup; import com.cloud.network.security.SecurityGroupManager; -import com.cloud.network.security.SecurityGroupVMMapVO; import com.cloud.network.security.dao.SecurityGroupDao; import com.cloud.network.security.dao.SecurityGroupVMMapDao; import com.cloud.offering.NetworkOffering; @@ -2664,7 +2661,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } @Override - public boolean finalizeStart(VirtualMachineProfile profile, long hostId, Commands cmds, ReservationContext context) throws InsufficientAddressCapacityException{ + public boolean finalizeStart(VirtualMachineProfile profile, long hostId, Commands cmds, ReservationContext context){ UserVmVO vm = profile.getVirtualMachine(); Answer[] answersToCmds = cmds.getAnswers(); @@ -2728,7 +2725,12 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } //get system ip and create static nat rule for the vm - _rulesMgr.getSystemIpAndEnableStaticNatForVm(profile.getVirtualMachine(), false); + try { + _rulesMgr.getSystemIpAndEnableStaticNatForVm(profile.getVirtualMachine(), false); + } catch (Exception ex) { + s_logger.warn("Failed to get system ip and enable static nat for the vm " + profile.getVirtualMachine() + " due to exception ", ex); + return false; + } return true; } diff --git a/server/src/com/cloud/vm/VirtualMachineGuru.java b/server/src/com/cloud/vm/VirtualMachineGuru.java index 94981ca1d64..6799bbe392d 100644 --- a/server/src/com/cloud/vm/VirtualMachineGuru.java +++ b/server/src/com/cloud/vm/VirtualMachineGuru.java @@ -20,7 +20,6 @@ package com.cloud.vm; import com.cloud.agent.api.StopAnswer; import com.cloud.agent.manager.Commands; import com.cloud.deploy.DeployDestination; -import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.ResourceUnavailableException; /** @@ -56,9 +55,8 @@ public interface VirtualMachineGuru { * @param profile virtual machine profile. * @param dest destination it was sent to. * @return true if deployment was fine; false if it didn't go well. - * @throws InsufficientAddressCapacityException */ - boolean finalizeStart(VirtualMachineProfile profile, long hostId, Commands cmds, ReservationContext context) throws InsufficientAddressCapacityException; + boolean finalizeStart(VirtualMachineProfile profile, long hostId, Commands cmds, ReservationContext context); boolean finalizeCommandsOnStart(Commands cmds, VirtualMachineProfile profile); diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index 199b6ae6fa2..674e8d2bb0b 100755 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -619,13 +619,13 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene if (s_logger.isDebugEnabled()) { s_logger.debug("Trying to deploy VM, vm has dcId: " + vm.getDataCenterIdToDeployIn() + " and podId: " + vm.getPodIdToDeployIn()); } - DataCenterDeployment plan = new DataCenterDeployment(vm.getDataCenterIdToDeployIn(), vm.getPodIdToDeployIn(), null, null, null, null); + DataCenterDeployment plan = new DataCenterDeployment(vm.getDataCenterIdToDeployIn(), vm.getPodIdToDeployIn(), null, null, null, null, ctx); if(planToDeploy != null && planToDeploy.getDataCenterId() != 0){ if (s_logger.isDebugEnabled()) { s_logger.debug("advanceStart: DeploymentPlan is provided, using dcId:" + planToDeploy.getDataCenterId() + ", podId: " + planToDeploy.getPodId() + ", clusterId: " + planToDeploy.getClusterId() + ", hostId: " + planToDeploy.getHostId() + ", poolId: " + planToDeploy.getPoolId()); } - plan = (DataCenterDeployment) planToDeploy; + plan = new DataCenterDeployment(planToDeploy.getDataCenterId(), planToDeploy.getPodId(), planToDeploy.getClusterId(), planToDeploy.getHostId(), planToDeploy.getPoolId(), planToDeploy.getPhysicalNetworkId(), ctx); } HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vm.getHypervisorType()); @@ -690,9 +690,9 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene + vm, Cluster.class, clusterIdSpecified); } } - plan = new DataCenterDeployment(planToDeploy.getDataCenterId(), planToDeploy.getPodId(), planToDeploy.getClusterId(), planToDeploy.getHostId(), vol.getPoolId(), null); + plan = new DataCenterDeployment(planToDeploy.getDataCenterId(), planToDeploy.getPodId(), planToDeploy.getClusterId(), planToDeploy.getHostId(), vol.getPoolId(), null, ctx); }else{ - plan = new DataCenterDeployment(rootVolDcId, rootVolPodId, rootVolClusterId, null, vol.getPoolId(), null); + plan = new DataCenterDeployment(rootVolDcId, rootVolPodId, rootVolClusterId, null, vol.getPoolId(), null, ctx); if (s_logger.isDebugEnabled()) { s_logger.debug(vol + " is READY, changing deployment plan to use this pool's dcId: " + rootVolDcId + " , podId: " + rootVolPodId + " , and clusterId: " + rootVolClusterId); } @@ -773,7 +773,7 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene String host_guid = startAnswer.getHost_guid(); if( host_guid != null ) { HostVO finalHost = _resourceMgr.findHostByGuid(host_guid); - if ( finalHost == null ) { + if (finalHost == null ) { throw new CloudRuntimeException("Host Guid " + host_guid + " doesn't exist in DB, something wrong here"); } destHostId = finalHost.getId(); @@ -788,14 +788,14 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene } return startedVm; } else { + canRetry = false; if (s_logger.isDebugEnabled()) { s_logger.info("The guru did not like the answers so stopping " + vm); } StopCommand cmd = new StopCommand(vm.getInstanceName()); StopAnswer answer = (StopAnswer) _agentMgr.easySend(destHostId, cmd); if (answer == null || !answer.getResult()) { - s_logger.warn("Unable to stop " + vm + " due to " + (answer != null ? answer.getDetails() : "no answers")); - canRetry = false; + s_logger.warn("Unable to stop " + vm + " due to " + (answer != null ? answer.getDetails() : "no answers")); _haMgr.scheduleStop(vm, destHostId, WorkType.ForceStop); throw new ExecutionException("Unable to stop " + vm + " so we are unable to retry the start operation"); } @@ -899,7 +899,7 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene return false; } - if (step == Step.Started || step == Step.Starting) { + if (step == Step.Started || step == Step.Starting || step == Step.Release) { if (vm.getHostId() != null) { if (!sendStop(guru, profile, force)) { s_logger.warn("Failed to stop vm " + vm + " in " + State.Starting + " state as a part of cleanup process"); @@ -1725,8 +1725,25 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene { s_logger.info("Found vm " + vm.getInstanceName() + " in inconsistent state. " + vm.getState() + " on CS while " + (info == null ? "Stopped" : "Running") + " on agent"); info = new AgentVmInfo(vm.getInstanceName(), getVmGuru(vm), vm, State.Stopped); - vm.setState(State.Running); // set it as running and let HA take care of it + + // Bug 13850- grab outstanding work item if any for this VM state so that we mark it as DONE after we change VM state, else it will remain pending + ItWorkVO work = _workDao.findByOutstandingWork(vm.getId(), vm.getState()); + if (work != null) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Found an outstanding work item for this vm " + vm + " in state:" + vm.getState() + ", work id:" + work.getId()); + } + } + vm.setState(State.Running); // set it as running and let HA take care of it _vmDao.persist(vm); + + if (work != null) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Updating outstanding work item to Done, id:" + work.getId()); + } + work.setStep(Step.Done); + _workDao.update(work.getId(), work); + } + castedVm = info.guru.findById(vm.getId()); try { Host host = _hostDao.findByGuid(info.getHostUuid()); diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index 875525ddc43..771e0c7c867 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -1545,7 +1545,7 @@ INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('XenServer', '5.6', 50, 1); INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('XenServer', '5.6 FP1', 50, 1); INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('XenServer', '5.6 SP2', 50, 1); -INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('XenServer', '6.0 beta', 50, 1); +INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('XenServer', '6.0', 50, 1); INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('VMware', 'default', 128, 0); INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('VMware', '4.0', 128, 0); INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('VMware', '4.1', 128, 0); diff --git a/setup/db/db/schema-2214to30.sql b/setup/db/db/schema-2214to30.sql index d276bedb941..964c3400af1 100755 --- a/setup/db/db/schema-2214to30.sql +++ b/setup/db/db/schema-2214to30.sql @@ -304,7 +304,7 @@ UPDATE `cloud_usage`.`usage_network` set agg_bytes_received = net_bytes_received ALTER TABLE `cloud_usage`.`usage_vpn_user` ADD INDEX `i_usage_vpn_user__account_id`(`account_id`); ALTER TABLE `cloud_usage`.`usage_vpn_user` ADD INDEX `i_usage_vpn_user__created`(`created`); ALTER TABLE `cloud_usage`.`usage_vpn_user` ADD INDEX `i_usage_vpn_user__deleted`(`deleted`); -ALTER TABLE `cloud_usage`.`usage_ip_address` ADD COLUMN `is_elastic` smallint(1) NOT NULL default '0'; +ALTER TABLE `cloud_usage`.`usage_ip_address` ADD COLUMN `is_system` smallint(1) NOT NULL default '0'; INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Premium', 'DEFAULT', 'management-server', 'usage.sanity.check.interval', null, 'Interval (in days) to check sanity of usage data'); DELETE FROM `cloud`.`configuration` WHERE name='host.capacity.checker.wait'; diff --git a/tools/testClient/cloudstackConnection.py b/tools/testClient/cloudstackConnection.py index 9b2aa155658..4dc90434de7 100644 --- a/tools/testClient/cloudstackConnection.py +++ b/tools/testClient/cloudstackConnection.py @@ -17,7 +17,7 @@ class cloudConnection(object): self.apiKey = apiKey self.securityKey = securityKey self.mgtSvr = mgtSvr - self.connection = httplib.HTTPConnection("%s:%d"%(mgtSvr,port)) + self.connection = httplib.HTTPConnection("%s:%d"%(mgtSvr,port), timeout=180) self.port = port self.logging = logging if port == 8096: @@ -139,4 +139,4 @@ if __name__ == '__main__': xml = '407i-1-407-RS3i-1-407-RS3system1ROOT2011-07-30T14:45:19-0700Runningfalse1CA13kvm-50-2054CentOS 5.5(64-bit) no GUI (KVM)CentOS 5.5(64-bit) no GUI (KVM)false1Small Instance15005121120NetworkFilesystem380203255.255.255.065.19.181.165.19.181.110vlan://65vlan://65GuestDirecttrue06:52:da:00:00:08KVM' conn = cloudConnection(None) - print conn.paraseReturnXML(xml, deployVirtualMachine.deployVirtualMachineResponse()) \ No newline at end of file + print conn.paraseReturnXML(xml, deployVirtualMachine.deployVirtualMachineResponse()) diff --git a/ui/css/cloudstack3.css b/ui/css/cloudstack3.css index 3418c30da3d..8489e94f745 100644 --- a/ui/css/cloudstack3.css +++ b/ui/css/cloudstack3.css @@ -3381,8 +3381,10 @@ Dialogs*/ } .dashboard.admin .dashboard-container .stats ul li .name { - width: 135px; + width: 178px; float: left; + font-size: 11px; + font-weight: bold; margin: 15px 15px 0 0; } @@ -3946,7 +3948,7 @@ Dialogs*/ } .system-chart.dashboard.admin .dashboard-container .stats .chart { - width: 286px; + width: 242px; } /** Compute*/ @@ -5373,6 +5375,24 @@ label.error { margin: 23px 0 0px 6px; } +.multi-wizard.zone-wizard .review .main-desc.pre-setup { + width: 100%; + font-size: 18px; + color: #2C4159; + background: url(../images/icons.png) no-repeat 104px -224px; + padding: 2px 0 1px; + text-align: center; + /*+placement:shift 0px 153px;*/ + position: relative; + left: 0px; + top: 153px; + /*+text-shadow:0px 1px #FFFFFF;*/ + -moz-text-shadow: 0px 1px #FFFFFF; + -webkit-text-shadow: 0px 1px #FFFFFF; + -o-text-shadow: 0px 1px #FFFFFF; + text-shadow: 0px 1px #FFFFFF; +} + .multi-wizard.zone-wizard .info-desc { font-size: 11px; float: left; @@ -6796,7 +6816,7 @@ div.panel.ui-dialog div.list-view div.fixed-header { .recurring-snapshots .ui-tabs ul li a { width: 76px; text-indent: 28px; - margin: 0 32px 0 0; + margin: 0 14px 0 0; padding: 8px 0 5px; background: url(../images/sprites.png) no-repeat -521px -540px; border: none; @@ -7357,7 +7377,7 @@ div.panel.ui-dialog div.list-view div.fixed-header { position: relative; left: 0px; top: -10px; - margin-right: 10px; + margin-right: 9px; } #header div.view-switcher.alt { @@ -7368,9 +7388,9 @@ div.panel.ui-dialog div.list-view div.fixed-header { float: left; /*[empty]display:;*/ width: 126px; - padding: 12px 0 0; + padding: 13px 0 0; margin: 0; - text-indent: 21px; + text-indent: 17px; position: relative; /*+text-shadow:0px -1px 1px #2D2D2D;*/ -moz-text-shadow: 0px -1px 1px #2D2D2D; diff --git a/ui/css/cloudstack3.ja.css b/ui/css/cloudstack3.ja.css new file mode 100644 index 00000000000..8535f25d489 --- /dev/null +++ b/ui/css/cloudstack3.ja.css @@ -0,0 +1,34 @@ +/*[fmt]1C20-1C0D-E*/ +#header div.view-switcher { + font-size: 9px; +} + +.dashboard.admin .dashboard-container .stats ul li .name { + font-size: 10px; +} + +.dashboard.admin .dashboard-container .stats ul li .percentage { + float: left; + font-size: 15px; + font-weight: bold; + margin: 13px 0 0; + /*+text-shadow:0px -2px 1px #FFFFFF;*/ + -moz-text-shadow: 0px -2px 1px #FFFFFF; + -webkit-text-shadow: 0px -2px 1px #FFFFFF; + -o-text-shadow: 0px -2px 1px #FFFFFF; + text-shadow: 0px -2px 1px #FFFFFF; +} + +.dashboard.admin .dashboard-container .stats ul li .value .content { + font-size: 10px; +} + +div.toolbar div.filters label { + font-size: 9px; +} + +div.toolbar div.filters select { + width: 82px; + font-size: 11px; +} + diff --git a/ui/index.jsp b/ui/index.jsp index 59dfa4dd203..fb862626fb3 100644 --- a/ui/index.jsp +++ b/ui/index.jsp @@ -14,6 +14,9 @@ CloudStack + + +
    -
    +
    @@ -940,7 +943,7 @@
    - +
      @@ -1175,20 +1178,20 @@
      -
      Virtual Machines
      +
      • -
        Running VMs
        +
      • -
        Stopped VMs
        +
      • -
        Total VMs
        +
      @@ -1201,7 +1204,7 @@ - +
      Latest events
      view all
      @@ -1218,7 +1221,7 @@ - +
      Network
      view all
      @@ -1226,13 +1229,13 @@ -
      Owned isolated networks:
      +
      :
      -
      Owned public IP addresses:
      +
      :
      @@ -1614,6 +1617,13 @@