You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ah...@apache.org on 2013/06/18 05:07:15 UTC
[50/50] [abbrv] git commit: updated refs/heads/vmsync to e2edae1
Merge from master
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/e2edae17
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/e2edae17
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/e2edae17
Branch: refs/heads/vmsync
Commit: e2edae1711f1740639a81c1d64b25d75213949af
Parents: 309f8da fb31a39
Author: Alex Huang <al...@gmail.com>
Authored: Mon Jun 17 19:00:44 2013 -0700
Committer: Alex Huang <al...@gmail.com>
Committed: Mon Jun 17 19:00:44 2013 -0700
----------------------------------------------------------------------
api/src/com/cloud/network/NetworkModel.java | 2 +
api/src/com/cloud/offering/NetworkOffering.java | 2 +
.../command/admin/cluster/ListClustersCmd.java | 6 -
.../api/command/admin/host/ListHostsCmd.java | 7 -
.../api/command/admin/ldap/LDAPConfigCmd.java | 16 +-
.../admin/network/CreateNetworkOfferingCmd.java | 2 +-
.../api/command/admin/pod/ListPodsByCmd.java | 7 -
.../admin/storage/ListStoragePoolsCmd.java | 7 -
.../admin/systemvm/ListSystemVMsCmd.java | 7 -
.../api/command/user/iso/ListIsosCmd.java | 7 -
.../command/user/network/ListNetworksCmd.java | 7 -
.../command/user/snapshot/ListSnapshotsCmd.java | 13 +-
.../command/user/template/ListTemplatesCmd.java | 8 -
.../api/command/user/vm/ListVMsCmd.java | 7 -
.../api/command/user/volume/ListVolumesCmd.java | 5 -
.../api/response/FirewallResponse.java | 8 +-
.../api/response/SnapshotResponse.java | 7 +
.../service/controller/s3/ServiceProvider.java | 6 +-
awsapi/web/web.xml | 11 +-
client/tomcatconf/nonossComponentContext.xml.in | 1 +
.../src/com/cloud/agent/api/ScaleVmCommand.java | 26 +-
.../virtualnetwork/VirtualRoutingResource.java | 50 +-
.../com/cloud/network/HAProxyConfigurator.java | 22 +-
docs/en-US/CloudStack_GSoC_Guide.xml | 3 +-
docs/en-US/Release_Notes.xml | 2 +-
docs/en-US/add-loadbalancer-rule-vpc.xml | 8 +-
docs/en-US/add-remove-nic-ui.xml | 147 +++
docs/en-US/configure-package-repository.xml | 4 +-
docs/en-US/create-vpn-connection-vpc.xml | 31 +-
docs/en-US/create-vpn-gateway-for-vpc.xml | 30 +-
docs/en-US/delete-reset-vpn.xml | 28 +-
docs/en-US/gsoc-meng.xml | 235 ++++
docs/en-US/gsoc-shiva.xml | 70 ++
docs/en-US/images/remove-nic.png | Bin 0 -> 735 bytes
docs/en-US/images/set-default-nic.png | Bin 0 -> 1012 bytes
.../management-server-install-db-local.xml | 8 +
docs/en-US/networks.xml | 1 +
docs/en-US/pvlan.xml | 202 ++-
docs/en-US/using-multiple-guest-networks.xml | 1 +
docs/pot/configure-package-repository.pot | 4 +-
.../src/com/cloud/storage/VolumeManager.java | 2 +
.../orchestration/CloudOrchestrator.java | 6 +
.../cloud/vm/VirtualMachineManagerImplTest.java | 12 +-
.../com/cloud/capacity/dao/CapacityDaoImpl.java | 24 +-
.../src/com/cloud/dc/dao/DataCenterDao.java | 2 +-
.../src/com/cloud/dc/dao/DataCenterDaoImpl.java | 15 +-
.../com/cloud/network/dao/IPAddressDaoImpl.java | 1 +
.../rules/dao/PortForwardingRulesDao.java | 2 +-
.../rules/dao/PortForwardingRulesDaoImpl.java | 9 +-
.../com/cloud/offerings/NetworkOfferingVO.java | 4 +
.../storage/dao/SnapshotPolicyDaoImpl.java | 1 -
.../com/cloud/storage/dao/VMTemplateDao.java | 2 +-
.../cloud/storage/dao/VMTemplateDaoImpl.java | 21 +-
.../com/cloud/upgrade/dao/Upgrade410to420.java | 1 +
.../src/com/cloud/usage/dao/UsageDao.java | 5 +-
.../src/com/cloud/usage/dao/UsageDaoImpl.java | 64 +
.../strategy/AncientSnapshotStrategy.java | 5 +
.../HypervisorHostEndPointRpcServer.java | 2 +-
.../kvm/resource/LibvirtComputingResource.java | 4 +-
.../kvm/resource/LibvirtStorageVolumeDef.java | 2 +-
.../hypervisor/kvm/resource/LibvirtVMDef.java | 2 +-
.../resource/LibvirtComputingResourceTest.java | 4 +-
.../vmware/resource/VmwareResource.java | 57 +-
.../vmware/resource/VmwareResourceTest.java | 7 +-
.../xen/discoverer/XcpServerDiscoverer.java | 12 +-
.../xen/resource/CitrixResourceBase.java | 8 +-
.../xen/resource/CitrixResourceBaseTest.java | 12 +-
.../guru/BigSwitchVnsGuestNetworkGuru.java | 2 +-
.../cloud/network/guru/OvsGuestNetworkGuru.java | 3 +-
scripts/network/domr/call_dnsmasq.sh | 29 +
scripts/network/domr/createipAlias.sh | 26 +
scripts/network/domr/deleteipAlias.sh | 25 +
server/src/com/cloud/api/ApiResponseHelper.java | 10 +-
.../com/cloud/api/query/QueryManagerImpl.java | 73 +-
.../api/query/dao/StoragePoolJoinDaoImpl.java | 17 +-
server/src/com/cloud/configuration/Config.java | 9 +-
.../configuration/ConfigurationManagerImpl.java | 127 +-
.../consoleproxy/ConsoleProxyManagerImpl.java | 7 +
.../com/cloud/network/NetworkManagerImpl.java | 68 +-
.../src/com/cloud/network/NetworkModelImpl.java | 5 +-
.../com/cloud/network/NetworkServiceImpl.java | 55 +-
.../network/guru/ExternalGuestNetworkGuru.java | 3 +-
.../cloud/network/guru/GuestNetworkGuru.java | 11 +-
.../VirtualNetworkApplianceManagerImpl.java | 28 +-
.../cloud/network/rules/RulesManagerImpl.java | 2 +-
.../network/vpc/NetworkACLServiceImpl.java | 4 +
.../cloud/server/ConfigurationServerImpl.java | 25 +
.../com/cloud/server/ManagementServerImpl.java | 98 +-
.../com/cloud/storage/StorageManagerImpl.java | 3 +
.../com/cloud/storage/VolumeManagerImpl.java | 3 +-
.../storage/download/DownloadMonitorImpl.java | 20 +-
.../src/com/cloud/storage/s3/S3ManagerImpl.java | 10 +-
.../storage/snapshot/SnapshotManagerImpl.java | 14 +-
.../storage/snapshot/SnapshotSchedulerImpl.java | 5 +-
.../cloud/storage/upload/UploadMonitorImpl.java | 14 +-
server/src/com/cloud/vm/UserVmManagerImpl.java | 74 +-
.../configuration/ValidateIpRangeTest.java | 11 +-
.../com/cloud/network/MockNetworkModelImpl.java | 5 +
.../com/cloud/vpc/MockNetworkModelImpl.java | 5 +
services/console-proxy/server/js/ajaxkeys.js | 42 +-
.../console-proxy/server/scripts/ssvm-check.sh | 136 --
.../consoleproxy/ConsoleProxyClientBase.java | 4 +-
.../consoleproxy/ConsoleProxyGCThread.java | 5 +-
.../consoleproxy/ConsoleProxyVncClient.java | 5 +-
.../consoleproxy/vnc/VncClientPacketSender.java | 4 +-
.../vnc/VncServerPacketReceiver.java | 4 +-
.../server/systemvm-descriptor.xml | 9 +
.../resource/NfsSecondaryStorageResource.java | 19 +-
setup/db/db/schema-2214to30.sql | 1 +
setup/db/db/schema-410to420.sql | 3 +
setup/dev/advanced.cfg | 21 +-
test/integration/component/maint/__init__.py | 21 +
.../component/maint/test_high_availability.py | 1079 ++++++++++++++++
.../maint/test_host_high_availability.py | 810 ++++++++++++
.../maint/test_vpc_host_maintenance.py | 561 +++++++++
.../maint/test_vpc_on_host_maintenance.py | 323 +++++
test/integration/component/test_accounts.py | 5 +-
.../component/test_advancedsg_networks.py | 20 +-
.../component/test_custom_hostname.py | 22 +-
test/integration/component/test_egress_rules.py | 1 -
test/integration/component/test_eip_elb.py | 6 -
.../component/test_high_availability.py | 1079 ----------------
.../component/test_host_high_availability.py | 811 ------------
.../component/test_netscaler_configs.py | 20 +-
test/integration/component/test_netscaler_lb.py | 81 +-
.../component/test_netscaler_lb_algo.py | 56 +-
.../component/test_netscaler_lb_sticky.py | 6 +-
.../component/test_network_offering.py | 1 -
.../component/test_project_configs.py | 2 -
.../component/test_project_limits.py | 1 -
test/integration/component/test_projects.py | 1 -
.../component/test_shared_networks.py | 94 +-
test/integration/component/test_tags.py | 2 -
test/integration/component/test_templates.py | 1 -
.../component/test_vm_passwdenabled.py | 1 -
test/integration/component/test_vpc.py | 423 +------
.../component/test_vpc_host_maintenance.py | 889 -------------
test/integration/component/test_vpc_network.py | 275 ++--
.../component/test_vpc_network_lbrules.py | 2 +-
.../component/test_vpc_network_pfrules.py | 489 ++++----
.../integration/component/test_vpc_offerings.py | 2 -
test/integration/component/test_vpc_routers.py | 4 -
.../component/test_vpc_vm_life_cycle.py | 1181 +++---------------
.../component/test_vpc_vms_deployment.py | 1 -
...deploy_vms_with_varied_deploymentplanners.py | 25 +-
test/integration/smoke/test_network.py | 376 +++---
.../integration/smoke/test_portable_publicip.py | 1 -
test/integration/smoke/test_vm_life_cycle.py | 4 +-
tools/apidoc/generateadmincommands.xsl | 6 +-
tools/apidoc/generatecommand.xsl | 4 +-
tools/apidoc/generatedomainadmincommands.xsl | 4 +-
tools/apidoc/generatetoc_footer.xsl | 4 +-
tools/apidoc/generateusercommands.xsl | 4 +-
tools/apidoc/images/cloudstack.png | Bin 3893 -> 8575 bytes
tools/apidoc/images/ins_buttonshadow.gif | Bin 1683 -> 0 bytes
tools/apidoc/images/insdownload_button.gif | Bin 2531 -> 0 bytes
.../apidoc/images/insdownload_button_hover.gif | Bin 2569 -> 0 bytes
tools/apidoc/images/insjoincomm_button.gif | Bin 2627 -> 0 bytes
.../apidoc/images/insjoincomm_button_hover.gif | Bin 2620 -> 0 bytes
tools/apidoc/includes/main.css | 2 +-
tools/appliance/build.sh | 6 +-
tools/cli/cloudmonkey/config.py | 2 +-
tools/cli/cloudmonkey/requester.py | 47 +-
tools/marvin/marvin/cloudstackTestClient.py | 1 +
ui/index.jsp | 1 -
ui/scripts/configuration.js | 7 +-
ui/scripts/instances.js | 12 +-
ui/scripts/network.js | 135 +-
ui/scripts/system.js | 10 +-
ui/scripts/ui-custom/projectSelect.js | 4 +-
ui/scripts/ui-custom/projects.js | 4 +-
ui/scripts/ui/utils.js | 2 +-
ui/scripts/ui/widgets/listView.js | 26 +-
ui/scripts/vpc.js | 17 +-
ui/scripts/zoneWizard.js | 2 +
.../cloud/usage/parser/NetworkUsageParser.java | 11 +-
.../cloud/usage/parser/VmDiskUsageParser.java | 59 +-
utils/src/com/cloud/utils/S3Utils.java | 4 +-
utils/src/com/cloud/utils/StringUtils.java | 6 +-
utils/src/com/cloud/utils/Ternary.java | 2 +-
utils/src/com/cloud/utils/net/NetUtils.java | 42 +-
.../src/com/cloud/utils/ssh/SSHKeysHelper.java | 2 +-
utils/test/com/cloud/utils/StringUtilsTest.java | 5 +
utils/test/com/cloud/utils/TernaryTest.java | 35 +
.../com/cloud/utils/crypto/RSAHelperTest.java | 50 +
.../test/com/cloud/utils/net/NetUtilsTest.java | 18 +
.../com/cloud/utils/ssh/SSHKeysHelperTest.java | 69 +
187 files changed, 5783 insertions(+), 5834 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/api/src/org/apache/cloudstack/api/command/admin/cluster/ListClustersCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/cluster/ListClustersCmd.java
index 1283f2c,0417b18..ac48f75
--- a/api/src/org/apache/cloudstack/api/command/admin/cluster/ListClustersCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/cluster/ListClustersCmd.java
@@@ -118,10 -114,7 +115,7 @@@ public class ListClustersCmd extends Ba
this.managedState = managedstate;
}
- public String getZoneType() {
- return zoneType;
- }
-
+
public Boolean getShowCapacities() {
return showCapacities;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/api/src/org/apache/cloudstack/api/command/admin/host/ListHostsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/host/ListHostsCmd.java
index 18a153c,eaaec30..cf1f5be
--- a/api/src/org/apache/cloudstack/api/command/admin/host/ListHostsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/host/ListHostsCmd.java
@@@ -75,10 -74,7 +75,7 @@@ public class ListHostsCmd extends BaseL
@Parameter(name=ApiConstants.ZONE_ID, type=CommandType.UUID, entityType = ZoneResponse.class,
description="the Zone ID for the host")
private Long zoneId;
-
+
- @Parameter(name=ApiConstants.ZONE_TYPE, type=CommandType.STRING, description="the network type of the zone that the virtual machine belongs to")
- private String zoneType;
-
@Parameter(name=ApiConstants.VIRTUAL_MACHINE_ID, type=CommandType.UUID, entityType = UserVmResponse.class,
required=false, description="lists hosts in the same cluster as this VM and flag hosts with enough CPU/RAm to host this VM")
private Long virtualMachineId;
@@@ -127,11 -123,7 +124,7 @@@
public Long getZoneId() {
return zoneId;
}
-
+
- public String getZoneType() {
- return zoneType;
- }
-
public Long getVirtualMachineId() {
return virtualMachineId;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/api/src/org/apache/cloudstack/api/command/admin/ldap/LDAPConfigCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/ldap/LDAPConfigCmd.java
index 9eaecca,2726f84..7f31800
--- a/api/src/org/apache/cloudstack/api/command/admin/ldap/LDAPConfigCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/ldap/LDAPConfigCmd.java
@@@ -44,10 -43,9 +44,9 @@@ public class LDAPConfigCmd extends Base
/////////////////////////////////////////////////////
//////////////// API parameters /////////////////////
/////////////////////////////////////////////////////
-
- @Parameter(name=ApiConstants.LIST_ALL, type=CommandType.STRING, description="Hostname or ip address of the ldap server eg: my.ldap.com")
- private String listall;
+ @Parameter(name=ApiConstants.LIST_ALL, type=CommandType.BOOLEAN, description="If true return current LDAP configuration")
+ private Boolean listAll;
-
+
@Parameter(name=ApiConstants.HOST_NAME, type=CommandType.STRING, description="Hostname or ip address of the ldap server eg: my.ldap.com")
private String hostname;
@@@ -79,10 -77,10 +78,10 @@@
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
- public String getListAll() {
- return listall == null ? "false" : listall;
+ public Boolean getListAll() {
+ return listAll == null ? Boolean.FALSE : listAll;
}
-
+
public String getBindPassword() {
return bindPassword;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/api/src/org/apache/cloudstack/api/command/admin/pod/ListPodsByCmd.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/api/src/org/apache/cloudstack/api/command/admin/storage/ListStoragePoolsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/storage/ListStoragePoolsCmd.java
index 12bb6d0,85a3c22..367d1e6
--- a/api/src/org/apache/cloudstack/api/command/admin/storage/ListStoragePoolsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/storage/ListStoragePoolsCmd.java
@@@ -60,10 -59,7 +60,7 @@@ public class ListStoragePoolsCmd extend
@Parameter(name=ApiConstants.ZONE_ID, type=CommandType.UUID, entityType = ZoneResponse.class,
description="the Zone ID for the storage pool")
private Long zoneId;
-
+
- @Parameter(name=ApiConstants.ZONE_TYPE, type=CommandType.STRING, description="the network type of the zone that the virtual machine belongs to")
- private String zoneType;
-
@Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType = StoragePoolResponse.class,
description="the ID of the storage pool")
private Long id;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/api/src/org/apache/cloudstack/api/command/admin/systemvm/ListSystemVMsCmd.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/api/src/org/apache/cloudstack/api/command/user/iso/ListIsosCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/iso/ListIsosCmd.java
index 53e4d14,3219601..a12b8f6
--- a/api/src/org/apache/cloudstack/api/command/user/iso/ListIsosCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/iso/ListIsosCmd.java
@@@ -119,12 -115,8 +116,8 @@@ public class ListIsosCmd extends BaseLi
return zoneId;
}
- public String getZoneType() {
- return zoneType;
- }
-
public boolean listInReadyState() {
- Account account = UserContext.current().getCaller();
+ Account account = CallContext.current().getCallingAccount();
// It is account specific if account is admin type and domainId and accountName are not null
boolean isAccountSpecific = (account == null || isAdmin(account.getType())) && (getAccountName() != null) && (getDomainId() != null);
// Show only those that are downloaded.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/api/src/org/apache/cloudstack/api/command/user/network/ListNetworksCmd.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/api/src/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotsCmd.java
index ca169b7,8859ba5..aafe9d8
--- a/api/src/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotsCmd.java
@@@ -29,7 -26,10 +29,8 @@@ import org.apache.cloudstack.api.Parame
import org.apache.cloudstack.api.response.ListResponse;
import org.apache.cloudstack.api.response.SnapshotResponse;
import org.apache.cloudstack.api.response.VolumeResponse;
+ import org.apache.cloudstack.api.response.ZoneResponse;
-import org.apache.log4j.Logger;
-import com.cloud.async.AsyncJob;
import com.cloud.storage.Snapshot;
import com.cloud.utils.Pair;
@@@ -60,9 -60,10 +61,10 @@@ public class ListSnapshotsCmd extends B
description="the ID of the disk volume")
private Long volumeId;
- @Parameter(name=ApiConstants.ZONE_TYPE, type=CommandType.STRING, description="the network type of the zone that the virtual machine belongs to")
- private String zoneType;
+ @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, description = "list snapshots by zone id")
+ private Long zoneId;
+
-
+
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
@@@ -87,10 -88,10 +89,10 @@@
return volumeId;
}
- public String getZoneType() {
- return zoneType;
+ public Long getZoneId() {
+ return zoneId;
- }
-
+ }
+
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////
@@@ -100,8 -101,8 +102,9 @@@
return s_name;
}
- public AsyncJob.Type getInstanceType() {
- return AsyncJob.Type.Snapshot;
++ @Override
+ public ApiCommandJobType getInstanceType() {
+ return ApiCommandJobType.Snapshot;
}
@Override
@@@ -117,6 -118,6 +120,6 @@@
response.setResponses(snapshotResponses, result.second());
response.setResponseName(getCommandName());
-- this.setResponseObject(response);
++ setResponseObject(response);
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/api/src/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java
index 29d0356,aeb76f5..b764b6d
--- a/api/src/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java
@@@ -97,13 -92,9 +93,9 @@@ public class ListTemplatesCmd extends B
return zoneId;
}
- public String getZoneType() {
- return zoneType;
- }
-
public boolean listInReadyState() {
- Account account = UserContext.current().getCaller();
+ Account account = CallContext.current().getCallingAccount();
// It is account specific if account is admin type and domainId and accountName are not null
boolean isAccountSpecific = (account == null || isAdmin(account.getType())) && (getAccountName() != null) && (getDomainId() != null);
// Show only those that are downloaded.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/api/src/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/api/src/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/api/src/org/apache/cloudstack/api/response/FirewallResponse.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/api/src/org/apache/cloudstack/api/response/SnapshotResponse.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/engine/components-api/src/com/cloud/storage/VolumeManager.java
----------------------------------------------------------------------
diff --cc engine/components-api/src/com/cloud/storage/VolumeManager.java
index 36fd75b,0000000..5345aa7
mode 100644,000000..100644
--- a/engine/components-api/src/com/cloud/storage/VolumeManager.java
+++ b/engine/components-api/src/com/cloud/storage/VolumeManager.java
@@@ -1,119 -1,0 +1,121 @@@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.cloud.storage;
+
+import java.util.Map;
+
+import org.apache.cloudstack.api.command.user.volume.AttachVolumeCmd;
+import org.apache.cloudstack.api.command.user.volume.CreateVolumeCmd;
+import org.apache.cloudstack.api.command.user.volume.DetachVolumeCmd;
+import org.apache.cloudstack.api.command.user.volume.MigrateVolumeCmd;
+import org.apache.cloudstack.api.command.user.volume.ResizeVolumeCmd;
+import org.apache.cloudstack.api.command.user.volume.UploadVolumeCmd;
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
+
+import com.cloud.agent.api.to.VirtualMachineTO;
+import com.cloud.deploy.DeployDestination;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientStorageCapacityException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.StorageUnavailableException;
+import com.cloud.host.Host;
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.storage.Volume.Type;
+import com.cloud.user.Account;
+import com.cloud.vm.DiskProfile;
+import com.cloud.vm.VMInstanceVO;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.VirtualMachineProfile;
+
+public interface VolumeManager extends VolumeApiService {
+
+ VolumeInfo moveVolume(VolumeInfo volume, long destPoolDcId, Long destPoolPodId,
+ Long destPoolClusterId, HypervisorType dataDiskHyperType)
+ throws ConcurrentOperationException;
+
+ @Override
+ VolumeVO uploadVolume(UploadVolumeCmd cmd)
+ throws ResourceAllocationException;
+
+ VolumeVO allocateDuplicateVolume(VolumeVO oldVol, Long templateId);
+
+ boolean volumeOnSharedStoragePool(VolumeVO volume);
+
+ boolean volumeInactive(Volume volume);
+
+ String getVmNameOnVolume(Volume volume);
+
+ @Override
+ VolumeVO allocVolume(CreateVolumeCmd cmd)
+ throws ResourceAllocationException;
+
+ @Override
+ VolumeVO createVolume(CreateVolumeCmd cmd);
+
+ @Override
+ VolumeVO resizeVolume(ResizeVolumeCmd cmd)
+ throws ResourceAllocationException;
+
+ @Override
+ boolean deleteVolume(long volumeId, Account caller)
+ throws ConcurrentOperationException;
+
+ void destroyVolume(VolumeVO volume);
+
+ DiskProfile allocateRawVolume(Type type, String name, DiskOfferingVO offering, Long size, VMInstanceVO vm, Account owner);
+ @Override
+ Volume attachVolumeToVM(AttachVolumeCmd command);
+
+ @Override
+ Volume detachVolumeFromVM(DetachVolumeCmd cmmd);
+
+ void release(VirtualMachineProfile profile);
+
+ void cleanupVolumes(long vmId) throws ConcurrentOperationException;
+
+ @Override
+ Volume migrateVolume(MigrateVolumeCmd cmd);
+
+ void migrateVolumes(VirtualMachine vm, VirtualMachineTO vmTo, Host srcHost, Host destHost,
+ Map<Volume, StoragePool> volumeToPool);
+
+ boolean storageMigration(
+ VirtualMachineProfile vm,
+ StoragePool destPool);
+
+ void prepareForMigration(
+ VirtualMachineProfile vm,
+ DeployDestination dest);
+
+ void prepare(VirtualMachineProfile vm,
+ DeployDestination dest) throws StorageUnavailableException,
+ InsufficientStorageCapacityException, ConcurrentOperationException;
+
+ boolean canVmRestartOnAnotherServer(long vmId);
+
+ DiskProfile allocateTemplatedVolume(Type type, String name,
+ DiskOfferingVO offering, VMTemplateVO template, VMInstanceVO vm,
+ Account owner);
+
+ String getVmNameFromVolumeId(long volumeId);
+
+ String getStoragePoolOfVolume(long volumeId);
++
++ boolean validateVolumeSizeRange(long size);
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/engine/orchestration/src/org/apache/cloudstack/platform/orchestration/CloudOrchestrator.java
----------------------------------------------------------------------
diff --cc engine/orchestration/src/org/apache/cloudstack/platform/orchestration/CloudOrchestrator.java
index d343df3,96fb1d9..a60ad38
--- a/engine/orchestration/src/org/apache/cloudstack/platform/orchestration/CloudOrchestrator.java
+++ b/engine/orchestration/src/org/apache/cloudstack/platform/orchestration/CloudOrchestrator.java
@@@ -45,6 -46,6 +45,7 @@@ import com.cloud.network.dao.NetworkVO
import com.cloud.service.ServiceOfferingVO;
import com.cloud.service.dao.ServiceOfferingDao;
import com.cloud.storage.DiskOfferingVO;
++import com.cloud.storage.VolumeManager;
import com.cloud.storage.dao.DiskOfferingDao;
import com.cloud.storage.dao.VMTemplateDao;
import com.cloud.user.dao.AccountDao;
@@@ -88,9 -88,12 +89,12 @@@ public class CloudOrchestrator implemen
@Inject
protected AccountDao _accountDao = null;
+ @Inject
+ VolumeManager _volumeMgr;
+
public CloudOrchestrator() {
}
-
+
public VirtualMachineEntity createFromScratch(String uuid, String iso, String os, String hypervisor, String hostName, int cpu, int speed, long memory, List<String> networks, List<String> computeTags,
Map<String, String> details, String owner) {
return null;
@@@ -250,7 -251,8 +255,8 @@@
throw new InvalidParameterValueException("Disk offering "
+ diskOffering + " requires size parameter.");
}
+ _volumeMgr.validateVolumeSizeRange(size * 1024 * 1024 * 1024);
- }
+ }
rootDiskOffering.first(diskOffering);
rootDiskOffering.second(size);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/engine/orchestration/test/com/cloud/vm/VirtualMachineManagerImplTest.java
----------------------------------------------------------------------
diff --cc engine/orchestration/test/com/cloud/vm/VirtualMachineManagerImplTest.java
index 607c1e2,0000000..192f99a
mode 100644,000000..100644
--- a/engine/orchestration/test/com/cloud/vm/VirtualMachineManagerImplTest.java
+++ b/engine/orchestration/test/com/cloud/vm/VirtualMachineManagerImplTest.java
@@@ -1,420 -1,0 +1,430 @@@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package com.cloud.vm;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyLong;
+import static org.mockito.Matchers.isA;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.Spy;
+
+import org.apache.cloudstack.api.command.user.vm.RestoreVMCmd;
++import org.apache.cloudstack.config.ConfigDepot;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+
+import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.CheckVirtualMachineAnswer;
+import com.cloud.agent.api.CheckVirtualMachineCommand;
+import com.cloud.agent.api.MigrateWithStorageAnswer;
+import com.cloud.agent.api.MigrateWithStorageCommand;
+import com.cloud.agent.api.MigrateWithStorageCompleteAnswer;
+import com.cloud.agent.api.MigrateWithStorageCompleteCommand;
+import com.cloud.agent.api.MigrateWithStorageReceiveAnswer;
+import com.cloud.agent.api.MigrateWithStorageReceiveCommand;
+import com.cloud.agent.api.MigrateWithStorageSendAnswer;
+import com.cloud.agent.api.MigrateWithStorageSendCommand;
+import com.cloud.agent.api.PrepareForMigrationAnswer;
+import com.cloud.agent.api.PrepareForMigrationCommand;
+import com.cloud.agent.api.ScaleVmAnswer;
+import com.cloud.agent.api.ScaleVmCommand;
+import com.cloud.configuration.dao.ConfigurationDao;
+import com.cloud.dc.dao.ClusterDao;
+import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.dc.dao.HostPodDao;
+import com.cloud.deploy.DeployDestination;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.ManagementServerException;
+import com.cloud.exception.OperationTimedoutException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.exception.VirtualMachineMigrationException;
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.hypervisor.HypervisorGuru;
+import com.cloud.hypervisor.HypervisorGuruManager;
+import com.cloud.network.NetworkManager;
+import com.cloud.offering.ServiceOffering;
+import com.cloud.service.ServiceOfferingVO;
+import com.cloud.storage.DiskOfferingVO;
+import com.cloud.storage.StoragePool;
+import com.cloud.storage.StoragePoolHostVO;
+import com.cloud.storage.VMTemplateVO;
+import com.cloud.storage.Volume;
+import com.cloud.storage.VolumeManager;
+import com.cloud.storage.VolumeVO;
+import com.cloud.storage.dao.DiskOfferingDao;
+import com.cloud.storage.dao.StoragePoolHostDao;
+import com.cloud.storage.dao.VMTemplateDao;
+import com.cloud.storage.dao.VolumeDao;
+import com.cloud.user.Account;
+import com.cloud.user.AccountVO;
+import com.cloud.user.UserVO;
+import com.cloud.user.dao.AccountDao;
+import com.cloud.user.dao.UserDao;
+import com.cloud.utils.Pair;
+import com.cloud.utils.db.EntityManager;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.vm.VirtualMachine.Event;
+import com.cloud.vm.VirtualMachine.PowerState;
+import com.cloud.vm.VirtualMachine.State;
+import com.cloud.vm.dao.UserVmDao;
+import com.cloud.vm.dao.VMInstanceDao;
+import com.cloud.vm.snapshot.VMSnapshotManager;
+
+public class VirtualMachineManagerImplTest {
+
+ @Spy VirtualMachineManagerImpl _vmMgr = new VirtualMachineManagerImpl();
+ @Mock
+ VolumeManager _storageMgr;
+ @Mock
+ Account _account;
+ @Mock
+ AgentManager _agentMgr;
+ @Mock
+ AccountDao _accountDao;
+ @Mock
+ ConfigurationDao _configDao;
+ @Mock
+ HostDao _hostDao;
+ @Mock
+ UserDao _userDao;
+ @Mock
+ UserVmDao _vmDao;
+ @Mock
+ ItWorkDao _workDao;
+ @Mock
+ VMInstanceDao _vmInstanceDao;
+ @Mock
+ VMTemplateDao _templateDao;
+ @Mock
+ VolumeDao _volsDao;
+ @Mock
+ RestoreVMCmd _restoreVMCmd;
+ @Mock
+ AccountVO _accountMock;
+ @Mock
+ UserVO _userMock;
+ @Mock
+ UserVmVO _vmMock;
+ @Mock
+ VMInstanceVO _vmInstance;
+ @Mock
+ HostVO _host;
+ @Mock
+ VMTemplateVO _templateMock;
+ @Mock
+ VolumeVO _volumeMock;
+ @Mock
+ List<VolumeVO> _rootVols;
+ @Mock
+ ItWorkVO _work;
++ @Mock
++ ConfigDepot _configDepot;
++ @Mock
++ HostVO hostVO;
+
+ @Mock
+ EntityManager _entityMgr;
+
+ @Mock ClusterDao _clusterDao;
+ @Mock HostPodDao _podDao;
+ @Mock DataCenterDao _dcDao;
+ @Mock DiskOfferingDao _diskOfferingDao;
+ @Mock PrimaryDataStoreDao _storagePoolDao;
+ @Mock StoragePoolHostDao _poolHostDao;
+ @Mock NetworkManager _networkMgr;
+ @Mock HypervisorGuruManager _hvGuruMgr;
+ @Mock VMSnapshotManager _vmSnapshotMgr;
+
+ // Mock objects for vm migration with storage test.
+ @Mock DiskOfferingVO _diskOfferingMock;
+ @Mock StoragePoolVO _srcStoragePoolMock;
+ @Mock StoragePoolVO _destStoragePoolMock;
+ @Mock HostVO _srcHostMock;
+ @Mock HostVO _destHostMock;
+ @Mock
+ Map<Volume, StoragePool> _volumeToPoolMock;
+
+ @Before
+ public void setup(){
+ MockitoAnnotations.initMocks(this);
+
+ _vmMgr._entityMgr = _entityMgr;
+ _vmMgr._volsDao = _volsDao;
+ _vmMgr._volumeMgr = _storageMgr;
+ _vmMgr._hostDao = _hostDao;
+ _vmMgr._nodeId = 1L;
+/*
+ _vmMgr._workDao = _workDao;
+*/
+ _vmMgr._agentMgr = _agentMgr;
+ _vmMgr._poolHostDao= _poolHostDao;
+ _vmMgr._networkMgr = _networkMgr;
+ _vmMgr._hvGuruMgr = _hvGuruMgr;
+ _vmMgr._vmSnapshotMgr = _vmSnapshotMgr;
+ _vmMgr._vmDao = _vmInstanceDao;
++ _vmMgr._configDepot = _configDepot;
+
+ when(_vmMock.getId()).thenReturn(314l);
+ when(_vmInstance.getId()).thenReturn(1L);
+ when(_vmInstance.getServiceOfferingId()).thenReturn(2L);
+ when(_vmInstance.getInstanceName()).thenReturn("myVm");
+ when(_vmInstance.getHostId()).thenReturn(2L);
+ when(_vmInstance.getType()).thenReturn(VirtualMachine.Type.User);
+ when(_host.getId()).thenReturn(1L);
+ when(_hostDao.findById(anyLong())).thenReturn(null);
+ when(_entityMgr.findById(ServiceOffering.class, anyLong())).thenReturn(getSvcoffering(512));
+ when(_workDao.persist(_work)).thenReturn(_work);
+ when(_workDao.update("1", _work)).thenReturn(true);
+ when(_work.getId()).thenReturn("1");
+ doNothing().when(_work).setStep(ItWorkVO.Step.Done);
+ //doNothing().when(_volsDao).detachVolume(anyLong());
+ //when(_work.setStep(ItWorkVO.Step.Done)).thenReturn("1");
+
+ }
+
+
+ @Test(expected=CloudRuntimeException.class)
+ public void testScaleVM1() throws Exception {
+
+
+ DeployDestination dest = new DeployDestination(null, null, null, _host);
+ long l = 1L;
+
+ when(_vmInstanceDao.findById(anyLong())).thenReturn(_vmInstance);
+ _vmMgr.migrateForScale(_vmInstance.getUuid(), l, dest, l);
+
+ }
+
+ @Test (expected=CloudRuntimeException.class)
+ public void testScaleVM2() throws Exception {
+
+ DeployDestination dest = new DeployDestination(null, null, null, _host);
+ long l = 1L;
+
+ when(_vmInstanceDao.findById(anyLong())).thenReturn(_vmInstance);
+ ServiceOfferingVO newServiceOffering = getSvcoffering(512);
++ when(_hostDao.findById(_vmInstance.hostId)).thenReturn(hostVO);
++ when(hostVO.getClusterId()).thenReturn(1L);
++// when(_configDepot.getConfigValue(Config.MemOverprovisioningFactor.key(), Config.ConfigurationParameterScope.cluster.toString(), 1L)).thenReturn("1.0");
++// when(_configServer.getConfigValue(Config.CPUOverprovisioningFactor.key(), Config.ConfigurationParameterScope.cluster.toString(), 1L)).thenReturn("1.0");
+ ScaleVmCommand reconfigureCmd = new ScaleVmCommand("myVmName", newServiceOffering.getCpu(),
- newServiceOffering.getSpeed(), newServiceOffering.getRamSize(), newServiceOffering.getRamSize(), newServiceOffering.getLimitCpuUse());
++ newServiceOffering.getSpeed(), newServiceOffering.getSpeed(), newServiceOffering.getRamSize(), newServiceOffering.getRamSize(), newServiceOffering.getLimitCpuUse());
+ Answer answer = new ScaleVmAnswer(reconfigureCmd, true, "details");
+ when(_agentMgr.send(2l, reconfigureCmd)).thenReturn(null);
+ _vmMgr.reConfigureVm(_vmInstance, getSvcoffering(256), false);
+
+ }
+
+ @Test (expected=CloudRuntimeException.class)
+ public void testScaleVM3() throws Exception {
+
+ /*VirtualMachineProfile<VMInstanceVO> profile = new VirtualMachineProfileImpl<VMInstanceVO>(vm);
+
+ Long srcHostId = vm.getHostId();
+ Long oldSvcOfferingId = vm.getServiceOfferingId();
+ if (srcHostId == null) {
+ throw new CloudRuntimeException("Unable to scale the vm because it doesn't have a host id");
+ }*/
+
+ when(_vmInstance.getHostId()).thenReturn(null);
+ when(_vmInstanceDao.findById(anyLong())).thenReturn(_vmInstance);
+ _vmMgr.findHostAndMigrate(_vmInstance.getUuid(), 2l);
+
+ }
+
+
+ private ServiceOfferingVO getSvcoffering(int ramSize){
+
+ long id = 4L;
+ String name = "name";
+ String displayText = "displayText";
+ int cpu = 1;
+ //int ramSize = 256;
+ int speed = 128;
+
+ boolean ha = false;
+ boolean useLocalStorage = false;
+
+ ServiceOfferingVO serviceOffering = new ServiceOfferingVO(name, cpu, ramSize, speed, null, null, ha, displayText, useLocalStorage, false, null, false, null, false);
+ return serviceOffering;
+ }
+
+ private void initializeMockConfigForMigratingVmWithVolumes() throws OperationTimedoutException,
+ ResourceUnavailableException {
+
+ // Mock the source and destination hosts.
+ when(_srcHostMock.getId()).thenReturn(5L);
+ when(_destHostMock.getId()).thenReturn(6L);
+ when(_hostDao.findById(5L)).thenReturn(_srcHostMock);
+ when(_hostDao.findById(6L)).thenReturn(_destHostMock);
+
+ // Mock the vm being migrated.
+ when(_vmMock.getId()).thenReturn(1L);
+ when(_vmMock.getHypervisorType()).thenReturn(HypervisorType.XenServer);
+ when(_vmMock.getState()).thenReturn(State.Running).thenReturn(State.Running).thenReturn(State.Migrating)
+ .thenReturn(State.Migrating);
+ when(_vmMock.getHostId()).thenReturn(5L);
+ when(_vmInstance.getId()).thenReturn(1L);
+ when(_vmInstance.getServiceOfferingId()).thenReturn(2L);
+ when(_vmInstance.getInstanceName()).thenReturn("myVm");
+ when(_vmInstance.getHostId()).thenReturn(5L);
+ when(_vmInstance.getType()).thenReturn(VirtualMachine.Type.User);
+ when(_vmInstance.getState()).thenReturn(State.Running).thenReturn(State.Running).thenReturn(State.Migrating)
+ .thenReturn(State.Migrating);
+
+ // Mock the work item.
+ when(_workDao.persist(any(ItWorkVO.class))).thenReturn(_work);
+ when(_workDao.update("1", _work)).thenReturn(true);
+ when(_work.getId()).thenReturn("1");
+ doNothing().when(_work).setStep(ItWorkVO.Step.Done);
+
+ // Mock the vm guru and the user vm object that gets returned.
+ _vmMgr._vmGurus = new HashMap<VirtualMachine.Type, VirtualMachineGuru>();
+
+ // Mock the iteration over all the volumes of an instance.
+ Iterator<VolumeVO> volumeIterator = mock(Iterator.class);
+ when(_volsDao.findUsableVolumesForInstance(anyLong())).thenReturn(_rootVols);
+ when(_rootVols.iterator()).thenReturn(volumeIterator);
+ when(volumeIterator.hasNext()).thenReturn(true, false);
+ when(volumeIterator.next()).thenReturn(_volumeMock);
+
+ // Mock the disk offering and pool objects for a volume.
+ when(_volumeMock.getDiskOfferingId()).thenReturn(5L);
+ when(_volumeMock.getPoolId()).thenReturn(200L);
+ when(_diskOfferingDao.findById(anyLong())).thenReturn(_diskOfferingMock);
+ when(_storagePoolDao.findById(anyLong())).thenReturn(_srcStoragePoolMock);
+
+ // Mock the volume to pool mapping.
+ when(_volumeToPoolMock.get(_volumeMock)).thenReturn(_destStoragePoolMock);
+ when(_destStoragePoolMock.getId()).thenReturn(201L);
+ when(_srcStoragePoolMock.getId()).thenReturn(200L);
+ when(_destStoragePoolMock.isLocal()).thenReturn(false);
+ when(_diskOfferingMock.getUseLocalStorage()).thenReturn(false);
+ when(_poolHostDao.findByPoolHost(anyLong(), anyLong())).thenReturn(mock(StoragePoolHostVO.class));
+
+ // Mock hypervisor guru.
+ HypervisorGuru guruMock = mock(HypervisorGuru.class);
+ when(_hvGuruMgr.getGuru(HypervisorType.XenServer)).thenReturn(guruMock);
+
+ when(_srcHostMock.getClusterId()).thenReturn(3L);
+ when(_destHostMock.getClusterId()).thenReturn(3L);
+
+ // Mock the commands and answers to the agent.
+ PrepareForMigrationAnswer prepAnswerMock = mock(PrepareForMigrationAnswer.class);
+ when(prepAnswerMock.getResult()).thenReturn(true);
+ when(_agentMgr.send(anyLong(), isA(PrepareForMigrationCommand.class))).thenReturn(prepAnswerMock);
+
+ MigrateWithStorageAnswer migAnswerMock = mock(MigrateWithStorageAnswer.class);
+ when(migAnswerMock.getResult()).thenReturn(true);
+ when(_agentMgr.send(anyLong(), isA(MigrateWithStorageCommand.class))).thenReturn(migAnswerMock);
+
+ MigrateWithStorageReceiveAnswer migRecAnswerMock = mock(MigrateWithStorageReceiveAnswer.class);
+ when(migRecAnswerMock.getResult()).thenReturn(true);
+ when(_agentMgr.send(anyLong(), isA(MigrateWithStorageReceiveCommand.class))).thenReturn(migRecAnswerMock);
+
+ MigrateWithStorageSendAnswer migSendAnswerMock = mock(MigrateWithStorageSendAnswer.class);
+ when(migSendAnswerMock.getResult()).thenReturn(true);
+ when(_agentMgr.send(anyLong(), isA(MigrateWithStorageSendCommand.class))).thenReturn(migSendAnswerMock);
+
+ MigrateWithStorageCompleteAnswer migCompleteAnswerMock = mock(MigrateWithStorageCompleteAnswer.class);
+ when(migCompleteAnswerMock.getResult()).thenReturn(true);
+ when(_agentMgr.send(anyLong(), isA(MigrateWithStorageCompleteCommand.class))).thenReturn(migCompleteAnswerMock);
+
+ CheckVirtualMachineAnswer checkVmAnswerMock = mock(CheckVirtualMachineAnswer.class);
+ when(checkVmAnswerMock.getResult()).thenReturn(true);
+ when(checkVmAnswerMock.getState()).thenReturn(PowerState.PowerOn);
+ when(_agentMgr.send(anyLong(), isA(CheckVirtualMachineCommand.class))).thenReturn(checkVmAnswerMock);
+
+ // Mock the state transitions of vm.
+ Pair<Long, Long> opaqueMock = new Pair<Long, Long> (_vmMock.getHostId(), _destHostMock.getId());
+ when(_vmSnapshotMgr.hasActiveVMSnapshotTasks(anyLong())).thenReturn(false);
+ when(_vmInstanceDao.updateState(State.Running, Event.MigrationRequested, State.Migrating, _vmMock, opaqueMock))
+ .thenReturn(true);
+ when(_vmInstanceDao.updateState(State.Migrating, Event.OperationSucceeded, State.Running, _vmMock, opaqueMock))
+ .thenReturn(true);
+ }
+
+ // Check migration of a vm with its volumes within a cluster.
+ @Test
+ public void testMigrateWithVolumeWithinCluster() throws ResourceUnavailableException, ConcurrentOperationException,
+ ManagementServerException, VirtualMachineMigrationException, OperationTimedoutException {
+
+ initializeMockConfigForMigratingVmWithVolumes();
+ when(_srcHostMock.getClusterId()).thenReturn(3L);
+ when(_destHostMock.getClusterId()).thenReturn(3L);
+
+ _vmMgr.migrateWithStorage(_vmInstance.getUuid(), _srcHostMock.getId(), _destHostMock.getId(), _volumeToPoolMock);
+ }
+
+ // Check migration of a vm with its volumes across a cluster.
+ @Test
+ public void testMigrateWithVolumeAcrossCluster() throws ResourceUnavailableException, ConcurrentOperationException,
+ ManagementServerException, VirtualMachineMigrationException, OperationTimedoutException {
+
+ initializeMockConfigForMigratingVmWithVolumes();
+ when(_srcHostMock.getClusterId()).thenReturn(3L);
+ when(_destHostMock.getClusterId()).thenReturn(4L);
+
+ _vmMgr.migrateWithStorage(_vmInstance.getUuid(), _srcHostMock.getId(), _destHostMock.getId(), _volumeToPoolMock);
+ }
+
+ // Check migration of a vm fails when src and destination pool are not of same type; that is, one is shared and
+ // other is local.
+ @Test(expected=CloudRuntimeException.class)
+ public void testMigrateWithVolumeFail1() throws ResourceUnavailableException, ConcurrentOperationException,
+ ManagementServerException, VirtualMachineMigrationException, OperationTimedoutException {
+
+ initializeMockConfigForMigratingVmWithVolumes();
+ when(_srcHostMock.getClusterId()).thenReturn(3L);
+ when(_destHostMock.getClusterId()).thenReturn(3L);
+
+ when(_destStoragePoolMock.isLocal()).thenReturn(true);
+ when(_diskOfferingMock.getUseLocalStorage()).thenReturn(false);
+
+ _vmMgr.migrateWithStorage(_vmInstance.getUuid(), _srcHostMock.getId(), _destHostMock.getId(), _volumeToPoolMock);
+ }
+
+ // Check migration of a vm fails when vm is not in Running state.
+ @Test(expected=ConcurrentOperationException.class)
+ public void testMigrateWithVolumeFail2() throws ResourceUnavailableException, ConcurrentOperationException,
+ ManagementServerException, VirtualMachineMigrationException, OperationTimedoutException {
+
+ initializeMockConfigForMigratingVmWithVolumes();
+ when(_srcHostMock.getClusterId()).thenReturn(3L);
+ when(_destHostMock.getClusterId()).thenReturn(3L);
+
+ when(_vmMock.getState()).thenReturn(State.Stopped);
+
+ _vmMgr.migrateWithStorage(_vmInstance.getUuid(), _srcHostMock.getId(), _destHostMock.getId(), _volumeToPoolMock);
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
----------------------------------------------------------------------
diff --cc plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
index 072fd60,1af4239..87b3df3
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
@@@ -1216,25 -1261,24 +1262,24 @@@ public class VmwareResource implements
if (!result.first()) {
String msg = "SetNetworkACLAnswer on domain router " + routerIp + " failed. message: " + result.second();
s_logger.error(msg);
- }
-
- return new SetNetworkACLAnswer(cmd, false, results);
+ return new SetNetworkACLAnswer(cmd, false, results);
+ }
} else {
args="";
- args += " -d " + "eth" + ethDeviceNum;
- args += " -i " + nic.getIp();
- args += " -m " + Long.toString(NetUtils.getCidrSize(nic.getNetmask()));
- args += " -a " + sb.toString();
+ args += " -d " + "eth" + ethDeviceNum;
+ args += " -i " + nic.getIp();
+ args += " -m " + Long.toString(NetUtils.getCidrSize(nic.getNetmask()));
+ args += " -a " + sb.toString();
result = SshHelper.sshExecute(routerIp, DEFAULT_DOMR_SSHPORT, "root", mgr.getSystemVMKeyFile(), null,
- "/opt/cloud/bin/vpc_acl.sh " + args);
+ "/opt/cloud/bin/vpc_acl.sh " + args);
- if (!result.first()) {
- String msg = "SetNetworkACLAnswer on domain router " + routerIp + " failed. message: " + result.second();
- s_logger.error(msg);
+ if (!result.first()) {
+ String msg = "SetNetworkACLAnswer on domain router " + routerIp + " failed. message: " + result.second();
+ s_logger.error(msg);
- return new SetNetworkACLAnswer(cmd, false, results);
- }
+ return new SetNetworkACLAnswer(cmd, false, results);
+ }
}
return new SetNetworkACLAnswer(cmd, true, results);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/plugins/network-elements/bigswitch-vns/src/com/cloud/network/guru/BigSwitchVnsGuestNetworkGuru.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/plugins/network-elements/ovs/src/com/cloud/network/guru/OvsGuestNetworkGuru.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/server/src/com/cloud/api/ApiResponseHelper.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/server/src/com/cloud/api/query/QueryManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/api/query/QueryManagerImpl.java
index 6280cbf,f70f5ae..de39793
--- a/server/src/com/cloud/api/query/QueryManagerImpl.java
+++ b/server/src/com/cloud/api/query/QueryManagerImpl.java
@@@ -16,23 -16,23 +16,23 @@@
// under the License.
package com.cloud.api.query;
--import java.util.*;
++import java.util.ArrayList;
++import java.util.Date;
++import java.util.HashSet;
++import java.util.LinkedList;
++import java.util.List;
++import java.util.Map;
++import java.util.Set;
import javax.ejb.Local;
import javax.inject.Inject;
--import com.cloud.api.ApiDBUtils;
--import com.cloud.server.ResourceMetaDataService;
--import com.cloud.server.ResourceTag;
--import com.cloud.server.TaggedResourceService;
--import com.cloud.vm.NicDetailVO;
--import com.cloud.vm.dao.NicDetailDao;
++import org.apache.log4j.Logger;
++import org.springframework.stereotype.Component;
++
import org.apache.cloudstack.affinity.AffinityGroupResponse;
import org.apache.cloudstack.affinity.AffinityGroupVMMapVO;
import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
--import com.cloud.storage.VolumeDetailVO;
--import com.cloud.storage.dao.VolumeDetailsDao;
--
import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd;
import org.apache.cloudstack.api.command.admin.host.ListHostsCmd;
import org.apache.cloudstack.api.command.admin.internallb.ListInternalLBVMsCmd;
@@@ -54,11 -54,10 +54,28 @@@ import org.apache.cloudstack.api.comman
import org.apache.cloudstack.api.command.user.volume.ListResourceDetailsCmd;
import org.apache.cloudstack.api.command.user.volume.ListVolumesCmd;
import org.apache.cloudstack.api.command.user.zone.ListZonesByCmd;
--import org.apache.cloudstack.api.response.*;
++import org.apache.cloudstack.api.response.AccountResponse;
++import org.apache.cloudstack.api.response.AsyncJobResponse;
++import org.apache.cloudstack.api.response.DiskOfferingResponse;
++import org.apache.cloudstack.api.response.DomainRouterResponse;
++import org.apache.cloudstack.api.response.EventResponse;
++import org.apache.cloudstack.api.response.HostResponse;
++import org.apache.cloudstack.api.response.InstanceGroupResponse;
++import org.apache.cloudstack.api.response.ListResponse;
++import org.apache.cloudstack.api.response.ProjectAccountResponse;
++import org.apache.cloudstack.api.response.ProjectInvitationResponse;
++import org.apache.cloudstack.api.response.ProjectResponse;
++import org.apache.cloudstack.api.response.ResourceDetailResponse;
++import org.apache.cloudstack.api.response.ResourceTagResponse;
++import org.apache.cloudstack.api.response.SecurityGroupResponse;
++import org.apache.cloudstack.api.response.ServiceOfferingResponse;
++import org.apache.cloudstack.api.response.StoragePoolResponse;
++import org.apache.cloudstack.api.response.UserResponse;
++import org.apache.cloudstack.api.response.UserVmResponse;
++import org.apache.cloudstack.api.response.VolumeResponse;
++import org.apache.cloudstack.api.response.ZoneResponse;
+import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.query.QueryService;
--import org.apache.log4j.Logger;
--import org.springframework.stereotype.Component;
import com.cloud.api.query.dao.AccountJoinDao;
import com.cloud.api.query.dao.AffinityGroupJoinDao;
@@@ -119,9 -118,9 +136,14 @@@ import com.cloud.projects.ProjectManage
import com.cloud.projects.dao.ProjectAccountDao;
import com.cloud.projects.dao.ProjectDao;
import com.cloud.server.Criteria;
++import com.cloud.server.ResourceMetaDataService;
++import com.cloud.server.ResourceTag;
++import com.cloud.server.TaggedResourceService;
import com.cloud.service.ServiceOfferingVO;
import com.cloud.service.dao.ServiceOfferingDao;
import com.cloud.storage.Volume;
++import com.cloud.storage.VolumeDetailVO;
++import com.cloud.storage.dao.VolumeDetailsDao;
import com.cloud.user.Account;
import com.cloud.user.AccountManager;
import com.cloud.user.AccountVO;
@@@ -136,9 -136,9 +158,11 @@@ import com.cloud.utils.db.SearchCriteri
import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.vm.DomainRouterVO;
++import com.cloud.vm.NicDetailVO;
import com.cloud.vm.UserVmVO;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.dao.DomainRouterDao;
++import com.cloud.vm.dao.NicDetailDao;
import com.cloud.vm.dao.UserVmDao;
@Component
@@@ -636,8 -636,7 +660,7 @@@ public class QueryManagerImpl extends M
c.addCriteria(Criteria.ID, cmd.getId());
c.addCriteria(Criteria.NAME, cmd.getInstanceName());
c.addCriteria(Criteria.STATE, cmd.getState());
- c.addCriteria(Criteria.DATACENTERID, cmd.getZoneId());
+ c.addCriteria(Criteria.DATACENTERID, cmd.getZoneId());
- c.addCriteria(Criteria.DATACENTERTYPE, cmd.getZoneType());
c.addCriteria(Criteria.GROUPID, cmd.getGroupId());
c.addCriteria(Criteria.FOR_VIRTUAL_NETWORK, cmd.getForVirtualNetwork());
c.addCriteria(Criteria.NETWORKID, cmd.getNetworkId());
@@@ -686,8 -685,7 +709,7 @@@
Object name = c.getCriteria(Criteria.NAME);
Object state = c.getCriteria(Criteria.STATE);
Object notState = c.getCriteria(Criteria.NOTSTATE);
- Object zoneId = c.getCriteria(Criteria.DATACENTERID);
+ Object zoneId = c.getCriteria(Criteria.DATACENTERID);
- Object zoneType = c.getCriteria(Criteria.DATACENTERTYPE);
Object pod = c.getCriteria(Criteria.PODID);
Object hostId = c.getCriteria(Criteria.HOSTID);
Object hostName = c.getCriteria(Criteria.HOSTNAME);
@@@ -709,8 -707,7 +731,7 @@@
sb.and("stateEQ", sb.entity().getState(), SearchCriteria.Op.EQ);
sb.and("stateNEQ", sb.entity().getState(), SearchCriteria.Op.NEQ);
sb.and("stateNIN", sb.entity().getState(), SearchCriteria.Op.NIN);
- sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ);
+ sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ);
- sb.and("dataCenterType", sb.entity().getDataCenterType(), SearchCriteria.Op.EQ);
sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ);
sb.and("hypervisorType", sb.entity().getHypervisorType(), SearchCriteria.Op.EQ);
sb.and("hostIdEQ", sb.entity().getHostId(), SearchCriteria.Op.EQ);
@@@ -824,11 -821,7 +845,7 @@@
sc.setParameters("stateNEQ", "Destroyed");
}
}
-
+
- if (zoneType != null) {
- sc.setParameters("dataCenterType", zoneType);
- }
-
if (pod != null) {
sc.setParameters("podId", pod);
@@@ -1422,8 -1415,7 +1439,7 @@@
public Pair<List<HostJoinVO>, Integer> searchForServersInternal(ListHostsCmd cmd) {
- Long zoneId = _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), cmd.getZoneId());
+ Long zoneId = _accountMgr.checkAccessAndSpecifyAuthority(CallContext.current().getCallingAccount(), cmd.getZoneId());
- String zoneType = cmd.getZoneType();
Object name = cmd.getHostName();
Object type = cmd.getType();
Object state = cmd.getState();
@@@ -1444,8 -1436,7 +1460,7 @@@
sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE);
sb.and("type", sb.entity().getType(), SearchCriteria.Op.LIKE);
sb.and("status", sb.entity().getStatus(), SearchCriteria.Op.EQ);
- sb.and("dataCenterId", sb.entity().getZoneId(), SearchCriteria.Op.EQ);
+ sb.and("dataCenterId", sb.entity().getZoneId(), SearchCriteria.Op.EQ);
- sb.and("dataCenterType", sb.entity().getZoneType(), SearchCriteria.Op.EQ);
sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ);
sb.and("clusterId", sb.entity().getClusterId(), SearchCriteria.Op.EQ);
sb.and("resourceState", sb.entity().getResourceState(), SearchCriteria.Op.EQ);
@@@ -1489,10 -1480,7 +1504,7 @@@
}
if (zoneId != null) {
sc.setParameters("dataCenterId", zoneId);
- }
+ }
- if (zoneType != null) {
- sc.setParameters("dataCenterType", zoneType);
- }
if (pod != null) {
sc.setParameters("podId", pod);
}
@@@ -1549,8 -1537,7 +1561,7 @@@
String type = cmd.getType();
Map<String, String> tags = cmd.getTags();
- Long zoneId = cmd.getZoneId();
+ Long zoneId = cmd.getZoneId();
- String zoneType = cmd.getZoneType();
Long podId = null;
if (_accountMgr.isAdmin(caller.getType())) {
podId = cmd.getPodId();
@@@ -1577,8 -1564,7 +1588,7 @@@
sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
sb.and("volumeType", sb.entity().getVolumeType(), SearchCriteria.Op.LIKE);
sb.and("instanceId", sb.entity().getVmId(), SearchCriteria.Op.EQ);
- sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ);
+ sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ);
- sb.and("dataCenterType", sb.entity().getDataCenterType(), SearchCriteria.Op.EQ);
sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ);
// Only return volumes that are not destroyed
sb.and("state", sb.entity().getState(), SearchCriteria.Op.NEQ);
@@@ -1637,10 -1623,7 +1647,7 @@@
}
if (zoneId != null) {
sc.setParameters("dataCenterId", zoneId);
- }
+ }
- if (zoneType != null) {
- sc.setParameters("dataCenterType", zoneType);
- }
if (podId != null) {
sc.setParameters("podId", podId);
}
@@@ -1886,8 -1869,7 +1893,7 @@@
private Pair<List<StoragePoolJoinVO>, Integer> searchForStoragePoolsInternal(ListStoragePoolsCmd cmd) {
- Long zoneId = _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), cmd.getZoneId());
+ Long zoneId = _accountMgr.checkAccessAndSpecifyAuthority(CallContext.current().getCallingAccount(), cmd.getZoneId());
- String zoneType = cmd.getZoneType();
Object id = cmd.getId();
Object name = cmd.getStoragePoolName();
Object path = cmd.getPath();
@@@ -1906,8 -1888,7 +1912,7 @@@
sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE);
sb.and("path", sb.entity().getPath(), SearchCriteria.Op.EQ);
- sb.and("dataCenterId", sb.entity().getZoneId(), SearchCriteria.Op.EQ);
+ sb.and("dataCenterId", sb.entity().getZoneId(), SearchCriteria.Op.EQ);
- sb.and("dataCenterType", sb.entity().getZoneType(), SearchCriteria.Op.EQ);
sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ);
sb.and("clusterId", sb.entity().getClusterId(), SearchCriteria.Op.EQ);
sb.and("hostAddress", sb.entity().getHostAddress(), SearchCriteria.Op.EQ);
@@@ -1937,10 -1918,7 +1942,7 @@@
}
if (zoneId != null) {
sc.setParameters("dataCenterId", zoneId);
- }
+ }
- if (zoneType != null) {
- sc.setParameters("dataCenterType", zoneType);
- }
if (pod != null) {
sc.setParameters("podId", pod);
}
@@@ -2500,6 -2478,6 +2502,7 @@@
}
++ @Override
public List<ResourceDetailResponse> listResource(ListResourceDetailsCmd cmd){
String key = cmd.getKey();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/server/src/com/cloud/configuration/Config.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/configuration/ConfigurationManagerImpl.java
index c7947c3,6dac26c..ac80383
--- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
@@@ -195,8 -188,10 +194,9 @@@ import com.cloud.user.AccountManager
import com.cloud.user.AccountVO;
import com.cloud.user.ResourceLimitService;
import com.cloud.user.User;
-import com.cloud.user.UserContext;
import com.cloud.user.dao.AccountDao;
import com.cloud.utils.NumbersUtil;
+ import com.cloud.utils.Pair;
import com.cloud.utils.StringUtils;
import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.crypt.DBEncryptionUtil;
@@@ -2537,13 -2527,19 +2537,19 @@@ public class ConfigurationManagerImpl e
}
Transaction txn = Transaction.currentTxn();
txn.start();
-
+ if (sameSubnet == null || sameSubnet.first() == false) {
+ s_logger.info("adding a new subnet to the network "+network.getId());
+ }
+ else {
+ // if it is same subnet the user might not send the vlan and the netmask details. so we are
+ //figuring out while validation and setting them here.
+ newVlanGateway = sameSubnet.second().first();
+ newVlanNetmask = sameSubnet.second().second();
+ }
- Vlan vlan = createVlanAndPublicIpRange(zoneId, networkId, physicalNetworkId, forVirtualNetwork, podId, startIP,
+ Vlan vlan = createVlanAndPublicIpRange(zoneId, networkId, physicalNetworkId, forVirtualNetwork, podId, startIP,
endIP, newVlanGateway, newVlanNetmask, vlanId, vlanOwner, startIPv6, endIPv6, ip6Gateway, ip6Cidr);
//create an entry in the nic_secondary table. This will be the new gateway that will be configured on the corresponding routervm.
- if (sameSubnet == false) {
- s_logger.info("adding a new subnet to the network "+network.getId());
- }
+
txn.commit();
@@@ -2560,31 -2584,23 +2594,23 @@@
if (ipv4) {
vlanGateway = vlan.getVlanGateway();
vlanNetmask = vlan.getVlanNetmask();
- // Check if ip addresses are in network range
- if (!NetUtils.sameSubnet(startIP, vlanGateway, vlanNetmask)) {
- if (!NetUtils.sameSubnet(endIP, vlanGateway, vlanNetmask)) {
- // check if the the new subnet is not a superset of the existing subnets.
- if (NetUtils.isNetworkAWithinNetworkB(NetUtils.getCidrFromGatewayAndNetmask(vlanGateway,vlanNetmask), NetUtils.ipAndNetMaskToCidr(startIP, newVlanNetmask))){
- throw new InvalidParameterValueException ("The new subnet is a superset of the existing subnet");
- }
- // check if the new subnet is not a subset of the existing subnet.
- if (NetUtils.isNetworkAWithinNetworkB(NetUtils.ipAndNetMaskToCidr(startIP, newVlanNetmask), NetUtils.getCidrFromGatewayAndNetmask(vlanGateway,vlanNetmask))){
- throw new InvalidParameterValueException("The new subnet is a subset of the existing subnet");
- }
- }
- } else if (NetUtils.sameSubnet(endIP, vlanGateway, vlanNetmask)){
- // trying to add to the same subnet.
- sameSubnet = true;
- if (newVlanGateway == null) {
- newVlanGateway = vlanGateway;
- }
- if (!newVlanGateway.equals(vlanGateway)){
- throw new InvalidParameterValueException("The gateway of the ip range is not same as the gateway of the subnet.");
+ //check if subset or super set or neither.
+ int val = checkIfSubsetOrSuperset(newVlanGateway, newVlanNetmask, vlan, startIP, endIP);
+ if (val == 1) {
+ // this means that new cidr is a superset of the existing subnet.
+ throw new InvalidParameterValueException("The subnet you are trying to add is a superset of the existing subnet having gateway"+vlan.getVlanGateway()+" and netmask "+vlan.getVlanNetmask());
+ }
+ else if (val == 0) {
+ //this implies the user is trying to add a new subnet which is not a superset or subset of this subnet.
+ //checking with the other subnets.
+ continue;
- }
+ }
- break;
+ else if (val == 2) {
+ //this means he is trying to add to the same subnet.
+ throw new InvalidParameterValueException("The subnet you are trying to add is a subset of the existing subnet having gateway"+vlan.getVlanGateway()+" and netmask "+vlan.getVlanNetmask());
}
- else {
- throw new InvalidParameterValueException("Start ip and End ip is not in vlan range!");
+ else if (val == 3) {
+ sameSubnet =true;
}
}
if (ipv6) {
@@@ -2599,13 -2615,25 +2625,25 @@@
_networkModel.checkIp6Parameters(startIPv6, endIPv6, ip6Gateway, ip6Cidr);
}
}
- if (sameSubnet == false) {
- if (newVlanGateway ==null) {
- throw new MissingParameterValueException("The gateway for the new subnet is not specified.");
- }
+ }
+ if (newVlanGateway==null && newVlanNetmask ==null && sameSubnet == false) {
+ throw new InvalidParameterValueException("The ip range dose not belong to any of the existing subnets, Provide the netmask and gateway if you want to add new subnet");
+ }
+ Pair<String,String> vlanDetails=null;
+
+ if (sameSubnet){
+ vlanDetails = new Pair<String, String>(vlanGateway, vlanNetmask);
+ }
+ else {
+ vlanDetails = new Pair<String, String>(newVlanGateway, newVlanNetmask);
- }
+ }
+ //check if the gatewayip is the part of the ip range being added.
+ if (NetUtils.ipRangesOverlap(startIP, endIP, vlanDetails.first(), vlanDetails.first())) {
+ throw new InvalidParameterValueException("The gateway ip should not be the part of the ip range being added.");
}
- return sameSubnet;
+
+ Pair<Boolean,Pair<String,String>> result = new Pair<Boolean,Pair<String,String>>(sameSubnet, vlanDetails);
+ return result;
}
@Override
@@@ -3951,7 -4005,12 +3986,12 @@@
}
}
}
-
+
+ if (serviceProviderMap != null && serviceProviderMap.containsKey(Service.Lb) && !internalLb && !publicLb) {
+ //if not specified, default public lb to true
+ publicLb = true;
+ }
+
NetworkOfferingVO offering = new NetworkOfferingVO(name, displayText, trafficType, systemOnly, specifyVlan,
networkRate, multicastRate, isDefault, availability, tags, type, conserveMode, dedicatedLb,
sharedSourceNat, redundantRouter, elasticIp, elasticLb, specifyIpRanges, inline, isPersistent, associatePublicIp, publicLb, internalLb);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
index 59e3901,7362cf1..07c3952
--- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
+++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
@@@ -939,9 -943,16 +939,16 @@@ public class ConsoleProxyManagerImpl ex
ZoneHostInfo zoneHostInfo = zoneHostInfoMap.get(dataCenterId);
if (zoneHostInfo != null && isZoneHostReady(zoneHostInfo)) {
VMTemplateVO template = _templateDao.findSystemVMTemplate(dataCenterId);
- HostVO secondaryStorageHost = this.templateMgr.getSecondaryStorageHost(dataCenterId);
+ HostVO secondaryStorageHost = templateMgr.getSecondaryStorageHost(dataCenterId);
boolean templateReady = false;
-
+
+ if (secondaryStorageHost == null) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("No secondary storage available in zone " + dataCenterId + ", wait until it is ready to launch secondary storage vm");
+ }
+ return false;
+ }
+
if (template != null && secondaryStorageHost != null) {
VMTemplateHostVO templateHostRef = _vmTemplateHostDao.findByHostTemplate(secondaryStorageHost.getId(), template.getId());
templateReady = (templateHostRef != null) && (templateHostRef.getDownloadState() == Status.DOWNLOADED);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/server/src/com/cloud/network/NetworkManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/NetworkManagerImpl.java
index d197eba,274e794..dc26380
--- a/server/src/com/cloud/network/NetworkManagerImpl.java
+++ b/server/src/com/cloud/network/NetworkManagerImpl.java
@@@ -1320,21 -1331,9 +1332,9 @@@ public class NetworkManagerImpl extend
offering.setState(NetworkOffering.State.Enabled);
_networkOfferingDao.update(offering.getId(), offering);
}
-
+
- Map<Network.Service, Set<Network.Provider>> defaultINetworkOfferingProvidersForVpcNetwork = new HashMap<Network.Service, Set<Network.Provider>>();
- defaultProviders.clear();
- defaultProviders.add(Network.Provider.VPCVirtualRouter);
- defaultINetworkOfferingProvidersForVpcNetwork.put(Service.Dhcp, defaultProviders);
- defaultINetworkOfferingProvidersForVpcNetwork.put(Service.Dns, defaultProviders);
- defaultINetworkOfferingProvidersForVpcNetwork.put(Service.UserData, defaultProviders);
- defaultINetworkOfferingProvidersForVpcNetwork.put(Service.Firewall, defaultProviders);
- defaultINetworkOfferingProvidersForVpcNetwork.put(Service.Gateway, defaultProviders);
- defaultINetworkOfferingProvidersForVpcNetwork.put(Service.Lb, defaultProviders);
- defaultINetworkOfferingProvidersForVpcNetwork.put(Service.SourceNat, defaultProviders);
- defaultINetworkOfferingProvidersForVpcNetwork.put(Service.StaticNat, defaultProviders);
- defaultINetworkOfferingProvidersForVpcNetwork.put(Service.PortForwarding, defaultProviders);
- defaultINetworkOfferingProvidersForVpcNetwork.put(Service.Vpn, defaultProviders);
+ //#4 - default isolated offering with Source nat service
if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingWithSourceNatService) == null) {
offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingWithSourceNatService,
"Offering for Isolated networks with Source Nat service enabled", TrafficType.Guest,
@@@ -1372,7 -1374,34 +1375,34 @@@
offering.setState(NetworkOffering.State.Enabled);
_networkOfferingDao.update(offering.getId(), offering);
}
-
+
+ //#8 - network offering with internal lb service
+ Map<Network.Service, Set<Network.Provider>> internalLbOffProviders =
+ new HashMap<Network.Service, Set<Network.Provider>>();
+ Set<Network.Provider> defaultVpcProvider = new HashSet<Network.Provider>();
+ defaultVpcProvider.add(Network.Provider.VPCVirtualRouter);
+
+ Set<Network.Provider> defaultInternalLbProvider = new HashSet<Network.Provider>();
+ defaultInternalLbProvider.add(Network.Provider.InternalLbVm);
+
+ internalLbOffProviders.put(Service.Dhcp, defaultVpcProvider);
+ internalLbOffProviders.put(Service.Dns, defaultVpcProvider);
+ internalLbOffProviders.put(Service.UserData, defaultVpcProvider);
+ internalLbOffProviders.put(Service.NetworkACL, defaultVpcProvider);
+ internalLbOffProviders.put(Service.Gateway, defaultVpcProvider);
+ internalLbOffProviders.put(Service.Lb, defaultInternalLbProvider);
+ internalLbOffProviders.put(Service.SourceNat, defaultVpcProvider);
+
+ if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB) == null) {
+ offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB,
+ "Offering for Isolated VPC networks with Internal Lb support", TrafficType.Guest,
+ null, false, Availability.Optional, null, internalLbOffProviders,
+ true, Network.GuestType.Isolated, false, null, false, null, false, false, null);
+ offering.setState(NetworkOffering.State.Enabled);
+ offering.setInternalLb(true);
+ _networkOfferingDao.update(offering.getId(), offering);
+ }
+
Map<Network.Service, Set<Network.Provider>> netscalerServiceProviders = new HashMap<Network.Service, Set<Network.Provider>>();
Set<Network.Provider> vrProvider = new HashSet<Network.Provider>();
vrProvider.add(Provider.VirtualRouter);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/server/src/com/cloud/network/NetworkServiceImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/NetworkServiceImpl.java
index 44c2873,aace68d..1897ef6
--- a/server/src/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/com/cloud/network/NetworkServiceImpl.java
@@@ -118,10 -131,9 +118,9 @@@ import com.cloud.network.element.VpcVir
import com.cloud.network.guru.NetworkGuru;
import com.cloud.network.rules.FirewallRule.Purpose;
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.vpc.NetworkACL;
import com.cloud.network.vpc.PrivateIpVO;
import com.cloud.network.vpc.Vpc;
import com.cloud.network.vpc.VpcManager;
@@@ -777,11 -789,16 +776,16 @@@ public class NetworkServiceImpl extend
if (dc.getNetworkType() == NetworkType.Advanced && network.getGuestType() == Network.GuestType.Isolated) {
//check PF or static NAT is configured on this ip address
String secondaryIp = secIpVO.getIp4Address();
- List<PortForwardingRuleVO> pfRuleList = _portForwardingDao.listByDestIpAddr(secondaryIp);
- if (pfRuleList.size() != 0) {
+ List<FirewallRuleVO> fwRulesList = _firewallDao.listByNetworkAndPurpose(network.getId(), Purpose.PortForwarding);
+
+ if (fwRulesList.size() != 0) {
+ for (FirewallRuleVO rule: fwRulesList) {
+ if (_portForwardingDao.findByIdAndIp(rule.getId(), secondaryIp) != null) {
- s_logger.debug("VM nic IP " + secondaryIp + " is associated with the port forwarding rule");
- throw new InvalidParameterValueException("Can't remove the secondary ip " + secondaryIp + " is associate with the port forwarding rule");
- }
+ s_logger.debug("VM nic IP " + secondaryIp + " is associated with the port forwarding rule");
+ throw new InvalidParameterValueException("Can't remove the secondary ip " + secondaryIp + " is associate with the port forwarding rule");
+ }
+ }
+ }
//check if the secondary ip associated with any static nat rule
IPAddressVO publicIpVO = _ipAddressDao.findByVmIp(secondaryIp);
if (publicIpVO != null) {
@@@ -1336,8 -1355,7 +1340,7 @@@
Long id = cmd.getId();
String keyword = cmd.getKeyword();
Long zoneId = cmd.getZoneId();
- String zoneType = cmd.getZoneType();
- Account caller = UserContext.current().getCaller();
+ Account caller = CallContext.current().getCallingAccount();
Long domainId = cmd.getDomainId();
String accountName = cmd.getAccountName();
String guestIpType = cmd.getGuestIpType();
@@@ -1484,8 -1502,8 +1487,8 @@@
if (!permittedAccounts.isEmpty()) {
//get account level networks
networksToReturn.addAll(listAccountSpecificNetworks(
- buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType,
+ buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType,
- physicalNetworkId, aclType, skipProjectNetworks, restartRequired, specifyIpRanges, vpcId, tags, zoneType), searchFilter,
+ physicalNetworkId, aclType, skipProjectNetworks, restartRequired, specifyIpRanges, vpcId, tags), searchFilter,
permittedAccounts));
//get domain level networks
if (domainId != null) {
@@@ -1498,13 -1516,13 +1501,13 @@@
} else {
//add account specific networks
networksToReturn.addAll(listAccountSpecificNetworksByDomainPath(
- buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType,
+ buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType,
- physicalNetworkId, aclType, skipProjectNetworks, restartRequired, specifyIpRanges, vpcId, tags, zoneType), searchFilter, path,
+ physicalNetworkId, aclType, skipProjectNetworks, restartRequired, specifyIpRanges, vpcId, tags), searchFilter, path,
isRecursive));
//add domain specific networks of domain + parent domains
networksToReturn.addAll(listDomainSpecificNetworksByDomainPath(
- buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType,
+ buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType,
- physicalNetworkId, aclType, skipProjectNetworks, restartRequired, specifyIpRanges, vpcId, tags, zoneType), searchFilter, path,
+ physicalNetworkId, aclType, skipProjectNetworks, restartRequired, specifyIpRanges, vpcId, tags), searchFilter, path,
isRecursive));
//add networks of subdomains
if (domainId == null) {
@@@ -2666,9 -2680,10 +2665,10 @@@
vnetString = vnetString+vnetRange.first().toString()+"-"+value.toString()+";";
}
}
- vnetString = vnetString+"*";
- vnetString = vnetString.replace(";*","");
+ if (vnetString.length() > 0 && vnetString.charAt(vnetString.length()-1)==';') {
+ vnetString = vnetString.substring(0, vnetString.length()-1);
+ }
- network.setVnet(vnetString);
+ network.setVnet(vnetString);
}
for (Pair<Integer, Integer> vnetToAdd : vnetsToAdd) {
@@@ -2774,12 -2789,15 +2774,15 @@@
_datacneter_vnet.deleteRange(txn, network.getDataCenterId(), network.getId(), start, end);
String vnetString="";
- for (Pair<Integer,Integer> vnetRange : existingRanges ){
+ if (existingRanges.isEmpty()) {
+ network.setVnet(null);
+ } else {
+ for (Pair<Integer,Integer> vnetRange : existingRanges ) {
- vnetString=vnetString+vnetRange.first().toString()+"-"+vnetRange.second().toString()+";";
- }
+ vnetString=vnetString+vnetRange.first().toString()+"-"+vnetRange.second().toString()+";";
+ }
- vnetString = vnetString+"*";
- vnetString = vnetString.replace(";*","");
+ vnetString = vnetString.substring(0, vnetString.length()-1);
- network.setVnet(vnetString);
+ network.setVnet(vnetString);
+ }
_physicalNetworkDao.update(network.getId(), network);
txn.commit();
_physicalNetworkDao.releaseFromLockTable(network.getId());
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e2edae17/server/src/com/cloud/network/guru/GuestNetworkGuru.java
----------------------------------------------------------------------