From 870d21c436f8ca34f3d865409444e2f4c84a4319 Mon Sep 17 00:00:00 2001 From: Marcus Sorensen Date: Fri, 3 May 2013 14:09:52 -0600 Subject: [PATCH 01/66] Summary: Release old DHCP entries Detail: Refresh dnsmasq with updated entries live, no outage BUG-ID: CLOUDSTACK-2299 Submitted-by: Dennis Lawler Signed-off-by: Marcus Sorensen 1367611792 -0600 --- .../systemvm/debian/config/root/edithosts.sh | 28 +++++++++++++------ scripts/network/exdhcp/dnsmasq_edithosts.sh | 19 +++++++++++-- .../systemvmtemplate/postinstall.sh | 2 +- .../systemvmtemplate64/postinstall.sh | 2 +- 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/patches/systemvm/debian/config/root/edithosts.sh b/patches/systemvm/debian/config/root/edithosts.sh index 8609da79efd..fb0c34fbd42 100755 --- a/patches/systemvm/debian/config/root/edithosts.sh +++ b/patches/systemvm/debian/config/root/edithosts.sh @@ -19,12 +19,6 @@ # edithosts.sh -- edit the dhcphosts file on the routing domain -# $mac : the mac address -# $ip : the associated ip address -# $host : the hostname -# $4 : default router -# $5 : nameserver on default nic -# $6 : comma separated static routes usage() { printf "Usage: %s: -m -4 -6 -h -d -n -s -u [-N]\n" $(basename $0) >&2 @@ -84,6 +78,9 @@ fi grep "redundant_router=1" /var/cache/cloud/cmdline > /dev/null no_redundant=$? +command -v dhcp_release > /dev/null 2>&1 +no_dhcp_release=$? + wait_for_dnsmasq () { local _pid=$(pidof dnsmasq) for i in 0 1 2 3 4 5 6 7 8 9 10 @@ -97,7 +94,15 @@ wait_for_dnsmasq () { return 1 } -logger -t cloud "edithosts: update $1 $2 $3 to hosts" +if [ $no_dhcp_release -eq 0 ] +then + #release previous dhcp lease if present + logger -t cloud "edithosts: releasing $ipv4" + dhcp_release lo $ipv4 $(grep $ipv4 $DHCP_LEASES | awk '{print $2}') > /dev/null 2>&1 + logger -t cloud "edithosts: released $ipv4" +fi + +logger -t cloud "edithosts: update $mac $ipv4 $ipv6 $host to hosts" [ ! -f $DHCP_HOSTS ] && touch $DHCP_HOSTS [ ! -f $DHCP_OPTS ] && touch $DHCP_OPTS @@ -201,8 +206,13 @@ fi pid=$(pidof dnsmasq) if [ "$pid" != "" ] then - #service dnsmasq restart - kill -HUP $pid + # use SIGHUP to avoid service outage if dhcp_release is available. + if [ $no_dhcp_release -eq 0 ] + then + kill -HUP $pid + else + service dnsmasq restart + fi else if [ $no_redundant -eq 1 ] then diff --git a/scripts/network/exdhcp/dnsmasq_edithosts.sh b/scripts/network/exdhcp/dnsmasq_edithosts.sh index 05285d9accf..7990356edc4 100755 --- a/scripts/network/exdhcp/dnsmasq_edithosts.sh +++ b/scripts/network/exdhcp/dnsmasq_edithosts.sh @@ -35,6 +35,9 @@ wait_for_dnsmasq () { return 1 } +command -v dhcp_release > /dev/null 2>&1 +no_dhcp_release=$? + [ ! -f /etc/dhcphosts.txt ] && touch /etc/dhcphosts.txt [ ! -f /var/lib/misc/dnsmasq.leases ] && touch /var/lib/misc/dnsmasq.leases @@ -44,6 +47,12 @@ sed -i /$3,/d /etc/dhcphosts.txt echo "$1,$2,$3,infinite" >>/etc/dhcphosts.txt +#release previous dhcp lease if present +if [ $no_dhcp_release -eq 0 ] +then + dhcp_release lo $2 $(grep $2 $DHCP_LEASES | awk '{print $2}') > /dev/null 2>&1 +fi + #delete leases to supplied mac and ip addresses sed -i /$1/d /var/lib/misc/dnsmasq.leases sed -i /"$2 "/d /var/lib/misc/dnsmasq.leases @@ -61,9 +70,13 @@ echo "$2 $3" >> /etc/hosts pid=$(pidof dnsmasq) if [ "$pid" != "" ] then - # send SIGHUP to dnsmasq to reload /etc/hosts /etc/dhcphosts.txt - # this will not reload /etc/dnsmasq.conf - kill -s 1 $pid + # use SIGHUP to avoid service outage if dhcp_release is available. + if [ $no_dhcp_release -eq 0 ] + then + kill -HUP $pid + else + service dnsmasq restart + fi else service dnsmasq start wait_for_dnsmasq diff --git a/tools/appliance/definitions/systemvmtemplate/postinstall.sh b/tools/appliance/definitions/systemvmtemplate/postinstall.sh index ae8f1adfb9c..38363d91130 100644 --- a/tools/appliance/definitions/systemvmtemplate/postinstall.sh +++ b/tools/appliance/definitions/systemvmtemplate/postinstall.sh @@ -40,7 +40,7 @@ install_packages() { # haproxy apt-get --no-install-recommends -q -y --force-yes install haproxy # dnsmasq - apt-get --no-install-recommends -q -y --force-yes install dnsmasq + apt-get --no-install-recommends -q -y --force-yes install dnsmasq dnsmasq-utils # nfs client apt-get --no-install-recommends -q -y --force-yes install nfs-common diff --git a/tools/appliance/definitions/systemvmtemplate64/postinstall.sh b/tools/appliance/definitions/systemvmtemplate64/postinstall.sh index ae8f1adfb9c..38363d91130 100644 --- a/tools/appliance/definitions/systemvmtemplate64/postinstall.sh +++ b/tools/appliance/definitions/systemvmtemplate64/postinstall.sh @@ -40,7 +40,7 @@ install_packages() { # haproxy apt-get --no-install-recommends -q -y --force-yes install haproxy # dnsmasq - apt-get --no-install-recommends -q -y --force-yes install dnsmasq + apt-get --no-install-recommends -q -y --force-yes install dnsmasq dnsmasq-utils # nfs client apt-get --no-install-recommends -q -y --force-yes install nfs-common From 63f3ccd4dfc835581305bb57c0878861106dcfe6 Mon Sep 17 00:00:00 2001 From: Isaac Chiang Date: Sat, 4 May 2013 13:41:02 +0530 Subject: [PATCH 02/66] CLOUDSTACK-2160:Refresh button functionality for security groups and statistics tab --- ui/scripts/instances.js | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/ui/scripts/instances.js b/ui/scripts/instances.js index ab9d606b2b6..1b89d4f953b 100644 --- a/ui/scripts/instances.js +++ b/ui/scripts/instances.js @@ -1618,7 +1618,16 @@ } ], dataProvider: function(args) { - args.response.success({data: args.context.instances[0].securitygroup}); + // args.response.success({data: args.context.instances[0].securitygroup}); + $.ajax({ + url:createURL("listVirtualMachines&details=secgrp&id=" + args.context.instances[0].id), + dataType: "json", + async:true, + success:function(json) { + args.response.success({data: json.listvirtualmachinesresponse.virtualmachine[0].securitygroup}); + } + + }); } }, @@ -1634,15 +1643,22 @@ networkkbswrite: { label: 'label.network.write' } }, dataProvider: function(args) { - var jsonObj = args.context.instances[0]; - args.response.success({ + $.ajax({ + url:createURL("listVirtualMachines&details=stats&id=" + args.context.instances[0].id), + dataType: "json", + async:true, + success:function(json) { + var jsonObj = json.listvirtualmachinesresponse.virtualmachine[0]; + args.response.success({ data: { totalCPU: jsonObj.cpunumber + " x " + cloudStack.converters.convertHz(jsonObj.cpuspeed), cpuused: jsonObj.cpuused, networkkbsread: (jsonObj.networkkbsread == null)? "N/A": cloudStack.converters.convertBytes(jsonObj.networkkbsread * 1024), networkkbswrite: (jsonObj.networkkbswrite == null)? "N/A": cloudStack.converters.convertBytes(jsonObj.networkkbswrite * 1024) - } - }); + } + }); + } + }); } } } From 5811ae7e2571380ab2b2be4e64686ff3affb7364 Mon Sep 17 00:00:00 2001 From: Pranav Saxena Date: Sun, 5 May 2013 01:15:14 +0530 Subject: [PATCH 03/66] CLOUDSTACK-2274:Detail view loading problem when deleting a zone --- ui/scripts/system.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ui/scripts/system.js b/ui/scripts/system.js index 3c4051cc481..f2017cd948f 100644 --- a/ui/scripts/system.js +++ b/ui/scripts/system.js @@ -4928,8 +4928,11 @@ async: true, success: function(json) { args.response.success({data:{}}); - } - }); + }, + error:function(json){ + args.response.error(parseXMLHttpResponse(json)); + } + }); }, notification: { poll: function(args) { args.complete(); } From a9f0fb800929638718271be70a0bf9ecf49643f2 Mon Sep 17 00:00:00 2001 From: Isaac Chiang Date: Sun, 5 May 2013 01:57:35 +0530 Subject: [PATCH 04/66] CLOUDSTACK-2076:Listview widget infinte scrolling error --- ui/scripts/ui/widgets/listView.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ui/scripts/ui/widgets/listView.js b/ui/scripts/ui/widgets/listView.js index f368951f256..0d5ef6fc751 100644 --- a/ui/scripts/ui/widgets/listView.js +++ b/ui/scripts/ui/widgets/listView.js @@ -1687,6 +1687,9 @@ return false; }); + var tableHeight = $table.height(); + var endTable = false; + // Infinite scrolling event $listView.bind('scroll', function(event) { if (args.listView && args.listView.disableInfiniteScrolling) return false; @@ -1697,7 +1700,7 @@ var loadMoreData = $listView.scrollTop() >= ($table.height() - $listView.height()) - $listView.height() / 4; var context = $listView.data('view-args').context; - if (loadMoreData) { + if (loadMoreData && !endTable) { page = page + 1; var filterBy = { @@ -1725,6 +1728,7 @@ reorder: listViewData.reorder, detailView: listViewData.detailView }); + $table.height() == tableHeight ? endTable = true : tableHeight = $table.height(); } }, 500); From 38f7e271bcf27efea3b22f39e8109ac99f625897 Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Sun, 5 May 2013 09:58:04 +0530 Subject: [PATCH 05/66] appliance: Upgrade systemvm appliance from rc1 to Debian7 GA Signed-off-by: Rohit Yadav --- tools/appliance/definitions/systemvmtemplate/definition.rb | 6 +++--- .../appliance/definitions/systemvmtemplate64/definition.rb | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/appliance/definitions/systemvmtemplate/definition.rb b/tools/appliance/definitions/systemvmtemplate/definition.rb index 27336f17f8b..87dbfad09ad 100644 --- a/tools/appliance/definitions/systemvmtemplate/definition.rb +++ b/tools/appliance/definitions/systemvmtemplate/definition.rb @@ -3,9 +3,9 @@ Veewee::Definition.declare({ :memory_size=> '256', :disk_size => '2000', :disk_format => 'VDI', :hostiocache => 'off', :os_type_id => 'Debian', - :iso_file => "debian-wheezy-DI-rc1-i386-netinst.iso", - :iso_src => "http://cdimage.debian.org/cdimage/wheezy_di_rc1/i386/iso-cd/debian-wheezy-DI-rc1-i386-netinst.iso", - :iso_md5 => "db12ca9554bb8f121c98e268682a55d0", + :iso_file => "debian-7.0.0-i386-netinst.iso", + :iso_src => "http://cdimage.debian.org/debian-cd/7.0.0/i386/iso-cd/debian-7.0.0-i386-netinst.iso", + :iso_md5 => "a6b93666a5393334accb7ac4ee28d949", :iso_download_timeout => "1000", :boot_wait => "10", :boot_cmd_sequence => [ '', diff --git a/tools/appliance/definitions/systemvmtemplate64/definition.rb b/tools/appliance/definitions/systemvmtemplate64/definition.rb index 35ef878d35a..38828da70de 100644 --- a/tools/appliance/definitions/systemvmtemplate64/definition.rb +++ b/tools/appliance/definitions/systemvmtemplate64/definition.rb @@ -3,9 +3,9 @@ Veewee::Definition.declare({ :memory_size=> '256', :disk_size => '2000', :disk_format => 'VDI', :hostiocache => 'off', :os_type_id => 'Debian_64', - :iso_file => "debian-wheezy-DI-rc1-amd64-netinst.iso", - :iso_src => "http://cdimage.debian.org/cdimage/wheezy_di_rc1/amd64/iso-cd/debian-wheezy-DI-rc1-amd64-netinst.iso", - :iso_md5 => "412f77d4b98adf2a7d575745fd282d78", + :iso_file => "debian-7.0.0-amd64-netinst.iso", + :iso_src => "http://cdimage.debian.org/debian-cd/7.0.0/amd64/iso-cd/debian-7.0.0-amd64-netinst.iso", + :iso_md5 => "6a55096340b5b1b7d335d5b559e13ea0", :iso_download_timeout => "1000", :boot_wait => "10", :boot_cmd_sequence => [ '', From b33b316755497df637e7e528b6ec1690f5ca9f01 Mon Sep 17 00:00:00 2001 From: Pranav Saxena Date: Sun, 5 May 2013 12:02:32 +0530 Subject: [PATCH 06/66] scale up virtual machine response change in the backend --- ui/scripts/instances.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ui/scripts/instances.js b/ui/scripts/instances.js index 1b89d4f953b..27ad5990685 100644 --- a/ui/scripts/instances.js +++ b/ui/scripts/instances.js @@ -1248,8 +1248,8 @@ async: true, success: function(json) { var jid = json.scalevirtualmachineresponse.jobid; - args.response.success( - {_custom: + args.response.success(); + /* {_custom: {jobId: jid, getUpdatedItem: function(json) { return json.queryasyncjobresultresponse.jobresult.virtualmachine; @@ -1258,8 +1258,8 @@ return vmActionfilter; } } - } - ); + } */ + }, error:function(json){ args.response.error(parseXMLHttpResponse(json)); From c8d843241e144288300c1912a25b201e010bb7a0 Mon Sep 17 00:00:00 2001 From: Likitha Shetty Date: Wed, 1 May 2013 13:47:26 +0530 Subject: [PATCH 07/66] Dedicate guest vlan range to account --- api/src/com/cloud/async/AsyncJob.java | 3 +- api/src/com/cloud/event/EventTypes.java | 7 + api/src/com/cloud/network/GuestVlan.java | 31 ++ api/src/com/cloud/network/NetworkService.java | 9 + .../apache/cloudstack/api/ApiConstants.java | 2 + .../cloudstack/api/ResponseGenerator.java | 2 + .../network/DedicateGuestVlanRangeCmd.java | 108 +++++ .../ListDedicatedGuestVlanRangesCmd.java | 129 ++++++ .../ReleaseDedicatedGuestVlanRangeCmd.java | 94 +++++ .../api/response/GuestVlanRangeResponse.java | 94 +++++ client/tomcatconf/applicationContext.xml.in | 1 + server/src/com/cloud/api/ApiDBUtils.java | 14 + .../src/com/cloud/api/ApiResponseHelper.java | 21 + server/src/com/cloud/dc/DataCenterVnetVO.java | 11 + .../com/cloud/dc/dao/DataCenterDaoImpl.java | 17 +- .../com/cloud/dc/dao/DataCenterVnetDao.java | 7 +- .../cloud/dc/dao/DataCenterVnetDaoImpl.java | 92 ++++- .../com/cloud/network/NetworkManagerImpl.java | 35 +- .../com/cloud/network/NetworkServiceImpl.java | 272 +++++++++++++ .../network/dao/AccountGuestVlanMapDao.java | 34 ++ .../dao/AccountGuestVlanMapDaoImpl.java | 83 ++++ .../network/dao/AccountGuestVlanMapVO.java | 94 +++++ .../cloud/server/ManagementServerImpl.java | 3 + .../com/cloud/user/AccountManagerImpl.java | 15 + .../network/DedicateGuestVlanRangesTest.java | 378 ++++++++++++++++++ .../cloud/network/MockNetworkManagerImpl.java | 21 + .../com/cloud/vpc/MockNetworkManagerImpl.java | 18 + .../AffinityApiTestConfiguration.java | 3 +- .../ChildTestConfiguration.java | 4 +- setup/db/db/schema-410to420.sql | 17 + .../smoke/test_guest_vlan_range.py | 157 ++++++++ tools/marvin/marvin/integration/lib/base.py | 27 ++ 32 files changed, 1790 insertions(+), 13 deletions(-) create mode 100644 api/src/com/cloud/network/GuestVlan.java create mode 100644 api/src/org/apache/cloudstack/api/command/admin/network/DedicateGuestVlanRangeCmd.java create mode 100644 api/src/org/apache/cloudstack/api/command/admin/network/ListDedicatedGuestVlanRangesCmd.java create mode 100644 api/src/org/apache/cloudstack/api/command/admin/network/ReleaseDedicatedGuestVlanRangeCmd.java create mode 100644 api/src/org/apache/cloudstack/api/response/GuestVlanRangeResponse.java create mode 100644 server/src/com/cloud/network/dao/AccountGuestVlanMapDao.java create mode 100644 server/src/com/cloud/network/dao/AccountGuestVlanMapDaoImpl.java create mode 100644 server/src/com/cloud/network/dao/AccountGuestVlanMapVO.java create mode 100644 server/test/com/cloud/network/DedicateGuestVlanRangesTest.java create mode 100644 test/integration/smoke/test_guest_vlan_range.py diff --git a/api/src/com/cloud/async/AsyncJob.java b/api/src/com/cloud/async/AsyncJob.java index 866429b6547..d384a7ad920 100644 --- a/api/src/com/cloud/async/AsyncJob.java +++ b/api/src/com/cloud/async/AsyncJob.java @@ -50,7 +50,8 @@ public interface AsyncJob extends Identity, InternalIdentity { AutoScaleVmProfile, AutoScaleVmGroup, GlobalLoadBalancerRule, - AffinityGroup + AffinityGroup, + DedicatedGuestVlanRange } long getUserId(); diff --git a/api/src/com/cloud/event/EventTypes.java b/api/src/com/cloud/event/EventTypes.java index 0ee7f402fd7..26c40abb4fb 100755 --- a/api/src/com/cloud/event/EventTypes.java +++ b/api/src/com/cloud/event/EventTypes.java @@ -390,6 +390,10 @@ public class EventTypes { public static final String EVENT_AFFINITY_GROUP_REMOVE = "AG.REMOVE"; public static final String EVENT_VM_AFFINITY_GROUP_UPDATE = "VM.AG.UPDATE"; + // Dedicated guest vlan range + public static final String EVENT_GUEST_VLAN_RANGE_DEDICATE = "GUESTVLANRANGE.DEDICATE"; + public static final String EVENT_DEDICATED_GUEST_VLAN_RANGE_RELEASE = "GUESTVLANRANGE.RELEASE"; + static { // TODO: need a way to force author adding event types to declare the entity details as well, with out braking @@ -690,6 +694,9 @@ public class EventTypes { entityEventDetails.put(EVENT_AUTOSCALEVMGROUP_UPDATE, AutoScaleVmGroup.class.getName()); entityEventDetails.put(EVENT_AUTOSCALEVMGROUP_ENABLE, AutoScaleVmGroup.class.getName()); entityEventDetails.put(EVENT_AUTOSCALEVMGROUP_DISABLE, AutoScaleVmGroup.class.getName()); + + entityEventDetails.put(EVENT_GUEST_VLAN_RANGE_DEDICATE, GuestVlan.class.getName()); + entityEventDetails.put(EVENT_DEDICATED_GUEST_VLAN_RANGE_RELEASE, GuestVlan.class.getName()); } public static String getEntityForEvent (String eventName) { diff --git a/api/src/com/cloud/network/GuestVlan.java b/api/src/com/cloud/network/GuestVlan.java new file mode 100644 index 00000000000..a5173d87830 --- /dev/null +++ b/api/src/com/cloud/network/GuestVlan.java @@ -0,0 +1,31 @@ +// 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.network; + +import org.apache.cloudstack.api.Identity; +import org.apache.cloudstack.api.InternalIdentity; + +public interface GuestVlan extends InternalIdentity, Identity { + + public long getId(); + + public long getAccountId(); + + public String getGuestVlanRange(); + + public long getPhysicalNetworkId(); +} diff --git a/api/src/com/cloud/network/NetworkService.java b/api/src/com/cloud/network/NetworkService.java index bea92dc2481..5d4fd67d326 100755 --- a/api/src/com/cloud/network/NetworkService.java +++ b/api/src/com/cloud/network/NetworkService.java @@ -18,6 +18,8 @@ package com.cloud.network; import java.util.List; +import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd; +import org.apache.cloudstack.api.command.admin.network.ListDedicatedGuestVlanRangesCmd; import org.apache.cloudstack.api.command.admin.usage.ListTrafficTypeImplementorsCmd; import org.apache.cloudstack.api.command.user.network.RestartNetworkCmd; import org.apache.cloudstack.api.command.user.network.CreateNetworkCmd; @@ -29,6 +31,7 @@ import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.GuestVlan; import com.cloud.network.Network.Service; import com.cloud.network.Networks.TrafficType; import com.cloud.user.Account; @@ -114,6 +117,12 @@ public interface NetworkService { boolean deletePhysicalNetworkTrafficType(Long id); + GuestVlan dedicateGuestVlanRange(DedicateGuestVlanRangeCmd cmd); + + Pair, Integer> listDedicatedGuestVlanRanges(ListDedicatedGuestVlanRangesCmd cmd); + + boolean releaseDedicatedGuestVlanRange(Long dedicatedGuestVlanRangeId); + Pair, Integer> listTrafficTypes(Long physicalNetworkId); diff --git a/api/src/org/apache/cloudstack/api/ApiConstants.java b/api/src/org/apache/cloudstack/api/ApiConstants.java index 1165c7b34f6..d57fe058d93 100755 --- a/api/src/org/apache/cloudstack/api/ApiConstants.java +++ b/api/src/org/apache/cloudstack/api/ApiConstants.java @@ -85,6 +85,7 @@ public class ApiConstants { public static final String GSLB_SERVICE_TYPE = "gslbservicetype"; public static final String GSLB_STICKY_SESSION_METHOD = "gslbstickysessionmethodname"; public static final String GUEST_CIDR_ADDRESS = "guestcidraddress"; + public static final String GUEST_VLAN_RANGE = "guestvlanrange"; public static final String HA_ENABLE = "haenable"; public static final String HOST_ID = "hostid"; public static final String HOST_NAME = "hostname"; @@ -221,6 +222,7 @@ public class ApiConstants { public static final String VIRTUAL_MACHINE_ID = "virtualmachineid"; public static final String VIRTUAL_MACHINE_IDS = "virtualmachineids"; public static final String VLAN = "vlan"; + public static final String VLAN_RANGE = "vlanrange"; public static final String REMOVE_VLAN="removevlan"; public static final String VLAN_ID = "vlanid"; public static final String VM_AVAILABLE = "vmavailable"; diff --git a/api/src/org/apache/cloudstack/api/ResponseGenerator.java b/api/src/org/apache/cloudstack/api/ResponseGenerator.java index cbf8bb27b90..8466bd8729e 100644 --- a/api/src/org/apache/cloudstack/api/ResponseGenerator.java +++ b/api/src/org/apache/cloudstack/api/ResponseGenerator.java @@ -198,6 +198,8 @@ public interface ResponseGenerator { IPAddressResponse createIPAddressResponse(IpAddress ipAddress); + GuestVlanRangeResponse createDedicatedGuestVlanRangeResponse(GuestVlan result); + GlobalLoadBalancerResponse createGlobalLoadBalancerResponse(GlobalLoadBalancerRule globalLoadBalancerRule); LoadBalancerResponse createLoadBalancerResponse(LoadBalancer loadBalancer); diff --git a/api/src/org/apache/cloudstack/api/command/admin/network/DedicateGuestVlanRangeCmd.java b/api/src/org/apache/cloudstack/api/command/admin/network/DedicateGuestVlanRangeCmd.java new file mode 100644 index 00000000000..532fd0be764 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/network/DedicateGuestVlanRangeCmd.java @@ -0,0 +1,108 @@ +// 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 org.apache.cloudstack.api.command.admin.network; + +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.GuestVlan; +import com.cloud.user.Account; +import org.apache.cloudstack.api.*; +import org.apache.cloudstack.api.response.*; +import org.apache.log4j.Logger; + +@APICommand(name = "dedicateGuestVlanRange", description="Dedicates a guest vlan range to an account", responseObject=GuestVlanRangeResponse.class) +public class DedicateGuestVlanRangeCmd extends BaseCmd { + public static final Logger s_logger = Logger.getLogger(DedicateGuestVlanRangeCmd.class.getName()); + + private static final String s_name = "dedicateguestvlanrangeresponse"; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name=ApiConstants.VLAN_RANGE, type=CommandType.STRING, required=true, + description="guest vlan range to be dedicated") + private String vlan; + + @Parameter(name=ApiConstants.ACCOUNT, type=CommandType.STRING, required=true, + description="account who will own the VLAN") + private String accountName; + + @Parameter(name=ApiConstants.PROJECT_ID, type=CommandType.UUID, entityType = ProjectResponse.class, + description="project who will own the VLAN") + private Long projectId; + + @Parameter(name=ApiConstants.DOMAIN_ID, type=CommandType.UUID, entityType = DomainResponse.class, + required=true, description="domain ID of the account owning a VLAN") + private Long domainId; + + @Parameter(name=ApiConstants.PHYSICAL_NETWORK_ID, type=CommandType.UUID, entityType = PhysicalNetworkResponse.class, + required=true, description="physical network ID of the vlan") + private Long physicalNetworkId; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public String getVlan() { + return vlan; + } + + public String getAccountName() { + return accountName; + } + + public Long getDomainId() { + return domainId; + } + + public Long getPhysicalNetworkId() { + return physicalNetworkId; + } + + public Long getProjectId() { + return projectId; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } + + @Override + public void execute() throws ResourceUnavailableException, ResourceAllocationException { + GuestVlan result = _networkService.dedicateGuestVlanRange(this); + if (result != null) { + GuestVlanRangeResponse response = _responseGenerator.createDedicatedGuestVlanRangeResponse(result); + response.setResponseName(getCommandName()); + response.setObjectName("dedicatedguestvlanrange"); + this.setResponseObject(response); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to dedicate guest vlan range"); + } + } + +} diff --git a/api/src/org/apache/cloudstack/api/command/admin/network/ListDedicatedGuestVlanRangesCmd.java b/api/src/org/apache/cloudstack/api/command/admin/network/ListDedicatedGuestVlanRangesCmd.java new file mode 100644 index 00000000000..7f93efc780f --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/network/ListDedicatedGuestVlanRangesCmd.java @@ -0,0 +1,129 @@ +// 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 org.apache.cloudstack.api.command.admin.network; + +import com.cloud.network.GuestVlan; +import com.cloud.user.Account; +import com.cloud.utils.Pair; +import org.apache.cloudstack.api.*; +import org.apache.cloudstack.api.response.*; +import org.apache.log4j.Logger; + +import java.util.ArrayList; +import java.util.List; + + +@APICommand(name = "listDedicatedGuestVlanRanges", description="Lists dedicated guest vlan ranges", responseObject=GuestVlanRangeResponse.class) +public class ListDedicatedGuestVlanRangesCmd extends BaseListCmd { + public static final Logger s_logger = Logger.getLogger(ListDedicatedGuestVlanRangesCmd.class.getName()); + + private static final String s_name = "listdedicatedguestvlanrangesresponse"; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType=GuestVlanRangeResponse.class, + description="list dedicated guest vlan ranges by id") + private Long id; + + @Parameter(name=ApiConstants.ACCOUNT, type=CommandType.STRING, description="the account with which the guest VLAN range is associated. Must be used with the domainId parameter.") + private String accountName; + + @Parameter(name=ApiConstants.PROJECT_ID, type=CommandType.UUID, entityType = ProjectResponse.class, + description="project who will own the guest VLAN range") + private Long projectId; + + @Parameter(name=ApiConstants.DOMAIN_ID, type=CommandType.UUID, entityType = DomainResponse.class, + description="the domain ID with which the guest VLAN range is associated. If used with the account parameter, returns all guest VLAN ranges for that account in the specified domain.") + private Long domainId; + + @Parameter(name=ApiConstants.GUEST_VLAN_RANGE, type=CommandType.STRING, description="the dedicated guest vlan range") + private String guestVlanRange; + + @Parameter(name=ApiConstants.PHYSICAL_NETWORK_ID, type=CommandType.UUID, entityType = PhysicalNetworkResponse.class, + description="physical network id of the guest VLAN range") + private Long physicalNetworkId; + + @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.UUID, entityType = ZoneResponse.class, + description="zone of the guest VLAN range") + private Long zoneId; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public Long getId() { + return id; + } + + public String getAccountName() { + return accountName; + } + + public Long getDomainId() { + return domainId; + } + + public Long getProjectId() { + return projectId; + } + + public String getGuestVlanRange() { + return guestVlanRange; + } + + public Long getPhysicalNetworkId() { + return physicalNetworkId; + } + + public Long getZoneId() { + return zoneId; + } + + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } + + @Override + public void execute(){ + Pair, Integer> vlans = _networkService.listDedicatedGuestVlanRanges(this); + ListResponse response = new ListResponse(); + List guestVlanResponses = new ArrayList(); + for (GuestVlan vlan : vlans.first()) { + GuestVlanRangeResponse guestVlanResponse = _responseGenerator.createDedicatedGuestVlanRangeResponse(vlan); + guestVlanResponse.setObjectName("dedicatedguestvlanrange"); + guestVlanResponses.add(guestVlanResponse); + } + + response.setResponses(guestVlanResponses, vlans.second()); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } + +} diff --git a/api/src/org/apache/cloudstack/api/command/admin/network/ReleaseDedicatedGuestVlanRangeCmd.java b/api/src/org/apache/cloudstack/api/command/admin/network/ReleaseDedicatedGuestVlanRangeCmd.java new file mode 100644 index 00000000000..76cb42dab19 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/network/ReleaseDedicatedGuestVlanRangeCmd.java @@ -0,0 +1,94 @@ +// 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 org.apache.cloudstack.api.command.admin.network; + +import com.cloud.async.AsyncJob; +import com.cloud.event.EventTypes; +import com.cloud.exception.ResourceInUseException; +import com.cloud.user.Account; +import com.cloud.user.UserContext; +import org.apache.cloudstack.api.*; +import org.apache.cloudstack.api.response.CounterResponse; +import org.apache.cloudstack.api.response.GuestVlanRangeResponse; +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.log4j.Logger; + +@APICommand(name = "releaseDedicatedGuestVlanRange", description = "Releases a dedicated guest vlan range to the system", responseObject = SuccessResponse.class) +public class ReleaseDedicatedGuestVlanRangeCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(ReleaseDedicatedGuestVlanRangeCmd.class.getName()); + private static final String s_name = "releasededicatedguestvlanrangeresponse"; + + // /////////////////////////////////////////////////// + // ////////////// API parameters ///////////////////// + // /////////////////////////////////////////////////// + + @Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType=GuestVlanRangeResponse.class, + required=true, description="the ID of the dedicated guest vlan range") + private Long id; + + // /////////////////////////////////////////////////// + // ///////////////// Accessors /////////////////////// + // /////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + public Long getId() { + return id; + } + + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.DedicatedGuestVlanRange; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } + + @Override + public String getEventType() { + return EventTypes.EVENT_DEDICATED_GUEST_VLAN_RANGE_RELEASE; + } + + @Override + public String getEventDescription() { + return "Releasing a dedicated guest vlan range."; + } + + // /////////////////////////////////////////////////// + // ///////////// API Implementation/////////////////// + // /////////////////////////////////////////////////// + + + @Override + public void execute(){ + UserContext.current().setEventDetails("Dedicated guest vlan range Id: " + id); + boolean result = _networkService.releaseDedicatedGuestVlanRange(getId()); + if (result) { + SuccessResponse response = new SuccessResponse(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to release dedicated guest vlan range"); + } + } + +} diff --git a/api/src/org/apache/cloudstack/api/response/GuestVlanRangeResponse.java b/api/src/org/apache/cloudstack/api/response/GuestVlanRangeResponse.java new file mode 100644 index 00000000000..bf19688c13f --- /dev/null +++ b/api/src/org/apache/cloudstack/api/response/GuestVlanRangeResponse.java @@ -0,0 +1,94 @@ +// 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 org.apache.cloudstack.api.response; + +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.EntityReference; + +import com.cloud.network.GuestVlan; + +@EntityReference(value=GuestVlan.class) +@SuppressWarnings("unused") +public class GuestVlanRangeResponse extends BaseResponse implements ControlledEntityResponse { + @SerializedName(ApiConstants.ID) @Param(description="the ID of the guest VLAN range") + private String id; + + @SerializedName(ApiConstants.ACCOUNT) @Param(description="the account of the guest VLAN range") + private String accountName; + + @SerializedName(ApiConstants.DOMAIN_ID) @Param(description="the domain ID of the guest VLAN range") + private String domainId; + + @SerializedName(ApiConstants.DOMAIN) @Param(description="the domain name of the guest VLAN range") + private String domainName; + + @SerializedName(ApiConstants.GUEST_VLAN_RANGE) @Param(description="the guest VLAN range") + private String guestVlanRange; + + @SerializedName(ApiConstants.PROJECT_ID) @Param(description="the project id of the guest vlan range") + private String projectId; + + @SerializedName(ApiConstants.PROJECT) @Param(description="the project name of the guest vlan range") + private String projectName; + + @SerializedName(ApiConstants.PHYSICAL_NETWORK_ID) @Param(description="the physical network of the guest vlan range") + private Long physicalNetworkId; + + @SerializedName(ApiConstants.ZONE_ID) @Param(description="the zone of the guest vlan range") + private Long zoneId; + + + public void setId(String id) { + this.id = id; + } + + public void setAccountName(String accountName) { + this.accountName = accountName; + } + + public void setDomainId(String domainId) { + this.domainId = domainId; + } + + public void setDomainName(String domainName) { + this.domainName = domainName; + } + + public void setGuestVlanRange(String guestVlanRange) { + this.guestVlanRange = guestVlanRange; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public void setPhysicalNetworkId(Long physicalNetworkId) { + this.physicalNetworkId = physicalNetworkId; + } + + public void setZoneId(Long zoneId) { + this.zoneId = zoneId; + } + +} diff --git a/client/tomcatconf/applicationContext.xml.in b/client/tomcatconf/applicationContext.xml.in index 2e340bfbfab..d78700b4b64 100644 --- a/client/tomcatconf/applicationContext.xml.in +++ b/client/tomcatconf/applicationContext.xml.in @@ -165,6 +165,7 @@ + diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java index e291c844a8c..b8eea12b4cf 100755 --- a/server/src/com/cloud/api/ApiDBUtils.java +++ b/server/src/com/cloud/api/ApiDBUtils.java @@ -130,6 +130,8 @@ import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDetailsDao; import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.network.dao.AccountGuestVlanMapDao; +import com.cloud.network.dao.AccountGuestVlanMapVO; import com.cloud.network.IpAddress; import com.cloud.network.Network; import com.cloud.network.Network.Capability; @@ -309,6 +311,7 @@ public class ApiDBUtils { static GuestOSDao _guestOSDao; static GuestOSCategoryDao _guestOSCategoryDao; static HostDao _hostDao; + static AccountGuestVlanMapDao _accountGuestVlanMapDao; static IPAddressDao _ipAddressDao; static LoadBalancerDao _loadBalancerDao; static SecurityGroupDao _securityGroupDao; @@ -416,6 +419,7 @@ public class ApiDBUtils { @Inject private GuestOSDao guestOSDao; @Inject private GuestOSCategoryDao guestOSCategoryDao; @Inject private HostDao hostDao; + @Inject private AccountGuestVlanMapDao accountGuestVlanMapDao; @Inject private IPAddressDao ipAddressDao; @Inject private LoadBalancerDao loadBalancerDao; @Inject private SecurityGroupDao securityGroupDao; @@ -512,6 +516,7 @@ public class ApiDBUtils { _templateMgr = templateMgr; _accountDao = accountDao; + _accountGuestVlanMapDao = accountGuestVlanMapDao; _accountVlanMapDao = accountVlanMapDao; _clusterDao = clusterDao; _capacityDao = capacityDao; @@ -945,6 +950,15 @@ public class ApiDBUtils { } } + public static Long getAccountIdForGuestVlan(long vlanDbId) { + List accountGuestVlanMaps = _accountGuestVlanMapDao.listAccountGuestVlanMapsByVlan(vlanDbId); + if (accountGuestVlanMaps.isEmpty()) { + return null; + } else { + return accountGuestVlanMaps.get(0).getAccountId(); + } + } + public static HypervisorType getVolumeHyperType(long volumeId) { return _volumeDao.getHypervisorType(volumeId); } diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index 790c366cb0d..2804d1e97f3 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -180,7 +180,9 @@ import com.cloud.event.Event; import com.cloud.host.Host; import com.cloud.host.HostVO; import com.cloud.hypervisor.HypervisorCapabilities; +import com.cloud.network.dao.AccountGuestVlanMapVO; import com.cloud.network.IpAddress; +import com.cloud.network.GuestVlan; import com.cloud.network.Network; import com.cloud.network.Network.Capability; import com.cloud.network.Network.Provider; @@ -2725,6 +2727,25 @@ public class ApiResponseHelper implements ResponseGenerator { return response; } + @Override + public GuestVlanRangeResponse createDedicatedGuestVlanRangeResponse(GuestVlan vlan) { + GuestVlanRangeResponse guestVlanRangeResponse = new GuestVlanRangeResponse(); + + guestVlanRangeResponse.setId(vlan.getUuid()); + Long accountId= ApiDBUtils.getAccountIdForGuestVlan(vlan.getId()); + Account owner = ApiDBUtils.findAccountById(accountId); + if (owner != null) { + populateAccount(guestVlanRangeResponse, owner.getId()); + populateDomain(guestVlanRangeResponse, owner.getDomainId()); + } + guestVlanRangeResponse.setGuestVlanRange(vlan.getGuestVlanRange()); + guestVlanRangeResponse.setPhysicalNetworkId(vlan.getPhysicalNetworkId()); + PhysicalNetworkVO physicalNetwork = ApiDBUtils.findPhysicalNetworkById(vlan.getPhysicalNetworkId()); + guestVlanRangeResponse.setZoneId(physicalNetwork.getDataCenterId()); + + return guestVlanRangeResponse; + } + @Override public ServiceResponse createNetworkServiceResponse(Service service) { ServiceResponse response = new ServiceResponse(); diff --git a/server/src/com/cloud/dc/DataCenterVnetVO.java b/server/src/com/cloud/dc/DataCenterVnetVO.java index 52d7ad2067b..9bae132fb16 100755 --- a/server/src/com/cloud/dc/DataCenterVnetVO.java +++ b/server/src/com/cloud/dc/DataCenterVnetVO.java @@ -56,6 +56,9 @@ public class DataCenterVnetVO implements InternalIdentity { @Column(name="reservation_id") protected String reservationId; + + @Column(name="account_vnet_map_id") + protected Long accountGuestVlanMapId; public Date getTakenAt() { return takenAt; @@ -103,6 +106,14 @@ public class DataCenterVnetVO implements InternalIdentity { public long getPhysicalNetworkId() { return physicalNetworkId; } + + public void setAccountGuestVlanMapId(Long accountGuestVlanMapId) { + this.accountGuestVlanMapId = accountGuestVlanMapId; + } + + public Long getAccountGuestVlanMapId() { + return accountGuestVlanMapId; + } protected DataCenterVnetVO() { } diff --git a/server/src/com/cloud/dc/dao/DataCenterDaoImpl.java b/server/src/com/cloud/dc/dao/DataCenterDaoImpl.java index 4afd640d314..4d9d01065ca 100755 --- a/server/src/com/cloud/dc/dao/DataCenterDaoImpl.java +++ b/server/src/com/cloud/dc/dao/DataCenterDaoImpl.java @@ -16,6 +16,7 @@ // under the License. package com.cloud.dc.dao; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Random; @@ -33,6 +34,8 @@ import com.cloud.dc.DataCenterLinkLocalIpAddressVO; import com.cloud.dc.DataCenterVO; import com.cloud.dc.DataCenterVnetVO; import com.cloud.dc.PodVlanVO; +import com.cloud.network.dao.AccountGuestVlanMapDao; +import com.cloud.network.dao.AccountGuestVlanMapVO; import com.cloud.org.Grouping; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; @@ -68,6 +71,7 @@ public class DataCenterDaoImpl extends GenericDaoBase implem @Inject protected DataCenterVnetDao _vnetAllocDao = null; @Inject protected PodVlanDao _podVlanAllocDao = null; @Inject protected DcDetailsDao _detailsDao = null; + @Inject protected AccountGuestVlanMapDao _accountGuestVlanMapDao = null; protected long _prefix; protected Random _rand = new Random(System.currentTimeMillis()); @@ -189,11 +193,20 @@ public class DataCenterDaoImpl extends GenericDaoBase implem @Override public String allocateVnet(long dataCenterId, long physicalNetworkId, long accountId, String reservationId) { - DataCenterVnetVO vo = _vnetAllocDao.take(physicalNetworkId, accountId, reservationId); + ArrayList dedicatedVlanDbIds = new ArrayList(); + List maps = _accountGuestVlanMapDao.listAccountGuestVlanMapsByAccount(accountId); + for (AccountGuestVlanMapVO map : maps) { + dedicatedVlanDbIds.add(map.getId()); + } + if (dedicatedVlanDbIds != null && !dedicatedVlanDbIds.isEmpty()) { + DataCenterVnetVO vo = _vnetAllocDao.take(physicalNetworkId, accountId, reservationId, dedicatedVlanDbIds); + if (vo != null) + return vo.getVnet(); + } + DataCenterVnetVO vo = _vnetAllocDao.take(physicalNetworkId, accountId, reservationId, null); if (vo == null) { return null; } - return vo.getVnet(); } diff --git a/server/src/com/cloud/dc/dao/DataCenterVnetDao.java b/server/src/com/cloud/dc/dao/DataCenterVnetDao.java index 7fb68dcd7ac..778498d8898 100644 --- a/server/src/com/cloud/dc/dao/DataCenterVnetDao.java +++ b/server/src/com/cloud/dc/dao/DataCenterVnetDao.java @@ -37,8 +37,13 @@ public interface DataCenterVnetDao extends GenericDao { public void lockRange(long dcId, long physicalNetworkId, Integer start, Integer end); - public DataCenterVnetVO take(long physicalNetworkId, long accountId, String reservationId); + public DataCenterVnetVO take(long physicalNetworkId, long accountId, String reservationId, List vlanDbIds); public void release(String vnet, long physicalNetworkId, long accountId, String reservationId); + public void releaseDedicatedGuestVlans(Long dedicatedGuestVlanRangeId); + + public int countVnetsAllocatedToAccount(long dcId, long accountId); + + public int countVnetsDedicatedToAccount(long dcId, long accountId); } diff --git a/server/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java b/server/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java index 2e044394ddc..e97f2c62ee3 100755 --- a/server/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java +++ b/server/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java @@ -20,15 +20,22 @@ import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Date; import java.util.List; +import java.util.Map; + +import javax.inject.Inject; +import javax.naming.ConfigurationException; import com.cloud.exception.InvalidParameterValueException; import org.springframework.stereotype.Component; import com.cloud.dc.DataCenterVnetVO; +import com.cloud.network.dao.AccountGuestVlanMapDao; +import com.cloud.network.dao.AccountGuestVlanMapVO; import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDao; 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; @@ -43,7 +50,9 @@ import com.cloud.utils.exception.CloudRuntimeException; @Component @DB(txn=false) public class DataCenterVnetDaoImpl extends GenericDaoBase implements DataCenterVnetDao { + private final SearchBuilder FreeVnetSearch; + private final SearchBuilder FreeDedicatedVnetSearch; private final SearchBuilder VnetDcSearch; private final SearchBuilder VnetDcSearchAllocated; private final SearchBuilder DcSearchAllocated; @@ -51,6 +60,12 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase countZoneVlans; private final GenericSearchBuilder countAllocatedZoneVlans; private final SearchBuilder SearchRange; + private final SearchBuilder DedicatedGuestVlanRangeSearch; + private final GenericSearchBuilder countVnetsAllocatedToAccount; + protected GenericSearchBuilder countVnetsDedicatedToAccount; + protected SearchBuilder AccountGuestVlanMapSearch; + + @Inject protected AccountGuestVlanMapDao _accountGuestVlanMapDao; public List listAllocatedVnets(long physicalNetworkId) { SearchCriteria sc = DcSearchAllocated.create(); @@ -141,9 +156,15 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase sc = FreeVnetSearch.create(); - sc.setParameters("physicalNetworkId", physicalNetworkId); + public DataCenterVnetVO take(long physicalNetworkId, long accountId, String reservationId, List vlanDbIds) { + SearchCriteria sc; + if (vlanDbIds != null) { + sc = FreeDedicatedVnetSearch.create(); + sc.setParameters("accountGuestVlanMapId", vlanDbIds.toArray()); + } else { + sc = FreeVnetSearch.create(); + } + sc.setParameters("physicalNetworkId", physicalNetworkId); Date now = new Date(); Transaction txn = Transaction.currentTxn(); txn.start(); @@ -160,6 +181,7 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase sc = VnetDcSearchAllocated.create(); sc.setParameters("vnet", vnet); @@ -178,6 +200,51 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase sc = DedicatedGuestVlanRangeSearch.create(); + sc.setParameters("dedicatedGuestVlanRangeId", dedicatedGuestVlanRangeId); + List vnets = listBy(sc); + for(DataCenterVnetVO vnet : vnets) { + vnet.setAccountGuestVlanMapId(null); + update(vnet.getId(), vnet); + } + } + + @Override + public int countVnetsAllocatedToAccount(long dcId, long accountId) { + SearchCriteria sc = countVnetsAllocatedToAccount.create(); + sc.setParameters("dc", dcId); + sc.setParameters("accountId", accountId); + return customSearch(sc, null).get(0); + } + + @Override + public int countVnetsDedicatedToAccount(long dcId, long accountId) { + SearchCriteria sc = countVnetsDedicatedToAccount.create(); + sc.setParameters("dc", dcId); + sc.setParameters("accountId", accountId); + return customSearch(sc, null).get(0); + } + + @Override + public boolean configure(String name, Map params) throws ConfigurationException { + boolean result = super.configure(name, params); + + countVnetsDedicatedToAccount = createSearchBuilder(Integer.class); + countVnetsDedicatedToAccount.and("dc", countVnetsDedicatedToAccount.entity().getDataCenterId(), SearchCriteria.Op.EQ); + countVnetsDedicatedToAccount.and("accountGuestVlanMapId", countVnetsDedicatedToAccount.entity().getAccountGuestVlanMapId(), Op.NNULL); + AccountGuestVlanMapSearch = _accountGuestVlanMapDao.createSearchBuilder(); + AccountGuestVlanMapSearch.and("accountId", AccountGuestVlanMapSearch.entity().getAccountId(), SearchCriteria.Op.EQ); + countVnetsDedicatedToAccount.join("AccountGuestVlanMapSearch", AccountGuestVlanMapSearch, countVnetsDedicatedToAccount.entity().getAccountGuestVlanMapId(), + AccountGuestVlanMapSearch.entity().getId(), JoinBuilder.JoinType.INNER); + countVnetsDedicatedToAccount.select(null, Func.COUNT, countVnetsDedicatedToAccount.entity().getId()); + countVnetsDedicatedToAccount.done(); + AccountGuestVlanMapSearch.done(); + + return result; + } + public DataCenterVnetDaoImpl() { super(); DcSearchAllocated = createSearchBuilder(); @@ -202,7 +269,15 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase _networkGurus; public List getNetworkGurus() { @@ -1998,8 +2003,29 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L // For Isolated networks, don't allow to create network with vlan that already exists in the zone if (ntwkOff.getGuestType() == GuestType.Isolated) { if (_networksDao.countByZoneAndUri(zoneId, uri) > 0) { - throw new InvalidParameterValueException("Network with vlan " + vlanId + " already exists in zone " + zoneId); - } + throw new InvalidParameterValueException("Network with vlan " + vlanId + " already exists in zone " + zoneId); + } else { + DataCenterVnetVO dcVnet = _datacenterVnetDao.findVnet(zoneId, vlanId.toString()).get(0); + // Fail network creation if specified vlan is dedicated to a different account + if (dcVnet.getAccountGuestVlanMapId() != null) { + Long accountGuestVlanMapId = dcVnet.getAccountGuestVlanMapId(); + AccountGuestVlanMapVO map = _accountGuestVlanMapDao.findById(accountGuestVlanMapId); + if (map.getAccountId() != owner.getAccountId()) { + throw new InvalidParameterValueException("Vlan " + vlanId + " is dedicated to a different account"); + } + // Fail network creation if owner has a dedicated range of vlans but the specified vlan belongs to the system pool + } else { + List maps = _accountGuestVlanMapDao.listAccountGuestVlanMapsByAccount(owner.getAccountId()); + if (maps != null && !maps.isEmpty()) { + int vnetsAllocatedToAccount = _datacenterVnetDao.countVnetsAllocatedToAccount(zoneId, owner.getAccountId()); + int vnetsDedicatedToAccount = _datacenterVnetDao.countVnetsDedicatedToAccount(zoneId, owner.getAccountId()); + if (vnetsAllocatedToAccount < vnetsDedicatedToAccount) { + throw new InvalidParameterValueException("Specified vlan " + vlanId + " doesn't belong" + + " to the vlan range dedicated to the owner "+ owner.getAccountName()); + } + } + } + } } else { // don't allow to creating shared network with given Vlan ID, if there already exists a isolated network or // shared network with same Vlan ID in the zone @@ -2008,7 +2034,10 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L throw new InvalidParameterValueException("There is a isolated/shared network with vlan id: " + vlanId + " already exists " + "in zone " + zoneId); } - } + } + + + } // If networkDomain is not specified, take it from the global configuration diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java b/server/src/com/cloud/network/NetworkServiceImpl.java index d8f8d5dea2d..230d907aaa3 100755 --- a/server/src/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/com/cloud/network/NetworkServiceImpl.java @@ -85,6 +85,8 @@ import com.cloud.vm.dao.*; import org.apache.cloudstack.acl.ControlledEntity.ACLType; import org.apache.cloudstack.acl.SecurityChecker; import org.apache.cloudstack.acl.SecurityChecker.AccessType; +import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd; +import org.apache.cloudstack.api.command.admin.network.ListDedicatedGuestVlanRangesCmd; import org.apache.cloudstack.api.command.admin.usage.ListTrafficTypeImplementorsCmd; import org.apache.cloudstack.api.command.user.network.CreateNetworkCmd; import org.apache.cloudstack.api.command.user.network.ListNetworksCmd; @@ -203,6 +205,8 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { HostPodDao _hostPodDao; @Inject DataCenterVnetDao _datacneter_vnet; + @Inject + AccountGuestVlanMapDao _accountGuestVlanMapDao; int _cidrLimit; boolean _allowSubdomainNetworkAccess; @@ -2534,6 +2538,19 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { txn.close(); throw new InvalidParameterValueException("Some of the vnets from this range are allocated, can only remove a range which has no allocated vnets"); } + // If the range is partially dedicated to an account fail the request + List maps = _accountGuestVlanMapDao.listAccountGuestVlanMapsByPhysicalNetwork(network.getId()); + for (AccountGuestVlanMapVO map : maps) { + String[] vlans = map.getGuestVlanRange().split("-"); + Integer dedicatedStartVlan = Integer.parseInt(vlans[0]); + Integer dedicatedEndVlan = Integer.parseInt(vlans[1]); + if ((start >= dedicatedStartVlan && start <= dedicatedEndVlan) || (end >= dedicatedStartVlan && end <= dedicatedEndVlan)) { + txn.close(); + throw new InvalidParameterValueException("Vnet range " + map.getGuestVlanRange() + " is dedicated" + + " to an account. The specified range " + start + "-" + end + " overlaps with the dedicated range " + + " Please release the overlapping dedicated range before deleting the range"); + } + } for (i=0; i= end){ temp = existingRanges.get(i).second(); @@ -2564,6 +2581,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { _physicalNetworkDao.update(network.getId(), network); txn.commit(); _physicalNetworkDao.releaseFromLockTable(network.getId()); + return true; } @@ -2700,6 +2718,260 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { } + @Override + @DB + @ActionEvent(eventType = EventTypes.EVENT_GUEST_VLAN_RANGE_DEDICATE, eventDescription = "dedicating guest vlan range", async = false) + public GuestVlan dedicateGuestVlanRange(DedicateGuestVlanRangeCmd cmd) { + String vlan = cmd.getVlan(); + String accountName = cmd.getAccountName(); + Long domainId = cmd.getDomainId(); + Long physicalNetworkId = cmd.getPhysicalNetworkId(); + Long projectId = cmd.getProjectId(); + + int startVlan, endVlan; + String updatedVlanRange = null; + long guestVlanMapId = 0; + long guestVlanMapAccountId = 0; + + // Verify account is valid + Account vlanOwner = null; + if (projectId != null) { + if (accountName != null) { + throw new InvalidParameterValueException("accountName and projectId are mutually exclusive"); + } + Project project = _projectMgr.getProject(projectId); + if (project == null) { + throw new InvalidParameterValueException("Unable to find project by id " + projectId); + } + vlanOwner = _accountMgr.getAccount(project.getProjectAccountId()); + } + + if ((accountName != null) && (domainId != null)) { + vlanOwner = _accountDao.findActiveAccount(accountName, domainId); + if (vlanOwner == null) { + throw new InvalidParameterValueException("Unable to find account by name " + accountName); + } + } + + // Verify physical network isolation type is VLAN + PhysicalNetworkVO physicalNetwork = _physicalNetworkDao.findById(physicalNetworkId); + if (physicalNetwork == null ) { + throw new InvalidParameterValueException("Unable to find physical network by id " + physicalNetworkId); + } else if (physicalNetwork.getIsolationMethods() == null || !physicalNetwork.getIsolationMethods().contains("VLAN")) { + throw new InvalidParameterValueException("Cannot dedicate guest vlan range. " + + "Physical isolation type of network " + physicalNetworkId + " is not VLAN"); + } + + // Get the start and end vlan + String[] vlanRange = vlan.split("-"); + if (vlanRange.length != 2) { + throw new InvalidParameterValueException("Invalid format for parameter value vlan " + vlan + " .Vlan should be specified as 'startvlan-endvlan'"); + } + + try { + startVlan = Integer.parseInt(vlanRange[0]); + endVlan = Integer.parseInt(vlanRange[1]); + } catch (NumberFormatException e) { + s_logger.warn("Unable to parse guest vlan range:", e); + throw new InvalidParameterValueException("Please provide valid guest vlan range"); + } + + // Verify guest vlan range exists in the system + List > existingRanges = physicalNetwork.getVnet(); + Boolean exists = false; + if (!existingRanges.isEmpty()) { + for (int i=0 ; i < existingRanges.size(); i++){ + int existingStartVlan = existingRanges.get(i).first(); + int existingEndVlan = existingRanges.get(i).second(); + if (startVlan >= existingStartVlan && endVlan <= existingEndVlan) { + exists = true; + break; + } + } + if (!exists) { + throw new InvalidParameterValueException("Unable to find guest vlan by range " + vlan); + } + } + + // Verify guest vlans in the range don't belong to a network of a different account + for (int i = startVlan; i <= endVlan; i++) { + List allocatedVlans = _datacneter_vnet.listAllocatedVnetsInRange(physicalNetwork.getDataCenterId(), physicalNetwork.getId(), startVlan, endVlan); + if (allocatedVlans != null && !allocatedVlans.isEmpty()){ + for (DataCenterVnetVO allocatedVlan : allocatedVlans) { + if (allocatedVlan.getAccountId() != vlanOwner.getAccountId()) { + throw new InvalidParameterValueException("Guest vlan from this range " + allocatedVlan.getVnet() + " is allocated to a different account." + + " Can only dedicate a range which has no allocated vlans or has vlans allocated to the same account "); + } + } + } + } + + List guestVlanMaps = _accountGuestVlanMapDao.listAccountGuestVlanMapsByPhysicalNetwork(physicalNetworkId); + for (AccountGuestVlanMapVO guestVlanMap : guestVlanMaps) { + List vlanTokens = getVlanFromRange(guestVlanMap.getGuestVlanRange()); + int dedicatedStartVlan = vlanTokens.get(0).intValue(); + int dedicatedEndVlan = vlanTokens.get(1).intValue(); + guestVlanMapId = guestVlanMap.getId(); + guestVlanMapAccountId = guestVlanMap.getAccountId(); + + // Verify if range is already dedicated + if (startVlan >= dedicatedStartVlan && endVlan <= dedicatedEndVlan) { + if (guestVlanMap.getAccountId() != vlanOwner.getAccountId()) { + throw new InvalidParameterValueException("Vlan range is already dedicated to another account. Cannot dedicate guest vlan range " + vlan); + } else { + s_logger.debug("Vlan range " + vlan +" is already dedicated to the specified account" + accountName); + return guestVlanMap; + } + } + // Verify if range overlaps with an existing range + if (startVlan < dedicatedStartVlan & endVlan+1 >= dedicatedStartVlan & endVlan <= dedicatedEndVlan) { // extend to the left + updatedVlanRange = startVlan + "-" + dedicatedEndVlan; + break; + } else if (startVlan >= dedicatedStartVlan & startVlan-1 <= dedicatedEndVlan & endVlan > dedicatedEndVlan) { // extend to right + updatedVlanRange = dedicatedStartVlan + "-" + endVlan; + break; + } else if (startVlan < dedicatedStartVlan & endVlan > dedicatedEndVlan){ // extend to the left and right + updatedVlanRange = startVlan + "-" + endVlan; + break; + } + } + + AccountGuestVlanMapVO accountGuestVlanMapVO; + if (updatedVlanRange != null) { + if (guestVlanMapAccountId != vlanOwner.getAccountId()) { + throw new InvalidParameterValueException("Vlan range is partially dedicated to another account. Cannot dedicate guest vlan range " + vlan); + } + accountGuestVlanMapVO = _accountGuestVlanMapDao.findById(guestVlanMapId); + accountGuestVlanMapVO.setGuestVlanRange(updatedVlanRange); + _accountGuestVlanMapDao.update(guestVlanMapId, accountGuestVlanMapVO); + } else { + Transaction txn = Transaction.currentTxn(); + accountGuestVlanMapVO = new AccountGuestVlanMapVO(vlanOwner.getAccountId(), physicalNetworkId); + accountGuestVlanMapVO.setGuestVlanRange(startVlan + "-" + endVlan); + _accountGuestVlanMapDao.persist(accountGuestVlanMapVO); + txn.commit(); + } + // For every guest vlan set the corresponding account guest vlan map id + for (int i = startVlan; i <= endVlan; i++) { + List dataCenterVnet = _datacneter_vnet.findVnet(physicalNetwork.getDataCenterId(),((Integer)i).toString()); + dataCenterVnet.get(0).setAccountGuestVlanMapId(accountGuestVlanMapVO.getId()); + _datacneter_vnet.update(dataCenterVnet.get(0).getId(), dataCenterVnet.get(0)); + } + return accountGuestVlanMapVO; + } + + private List getVlanFromRange(String vlanRange) { + // Get the start and end vlan + String[] vlanTokens = vlanRange.split("-"); + List tokens = new ArrayList(); + try { + int startVlan = Integer.parseInt(vlanTokens[0]); + int endVlan = Integer.parseInt(vlanTokens[1]); + tokens.add(startVlan); + tokens.add(endVlan); + } catch (NumberFormatException e) { + s_logger.warn("Unable to parse guest vlan range:", e); + throw new InvalidParameterValueException("Please provide valid guest vlan range"); + } + return tokens; + } + + @Override + public Pair, Integer> listDedicatedGuestVlanRanges(ListDedicatedGuestVlanRangesCmd cmd) { + Long id = cmd.getId(); + String accountName = cmd.getAccountName(); + Long domainId = cmd.getDomainId(); + Long projectId = cmd.getProjectId(); + String guestVlanRange = cmd.getGuestVlanRange(); + Long physicalNetworkId = cmd.getPhysicalNetworkId(); + Long zoneId = cmd.getZoneId(); + + Long accountId = null; + if (accountName != null && domainId != null) { + if (projectId != null) { + throw new InvalidParameterValueException("Account and projectId can't be specified together"); + } + Account account = _accountDao.findActiveAccount(accountName, domainId); + if (account == null) { + InvalidParameterValueException ex = new InvalidParameterValueException("Unable to find account " + accountName); + ex.addProxyObject("domain", domainId, "domainId"); + throw ex; + } else { + accountId = account.getId(); + } + } + + // set project information + if (projectId != null) { + Project project = _projectMgr.getProject(projectId); + if (project == null) { + InvalidParameterValueException ex = new InvalidParameterValueException("Unable to find project by id " + projectId); + ex.addProxyObject(project, projectId, "projectId"); + throw ex; + } + accountId = project.getProjectAccountId(); + } + + + SearchBuilder sb = _accountGuestVlanMapDao.createSearchBuilder(); + sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); + sb.and("accountId", sb.entity().getAccountId(), SearchCriteria.Op.EQ); + sb.and("guestVlanRange", sb.entity().getGuestVlanRange(), SearchCriteria.Op.EQ); + sb.and("physicalNetworkId", sb.entity().getPhysicalNetworkId(), SearchCriteria.Op.EQ); + + if (zoneId != null) { + SearchBuilder physicalnetworkSearch = _physicalNetworkDao.createSearchBuilder(); + physicalnetworkSearch.and("zoneId", physicalnetworkSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); + sb.join("physicalnetworkSearch", physicalnetworkSearch, sb.entity().getPhysicalNetworkId(), physicalnetworkSearch.entity().getId(), JoinBuilder.JoinType.INNER); + } + + SearchCriteria sc = sb.create(); + if (id != null) { + sc.setParameters("id", id); + } + + if (accountId != null) { + sc.setParameters("accountId", accountId); + } + + if (guestVlanRange != null) { + sc.setParameters("guestVlanRange", guestVlanRange); + } + + if (physicalNetworkId != null) { + sc.setParameters("physicalNetworkId", physicalNetworkId); + } + + if (zoneId != null) { + sc.setJoinParameters("physicalnetworkSearch", "zoneId", zoneId); + } + + Filter searchFilter = new Filter(AccountGuestVlanMapVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); + Pair, Integer> result = _accountGuestVlanMapDao.searchAndCount(sc, searchFilter); + return new Pair, Integer>(result.first(), result.second()); + } + + @Override + @ActionEvent(eventType = EventTypes.EVENT_DEDICATED_GUEST_VLAN_RANGE_RELEASE, eventDescription = "releasing" + + " dedicated guest vlan range", async = true) + @DB + public boolean releaseDedicatedGuestVlanRange(Long dedicatedGuestVlanRangeId) { + // Verify dedicated range exists + AccountGuestVlanMapVO dedicatedGuestVlan = _accountGuestVlanMapDao.findById(dedicatedGuestVlanRangeId); + if (dedicatedGuestVlan == null) { + throw new InvalidParameterValueException("Dedicated guest vlan with specified" + + " id doesn't exist in the system"); + } + + // Remove dedication for the guest vlan + _datacneter_vnet.releaseDedicatedGuestVlans(dedicatedGuestVlan.getId()); + if (_accountGuestVlanMapDao.remove(dedicatedGuestVlanRangeId)) { + return true; + } else { + return false; + } + } + @Override public List listNetworkServices(String providerName) { diff --git a/server/src/com/cloud/network/dao/AccountGuestVlanMapDao.java b/server/src/com/cloud/network/dao/AccountGuestVlanMapDao.java new file mode 100644 index 00000000000..dc1ec895d80 --- /dev/null +++ b/server/src/com/cloud/network/dao/AccountGuestVlanMapDao.java @@ -0,0 +1,34 @@ +// 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.network.dao; + +import com.cloud.network.dao.AccountGuestVlanMapVO; +import com.cloud.utils.db.GenericDao; + +import java.util.List; + +public interface AccountGuestVlanMapDao extends GenericDao { + + public List listAccountGuestVlanMapsByAccount(long accountId); + + public List listAccountGuestVlanMapsByVlan(long guestVlanId); + + public List listAccountGuestVlanMapsByPhysicalNetwork(long physicalNetworkId); + + public int removeByAccountId(long accountId); + +} diff --git a/server/src/com/cloud/network/dao/AccountGuestVlanMapDaoImpl.java b/server/src/com/cloud/network/dao/AccountGuestVlanMapDaoImpl.java new file mode 100644 index 00000000000..e7a7b34d9bd --- /dev/null +++ b/server/src/com/cloud/network/dao/AccountGuestVlanMapDaoImpl.java @@ -0,0 +1,83 @@ +// 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.network.dao; + +import com.cloud.network.dao.AccountGuestVlanMapVO; +import com.cloud.network.dao.AccountGuestVlanMapDao; + +import java.util.List; +import javax.ejb.Local; +import org.springframework.stereotype.Component; + +import com.cloud.utils.db.DB; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; + +@Component +@Local(value={AccountGuestVlanMapDao.class}) +@DB(txn=false) +public class AccountGuestVlanMapDaoImpl extends GenericDaoBase implements AccountGuestVlanMapDao { + + protected SearchBuilder AccountSearch; + protected SearchBuilder GuestVlanSearch; + protected SearchBuilder PhysicalNetworkSearch; + + @Override + public List listAccountGuestVlanMapsByAccount(long accountId) { + SearchCriteria sc = AccountSearch.create(); + sc.setParameters("accountId", accountId); + return listIncludingRemovedBy(sc); + } + + @Override + public List listAccountGuestVlanMapsByVlan(long guestVlanId) { + SearchCriteria sc = GuestVlanSearch.create(); + sc.setParameters("guestVlanId", guestVlanId); + return listIncludingRemovedBy(sc); + } + + @Override + public List listAccountGuestVlanMapsByPhysicalNetwork(long physicalNetworkId) { + SearchCriteria sc = GuestVlanSearch.create(); + sc.setParameters("physicalNetworkId", physicalNetworkId); + return listIncludingRemovedBy(sc); + } + + @Override + public int removeByAccountId(long accountId) { + SearchCriteria sc = AccountSearch.create(); + sc.setParameters("accountId", accountId); + return expunge(sc); + } + + public AccountGuestVlanMapDaoImpl() { + super(); + AccountSearch = createSearchBuilder(); + AccountSearch.and("accountId", AccountSearch.entity().getAccountId(), SearchCriteria.Op.EQ); + AccountSearch.done(); + + GuestVlanSearch = createSearchBuilder(); + GuestVlanSearch.and("guestVlanId", GuestVlanSearch.entity().getId(), SearchCriteria.Op.EQ); + GuestVlanSearch.done(); + + PhysicalNetworkSearch = createSearchBuilder(); + PhysicalNetworkSearch.and("physicalNetworkId", PhysicalNetworkSearch.entity().getId(), SearchCriteria.Op.EQ); + PhysicalNetworkSearch.done(); + } + +} diff --git a/server/src/com/cloud/network/dao/AccountGuestVlanMapVO.java b/server/src/com/cloud/network/dao/AccountGuestVlanMapVO.java new file mode 100644 index 00000000000..17c941a7e36 --- /dev/null +++ b/server/src/com/cloud/network/dao/AccountGuestVlanMapVO.java @@ -0,0 +1,94 @@ +// 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.network.dao; + +import com.cloud.network.GuestVlan; + +import javax.persistence.*; +import java.util.UUID; + +@Entity +@Table(name="account_vnet_map") +public class AccountGuestVlanMapVO implements GuestVlan { + + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + @Column(name="id") + private long id; + + @Column(name="account_id") + private long accountId; + + @Column(name="uuid") + private String uuid; + + @Column(name="vnet_range") + private String guestVlanRange; + + @Column(name="physical_network_id") + private long physicalNetworkId; + + public AccountGuestVlanMapVO(long accountId,long physicalNetworkId) { + this.accountId = accountId; + this.physicalNetworkId = physicalNetworkId; + this.guestVlanRange = null; + this.uuid = UUID.randomUUID().toString(); + } + + public AccountGuestVlanMapVO() { + + } + + @Override + public long getId() { + return id; + } + + @Override + public long getAccountId() { + return accountId; + } + + @Override + public String getGuestVlanRange() { + return guestVlanRange; + } + + + public void setGuestVlanRange(String guestVlanRange) { + this.guestVlanRange = guestVlanRange; + } + + @Override + public String getUuid() { + return this.uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + @Override + public long getPhysicalNetworkId() { + return this.physicalNetworkId; + } + + public void setPhysicalNetworkId(long physicalNetworkId) { + this.physicalNetworkId = physicalNetworkId; + } + +} diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index efd51e61c5f..5ddae88f1dd 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -2258,6 +2258,9 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe cmdList.add(UpdateNetworkServiceProviderCmd.class); cmdList.add(UpdatePhysicalNetworkCmd.class); cmdList.add(UpdateStorageNetworkIpRangeCmd.class); + cmdList.add(DedicateGuestVlanRangeCmd.class); + cmdList.add(ListDedicatedGuestVlanRangesCmd.class); + cmdList.add(ReleaseDedicatedGuestVlanRangeCmd.class); cmdList.add(CreateDiskOfferingCmd.class); cmdList.add(CreateServiceOfferingCmd.class); cmdList.add(DeleteDiskOfferingCmd.class); diff --git a/server/src/com/cloud/user/AccountManagerImpl.java b/server/src/com/cloud/user/AccountManagerImpl.java index 8de73fbd582..4088f64f58b 100755 --- a/server/src/com/cloud/user/AccountManagerImpl.java +++ b/server/src/com/cloud/user/AccountManagerImpl.java @@ -59,6 +59,7 @@ import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.configuration.dao.ResourceCountDao; import com.cloud.dc.DataCenterVO; import com.cloud.dc.dao.DataCenterDao; +import com.cloud.dc.dao.DataCenterVnetDao; import com.cloud.domain.Domain; import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; @@ -76,6 +77,8 @@ import com.cloud.network.IpAddress; import com.cloud.network.NetworkManager; import com.cloud.network.VpnUserVO; import com.cloud.network.as.AutoScaleManager; +import com.cloud.network.dao.AccountGuestVlanMapDao; +import com.cloud.network.dao.AccountGuestVlanMapVO; import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.IPAddressVO; import com.cloud.network.dao.NetworkDao; @@ -222,6 +225,10 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M @Inject VolumeManager volumeMgr; @Inject private AffinityGroupDao _affinityGroupDao; + @Inject + private AccountGuestVlanMapDao _accountGuestVlanMapDao; + @Inject + private DataCenterVnetDao _dataCenterVnetDao; private List _userAuthenticators; List _userPasswordEncoders; @@ -699,6 +706,14 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M } } + // release account specific guest vlans + List maps = _accountGuestVlanMapDao.listAccountGuestVlanMapsByAccount(accountId); + for (AccountGuestVlanMapVO map : maps) { + _dataCenterVnetDao.releaseDedicatedGuestVlans(map.getId()); + } + int vlansReleased = _accountGuestVlanMapDao.removeByAccountId(accountId); + s_logger.info("deleteAccount: Released " + vlansReleased + " dedicated guest vlan ranges from account " + accountId); + return true; } catch (Exception ex) { s_logger.warn("Failed to cleanup account " + account + " due to ", ex); diff --git a/server/test/com/cloud/network/DedicateGuestVlanRangesTest.java b/server/test/com/cloud/network/DedicateGuestVlanRangesTest.java new file mode 100644 index 00000000000..e81d7222a60 --- /dev/null +++ b/server/test/com/cloud/network/DedicateGuestVlanRangesTest.java @@ -0,0 +1,378 @@ +// 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.network; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.lang.reflect.Field; + +import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd; +import org.apache.cloudstack.api.command.admin.network.ListDedicatedGuestVlanRangesCmd; +import org.apache.cloudstack.api.command.admin.network.ReleaseDedicatedGuestVlanRangeCmd; + +import org.apache.log4j.Logger; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import com.cloud.dc.DataCenterVnetVO; +import com.cloud.dc.dao.DataCenterVnetDao; +import com.cloud.network.dao.AccountGuestVlanMapDao; +import com.cloud.network.dao.AccountGuestVlanMapVO; +import com.cloud.network.dao.PhysicalNetworkDao; +import com.cloud.network.dao.PhysicalNetworkVO; +import com.cloud.projects.ProjectManager; +import com.cloud.user.Account; +import com.cloud.user.dao.AccountDao; +import com.cloud.user.AccountManager; +import com.cloud.user.AccountVO; +import com.cloud.user.UserContext; +import com.cloud.utils.db.Transaction; + +import junit.framework.Assert; + +import static org.mockito.Matchers.*; +import static org.mockito.Mockito.when; +import static org.mockito.Mockito.doNothing; + +public class DedicateGuestVlanRangesTest { + + private static final Logger s_logger = Logger.getLogger(DedicateGuestVlanRangesTest.class); + + NetworkServiceImpl networkService = new NetworkServiceImpl(); + + DedicateGuestVlanRangeCmd dedicateGuestVlanRangesCmd = new DedicateGuestVlanRangeCmdExtn(); + Class _dedicateGuestVlanRangeClass = dedicateGuestVlanRangesCmd.getClass().getSuperclass(); + + ReleaseDedicatedGuestVlanRangeCmd releaseDedicatedGuestVlanRangesCmd = new ReleaseDedicatedGuestVlanRangeCmdExtn(); + Class _releaseGuestVlanRangeClass = releaseDedicatedGuestVlanRangesCmd.getClass().getSuperclass(); + + ListDedicatedGuestVlanRangesCmd listDedicatedGuestVlanRangesCmd = new ListDedicatedGuestVlanRangesCmdExtn(); + Class _listDedicatedGuestVlanRangeClass = listDedicatedGuestVlanRangesCmd.getClass().getSuperclass(); + + + @Mock AccountManager _accountMgr; + @Mock AccountDao _accountDao; + @Mock ProjectManager _projectMgr; + @Mock PhysicalNetworkDao _physicalNetworkDao; + @Mock DataCenterVnetDao _dataCenterVnetDao; + @Mock AccountGuestVlanMapDao _accountGuestVlanMapDao; + + @Before + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + + networkService._accountMgr = _accountMgr; + networkService._accountDao = _accountDao; + networkService._projectMgr = _projectMgr; + networkService._physicalNetworkDao = _physicalNetworkDao; + networkService._datacneter_vnet = _dataCenterVnetDao; + networkService._accountGuestVlanMapDao = _accountGuestVlanMapDao; + + Account account = (Account) new AccountVO("testaccount", 1, "networkdomain", (short) 0, UUID.randomUUID().toString()); + when(networkService._accountMgr.getAccount(anyLong())).thenReturn(account); + when(networkService._accountDao.findActiveAccount(anyString(), anyLong())).thenReturn(account); + + UserContext.registerContext(1, account, null, true); + + Field accountNameField = _dedicateGuestVlanRangeClass.getDeclaredField("accountName"); + accountNameField.setAccessible(true); + accountNameField.set(dedicateGuestVlanRangesCmd, "accountname"); + + Field projectIdField = _dedicateGuestVlanRangeClass.getDeclaredField("projectId"); + projectIdField.setAccessible(true); + projectIdField.set(dedicateGuestVlanRangesCmd, null); + + Field domainIdField = _dedicateGuestVlanRangeClass.getDeclaredField("domainId"); + domainIdField.setAccessible(true); + domainIdField.set(dedicateGuestVlanRangesCmd, 1L); + + Field physicalNetworkIdField = _dedicateGuestVlanRangeClass.getDeclaredField("physicalNetworkId"); + physicalNetworkIdField.setAccessible(true); + physicalNetworkIdField.set(dedicateGuestVlanRangesCmd, 1L); + + Field releaseIdField = _releaseGuestVlanRangeClass.getDeclaredField("id"); + releaseIdField.setAccessible(true); + releaseIdField.set(releaseDedicatedGuestVlanRangesCmd, 1L); + } + + @Test + public void testDedicateGuestVlanRange() throws Exception { + s_logger.info("Running tests for DedicateGuestVlanRange API"); + + /* + * TEST 1: given valid parameters DedicateGuestVlanRange should succeed + */ + runDedicateGuestVlanRangePostiveTest(); + + /* + * TEST 2: given invalid format for vlan range DedicateGuestVlanRange should fail + */ + runDedicateGuestVlanRangeInvalidFormat(); + + /* + * TEST 3: given vlan range that doesn't exist in the system request should fail + */ + runDedicateGuestVlanRangeInvalidRangeValue(); + + /* + * TEST 4: given vlan range has vlans that are allocated to a different account request should fail + */ + runDedicateGuestVlanRangeAllocatedVlans(); + + /* + * TEST 5: given vlan range is already dedicated to another account request should fail + */ + runDedicateGuestVlanRangeDedicatedRange(); + + /* + * TEST 6: given vlan range is partially dedicated to a different account request should fail + */ + runDedicateGuestVlanRangePartiallyDedicated(); + } + + @Test + public void testReleaseDedicatedGuestVlanRange() throws Exception { + + s_logger.info("Running tests for ReleaseDedicatedGuestVlanRange API"); + + /* + * TEST 1: given valid parameters ReleaseDedicatedGuestVlanRange should succeed + */ + runReleaseDedicatedGuestVlanRangePostiveTest(); + + /* + * TEST 2: given range doesn't exist request should fail + */ + runReleaseDedicatedGuestVlanRangeInvalidRange(); + } + + void runDedicateGuestVlanRangePostiveTest() throws Exception { + Transaction txn = Transaction.open("runDedicateGuestVlanRangePostiveTest"); + + Field dedicateVlanField = _dedicateGuestVlanRangeClass.getDeclaredField("vlan"); + dedicateVlanField.setAccessible(true); + dedicateVlanField.set(dedicateGuestVlanRangesCmd, "2-5"); + + PhysicalNetworkVO physicalNetwork = new PhysicalNetworkVO(1L, 1L, "2-5", "200", 1L, null, "testphysicalnetwork"); + physicalNetwork.addIsolationMethod("VLAN"); + AccountGuestVlanMapVO accountGuestVlanMapVO = new AccountGuestVlanMapVO(1L,1L); + + when(networkService._physicalNetworkDao.findById(anyLong())).thenReturn(physicalNetwork); + + when(networkService._datacneter_vnet.listAllocatedVnetsInRange(anyLong(), anyLong(), anyInt(), anyInt())).thenReturn(null); + + when(networkService._accountGuestVlanMapDao.listAccountGuestVlanMapsByPhysicalNetwork(anyLong())).thenReturn(null); + + when(networkService._accountGuestVlanMapDao.persist(any(AccountGuestVlanMapVO.class))).thenReturn(accountGuestVlanMapVO); + + when(networkService._datacneter_vnet.update(anyLong(), any(DataCenterVnetVO.class))).thenReturn(true); + + List dataCenterVnetList = new ArrayList(); + DataCenterVnetVO dataCenterVnetVO = new DataCenterVnetVO("2-5", 1L, 1L); + dataCenterVnetList.add(dataCenterVnetVO); + when(networkService._datacneter_vnet.findVnet(anyLong(), anyString())).thenReturn(dataCenterVnetList); + + try { + GuestVlan result = networkService.dedicateGuestVlanRange(dedicateGuestVlanRangesCmd); + Assert.assertNotNull(result); + } catch (Exception e) { + s_logger.info("exception in testing runDedicateGuestVlanRangePostiveTest message: " + e.toString()); + } finally { + txn.close("runDedicateGuestRangePostiveTest"); + } + } + + void runDedicateGuestVlanRangeInvalidFormat() throws Exception { + Transaction txn = Transaction.open("runDedicateGuestVlanRangeInvalidFormat"); + + Field dedicateVlanField = _dedicateGuestVlanRangeClass.getDeclaredField("vlan"); + dedicateVlanField.setAccessible(true); + dedicateVlanField.set(dedicateGuestVlanRangesCmd, "2"); + + PhysicalNetworkVO physicalNetwork = new PhysicalNetworkVO(1L, 1L, "2-5", "200", 1L, null, "testphysicalnetwork"); + physicalNetwork.addIsolationMethod("VLAN"); + + when(networkService._physicalNetworkDao.findById(anyLong())).thenReturn(physicalNetwork); + + try { + networkService.dedicateGuestVlanRange(dedicateGuestVlanRangesCmd); + } catch (Exception e) { + Assert.assertTrue(e.getMessage().contains("Invalid format for parameter value vlan")); + } finally { + txn.close("runDedicateGuestVlanRangeInvalidFormat"); + } + } + + void runDedicateGuestVlanRangeInvalidRangeValue() throws Exception { + Transaction txn = Transaction.open("runDedicateGuestVlanRangeInvalidRangeValue"); + + Field dedicateVlanField = _dedicateGuestVlanRangeClass.getDeclaredField("vlan"); + dedicateVlanField.setAccessible(true); + dedicateVlanField.set(dedicateGuestVlanRangesCmd, "2-5"); + + PhysicalNetworkVO physicalNetwork = new PhysicalNetworkVO(1L, 1L, "6-10", "200", 1L, null, "testphysicalnetwork"); + physicalNetwork.addIsolationMethod("VLAN"); + + when(networkService._physicalNetworkDao.findById(anyLong())).thenReturn(physicalNetwork); + + try { + networkService.dedicateGuestVlanRange(dedicateGuestVlanRangesCmd); + } catch (Exception e) { + Assert.assertTrue(e.getMessage().contains("Unable to find guest vlan by range")); + } finally { + txn.close("runDedicateGuestVlanRangeInvalidRangeValue"); + } + } + + void runDedicateGuestVlanRangeAllocatedVlans() throws Exception { + Transaction txn = Transaction.open("runDedicateGuestVlanRangeAllocatedVlans"); + + Field dedicateVlanField = _dedicateGuestVlanRangeClass.getDeclaredField("vlan"); + dedicateVlanField.setAccessible(true); + dedicateVlanField.set(dedicateGuestVlanRangesCmd, "2-5"); + + PhysicalNetworkVO physicalNetwork = new PhysicalNetworkVO(1L, 1L, "2-5", "200", 1L, null, "testphysicalnetwork"); + physicalNetwork.addIsolationMethod("VLAN"); + when(networkService._physicalNetworkDao.findById(anyLong())).thenReturn(physicalNetwork); + + List dataCenterList = new ArrayList(); + DataCenterVnetVO dataCenter = new DataCenterVnetVO("2-5", 1L, 1L); + dataCenter.setAccountId(1L); + dataCenterList.add(dataCenter); + when(networkService._datacneter_vnet.listAllocatedVnetsInRange(anyLong(), anyLong(), anyInt(), anyInt())).thenReturn(dataCenterList); + + try { + networkService.dedicateGuestVlanRange(dedicateGuestVlanRangesCmd); + } catch (Exception e) { + Assert.assertTrue(e.getMessage().contains("is allocated to a different account")); + } finally { + txn.close("runDedicateGuestVlanRangeAllocatedVlans"); + } + } + + void runDedicateGuestVlanRangeDedicatedRange() throws Exception { + Transaction txn = Transaction.open("runDedicateGuestVlanRangeDedicatedRange"); + + Field dedicateVlanField = _dedicateGuestVlanRangeClass.getDeclaredField("vlan"); + dedicateVlanField.setAccessible(true); + dedicateVlanField.set(dedicateGuestVlanRangesCmd, "2-5"); + + PhysicalNetworkVO physicalNetwork = new PhysicalNetworkVO(1L, 1L, "2-5", "200", 1L, null, "testphysicalnetwork"); + physicalNetwork.addIsolationMethod("VLAN"); + + when(networkService._physicalNetworkDao.findById(anyLong())).thenReturn(physicalNetwork); + + when(networkService._datacneter_vnet.listAllocatedVnetsInRange(anyLong(), anyLong(), anyInt(), anyInt())).thenReturn(null); + + List guestVlanMaps = new ArrayList(); + AccountGuestVlanMapVO accountGuestVlanMap = new AccountGuestVlanMapVO(1L, 1L); + accountGuestVlanMap.setGuestVlanRange("2-5"); + guestVlanMaps.add(accountGuestVlanMap); + when(networkService._accountGuestVlanMapDao.listAccountGuestVlanMapsByPhysicalNetwork(anyLong())).thenReturn(guestVlanMaps); + + try { + networkService.dedicateGuestVlanRange(dedicateGuestVlanRangesCmd); + } catch (Exception e) { + Assert.assertTrue(e.getMessage().contains("Vlan range is already dedicated to another account")); + } finally { + txn.close("runDedicateGuestVlanRangeDedicatedRange"); + } + } + + void runDedicateGuestVlanRangePartiallyDedicated() throws Exception { + Transaction txn = Transaction.open("runDedicateGuestVlanRangePartiallyDedicated"); + + Field dedicateVlanField = _dedicateGuestVlanRangeClass.getDeclaredField("vlan"); + dedicateVlanField.setAccessible(true); + dedicateVlanField.set(dedicateGuestVlanRangesCmd, "2-5"); + + PhysicalNetworkVO physicalNetwork = new PhysicalNetworkVO(1L, 1L, "2-5", "200", 1L, null, "testphysicalnetwork"); + physicalNetwork.addIsolationMethod("VLAN"); + + when(networkService._physicalNetworkDao.findById(anyLong())).thenReturn(physicalNetwork); + + when(networkService._datacneter_vnet.listAllocatedVnetsInRange(anyLong(), anyLong(), anyInt(), anyInt())).thenReturn(null); + + List guestVlanMaps = new ArrayList(); + AccountGuestVlanMapVO accountGuestVlanMap = new AccountGuestVlanMapVO(2L, 1L); + accountGuestVlanMap.setGuestVlanRange("4-8"); + guestVlanMaps.add(accountGuestVlanMap); + when(networkService._accountGuestVlanMapDao.listAccountGuestVlanMapsByPhysicalNetwork(anyLong())).thenReturn(guestVlanMaps); + + try { + networkService.dedicateGuestVlanRange(dedicateGuestVlanRangesCmd); + } catch (Exception e) { + Assert.assertTrue(e.getMessage().contains("Vlan range is partially dedicated to another account")); + } finally { + txn.close("runDedicateGuestVlanRangePartiallyDedicated"); + } + } + + void runReleaseDedicatedGuestVlanRangePostiveTest() throws Exception { + Transaction txn = Transaction.open("runReleaseDedicatedGuestVlanRangePostiveTest"); + + AccountGuestVlanMapVO accountGuestVlanMap = new AccountGuestVlanMapVO(1L, 1L); + when(networkService._accountGuestVlanMapDao.findById(anyLong())).thenReturn(accountGuestVlanMap); + doNothing().when(networkService._datacneter_vnet).releaseDedicatedGuestVlans(anyLong()); + when(networkService._accountGuestVlanMapDao.remove(anyLong())).thenReturn(true); + + try { + Boolean result = networkService.releaseDedicatedGuestVlanRange(releaseDedicatedGuestVlanRangesCmd.getId()); + Assert.assertTrue(result); + } catch (Exception e) { + s_logger.info("exception in testing runReleaseGuestVlanRangePostiveTest1 message: " + e.toString()); + } finally { + txn.close("runReleaseDedicatedGuestVlanRangePostiveTest"); + } + } + + void runReleaseDedicatedGuestVlanRangeInvalidRange() throws Exception { + Transaction txn = Transaction.open("runReleaseDedicatedGuestVlanRangeInvalidRange"); + + when(networkService._accountGuestVlanMapDao.findById(anyLong())).thenReturn(null); + + try { + networkService.releaseDedicatedGuestVlanRange(releaseDedicatedGuestVlanRangesCmd.getId()); + } catch (Exception e) { + Assert.assertTrue(e.getMessage().contains("Dedicated guest vlan with specified id doesn't exist in the system")); + } finally { + txn.close("runReleaseDedicatedGuestVlanRangeInvalidRange"); + } + } + + public class DedicateGuestVlanRangeCmdExtn extends DedicateGuestVlanRangeCmd { + public long getEntityOwnerId() { + return 1; + } + } + + public class ReleaseDedicatedGuestVlanRangeCmdExtn extends ReleaseDedicatedGuestVlanRangeCmd { + public long getEntityOwnerId() { + return 1; + } + } + + public class ListDedicatedGuestVlanRangesCmdExtn extends ListDedicatedGuestVlanRangesCmd { + public long getEntityOwnerId() { + return 1; + } + } +} diff --git a/server/test/com/cloud/network/MockNetworkManagerImpl.java b/server/test/com/cloud/network/MockNetworkManagerImpl.java index 45562c6ea31..2f717c8c156 100755 --- a/server/test/com/cloud/network/MockNetworkManagerImpl.java +++ b/server/test/com/cloud/network/MockNetworkManagerImpl.java @@ -29,6 +29,7 @@ import com.cloud.network.Networks.TrafficType; import com.cloud.network.addr.PublicIp; import com.cloud.network.dao.IPAddressVO; import com.cloud.network.dao.NetworkVO; +import com.cloud.network.GuestVlan; import com.cloud.network.element.LoadBalancingServiceProvider; import com.cloud.network.element.StaticNatServiceProvider; import com.cloud.network.element.UserDataServiceProvider; @@ -46,6 +47,8 @@ import com.cloud.utils.component.ManagerBase; import com.cloud.vm.*; import com.cloud.vm.VirtualMachine.Type; import org.apache.cloudstack.acl.ControlledEntity.ACLType; +import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd; +import org.apache.cloudstack.api.command.admin.network.ListDedicatedGuestVlanRangesCmd; import org.apache.cloudstack.api.command.admin.usage.ListTrafficTypeImplementorsCmd; import org.apache.cloudstack.api.command.user.network.CreateNetworkCmd; import org.apache.cloudstack.api.command.user.network.ListNetworksCmd; @@ -326,6 +329,24 @@ public class MockNetworkManagerImpl extends ManagerBase implements NetworkManage } @Override + public GuestVlan dedicateGuestVlanRange(DedicateGuestVlanRangeCmd cmd) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Pair, Integer> listDedicatedGuestVlanRanges(ListDedicatedGuestVlanRangesCmd cmd) { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean releaseDedicatedGuestVlanRange(Long dedicatedGuestVlanRangeId) { + // TODO Auto-generated method stub + return true; + } + + @Override public List listNetworkServices(String providerName) { // TODO Auto-generated method stub return null; diff --git a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java index 668935707ee..f884ba1d767 100644 --- a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java +++ b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java @@ -28,6 +28,7 @@ import com.cloud.network.Network.Provider; import com.cloud.network.Network.Service; import com.cloud.network.Networks.TrafficType; import com.cloud.network.addr.PublicIp; +import com.cloud.network.dao.AccountGuestVlanMapVO; import com.cloud.network.dao.IPAddressVO; import com.cloud.network.dao.NetworkServiceMapDao; import com.cloud.network.dao.NetworkVO; @@ -50,6 +51,8 @@ import com.cloud.utils.component.ManagerBase; import com.cloud.vm.*; import com.cloud.vm.VirtualMachine.Type; import org.apache.cloudstack.acl.ControlledEntity.ACLType; +import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd; +import org.apache.cloudstack.api.command.admin.network.ListDedicatedGuestVlanRangesCmd; import org.apache.cloudstack.api.command.admin.usage.ListTrafficTypeImplementorsCmd; import org.apache.cloudstack.api.command.user.network.CreateNetworkCmd; import org.apache.cloudstack.api.command.user.network.ListNetworksCmd; @@ -338,9 +341,24 @@ public class MockNetworkManagerImpl extends ManagerBase implements NetworkManage return false; } + @Override + public GuestVlan dedicateGuestVlanRange(DedicateGuestVlanRangeCmd cmd) { + // TODO Auto-generated method stub + return null; + } + @Override + public Pair, Integer> listDedicatedGuestVlanRanges(ListDedicatedGuestVlanRangesCmd cmd) { + // TODO Auto-generated method stub + return null; + } + @Override + public boolean releaseDedicatedGuestVlanRange(Long dedicatedGuestVlanRangeId) { + // TODO Auto-generated method stub + return true; + } /* (non-Javadoc) * @see com.cloud.network.NetworkService#listNetworkServices(java.lang.String) diff --git a/server/test/org/apache/cloudstack/affinity/AffinityApiTestConfiguration.java b/server/test/org/apache/cloudstack/affinity/AffinityApiTestConfiguration.java index 4dd6ad7e8d0..a1224db62c3 100644 --- a/server/test/org/apache/cloudstack/affinity/AffinityApiTestConfiguration.java +++ b/server/test/org/apache/cloudstack/affinity/AffinityApiTestConfiguration.java @@ -72,6 +72,7 @@ import com.cloud.network.NetworkManager; import com.cloud.network.NetworkModel; import com.cloud.network.NetworkService; import com.cloud.network.StorageNetworkManager; +import com.cloud.network.dao.AccountGuestVlanMapDaoImpl; import com.cloud.network.dao.FirewallRulesCidrsDaoImpl; import com.cloud.network.dao.FirewallRulesDaoImpl; import com.cloud.network.dao.IPAddressDaoImpl; @@ -136,7 +137,7 @@ import com.cloud.vm.dao.VMInstanceDaoImpl; FirewallRulesCidrsDaoImpl.class, PhysicalNetworkDaoImpl.class, PhysicalNetworkTrafficTypeDaoImpl.class, PhysicalNetworkServiceProviderDaoImpl.class, LoadBalancerDaoImpl.class, NetworkServiceMapDaoImpl.class, PrimaryDataStoreDaoImpl.class, StoragePoolDetailsDaoImpl.class, AffinityGroupServiceImpl.class, - ComponentContext.class, AffinityGroupProcessor.class, UserVmVO.class, EventUtils.class, UserVmVO.class + ComponentContext.class, AffinityGroupProcessor.class, UserVmVO.class, EventUtils.class, UserVmVO.class, AccountGuestVlanMapDaoImpl.class }, includeFilters = { @Filter(value = AffinityApiTestConfiguration.Library.class, type = FilterType.CUSTOM) }, useDefaultFilters = false) public class AffinityApiTestConfiguration { diff --git a/server/test/org/apache/cloudstack/networkoffering/ChildTestConfiguration.java b/server/test/org/apache/cloudstack/networkoffering/ChildTestConfiguration.java index 709dfe29ed1..d47deaa7018 100644 --- a/server/test/org/apache/cloudstack/networkoffering/ChildTestConfiguration.java +++ b/server/test/org/apache/cloudstack/networkoffering/ChildTestConfiguration.java @@ -53,6 +53,7 @@ import com.cloud.network.NetworkManager; import com.cloud.network.NetworkModel; import com.cloud.network.NetworkService; import com.cloud.network.StorageNetworkManager; +import com.cloud.network.dao.AccountGuestVlanMapDaoImpl; import com.cloud.network.dao.FirewallRulesCidrsDaoImpl; import com.cloud.network.dao.FirewallRulesDaoImpl; import com.cloud.network.dao.IPAddressDaoImpl; @@ -146,7 +147,8 @@ import com.cloud.vm.dao.VMInstanceDaoImpl; LoadBalancerDaoImpl.class, NetworkServiceMapDaoImpl.class, PrimaryDataStoreDaoImpl.class, - StoragePoolDetailsDaoImpl.class + StoragePoolDetailsDaoImpl.class, + AccountGuestVlanMapDaoImpl.class }, includeFilters={@Filter(value=ChildTestConfiguration.Library.class, type=FilterType.CUSTOM)}, useDefaultFilters=false diff --git a/setup/db/db/schema-410to420.sql b/setup/db/db/schema-410to420.sql index 99b476d4581..c8ac1ecfc2e 100644 --- a/setup/db/db/schema-410to420.sql +++ b/setup/db/db/schema-410to420.sql @@ -1115,6 +1115,7 @@ CREATE VIEW `cloud`.`account_view` AS and async_job.instance_type = 'Account' and async_job.job_status = 0; + alter table `cloud_usage`.`usage_network_offering` add column nic_id bigint(20) unsigned NOT NULL; ALTER TABLE `cloud`.`data_center_details` MODIFY value varchar(1024); ALTER TABLE `cloud`.`cluster_details` MODIFY value varchar(255); @@ -1126,3 +1127,19 @@ INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Network', 'DEFAULT', 'manage alter table cloud.vpc_gateways add column source_nat boolean default false; alter table cloud.private_ip_address add column source_nat boolean default false; + +CREATE TABLE `cloud`.`account_vnet_map` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `uuid` varchar(255) UNIQUE, + `vnet_range` varchar(255) NOT NULL COMMENT 'dedicated guest vlan range', + `account_id` bigint unsigned NOT NULL COMMENT 'account id. foreign key to account table', + `physical_network_id` bigint unsigned NOT NULL COMMENT 'physical network id. foreign key to the the physical network table', + PRIMARY KEY (`id`), + CONSTRAINT `fk_account_vnet_map__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network` (`id`) ON DELETE CASCADE, + INDEX `i_account_vnet_map__physical_network_id`(`physical_network_id`), + CONSTRAINT `fk_account_vnet_map__account_id` FOREIGN KEY (`account_id`) REFERENCES `account` (`id`) ON DELETE CASCADE, + INDEX `i_account_vnet_map__account_id`(`account_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +ALTER TABLE `cloud`.`op_dc_vnet_alloc` ADD COLUMN account_vnet_map_id bigint unsigned; +ALTER TABLE `cloud`.`op_dc_vnet_alloc` ADD CONSTRAINT `fk_op_dc_vnet_alloc__account_vnet_map_id` FOREIGN KEY `fk_op_dc_vnet_alloc__account_vnet_map_id` (`account_vnet_map_id`) REFERENCES `account_vnet_map` (`id`); diff --git a/test/integration/smoke/test_guest_vlan_range.py b/test/integration/smoke/test_guest_vlan_range.py new file mode 100644 index 00000000000..eca0e61f137 --- /dev/null +++ b/test/integration/smoke/test_guest_vlan_range.py @@ -0,0 +1,157 @@ +# 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. +""" P1 tests for Dedicating Guest Vlan Ranges +""" +#Import Local Modules +import marvin +from nose.plugins.attrib import attr +from marvin.cloudstackTestCase import * +from marvin.cloudstackAPI import * +from marvin.integration.lib.utils import * +from marvin.integration.lib.base import * +from marvin.integration.lib.common import * +import datetime + + +class Services: + """Test Dedicating Guest Vlan Ranges + """ + + def __init__(self): + self.services = { + "domain": { + "name": "Domain", + }, + "account": { + "email": "test@test.com", + "firstname": "Test", + "lastname": "User", + "username": "test", + "password": "password", + }, + "name": "testphysicalnetwork" + } + + +class TesDedicateGuestVlanRange(cloudstackTestCase): + + @classmethod + def setUpClass(cls): + cls.api_client = super(TesDedicateGuestVlanRange, cls).getClsTestClient().getApiClient() + cls.services = Services().services + # Get Zone, Domain + cls.domain = get_domain(cls.api_client, cls.services) + cls.zone = get_zone(cls.api_client, cls.services) + + # Create Account + cls.account = Account.create( + cls.api_client, + cls.services["account"], + domainid=cls.domain.id + ) + cls._cleanup = [ + #cls.account, + ] + return + + @classmethod + def tearDownClass(cls): + try: + # Cleanup resources used + cleanup_resources(cls.api_client, cls._cleanup) + except Exception as e: + raise Exception("Warning: Exception during cleanup : %s" % e) + return + + def setUp(self): + self.apiclient = self.testClient.getApiClient() + self.dbclient = self.testClient.getDbConnection() + self.cleanup = [] + return + + def tearDown(self): + try: + # Clean up + cleanup_resources(self.apiclient, self.cleanup) + except Exception as e: + raise Exception("Warning: Exception during cleanup : %s" % e) + return + + @attr(tags=["simulator", "advanced", "guestvlanrange", "dedicate", "release"]) + def test_dedicateGuestVlanRange(self): + """Test guest vlan range dedication + """ + + """Assume a physical network is available + """ + # Validate the following: + # 1. List the available physical network using ListPhysicalNetwork + # 2. Add a Guest Vlan range to the available physical network using UpdatePhysicalNetwork + # 3. Dedicate the created guest vlan range to user account using DedicateGuestVlanRange + # 4. Verify vlan range is dedicated with listDedicatedGuestVlanRanges + # 5. Release the dedicated guest vlan range back to the system + # 6. Verify guest vlan range has been released, verify with listDedicatedGuestVlanRanges + # 7. Remove the added guest vlan range using UpdatePhysicalNetwork + + self.debug("Listing available physical network") + list_physical_network_response = PhysicalNetwork.list( + self.apiclient + ) + self.assertEqual( + isinstance(list_physical_network_response, list), + True, + "Check for list guest vlan range response" + ) + physical_network_response = list_physical_network_response[0] + + self.debug("Adding guest vlan range") + addGuestVlanRangeResponse = physical_network_response.update(self.apiclient, id=physical_network_response.id, vlan="387-390") + + self.debug("Dedicating guest vlan range"); + dedicate_guest_vlan_range_response = PhysicalNetwork.dedicate( + self.apiclient, + "387-390", + physicalnetworkid=physical_network_response.id, + account=self.account.name, + domainid=self.account.domainid + ) + list_dedicated_guest_vlan_range_response = PhysicalNetwork.listDedicated( + self.apiclient, + id=dedicate_guest_vlan_range_response.id + ) + dedicated_guest_vlan_response = list_dedicated_guest_vlan_range_response[0] + self.assertEqual( + dedicated_guest_vlan_response.account, + self.account.name, + "Check account name is in listDedicatedGuestVlanRanges as the account the range is dedicated to" + ) + + self.debug("Releasing guest vlan range"); + dedicated_guest_vlan_response.release(self.apiclient) + list_dedicated_guest_vlan_range_response = PhysicalNetwork.listDedicated( + self.apiclient, + id=dedicate_guest_vlan_range_response.id + ) + dedicated_guest_vlan_response = list_dedicated_guest_vlan_range_response[0] + self.assertEqual( + dedicated_guest_vlan_response.account, + "system", + "Check account name is system account in listDedicatedGuestVlanRanges" + ) + + self.debug("Removing guest vlan range") + removeGuestVlanRangeResponse = physical_network_response.update(self.apiclient, id=physical_network_response.id, removevlan="387-390") diff --git a/tools/marvin/marvin/integration/lib/base.py b/tools/marvin/marvin/integration/lib/base.py index bebf2b50bcf..dc7fe60589c 100755 --- a/tools/marvin/marvin/integration/lib/base.py +++ b/tools/marvin/marvin/integration/lib/base.py @@ -2178,6 +2178,33 @@ class PhysicalNetwork: cmd.traffictype = type return apiclient.addTrafficType(cmd) + @classmethod + def dedicate(cls, apiclient, vlanrange, physicalnetworkid, account=None, domainid=None, projectid=None): + """Dedicate guest vlan range""" + + cmd = dedicateGuestVlanRange.dedicateGuestVlanRangeCmd() + cmd.vlanrange = vlanrange + cmd.physicalnetworkid = physicalnetworkid + cmd.account = account + cmd.domainid = domainid + cmd.projectid = projectid + return PhysicalNetwork(apiclient.dedicateGuestVlanRange(cmd).__dict__) + + def release(self, apiclient): + """Release guest vlan range""" + + cmd = releaseDedicatedGuestVlanRange.releaseDedicatedGuestVlanRangeCmd() + cmd.id = self.id + return apiclient.releaseDedicatedGuestVlanRange(cmd) + + @classmethod + def listDedicated(cls, apiclient, **kwargs): + """Lists all dedicated guest vlan ranges""" + + cmd = listDedicatedGuestVlanRanges.listDedicatedGuestVlanRangesCmd() + [setattr(cmd, k, v) for k, v in kwargs.items()] + return map(lambda pn : PhysicalNetwork(pn.__dict__), apiclient.listDedicatedGuestVlanRanges(cmd)) + @classmethod def list(cls, apiclient, **kwargs): """Lists all physical networks""" From 63fbdbb96f02b1da81245d12e9974c6c2f7d93e2 Mon Sep 17 00:00:00 2001 From: Pranav Saxena Date: Mon, 6 May 2013 13:45:32 +0530 Subject: [PATCH 08/66] CLOUDSTACK-2337:Resize button available for root/domain admin and normal users --- ui/scripts/storage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/scripts/storage.js b/ui/scripts/storage.js index d73974a89f5..e81633466bc 100644 --- a/ui/scripts/storage.js +++ b/ui/scripts/storage.js @@ -1612,7 +1612,7 @@ if(jsonObj.hypervisor != "Ovm" && jsonObj.state == "Ready") { allowedActions.push("takeSnapshot"); allowedActions.push("recurringSnapshot"); - if((jsonObj.hypervisor == "XenServer" || jsonObj.hypervisor == "KVM" || jsonObj.hypervisor == "VMware") && jsonObj.type == "DATADISK") { + if(jsonObj.type == "DATADISK") { allowedActions.push("resize"); } } From e6ae66d596cda320329b4a481b81bd7be981058b Mon Sep 17 00:00:00 2001 From: Pranav Saxena Date: Mon, 6 May 2013 14:08:40 +0530 Subject: [PATCH 09/66] scaleUp VM response change corresponding UI changes --- ui/scripts/instances.js | 2 +- ui/scripts/system.js | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/ui/scripts/instances.js b/ui/scripts/instances.js index 27ad5990685..e5d7d14569b 100644 --- a/ui/scripts/instances.js +++ b/ui/scripts/instances.js @@ -1247,7 +1247,7 @@ dataType: "json", async: true, success: function(json) { - var jid = json.scalevirtualmachineresponse.jobid; + // var jid = json.scalevirtualmachineresponse.jobid; args.response.success(); /* {_custom: {jobId: jid, diff --git a/ui/scripts/system.js b/ui/scripts/system.js index f2017cd948f..dc09ea86926 100644 --- a/ui/scripts/system.js +++ b/ui/scripts/system.js @@ -5421,9 +5421,9 @@ dataType: "json", async: true, success: function(json) { - var jid = json.scalevirtualmachineresponse.jobid; - args.response.success( - {_custom: + // var jid = json.scalevirtualmachineresponse.jobid; + args.response.success(); + /* {_custom: {jobId: jid, getUpdatedItem: function(json) { return json.queryasyncjobresultresponse.jobresult.virtualmachine; @@ -5433,8 +5433,8 @@ } } - } - ); + } */ + }, error:function(json){ args.response.error(parseXMLHttpResponse(json)); @@ -6305,9 +6305,9 @@ dataType: "json", async: true, success: function(json) { - var jid = json.scalevirtualmachineresponse.jobid; - args.response.success( - {_custom: + // var jid = json.scalevirtualmachineresponse.jobid; + args.response.success(); + /* {_custom: {jobId: jid, getUpdatedItem: function(json) { return json.queryasyncjobresultresponse.jobresult.virtualmachine; @@ -6316,8 +6316,8 @@ return vmActionfilter; } } - } - ); + }*/ + }, error:function(json){ args.response.error(parseXMLHttpResponse(json)); From 70c936bb852cac885ab20ffc7276515215c08026 Mon Sep 17 00:00:00 2001 From: sanjeevneelarapu Date: Tue, 30 Apr 2013 20:09:46 +0530 Subject: [PATCH 10/66] CLOUDSTACK-702: Tests for Multiple IP Ranges 1.Deleting IP Range from the existing CIDR 2.Add non-contiguous guest IP range in new CIDR 3.Add overlapped guest IP range in existing CIDR Signed-off-by: sanjeevneelarapu Signed-off-by: Prasanna Santhanam --- .../component/test_multiple_ip_ranges.py | 172 ++++++++++++++++-- 1 file changed, 152 insertions(+), 20 deletions(-) diff --git a/test/integration/component/test_multiple_ip_ranges.py b/test/integration/component/test_multiple_ip_ranges.py index 489e7ca3bdf..29942bd3af2 100644 --- a/test/integration/component/test_multiple_ip_ranges.py +++ b/test/integration/component/test_multiple_ip_ranges.py @@ -18,6 +18,7 @@ """ from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * +from marvin.cloudstackException import cloudstackAPIException from marvin.integration.lib.utils import * from marvin.integration.lib.base import * from marvin.integration.lib.common import * @@ -88,7 +89,7 @@ class TestMultipleIpRanges(cloudstackTestCase): cls.services["account"], domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls._cleanup = [ cls.account, ] @@ -144,23 +145,23 @@ class TestMultipleIpRanges(cloudstackTestCase): "check list vlan response" ) self.assertEqual( - vlan[0].startip, - services["startip"], + str(vlan[0].startip), + str(services["startip"]), "Start IP in vlan ip range is not matched with the configured start ip" ) self.assertEqual( - vlan[0].endip, - services["endip"], + str(vlan[0].endip), + str(services["endip"]), "End IP in vlan ip range is not matched with the configured end ip" ) self.assertEqual( - vlan[0].gateway, - services["gateway"], + str(vlan[0].gateway), + str(services["gateway"]), "gateway in vlan ip range is not matched with the configured gateway" ) self.assertEqual( - vlan[0].netmask, - services["netmask"], + str(vlan[0].netmask), + str(services["netmask"]), "netmask in vlan ip range is not matched with the configured netmask" ) return @@ -172,12 +173,13 @@ class TestMultipleIpRanges(cloudstackTestCase): #call increment_cidr function to get exiting cidr from the setup and increment it ip2 = self.increment_cidr() test_nw = ip2.network + ip = IPAddress(test_nw) #Add IP range(5 IPs) in the new CIDR - test_gateway = test_nw+1 - test_startIp = test_nw+2 - test_endIp = test_startIp+5 - test_startIp2= test_endIp+5 - test_endIp2 = test_startIp2+5 + test_gateway = ip.__add__(1) + test_startIp = ip.__add__(3) + test_endIp = ip.__add__(10) + test_startIp2= ip.__add__(11) + test_endIp2 = ip.__add__(15) #Populating services with new IP range self.services["vlan_ip_range"]["startip"] = test_startIp self.services["vlan_ip_range"]["endip"] = test_endIp @@ -189,7 +191,7 @@ class TestMultipleIpRanges(cloudstackTestCase): new_vlan = PublicIpRange.create(self.apiclient, self.services["vlan_ip_range"]) self.debug("Created new vlan range with startip:%s and endip:%s" %(test_startIp,test_endIp)) self.cleanup.append(new_vlan) - new_vlan_res = new_vlan.list(self.apiclient,new_vlan.id) + new_vlan_res = new_vlan.list(self.apiclient,id=new_vlan.vlan.id) #Compare list output with configured values self.verify_vlan_range(new_vlan_res,self.services["vlan_ip_range"]) #Add few more ips in the same CIDR @@ -199,7 +201,7 @@ class TestMultipleIpRanges(cloudstackTestCase): self.debug("Created new vlan range with startip:%s and endip:%s" %(test_startIp2,test_endIp2)) self.cleanup.append(new_vlan2) #list new vlan ip range - new_vlan2_res = new_vlan2.list(self.apiclient,new_vlan2.id) + new_vlan2_res = new_vlan2.list(self.apiclient,id=new_vlan2.vlan.id) #Compare list output with configured values self.verify_vlan_range(new_vlan2_res,self.services["vlan_ip_range"]) return @@ -215,10 +217,11 @@ class TestMultipleIpRanges(cloudstackTestCase): #call increment_cidr function to get exiting cidr from the setup and increment it ip2 = self.increment_cidr() test_nw = ip2.network + ip = IPAddress(test_nw) #Add IP range(5 IPs) in the new CIDR - test_gateway = test_nw+1 - test_startIp = test_nw+2 - test_endIp = test_startIp+5 + test_gateway = ip.__add__(1) + test_startIp = ip.__add__(3) + test_endIp = ip.__add__(10) #Populating services with new IP range self.services["vlan_ip_range"]["startip"] = test_startIp self.services["vlan_ip_range"]["endip"] = test_endIp @@ -230,9 +233,138 @@ class TestMultipleIpRanges(cloudstackTestCase): new_vlan = PublicIpRange.create(self.apiclient, self.services["vlan_ip_range"]) self.debug("Created new vlan range with startip:%s and endip:%s" %(test_startIp,test_endIp)) self.cleanup.append(new_vlan) - new_vlan_res = new_vlan.list(self.apiclient,new_vlan.id) + new_vlan_res = new_vlan.list(self.apiclient,id=new_vlan.vlan.id) #Compare list output with configured values self.verify_vlan_range(new_vlan_res,self.services["vlan_ip_range"]) return + @attr(tags=["advanced-sg", "sg"]) + def test_03_del_ip_range(self): + """Test delete ip range + Steps: + 1.Add ip range in same/new cidr + 2.delete the ip range added at step1 + 3.Verify the ip range deletion using list APIs + """ + #call increment_cidr function to get exiting cidr from the setup and increment it + ip2 = self.increment_cidr() + test_nw = ip2.network + ip = IPAddress(test_nw) + #Add IP range(5 IPs) in the new CIDR + test_gateway = ip.__add__(1) + test_startIp = ip.__add__(3) + test_endIp = ip.__add__(10) + #Populating services with new IP range + self.services["vlan_ip_range"]["startip"] = test_startIp + self.services["vlan_ip_range"]["endip"] = test_endIp + self.services["vlan_ip_range"]["gateway"] = test_gateway + self.services["vlan_ip_range"]["netmask"] = self.netmask + self.services["vlan_ip_range"]["zoneid"] = self.zone.id + self.services["vlan_ip_range"]["podid"] = self.pod.id + #create new vlan ip range + new_vlan = PublicIpRange.create(self.apiclient, self.services["vlan_ip_range"]) + self.debug("Created new vlan range with startip:%s and endip:%s" %(test_startIp,test_endIp)) + new_vlan_res = new_vlan.list(self.apiclient,id=new_vlan.vlan.id) + #Compare list output with configured values + self.verify_vlan_range(new_vlan_res,self.services["vlan_ip_range"]) + #Delete the above IP range + new_vlan.delete(self.apiclient) + #listing vlan ip ranges with the id should through exception , if not mark the test case as failed + try: + new_vlan.list(self.apiclient, id=new_vlan.vlan.id) + except cloudstackAPIException as cs: + self.debug(cs.errorMsg) + self.assertTrue(cs.errorMsg.find("entity does not exist")>0, msg="Failed to delete IP range") + return + + @attr(tags=["advanced-sg", "sg"]) + def test_04_add_noncontiguous_ip_range(self): + """Test adding non-contiguous ip range in existing cidr + + 1.Add ip range in new cidr + 1.Add non-contigous ip range in cidr added at step1 + 2.Verify the ip range using list APIs + """ + #call increment_cidr function to get exiting cidr from the setup and increment it + ip2 = self.increment_cidr() + test_nw = ip2.network + ip = IPAddress(test_nw) + #Add IP range(5 IPs) in the new CIDR + test_gateway = ip.__add__(1) + test_startIp = ip.__add__(50) + test_endIp = ip.__add__(60) + #Populating services with new IP range + self.services["vlan_ip_range"]["startip"] = test_startIp + self.services["vlan_ip_range"]["endip"] = test_endIp + self.services["vlan_ip_range"]["gateway"] = test_gateway + self.services["vlan_ip_range"]["netmask"] = self.netmask + self.services["vlan_ip_range"]["zoneid"] = self.zone.id + self.services["vlan_ip_range"]["podid"] = self.pod.id + #create new vlan ip range + new_vlan = PublicIpRange.create(self.apiclient, self.services["vlan_ip_range"]) + self.debug("Created new vlan range with startip:%s and endip:%s" %(test_startIp,test_endIp)) + self.cleanup.append(new_vlan) + new_vlan_res = new_vlan.list(self.apiclient,id=new_vlan.vlan.id) + #Compare list output with configured values + self.verify_vlan_range(new_vlan_res,self.services["vlan_ip_range"]) + #Add non-contiguous ip range in exiting cidr + test_startIp2 = ip.__add__(10) + test_endIp2 = ip.__add__(20) + #Populating services with new IP range + self.services["vlan_ip_range"]["startip"] = test_startIp2 + self.services["vlan_ip_range"]["endip"] = test_endIp2 + #create new vlan ip range + new_vlan = PublicIpRange.create(self.apiclient, self.services["vlan_ip_range"]) + self.debug("Created new vlan range with startip:%s and endip:%s" %(test_startIp,test_endIp)) + self.cleanup.append(new_vlan) + new_vlan_res = new_vlan.list(self.apiclient,id=new_vlan.vlan.id) + #Compare list output with configured values + self.verify_vlan_range(new_vlan_res,self.services["vlan_ip_range"]) + return + + @attr(tags=["advanced-sg", "sg"]) + def test_05_add_overlapped_ip_range(self): + """Test adding overlapped ip range in existing cidr + + 1.Add ip range in new cidr e.g:10.147.40.10-10.147.40.100 + 2.Add ip range overlapped with the ip range in step1 e.g.10.147.40.90-150 + """ + #call increment_cidr function to get exiting cidr from the setup and increment it + ip2 = self.increment_cidr() + test_nw = ip2.network + ip = IPAddress(test_nw) + #Add IP range in the new CIDR + test_gateway = ip.__add__(1) + test_startIp = ip.__add__(10) + test_endIp = ip.__add__(100) + test_startIp2 = ip.__add__(90) + test_endIp2 = ip.__add__(150) + #Populating services with new IP range + self.services["vlan_ip_range"]["startip"] = test_startIp + self.services["vlan_ip_range"]["endip"] = test_endIp + self.services["vlan_ip_range"]["gateway"] = test_gateway + self.services["vlan_ip_range"]["netmask"] = self.netmask + self.services["vlan_ip_range"]["zoneid"] = self.zone.id + self.services["vlan_ip_range"]["podid"] = self.pod.id + #create new vlan ip range + new_vlan = PublicIpRange.create(self.apiclient, self.services["vlan_ip_range"]) + self.debug("Created new vlan range with startip:%s and endip:%s" %(test_startIp,test_endIp)) + self.cleanup.append(new_vlan) + new_vlan_res = new_vlan.list(self.apiclient,id=new_vlan.vlan.id) + #Compare list output with configured values + self.verify_vlan_range(new_vlan_res,self.services["vlan_ip_range"]) + #Add overlapped ip range + #Populating services with new IP range + self.services["vlan_ip_range"]["startip"] = test_startIp2 + self.services["vlan_ip_range"]["endip"] = test_endIp2 + #Try to create ip range overlapped with exiting ip range + try: + PublicIpRange.create(self.apiclient, self.services["vlan_ip_range"]) + except cloudstackAPIException as cs: + self.debug(cs.errorMsg) + self.assertTrue(cs.errorMsg.find("already has IPs that overlap with the new range")>0, msg="Fail:CS allowed adding overlapped ip ranges in guest cidr") + return + #Test will reach here there is a bug in overlap ip range checking + self.fail("CS should not accept overlapped ip ranges in guest traffic, but it allowed") + return From f0749ce62552bdd9c92b371d7c34e2c9bb5a8a28 Mon Sep 17 00:00:00 2001 From: Talluri Date: Fri, 3 May 2013 23:11:56 +0530 Subject: [PATCH 11/66] CLOUDSTACK-2323: fix test scripts to conform with library changes Signed-off-by: Prasanna Santhanam --- test/integration/component/test_accounts.py | 94 ++++---- .../component/test_blocker_bugs.py | 88 +++---- .../component/test_egress_rules.py | 198 ++++++++-------- test/integration/component/test_eip_elb.py | 122 +++++----- .../component/test_network_offering.py | 218 +++++++++--------- .../component/test_project_configs.py | 36 +-- .../component/test_project_limits.py | 18 +- .../component/test_project_resources.py | 58 ++--- .../component/test_project_usage.py | 58 ++--- test/integration/component/test_projects.py | 34 +-- .../component/test_resource_limits.py | 96 ++++---- test/integration/component/test_routers.py | 118 +++++----- .../component/test_security_groups.py | 206 ++++++++--------- test/integration/component/test_snapshots.py | 92 ++++---- .../component/test_storage_motion.py | 4 +- test/integration/component/test_templates.py | 44 ++-- test/integration/component/test_usage.py | 104 ++++----- .../component/test_vm_passwdenabled.py | 12 +- test/integration/component/test_volumes.py | 72 +++--- test/integration/component/test_vpn_users.py | 48 ++-- test/integration/smoke/test_iso.py | 18 +- test/integration/smoke/test_network.py | 156 ++++++------- test/integration/smoke/test_nic.py | 8 +- test/integration/smoke/test_routers.py | 60 ++--- test/integration/smoke/test_scale_vm.py | 4 +- test/integration/smoke/test_templates.py | 36 +-- test/integration/smoke/test_volumes.py | 24 +- 27 files changed, 1013 insertions(+), 1013 deletions(-) diff --git a/test/integration/component/test_accounts.py b/test/integration/component/test_accounts.py index 459cfb3a251..fb38e627582 100644 --- a/test/integration/component/test_accounts.py +++ b/test/integration/component/test_accounts.py @@ -162,11 +162,11 @@ class TestAccounts(cloudstackTestCase): self.apiclient, self.services["account"] ) - self.debug("Created account: %s" % account.account.name) + self.debug("Created account: %s" % account.name) self.cleanup.append(account) list_accounts_response = list_accounts( self.apiclient, - id=account.account.id + id=account.id ) self.assertEqual( isinstance(list_accounts_response, list), @@ -181,12 +181,12 @@ class TestAccounts(cloudstackTestCase): account_response = list_accounts_response[0] self.assertEqual( - account.account.accounttype, + account.accounttype, account_response.accounttype, "Check Account Type of Created account" ) self.assertEqual( - account.account.name, + account.name, account_response.name, "Check Account Name of Created account" ) @@ -194,8 +194,8 @@ class TestAccounts(cloudstackTestCase): user = User.create( self.apiclient, self.services["user"], - account=account.account.name, - domainid=account.account.domainid + account=account.name, + domainid=account.domainid ) self.debug("Created user: %s" % user.id) list_users_response = list_users( @@ -301,15 +301,15 @@ class TestRemoveUserFromAccount(cloudstackTestCase): user_1 = User.create( self.apiclient, self.services["user"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Created user: %s" % user_1.id) user_2 = User.create( self.apiclient, self.services["user"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Created user: %s" % user_2.id) self.cleanup.append(user_2) @@ -317,12 +317,12 @@ class TestRemoveUserFromAccount(cloudstackTestCase): vm_1 = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) self.debug("Deployed VM in account: %s, ID: %s" % ( - self.account.account.name, + self.account.name, vm_1.id )) self.cleanup.append(vm_1) @@ -330,12 +330,12 @@ class TestRemoveUserFromAccount(cloudstackTestCase): vm_2 = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) self.debug("Deployed VM in account: %s, ID: %s" % ( - self.account.account.name, + self.account.name, vm_2.id )) self.cleanup.append(vm_2) @@ -347,7 +347,7 @@ class TestRemoveUserFromAccount(cloudstackTestCase): # Account should exist after deleting user accounts_response = list_accounts( self.apiclient, - id=self.account.account.id + id=self.account.id ) self.assertEqual( isinstance(accounts_response, list), @@ -362,8 +362,8 @@ class TestRemoveUserFromAccount(cloudstackTestCase): ) vm_response = list_virtual_machines( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(vm_response, list), @@ -401,43 +401,43 @@ class TestRemoveUserFromAccount(cloudstackTestCase): user_1 = User.create( self.apiclient, self.services["user"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Created user: %s" % user_1.id) user_2 = User.create( self.apiclient, self.services["user"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Created user: %s" % user_2.id) vm_1 = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, + accountid=self.account.name, serviceofferingid=self.service_offering.id ) self.debug("Deployed VM in account: %s, ID: %s" % ( - self.account.account.name, + self.account.name, vm_1.id )) vm_2 = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, + accountid=self.account.name, serviceofferingid=self.service_offering.id ) self.debug("Deployed VM in account: %s, ID: %s" % ( - self.account.account.name, + self.account.name, vm_2.id )) # Get users associated with an account # (Total 3: 2 - Created & 1 default generated while account creation) users = list_users( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(users, list), @@ -468,7 +468,7 @@ class TestRemoveUserFromAccount(cloudstackTestCase): # Account is removed after last user is deleted account_response = list_accounts( self.apiclient, - id=self.account.account.id + id=self.account.id ) self.assertEqual( account_response, @@ -478,8 +478,8 @@ class TestRemoveUserFromAccount(cloudstackTestCase): # All VMs associated with account are removed. vm_response = list_virtual_machines( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( vm_response, @@ -490,8 +490,8 @@ class TestRemoveUserFromAccount(cloudstackTestCase): with self.assertRaises(Exception): list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) return @@ -1217,11 +1217,11 @@ class TestUserDetails(cloudstackTestCase): # Fetching the user details of account self.debug( "Fetching user details for account: %s" % - self.account.account.name) + self.account.name) users = User.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(users, list), @@ -1304,11 +1304,11 @@ class TestUserDetails(cloudstackTestCase): # Fetching the user details of account self.debug( "Fetching user details for account: %s" % - self.account.account.name) + self.account.name) users = User.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(users, list), @@ -1391,11 +1391,11 @@ class TestUserDetails(cloudstackTestCase): # Fetching the user details of account self.debug( "Fetching user details for account: %s" % - self.account.account.name) + self.account.name) users = User.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(users, list), @@ -1515,7 +1515,7 @@ class TestUserLogin(cloudstackTestCase): self.debug("Logging into the cloudstack with login API") respose = User.login( self.apiclient, - username=self.account.account.name, + username=self.account.name, password=self.services["account"]["password"] ) self.assertEqual(respose, None, "Login response should not be none") @@ -1572,8 +1572,8 @@ class TestUserLogin(cloudstackTestCase): accounts = Account.list( self.apiclient, - name=self.account.account.name, - domainid=self.account.account.domainid, + name=self.account.name, + domainid=self.account.domainid, listall=True ) @@ -1586,7 +1586,7 @@ class TestUserLogin(cloudstackTestCase): self.debug("Logging into the cloudstack with login API") respose = User.login( self.apiclient, - username=self.account.account.name, + username=self.account.name, password=self.services["account"]["password"] ) self.assertEqual(respose, None, "Login response should not be none") diff --git a/test/integration/component/test_blocker_bugs.py b/test/integration/component/test_blocker_bugs.py index bfd1c13cb19..a6ea25a846a 100644 --- a/test/integration/component/test_blocker_bugs.py +++ b/test/integration/component/test_blocker_bugs.py @@ -136,7 +136,7 @@ class TestSnapshots(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, @@ -146,8 +146,8 @@ class TestSnapshots(cloudstackTestCase): cls.api_client, cls.services["virtual_machine"], templateid=cls.template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id, mode=cls.services["mode"] ) @@ -204,8 +204,8 @@ class TestSnapshots(cloudstackTestCase): self.apiclient, self.services["volume"], zoneid=self.zone.id, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, diskofferingid=self.disk_offering.id ) self.debug("Created volume with ID: %s" % volume.id) @@ -283,8 +283,8 @@ class TestSnapshots(cloudstackTestCase): snapshot = Snapshot.create( self.apiclient, volume_response.id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Created snapshot: %s" % snapshot.id) #Create volume from snapshot @@ -292,8 +292,8 @@ class TestSnapshots(cloudstackTestCase): self.apiclient, snapshot.id, self.services["volume"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Created Volume: %s from Snapshot: %s" % ( volume_from_snapshot.id, @@ -323,12 +323,12 @@ class TestSnapshots(cloudstackTestCase): self.apiclient, self.services["virtual_machine"], templateid=self.template.id, - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, mode=self.services["mode"] ) - self.debug("Deployed new VM for account: %s" % self.account.account.name) + self.debug("Deployed new VM for account: %s" % self.account.name) self.cleanup.append(new_virtual_machine) self.debug("Attaching volume: %s to VM: %s" % ( @@ -434,7 +434,7 @@ class TestTemplate(cloudstackTestCase): cls.services["account"], domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls._cleanup = [ cls.account, @@ -471,8 +471,8 @@ class TestTemplate(cloudstackTestCase): self.apiclient, self.services["templates"], zoneid=self.zone.id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Registering template with ID: %s" % template.id) try: @@ -519,8 +519,8 @@ class TestTemplate(cloudstackTestCase): self.apiclient, self.services["virtual_machine"], templateid=template.id, - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, ) self.debug("Deployed VM with ID: %s " % virtual_machine.id) @@ -565,15 +565,15 @@ class TestNATRules(cloudstackTestCase): cls.api_client, cls.services["virtual_machine"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id ) cls.public_ip = PublicIPAddress.create( cls.api_client, - accountid=cls.account.account.name, + accountid=cls.account.name, zoneid=cls.zone.id, - domainid=cls.account.account.domainid, + domainid=cls.account.domainid, services=cls.services["virtual_machine"] ) cls._cleanup = [ @@ -817,23 +817,23 @@ class TestRouters(cloudstackTestCase): vm_1 = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.admin_account.account.name, - domainid=self.admin_account.account.domainid, + accountid=self.admin_account.name, + domainid=self.admin_account.domainid, serviceofferingid=self.service_offering.id ) self.debug("Deployed VM with ID: %s" % vm_1.id) vm_2 = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.user_account.account.name, - domainid=self.user_account.account.domainid, + accountid=self.user_account.name, + domainid=self.user_account.domainid, serviceofferingid=self.service_offering.id ) self.debug("Deployed VM with ID: %s" % vm_2.id) routers = list_routers( self.apiclient, - account=self.admin_account.account.name, - domainid=self.admin_account.account.domainid, + account=self.admin_account.name, + domainid=self.admin_account.domainid, ) self.assertEqual( isinstance(routers, list), @@ -887,8 +887,8 @@ class TestRouterRestart(cloudstackTestCase): cls.api_client, cls.services["virtual_machine"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id ) cls.cleanup = [ @@ -927,8 +927,8 @@ class TestRouterRestart(cloudstackTestCase): # Find router associated with user account list_router_response = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(list_router_response, list), @@ -945,8 +945,8 @@ class TestRouterRestart(cloudstackTestCase): while True: networks = Network.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) network = networks[0] if network.state in ["Implemented", "Setup"]: @@ -966,8 +966,8 @@ class TestRouterRestart(cloudstackTestCase): # Get router details after restart list_router_response = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(list_router_response, list), @@ -1009,7 +1009,7 @@ class TestTemplates(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, cls.services["service_offering"] @@ -1020,8 +1020,8 @@ class TestTemplates(cloudstackTestCase): cls.api_client, cls.services["virtual_machine"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id, ) #Stop virtual machine @@ -1091,8 +1091,8 @@ class TestTemplates(cloudstackTestCase): self.apiclient, self.services["templates"], self.volume.id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Creating template with ID: %s" % template.id) # Volume and Template Size should be same @@ -1121,8 +1121,8 @@ class TestTemplates(cloudstackTestCase): snapshot = Snapshot.create( self.apiclient, self.volume.id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Created snapshot with ID: %s" % snapshot.id) snapshots = Snapshot.list( @@ -1203,8 +1203,8 @@ class TestTemplates(cloudstackTestCase): snapshot = Snapshot.create( self.apiclient, self.volume.id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Created snapshot with ID: %s" % snapshot.id) snapshots = Snapshot.list( diff --git a/test/integration/component/test_egress_rules.py b/test/integration/component/test_egress_rules.py index 7972aa50639..4af6eee94f4 100644 --- a/test/integration/component/test_egress_rules.py +++ b/test/integration/component/test_egress_rules.py @@ -175,7 +175,7 @@ class TestDefaultSecurityGroupEgress(cloudstackTestCase): admin=True, domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls._cleanup = [ cls.account, @@ -208,12 +208,12 @@ class TestDefaultSecurityGroupEgress(cloudstackTestCase): # 4. listVirtualMachines should show that the VM belongs to default # security group - self.debug("Deploying VM in account: %s" % self.account.account.name) + self.debug("Deploying VM in account: %s" % self.account.name) self.virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) self.debug("Deployed VM with ID: %s" % self.virtual_machine.id) @@ -260,8 +260,8 @@ class TestDefaultSecurityGroupEgress(cloudstackTestCase): # Verify listSecurity groups response security_groups = SecurityGroup.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(security_groups, list), @@ -333,7 +333,7 @@ class TestAuthorizeIngressRule(cloudstackTestCase): cls.services["account"], domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls._cleanup = [ cls.account, cls.service_offering @@ -371,15 +371,15 @@ class TestAuthorizeIngressRule(cloudstackTestCase): security_group = SecurityGroup.create( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Created security group with ID: %s" % security_group.id) # Default Security group should not have any ingress rule sercurity_groups = SecurityGroup.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(sercurity_groups, list), @@ -396,8 +396,8 @@ class TestAuthorizeIngressRule(cloudstackTestCase): ingress_rule = security_group.authorize( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(ingress_rule, dict), @@ -410,12 +410,12 @@ class TestAuthorizeIngressRule(cloudstackTestCase): self.virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, securitygroupids=[security_group.id] ) - self.debug("Deploying VM in account: %s" % self.account.account.name) + self.debug("Deploying VM in account: %s" % self.account.name) # Should be able to SSH VM try: self.debug("SSH into VM: %s" % self.virtual_machine.ssh_ip) @@ -491,7 +491,7 @@ class TestDefaultGroupEgress(cloudstackTestCase): cls.services["account"], domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls._cleanup = [ cls.account, cls.service_offering @@ -529,16 +529,16 @@ class TestDefaultGroupEgress(cloudstackTestCase): security_group = SecurityGroup.create( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Created security group with ID: %s" % security_group.id) # Default Security group should not have any ingress rule sercurity_groups = SecurityGroup.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(sercurity_groups, list), @@ -557,8 +557,8 @@ class TestDefaultGroupEgress(cloudstackTestCase): ingress_rule = security_group.authorize( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( @@ -575,8 +575,8 @@ class TestDefaultGroupEgress(cloudstackTestCase): egress_rule = security_group.authorizeEgress( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( @@ -589,12 +589,12 @@ class TestDefaultGroupEgress(cloudstackTestCase): self.virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, securitygroupids=[security_group.id] ) - self.debug("Deploying VM in account: %s" % self.account.account.name) + self.debug("Deploying VM in account: %s" % self.account.name) # Should be able to SSH VM try: @@ -692,7 +692,7 @@ class TestDefaultGroupEgressAfterDeploy(cloudstackTestCase): cls.services["account"], domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls._cleanup = [ cls.account, cls.service_offering @@ -730,16 +730,16 @@ class TestDefaultGroupEgressAfterDeploy(cloudstackTestCase): security_group = SecurityGroup.create( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Created security group with ID: %s" % security_group.id) # Default Security group should not have any ingress rule sercurity_groups = SecurityGroup.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(sercurity_groups, list), @@ -758,8 +758,8 @@ class TestDefaultGroupEgressAfterDeploy(cloudstackTestCase): ingress_rule = security_group.authorize( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( @@ -773,12 +773,12 @@ class TestDefaultGroupEgressAfterDeploy(cloudstackTestCase): self.virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, securitygroupids=[security_group.id] ) - self.debug("Deploying VM in account: %s" % self.account.account.name) + self.debug("Deploying VM in account: %s" % self.account.name) # Authorize Security group to SSH to VM self.debug( @@ -787,8 +787,8 @@ class TestDefaultGroupEgressAfterDeploy(cloudstackTestCase): egress_rule = security_group.authorizeEgress( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( @@ -875,7 +875,7 @@ class TestRevokeEgressRule(cloudstackTestCase): cls.services["account"], domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls._cleanup = [ cls.account, cls.service_offering @@ -915,16 +915,16 @@ class TestRevokeEgressRule(cloudstackTestCase): security_group = SecurityGroup.create( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Created security group with ID: %s" % security_group.id) # Default Security group should not have any ingress rule sercurity_groups = SecurityGroup.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(sercurity_groups, list), @@ -944,8 +944,8 @@ class TestRevokeEgressRule(cloudstackTestCase): ingress_rule = security_group.authorize( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( @@ -963,8 +963,8 @@ class TestRevokeEgressRule(cloudstackTestCase): egress_rule = security_group.authorizeEgress( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( @@ -977,12 +977,12 @@ class TestRevokeEgressRule(cloudstackTestCase): self.virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, securitygroupids=[security_group.id] ) - self.debug("Deploying VM in account: %s" % self.account.account.name) + self.debug("Deploying VM in account: %s" % self.account.name) # Should be able to SSH VM try: @@ -1033,7 +1033,7 @@ class TestRevokeEgressRule(cloudstackTestCase): "Revoke Egress Rule for Security Group %s for account: %s" \ % ( security_group.id, - self.account.account.name + self.account.name )) result = security_group.revokeEgress( @@ -1137,7 +1137,7 @@ class TestInvalidAccountAuthroize(cloudstackTestCase): cls.services["account"], domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls._cleanup = [ cls.account, cls.service_offering @@ -1173,16 +1173,16 @@ class TestInvalidAccountAuthroize(cloudstackTestCase): security_group = SecurityGroup.create( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Created security group with ID: %s" % security_group.id) # Default Security group should not have any ingress rule sercurity_groups = SecurityGroup.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(sercurity_groups, list), @@ -1205,7 +1205,7 @@ class TestInvalidAccountAuthroize(cloudstackTestCase): self.apiclient, self.services["security_group"], account=random_gen(), - domainid=self.account.account.domainid + domainid=self.account.domainid ) return @@ -1804,7 +1804,7 @@ class TestStartStopVMWithEgressRule(cloudstackTestCase): cls.services["account"], domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls._cleanup = [ cls.account, cls.service_offering @@ -1842,16 +1842,16 @@ class TestStartStopVMWithEgressRule(cloudstackTestCase): security_group = SecurityGroup.create( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Created security group with ID: %s" % security_group.id) # Default Security group should not have any ingress rule sercurity_groups = SecurityGroup.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(sercurity_groups, list), @@ -1871,8 +1871,8 @@ class TestStartStopVMWithEgressRule(cloudstackTestCase): ingress_rule = security_group.authorize( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( @@ -1886,12 +1886,12 @@ class TestStartStopVMWithEgressRule(cloudstackTestCase): self.virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, securitygroupids=[security_group.id] ) - self.debug("Deploying VM in account: %s" % self.account.account.name) + self.debug("Deploying VM in account: %s" % self.account.name) # Authorize Security group to SSH to VM self.debug( @@ -1900,8 +1900,8 @@ class TestStartStopVMWithEgressRule(cloudstackTestCase): egress_rule = security_group.authorizeEgress( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( @@ -2016,7 +2016,7 @@ class TestInvalidParametersForEgress(cloudstackTestCase): cls.services["account"], domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls._cleanup = [ cls.account, cls.service_offering @@ -2054,16 +2054,16 @@ class TestInvalidParametersForEgress(cloudstackTestCase): security_group = SecurityGroup.create( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Created security group with ID: %s" % security_group.id) # Default Security group should not have any ingress rule sercurity_groups = SecurityGroup.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(sercurity_groups, list), @@ -2085,8 +2085,8 @@ class TestInvalidParametersForEgress(cloudstackTestCase): egress_rule = security_group.authorizeEgress( self.apiclient, self.services["sg_invalid_port"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug( "Authorizing egress rule for sec group ID: %s with invalid cidr" @@ -2095,8 +2095,8 @@ class TestInvalidParametersForEgress(cloudstackTestCase): egress_rule = security_group.authorizeEgress( self.apiclient, self.services["sg_invalid_cidr"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug( "Authorizing egress rule for sec group ID: %s with invalid account" @@ -2106,7 +2106,7 @@ class TestInvalidParametersForEgress(cloudstackTestCase): self.apiclient, self.services["security_group"], account=random_gen(), - domainid=self.account.account.domainid + domainid=self.account.domainid ) self.debug( "Authorizing egress rule for sec group ID: %s with cidr: anywhere and port: 22" @@ -2114,8 +2114,8 @@ class TestInvalidParametersForEgress(cloudstackTestCase): egress_rule_A = security_group.authorizeEgress( self.apiclient, self.services["sg_cidr_anywhere"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( @@ -2127,8 +2127,8 @@ class TestInvalidParametersForEgress(cloudstackTestCase): egress_rule_R = security_group.authorizeEgress( self.apiclient, self.services["sg_cidr_restricted"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( @@ -2144,8 +2144,8 @@ class TestInvalidParametersForEgress(cloudstackTestCase): security_group.authorizeEgress( self.apiclient, self.services["sg_cidr_restricted"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) return @@ -2203,7 +2203,7 @@ class TestEgressAfterHostMaintainance(cloudstackTestCase): cls.services["account"], domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls._cleanup = [ cls.account, cls.service_offering @@ -2241,16 +2241,16 @@ class TestEgressAfterHostMaintainance(cloudstackTestCase): security_group = SecurityGroup.create( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Created security group with ID: %s" % security_group.id) # Default Security group should not have any ingress rule sercurity_groups = SecurityGroup.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(sercurity_groups, list), @@ -2270,8 +2270,8 @@ class TestEgressAfterHostMaintainance(cloudstackTestCase): ingress_rule = security_group.authorize( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( @@ -2289,8 +2289,8 @@ class TestEgressAfterHostMaintainance(cloudstackTestCase): egress_rule = security_group.authorizeEgress( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( @@ -2303,12 +2303,12 @@ class TestEgressAfterHostMaintainance(cloudstackTestCase): self.virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, securitygroupids=[security_group.id] ) - self.debug("Deploying VM in account: %s" % self.account.account.name) + self.debug("Deploying VM in account: %s" % self.account.name) # Should be able to SSH VM try: diff --git a/test/integration/component/test_eip_elb.py b/test/integration/component/test_eip_elb.py index c1ad50530b5..cb41859acd3 100644 --- a/test/integration/component/test_eip_elb.py +++ b/test/integration/component/test_eip_elb.py @@ -119,8 +119,8 @@ class TestEIP(cloudstackTestCase): cls.virtual_machine = VirtualMachine.create( cls.api_client, cls.services["virtual_machine"], - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id ) networks = Network.list( @@ -140,8 +140,8 @@ class TestEIP(cloudstackTestCase): cls.api_client, associatednetworkid=cls.guest_network.id, isstaticnat=True, - account=cls.account.account.name, - domainid=cls.account.account.domainid, + account=cls.account.name, + domainid=cls.account.domainid, listall=True ) if isinstance(ip_addrs, list): @@ -240,8 +240,8 @@ class TestEIP(cloudstackTestCase): # Verify listSecurity groups response security_groups = SecurityGroup.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(security_groups, list), @@ -262,8 +262,8 @@ class TestEIP(cloudstackTestCase): "Creating Ingress rule to allow SSH on default security group") cmd = authorizeSecurityGroupIngress.authorizeSecurityGroupIngressCmd() - cmd.domainid = self.account.account.domainid - cmd.account = self.account.account.name + cmd.domainid = self.account.domainid + cmd.account = self.account.name cmd.securitygroupid = security_group.id cmd.protocol = 'TCP' cmd.startport = 22 @@ -370,16 +370,16 @@ class TestEIP(cloudstackTestCase): public_ip = PublicIPAddress.create( self.apiclient, - accountid=self.account.account.name, + accountid=self.account.name, zoneid=self.zone.id, - domainid=self.account.account.domainid, + domainid=self.account.domainid, services=self.services["virtual_machine"] ) self.debug("IP address: %s is acquired by network: %s" % ( - public_ip.ipaddress.ipaddress, + public_ip.ipaddress, self.guest_network.id)) self.debug("Enabling static NAT for IP Address: %s" % - public_ip.ipaddress.ipaddress) + public_ip.ipaddress) StaticNATRule.enable( self.apiclient, @@ -390,11 +390,11 @@ class TestEIP(cloudstackTestCase): # Fetch details from user_ip_address table in database self.debug( "select is_system, one_to_one_nat from user_ip_address where public_ip_address='%s';" \ - % public_ip.ipaddress.ipaddress) + % public_ip.ipaddress) qresultset = self.dbclient.execute( "select is_system, one_to_one_nat from user_ip_address where public_ip_address='%s';" \ - % public_ip.ipaddress.ipaddress + % public_ip.ipaddress ) self.assertEqual( isinstance(qresultset, list), @@ -449,12 +449,12 @@ class TestEIP(cloudstackTestCase): ) # try: -# self.debug("SSH into VM: %s" % public_ip.ipaddress.ipaddress) +# self.debug("SSH into VM: %s" % public_ip.ipaddress) # ssh = self.virtual_machine.get_ssh_client( -# ipaddress=public_ip.ipaddress.ipaddress) +# ipaddress=public_ip.ipaddress) # except Exception as e: # self.fail("SSH Access failed for %s: %s" % \ -# (public_ip.ipaddress.ipaddress, e) +# (public_ip.ipaddress, e) # ) self.debug("SSH into netscaler: %s" % @@ -472,7 +472,7 @@ class TestEIP(cloudstackTestCase): self.debug("Output: %s" % result) self.assertEqual( - result.count(public_ip.ipaddress.ipaddress), + result.count(public_ip.ipaddress), 1, "One IP from EIP pool should be taken and configured on NS" ) @@ -484,7 +484,7 @@ class TestEIP(cloudstackTestCase): self.debug("Output: %s" % result) self.assertEqual( - result.count("NAME: Cloud-Inat-%s" % public_ip.ipaddress.ipaddress), + result.count("NAME: Cloud-Inat-%s" % public_ip.ipaddress), 1, "User source IP should be enabled for INAT service" ) @@ -517,8 +517,8 @@ class TestEIP(cloudstackTestCase): self.api_client, associatednetworkid=self.guest_network.id, isstaticnat=True, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, listall=True ) self.assertEqual( @@ -602,8 +602,8 @@ class TestEIP(cloudstackTestCase): self.api_client, associatednetworkid=self.guest_network.id, isstaticnat=True, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, listall=True ) self.assertEqual( @@ -711,8 +711,8 @@ class TestEIP(cloudstackTestCase): self.api_client, associatednetworkid=self.guest_network.id, isstaticnat=True, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, listall=True ) self.assertEqual( @@ -784,8 +784,8 @@ class TestEIP(cloudstackTestCase): self.api_client, associatednetworkid=self.guest_network.id, isstaticnat=True, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, listall=True ) self.assertEqual( @@ -942,15 +942,15 @@ class TestELB(cloudstackTestCase): cls.vm_1 = VirtualMachine.create( cls.api_client, cls.services["virtual_machine"], - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id ) cls.vm_2 = VirtualMachine.create( cls.api_client, cls.services["virtual_machine"], - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id ) networks = Network.list( @@ -968,9 +968,9 @@ class TestELB(cloudstackTestCase): cls.lb_rule = LoadBalancerRule.create( cls.api_client, cls.services["lbrule"], - accountid=cls.account.account.name, + accountid=cls.account.name, networkid=cls.guest_network.id, - domainid=cls.account.account.domainid + domainid=cls.account.domainid ) cls.lb_rule.assign(cls.api_client, [cls.vm_1, cls.vm_2]) @@ -1024,8 +1024,8 @@ class TestELB(cloudstackTestCase): # Verify listSecurity groups response security_groups = SecurityGroup.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(security_groups, list), @@ -1046,8 +1046,8 @@ class TestELB(cloudstackTestCase): "Creating Ingress rule to allow SSH on default security group") cmd = authorizeSecurityGroupIngress.authorizeSecurityGroupIngressCmd() - cmd.domainid = self.account.account.domainid - cmd.account = self.account.account.name + cmd.domainid = self.account.domainid + cmd.account = self.account.name cmd.securitygroupid = security_group.id cmd.protocol = 'TCP' cmd.startport = 22 @@ -1056,12 +1056,12 @@ class TestELB(cloudstackTestCase): self.apiclient.authorizeSecurityGroupIngress(cmd) self.debug( - "Fetching LB IP for account: %s" % self.account.account.name) + "Fetching LB IP for account: %s" % self.account.name) ip_addrs = PublicIPAddress.list( self.api_client, associatednetworkid=self.guest_network.id, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, forloadbalancing=True, listall=True ) @@ -1073,7 +1073,7 @@ class TestELB(cloudstackTestCase): lb_ip = ip_addrs[0] self.debug("LB IP generated for account: %s is: %s" % ( - self.account.account.name, + self.account.name, lb_ip.ipaddress )) #TODO: uncomment this after ssh issue is resolved @@ -1199,24 +1199,24 @@ class TestELB(cloudstackTestCase): public_ip = PublicIPAddress.create( self.apiclient, - accountid=self.account.account.name, + accountid=self.account.name, zoneid=self.zone.id, - domainid=self.account.account.domainid, + domainid=self.account.domainid, services=self.services["virtual_machine"] ) self.debug("IP address: %s is acquired by network: %s" % ( - public_ip.ipaddress.ipaddress, + public_ip.ipaddress, self.guest_network.id)) self.debug("Creating LB rule for public IP: %s" % - public_ip.ipaddress.ipaddress) + public_ip.ipaddress) lb_rule = LoadBalancerRule.create( self.apiclient, self.services["lbrule"], - accountid=self.account.account.name, + accountid=self.account.name, ipaddressid=public_ip.ipaddress.id, networkid=self.guest_network.id, - domainid=self.account.account.domaind + domainid=self.account.domaind ) self.debug("Assigning VMs (%s, %s) to LB rule: %s" % (self.vm_1.name, self.vm_2.name, @@ -1225,10 +1225,10 @@ class TestELB(cloudstackTestCase): #TODO: workaround : add route in the guest VM for SNIP # # self.debug("SSHing into VMs using ELB IP: %s" % -# public_ip.ipaddress.ipaddress) +# public_ip.ipaddress) # try: # ssh_1 = self.vm_1.get_ssh_client( -# ipaddress=public_ip.ipaddress.ipaddress) +# ipaddress=public_ip.ipaddress) # self.debug("Command: hostname") # result = ssh_1.execute("hostname") # self.debug("Result: %s" % result) @@ -1244,7 +1244,7 @@ class TestELB(cloudstackTestCase): # ) # # ssh_2 = self.vm_2.get_ssh_client( -# ipaddress=public_ip.ipaddress.ipaddress) +# ipaddress=public_ip.ipaddress) # self.debug("Command: hostname") # result = ssh_2.execute("hostname") # self.debug("Result: %s" % result) @@ -1265,11 +1265,11 @@ class TestELB(cloudstackTestCase): ## Fetch details from user_ip_address table in database self.debug( "select is_system from user_ip_address where public_ip_address='%s';" \ - % public_ip.ipaddress.ipaddress) + % public_ip.ipaddress) qresultset = self.dbclient.execute( "select is_system from user_ip_address where public_ip_address='%s';" \ - % public_ip.ipaddress.ipaddress) + % public_ip.ipaddress) self.assertEqual( isinstance(qresultset, list), @@ -1304,7 +1304,7 @@ class TestELB(cloudstackTestCase): self.debug("Output: %s" % result) self.assertEqual( - result.count(public_ip.ipaddress.ipaddress), + result.count(public_ip.ipaddress), 1, "One IP from EIP pool should be taken and configured on NS" ) @@ -1316,7 +1316,7 @@ class TestELB(cloudstackTestCase): self.debug("Output: %s" % result) self.assertEqual( - result.count("Cloud-VirtualServer-%s-22 (%s:22) - TCP" % (public_ip.ipaddress.ipaddress, public_ip.ipaddress.ipaddress)), + result.count("Cloud-VirtualServer-%s-22 (%s:22) - TCP" % (public_ip.ipaddress, public_ip.ipaddress)), 1, "User subnet IP should be enabled for LB service" ) @@ -1342,12 +1342,12 @@ class TestELB(cloudstackTestCase): # running and USNIP : ON self.debug( - "Fetching LB IP for account: %s" % self.account.account.name) + "Fetching LB IP for account: %s" % self.account.name) ip_addrs = PublicIPAddress.list( self.api_client, associatednetworkid=self.guest_network.id, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, forloadbalancing=True, listall=True ) @@ -1359,7 +1359,7 @@ class TestELB(cloudstackTestCase): lb_ip = ip_addrs[0] self.debug("LB IP generated for account: %s is: %s" % ( - self.account.account.name, + self.account.name, lb_ip.ipaddress )) @@ -1424,11 +1424,11 @@ class TestELB(cloudstackTestCase): # Fetch details from account_id table in database self.debug( "select id from account where account_name='%s';" \ - % self.account.account.name) + % self.account.name) qresultset = self.dbclient.execute( "select id from account where account_name='%s';" \ - % self.account.account.name) + % self.account.name) self.assertEqual( isinstance(qresultset, list), @@ -1467,7 +1467,7 @@ class TestELB(cloudstackTestCase): public_ip = qresult[0] self.debug( - "Fetching public IP for account: %s" % self.account.account.name) + "Fetching public IP for account: %s" % self.account.name) ip_addrs = PublicIPAddress.list( self.api_client, ipaddress=public_ip, diff --git a/test/integration/component/test_network_offering.py b/test/integration/component/test_network_offering.py index 8b12525103a..00566a0d400 100644 --- a/test/integration/component/test_network_offering.py +++ b/test/integration/component/test_network_offering.py @@ -256,21 +256,21 @@ class TestNOVirtualRouter(cloudstackTestCase): self.network = Network.create( self.apiclient, self.services["network"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, networkofferingid=self.network_offering.id, zoneid=self.zone.id ) self.debug("Created network with ID: %s" % self.network.id) - self.debug("Deploying VM in account: %s" % self.account.account.name) + self.debug("Deploying VM in account: %s" % self.account.name) # Spawn an instance in that network virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, networkids=[str(self.network.id)] ) @@ -279,8 +279,8 @@ class TestNOVirtualRouter(cloudstackTestCase): src_nat_list = PublicIPAddress.list( self.apiclient, associatednetworkid=self.network.id, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, listall=True, issourcenat=True, ) @@ -305,7 +305,7 @@ class TestNOVirtualRouter(cloudstackTestCase): self.apiclient, self.services["lbrule"], ipaddressid=src_nat.id, - accountid=self.account.account.name + accountid=self.account.name ) self.debug( "Trying to create a port forwarding rule in source NAT: %s" % @@ -322,18 +322,18 @@ class TestNOVirtualRouter(cloudstackTestCase): self.debug("Associating public IP for network: %s" % self.network.id) ip_with_nat_rule = PublicIPAddress.create( self.apiclient, - accountid=self.account.account.name, + accountid=self.account.name, zoneid=self.zone.id, - domainid=self.account.account.domainid, + domainid=self.account.domainid, networkid=self.network.id ) self.debug("Associated %s with network %s" % ( - ip_with_nat_rule.ipaddress.ipaddress, + ip_with_nat_rule.ipaddress, self.network.id )) self.debug("Creating PF rule for IP address: %s" % - ip_with_nat_rule.ipaddress.ipaddress) + ip_with_nat_rule.ipaddress) NATRule.create( self.apiclient, virtual_machine, @@ -342,7 +342,7 @@ class TestNOVirtualRouter(cloudstackTestCase): ) self.debug("Trying to create LB rule on IP with NAT: %s" % - ip_with_nat_rule.ipaddress.ipaddress) + ip_with_nat_rule.ipaddress) # Create Load Balancer rule on IP already having NAT rule with self.assertRaises(Exception): @@ -350,7 +350,7 @@ class TestNOVirtualRouter(cloudstackTestCase): self.apiclient, self.services["lbrule"], ipaddressid=ip_with_nat_rule.ipaddress.id, - accountid=self.account.account.name + accountid=self.account.name ) self.debug("Creating PF rule with public port: 66") @@ -376,27 +376,27 @@ class TestNOVirtualRouter(cloudstackTestCase): self.debug("Associating public IP for network: %s" % self.network.id) ip_with_lb_rule = PublicIPAddress.create( self.apiclient, - accountid=self.account.account.name, + accountid=self.account.name, zoneid=self.zone.id, - domainid=self.account.account.domainid, + domainid=self.account.domainid, networkid=self.network.id ) self.debug("Associated %s with network %s" % ( - ip_with_lb_rule.ipaddress.ipaddress, + ip_with_lb_rule.ipaddress, self.network.id )) self.debug("Creating LB rule for IP address: %s" % - ip_with_lb_rule.ipaddress.ipaddress) + ip_with_lb_rule.ipaddress) LoadBalancerRule.create( self.apiclient, self.services["lbrule"], ipaddressid=ip_with_lb_rule.ipaddress.id, - accountid=self.account.account.name + accountid=self.account.name ) self.debug("Trying to create PF rule on IP with LB rule: %s" % - ip_with_nat_rule.ipaddress.ipaddress) + ip_with_nat_rule.ipaddress) with self.assertRaises(Exception): NATRule.create( @@ -411,7 +411,7 @@ class TestNOVirtualRouter(cloudstackTestCase): self.apiclient, self.services["lbrule_port_2221"], ipaddressid=ip_with_lb_rule.ipaddress.id, - accountid=self.account.account.name + accountid=self.account.name ) # Check if NAT rule created successfully @@ -499,21 +499,21 @@ class TestNOVirtualRouter(cloudstackTestCase): self.network = Network.create( self.apiclient, self.services["network"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, networkofferingid=self.network_offering.id, zoneid=self.zone.id ) self.debug("Created network with ID: %s" % self.network.id) - self.debug("Deploying VM in account: %s" % self.account.account.name) + self.debug("Deploying VM in account: %s" % self.account.name) # Spawn an instance in that network virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, networkids=[str(self.network.id)] ) @@ -522,8 +522,8 @@ class TestNOVirtualRouter(cloudstackTestCase): src_nat_list = PublicIPAddress.list( self.apiclient, associatednetworkid=self.network.id, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, listall=True, issourcenat=True, ) @@ -547,7 +547,7 @@ class TestNOVirtualRouter(cloudstackTestCase): self.apiclient, self.services["lbrule"], ipaddressid=src_nat.id, - accountid=self.account.account.name + accountid=self.account.name ) self.debug("Created LB rule on source NAT: %s" % src_nat.ipaddress) @@ -624,18 +624,18 @@ class TestNOVirtualRouter(cloudstackTestCase): self.debug("Associating public IP for network: %s" % self.network.id) public_ip = PublicIPAddress.create( self.apiclient, - accountid=self.account.account.name, + accountid=self.account.name, zoneid=self.zone.id, - domainid=self.account.account.domainid, + domainid=self.account.domainid, networkid=self.network.id ) self.debug("Associated %s with network %s" % ( - public_ip.ipaddress.ipaddress, + public_ip.ipaddress, self.network.id )) self.debug("Creating PF rule for IP address: %s" % - public_ip.ipaddress.ipaddress) + public_ip.ipaddress) NATRule.create( self.apiclient, virtual_machine, @@ -644,14 +644,14 @@ class TestNOVirtualRouter(cloudstackTestCase): ) self.debug("Trying to create LB rule on IP with NAT: %s" % - public_ip.ipaddress.ipaddress) + public_ip.ipaddress) # Create Load Balancer rule on IP already having NAT rule lb_rule = LoadBalancerRule.create( self.apiclient, self.services["lbrule"], ipaddressid=public_ip.ipaddress.id, - accountid=self.account.account.name + accountid=self.account.name ) self.debug("Creating PF rule with public port: 66") @@ -679,7 +679,7 @@ class TestNOVirtualRouter(cloudstackTestCase): self.apiclient, self.services["lbrule_port_2221"], ipaddressid=public_ip.ipaddress.id, - accountid=self.account.account.name + accountid=self.account.name ) # Check if NAT rule created successfully @@ -700,8 +700,8 @@ class TestNOVirtualRouter(cloudstackTestCase): vpn = Vpn.create( self.apiclient, src_nat.id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) vpns = Vpn.list( @@ -834,21 +834,21 @@ class TestNOWithNetscaler(cloudstackTestCase): self.network = Network.create( self.apiclient, self.services["network"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, networkofferingid=self.network_offering.id, zoneid=self.zone.id ) self.debug("Created network with ID: %s" % self.network.id) - self.debug("Deploying VM in account: %s" % self.account.account.name) + self.debug("Deploying VM in account: %s" % self.account.name) # Spawn an instance in that network virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, networkids=[str(self.network.id)] ) @@ -857,8 +857,8 @@ class TestNOWithNetscaler(cloudstackTestCase): src_nat_list = PublicIPAddress.list( self.apiclient, associatednetworkid=self.network.id, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, listall=True, issourcenat=True, ) @@ -883,7 +883,7 @@ class TestNOWithNetscaler(cloudstackTestCase): self.apiclient, self.services["lbrule"], ipaddressid=src_nat.id, - accountid=self.account.account.name + accountid=self.account.name ) self.debug( @@ -930,18 +930,18 @@ class TestNOWithNetscaler(cloudstackTestCase): self.debug("Associating public IP for network: %s" % self.network.id) ip_with_nat_rule = PublicIPAddress.create( self.apiclient, - accountid=self.account.account.name, + accountid=self.account.name, zoneid=self.zone.id, - domainid=self.account.account.domainid, + domainid=self.account.domainid, networkid=self.network.id ) self.debug("Associated %s with network %s" % ( - ip_with_nat_rule.ipaddress.ipaddress, + ip_with_nat_rule.ipaddress, self.network.id )) self.debug("Creating PF rule for IP address: %s" % - ip_with_nat_rule.ipaddress.ipaddress) + ip_with_nat_rule.ipaddress) NATRule.create( self.apiclient, virtual_machine, @@ -950,7 +950,7 @@ class TestNOWithNetscaler(cloudstackTestCase): ) self.debug("Trying to create LB rule on IP with NAT: %s" % - ip_with_nat_rule.ipaddress.ipaddress) + ip_with_nat_rule.ipaddress) # Create Load Balancer rule on IP already having NAT rule with self.assertRaises(Exception): @@ -958,7 +958,7 @@ class TestNOWithNetscaler(cloudstackTestCase): self.apiclient, self.services["lbrule"], ipaddressid=ip_with_nat_rule.ipaddress.id, - accountid=self.account.account.name + accountid=self.account.name ) self.debug("Creating PF rule with public port: 66") @@ -984,28 +984,28 @@ class TestNOWithNetscaler(cloudstackTestCase): self.debug("Associating public IP for network: %s" % self.network.id) ip_with_lb_rule = PublicIPAddress.create( self.apiclient, - accountid=self.account.account.name, + accountid=self.account.name, zoneid=self.zone.id, - domainid=self.account.account.domainid, + domainid=self.account.domainid, networkid=self.network.id ) self.debug("Associated %s with network %s" % ( - ip_with_lb_rule.ipaddress.ipaddress, + ip_with_lb_rule.ipaddress, self.network.id )) self.debug("Creating LB rule for IP address: %s" % - ip_with_lb_rule.ipaddress.ipaddress) + ip_with_lb_rule.ipaddress) LoadBalancerRule.create( self.apiclient, self.services["lbrule"], ipaddressid=ip_with_lb_rule.ipaddress.id, - accountid=self.account.account.name, + accountid=self.account.name, networkid=self.network.id ) self.debug("Trying to create PF rule on IP with LB rule: %s" % - ip_with_nat_rule.ipaddress.ipaddress) + ip_with_nat_rule.ipaddress) with self.assertRaises(Exception): NATRule.create( @@ -1031,7 +1031,7 @@ class TestNOWithNetscaler(cloudstackTestCase): self.apiclient, self.services["lbrule_port_2221"], ipaddressid=ip_with_lb_rule.ipaddress.id, - accountid=self.account.account.name, + accountid=self.account.name, networkid=self.network.id ) @@ -1054,8 +1054,8 @@ class TestNOWithNetscaler(cloudstackTestCase): Vpn.create( self.apiclient, src_nat.id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) return @@ -1104,21 +1104,21 @@ class TestNOWithNetscaler(cloudstackTestCase): self.network = Network.create( self.apiclient, self.services["network"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, networkofferingid=self.network_offering.id, zoneid=self.zone.id ) self.debug("Created network with ID: %s" % self.network.id) - self.debug("Deploying VM in account: %s" % self.account.account.name) + self.debug("Deploying VM in account: %s" % self.account.name) # Spawn an instance in that network virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, networkids=[str(self.network.id)] ) @@ -1127,8 +1127,8 @@ class TestNOWithNetscaler(cloudstackTestCase): src_nat_list = PublicIPAddress.list( self.apiclient, associatednetworkid=self.network.id, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, listall=True, issourcenat=True, ) @@ -1153,7 +1153,7 @@ class TestNOWithNetscaler(cloudstackTestCase): self.apiclient, self.services["lbrule"], ipaddressid=src_nat.id, - accountid=self.account.account.name + accountid=self.account.name ) self.debug( @@ -1213,18 +1213,18 @@ class TestNOWithNetscaler(cloudstackTestCase): self.debug("Associating public IP for network: %s" % self.network.id) ip_with_nat_rule = PublicIPAddress.create( self.apiclient, - accountid=self.account.account.name, + accountid=self.account.name, zoneid=self.zone.id, - domainid=self.account.account.domainid, + domainid=self.account.domainid, networkid=self.network.id ) self.debug("Associated %s with network %s" % ( - ip_with_nat_rule.ipaddress.ipaddress, + ip_with_nat_rule.ipaddress, self.network.id )) self.debug("Creating PF rule for IP address: %s" % - ip_with_nat_rule.ipaddress.ipaddress) + ip_with_nat_rule.ipaddress) NATRule.create( self.apiclient, virtual_machine, @@ -1233,7 +1233,7 @@ class TestNOWithNetscaler(cloudstackTestCase): ) self.debug("Trying to create LB rule on IP with NAT: %s" % - ip_with_nat_rule.ipaddress.ipaddress) + ip_with_nat_rule.ipaddress) # Create Load Balancer rule on IP already having NAT rule with self.assertRaises(Exception): @@ -1241,7 +1241,7 @@ class TestNOWithNetscaler(cloudstackTestCase): self.apiclient, self.services["lbrule"], ipaddressid=ip_with_nat_rule.ipaddress.id, - accountid=self.account.account.name + accountid=self.account.name ) self.debug("Creating PF rule with public port: 66") @@ -1267,28 +1267,28 @@ class TestNOWithNetscaler(cloudstackTestCase): self.debug("Associating public IP for network: %s" % self.network.id) ip_with_lb_rule = PublicIPAddress.create( self.apiclient, - accountid=self.account.account.name, + accountid=self.account.name, zoneid=self.zone.id, - domainid=self.account.account.domainid, + domainid=self.account.domainid, networkid=self.network.id ) self.debug("Associated %s with network %s" % ( - ip_with_lb_rule.ipaddress.ipaddress, + ip_with_lb_rule.ipaddress, self.network.id )) self.debug("Creating LB rule for IP address: %s" % - ip_with_lb_rule.ipaddress.ipaddress) + ip_with_lb_rule.ipaddress) LoadBalancerRule.create( self.apiclient, self.services["lbrule"], ipaddressid=ip_with_lb_rule.ipaddress.id, - accountid=self.account.account.name, + accountid=self.account.name, networkid=self.network.id ) self.debug("Trying to create PF rule on IP with LB rule: %s" % - ip_with_nat_rule.ipaddress.ipaddress) + ip_with_nat_rule.ipaddress) with self.assertRaises(Exception): NATRule.create( @@ -1314,7 +1314,7 @@ class TestNOWithNetscaler(cloudstackTestCase): self.apiclient, self.services["lbrule_port_2221"], ipaddressid=ip_with_lb_rule.ipaddress.id, - accountid=self.account.account.name, + accountid=self.account.name, networkid=self.network.id ) @@ -1336,8 +1336,8 @@ class TestNOWithNetscaler(cloudstackTestCase): vpn = Vpn.create( self.apiclient, src_nat.id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) vpns = Vpn.list( @@ -1457,21 +1457,21 @@ class TestNetworkUpgrade(cloudstackTestCase): self.network = Network.create( self.apiclient, self.services["network"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, networkofferingid=self.network_offering.id, zoneid=self.zone.id ) self.debug("Created network with ID: %s" % self.network.id) - self.debug("Deploying VM in account: %s" % self.account.account.name) + self.debug("Deploying VM in account: %s" % self.account.name) # Spawn an instance in that network virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, networkids=[str(self.network.id)] ) @@ -1480,8 +1480,8 @@ class TestNetworkUpgrade(cloudstackTestCase): src_nat_list = PublicIPAddress.list( self.apiclient, associatednetworkid=self.network.id, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, listall=True, issourcenat=True, ) @@ -1504,7 +1504,7 @@ class TestNetworkUpgrade(cloudstackTestCase): self.apiclient, self.services["lbrule"], ipaddressid=src_nat.id, - accountid=self.account.account.name + accountid=self.account.name ) self.debug("Created LB rule on source NAT: %s" % src_nat.ipaddress) @@ -1585,8 +1585,8 @@ class TestNetworkUpgrade(cloudstackTestCase): vpn = Vpn.create( self.apiclient, src_nat.id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) vpns = Vpn.list( @@ -1657,21 +1657,21 @@ class TestNetworkUpgrade(cloudstackTestCase): self.network = Network.create( self.apiclient, self.services["network"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, networkofferingid=self.network_offering.id, zoneid=self.zone.id ) self.debug("Created network with ID: %s" % self.network.id) - self.debug("Deploying VM in account: %s" % self.account.account.name) + self.debug("Deploying VM in account: %s" % self.account.name) # Spawn an instance in that network virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, networkids=[str(self.network.id)] ) @@ -1680,8 +1680,8 @@ class TestNetworkUpgrade(cloudstackTestCase): src_nat_list = PublicIPAddress.list( self.apiclient, associatednetworkid=self.network.id, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, listall=True, issourcenat=True, ) @@ -1704,7 +1704,7 @@ class TestNetworkUpgrade(cloudstackTestCase): self.apiclient, self.services["lbrule"], ipaddressid=src_nat.id, - accountid=self.account.account.name + accountid=self.account.name ) self.debug("Created LB rule on source NAT: %s" % src_nat.ipaddress) @@ -1785,8 +1785,8 @@ class TestNetworkUpgrade(cloudstackTestCase): vpn = Vpn.create( self.apiclient, src_nat.id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) vpns = Vpn.list( @@ -1921,21 +1921,21 @@ class TestSharedNetworkWithoutIp(cloudstackTestCase): self.network = Network.create( self.apiclient, self.services["network"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, networkofferingid=shared_nw_off.id, zoneid=self.zone.id ) self.debug("Created network with ID: %s" % self.network.id) - self.debug("Deploying VM in account: %s" % self.account.account.name) + self.debug("Deploying VM in account: %s" % self.account.name) try: # Spawn an instance in that network VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, networkids=[str(self.network.id)] ) diff --git a/test/integration/component/test_project_configs.py b/test/integration/component/test_project_configs.py index f1469f22e52..fa2ee0adb2b 100644 --- a/test/integration/component/test_project_configs.py +++ b/test/integration/component/test_project_configs.py @@ -206,8 +206,8 @@ class TestUserProjectCreation(cloudstackTestCase): project = Project.create( self.apiclient, self.services["project"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) # Cleanup created project at end of test self.cleanup.append(project) @@ -373,8 +373,8 @@ class TestProjectCreationNegative(cloudstackTestCase): project = Project.create( self.apiclient, self.services["project"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) # Cleanup created project at end of test self.cleanup.append(project) @@ -498,8 +498,8 @@ class TestProjectInviteRequired(cloudstackTestCase): project = Project.create( self.apiclient, self.services["project"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) # Cleanup created project at end of test self.cleanup.append(project) @@ -650,8 +650,8 @@ class TestProjectInviteRequiredTrue(cloudstackTestCase): project = Project.create( self.apiclient, self.services["project"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) # Cleanup created project at end of test self.cleanup.append(project) @@ -819,8 +819,8 @@ class TestProjectInviteTimeout(cloudstackTestCase): project = Project.create( self.apiclient, self.services["project"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) # Cleanup created project at end of test self.cleanup.append(project) @@ -945,8 +945,8 @@ class TestProjectInviteTimeout(cloudstackTestCase): project = Project.create( self.apiclient, self.services["project"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) # Cleanup created project at end of test self.cleanup.append(project) @@ -1076,8 +1076,8 @@ class TestProjectInviteTimeout(cloudstackTestCase): project = Project.create( self.apiclient, self.services["project"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) # Cleanup created project at end of test self.cleanup.append(project) @@ -1205,8 +1205,8 @@ class TestProjectInviteTimeout(cloudstackTestCase): project = Project.create( self.apiclient, self.services["project"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) # Cleanup created project at end of test self.cleanup.append(project) @@ -1333,8 +1333,8 @@ class TestProjectInviteTimeout(cloudstackTestCase): project = Project.create( self.apiclient, self.services["project"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) # Cleanup created project at end of test self.cleanup.append(project) diff --git a/test/integration/component/test_project_limits.py b/test/integration/component/test_project_limits.py index ab13238e187..4a8b9d48227 100644 --- a/test/integration/component/test_project_limits.py +++ b/test/integration/component/test_project_limits.py @@ -505,10 +505,10 @@ class TestResourceLimitsProject(cloudstackTestCase): cls.project = Project.create( cls.api_client, cls.services["project"], - account=cls.account.account.name, - domainid=cls.account.account.domainid + account=cls.account.name, + domainid=cls.account.domainid ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name # Create Service offering and disk offerings etc cls.service_offering = ServiceOffering.create( @@ -720,7 +720,7 @@ class TestResourceLimitsProject(cloudstackTestCase): projectid=self.project.id ) - self.debug("Deploying VM for account: %s" % self.account.account.name) + self.debug("Deploying VM for account: %s" % self.account.name) virtual_machine_1 = VirtualMachine.create( self.apiclient, self.services["server"], @@ -843,7 +843,7 @@ class TestResourceLimitsProject(cloudstackTestCase): ) self.debug( "Updating template resource limits for domain: %s" % - self.account.account.domainid) + self.account.domainid) # Set usage_vm=1 for Account 1 update_resource_limit( self.apiclient, @@ -852,7 +852,7 @@ class TestResourceLimitsProject(cloudstackTestCase): projectid=self.project.id ) - self.debug("Deploying VM for account: %s" % self.account.account.name) + self.debug("Deploying VM for account: %s" % self.account.name) virtual_machine_1 = VirtualMachine.create( self.apiclient, self.services["server"], @@ -994,13 +994,13 @@ class TestMaxProjectNetworks(cloudstackTestCase): # 3. Create network should fail self.debug("Creating project with '%s' as admin" % - self.account.account.name) + self.account.name) # Create project as a domain admin project = Project.create( self.apiclient, self.services["project"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) # Cleanup created project at end of test self.cleanup.append(project) diff --git a/test/integration/component/test_project_resources.py b/test/integration/component/test_project_resources.py index 191ceb54cb6..e79254ce6ac 100644 --- a/test/integration/component/test_project_resources.py +++ b/test/integration/component/test_project_resources.py @@ -220,8 +220,8 @@ class TestOfferings(cloudstackTestCase): project = Project.create( self.apiclient, self.services["project"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) # Cleanup created project at end of test self.cleanup.append(project) @@ -263,8 +263,8 @@ class TestOfferings(cloudstackTestCase): project = Project.create( self.apiclient, self.services["project"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) # Cleanup created project at end of test self.cleanup.append(project) @@ -400,8 +400,8 @@ class TestNetwork(cloudstackTestCase): project = Project.create( self.apiclient, self.services["project"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) # Cleanup created project at end of test self.cleanup.append(project) @@ -546,10 +546,10 @@ class TestTemplates(cloudstackTestCase): cls.project = Project.create( cls.api_client, cls.services["project"], - account=cls.account.account.name, - domainid=cls.account.account.domainid + account=cls.account.name, + domainid=cls.account.domainid ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name # Create Service offering and disk offerings etc cls.service_offering = ServiceOffering.create( @@ -771,10 +771,10 @@ class TestSnapshots(cloudstackTestCase): cls.project = Project.create( cls.api_client, cls.services["project"], - account=cls.account.account.name, - domainid=cls.account.account.domainid + account=cls.account.name, + domainid=cls.account.domainid ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name # Create Service offering and disk offerings etc cls.service_offering = ServiceOffering.create( @@ -872,8 +872,8 @@ class TestSnapshots(cloudstackTestCase): snapshots = Snapshot.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( snapshots, @@ -918,10 +918,10 @@ class TestPublicIpAddress(cloudstackTestCase): cls.project = Project.create( cls.api_client, cls.services["project"], - account=cls.account.account.name, - domainid=cls.account.account.domainid + account=cls.account.name, + domainid=cls.account.domainid ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name # Create Service offering and disk offerings etc cls.service_offering = ServiceOffering.create( @@ -1037,7 +1037,7 @@ class TestPublicIpAddress(cloudstackTestCase): #Create Load Balancer rule and assign VMs to rule self.debug("Created LB rule for public IP: %s" % - public_ip.ipaddress.ipaddress) + public_ip.ipaddress) lb_rule = LoadBalancerRule.create( self.apiclient, self.services["lbrule"], @@ -1112,13 +1112,13 @@ class TestPublicIpAddress(cloudstackTestCase): "Check end port of firewall rule" ) - self.debug("Deploying VM for account: %s" % self.account.account.name) + self.debug("Deploying VM for account: %s" % self.account.name) virtual_machine_1 = VirtualMachine.create( self.apiclient, self.services["server"], templateid=self.template.id, - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, ) self.cleanup.append(virtual_machine_1) @@ -1142,17 +1142,17 @@ class TestPublicIpAddress(cloudstackTestCase): ) self.debug("Creating LB rule for public IP: %s outside project" % - public_ip.ipaddress.ipaddress) + public_ip.ipaddress) with self.assertRaises(Exception): LoadBalancerRule.create( self.apiclient, self.services["lbrule"], public_ip.ipaddress.id, - accountid=self.account.account.name + accountid=self.account.name ) self.debug( "Creating firewall rule for public IP: %s outside project" % - public_ip.ipaddress.ipaddress) + public_ip.ipaddress) with self.assertRaises(Exception): FireWallRule.create( self.apiclient, @@ -1219,10 +1219,10 @@ class TestSecurityGroup(cloudstackTestCase): cls.project = Project.create( cls.api_client, cls.services["project"], - account=cls.account.account.name, - domainid=cls.account.account.domainid + account=cls.account.name, + domainid=cls.account.domainid ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls._cleanup = [ cls.project, @@ -1317,8 +1317,8 @@ class TestSecurityGroup(cloudstackTestCase): self.apiclient, self.services["server"], serviceofferingid=self.service_offering.id, - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, securitygroupids=[security_group.id], ) return diff --git a/test/integration/component/test_project_usage.py b/test/integration/component/test_project_usage.py index 03c42fd196f..44ef2f9a0a9 100644 --- a/test/integration/component/test_project_usage.py +++ b/test/integration/component/test_project_usage.py @@ -142,13 +142,13 @@ class TestVmUsage(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.project = Project.create( cls.api_client, cls.services["project"], - account=cls.account.account.name, - domainid=cls.account.account.domainid + account=cls.account.name, + domainid=cls.account.domainid ) cls.service_offering = ServiceOffering.create( @@ -337,13 +337,13 @@ class TestPublicIPUsage(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.project = Project.create( cls.api_client, cls.services["project"], - account=cls.account.account.name, - domainid=cls.account.account.domainid + account=cls.account.name, + domainid=cls.account.domainid ) cls.service_offering = ServiceOffering.create( @@ -416,7 +416,7 @@ class TestPublicIPUsage(cloudstackTestCase): # 3. Delete the newly created account self.debug("Deleting public IP: %s" % - self.public_ip.ipaddress.ipaddress) + self.public_ip.ipaddress) # Release one of the IP self.public_ip.delete(self.apiclient) @@ -512,13 +512,13 @@ class TestVolumeUsage(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.project = Project.create( cls.api_client, cls.services["project"], - account=cls.account.account.name, - domainid=cls.account.account.domainid + account=cls.account.name, + domainid=cls.account.domainid ) cls.service_offering = ServiceOffering.create( @@ -689,13 +689,13 @@ class TestTemplateUsage(cloudstackTestCase): cls.services["account"], domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.project = Project.create( cls.api_client, cls.services["project"], - account=cls.account.account.name, - domainid=cls.account.account.domainid + account=cls.account.name, + domainid=cls.account.domainid ) cls.service_offering = ServiceOffering.create( @@ -858,12 +858,12 @@ class TestISOUsage(cloudstackTestCase): cls.services["account"], domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.project = Project.create( cls.api_client, cls.services["project"], - account=cls.account.account.name, - domainid=cls.account.account.domainid + account=cls.account.name, + domainid=cls.account.domainid ) cls.iso = Iso.create( @@ -1014,13 +1014,13 @@ class TestLBRuleUsage(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.project = Project.create( cls.api_client, cls.services["project"], - account=cls.account.account.name, - domainid=cls.account.account.domainid + account=cls.account.name, + domainid=cls.account.domainid ) cls.service_offering = ServiceOffering.create( @@ -1198,13 +1198,13 @@ class TestSnapshotUsage(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.project = Project.create( cls.api_client, cls.services["project"], - account=cls.account.account.name, - domainid=cls.account.account.domainid + account=cls.account.name, + domainid=cls.account.domainid ) cls.service_offering = ServiceOffering.create( @@ -1375,13 +1375,13 @@ class TestNatRuleUsage(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.project = Project.create( cls.api_client, cls.services["project"], - account=cls.account.account.name, - domainid=cls.account.account.domainid + account=cls.account.name, + domainid=cls.account.domainid ) cls.service_offering = ServiceOffering.create( @@ -1559,13 +1559,13 @@ class TestVpnUsage(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.project = Project.create( cls.api_client, cls.services["project"], - account=cls.account.account.name, - domainid=cls.account.account.domainid + account=cls.account.name, + domainid=cls.account.domainid ) cls.service_offering = ServiceOffering.create( @@ -1648,7 +1648,7 @@ class TestVpnUsage(cloudstackTestCase): ) self.debug("Created VPN user for account: %s" % - self.account.account.name) + self.account.name) vpnuser = VpnUser.create( self.apiclient, diff --git a/test/integration/component/test_projects.py b/test/integration/component/test_projects.py index 95df5bf8c30..9fa60750afe 100644 --- a/test/integration/component/test_projects.py +++ b/test/integration/component/test_projects.py @@ -183,8 +183,8 @@ class TestMultipleProjectCreation(cloudstackTestCase): project_1 = Project.create( self.apiclient, self.services["project"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) # Cleanup created project at end of test self.cleanup.append(project_1) @@ -218,8 +218,8 @@ class TestMultipleProjectCreation(cloudstackTestCase): project_2 = Project.create( self.apiclient, self.services["project"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) # Cleanup created project at end of test self.cleanup.append(project_2) @@ -398,8 +398,8 @@ class TestCrossDomainAccountAdd(cloudstackTestCase): project = Project.create( self.apiclient, self.services["project"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) # Cleanup created project at end of test self.cleanup.append(project) @@ -519,8 +519,8 @@ class TestDeleteAccountWithProject(cloudstackTestCase): project = Project.create( self.apiclient, self.services["project"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) # Cleanup created project at end of test self.cleanup.append(project) @@ -555,7 +555,7 @@ class TestDeleteAccountWithProject(cloudstackTestCase): with self.assertRaises(Exception): self.account.delete(self.apiclient) self.debug("Deleting account %s failed!" % - self.account.account.name) + self.account.name) return @@ -635,8 +635,8 @@ class TestDeleteDomainWithProject(cloudstackTestCase): project = Project.create( self.apiclient, self.services["project"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) # Cleanup created project at end of test self.debug("Created project with domain admin with ID: %s" % @@ -1215,8 +1215,8 @@ class TestProjectResources(cloudstackTestCase): project = Project.create( self.apiclient, self.services["project"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) # Cleanup created project at end of test self.cleanup.append(project) @@ -1331,8 +1331,8 @@ class TestProjectResources(cloudstackTestCase): project = Project.create( self.apiclient, self.services["project"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) # Cleanup created project at end of test self.debug("Created project with domain admin with ID: %s" % @@ -1496,8 +1496,8 @@ class TestProjectSuspendActivate(cloudstackTestCase): cls.project = Project.create( cls.api_client, cls.services["project"], - account=cls.account.account.name, - domainid=cls.account.account.domainid + account=cls.account.name, + domainid=cls.account.domainid ) cls.services["virtual_machine"]["zoneid"] = cls.zone.id cls._cleanup = [ diff --git a/test/integration/component/test_resource_limits.py b/test/integration/component/test_resource_limits.py index 641825b4a0c..418080ab052 100644 --- a/test/integration/component/test_resource_limits.py +++ b/test/integration/component/test_resource_limits.py @@ -902,7 +902,7 @@ class TestResourceLimitsDomain(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name # Create Service offering and disk offerings etc cls.service_offering = ServiceOffering.create( @@ -957,22 +957,22 @@ class TestResourceLimitsDomain(cloudstackTestCase): self.debug( "Updating instance resource limits for domain: %s" % - self.account.account.domainid) + self.account.domainid) # Set usage_vm=1 for Account 1 update_resource_limit( self.apiclient, 0, # Instance - domainid=self.account.account.domainid, + domainid=self.account.domainid, max=2 ) - self.debug("Deploying VM for account: %s" % self.account.account.name) + self.debug("Deploying VM for account: %s" % self.account.name) virtual_machine_1 = VirtualMachine.create( self.apiclient, self.services["server"], templateid=self.template.id, - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) self.cleanup.append(virtual_machine_1) @@ -982,13 +982,13 @@ class TestResourceLimitsDomain(cloudstackTestCase): 'Running', "Check VM state is Running or not" ) - self.debug("Deploying VM for account: %s" % self.account.account.name) + self.debug("Deploying VM for account: %s" % self.account.name) virtual_machine_2 = VirtualMachine.create( self.apiclient, self.services["server"], templateid=self.template.id, - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) self.cleanup.append(virtual_machine_2) @@ -1005,7 +1005,7 @@ class TestResourceLimitsDomain(cloudstackTestCase): self.services["server"], templateid=self.template.id, accountid=self.account_1.account.name, - domainid=self.account.account.domainid, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) return @@ -1025,22 +1025,22 @@ class TestResourceLimitsDomain(cloudstackTestCase): self.debug( "Updating public IP resource limits for domain: %s" % - self.account.account.domainid) + self.account.domainid) # Set usage_vm=1 for Account 1 update_resource_limit( self.apiclient, 1, # Public Ip - domainid=self.account.account.domainid, + domainid=self.account.domainid, max=2 ) - self.debug("Deploying VM for account: %s" % self.account.account.name) + self.debug("Deploying VM for account: %s" % self.account.name) virtual_machine_1 = VirtualMachine.create( self.apiclient, self.services["server"], templateid=self.template.id, - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) self.cleanup.append(virtual_machine_1) @@ -1050,7 +1050,7 @@ class TestResourceLimitsDomain(cloudstackTestCase): 'Running', "Check VM state is Running or not" ) - self.debug("Associating public IP for account: %s" % self.account.account.name) + self.debug("Associating public IP for account: %s" % self.account.name) public_ip_1 = PublicIPAddress.create( self.apiclient, virtual_machine_1.account, @@ -1097,22 +1097,22 @@ class TestResourceLimitsDomain(cloudstackTestCase): self.debug( "Updating snapshot resource limits for domain: %s" % - self.account.account.domainid) + self.account.domainid) # Set usage_vm=1 for Account 1 update_resource_limit( self.apiclient, 3, # Snapshot - domainid=self.account.account.domainid, + domainid=self.account.domainid, max=1 ) - self.debug("Deploying VM for account: %s" % self.account.account.name) + self.debug("Deploying VM for account: %s" % self.account.name) virtual_machine_1 = VirtualMachine.create( self.apiclient, self.services["server"], templateid=self.template.id, - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) self.cleanup.append(virtual_machine_1) @@ -1141,8 +1141,8 @@ class TestResourceLimitsDomain(cloudstackTestCase): # Create a snapshot from the ROOTDISK snapshot_1 = Snapshot.create(self.apiclient, volumes[0].id, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, ) self.cleanup.append(snapshot_1) # Verify Snapshot state @@ -1159,8 +1159,8 @@ class TestResourceLimitsDomain(cloudstackTestCase): with self.assertRaises(Exception): Snapshot.create(self.apiclient, volumes[0].id, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, ) return @@ -1179,22 +1179,22 @@ class TestResourceLimitsDomain(cloudstackTestCase): self.debug( "Updating volume resource limits for domain: %s" % - self.account.account.domainid) + self.account.domainid) # Set usage_vm=1 for Account 1 update_resource_limit( self.apiclient, 2, # Volume - domainid=self.account.account.domainid, + domainid=self.account.domainid, max=2 ) - self.debug("Deploying VM for account: %s" % self.account.account.name) + self.debug("Deploying VM for account: %s" % self.account.name) virtual_machine_1 = VirtualMachine.create( self.apiclient, self.services["server"], templateid=self.template.id, - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) self.cleanup.append(virtual_machine_1) @@ -1211,8 +1211,8 @@ class TestResourceLimitsDomain(cloudstackTestCase): self.apiclient, self.services["volume"], zoneid=self.zone.id, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, diskofferingid=self.disk_offering.id ) return @@ -1234,28 +1234,28 @@ class TestResourceLimitsDomain(cloudstackTestCase): update_resource_limit( self.apiclient, 2, # Volume - domainid=self.account.account.domainid, + domainid=self.account.domainid, max=5 ) self.debug( "Updating template resource limits for domain: %s" % - self.account.account.domainid) + self.account.domainid) # Set usage_vm=1 for Account 1 update_resource_limit( self.apiclient, 4, # Template - domainid=self.account.account.domainid, + domainid=self.account.domainid, max=2 ) - self.debug("Deploying VM for account: %s" % self.account.account.name) + self.debug("Deploying VM for account: %s" % self.account.name) virtual_machine_1 = VirtualMachine.create( self.apiclient, self.services["server"], templateid=self.template.id, - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) self.cleanup.append(virtual_machine_1) @@ -1286,8 +1286,8 @@ class TestResourceLimitsDomain(cloudstackTestCase): self.apiclient, self.services["template"], volumeid=volume.id, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, ) self.cleanup.append(template_1) @@ -1303,8 +1303,8 @@ class TestResourceLimitsDomain(cloudstackTestCase): self.apiclient, self.services["template"], volumeid=volume.id, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, ) self.cleanup.append(template_2) @@ -1321,8 +1321,8 @@ class TestResourceLimitsDomain(cloudstackTestCase): self.apiclient, self.services["template"], volumeid=volume.id, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, ) return @@ -1432,8 +1432,8 @@ class TestMaxAccountNetworks(cloudstackTestCase): network = Network.create( self.apiclient, self.services["network"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, networkofferingid=self.network_offering.id, zoneid=self.zone.id ) @@ -1446,8 +1446,8 @@ class TestMaxAccountNetworks(cloudstackTestCase): Network.create( self.apiclient, self.services["network"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, networkofferingid=self.network_offering.id, zoneid=self.zone.id ) diff --git a/test/integration/component/test_routers.py b/test/integration/component/test_routers.py index 452c034d5eb..96eb9aae403 100644 --- a/test/integration/component/test_routers.py +++ b/test/integration/component/test_routers.py @@ -127,16 +127,16 @@ class TestRouterServices(cloudstackTestCase): cls.api_client, cls.services["virtual_machine"], templateid=cls.template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id ) cls.vm_2 = VirtualMachine.create( cls.api_client, cls.services["virtual_machine"], templateid=cls.template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id ) cls.cleanup = [ @@ -189,8 +189,8 @@ class TestRouterServices(cloudstackTestCase): routers = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, ) self.assertEqual( @@ -216,8 +216,8 @@ class TestRouterServices(cloudstackTestCase): # Network state associated with account should be 'Implemented' networks = list_networks( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, ) self.assertEqual( isinstance(networks, list), @@ -243,8 +243,8 @@ class TestRouterServices(cloudstackTestCase): # VM state associated with account should be 'Running' virtual_machines = list_virtual_machines( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( @@ -271,8 +271,8 @@ class TestRouterServices(cloudstackTestCase): # Check status of DNS, DHCP, FIrewall, LB VPN processes networks = list_networks( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, ) self.assertEqual( isinstance(networks, list), @@ -332,8 +332,8 @@ class TestRouterServices(cloudstackTestCase): routers = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, ) self.assertEqual( @@ -360,8 +360,8 @@ class TestRouterServices(cloudstackTestCase): # Network state associated with account should be 'Implemented' networks = list_networks( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, ) self.assertEqual( isinstance(networks, list), @@ -387,8 +387,8 @@ class TestRouterServices(cloudstackTestCase): # VM state associated with account should be 'Running' virtual_machines = list_virtual_machines( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, ) self.assertEqual( @@ -445,8 +445,8 @@ class TestRouterServices(cloudstackTestCase): routers = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, ) self.assertEqual( @@ -488,8 +488,8 @@ class TestRouterServices(cloudstackTestCase): self.apiclient, self.services["virtual_machine"], templateid=self.template.id, - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) self.debug("Deployed a VM with ID: %s" % vm.id) @@ -497,8 +497,8 @@ class TestRouterServices(cloudstackTestCase): virtual_machines = list_virtual_machines( self.apiclient, id=vm.id, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, ) self.assertEqual( @@ -522,8 +522,8 @@ class TestRouterServices(cloudstackTestCase): routers = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, ) self.assertEqual( @@ -554,8 +554,8 @@ class TestRouterServices(cloudstackTestCase): virtual_machines = list_virtual_machines( self.apiclient, id=self.vm_1.id, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, ) self.assertEqual( @@ -615,8 +615,8 @@ class TestRouterStopCreatePF(cloudstackTestCase): cls.api_client, cls.services["virtual_machine"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id ) cls.cleanup = [ @@ -668,8 +668,8 @@ class TestRouterStopCreatePF(cloudstackTestCase): # Get router details associated for that account routers = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, ) self.assertEqual( @@ -693,8 +693,8 @@ class TestRouterStopCreatePF(cloudstackTestCase): routers = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, ) self.assertEqual( isinstance(routers, list), @@ -711,8 +711,8 @@ class TestRouterStopCreatePF(cloudstackTestCase): public_ips = list_publicIP( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, zoneid=self.zone.id ) self.assertEqual( @@ -749,8 +749,8 @@ class TestRouterStopCreatePF(cloudstackTestCase): routers = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, zoneid=self.zone.id ) self.assertEqual( @@ -827,8 +827,8 @@ class TestRouterStopCreateLB(cloudstackTestCase): cls.api_client, cls.services["virtual_machine"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id ) cls.cleanup = [ @@ -874,8 +874,8 @@ class TestRouterStopCreateLB(cloudstackTestCase): # Get router details associated for that account routers = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, ) self.assertEqual( @@ -900,8 +900,8 @@ class TestRouterStopCreateLB(cloudstackTestCase): routers = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, ) self.assertEqual( isinstance(routers, list), @@ -918,8 +918,8 @@ class TestRouterStopCreateLB(cloudstackTestCase): public_ips = list_publicIP( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(public_ips, list), @@ -943,7 +943,7 @@ class TestRouterStopCreateLB(cloudstackTestCase): self.apiclient, self.services["lbrule"], public_ip.id, - accountid=self.account.account.name + accountid=self.account.name ) self.debug("Assigning VM %s to LB rule: %s" % ( self.vm_1.id, @@ -958,8 +958,8 @@ class TestRouterStopCreateLB(cloudstackTestCase): routers = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, ) self.assertEqual( isinstance(routers, list), @@ -1038,8 +1038,8 @@ class TestRouterStopCreateFW(cloudstackTestCase): cls.api_client, cls.services["virtual_machine"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id ) cls.cleanup = [ @@ -1084,8 +1084,8 @@ class TestRouterStopCreateFW(cloudstackTestCase): # Get the router details associated with account routers = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, ) self.assertEqual( @@ -1110,8 +1110,8 @@ class TestRouterStopCreateFW(cloudstackTestCase): routers = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, ) self.assertEqual( isinstance(routers, list), @@ -1128,8 +1128,8 @@ class TestRouterStopCreateFW(cloudstackTestCase): public_ips = list_publicIP( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(public_ips, list), @@ -1157,8 +1157,8 @@ class TestRouterStopCreateFW(cloudstackTestCase): routers = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, ) self.assertEqual( isinstance(routers, list), diff --git a/test/integration/component/test_security_groups.py b/test/integration/component/test_security_groups.py index 7459d2a2913..fe2561aa084 100644 --- a/test/integration/component/test_security_groups.py +++ b/test/integration/component/test_security_groups.py @@ -144,7 +144,7 @@ class TestDefaultSecurityGroup(cloudstackTestCase): admin=True, domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls._cleanup = [ cls.account, @@ -178,8 +178,8 @@ class TestDefaultSecurityGroup(cloudstackTestCase): self.virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) self.debug("Deployed VM with ID: %s" % self.virtual_machine.id) @@ -222,7 +222,7 @@ class TestDefaultSecurityGroup(cloudstackTestCase): # Verify List Routers response for account self.debug( "Verify list routers response for account: %s" \ - % self.account.account.name + % self.account.name ) routers = list_routers( self.apiclient, @@ -256,8 +256,8 @@ class TestDefaultSecurityGroup(cloudstackTestCase): sercurity_groups = SecurityGroup.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(sercurity_groups, list), @@ -292,8 +292,8 @@ class TestDefaultSecurityGroup(cloudstackTestCase): self.virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) self.debug("Deployed VM with ID: %s" % self.virtual_machine.id) @@ -336,8 +336,8 @@ class TestDefaultSecurityGroup(cloudstackTestCase): # Default Security group should not have any ingress rule sercurity_groups = SecurityGroup.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(sercurity_groups, list), @@ -416,7 +416,7 @@ class TestAuthorizeIngressRule(cloudstackTestCase): cls.services["account"], domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls._cleanup = [ cls.account, cls.service_offering @@ -450,15 +450,15 @@ class TestAuthorizeIngressRule(cloudstackTestCase): security_group = SecurityGroup.create( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Created security group with ID: %s" % security_group.id) # Default Security group should not have any ingress rule sercurity_groups = SecurityGroup.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(sercurity_groups, list), @@ -475,8 +475,8 @@ class TestAuthorizeIngressRule(cloudstackTestCase): ingress_rule = security_group.authorize( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(ingress_rule, dict), @@ -489,12 +489,12 @@ class TestAuthorizeIngressRule(cloudstackTestCase): self.virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, securitygroupids=[security_group.id] ) - self.debug("Deploying VM in account: %s" % self.account.account.name) + self.debug("Deploying VM in account: %s" % self.account.name) # Should be able to SSH VM try: self.debug("SSH into VM: %s" % self.virtual_machine.id) @@ -552,7 +552,7 @@ class TestRevokeIngressRule(cloudstackTestCase): cls.services["account"], domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls._cleanup = [ cls.account, cls.service_offering @@ -587,16 +587,16 @@ class TestRevokeIngressRule(cloudstackTestCase): security_group = SecurityGroup.create( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Created security group with ID: %s" % security_group.id) # Default Security group should not have any ingress rule sercurity_groups = SecurityGroup.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(sercurity_groups, list), @@ -615,8 +615,8 @@ class TestRevokeIngressRule(cloudstackTestCase): ingress_rule = security_group.authorize( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( @@ -629,12 +629,12 @@ class TestRevokeIngressRule(cloudstackTestCase): self.virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, securitygroupids=[security_group.id] ) - self.debug("Deploying VM in account: %s" % self.account.account.name) + self.debug("Deploying VM in account: %s" % self.account.name) # Should be able to SSH VM try: @@ -712,12 +712,12 @@ class TestDhcpOnlyRouter(cloudstackTestCase): cls.services["account"], domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.virtual_machine = VirtualMachine.create( cls.api_client, cls.services["virtual_machine"], - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id ) cls._cleanup = [ @@ -849,7 +849,7 @@ class TestdeployVMWithUserData(cloudstackTestCase): cls.services["account"], domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls._cleanup = [ cls.account, cls.service_offering @@ -897,15 +897,15 @@ class TestdeployVMWithUserData(cloudstackTestCase): security_group = SecurityGroup.create( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Created security group with ID: %s" % security_group.id) # Default Security group should not have any ingress rule sercurity_groups = SecurityGroup.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(sercurity_groups, list), @@ -922,15 +922,15 @@ class TestdeployVMWithUserData(cloudstackTestCase): "Authorize Ingress Rule for Security Group %s for account: %s" \ % ( security_group.id, - self.account.account.name + self.account.name )) # Authorize Security group to SSH to VM ingress_rule = security_group.authorize( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(ingress_rule, dict), @@ -940,12 +940,12 @@ class TestdeployVMWithUserData(cloudstackTestCase): self.virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, securitygroupids=[security_group.id] ) - self.debug("Deploying VM in account: %s" % self.account.account.name) + self.debug("Deploying VM in account: %s" % self.account.name) # Should be able to SSH VM try: self.debug( @@ -1009,7 +1009,7 @@ class TestDeleteSecurityGroup(cloudstackTestCase): self.services["account"], domainid=self.domain.id ) - self.services["account"] = self.account.account.name + self.services["account"] = self.account.name self.cleanup = [ self.account, self.service_offering @@ -1059,15 +1059,15 @@ class TestDeleteSecurityGroup(cloudstackTestCase): security_group = SecurityGroup.create( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Created security group with ID: %s" % security_group.id) # Default Security group should not have any ingress rule sercurity_groups = SecurityGroup.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(sercurity_groups, list), @@ -1084,15 +1084,15 @@ class TestDeleteSecurityGroup(cloudstackTestCase): "Authorize Ingress Rule for Security Group %s for account: %s" \ % ( security_group.id, - self.account.account.name + self.account.name )) # Authorize Security group to SSH to VM ingress_rule = security_group.authorize( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(ingress_rule, dict), @@ -1103,12 +1103,12 @@ class TestDeleteSecurityGroup(cloudstackTestCase): self.virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, securitygroupids=[security_group.id] ) - self.debug("Deploying VM in account: %s" % self.account.account.name) + self.debug("Deploying VM in account: %s" % self.account.name) # Deleting Security group should raise exception security_group.delete(self.apiclient) @@ -1143,15 +1143,15 @@ class TestDeleteSecurityGroup(cloudstackTestCase): security_group = SecurityGroup.create( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Created security group with ID: %s" % security_group.id) # Default Security group should not have any ingress rule sercurity_groups = SecurityGroup.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(sercurity_groups, list), @@ -1168,14 +1168,14 @@ class TestDeleteSecurityGroup(cloudstackTestCase): "Authorize Ingress Rule for Security Group %s for account: %s" \ % ( security_group.id, - self.account.account.name + self.account.name )) # Authorize Security group to SSH to VM ingress_rule = security_group.authorize( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(ingress_rule, dict), @@ -1186,12 +1186,12 @@ class TestDeleteSecurityGroup(cloudstackTestCase): self.virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, securitygroupids=[security_group.id] ) - self.debug("Deploying VM in account: %s" % self.account.account.name) + self.debug("Deploying VM in account: %s" % self.account.name) # Destroy the VM self.virtual_machine.delete(self.apiclient) @@ -1255,7 +1255,7 @@ class TestIngressRule(cloudstackTestCase): self.services["account"], domainid=self.domain.id ) - self.services["account"] = self.account.account.name + self.services["account"] = self.account.name self.cleanup = [ self.account, self.service_offering @@ -1305,15 +1305,15 @@ class TestIngressRule(cloudstackTestCase): security_group = SecurityGroup.create( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Created security group with ID: %s" % security_group.id) # Default Security group should not have any ingress rule sercurity_groups = SecurityGroup.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(sercurity_groups, list), @@ -1329,15 +1329,15 @@ class TestIngressRule(cloudstackTestCase): "Authorize Ingress Rule for Security Group %s for account: %s" \ % ( security_group.id, - self.account.account.name + self.account.name )) # Authorize Security group to SSH to VM ingress_rule_1 = security_group.authorize( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(ingress_rule_1, dict), @@ -1347,25 +1347,25 @@ class TestIngressRule(cloudstackTestCase): self.virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, securitygroupids=[security_group.id] ) - self.debug("Deploying VM in account: %s" % self.account.account.name) + self.debug("Deploying VM in account: %s" % self.account.name) self.debug( "Authorize Ingress Rule for Security Group %s for account: %s" \ % ( security_group.id, - self.account.account.name + self.account.name )) # Authorize Security group to SSH to VM ingress_rule_2 = security_group.authorize( self.apiclient, self.services["security_group_2"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(ingress_rule_2, dict), @@ -1421,16 +1421,16 @@ class TestIngressRule(cloudstackTestCase): security_group = SecurityGroup.create( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Created security group with ID: %s" % security_group.id) # Default Security group should not have any ingress rule sercurity_groups = SecurityGroup.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(sercurity_groups, list), @@ -1447,15 +1447,15 @@ class TestIngressRule(cloudstackTestCase): "Authorize Ingress Rule for Security Group %s for account: %s" \ % ( security_group.id, - self.account.account.name + self.account.name )) # Authorize Security group to SSH to VM ingress_rule = security_group.authorize( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(ingress_rule, dict), @@ -1465,26 +1465,26 @@ class TestIngressRule(cloudstackTestCase): self.virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, securitygroupids=[security_group.id] ) - self.debug("Deploying VM in account: %s" % self.account.account.name) + self.debug("Deploying VM in account: %s" % self.account.name) self.debug( "Authorize Ingress Rule for Security Group %s for account: %s" \ % ( security_group.id, - self.account.account.name + self.account.name )) # Authorize Security group to SSH to VM ingress_rule_2 = security_group.authorize( self.apiclient, self.services["security_group_2"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(ingress_rule_2, dict), @@ -1528,7 +1528,7 @@ class TestIngressRule(cloudstackTestCase): "Revoke Ingress Rule for Security Group %s for account: %s" \ % ( security_group.id, - self.account.account.name + self.account.name )) result = security_group.revoke( @@ -1573,15 +1573,15 @@ class TestIngressRule(cloudstackTestCase): security_group = SecurityGroup.create( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Created security group with ID: %s" % security_group.id) # Default Security group should not have any ingress rule sercurity_groups = SecurityGroup.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(sercurity_groups, list), @@ -1599,15 +1599,15 @@ class TestIngressRule(cloudstackTestCase): "Authorize Ingress Rule for Security Group %s for account: %s" \ % ( security_group.id, - self.account.account.name + self.account.name )) # Authorize Security group to SSH to VM ingress_rule = security_group.authorize( self.apiclient, self.services["security_group"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(ingress_rule, dict), @@ -1618,12 +1618,12 @@ class TestIngressRule(cloudstackTestCase): self.virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, securitygroupids=[security_group.id] ) - self.debug("Deploying VM in account: %s" % self.account.account.name) + self.debug("Deploying VM in account: %s" % self.account.name) # SSH should be allowed on 22 port try: diff --git a/test/integration/component/test_snapshots.py b/test/integration/component/test_snapshots.py index 5567917371e..014b55afcc1 100644 --- a/test/integration/component/test_snapshots.py +++ b/test/integration/component/test_snapshots.py @@ -152,7 +152,7 @@ class TestSnapshotRootDisk(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, @@ -163,8 +163,8 @@ class TestSnapshotRootDisk(cloudstackTestCase): cls.api_client, cls.services["server_without_disk"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id, mode=cls.services["mode"] ) @@ -220,8 +220,8 @@ class TestSnapshotRootDisk(cloudstackTestCase): snapshot = Snapshot.create( self.apiclient, volumes[0].id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Snapshot created: ID - %s" % snapshot.id) @@ -384,7 +384,7 @@ class TestSnapshots(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, @@ -395,8 +395,8 @@ class TestSnapshots(cloudstackTestCase): cls.api_client, cls.services["server_with_disk"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id, mode=cls.services["mode"] ) @@ -405,8 +405,8 @@ class TestSnapshots(cloudstackTestCase): cls.api_client, cls.services["server_without_disk"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id, mode=cls.services["mode"] ) @@ -462,8 +462,8 @@ class TestSnapshots(cloudstackTestCase): snapshot = Snapshot.create( self.apiclient, volume[0].id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) snapshots = list_snapshots( self.apiclient, @@ -663,8 +663,8 @@ class TestSnapshots(cloudstackTestCase): snapshot = Snapshot.create( self.apiclient, volume_response.id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Created Snapshot from volume: %s" % volume_response.id) @@ -674,8 +674,8 @@ class TestSnapshots(cloudstackTestCase): self.apiclient, snapshot.id, self.services, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) volumes = list_volumes( @@ -789,8 +789,8 @@ class TestSnapshots(cloudstackTestCase): snapshot = Snapshot.create( self.apiclient, volumes[0].id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) snapshot.delete(self.apiclient) @@ -1079,8 +1079,8 @@ class TestSnapshots(cloudstackTestCase): snapshot = Snapshot.create( self.apiclient, volume.id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Snapshot created from volume ID: %s" % volume.id) @@ -1118,8 +1118,8 @@ class TestSnapshots(cloudstackTestCase): self.apiclient, self.services["server_without_disk"], templateid=template.id, - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, mode=self.services["mode"] ) @@ -1209,7 +1209,7 @@ class TestCreateVMsnapshotTemplate(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, @@ -1269,8 +1269,8 @@ class TestCreateVMsnapshotTemplate(cloudstackTestCase): self.apiclient, self.services["server"], templateid=self.template.id, - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) self.debug("Created VM with ID: %s" % self.virtual_machine.id) @@ -1359,8 +1359,8 @@ class TestCreateVMsnapshotTemplate(cloudstackTestCase): self.apiclient, self.services["server"], templateid=template.id, - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) self.debug("Created VM with ID: %s from template: %s" % ( @@ -1373,8 +1373,8 @@ class TestCreateVMsnapshotTemplate(cloudstackTestCase): virtual_machines = list_virtual_machines( self.apiclient, id=new_virtual_machine.id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(virtual_machines, list), @@ -1505,7 +1505,7 @@ class TestAccountSnapshotClean(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, @@ -1515,8 +1515,8 @@ class TestAccountSnapshotClean(cloudstackTestCase): cls.api_client, cls.services["server"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id ) # Get the Root disk of VM @@ -1577,7 +1577,7 @@ class TestAccountSnapshotClean(cloudstackTestCase): accounts = list_accounts( self.apiclient, - id=self.account.account.id + id=self.account.id ) self.assertEqual( isinstance(accounts, list), @@ -1737,7 +1737,7 @@ class TestAccountSnapshotClean(cloudstackTestCase): "Check snapshot UUID in secondary storage and database" ) - self.debug("Deleting account: %s" % self.account.account.name) + self.debug("Deleting account: %s" % self.account.name) # Delete account self.account.delete(self.apiclient) @@ -1757,7 +1757,7 @@ class TestAccountSnapshotClean(cloudstackTestCase): accounts = list_accounts( self.apiclient, - id=self.account.account.id + id=self.account.id ) self.assertEqual( @@ -1859,7 +1859,7 @@ class TestSnapshotDetachedDisk(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, @@ -1869,8 +1869,8 @@ class TestSnapshotDetachedDisk(cloudstackTestCase): cls.api_client, cls.services["server"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id, mode=cls.services["mode"] ) @@ -2142,7 +2142,7 @@ class TestSnapshotLimit(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, @@ -2152,8 +2152,8 @@ class TestSnapshotLimit(cloudstackTestCase): cls.api_client, cls.services["server"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id ) cls._cleanup = [ @@ -2401,7 +2401,7 @@ class TestSnapshotEvents(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, @@ -2411,8 +2411,8 @@ class TestSnapshotEvents(cloudstackTestCase): cls.api_client, cls.services["server"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id ) @@ -2498,8 +2498,8 @@ class TestSnapshotEvents(cloudstackTestCase): time.sleep(self.services["sleep"]) events = list_events( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, type='SNAPSHOT.DELETE' ) self.assertEqual( diff --git a/test/integration/component/test_storage_motion.py b/test/integration/component/test_storage_motion.py index b893b8b7df4..086ec77b48d 100644 --- a/test/integration/component/test_storage_motion.py +++ b/test/integration/component/test_storage_motion.py @@ -126,8 +126,8 @@ class TestStorageMotion(cloudstackTestCase): cls.virtual_machine = VirtualMachine.create( cls.api_client, cls.services["small"], - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.small_offering.id, mode=cls.services["mode"] ) diff --git a/test/integration/component/test_templates.py b/test/integration/component/test_templates.py index a743bf7e690..3867fb44d19 100644 --- a/test/integration/component/test_templates.py +++ b/test/integration/component/test_templates.py @@ -139,7 +139,7 @@ class TestCreateTemplate(cloudstackTestCase): cls.services["account"], domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls._cleanup = [ cls.account, @@ -183,8 +183,8 @@ class TestCreateTemplate(cloudstackTestCase): self.apiclient, v, zoneid=self.zone.id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug( "Registered a template of format: %s with ID: %s" % ( @@ -205,8 +205,8 @@ class TestCreateTemplate(cloudstackTestCase): self.services["templatefilter"], id=template.id, zoneid=self.zone.id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) if isinstance(list_template_response, list): break @@ -240,8 +240,8 @@ class TestCreateTemplate(cloudstackTestCase): self.apiclient, self.services["virtual_machine"], templateid=template.id, - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, mode=self.services["mode"] ) @@ -249,8 +249,8 @@ class TestCreateTemplate(cloudstackTestCase): vm_response = list_virtual_machines( self.apiclient, id=virtual_machine.id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(vm_response, list), @@ -304,7 +304,7 @@ class TestTemplates(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, cls.services["service_offering"] @@ -315,8 +315,8 @@ class TestTemplates(cloudstackTestCase): cls.api_client, cls.services["virtual_machine"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id, ) #Stop virtual machine @@ -396,8 +396,8 @@ class TestTemplates(cloudstackTestCase): self.apiclient, self.services["virtual_machine"], templateid=self.template.id, - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, ) @@ -406,8 +406,8 @@ class TestTemplates(cloudstackTestCase): vm_response = list_virtual_machines( self.apiclient, id=virtual_machine.id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) #Verify VM response to check whether VM deployment was successful self.assertNotEqual( @@ -591,8 +591,8 @@ class TestTemplates(cloudstackTestCase): snapshot = Snapshot.create( self.apiclient, volume.id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Creating a template from snapshot: %s" % snapshot.id) # Generate template from the snapshot @@ -626,8 +626,8 @@ class TestTemplates(cloudstackTestCase): self.apiclient, self.services["virtual_machine"], templateid=template.id, - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, ) self.cleanup.append(virtual_machine) @@ -635,8 +635,8 @@ class TestTemplates(cloudstackTestCase): vm_response = list_virtual_machines( self.apiclient, id=virtual_machine.id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(vm_response, list), diff --git a/test/integration/component/test_usage.py b/test/integration/component/test_usage.py index 39228ba3b7a..dbd0be97b72 100644 --- a/test/integration/component/test_usage.py +++ b/test/integration/component/test_usage.py @@ -135,7 +135,7 @@ class TestVmUsage(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, @@ -145,8 +145,8 @@ class TestVmUsage(cloudstackTestCase): cls.api_client, cls.services["server"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id ) cls._cleanup = [ @@ -202,11 +202,11 @@ class TestVmUsage(cloudstackTestCase): # Fetch account ID from account_uuid self.debug("select id from account where uuid = '%s';" \ - % self.account.account.id) + % self.account.id) qresultset = self.dbclient.execute( "select id from account where uuid = '%s';" \ - % self.account.account.id + % self.account.id ) self.assertEqual( isinstance(qresultset, list), @@ -319,7 +319,7 @@ class TestPublicIPUsage(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, @@ -329,8 +329,8 @@ class TestPublicIPUsage(cloudstackTestCase): cls.api_client, cls.services["server"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id ) @@ -382,18 +382,18 @@ class TestPublicIPUsage(cloudstackTestCase): # 3. Delete the newly created account self.debug("Deleting public IP: %s" % - self.public_ip.ipaddress.ipaddress) + self.public_ip.ipaddress) # Release one of the IP self.public_ip.delete(self.apiclient) # Fetch account ID from account_uuid self.debug("select id from account where uuid = '%s';" \ - % self.account.account.id) + % self.account.id) qresultset = self.dbclient.execute( "select id from account where uuid = '%s';" \ - % self.account.account.id + % self.account.id ) self.assertEqual( isinstance(qresultset, list), @@ -474,7 +474,7 @@ class TestVolumeUsage(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, @@ -484,8 +484,8 @@ class TestVolumeUsage(cloudstackTestCase): cls.api_client, cls.services["server"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id ) cls._cleanup = [ @@ -562,11 +562,11 @@ class TestVolumeUsage(cloudstackTestCase): # Fetch account ID from account_uuid self.debug("select id from account where uuid = '%s';" \ - % self.account.account.id) + % self.account.id) qresultset = self.dbclient.execute( "select id from account where uuid = '%s';" \ - % self.account.account.id + % self.account.id ) self.assertEqual( isinstance(qresultset, list), @@ -640,7 +640,7 @@ class TestTemplateUsage(cloudstackTestCase): cls.services["account"], domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, @@ -651,8 +651,8 @@ class TestTemplateUsage(cloudstackTestCase): cls.api_client, cls.services["server"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id, mode=cls.services["mode"] ) @@ -726,11 +726,11 @@ class TestTemplateUsage(cloudstackTestCase): # Fetch account ID from account_uuid self.debug("select id from account where uuid = '%s';" \ - % self.account.account.id) + % self.account.id) qresultset = self.dbclient.execute( "select id from account where uuid = '%s';" \ - % self.account.account.id + % self.account.id ) self.assertEqual( isinstance(qresultset, list), @@ -801,12 +801,12 @@ class TestISOUsage(cloudstackTestCase): cls.services["account"], domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.iso = Iso.create( cls.api_client, cls.services["iso"], - account=cls.account.account.name, - domainid=cls.account.account.domainid + account=cls.account.name, + domainid=cls.account.domainid ) try: # Wait till ISO gets downloaded @@ -862,11 +862,11 @@ class TestISOUsage(cloudstackTestCase): # Fetch account ID from account_uuid self.debug("select id from account where uuid = '%s';" \ - % self.account.account.id) + % self.account.id) qresultset = self.dbclient.execute( "select id from account where uuid = '%s';" \ - % self.account.account.id + % self.account.id ) self.assertEqual( isinstance(qresultset, list), @@ -946,7 +946,7 @@ class TestLBRuleUsage(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, @@ -956,8 +956,8 @@ class TestLBRuleUsage(cloudstackTestCase): cls.api_client, cls.services["server"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id ) cls.public_ip_1 = PublicIPAddress.create( @@ -1016,7 +1016,7 @@ class TestLBRuleUsage(cloudstackTestCase): self.apiclient, self.services["lbrule"], self.public_ip_1.ipaddress.id, - accountid=self.account.account.name + accountid=self.account.name ) # Delete LB Rule self.debug("Deleting LB rule with ID: %s" % lb_rule.id) @@ -1024,11 +1024,11 @@ class TestLBRuleUsage(cloudstackTestCase): # Fetch account ID from account_uuid self.debug("select id from account where uuid = '%s';" \ - % self.account.account.id) + % self.account.id) qresultset = self.dbclient.execute( "select id from account where uuid = '%s';" \ - % self.account.account.id + % self.account.id ) self.assertEqual( isinstance(qresultset, list), @@ -1109,7 +1109,7 @@ class TestSnapshotUsage(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, @@ -1119,8 +1119,8 @@ class TestSnapshotUsage(cloudstackTestCase): cls.api_client, cls.services["server"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id ) cls._cleanup = [ @@ -1190,11 +1190,11 @@ class TestSnapshotUsage(cloudstackTestCase): # Fetch account ID from account_uuid self.debug("select id from account where uuid = '%s';" \ - % self.account.account.id) + % self.account.id) qresultset = self.dbclient.execute( "select id from account where uuid = '%s';" \ - % self.account.account.id + % self.account.id ) self.assertEqual( isinstance(qresultset, list), @@ -1275,7 +1275,7 @@ class TestNatRuleUsage(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, @@ -1285,8 +1285,8 @@ class TestNatRuleUsage(cloudstackTestCase): cls.api_client, cls.services["server"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id ) cls.public_ip_1 = PublicIPAddress.create( @@ -1354,11 +1354,11 @@ class TestNatRuleUsage(cloudstackTestCase): # Fetch account ID from account_uuid self.debug("select id from account where uuid = '%s';" \ - % self.account.account.id) + % self.account.id) qresultset = self.dbclient.execute( "select id from account where uuid = '%s';" \ - % self.account.account.id + % self.account.id ) self.assertEqual( isinstance(qresultset, list), @@ -1438,7 +1438,7 @@ class TestVpnUsage(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, @@ -1448,8 +1448,8 @@ class TestVpnUsage(cloudstackTestCase): cls.api_client, cls.services["server"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id ) cls.public_ip = PublicIPAddress.create( @@ -1506,19 +1506,19 @@ class TestVpnUsage(cloudstackTestCase): vpn = Vpn.create( self.apiclient, self.public_ip.ipaddress.id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("Created VPN user for account: %s" % - self.account.account.name) + self.account.name) vpnuser = VpnUser.create( self.apiclient, self.services["vpn_user"]["username"], self.services["vpn_user"]["password"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) # Remove VPN user @@ -1531,11 +1531,11 @@ class TestVpnUsage(cloudstackTestCase): # Fetch account ID from account_uuid self.debug("select id from account where uuid = '%s';" \ - % self.account.account.id) + % self.account.id) qresultset = self.dbclient.execute( "select id from account where uuid = '%s';" \ - % self.account.account.id + % self.account.id ) self.assertEqual( isinstance(qresultset, list), diff --git a/test/integration/component/test_vm_passwdenabled.py b/test/integration/component/test_vm_passwdenabled.py index e3bcf678948..65b068dc2d2 100644 --- a/test/integration/component/test_vm_passwdenabled.py +++ b/test/integration/component/test_vm_passwdenabled.py @@ -108,8 +108,8 @@ class TestVMPasswordEnabled(cloudstackTestCase): cls.virtual_machine = VirtualMachine.create( cls.api_client, cls.services["small"], - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.small_offering.id, mode=cls.services["mode"] ) @@ -159,8 +159,8 @@ class TestVMPasswordEnabled(cloudstackTestCase): cls.api_client, cls.services["template"], cls.volume.id, - account=cls.account.account.name, - domainid=cls.account.account.domainid + account=cls.account.name, + domainid=cls.account.domainid ) # Delete the VM - No longer needed cls.virtual_machine.delete(cls.api_client) @@ -169,8 +169,8 @@ class TestVMPasswordEnabled(cloudstackTestCase): cls.vm = VirtualMachine.create( cls.api_client, cls.services["small"], - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.small_offering.id, mode=cls.services["mode"] ) diff --git a/test/integration/component/test_volumes.py b/test/integration/component/test_volumes.py index f50113b1532..f7eb9f92600 100644 --- a/test/integration/component/test_volumes.py +++ b/test/integration/component/test_volumes.py @@ -121,7 +121,7 @@ class TestAttachVolume(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, cls.services["service_offering"] @@ -129,8 +129,8 @@ class TestAttachVolume(cloudstackTestCase): cls.virtual_machine = VirtualMachine.create( cls.api_client, cls.services["virtual_machine"], - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id, ) cls._cleanup = [ @@ -162,13 +162,13 @@ class TestAttachVolume(cloudstackTestCase): self.apiclient, self.services["volume"], zoneid=self.zone.id, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, diskofferingid=self.disk_offering.id ) self.debug("Created volume: %s for account: %s" % ( volume.id, - self.account.account.name + self.account.name )) # Check List Volume response for newly created volume list_volume_response = list_volumes( @@ -311,13 +311,13 @@ class TestAttachVolume(cloudstackTestCase): self.apiclient, self.services["volume"], zoneid=self.zone.id, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, diskofferingid=self.disk_offering.id ) self.debug("Created volume: %s for account: %s" % ( volume.id, - self.account.account.name + self.account.name )) # Check List Volume response for newly created volume list_volume_response = list_volumes( @@ -392,7 +392,7 @@ class TestAttachDetachVolume(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, cls.services["service_offering"] @@ -400,8 +400,8 @@ class TestAttachDetachVolume(cloudstackTestCase): cls.virtual_machine = VirtualMachine.create( cls.api_client, cls.services["virtual_machine"], - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id, ) cls._cleanup = [ @@ -449,13 +449,13 @@ class TestAttachDetachVolume(cloudstackTestCase): self.apiclient, self.services["volume"], zoneid=self.zone.id, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, diskofferingid=self.disk_offering.id ) self.debug("Created volume: %s for account: %s" % ( volume.id, - self.account.account.name + self.account.name )) self.cleanup.append(volume) volumes.append(volume) @@ -639,7 +639,7 @@ class TestAttachVolumeISO(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, cls.services["service_offering"] @@ -647,8 +647,8 @@ class TestAttachVolumeISO(cloudstackTestCase): cls.virtual_machine = VirtualMachine.create( cls.api_client, cls.services["virtual_machine"], - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id, ) cls._cleanup = [ @@ -694,13 +694,13 @@ class TestAttachVolumeISO(cloudstackTestCase): self.apiclient, self.services["volume"], zoneid=self.zone.id, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, diskofferingid=self.disk_offering.id ) self.debug("Created volume: %s for account: %s" % ( volume.id, - self.account.account.name + self.account.name )) # Check List Volume response for newly created volume list_volume_response = list_volumes( @@ -749,12 +749,12 @@ class TestAttachVolumeISO(cloudstackTestCase): iso = Iso.create( self.apiclient, self.services["iso"], - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, ) self.debug("Created ISO with ID: %s for account: %s" % ( iso.id, - self.account.account.name + self.account.name )) try: @@ -831,7 +831,7 @@ class TestVolumes(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, cls.services["service_offering"] @@ -839,8 +839,8 @@ class TestVolumes(cloudstackTestCase): cls.virtual_machine = VirtualMachine.create( cls.api_client, cls.services["virtual_machine"], - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id, ) @@ -848,8 +848,8 @@ class TestVolumes(cloudstackTestCase): cls.api_client, cls.services["volume"], zoneid=cls.zone.id, - account=cls.account.account.name, - domainid=cls.account.account.domainid, + account=cls.account.name, + domainid=cls.account.domainid, diskofferingid=cls.disk_offering.id ) cls._cleanup = [ @@ -1071,7 +1071,7 @@ class TestDeployVmWithCustomDisk(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, cls.services["service_offering"] @@ -1137,8 +1137,8 @@ class TestDeployVmWithCustomDisk(cloudstackTestCase): Volume.create_custom_disk( self.apiclient, self.services["custom_volume"], - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, diskofferingid=self.disk_offering.id ) self.debug("Create volume failed!") @@ -1149,8 +1149,8 @@ class TestDeployVmWithCustomDisk(cloudstackTestCase): Volume.create_custom_disk( self.apiclient, self.services["custom_volume"], - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, diskofferingid=self.disk_offering.id ) self.debug("Create volume failed!") @@ -1163,8 +1163,8 @@ class TestDeployVmWithCustomDisk(cloudstackTestCase): Volume.create_custom_disk( self.apiclient, self.services["custom_volume"], - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, diskofferingid=self.disk_offering.id ) self.debug("Create volume of cust disk size succeeded") diff --git a/test/integration/component/test_vpn_users.py b/test/integration/component/test_vpn_users.py index e18c5384707..93186546d94 100644 --- a/test/integration/component/test_vpn_users.py +++ b/test/integration/component/test_vpn_users.py @@ -138,8 +138,8 @@ class TestVPNUsers(cloudstackTestCase): self.apiclient, self.services["virtual_machine"], templateid=self.template.id, - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) self.public_ip = PublicIPAddress.create( @@ -170,8 +170,8 @@ class TestVPNUsers(cloudstackTestCase): # Assign VPN to Public IP vpn = Vpn.create(self.apiclient, self.public_ip.ipaddress.id, - account=self.account.account.name, - domainid=self.account.account.domainid) + account=self.account.name, + domainid=self.account.domainid) self.debug("Verifying the remote VPN access") vpns = Vpn.list(self.apiclient, @@ -190,7 +190,7 @@ class TestVPNUsers(cloudstackTestCase): """Creates VPN users for the network""" self.debug("Creating VPN users for account: %s" % - self.account.account.name) + self.account.name) if api_client is None: api_client = self.apiclient try: @@ -198,8 +198,8 @@ class TestVPNUsers(cloudstackTestCase): api_client, self.services["vpn_user"]["username"], self.services["vpn_user"]["password"], - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, rand_name=rand_name ) @@ -240,7 +240,7 @@ class TestVPNUsers(cloudstackTestCase): limit = int(configs[0].value) self.debug("Enabling the VPN access for IP: %s" % - self.public_ip.ipaddress.ipaddress) + self.public_ip.ipaddress) self.create_VPN(self.public_ip) self.debug("Creating %s VPN users" % limit) @@ -278,7 +278,7 @@ class TestVPNUsers(cloudstackTestCase): "List NAT rules should return a valid response") self.debug("Enabling the VPN connection for IP: %s" % - self.public_ip.ipaddress.ipaddress) + self.public_ip.ipaddress) with self.assertRaises(Exception): self.create_VPN(self.public_ip) self.debug("Create VPN connection failed! Test successful!") @@ -295,7 +295,7 @@ class TestVPNUsers(cloudstackTestCase): # saying that VPN is enabled over port 1701 self.debug("Enabling the VPN connection for IP: %s" % - self.public_ip.ipaddress.ipaddress) + self.public_ip.ipaddress) self.create_VPN(self.public_ip) self.debug("Creating a port forwarding rule on port 1701") @@ -321,12 +321,12 @@ class TestVPNUsers(cloudstackTestCase): # the newly added user credential. self.debug("Enabling the VPN connection for IP: %s" % - self.public_ip.ipaddress.ipaddress) + self.public_ip.ipaddress) self.create_VPN(self.public_ip) try: self.debug("Adding new VPN user to account: %s" % - self.account.account.name) + self.account.name) self.create_VPN_Users() # TODO: Verify the VPN connection @@ -348,11 +348,11 @@ class TestVPNUsers(cloudstackTestCase): # 3. Adding this VPN user should fail. self.debug("Enabling the VPN connection for IP: %s" % - self.public_ip.ipaddress.ipaddress) + self.public_ip.ipaddress) self.create_VPN(self.public_ip) self.debug("Adding new VPN user to account: %s" % - self.account.account.name) + self.account.name) self.create_VPN_Users(rand_name=False) # TODO: Verify the VPN connection @@ -378,22 +378,22 @@ class TestVPNUsers(cloudstackTestCase): # establish VPN connection that will give access all VMs of this user self.debug("Enabling VPN connection to account: %s" % - self.account.account.name) + self.account.name) self.create_VPN(self.public_ip) self.debug("Creating VPN user for the account: %s" % - self.account.account.name) + self.account.name) self.create_VPN_Users() self.debug("Creating a global admin account") admin = Account.create(self.apiclient, self.services["account"], admin=True, - domainid=self.account.account.domainid) + domainid=self.account.domainid) self.cleanup.append(admin) self.debug("Creating API client for newly created user") api_client = self.testClient.createUserApiClient( - UserName=self.account.account.name, - DomainName=self.account.account.domain) + UserName=self.account.name, + DomainName=self.account.domain) self.debug("Adding new user to VPN as a global admin: %s" % admin.account.name) @@ -421,21 +421,21 @@ class TestVPNUsers(cloudstackTestCase): # establish VPN connection that will give access all VMs of this user self.debug("Enabling VPN connection to account: %s" % - self.account.account.name) + self.account.name) self.create_VPN(self.public_ip) self.debug("Creating VPN user for the account: %s" % - self.account.account.name) + self.account.name) self.create_VPN_Users() self.debug("Creating a domain admin account") admin = Account.create(self.apiclient, self.services["account"], - domainid=self.account.account.domainid) + domainid=self.account.domainid) self.cleanup.append(admin) self.debug("Creating API client for newly created user") api_client = self.testClient.createUserApiClient( - UserName=self.account.account.name, - DomainName=self.account.account.domain) + UserName=self.account.name, + DomainName=self.account.domain) self.debug("Adding new user to VPN as a domain admin: %s" % admin.account.name) diff --git a/test/integration/smoke/test_iso.py b/test/integration/smoke/test_iso.py index 0b7d2765775..ad4a8f280d1 100644 --- a/test/integration/smoke/test_iso.py +++ b/test/integration/smoke/test_iso.py @@ -139,8 +139,8 @@ class TestCreateIso(cloudstackTestCase): iso = Iso.create( self.apiclient, self.services["iso_2"], - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.debug("ISO created with ID: %s" % iso.id) @@ -214,7 +214,7 @@ class TestISO(cloudstackTestCase): cls.services["account"], domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name # Finding the OsTypeId from Ostype ostypes = list_os_types( cls.api_client, @@ -230,8 +230,8 @@ class TestISO(cloudstackTestCase): cls.iso_1 = Iso.create( cls.api_client, cls.services["iso_1"], - account=cls.account.account.name, - domainid=cls.account.account.domainid + account=cls.account.name, + domainid=cls.account.domainid ) try: cls.iso_1.download(cls.api_client) @@ -242,8 +242,8 @@ class TestISO(cloudstackTestCase): cls.iso_2 = Iso.create( cls.api_client, cls.services["iso_2"], - account=cls.account.account.name, - domainid=cls.account.account.domainid + account=cls.account.name, + domainid=cls.account.domainid ) try: cls.iso_2.download(cls.api_client) @@ -448,8 +448,8 @@ class TestISO(cloudstackTestCase): list_iso_response = list_isos( self.apiclient, id=self.iso_2.id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(list_iso_response, list), diff --git a/test/integration/smoke/test_network.py b/test/integration/smoke/test_network.py index df89eaaa695..322e8c25c8e 100644 --- a/test/integration/smoke/test_network.py +++ b/test/integration/smoke/test_network.py @@ -145,8 +145,8 @@ class TestPublicIP(cloudstackTestCase): cls.account_network = Network.create( cls.api_client, cls.services["network"], - cls.account.account.name, - cls.account.account.domainid + cls.account.name, + cls.account.domainid ) cls.user_network = Network.create( cls.api_client, @@ -158,9 +158,9 @@ class TestPublicIP(cloudstackTestCase): # Create Source NAT IP addresses account_src_nat_ip = PublicIPAddress.create( cls.api_client, - cls.account.account.name, + cls.account.name, cls.zone.id, - cls.account.account.domainid + cls.account.domainid ) user_src_nat_ip = PublicIPAddress.create( cls.api_client, @@ -197,9 +197,9 @@ class TestPublicIP(cloudstackTestCase): ip_address = PublicIPAddress.create( self.apiclient, - self.account.account.name, + self.account.name, self.zone.id, - self.account.account.domainid + self.account.domainid ) list_pub_ip_addr_resp = list_publicIP( self.apiclient, @@ -321,8 +321,8 @@ class TestPortForwarding(cloudstackTestCase): cls.api_client, cls.services["server"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id ) cls._cleanup = [ @@ -358,8 +358,8 @@ class TestPortForwarding(cloudstackTestCase): src_nat_ip_addrs = list_publicIP( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( @@ -481,9 +481,9 @@ class TestPortForwarding(cloudstackTestCase): ip_address = PublicIPAddress.create( self.apiclient, - self.account.account.name, + self.account.name, self.zone.id, - self.account.account.domainid, + self.account.domainid, self.services["server"] ) self.cleanup.append(ip_address) @@ -554,9 +554,9 @@ class TestPortForwarding(cloudstackTestCase): self.debug("SSHing into VM with IP address %s with NAT IP %s" % ( self.virtual_machine.ipaddress, - ip_address.ipaddress.ipaddress + ip_address.ipaddress )) - self.virtual_machine.get_ssh_client(ip_address.ipaddress.ipaddress) + self.virtual_machine.get_ssh_client(ip_address.ipaddress) except Exception as e: self.fail( "SSH Access failed for %s: %s" % \ @@ -581,7 +581,7 @@ class TestPortForwarding(cloudstackTestCase): self.virtual_machine.ipaddress) remoteSSHClient( - ip_address.ipaddress.ipaddress, + ip_address.ipaddress, self.virtual_machine.ssh_port, self.virtual_machine.username, self.virtual_machine.password @@ -621,23 +621,23 @@ class TestLoadBalancingRule(cloudstackTestCase): cls.api_client, cls.services["server"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id ) cls.vm_2 = VirtualMachine.create( cls.api_client, cls.services["server"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id ) cls.non_src_nat_ip = PublicIPAddress.create( cls.api_client, - cls.account.account.name, + cls.account.name, cls.zone.id, - cls.account.account.domainid, + cls.account.domainid, cls.services["server"] ) # Open up firewall port for SSH @@ -680,8 +680,8 @@ class TestLoadBalancingRule(cloudstackTestCase): src_nat_ip_addrs = list_publicIP( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(src_nat_ip_addrs, list), @@ -693,8 +693,8 @@ class TestLoadBalancingRule(cloudstackTestCase): # Check if VM is in Running state before creating LB rule vm_response = VirtualMachine.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( @@ -720,7 +720,7 @@ class TestLoadBalancingRule(cloudstackTestCase): self.apiclient, self.services["lbrule"], src_nat_ip_addr.id, - accountid=self.account.account.name + accountid=self.account.name ) self.cleanup.append(lb_rule) @@ -889,8 +889,8 @@ class TestLoadBalancingRule(cloudstackTestCase): # Check if VM is in Running state before creating LB rule vm_response = VirtualMachine.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( @@ -916,7 +916,7 @@ class TestLoadBalancingRule(cloudstackTestCase): self.apiclient, self.services["lbrule"], self.non_src_nat_ip.ipaddress.id, - accountid=self.account.account.name + accountid=self.account.name ) self.cleanup.append(lb_rule) @@ -974,12 +974,12 @@ class TestLoadBalancingRule(cloudstackTestCase): try: self.debug("SSHing into IP address: %s after adding VMs (ID: %s , %s)" % ( - self.non_src_nat_ip.ipaddress.ipaddress, + self.non_src_nat_ip.ipaddress, self.vm_1.id, self.vm_2.id )) ssh_1 = remoteSSHClient( - self.non_src_nat_ip.ipaddress.ipaddress, + self.non_src_nat_ip.ipaddress, self.services['lbrule']["publicport"], self.vm_1.username, self.vm_1.password @@ -993,12 +993,12 @@ class TestLoadBalancingRule(cloudstackTestCase): self.debug("SSHing again into IP address: %s with VMs (ID: %s , %s) added to LB rule" % ( - self.non_src_nat_ip.ipaddress.ipaddress, + self.non_src_nat_ip.ipaddress, self.vm_1.id, self.vm_2.id )) ssh_2 = remoteSSHClient( - self.non_src_nat_ip.ipaddress.ipaddress, + self.non_src_nat_ip.ipaddress, self.services['lbrule']["publicport"], self.vm_1.username, self.vm_1.password @@ -1022,11 +1022,11 @@ class TestLoadBalancingRule(cloudstackTestCase): self.debug("SSHing into IP address: %s after removing VM (ID: %s) from LB rule" % ( - self.non_src_nat_ip.ipaddress.ipaddress, + self.non_src_nat_ip.ipaddress, self.vm_2.id )) ssh_1 = remoteSSHClient( - self.non_src_nat_ip.ipaddress.ipaddress, + self.non_src_nat_ip.ipaddress, self.services['lbrule']["publicport"], self.vm_1.username, self.vm_1.password @@ -1036,7 +1036,7 @@ class TestLoadBalancingRule(cloudstackTestCase): self.debug("Hostnames after removing VM2: %s" % str(hostnames)) except Exception as e: self.fail("%s: SSH failed for VM with IP Address: %s" % - (e, self.non_src_nat_ip.ipaddress.ipaddress)) + (e, self.non_src_nat_ip.ipaddress)) self.assertIn( self.vm_1.name, @@ -1048,11 +1048,11 @@ class TestLoadBalancingRule(cloudstackTestCase): with self.assertRaises(Exception): self.fail("SSHing into IP address: %s after removing VM (ID: %s) from LB rule" % ( - self.non_src_nat_ip.ipaddress.ipaddress, + self.non_src_nat_ip.ipaddress, self.vm_1.id )) ssh_1 = remoteSSHClient( - self.non_src_nat_ip.ipaddress.ipaddress, + self.non_src_nat_ip.ipaddress, self.services['lbrule']["publicport"], self.vm_1.username, self.vm_1.password @@ -1093,15 +1093,15 @@ class TestRebootRouter(cloudstackTestCase): self.apiclient, self.services["server"], templateid=template.id, - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) src_nat_ip_addrs = list_publicIP( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) try: src_nat_ip_addr = src_nat_ip_addrs[0] @@ -1129,7 +1129,7 @@ class TestRebootRouter(cloudstackTestCase): self.apiclient, self.services["lbrule"], src_nat_ip_addr.id, - self.account.account.name + self.account.name ) lb_rule.assign(self.apiclient, [self.vm_1]) self.nat_rule = NATRule.create( @@ -1159,8 +1159,8 @@ class TestRebootRouter(cloudstackTestCase): #Retrieve router for the user account routers = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(routers, list), @@ -1254,8 +1254,8 @@ class TestAssignRemoveLB(cloudstackTestCase): self.apiclient, self.services["server"], templateid=template.id, - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) @@ -1263,8 +1263,8 @@ class TestAssignRemoveLB(cloudstackTestCase): self.apiclient, self.services["server"], templateid=template.id, - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) @@ -1272,8 +1272,8 @@ class TestAssignRemoveLB(cloudstackTestCase): self.apiclient, self.services["server"], templateid=template.id, - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) @@ -1297,8 +1297,8 @@ class TestAssignRemoveLB(cloudstackTestCase): src_nat_ip_addrs = list_publicIP( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(src_nat_ip_addrs, list), @@ -1320,8 +1320,8 @@ class TestAssignRemoveLB(cloudstackTestCase): # Check if VM is in Running state before creating LB rule vm_response = VirtualMachine.list( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( @@ -1346,7 +1346,7 @@ class TestAssignRemoveLB(cloudstackTestCase): self.apiclient, self.services["lbrule"], self.non_src_nat_ip.id, - self.account.account.name + self.account.name ) lb_rule.assign(self.apiclient, [self.vm_1, self.vm_2]) @@ -1514,28 +1514,28 @@ class TestReleaseIP(cloudstackTestCase): self.apiclient, self.services["server"], templateid=template.id, - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) self.ip_address = PublicIPAddress.create( self.apiclient, - self.account.account.name, + self.account.name, self.zone.id, - self.account.account.domainid + self.account.domainid ) ip_addrs = list_publicIP( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) try: self.ip_addr = ip_addrs[0] except Exception as e: raise Exception("Failed: During acquiring source NAT for account: %s" % - self.account.account.name) + self.account.name) self.nat_rule = NATRule.create( self.apiclient, @@ -1547,7 +1547,7 @@ class TestReleaseIP(cloudstackTestCase): self.apiclient, self.services["lbrule"], self.ip_addr.id, - accountid=self.account.account.name + accountid=self.account.name ) self.cleanup = [ self.virtual_machine, @@ -1652,15 +1652,15 @@ class TestDeleteAccount(cloudstackTestCase): self.apiclient, self.services["server"], templateid=template.id, - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) src_nat_ip_addrs = list_publicIP( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) try: @@ -1674,7 +1674,7 @@ class TestDeleteAccount(cloudstackTestCase): self.apiclient, self.services["lbrule"], src_nat_ip_addr.id, - self.account.account.name + self.account.name ) self.lb_rule.assign(self.apiclient, [self.vm_1]) @@ -1717,8 +1717,8 @@ class TestDeleteAccount(cloudstackTestCase): try: list_lb_reponse = list_lb_rules( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( list_lb_reponse, @@ -1729,14 +1729,14 @@ class TestDeleteAccount(cloudstackTestCase): raise Exception( "Exception raised while fetching LB rules for account: %s" % - self.account.account.name) + self.account.name) # ListPortForwardingRules should not # list associated rules with deleted account try: list_nat_reponse = list_nat_rules( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( list_nat_reponse, @@ -1747,13 +1747,13 @@ class TestDeleteAccount(cloudstackTestCase): raise Exception( "Exception raised while fetching NAT rules for account: %s" % - self.account.account.name) + self.account.name) #Retrieve router for the user account try: routers = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( routers, @@ -1764,7 +1764,7 @@ class TestDeleteAccount(cloudstackTestCase): raise Exception( "Exception raised while fetching routers for account: %s" % - self.account.account.name) + self.account.name) return def tearDown(self): diff --git a/test/integration/smoke/test_nic.py b/test/integration/smoke/test_nic.py index ad30122cd47..bae6dfda15d 100644 --- a/test/integration/smoke/test_nic.py +++ b/test/integration/smoke/test_nic.py @@ -181,8 +181,8 @@ class TestDeployVM(cloudstackTestCase): self.test_network = Network.create( self.apiclient, self.services["network"], - self.account.account.name, - self.account.account.domainid, + self.account.name, + self.account.domainid, ) self.cleanup.insert(0, self.test_network) except Exception as ex: @@ -198,8 +198,8 @@ class TestDeployVM(cloudstackTestCase): self.virtual_machine = VirtualMachine.create( self.apiclient, self.services["small"], - accountid=self.account.account.name, - domainid=self.account.account.domainid, + accountid=self.account.name, + domainid=self.account.domainid, serviceofferingid=self.service_offering.id, mode=self.services['mode'] ) diff --git a/test/integration/smoke/test_routers.py b/test/integration/smoke/test_routers.py index 7785576423a..9ec2e918c42 100644 --- a/test/integration/smoke/test_routers.py +++ b/test/integration/smoke/test_routers.py @@ -102,8 +102,8 @@ class TestRouterServices(cloudstackTestCase): cls.api_client, cls.services["virtual_machine"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id ) cls.cleanup = [ @@ -143,8 +143,8 @@ class TestRouterServices(cloudstackTestCase): # Find router associated with user account list_router_response = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(list_router_response, list), @@ -205,8 +205,8 @@ class TestRouterServices(cloudstackTestCase): # Find router associated with user account list_router_response = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(list_router_response, list), @@ -284,8 +284,8 @@ class TestRouterServices(cloudstackTestCase): # Find router associated with user account list_router_response = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(list_router_response, list), @@ -302,8 +302,8 @@ class TestRouterServices(cloudstackTestCase): while True: networks = list_networks( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(networks, list), @@ -332,8 +332,8 @@ class TestRouterServices(cloudstackTestCase): # Get router details after restart list_router_response = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(list_router_response, list), @@ -364,8 +364,8 @@ class TestRouterServices(cloudstackTestCase): while True: networks = list_networks( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(networks, list), @@ -394,8 +394,8 @@ class TestRouterServices(cloudstackTestCase): # Get router details after restart list_router_response = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(list_router_response, list), @@ -462,8 +462,8 @@ class TestRouterServices(cloudstackTestCase): list_router_response = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(list_router_response, list), @@ -528,8 +528,8 @@ class TestRouterServices(cloudstackTestCase): list_router_response = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(list_router_response, list), @@ -609,8 +609,8 @@ class TestRouterServices(cloudstackTestCase): list_router_response = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(list_router_response, list), @@ -653,8 +653,8 @@ class TestRouterServices(cloudstackTestCase): list_router_response = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(list_router_response, list), @@ -698,8 +698,8 @@ class TestRouterServices(cloudstackTestCase): list_router_response = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(list_router_response, list), @@ -755,8 +755,8 @@ class TestRouterServices(cloudstackTestCase): list_vms = list_virtual_machines( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(list_vms, list), @@ -809,8 +809,8 @@ class TestRouterServices(cloudstackTestCase): #Check status of network router list_router_response = list_routers( self.apiclient, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) if isinstance(list_router_response, list): break diff --git a/test/integration/smoke/test_scale_vm.py b/test/integration/smoke/test_scale_vm.py index 64fe4dc9aa4..fa2418b7cd8 100644 --- a/test/integration/smoke/test_scale_vm.py +++ b/test/integration/smoke/test_scale_vm.py @@ -137,8 +137,8 @@ class TestScaleVm(cloudstackTestCase): cls.virtual_machine = VirtualMachine.create( cls.api_client, cls.services["small"], - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.small_offering.id, mode=cls.services["mode"] ) diff --git a/test/integration/smoke/test_templates.py b/test/integration/smoke/test_templates.py index a648098079f..fa4bc4014ec 100644 --- a/test/integration/smoke/test_templates.py +++ b/test/integration/smoke/test_templates.py @@ -148,7 +148,7 @@ class TestCreateTemplate(cloudstackTestCase): cls.services["account"], domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, @@ -159,8 +159,8 @@ class TestCreateTemplate(cloudstackTestCase): cls.api_client, cls.services["virtual_machine"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id, mode=cls.services["mode"] ) @@ -235,8 +235,8 @@ class TestCreateTemplate(cloudstackTestCase): self.apiclient, self.services["template_1"], self.volume.id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.cleanup.append(template) @@ -332,7 +332,7 @@ class TestTemplates(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, @@ -343,8 +343,8 @@ class TestTemplates(cloudstackTestCase): cls.api_client, cls.services["virtual_machine"], templateid=template.id, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id, mode=cls.services["mode"] ) @@ -393,15 +393,15 @@ class TestTemplates(cloudstackTestCase): cls.api_client, cls.services["template_1"], cls.volume.id, - account=cls.account.account.name, - domainid=cls.account.account.domainid + account=cls.account.name, + domainid=cls.account.domainid ) cls.template_2 = Template.create( cls.api_client, cls.services["template_2"], cls.volume.id, - account=cls.account.account.name, - domainid=cls.account.account.domainid + account=cls.account.name, + domainid=cls.account.domainid ) cls._cleanup = [ cls.service_offering, @@ -474,8 +474,8 @@ class TestTemplates(cloudstackTestCase): templatefilter=\ self.services["templatefilter"], id=self.template_1.id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) if isinstance(list_template_response, list): break @@ -540,8 +540,8 @@ class TestTemplates(cloudstackTestCase): templatefilter=\ self.services["templatefilter"], id=self.template_1.id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) # Verify template is deleted properly using ListTemplates self.assertEqual( @@ -626,8 +626,8 @@ class TestTemplates(cloudstackTestCase): self.apiclient, templatefilter='featured', id=self.template_2.id, - account=self.account.account.name, - domainid=self.account.account.domainid + account=self.account.name, + domainid=self.account.domainid ) self.assertEqual( isinstance(list_template_response, list), diff --git a/test/integration/smoke/test_volumes.py b/test/integration/smoke/test_volumes.py index 750f9856b22..ecac8c903c1 100644 --- a/test/integration/smoke/test_volumes.py +++ b/test/integration/smoke/test_volumes.py @@ -126,7 +126,7 @@ class TestCreateVolume(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, cls.services["service_offering"] @@ -134,8 +134,8 @@ class TestCreateVolume(cloudstackTestCase): cls.virtual_machine = VirtualMachine.create( cls.api_client, cls.services, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id, mode=cls.services["mode"] ) @@ -167,8 +167,8 @@ class TestCreateVolume(cloudstackTestCase): self.apiClient, v, zoneid=self.zone.id, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, diskofferingid=self.disk_offering.id ) self.debug("Created a volume with ID: %s" % volume.id) @@ -177,8 +177,8 @@ class TestCreateVolume(cloudstackTestCase): volume = Volume.create_custom_disk( self.apiClient, self.services, - account=self.account.account.name, - domainid=self.account.account.domainid, + account=self.account.name, + domainid=self.account.domainid, ) self.debug("Created a volume with custom offering: %s" % volume.id) self.volumes.append(volume) @@ -320,7 +320,7 @@ class TestVolumes(cloudstackTestCase): domainid=cls.domain.id ) - cls.services["account"] = cls.account.account.name + cls.services["account"] = cls.account.name cls.service_offering = ServiceOffering.create( cls.api_client, cls.services["service_offering"] @@ -328,8 +328,8 @@ class TestVolumes(cloudstackTestCase): cls.virtual_machine = VirtualMachine.create( cls.api_client, cls.services, - accountid=cls.account.account.name, - domainid=cls.account.account.domainid, + accountid=cls.account.name, + domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id, mode=cls.services["mode"] ) @@ -337,8 +337,8 @@ class TestVolumes(cloudstackTestCase): cls.volume = Volume.create( cls.api_client, cls.services, - account=cls.account.account.name, - domainid=cls.account.account.domainid + account=cls.account.name, + domainid=cls.account.domainid ) cls._cleanup = [ cls.resized_disk_offering, From 5bb760f2ed0f753a008e1fd414c081c2ea5e00cc Mon Sep 17 00:00:00 2001 From: Sebastien Goasguen Date: Mon, 6 May 2013 05:35:19 -0400 Subject: [PATCH 12/66] CLOUDSTACK-2338: Adding example of how to sign api requests in python --- docs/en-US/signing-api-calls-python.xml | 101 ++++++++++++++++++++++++ docs/en-US/signing-api-requests.xml | 3 + docs/en-US/tools.xml | 1 + 3 files changed, 105 insertions(+) create mode 100644 docs/en-US/signing-api-calls-python.xml diff --git a/docs/en-US/signing-api-calls-python.xml b/docs/en-US/signing-api-calls-python.xml new file mode 100644 index 00000000000..a2f897f6df1 --- /dev/null +++ b/docs/en-US/signing-api-calls-python.xml @@ -0,0 +1,101 @@ + + +%BOOK_ENTITIES; +]> + + + +
+ How to sign an API call with Python + To illustrate the procedure used to sign API calls we present a step by step interactive session + using Python. + + First import the required modules: + + + >> import urllib2 +>>> import urllib +>>> import hashlib +>>> import hmac +>>> import base64 + ]]> + + + Define the endpoint of the Cloud, the command that you want to execute and the keys of the user. + + >> baseurl='http://localhost:8080/client/api?' +>>> request={} +>>> request['command']='listUsers' +>>> request['response']='json' +>>> request['apikey']='plgWJfZK4gyS3mOMTVmjUVg-X-jlWlnfaUJ9GAbBbf9EdM-kAYMmAiLqzzq1ElZLYq_u38zCm0bewzGUdP66mg' +>>> secretkey='VDaACYb0LV9eNjTetIOElcVQkvJck_J_QljX_FcHRj87ZKiy0z0ty0ZsYBkoXkY9b7eq1EhwJaw7FF3akA3KBQ' + ]]> + + Build the request string: + + >> request_str='&'.join(['='.join([k,urllib.quote_plus(request[k])]) for k in request.keys()]) +>>> request_str +'apikey=plgWJfZK4gyS3mOMTVmjUVg-X-jlWlnfaUJ9GAbBbf9EdM-kAYMmAiLqzzq1ElZLYq_u38zCm0bewzGUdP66mg&command=listUsers&response=json' + ]]> + + + Compute the signature with hmac, do a 64 bit encoding and a url encoding: + + >> sig_str='&'.join(['='.join([k.lower(),urllib.quote_plus(request[k].lower().replace('+','%20'))])for k in sorted(request.iterkeys())]) +>>> sig_str +'apikey=plgwjfzk4gys3momtvmjuvg-x-jlwlnfauj9gabbbf9edm-kaymmailqzzq1elzlyq_u38zcm0bewzgudp66mg&command=listusers&response=json' +>>> sig=hmac.new(secretkey,sig_str,hashlib.sha1) +>>> sig + +>>> sig=hmac.new(secretkey,sig_str,hashlib.sha1).digest() +>>> sig +'M:]\x0e\xaf\xfb\x8f\xf2y\xf1p\x91\x1e\x89\x8a\xa1\x05\xc4A\xdb' +>>> sig=base64.encodestring(hmac.new(secretkey,sig_str,hashlib.sha1).digest()) +>>> sig +'TTpdDq/7j/J58XCRHomKoQXEQds=\n' +>>> sig=base64.encodestring(hmac.new(secretkey,sig_str,hashlib.sha1).digest()).strip() +>>> sig +'TTpdDq/7j/J58XCRHomKoQXEQds=' +>>> sig=urllib.quote_plus(base64.encodestring(hmac.new(secretkey,sig_str,hashlib.sha1).digest()).strip()) + ]]> + + + Finally, build the entire string and do an http GET: + + >> req=baseurl+request_str+'&signature='+sig +>>> req +'http://localhost:8080/client/api?apikey=plgWJfZK4gyS3mOMTVmjUVg-X-jlWlnfaUJ9GAbBbf9EdM-kAYMmAiLqzzq1ElZLYq_u38zCm0bewzGUdP66mg&command=listUsers&response=json&signature=TTpdDq%2F7j%2FJ58XCRHomKoQXEQds%3D' +>>> res=urllib2.urlopen(req) +>>> res.read() +'{ "listusersresponse" : { "count":3 ,"user" : [ {"id":"7ed6d5da-93b2-4545-a502-23d20b48ef2a","username":"admin","firstname":"admin","lastname":"cloud","created":"2012-07-05T12:18:27-0700","state":"enabled","account":"admin","accounttype":1,"domainid":"8a111e58-e155-4482-93ce-84efff3c7c77","domain":"ROOT","apikey":"plgWJfZK4gyS3mOMTVmjUVg-X-jlWlnfaUJ9GAbBbf9EdM-kAYMmAiLqzzq1ElZLYq_u38zCm0bewzGUdP66mg","secretkey":"VDaACYb0LV9eNjTetIOElcVQkvJck_J_QljX_FcHRj87ZKiy0z0ty0ZsYBkoXkY9b7eq1EhwJaw7FF3akA3KBQ","accountid":"7548ac03-af1d-4c1c-9064-2f3e2c0eda0d"}, {"id":"1fea6418-5576-4989-a21e-4790787bbee3","username":"runseb","firstname":"foobar","lastname":"goa","email":"joe@smith.com","created":"2013-04-10T16:52:06-0700","state":"enabled","account":"admin","accounttype":1,"domainid":"8a111e58-e155-4482-93ce-84efff3c7c77","domain":"ROOT","apikey":"Xhsb3MewjJQaXXMszRcLvQI9_NPy_UcbDj1QXikkVbDC9MDSPwWdtZ1bUY1H7JBEYTtDDLY3yuchCeW778GkBA","secretkey":"gIsgmi8C5YwxMHjX5o51pSe0kqs6JnKriw0jJBLceY5bgnfzKjL4aM6ctJX-i1ddQIHJLbLJDK9MRzsKk6xZ_w","accountid":"7548ac03-af1d-4c1c-9064-2f3e2c0eda0d"}, {"id":"52f65396-183c-4473-883f-a37e7bb93967","username":"toto","firstname":"john","lastname":"smith","email":"john@smith.com","created":"2013-04-23T04:27:22-0700","state":"enabled","account":"admin","accounttype":1,"domainid":"8a111e58-e155-4482-93ce-84efff3c7c77","domain":"ROOT","apikey":"THaA6fFWS_OmvU8od201omxFC8yKNL_Hc5ZCS77LFCJsRzSx48JyZucbUul6XYbEg-ZyXMl_wuEpECzK-wKnow","secretkey":"O5ywpqJorAsEBKR_5jEvrtGHfWL1Y_j1E4Z_iCr8OKCYcsPIOdVcfzjJQ8YqK0a5EzSpoRrjOFiLsG0hQrYnDA","accountid":"7548ac03-af1d-4c1c-9064-2f3e2c0eda0d"} ] } }' + ]]> + + +
diff --git a/docs/en-US/signing-api-requests.xml b/docs/en-US/signing-api-requests.xml index 581b32a41ba..fc8773b92c8 100644 --- a/docs/en-US/signing-api-requests.xml +++ b/docs/en-US/signing-api-requests.xml @@ -57,4 +57,7 @@ http://localhost:8080/client/api?command=deployVirtualMachine&serviceOfferingId=1&diskOfferingId=1&templateId=2&zoneId=4&apiKey=miVr6X7u6bN_sdahOBpjNejPgEsT35eXq-jB8CG20YI3yaxXcgpyuaIRmFI_EJTVwZ0nUkkJbPmY3y2bciKwFQ&signature=Lxx1DM40AjcXU%2FcaiK8RAP0O1hU%3D + + + diff --git a/docs/en-US/tools.xml b/docs/en-US/tools.xml index db6a510d593..8cddf28014f 100644 --- a/docs/en-US/tools.xml +++ b/docs/en-US/tools.xml @@ -27,4 +27,5 @@ + From 72067612e6a8dbbbe8eef1b5da30af3a19b3b6e7 Mon Sep 17 00:00:00 2001 From: Sebastien Goasguen Date: Mon, 6 May 2013 05:35:58 -0400 Subject: [PATCH 13/66] CLOUDSTACK-2339: Adding libcloud example --- docs/en-US/libcloud-examples.xml | 75 ++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 docs/en-US/libcloud-examples.xml diff --git a/docs/en-US/libcloud-examples.xml b/docs/en-US/libcloud-examples.xml new file mode 100644 index 00000000000..d2db5269eb9 --- /dev/null +++ b/docs/en-US/libcloud-examples.xml @@ -0,0 +1,75 @@ + + +%BOOK_ENTITIES; +]> + + + +
+ Apache Libcloud + There are many tools available to interface with the &PRODUCT; API. Apache Libcloud is one of those. In this section + we provide a basic example of how to use Libcloud with &PRODUCT;. It assumes that you have access to a &PRODUCT; endpoint and that you have the API access key and secret key of a user. + To install Libcloud refer to the libcloud website. If you are familiar with Pypi simply do: + pip install apache-libcloud + You should see the following output: + +pip install apache-libcloud +Downloading/unpacking apache-libcloud + Downloading apache-libcloud-0.12.4.tar.bz2 (376kB): 376kB downloaded + Running setup.py egg_info for package apache-libcloud + +Installing collected packages: apache-libcloud + Running setup.py install for apache-libcloud + +Successfully installed apache-libcloud +Cleaning up... + + + You can then open a Python interactive shell, create an instance of a &PRODUCT; driver and call the available methods via the libcloud API. + + + >> from libcloud.compute.types import Provider +>>> from libcloud.compute.providers import get_driver +>>> Driver = get_driver(Provider.CLOUDSTACK) +>>> apikey='plgWJfZK4gyS3mOMTVmjUVg-X-jlWlnfaUJ9GAbBbf9EdM-kAYMmAiLqzzq1ElZLYq_u38zCm0bewzGUdP66mg' +>>> secretkey='VDaACYb0LV9eNjTetIOElcVQkvJck_J_QljX_FcHRj87ZKiy0z0ty0ZsYBkoXkY9b7eq1EhwJaw7FF3akA3KBQ' +>>> host='http://localhost:8080' +>>> path='/client/api' +>>> conn=Driver(apikey,secretkey,secure='False',host='localhost:8080',path=path) +>>> conn=Driver(key=apikey,secret=secretkey,secure=False,host='localhost',port='8080',path=path) +>>> conn.list_images() +[] +>>> conn.list_sizes() +[, , ] +>>> images=conn.list_images() +>>> offerings=conn.list_sizes() +>>> node=conn.create_node(name='toto',image=images[0],size=offerings[0]) +>>> help(node) +>>> node.get_uuid() +'b1aa381ba1de7f2d5048e248848993d5a900984f' +>>> node.name +u'toto' +]]> + + + One of the interesting use cases of Libcloud is that you can use multiple Cloud Providers, such as AWS, Rackspace, OpenNebula, vCloud and so on. You can then create Driver instances to each of these clouds and create your own multi cloud application. + +
From e56d2a401c40b4208d062c0a0ce1ec01df73dd08 Mon Sep 17 00:00:00 2001 From: Sanjay Tripathi Date: Thu, 2 May 2013 13:45:39 +0530 Subject: [PATCH 14/66] CLOUDSTACK-2188 : Parsing error with Download Monitor while checking the health of downloaded templates Signed-off-by: Sateesh Chodapuneedi --- .../src/com/cloud/storage/download/DownloadMonitorImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/src/com/cloud/storage/download/DownloadMonitorImpl.java b/server/src/com/cloud/storage/download/DownloadMonitorImpl.java index 5d7a2106e6a..220cbffd5a3 100755 --- a/server/src/com/cloud/storage/download/DownloadMonitorImpl.java +++ b/server/src/com/cloud/storage/download/DownloadMonitorImpl.java @@ -875,7 +875,9 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor tmpltHost.setPhysicalSize(tmpltInfo.getPhysicalSize()); tmpltHost.setLastUpdated(new Date()); - if (tmpltInfo.getSize() > 0) { + // Skipping limit checks for SYSTEM Account and for the templates created from volumes or snapshots + // which already got checked and incremented during createTemplate API call. + if (tmpltInfo.getSize() > 0 && tmplt.getAccountId() != Account.ACCOUNT_ID_SYSTEM && tmplt.getUrl() != null) { long accountId = tmplt.getAccountId(); try { _resourceLimitMgr.checkResourceLimit(_accountMgr.getAccount(accountId), From 59cc382f20ad01e47524ca865ffe4b0847a76dfd Mon Sep 17 00:00:00 2001 From: Hugo Trippaers Date: Thu, 2 May 2013 17:38:27 +0200 Subject: [PATCH 15/66] Prevent Nicira NVP tags from exceeding the 40 character limit. --- .../cloud/network/nicira/NiciraNvpTag.java | 17 +++++- .../cloud/network/nicira/NiciraTagTest.java | 54 +++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 plugins/network-elements/nicira-nvp/test/com/cloud/network/nicira/NiciraTagTest.java diff --git a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/NiciraNvpTag.java b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/NiciraNvpTag.java index f8282b86d9c..157c3b522c7 100644 --- a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/NiciraNvpTag.java +++ b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/NiciraNvpTag.java @@ -16,7 +16,10 @@ // under the License. package com.cloud.network.nicira; +import org.apache.log4j.Logger; + public class NiciraNvpTag { + private static final Logger s_logger = Logger.getLogger(NiciraNvpTag.class); private String scope; private String tag; @@ -24,7 +27,12 @@ public class NiciraNvpTag { public NiciraNvpTag(String scope, String tag) { this.scope = scope; - this.tag = tag; + if (tag.length() > 40) { + s_logger.warn("tag \"" + tag + "\" too long, truncating to 40 characters"); + this.tag = tag.substring(0, 40); + } else { + this.tag = tag; + } } public String getScope() { @@ -40,7 +48,12 @@ public class NiciraNvpTag { } public void setTag(String tag) { - this.tag = tag; + if (tag.length() > 40) { + s_logger.warn("tag \"" + tag + "\" too long, truncating to 40 characters"); + this.tag = tag.substring(0, 40); + } else { + this.tag = tag; + } } } diff --git a/plugins/network-elements/nicira-nvp/test/com/cloud/network/nicira/NiciraTagTest.java b/plugins/network-elements/nicira-nvp/test/com/cloud/network/nicira/NiciraTagTest.java new file mode 100644 index 00000000000..fd13e07ab59 --- /dev/null +++ b/plugins/network-elements/nicira-nvp/test/com/cloud/network/nicira/NiciraTagTest.java @@ -0,0 +1,54 @@ +// 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.network.nicira; + +import org.junit.Test; +import static org.junit.Assert.*; + +public class NiciraTagTest { + @Test + public void testCreateTag() { + NiciraNvpTag tag = new NiciraNvpTag("scope","tag"); + assertEquals("scope part set", "scope", tag.getScope()); + assertEquals("tag part set", "tag", tag.getTag()); + } + + @Test + public void testCreateLongTag() { + NiciraNvpTag tag = new NiciraNvpTag("scope","verylongtagthatshouldattheminimumexceedthefortycharacterlenght"); + assertEquals("scope part set", "scope", tag.getScope()); + assertEquals("tag part set", "verylongtagthatshouldattheminimumexceedt", tag.getTag()); + } + + @Test + public void testSetTag() { + NiciraNvpTag tag = new NiciraNvpTag(); + tag.setScope("scope"); + tag.setTag("tag"); + assertEquals("scope part set", "scope", tag.getScope()); + assertEquals("tag part set", "tag", tag.getTag()); + } + + @Test + public void testSetLongTag() { + NiciraNvpTag tag = new NiciraNvpTag(); + tag.setScope("scope"); + tag.setTag("verylongtagthatshouldattheminimumexceedthefortycharacterlenght"); + assertEquals("scope part set", "scope", tag.getScope()); + assertEquals("tag part set", "verylongtagthatshouldattheminimumexceedt", tag.getTag()); + } +} \ No newline at end of file From 90cd64cf53378fcf99151211998cbb0b7b714fce Mon Sep 17 00:00:00 2001 From: Hugo Trippaers Date: Fri, 3 May 2013 14:03:53 +0200 Subject: [PATCH 16/66] BigSwitch should only respond if it is the actual provider on the network. This fixes an NPE during the release call. --- .../src/com/cloud/network/element/BigSwitchVnsElement.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/network-elements/bigswitch-vns/src/com/cloud/network/element/BigSwitchVnsElement.java b/plugins/network-elements/bigswitch-vns/src/com/cloud/network/element/BigSwitchVnsElement.java index 4ee9c93ffcc..411feab7339 100644 --- a/plugins/network-elements/bigswitch-vns/src/com/cloud/network/element/BigSwitchVnsElement.java +++ b/plugins/network-elements/bigswitch-vns/src/com/cloud/network/element/BigSwitchVnsElement.java @@ -138,7 +138,7 @@ public class BigSwitchVnsElement extends AdapterBase implements if (network.getBroadcastDomainType() != BroadcastDomainType.Lswitch) { return false; } -/* + if (!_networkModel.isProviderForNetwork(getProvider(), network.getId())) { s_logger.debug("BigSwitchVnsElement is not a provider for network " @@ -153,7 +153,7 @@ public class BigSwitchVnsElement extends AdapterBase implements + network.getDisplayText()); return false; } -*/ + return true; } From 2b872617831d03b91909b6e867fbd4f2008127dd Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Mon, 6 May 2013 18:51:53 +0530 Subject: [PATCH 17/66] fixing wildcard imports Signed-off-by: Prasanna Santhanam --- .../network/DedicateGuestVlanRangeCmd.java | 46 +++++++++++-------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/api/src/org/apache/cloudstack/api/command/admin/network/DedicateGuestVlanRangeCmd.java b/api/src/org/apache/cloudstack/api/command/admin/network/DedicateGuestVlanRangeCmd.java index 532fd0be764..ec1436065ba 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/network/DedicateGuestVlanRangeCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/network/DedicateGuestVlanRangeCmd.java @@ -1,27 +1,37 @@ -// 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. +/* + * 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 org.apache.cloudstack.api.command.admin.network; import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.GuestVlan; import com.cloud.user.Account; -import org.apache.cloudstack.api.*; -import org.apache.cloudstack.api.response.*; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.DomainResponse; +import org.apache.cloudstack.api.response.GuestVlanRangeResponse; +import org.apache.cloudstack.api.response.PhysicalNetworkResponse; +import org.apache.cloudstack.api.response.ProjectResponse; import org.apache.log4j.Logger; @APICommand(name = "dedicateGuestVlanRange", description="Dedicates a guest vlan range to an account", responseObject=GuestVlanRangeResponse.class) From 71771c1ba4653a9b3e146c6f0e7a24828eb8a13d Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Mon, 6 May 2013 19:16:15 +0530 Subject: [PATCH 18/66] fixing double calls to VM deploy This fixes regression introduced in commit 2f40a90c that made duplicate calls to deployVirtualMachine. Signed-off-by: Prasanna Santhanam --- tools/marvin/marvin/integration/lib/base.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tools/marvin/marvin/integration/lib/base.py b/tools/marvin/marvin/integration/lib/base.py index dc7fe60589c..cdb6a36c41d 100755 --- a/tools/marvin/marvin/integration/lib/base.py +++ b/tools/marvin/marvin/integration/lib/base.py @@ -298,11 +298,10 @@ class VirtualMachine: if "userdata" in services: cmd.userdata = base64.b64encode(services["userdata"]) - virtual_machine = apiclient.deployVirtualMachine(cmd, method=method) - if group: cmd.group = group - virtual_machine = apiclient.deployVirtualMachine(cmd) + + virtual_machine = apiclient.deployVirtualMachine(cmd, method=method) if startvm == False: virtual_machine.ssh_ip = virtual_machine.nic[0].ipaddress From c388f7f180bb98f6753944392e5ff7e6dad824e7 Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Mon, 6 May 2013 19:53:42 +0530 Subject: [PATCH 19/66] Affinity Groups requires multiple storage pools Fixing the affinity group test which would fail to find the appropriate storage pool to satisfy the anti-affinity group of the second VM Signed-off-by: Prasanna Santhanam --- setup/dev/advanced.cfg | 6 +++++- test/integration/smoke/test_affinity_groups.py | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/setup/dev/advanced.cfg b/setup/dev/advanced.cfg index c031c2a4f84..431598947c6 100644 --- a/setup/dev/advanced.cfg +++ b/setup/dev/advanced.cfg @@ -84,8 +84,12 @@ "clustertype": "CloudManaged", "primaryStorages": [ { - "url": "nfs://10.147.28.6:/export/home/sandbox/primary", + "url": "nfs://10.147.28.6:/export/home/sandbox/primary0", "name": "PS0" + }, + { + "url": "nfs://10.147.28.6:/export/home/sandbox/primary1", + "name": "PS1" } ] } diff --git a/test/integration/smoke/test_affinity_groups.py b/test/integration/smoke/test_affinity_groups.py index 3ed31152643..6ccd478bf2d 100644 --- a/test/integration/smoke/test_affinity_groups.py +++ b/test/integration/smoke/test_affinity_groups.py @@ -187,7 +187,7 @@ class TestDeployVmWithAffinityGroup(cloudstackTestCase): @classmethod def tearDown(cls): try: - cls.api_client = super(TestDeployVmWithAffinityGroup, cls).getClsTestClient().getApiClient() + #cls.api_client = super(TestDeployVmWithAffinityGroup, cls).getClsTestClient().getApiClient() #Clean up, terminate the created templates cleanup_resources(cls.api_client, cls.cleanup) except Exception as e: From 4c0eecc195ba4a8bbed90fd1a0478eb746e7d538 Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Mon, 6 May 2013 20:39:36 +0530 Subject: [PATCH 20/66] Fixed the incorrect assertion in noncontiguous_vlan test The assertion fails if the VLAN is found in which case find returns a positive number. So here the assertion should infact assert < 0 result. Signed-off-by: Prasanna Santhanam --- test/integration/smoke/test_non_contigiousvlan.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/smoke/test_non_contigiousvlan.py b/test/integration/smoke/test_non_contigiousvlan.py index 91b6325782c..4e130d97aa0 100644 --- a/test/integration/smoke/test_non_contigiousvlan.py +++ b/test/integration/smoke/test_non_contigiousvlan.py @@ -81,6 +81,6 @@ class TestUpdatePhysicalNetwork(cloudstackTestCase): self.network = phy_networks[0] self.networkid = phy_networks[0].id updateResponse = self.network.update(self.apiClient, id = self.networkid, removevlan = self.vlan["full"]) - self.assert_(updateResponse.vlan.find(self.vlan["full"]) > 0, + self.assert_(updateResponse.vlan.find(self.vlan["full"]) < 0, "VLAN was not removed successfully") From b29449b4b7a5edb000c4ba58a8a0be145d105bf6 Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Mon, 6 May 2013 11:45:19 -0700 Subject: [PATCH 21/66] CLOUDSTACK-129: added new API - listNetworkIsolationMethods - for displaying isolation methods supported by the cloudStack --- api/src/com/cloud/network/NetworkModel.java | 2 + .../org/apache/cloudstack/api/BaseCmd.java | 2 + .../cloudstack/api/ResponseGenerator.java | 4 ++ .../ListNetworkIsolationMethodsCmd.java | 58 +++++++++++++++++++ .../api/response/IsolationMethodResponse.java | 33 +++++++++++ client/tomcatconf/commands.properties.in | 2 + .../src/com/cloud/api/ApiResponseHelper.java | 58 ++++++++----------- .../com/cloud/network/NetworkModelImpl.java | 7 +++ .../cloud/server/ManagementServerImpl.java | 1 + .../cloud/network/MockNetworkModelImpl.java | 7 +++ .../com/cloud/vpc/MockNetworkModelImpl.java | 7 +++ 11 files changed, 148 insertions(+), 33 deletions(-) create mode 100644 api/src/org/apache/cloudstack/api/command/admin/network/ListNetworkIsolationMethodsCmd.java create mode 100644 api/src/org/apache/cloudstack/api/response/IsolationMethodResponse.java diff --git a/api/src/com/cloud/network/NetworkModel.java b/api/src/com/cloud/network/NetworkModel.java index d81b2d76fee..555a09fc53e 100644 --- a/api/src/com/cloud/network/NetworkModel.java +++ b/api/src/com/cloud/network/NetworkModel.java @@ -263,4 +263,6 @@ public interface NetworkModel { boolean isProviderEnabledInZone(long zoneId, String provider); Nic getPlaceholderNicForRouter(Network network, Long podId); + + Networks.IsolationType[] listNetworkIsolationMethods(); } \ No newline at end of file diff --git a/api/src/org/apache/cloudstack/api/BaseCmd.java b/api/src/org/apache/cloudstack/api/BaseCmd.java index 200675ddaca..48d18d029fb 100644 --- a/api/src/org/apache/cloudstack/api/BaseCmd.java +++ b/api/src/org/apache/cloudstack/api/BaseCmd.java @@ -42,6 +42,7 @@ import com.cloud.exception.NetworkRuleConflictException; import com.cloud.exception.PermissionDeniedException; import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.NetworkModel; import com.cloud.network.NetworkService; import com.cloud.network.NetworkUsageService; import com.cloud.network.StorageNetworkService; @@ -139,6 +140,7 @@ public abstract class BaseCmd { @Inject public DataStoreProviderApiService dataStoreProviderApiService; @Inject public VpcProvisioningService _vpcProvSvc; @Inject public AffinityGroupService _affinityGroupService; + @Inject public NetworkModel _ntwkModel; public abstract void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException; diff --git a/api/src/org/apache/cloudstack/api/ResponseGenerator.java b/api/src/org/apache/cloudstack/api/ResponseGenerator.java index 8466bd8729e..3433003cbed 100644 --- a/api/src/org/apache/cloudstack/api/ResponseGenerator.java +++ b/api/src/org/apache/cloudstack/api/ResponseGenerator.java @@ -50,6 +50,7 @@ import org.apache.cloudstack.api.response.HypervisorCapabilitiesResponse; import org.apache.cloudstack.api.response.IPAddressResponse; import org.apache.cloudstack.api.response.InstanceGroupResponse; import org.apache.cloudstack.api.response.IpForwardingRuleResponse; +import org.apache.cloudstack.api.response.IsolationMethodResponse; import org.apache.cloudstack.api.response.LBHealthCheckResponse; import org.apache.cloudstack.api.response.LBStickinessResponse; import org.apache.cloudstack.api.response.LDAPConfigResponse; @@ -120,6 +121,7 @@ import com.cloud.host.Host; import com.cloud.hypervisor.HypervisorCapabilities; import com.cloud.network.*; import com.cloud.network.Network.Service; +import com.cloud.network.Networks.IsolationType; import com.cloud.network.as.*; import com.cloud.network.router.VirtualRouter; import com.cloud.network.rules.FirewallRule; @@ -398,4 +400,6 @@ public interface ResponseGenerator { AffinityGroupResponse createAffinityGroupResponse(AffinityGroup group); Long getAffinityGroupId(String name, long entityOwnerId); + + IsolationMethodResponse createIsolationMethodResponse(IsolationType method); } diff --git a/api/src/org/apache/cloudstack/api/command/admin/network/ListNetworkIsolationMethodsCmd.java b/api/src/org/apache/cloudstack/api/command/admin/network/ListNetworkIsolationMethodsCmd.java new file mode 100644 index 00000000000..7eef22a78b4 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/network/ListNetworkIsolationMethodsCmd.java @@ -0,0 +1,58 @@ +// 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 org.apache.cloudstack.api.command.admin.network; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.BaseListCmd; +import org.apache.cloudstack.api.response.IsolationMethodResponse; +import org.apache.cloudstack.api.response.ListResponse; + +import com.cloud.network.Networks; + +@APICommand(name = "listNetworkIsolationMethods", description="Lists supported methods of network isolation", +responseObject=IsolationMethodResponse.class, since="4.2.0") +public class ListNetworkIsolationMethodsCmd extends BaseListCmd{ + + private static final String s_name = "listnetworkisolationmethodsresponse"; + + @Override + public void execute() { + Networks.IsolationType[] methods = _ntwkModel.listNetworkIsolationMethods(); + + ListResponse response = new ListResponse(); + List isolationResponses = new ArrayList(); + if (methods != null) { + for (Networks.IsolationType method : methods) { + IsolationMethodResponse isolationMethod = _responseGenerator.createIsolationMethodResponse(method); + isolationResponses.add(isolationMethod); + } + } + response.setResponses(isolationResponses, methods.length); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + + } + + @Override + public String getCommandName() { + return s_name; + } + +} diff --git a/api/src/org/apache/cloudstack/api/response/IsolationMethodResponse.java b/api/src/org/apache/cloudstack/api/response/IsolationMethodResponse.java new file mode 100644 index 00000000000..3aaa7a4a1ab --- /dev/null +++ b/api/src/org/apache/cloudstack/api/response/IsolationMethodResponse.java @@ -0,0 +1,33 @@ +// 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 org.apache.cloudstack.api.response; + +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; + +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; + +@SuppressWarnings("unused") +public class IsolationMethodResponse extends BaseResponse{ + @SerializedName(ApiConstants.NAME) @Param(description="Network isolation method name") + private String name; + + public void setIsolationMethodName(String isolationMethodName) { + this.name = isolationMethodName; + } +} diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in index 7d950fe1696..6e3a5e4a40c 100644 --- a/client/tomcatconf/commands.properties.in +++ b/client/tomcatconf/commands.properties.in @@ -591,3 +591,5 @@ addCiscoAsa1000vResource=1 deleteCiscoAsa1000vResource=1 listCiscoAsa1000vResources=1 +### Network Isolation methods listing +listNetworkIsolationMethods=1 diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index 2804d1e97f3..d7eaa2604b1 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -34,9 +34,10 @@ import java.util.TimeZone; import javax.inject.Inject; -import com.cloud.vm.*; import org.apache.cloudstack.acl.ControlledEntity; import org.apache.cloudstack.acl.ControlledEntity.ACLType; +import org.apache.cloudstack.affinity.AffinityGroup; +import org.apache.cloudstack.affinity.AffinityGroupResponse; import org.apache.cloudstack.api.ApiConstants.HostDetails; import org.apache.cloudstack.api.ApiConstants.VMDetails; import org.apache.cloudstack.api.BaseCmd; @@ -65,12 +66,14 @@ import org.apache.cloudstack.api.response.FirewallResponse; import org.apache.cloudstack.api.response.FirewallRuleResponse; import org.apache.cloudstack.api.response.GlobalLoadBalancerResponse; import org.apache.cloudstack.api.response.GuestOSResponse; -import org.apache.cloudstack.api.response.HostResponse; +import org.apache.cloudstack.api.response.GuestVlanRangeResponse; import org.apache.cloudstack.api.response.HostForMigrationResponse; +import org.apache.cloudstack.api.response.HostResponse; import org.apache.cloudstack.api.response.HypervisorCapabilitiesResponse; import org.apache.cloudstack.api.response.IPAddressResponse; import org.apache.cloudstack.api.response.InstanceGroupResponse; import org.apache.cloudstack.api.response.IpForwardingRuleResponse; +import org.apache.cloudstack.api.response.IsolationMethodResponse; import org.apache.cloudstack.api.response.LBHealthCheckPolicyResponse; import org.apache.cloudstack.api.response.LBHealthCheckResponse; import org.apache.cloudstack.api.response.LBStickinessPolicyResponse; @@ -180,14 +183,14 @@ import com.cloud.event.Event; import com.cloud.host.Host; import com.cloud.host.HostVO; import com.cloud.hypervisor.HypervisorCapabilities; -import com.cloud.network.dao.AccountGuestVlanMapVO; -import com.cloud.network.IpAddress; import com.cloud.network.GuestVlan; +import com.cloud.network.IpAddress; import com.cloud.network.Network; import com.cloud.network.Network.Capability; import com.cloud.network.Network.Provider; import com.cloud.network.Network.Service; import com.cloud.network.NetworkProfile; +import com.cloud.network.Networks.IsolationType; import com.cloud.network.Networks.TrafficType; import com.cloud.network.PhysicalNetwork; import com.cloud.network.PhysicalNetworkServiceProvider; @@ -267,38 +270,17 @@ import com.cloud.uservm.UserVm; import com.cloud.utils.Pair; import com.cloud.utils.StringUtils; import com.cloud.utils.net.NetUtils; +import com.cloud.vm.ConsoleProxyVO; +import com.cloud.vm.InstanceGroup; +import com.cloud.vm.Nic; +import com.cloud.vm.NicProfile; +import com.cloud.vm.NicSecondaryIp; +import com.cloud.vm.NicVO; +import com.cloud.vm.VMInstanceVO; +import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine.Type; import com.cloud.vm.dao.NicSecondaryIpVO; import com.cloud.vm.snapshot.VMSnapshot; -import org.apache.cloudstack.acl.ControlledEntity; -import org.apache.cloudstack.acl.ControlledEntity.ACLType; -import org.apache.cloudstack.affinity.AffinityGroup; -import org.apache.cloudstack.affinity.AffinityGroupResponse; -import org.apache.cloudstack.api.ApiConstants.HostDetails; -import org.apache.cloudstack.api.ApiConstants.VMDetails; -import org.apache.cloudstack.api.BaseCmd; -import org.apache.cloudstack.api.ResponseGenerator; -import org.apache.cloudstack.api.command.user.job.QueryAsyncJobResultCmd; -import org.apache.cloudstack.api.response.*; -import org.apache.cloudstack.region.Region; -import org.apache.cloudstack.usage.Usage; -import org.apache.cloudstack.usage.UsageService; -import org.apache.cloudstack.usage.UsageTypes; -import com.cloud.vm.dao.UserVmData; -import com.cloud.vm.dao.UserVmData.NicData; -import com.cloud.vm.dao.UserVmData.SecurityGroupData; -import com.cloud.vm.snapshot.VMSnapshot; -import org.apache.cloudstack.api.ResponseGenerator; -import org.apache.cloudstack.api.response.VMSnapshotResponse; -import org.apache.log4j.Logger; - -import java.text.DecimalFormat; -import java.util.*; - -import javax.inject.Inject; - -import static java.util.Collections.emptyList; -import static java.util.Collections.singletonList; @Component public class ApiResponseHelper implements ResponseGenerator { @@ -3736,4 +3718,14 @@ public class ApiResponseHelper implements ResponseGenerator { return ag.getId(); } } + + + + @Override + public IsolationMethodResponse createIsolationMethodResponse(IsolationType method) { + IsolationMethodResponse response = new IsolationMethodResponse(); + response.setIsolationMethodName(method.toString()); + response.setObjectName("isolationmethod"); + return response; + } } diff --git a/server/src/com/cloud/network/NetworkModelImpl.java b/server/src/com/cloud/network/NetworkModelImpl.java index fdf722c33de..eaec6a6b42f 100755 --- a/server/src/com/cloud/network/NetworkModelImpl.java +++ b/server/src/com/cloud/network/NetworkModelImpl.java @@ -58,6 +58,7 @@ import com.cloud.network.Network.Capability; import com.cloud.network.Network.GuestType; import com.cloud.network.Network.Provider; import com.cloud.network.Network.Service; +import com.cloud.network.Networks.IsolationType; import com.cloud.network.Networks.TrafficType; import com.cloud.network.addr.PublicIp; import com.cloud.network.dao.FirewallRulesDao; @@ -2049,4 +2050,10 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel { } return null; } + + + @Override + public Networks.IsolationType[] listNetworkIsolationMethods() { + return Networks.IsolationType.values(); + } } diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 5ddae88f1dd..da8f30ed759 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -2547,6 +2547,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe cmdList.add(ListAffinityGroupsCmd.class); cmdList.add(UpdateVMAffinityGroupCmd.class); cmdList.add(ListAffinityGroupTypesCmd.class); + cmdList.add(ListNetworkIsolationMethodsCmd.class); return cmdList; } diff --git a/server/test/com/cloud/network/MockNetworkModelImpl.java b/server/test/com/cloud/network/MockNetworkModelImpl.java index 9d5d4ff2cca..7df45a01715 100644 --- a/server/test/com/cloud/network/MockNetworkModelImpl.java +++ b/server/test/com/cloud/network/MockNetworkModelImpl.java @@ -33,6 +33,7 @@ import com.cloud.network.Network.Capability; import com.cloud.network.Network.GuestType; import com.cloud.network.Network.Provider; import com.cloud.network.Network.Service; +import com.cloud.network.Networks.IsolationType; import com.cloud.network.Networks.TrafficType; import com.cloud.network.dao.IPAddressVO; import com.cloud.network.dao.NetworkVO; @@ -850,4 +851,10 @@ public class MockNetworkModelImpl extends ManagerBase implements NetworkModel { // TODO Auto-generated method stub return null; } + + @Override + public IsolationType[] listNetworkIsolationMethods() { + // TODO Auto-generated method stub + return null; + } } diff --git a/server/test/com/cloud/vpc/MockNetworkModelImpl.java b/server/test/com/cloud/vpc/MockNetworkModelImpl.java index 14cd09d88f5..c9d043ad0d1 100644 --- a/server/test/com/cloud/vpc/MockNetworkModelImpl.java +++ b/server/test/com/cloud/vpc/MockNetworkModelImpl.java @@ -37,6 +37,7 @@ import com.cloud.network.Network.GuestType; import com.cloud.network.Network.Provider; import com.cloud.network.Network.Service; import com.cloud.network.NetworkModel; +import com.cloud.network.Networks.IsolationType; import com.cloud.network.Networks.TrafficType; import com.cloud.network.PhysicalNetwork; import com.cloud.network.PhysicalNetworkSetupInfo; @@ -863,4 +864,10 @@ public class MockNetworkModelImpl extends ManagerBase implements NetworkModel { return null; } + @Override + public IsolationType[] listNetworkIsolationMethods() { + // TODO Auto-generated method stub + return null; + } + } From 599023b61b7c89a24d5d851499db05b9338ab922 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Mon, 6 May 2013 20:56:06 +0100 Subject: [PATCH 22/66] CLOUDSTACK-2322: update network.gateway to fix deployVm error on SharedNetwork after ipv6 support Signed-off-by: Chip Childers --- setup/db/db/schema-40to410.sql | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/setup/db/db/schema-40to410.sql b/setup/db/db/schema-40to410.sql index ff1d9085329..a3426e2caaa 100644 --- a/setup/db/db/schema-40to410.sql +++ b/setup/db/db/schema-40to410.sql @@ -443,6 +443,10 @@ ALTER TABLE `cloud`.`vlan` ADD COLUMN `ip6_range` varchar(255); ALTER TABLE `cloud`.`data_center` ADD COLUMN `ip6_dns1` varchar(255); ALTER TABLE `cloud`.`data_center` ADD COLUMN `ip6_dns2` varchar(255); +UPDATE `cloud`.`networks` INNER JOIN `cloud`.`vlan` ON networks.id = vlan.network_id +SET networks.gateway = vlan.vlan_gateway, networks.ip6_gateway = vlan.ip6_gateway, networks.ip6_cidr = vlan.ip6_cidr +WHERE networks.data_center_id = vlan.data_center_id AND networks.physical_network_id = vlan.physical_network_id; + -- DB views for list api DROP VIEW IF EXISTS `cloud`.`user_vm_view`; From af5bf94b431cea91f424ec1b5dc038a22d25a954 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Mon, 6 May 2013 20:57:02 +0100 Subject: [PATCH 23/66] CLOUDSTACK-2319: fix "unable to add egress rules" in SecurityGroup Signed-off-by: Chip Childers --- .../network/security/SecurityGroupRules.java | 2 + .../security/SecurityGroupRulesVO.java | 15 +- .../dao/SecurityGroupRulesDaoImpl.java | 9 + ui/scripts/network.js | 297 +++++++++--------- 4 files changed, 168 insertions(+), 155 deletions(-) diff --git a/api/src/com/cloud/network/security/SecurityGroupRules.java b/api/src/com/cloud/network/security/SecurityGroupRules.java index d255e46fde5..4dbafd62e98 100644 --- a/api/src/com/cloud/network/security/SecurityGroupRules.java +++ b/api/src/com/cloud/network/security/SecurityGroupRules.java @@ -31,6 +31,8 @@ public interface SecurityGroupRules extends InternalIdentity { Long getRuleId(); + String getRuleUuid(); + int getStartPort(); int getEndPort(); diff --git a/core/src/com/cloud/network/security/SecurityGroupRulesVO.java b/core/src/com/cloud/network/security/SecurityGroupRulesVO.java index 82060efce12..c74152e453c 100644 --- a/core/src/com/cloud/network/security/SecurityGroupRulesVO.java +++ b/core/src/com/cloud/network/security/SecurityGroupRulesVO.java @@ -54,6 +54,9 @@ public class SecurityGroupRulesVO implements SecurityGroupRules { @Column(name = "id", table = "security_group_rule", insertable = false, updatable = false) private Long ruleId; + @Column(name = "uuid", table = "security_group_rule", insertable = false, updatable = false) + private String ruleUuid; + @Column(name = "start_port", table = "security_group_rule", insertable = false, updatable = false) private int startPort; @@ -75,7 +78,11 @@ public class SecurityGroupRulesVO implements SecurityGroupRules { public SecurityGroupRulesVO() { } - public SecurityGroupRulesVO(long id, String name, String description, Long domainId, Long accountId, Long ruleId, int startPort, int endPort, String protocol, Long allowedNetworkId, + public SecurityGroupRulesVO(long id) { + this.id = id; + } + + public SecurityGroupRulesVO(long id, String name, String description, Long domainId, Long accountId, Long ruleId, String ruleUuid, int startPort, int endPort, String protocol, Long allowedNetworkId, String allowedSourceIpCidr) { this.id = id; this.name = name; @@ -83,6 +90,7 @@ public class SecurityGroupRulesVO implements SecurityGroupRules { this.domainId = domainId; this.accountId = accountId; this.ruleId = ruleId; + this.ruleUuid = ruleUuid; this.startPort = startPort; this.endPort = endPort; this.protocol = protocol; @@ -120,6 +128,11 @@ public class SecurityGroupRulesVO implements SecurityGroupRules { return ruleId; } + @Override + public String getRuleUuid() { + return ruleUuid; + } + @Override public int getStartPort() { return startPort; diff --git a/server/src/com/cloud/network/security/dao/SecurityGroupRulesDaoImpl.java b/server/src/com/cloud/network/security/dao/SecurityGroupRulesDaoImpl.java index f08ca05cd7a..18ef57fbcd8 100644 --- a/server/src/com/cloud/network/security/dao/SecurityGroupRulesDaoImpl.java +++ b/server/src/com/cloud/network/security/dao/SecurityGroupRulesDaoImpl.java @@ -84,4 +84,13 @@ public class SecurityGroupRulesDaoImpl extends GenericDaoBase sc = createSearchCriteria(); + sc.addAnd("ruleUuid", SearchCriteria.Op.EQ, uuid); + SecurityGroupRulesVO rule = findOneIncludingRemovedBy(sc); + SecurityGroupRulesVO newRule = new SecurityGroupRulesVO(rule.getRuleId()); + return newRule; + } } diff --git a/ui/scripts/network.js b/ui/scripts/network.js index 9ba725a8574..6b310ce0e83 100755 --- a/ui/scripts/network.js +++ b/ui/scripts/network.js @@ -3981,13 +3981,12 @@ account: args.context.securityGroups[0].account }; - // TCP / ICMP if (args.data.icmptype && args.data.icmpcode) { // ICMP $.extend(data, { icmptype: args.data.icmptype, icmpcode: args.data.icmpcode }); - } else { // TCP + } else { // TCP/UDP $.extend(data, { startport: args.data.startport, endport: args.data.endport @@ -4081,121 +4080,142 @@ egressRules: { title: 'label.egress.rule', - custom: function(args) { - var context = args.context; + custom: cloudStack.uiCustom.securityRules({ + noSelect: true, + noHeaderActionsColumn: true, + fields: { + 'protocol': { + label: 'label.protocol', + select: function(args) { + args.$select.change(function() { + var $inputs = args.$form.find('th, td'); + var $icmpFields = $inputs.filter(function() { + var name = $(this).attr('rel'); - return $('
').multiEdit({ - context: context, - noSelect: true, - noHeaderActionsColumn: true, - fields: { - 'cidrlist': { edit: true, label: 'label.cidr' }, - 'protocol': { - label: 'label.protocol', - select: function(args) { - args.$select.change(function() { - var $inputs = args.$form.find('th, td'); - var $icmpFields = $inputs.filter(function() { - var name = $(this).attr('rel'); + return $.inArray(name, [ + 'icmptype', + 'icmpcode' + ]) > -1; + }); + var $otherFields = $inputs.filter(function() { + var name = $(this).attr('rel'); - return $.inArray(name, [ - 'icmptype', - 'icmpcode' - ]) > -1; - }); - var $otherFields = $inputs.filter(function() { - var name = $(this).attr('rel'); - - return name != 'cidrlist' && - name != 'icmptype' && - name != 'icmpcode' && - name != 'protocol' && - name != 'add-rule'; - }); - - if ($(this).val() == 'icmp') { - $icmpFields.show(); - $otherFields.hide(); - } else { - $icmpFields.hide(); - $otherFields.show(); - } + return name != 'icmptype' && + name != 'icmpcode' && + name != 'protocol' && + name != 'add-rule' && + name != 'cidr' && + name != 'accountname' && + name != 'securitygroup'; }); - args.response.success({ - data: [ - { name: 'tcp', description: 'TCP' }, - { name: 'udp', description: 'UDP' }, - { name: 'icmp', description: 'ICMP' } - ] - }); - } - }, - 'startport': { edit: true, label: 'label.start.port' }, - 'endport': { edit: true, label: 'label.end.port' }, - 'icmptype': { edit: true, label: 'ICMP.type', isHidden: true }, - 'icmpcode': { edit: true, label: 'ICMP.code', isHidden: true }, - 'add-rule': { - label: 'label.add', - addButton: true - } - }, - add: { - label: 'label.add', - action: function(args) { - var data = { - protocol: args.data.protocol, - cidrlist: args.data.cidrlist, - trafficType: 'Egress' - }; - - if (args.data.icmptype && args.data.icmpcode) { // ICMP - $.extend(data, { - icmptype: args.data.icmptype, - icmpcode: args.data.icmpcode - }); - } else { // TCP/UDP - $.extend(data, { - startport: args.data.startport, - endport: args.data.endport - }); - } - - // Get Source NAT IP - var sourceNATIP; - - $.ajax({ - url: createURL('listPublicIpAddresses'), - data: { - listAll: true, - associatednetworkid: args.context.networks[0].id - }, - async: false, - success: function(json) { - var ipAddresses = json.listpublicipaddressesresponse.publicipaddress; - - sourceNATIP = $.grep(ipAddresses, function(ipAddress) { - return ipAddress.issourcenat; - })[0]; + if ($(this).val() == 'icmp') { + $icmpFields.show(); + $otherFields.hide(); + } else { + $icmpFields.hide(); + $otherFields.show(); } }); - data.ipaddressid = sourceNATIP.id; + args.response.success({ + data: [ + { name: 'tcp', description: 'TCP' }, + { name: 'udp', description: 'UDP' }, + { name: 'icmp', description: 'ICMP' } + ] + }); + } + }, + 'startport': { edit: true, label: 'label.start.port' }, + 'endport': { edit: true, label: 'label.end.port' }, + 'icmptype': { edit: true, label: 'ICMP.type', isHidden: true }, + 'icmpcode': { edit: true, label: 'ICMP.code', isHidden: true }, + 'cidr': { edit: true, label: 'label.cidr', isHidden: true }, + 'accountname': { + edit: true, + label: 'label.account.and.security.group', + isHidden: true, + range: ['accountname', 'securitygroup'] + }, + 'add-rule': { + label: 'label.add', + addButton: true + } + }, + add: { + label: 'label.add', + action: function(args) { + var data = { + securitygroupid: args.context.securityGroups[0].id, + protocol: args.data.protocol, + domainid: args.context.securityGroups[0].domainid, + account: args.context.securityGroups[0].account + }; + if (args.data.icmptype && args.data.icmpcode) { // ICMP + $.extend(data, { + icmptype: args.data.icmptype, + icmpcode: args.data.icmpcode + }); + } else { // TCP/UDP + $.extend(data, { + startport: args.data.startport, + endport: args.data.endport + }); + } + + // CIDR / account + if (args.data.cidr) { + data.cidrlist = args.data.cidr; + } else { + data['usersecuritygrouplist[0].account'] = args.data.accountname; + data['usersecuritygrouplist[0].group'] = args.data.securitygroup; + } + + $.ajax({ + url: createURL('authorizeSecurityGroupEgress'), + data: data, + dataType: 'json', + async: true, + success: function(data) { + var jobId = data.authorizesecuritygroupegressresponse.jobid; + + args.response.success({ + _custom: { + jobId: jobId + }, + notification: { + label: 'label.add.egress.rule', + poll: pollAsyncJobResult + } + }); + } + }); + } + }, + actions: { + destroy: { + label: 'label.remove.rule', + action: function(args) { $.ajax({ - url: createURL('createFirewallRule'), - data: data, + url: createURL('revokeSecurityGroupEgress'), + data: { + domainid: args.context.securityGroups[0].domainid, + account: args.context.securityGroups[0].account, + id: args.context.multiRule[0].id + }, dataType: 'json', async: true, - success: function(json) { - var jobId = json.createfirewallruleresponse.jobid; + success: function(data) { + var jobID = data.revokesecuritygroupegress.jobid; args.response.success({ _custom: { - jobId: jobId + jobId: jobID }, notification: { - label: 'label.add.egress.rule', + label: 'label.remove.egress.rule', poll: pollAsyncJobResult } }); @@ -4205,60 +4225,29 @@ } }); } - }, - actions: { - destroy: { - label: 'label.remove.rule', - action: function(args) { - $.ajax({ - url: createURL('deleteFirewallRule'), - data: { - id: args.context.multiRule[0].id - }, - dataType: 'json', - async: true, - success: function(data) { - var jobID = data.deletefirewallruleresponse.jobid; - - args.response.success({ - _custom: { - jobId: jobID - }, - notification: { - label: 'label.remove.egress.rule', - poll: pollAsyncJobResult - } - }); - }, - error: function(json) { - args.response.error(parseXMLHttpResponse(json)); - } - }); - } - } - }, - ignoreEmptyFields: true, - dataProvider: function(args) { - $.ajax({ - url: createURL('listFirewallRules'), - data: { - listAll: true, - networkid: args.context.networks[0].id, - trafficType: 'Egress' - }, - dataType: 'json', - async: true, - success: function(json) { - var response = json.listfirewallrulesresponse.firewallrule; - - args.response.success({ - data: response - }); - } - }); } - }); - } + }, + ignoreEmptyFields: true, + dataProvider: function(args) { + $.ajax({ + url: createURL('listSecurityGroups'), + data: { + id: args.context.securityGroups[0].id + }, + dataType: 'json', + async: true, + success: function(data) { + args.response.success({ + data: $.map( + data.listsecuritygroupsresponse.securitygroup[0].egressrule ? + data.listsecuritygroupsresponse.securitygroup[0].egressrule : [], + ingressEgressDataMap + ) + }); + } + }); + } + }) } }, From 5e87b0a38540f85cbbcf5a19d404347b63649c46 Mon Sep 17 00:00:00 2001 From: Dennis Lawler Date: Mon, 29 Apr 2013 15:10:09 -0700 Subject: [PATCH 24/66] Removing filterwin2k option Signed-off-by: Chiradeep Vittal --- patches/systemvm/debian/config/etc/dnsmasq.conf.tmpl | 2 +- patches/systemvm/debian/config/etc/vpcdnsmasq.conf | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/patches/systemvm/debian/config/etc/dnsmasq.conf.tmpl b/patches/systemvm/debian/config/etc/dnsmasq.conf.tmpl index 7d656cb2b77..38e5a8bbc96 100644 --- a/patches/systemvm/debian/config/etc/dnsmasq.conf.tmpl +++ b/patches/systemvm/debian/config/etc/dnsmasq.conf.tmpl @@ -27,7 +27,7 @@ bogus-priv # so don't use it if you use eg Kerberos, SIP, XMMP or Google-talk. # This option only affects forwarding, SRV records originating for # dnsmasq (via srv-host= lines) are not suppressed by it. -filterwin2k +# filterwin2k # Change this line if you want dns to get its upstream servers from # somewhere other that /etc/resolv.conf diff --git a/patches/systemvm/debian/config/etc/vpcdnsmasq.conf b/patches/systemvm/debian/config/etc/vpcdnsmasq.conf index 3717fc8a80c..3622d0e7916 100644 --- a/patches/systemvm/debian/config/etc/vpcdnsmasq.conf +++ b/patches/systemvm/debian/config/etc/vpcdnsmasq.conf @@ -460,6 +460,3 @@ log-facility=/var/log/dnsmasq.log # Include a another lot of configuration options. #conf-file=/etc/dnsmasq.more.conf conf-dir=/etc/dnsmasq.d - -# Don't reply Windows's periodical DNS request -filterwin2k From e0d8f01ecd92a1a7b74558d02a28be3b2f20a10d Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Tue, 30 Apr 2013 19:06:20 -0700 Subject: [PATCH 25/66] Removed framework-api which is completely useless. Changed framework-ipc to reference gson itself. Move VOs into engine-schema. --- .../src/com/cloud/event/UsageEvent.java | 0 .../storage/resource/StoragePoolResource.java | 0 .../storage/snapshot/SnapshotSchedule.java | 11 +-- core/pom.xml | 7 +- .../storage/snapshot/SnapshotSchedule.java | 46 ---------- core/src/com/cloud/vm/VirtualDisk.java | 31 ------- engine/pom.xml | 2 - .../schema}/src/com/cloud/alert/AlertVO.java | 0 .../cloud/configuration/ConfigurationVO.java | 0 .../cloud/configuration/ResourceCountVO.java | 0 .../cloud/configuration/ResourceLimitVO.java | 0 .../schema}/src/com/cloud/event/EventVO.java | 0 .../src/com/cloud/event/UsageEventVO.java | 0 .../src/com/cloud/event/dao/EventDao.java | 0 .../src/com/cloud/event/dao/EventDaoImpl.java | 0 .../com/cloud/event/dao/UsageEventDao.java | 7 +- .../cloud/event/dao/UsageEventDaoImpl.java | 26 +++--- .../schema}/src/com/cloud/user/AccountVO.java | 0 .../src/com/cloud/user/SSHKeyPairVO.java | 0 .../src/com/cloud/user/UserAccountVO.java | 0 .../src/com/cloud/user/UserStatisticsVO.java | 0 .../src/com/cloud/user/UserStatsLogVO.java | 0 .../schema}/src/com/cloud/user/UserVO.java | 0 .../src/com/cloud/vm/VMInstanceVO.java | 0 .../com/cloud/vm/snapshot/VMSnapshotVO.java | 0 framework/api/pom.xml | 42 --------- framework/ipc/pom.xml | 20 ++-- .../framework/async/AsyncCallFuture.java | 0 .../async/AsyncCompletionCallback.java | 0 .../client/ClientTransportProvider.java | 2 +- framework/pom.xml | 1 - pom.xml | 13 ++- server/pom.xml | 92 ++++++++----------- utils/pom.xml | 9 -- 34 files changed, 86 insertions(+), 223 deletions(-) rename {core => api}/src/com/cloud/event/UsageEvent.java (100%) rename {core => api}/src/com/cloud/storage/resource/StoragePoolResource.java (100%) delete mode 100644 core/src/com/cloud/storage/snapshot/SnapshotSchedule.java delete mode 100644 core/src/com/cloud/vm/VirtualDisk.java rename {core => engine/schema}/src/com/cloud/alert/AlertVO.java (100%) rename {core => engine/schema}/src/com/cloud/configuration/ConfigurationVO.java (100%) rename {core => engine/schema}/src/com/cloud/configuration/ResourceCountVO.java (100%) rename {core => engine/schema}/src/com/cloud/configuration/ResourceLimitVO.java (100%) rename {core => engine/schema}/src/com/cloud/event/EventVO.java (100%) rename {core => engine/schema}/src/com/cloud/event/UsageEventVO.java (100%) rename {core => engine/schema}/src/com/cloud/event/dao/EventDao.java (100%) rename {core => engine/schema}/src/com/cloud/event/dao/EventDaoImpl.java (100%) rename {core => engine/schema}/src/com/cloud/event/dao/UsageEventDao.java (89%) rename {core => engine/schema}/src/com/cloud/event/dao/UsageEventDaoImpl.java (92%) rename {core => engine/schema}/src/com/cloud/user/AccountVO.java (100%) rename {core => engine/schema}/src/com/cloud/user/SSHKeyPairVO.java (100%) rename {core => engine/schema}/src/com/cloud/user/UserAccountVO.java (100%) rename {core => engine/schema}/src/com/cloud/user/UserStatisticsVO.java (100%) rename {core => engine/schema}/src/com/cloud/user/UserStatsLogVO.java (100%) rename {core => engine/schema}/src/com/cloud/user/UserVO.java (100%) rename {core => engine/schema}/src/com/cloud/vm/VMInstanceVO.java (100%) rename {core => engine/schema}/src/com/cloud/vm/snapshot/VMSnapshotVO.java (100%) delete mode 100644 framework/api/pom.xml rename framework/{api => ipc}/src/org/apache/cloudstack/framework/async/AsyncCallFuture.java (100%) rename framework/{api => ipc}/src/org/apache/cloudstack/framework/async/AsyncCompletionCallback.java (100%) diff --git a/core/src/com/cloud/event/UsageEvent.java b/api/src/com/cloud/event/UsageEvent.java similarity index 100% rename from core/src/com/cloud/event/UsageEvent.java rename to api/src/com/cloud/event/UsageEvent.java diff --git a/core/src/com/cloud/storage/resource/StoragePoolResource.java b/api/src/com/cloud/storage/resource/StoragePoolResource.java similarity index 100% rename from core/src/com/cloud/storage/resource/StoragePoolResource.java rename to api/src/com/cloud/storage/resource/StoragePoolResource.java diff --git a/api/src/com/cloud/storage/snapshot/SnapshotSchedule.java b/api/src/com/cloud/storage/snapshot/SnapshotSchedule.java index 12c1445f0ad..6f3d2ce5468 100644 --- a/api/src/com/cloud/storage/snapshot/SnapshotSchedule.java +++ b/api/src/com/cloud/storage/snapshot/SnapshotSchedule.java @@ -16,12 +16,12 @@ // under the License. package com.cloud.storage.snapshot; +import org.apache.cloudstack.api.Identity; +import org.apache.cloudstack.api.InternalIdentity; + import java.util.Date; -public interface SnapshotSchedule { - long getId(); - - String getUuid(); +public interface SnapshotSchedule extends InternalIdentity, Identity { Long getVolumeId(); @@ -38,10 +38,9 @@ public interface SnapshotSchedule { Long getAsyncJobId(); - void setAsyncJobId(long asyncJobId); + void setAsyncJobId(Long asyncJobId); Long getSnapshotId(); void setSnapshotId(Long snapshotId); - } diff --git a/core/pom.xml b/core/pom.xml index 0da69529400..a2d487e531c 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -36,6 +36,11 @@ cloud-engine-api ${project.version} + + org.apache.cloudstack + cloud-engine-schema + ${project.version} + commons-httpclient commons-httpclient @@ -55,7 +60,5 @@ install - src - test diff --git a/core/src/com/cloud/storage/snapshot/SnapshotSchedule.java b/core/src/com/cloud/storage/snapshot/SnapshotSchedule.java deleted file mode 100644 index 6f3d2ce5468..00000000000 --- a/core/src/com/cloud/storage/snapshot/SnapshotSchedule.java +++ /dev/null @@ -1,46 +0,0 @@ -// 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.snapshot; - -import org.apache.cloudstack.api.Identity; -import org.apache.cloudstack.api.InternalIdentity; - -import java.util.Date; - -public interface SnapshotSchedule extends InternalIdentity, Identity { - - Long getVolumeId(); - - Long getPolicyId(); - - void setPolicyId(long policyId); - - /** - * @return the scheduledTimestamp - */ - Date getScheduledTimestamp(); - - void setScheduledTimestamp(Date scheduledTimestamp); - - Long getAsyncJobId(); - - void setAsyncJobId(Long asyncJobId); - - Long getSnapshotId(); - - void setSnapshotId(Long snapshotId); -} diff --git a/core/src/com/cloud/vm/VirtualDisk.java b/core/src/com/cloud/vm/VirtualDisk.java deleted file mode 100644 index ad7bb43d40b..00000000000 --- a/core/src/com/cloud/vm/VirtualDisk.java +++ /dev/null @@ -1,31 +0,0 @@ -// 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 com.cloud.storage.Storage; - -/** - * VirtualDisk describes the disks that are plugged into - * the virtual machine. - * - */ -public class VirtualDisk { - public Storage.ImageFormat format; - public String url; - public boolean bootable; - public long size; -} diff --git a/engine/pom.xml b/engine/pom.xml index 1a3d896d50d..169425ae14e 100644 --- a/engine/pom.xml +++ b/engine/pom.xml @@ -29,8 +29,6 @@ install - src - test api diff --git a/core/src/com/cloud/alert/AlertVO.java b/engine/schema/src/com/cloud/alert/AlertVO.java similarity index 100% rename from core/src/com/cloud/alert/AlertVO.java rename to engine/schema/src/com/cloud/alert/AlertVO.java diff --git a/core/src/com/cloud/configuration/ConfigurationVO.java b/engine/schema/src/com/cloud/configuration/ConfigurationVO.java similarity index 100% rename from core/src/com/cloud/configuration/ConfigurationVO.java rename to engine/schema/src/com/cloud/configuration/ConfigurationVO.java diff --git a/core/src/com/cloud/configuration/ResourceCountVO.java b/engine/schema/src/com/cloud/configuration/ResourceCountVO.java similarity index 100% rename from core/src/com/cloud/configuration/ResourceCountVO.java rename to engine/schema/src/com/cloud/configuration/ResourceCountVO.java diff --git a/core/src/com/cloud/configuration/ResourceLimitVO.java b/engine/schema/src/com/cloud/configuration/ResourceLimitVO.java similarity index 100% rename from core/src/com/cloud/configuration/ResourceLimitVO.java rename to engine/schema/src/com/cloud/configuration/ResourceLimitVO.java diff --git a/core/src/com/cloud/event/EventVO.java b/engine/schema/src/com/cloud/event/EventVO.java similarity index 100% rename from core/src/com/cloud/event/EventVO.java rename to engine/schema/src/com/cloud/event/EventVO.java diff --git a/core/src/com/cloud/event/UsageEventVO.java b/engine/schema/src/com/cloud/event/UsageEventVO.java similarity index 100% rename from core/src/com/cloud/event/UsageEventVO.java rename to engine/schema/src/com/cloud/event/UsageEventVO.java diff --git a/core/src/com/cloud/event/dao/EventDao.java b/engine/schema/src/com/cloud/event/dao/EventDao.java similarity index 100% rename from core/src/com/cloud/event/dao/EventDao.java rename to engine/schema/src/com/cloud/event/dao/EventDao.java diff --git a/core/src/com/cloud/event/dao/EventDaoImpl.java b/engine/schema/src/com/cloud/event/dao/EventDaoImpl.java similarity index 100% rename from core/src/com/cloud/event/dao/EventDaoImpl.java rename to engine/schema/src/com/cloud/event/dao/EventDaoImpl.java diff --git a/core/src/com/cloud/event/dao/UsageEventDao.java b/engine/schema/src/com/cloud/event/dao/UsageEventDao.java similarity index 89% rename from core/src/com/cloud/event/dao/UsageEventDao.java rename to engine/schema/src/com/cloud/event/dao/UsageEventDao.java index 52fa01d0924..01979e18ea3 100644 --- a/core/src/com/cloud/event/dao/UsageEventDao.java +++ b/engine/schema/src/com/cloud/event/dao/UsageEventDao.java @@ -20,16 +20,15 @@ import java.util.Date; import java.util.List; import com.cloud.event.UsageEventVO; -import com.cloud.exception.UsageServerException; import com.cloud.utils.db.GenericDao; public interface UsageEventDao extends GenericDao { - + public List listLatestEvents(Date endDate); public List getLatestEvent(); - - List getRecentEvents(Date endDate) throws UsageServerException; + + List getRecentEvents(Date endDate); List listDirectIpEvents(Date startDate, Date endDate, long zoneId); diff --git a/core/src/com/cloud/event/dao/UsageEventDaoImpl.java b/engine/schema/src/com/cloud/event/dao/UsageEventDaoImpl.java similarity index 92% rename from core/src/com/cloud/event/dao/UsageEventDaoImpl.java rename to engine/schema/src/com/cloud/event/dao/UsageEventDaoImpl.java index dafc8d4d5ec..004ab7c381f 100644 --- a/core/src/com/cloud/event/dao/UsageEventDaoImpl.java +++ b/engine/schema/src/com/cloud/event/dao/UsageEventDaoImpl.java @@ -30,7 +30,6 @@ import org.springframework.stereotype.Component; import com.cloud.dc.Vlan; import com.cloud.event.EventTypes; import com.cloud.event.UsageEventVO; -import com.cloud.exception.UsageServerException; import com.cloud.utils.DateUtil; import com.cloud.utils.db.DB; import com.cloud.utils.db.Filter; @@ -38,6 +37,7 @@ import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; +import com.cloud.utils.exception.CloudRuntimeException; @Component @Local(value={UsageEventDao.class}) @@ -58,8 +58,8 @@ public class UsageEventDaoImpl extends GenericDaoBase implem latestEventsSearch.and("processed", latestEventsSearch.entity().isProcessed(), SearchCriteria.Op.EQ); latestEventsSearch.and("enddate", latestEventsSearch.entity().getCreateDate(), SearchCriteria.Op.LTEQ); latestEventsSearch.done(); - - IpeventsSearch = createSearchBuilder(); + + IpeventsSearch = createSearchBuilder(); IpeventsSearch.and("startdate", IpeventsSearch.entity().getCreateDate(), SearchCriteria.Op.GTEQ); IpeventsSearch.and("enddate", IpeventsSearch.entity().getCreateDate(), SearchCriteria.Op.LTEQ); IpeventsSearch.and("zoneid", IpeventsSearch.entity().getZoneId(), SearchCriteria.Op.EQ); @@ -84,10 +84,10 @@ public class UsageEventDaoImpl extends GenericDaoBase implem Filter filter = new Filter(UsageEventVO.class, "id", Boolean.FALSE, Long.valueOf(0), Long.valueOf(1)); return listAll(filter); } - + @Override @DB - public synchronized List getRecentEvents(Date endDate) throws UsageServerException { + public synchronized List getRecentEvents(Date endDate) { long recentEventId = getMostRecentEventId(); long maxEventId = getMaxEventId(endDate); Transaction txn = Transaction.open(Transaction.USAGE_DB); @@ -114,12 +114,12 @@ public class UsageEventDaoImpl extends GenericDaoBase implem } catch (Exception ex) { txn.rollback(); s_logger.error("error copying events from cloud db to usage db", ex); - throw new UsageServerException(ex.getMessage()); + throw new CloudRuntimeException(ex.getMessage()); } } @DB - private long getMostRecentEventId() throws UsageServerException { + private long getMostRecentEventId() { Transaction txn = Transaction.open(Transaction.USAGE_DB); try { List latestEvents = getLatestEvent(); @@ -133,25 +133,25 @@ public class UsageEventDaoImpl extends GenericDaoBase implem return 0; } catch (Exception ex) { s_logger.error("error getting most recent event id", ex); - throw new UsageServerException(ex.getMessage()); + throw new CloudRuntimeException(ex.getMessage()); } finally { txn.close(); } } - private List findRecentEvents(Date endDate) throws UsageServerException { + private List findRecentEvents(Date endDate) { Transaction txn = Transaction.open(Transaction.USAGE_DB); try { return listLatestEvents(endDate); } catch (Exception ex) { s_logger.error("error getting most recent event date", ex); - throw new UsageServerException(ex.getMessage()); + throw new CloudRuntimeException(ex.getMessage()); } finally { txn.close(); } } - - private long getMaxEventId(Date endDate) throws UsageServerException { + + private long getMaxEventId(Date endDate) { Transaction txn = Transaction.currentTxn(); PreparedStatement pstmt = null; try { @@ -165,7 +165,7 @@ public class UsageEventDaoImpl extends GenericDaoBase implem return 0; } catch (Exception ex) { s_logger.error("error getting max event id", ex); - throw new UsageServerException(ex.getMessage()); + throw new CloudRuntimeException(ex.getMessage()); } finally { txn.close(); } diff --git a/core/src/com/cloud/user/AccountVO.java b/engine/schema/src/com/cloud/user/AccountVO.java similarity index 100% rename from core/src/com/cloud/user/AccountVO.java rename to engine/schema/src/com/cloud/user/AccountVO.java diff --git a/core/src/com/cloud/user/SSHKeyPairVO.java b/engine/schema/src/com/cloud/user/SSHKeyPairVO.java similarity index 100% rename from core/src/com/cloud/user/SSHKeyPairVO.java rename to engine/schema/src/com/cloud/user/SSHKeyPairVO.java diff --git a/core/src/com/cloud/user/UserAccountVO.java b/engine/schema/src/com/cloud/user/UserAccountVO.java similarity index 100% rename from core/src/com/cloud/user/UserAccountVO.java rename to engine/schema/src/com/cloud/user/UserAccountVO.java diff --git a/core/src/com/cloud/user/UserStatisticsVO.java b/engine/schema/src/com/cloud/user/UserStatisticsVO.java similarity index 100% rename from core/src/com/cloud/user/UserStatisticsVO.java rename to engine/schema/src/com/cloud/user/UserStatisticsVO.java diff --git a/core/src/com/cloud/user/UserStatsLogVO.java b/engine/schema/src/com/cloud/user/UserStatsLogVO.java similarity index 100% rename from core/src/com/cloud/user/UserStatsLogVO.java rename to engine/schema/src/com/cloud/user/UserStatsLogVO.java diff --git a/core/src/com/cloud/user/UserVO.java b/engine/schema/src/com/cloud/user/UserVO.java similarity index 100% rename from core/src/com/cloud/user/UserVO.java rename to engine/schema/src/com/cloud/user/UserVO.java diff --git a/core/src/com/cloud/vm/VMInstanceVO.java b/engine/schema/src/com/cloud/vm/VMInstanceVO.java similarity index 100% rename from core/src/com/cloud/vm/VMInstanceVO.java rename to engine/schema/src/com/cloud/vm/VMInstanceVO.java diff --git a/core/src/com/cloud/vm/snapshot/VMSnapshotVO.java b/engine/schema/src/com/cloud/vm/snapshot/VMSnapshotVO.java similarity index 100% rename from core/src/com/cloud/vm/snapshot/VMSnapshotVO.java rename to engine/schema/src/com/cloud/vm/snapshot/VMSnapshotVO.java diff --git a/framework/api/pom.xml b/framework/api/pom.xml deleted file mode 100644 index 5260ebc4bf6..00000000000 --- a/framework/api/pom.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - 4.0.0 - cloud-framework-api - - org.apache.cloudstack - cloudstack-framework - 4.2.0-SNAPSHOT - ../pom.xml - - - - - org.apache.cloudstack - cloud-utils - 4.2.0-SNAPSHOT - - - - - - install - src - ${project.basedir}/test - - - ${project.basedir}/test/resources - - - - diff --git a/framework/ipc/pom.xml b/framework/ipc/pom.xml index b7f4fcc78ce..2c2131f01c1 100644 --- a/framework/ipc/pom.xml +++ b/framework/ipc/pom.xml @@ -20,26 +20,24 @@ ../pom.xml - - org.apache.cloudstack - cloud-core - 4.2.0-SNAPSHOT + cglib + cglib-nodep + ${cs.cglib.version} + + + com.google.code.gson + gson + ${cs.gson.version} - org.apache.cloudstack cloud-utils - 4.2.0-SNAPSHOT + ${project.version} - - install - src - ${project.basedir}/test ${project.basedir}/test/resources diff --git a/framework/api/src/org/apache/cloudstack/framework/async/AsyncCallFuture.java b/framework/ipc/src/org/apache/cloudstack/framework/async/AsyncCallFuture.java similarity index 100% rename from framework/api/src/org/apache/cloudstack/framework/async/AsyncCallFuture.java rename to framework/ipc/src/org/apache/cloudstack/framework/async/AsyncCallFuture.java diff --git a/framework/api/src/org/apache/cloudstack/framework/async/AsyncCompletionCallback.java b/framework/ipc/src/org/apache/cloudstack/framework/async/AsyncCompletionCallback.java similarity index 100% rename from framework/api/src/org/apache/cloudstack/framework/async/AsyncCompletionCallback.java rename to framework/ipc/src/org/apache/cloudstack/framework/async/AsyncCompletionCallback.java diff --git a/framework/ipc/src/org/apache/cloudstack/framework/client/ClientTransportProvider.java b/framework/ipc/src/org/apache/cloudstack/framework/client/ClientTransportProvider.java index bd93824ea85..023b3181b20 100644 --- a/framework/ipc/src/org/apache/cloudstack/framework/client/ClientTransportProvider.java +++ b/framework/ipc/src/org/apache/cloudstack/framework/client/ClientTransportProvider.java @@ -28,7 +28,7 @@ import org.apache.cloudstack.framework.transport.TransportEndpoint; import org.apache.cloudstack.framework.transport.TransportEndpointSite; import org.apache.cloudstack.framework.transport.TransportProvider; -import com.cloud.utils.concurrency.NamedThreadFactory; +import com.cloud.utils.concurrency.NamedThreadFactory; public class ClientTransportProvider implements TransportProvider { public static final int DEFAULT_WORKER_POOL_SIZE = 5; diff --git a/framework/pom.xml b/framework/pom.xml index 4633dab2b30..4dfb409f04e 100644 --- a/framework/pom.xml +++ b/framework/pom.xml @@ -33,6 +33,5 @@ ipc rest events - api diff --git a/pom.xml b/pom.xml index 57073e3b19a..7f4a74664e0 100644 --- a/pom.xml +++ b/pom.xml @@ -255,6 +255,13 @@ install + src + test + + + test/resources + + ${basedir}/${cs.target.dir}/classes ${basedir}/${cs.target.dir}/test-classes @@ -275,8 +282,8 @@ - + org.eclipse.m2e lifecycle-mapping @@ -298,7 +305,7 @@ - + diff --git a/server/pom.xml b/server/pom.xml index 8b64335d50f..2d960bef303 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -1,22 +1,14 @@ - - + + 4.0.0 cloud-server Apache CloudStack Server @@ -110,35 +102,35 @@ **/*.xml - + test/resources - - %regex[.*[0-9]*To[0-9]*.*Test.*] - + + %regex[.*[0-9]*To[0-9]*.*Test.*] + - - org.apache.maven.plugins - maven-compiler-plugin - - - default-testCompile - test-compile - - - **/com/cloud/upgrade/*.java - **/com/cloud/async/*.java - - - - testCompile - - - - + + org.apache.maven.plugins + maven-compiler-plugin + + + default-testCompile + test-compile + + + **/com/cloud/upgrade/*.java + **/com/cloud/async/*.java + + + + testCompile + + + + org.apache.maven.plugins maven-surefire-plugin @@ -146,8 +138,8 @@ -Xmx1024m %regex[.*[0-9]*To[0-9]*.*Test.*] - com/cloud/upgrade/AdvanceZone223To224UpgradeTest - com/cloud/upgrade/AdvanceZone217To224UpgradeTest + com/cloud/upgrade/AdvanceZone223To224UpgradeTest + com/cloud/upgrade/AdvanceZone217To224UpgradeTest com/cloud/async/* com/cloud/cluster/* com/cloud/snapshot/* @@ -173,22 +165,18 @@ - + - - + + - + diff --git a/utils/pom.xml b/utils/pom.xml index d4bafbdcaf0..27430267cfe 100644 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -172,15 +172,6 @@ ${project.basedir}/test/resources - org.apache.maven.plugins From ad2777c54774854d54f6ce6e361b418a23e8888f Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Wed, 1 May 2013 05:46:15 -0700 Subject: [PATCH 26/66] Moved agent commands to core and out of api --- .../AgentControlChannelException.java | 0 .../resource/UnableDeleteHostException.java | 0 .../cloud/storage/StoragePoolDiscoverer.java | 8 +- core/src/com/cloud/agent/RecoveryHandler.java | 31 ------ .../cloud/agent/api/AgentControlAnswer.java | 0 .../cloud/agent/api/AgentControlCommand.java | 0 .../com/cloud/agent/api/AttachIsoCommand.java | 0 .../cloud/agent/api/AttachVolumeAnswer.java | 0 .../cloud/agent/api/AttachVolumeCommand.java | 0 .../cloud/agent/api/BackupSnapshotAnswer.java | 0 .../agent/api/BackupSnapshotCommand.java | 0 .../agent/api/BumpUpPriorityCommand.java | 0 .../com/cloud/agent/api/CancelCommand.java | 0 .../cloud/agent/api/ChangeAgentAnswer.java | 0 .../cloud/agent/api/ChangeAgentCommand.java | 0 .../cloud/agent/api/CheckHealthAnswer.java | 0 .../cloud/agent/api/CheckHealthCommand.java | 0 .../cloud/agent/api/CheckNetworkAnswer.java | 0 .../cloud/agent/api/CheckNetworkCommand.java | 0 .../cloud/agent/api/CheckOnHostAnswer.java | 0 .../cloud/agent/api/CheckOnHostCommand.java | 0 .../cloud/agent/api/CheckRouterAnswer.java | 0 .../cloud/agent/api/CheckRouterCommand.java | 0 .../api/CheckS2SVpnConnectionsAnswer.java | 0 .../api/CheckS2SVpnConnectionsCommand.java | 0 .../com/cloud/agent/api/CheckStateAnswer.java | 0 .../cloud/agent/api/CheckStateCommand.java | 0 .../agent/api/CheckVirtualMachineAnswer.java | 0 .../agent/api/CheckVirtualMachineCommand.java | 0 .../agent/api/CleanupNetworkRulesCmd.java | 0 .../api/CleanupSnapshotBackupCommand.java | 0 .../cloud/agent/api/ClusterSyncAnswer.java | 0 .../cloud/agent/api/ClusterSyncCommand.java | 0 .../agent/api/ComputeChecksumCommand.java | 0 .../ConsoleAccessAuthenticationAnswer.java | 0 .../ConsoleAccessAuthenticationCommand.java | 0 .../api/ConsoleProxyLoadReportCommand.java | 0 ...atePrivateTemplateFromSnapshotCommand.java | 0 ...reatePrivateTemplateFromVolumeCommand.java | 0 .../agent/api/CreateStoragePoolCommand.java | 0 .../agent/api/CreateVMSnapshotAnswer.java | 0 .../agent/api/CreateVMSnapshotCommand.java | 0 .../api/CreateVolumeFromSnapshotAnswer.java | 0 .../api/CreateVolumeFromSnapshotCommand.java | 0 .../api/CreateVolumeFromVMSnapshotAnswer.java | 0 .../CreateVolumeFromVMSnapshotCommand.java | 0 .../src/com/cloud/agent/api/CronCommand.java | 0 .../api/DeleteObjectFromSwiftCommand.java | 0 .../agent/api/DeleteSnapshotBackupAnswer.java | 0 .../api/DeleteSnapshotBackupCommand.java | 0 .../agent/api/DeleteSnapshotsDirCommand.java | 0 .../agent/api/DeleteStoragePoolCommand.java | 0 .../api/DeleteTemplateFromS3Command.java | 0 .../agent/api/DeleteVMSnapshotAnswer.java | 0 .../agent/api/DeleteVMSnapshotCommand.java | 0 .../api/DownloadSnapshotFromS3Command.java | 0 ...mplateFromS3ToSecondaryStorageCommand.java | 0 .../src/com/cloud/agent/api/FenceAnswer.java | 0 .../src/com/cloud/agent/api/FenceCommand.java | 0 .../cloud/agent/api/GetDomRVersionAnswer.java | 0 .../cloud/agent/api/GetDomRVersionCmd.java | 0 .../cloud/agent/api/GetFileStatsAnswer.java | 0 .../cloud/agent/api/GetFileStatsCommand.java | 0 .../cloud/agent/api/GetHostStatsAnswer.java | 0 .../cloud/agent/api/GetHostStatsCommand.java | 0 .../agent/api/GetStorageStatsAnswer.java | 0 .../agent/api/GetStorageStatsCommand.java | 0 .../com/cloud/agent/api/GetVmStatsAnswer.java | 0 .../cloud/agent/api/GetVmStatsCommand.java | 0 .../com/cloud/agent/api/GetVncPortAnswer.java | 0 .../cloud/agent/api/GetVncPortCommand.java | 0 .../com/cloud/agent/api/HostStatsEntry.java | 0 .../com/cloud/agent/api/MaintainAnswer.java | 0 .../com/cloud/agent/api/MaintainCommand.java | 0 .../cloud/agent/api/ManageSnapshotAnswer.java | 0 .../agent/api/ManageSnapshotCommand.java | 0 .../com/cloud/agent/api/MigrateAnswer.java | 0 .../com/cloud/agent/api/MigrateCommand.java | 0 .../agent/api/MigrateWithStorageAnswer.java | 0 .../agent/api/MigrateWithStorageCommand.java | 0 .../api/MigrateWithStorageCompleteAnswer.java | 0 .../MigrateWithStorageCompleteCommand.java | 0 .../api/MigrateWithStorageReceiveAnswer.java | 0 .../api/MigrateWithStorageReceiveCommand.java | 0 .../api/MigrateWithStorageSendAnswer.java | 0 .../api/MigrateWithStorageSendCommand.java | 0 .../cloud/agent/api/ModifySshKeysCommand.java | 0 .../agent/api/ModifyStoragePoolAnswer.java | 0 .../agent/api/ModifyStoragePoolCommand.java | 0 .../cloud/agent/api/NetworkUsageAnswer.java | 0 .../cloud/agent/api/NetworkUsageCommand.java | 0 .../src/com/cloud/agent/api/PingAnswer.java | 0 .../src/com/cloud/agent/api/PingCommand.java | 0 .../cloud/agent/api/PingRoutingCommand.java | 0 .../api/PingRoutingWithNwGroupsCommand.java | 0 .../agent/api/PingRoutingWithOvsCommand.java | 0 .../cloud/agent/api/PingStorageCommand.java | 0 .../com/cloud/agent/api/PingTestCommand.java | 0 .../com/cloud/agent/api/PlugNicAnswer.java | 0 .../com/cloud/agent/api/PlugNicCommand.java | 0 .../com/cloud/agent/api/PoolEjectCommand.java | 0 .../agent/api/PrepareForMigrationAnswer.java | 0 .../agent/api/PrepareForMigrationCommand.java | 0 .../agent/api/PrepareOCFS2NodesCommand.java | 0 .../api/PropagateResourceEventCommand.java | 0 .../src/com/cloud/agent/api/ReadyAnswer.java | 0 .../src/com/cloud/agent/api/ReadyCommand.java | 0 .../src/com/cloud/agent/api/RebootAnswer.java | 0 .../com/cloud/agent/api/RebootCommand.java | 0 .../cloud/agent/api/RebootRouterCommand.java | 0 .../agent/api/RevertToVMSnapshotAnswer.java | 0 .../agent/api/RevertToVMSnapshotCommand.java | 0 .../com/cloud/agent/api/ScaleVmAnswer.java | 0 .../com/cloud/agent/api/ScaleVmCommand.java | 0 .../api/ScheduleHostScanTaskCommand.java | 0 .../api/SecStorageFirewallCfgCommand.java | 0 .../agent/api/SecStorageSetupAnswer.java | 0 .../agent/api/SecStorageSetupCommand.java | 0 .../agent/api/SecStorageVMSetupCommand.java | 0 .../agent/api/SecurityGroupRuleAnswer.java | 0 .../agent/api/SecurityGroupRulesCmd.java | 0 .../src/com/cloud/agent/api/SetupAnswer.java | 0 .../src/com/cloud/agent/api/SetupCommand.java | 0 .../agent/api/SetupGuestNetworkAnswer.java | 0 .../agent/api/SetupGuestNetworkCommand.java | 0 .../com/cloud/agent/api/ShutdownCommand.java | 0 .../com/cloud/agent/api/SnapshotCommand.java | 0 .../src/com/cloud/agent/api/StartAnswer.java | 0 .../src/com/cloud/agent/api/StartCommand.java | 0 .../com/cloud/agent/api/StartupAnswer.java | 0 .../com/cloud/agent/api/StartupCommand.java | 0 .../agent/api/StartupExternalDhcpCommand.java | 0 .../api/StartupExternalFirewallCommand.java | 0 .../StartupExternalLoadBalancerCommand.java | 0 .../cloud/agent/api/StartupProxyCommand.java | 0 .../agent/api/StartupPxeServerCommand.java | 0 .../agent/api/StartupRoutingCommand.java | 0 .../api/StartupSecondaryStorageCommand.java | 0 .../agent/api/StartupStorageCommand.java | 0 .../api/StartupTrafficMonitorCommand.java | 0 .../src/com/cloud/agent/api/StopAnswer.java | 0 .../src/com/cloud/agent/api/StopCommand.java | 0 .../cloud/agent/api/TransferAgentCommand.java | 0 .../com/cloud/agent/api/UnPlugNicAnswer.java | 0 .../com/cloud/agent/api/UnPlugNicCommand.java | 0 .../cloud/agent/api/UnregisterVMCommand.java | 0 .../agent/api/UpdateHostPasswordCommand.java | 0 .../com/cloud/agent/api/UpgradeAnswer.java | 0 .../com/cloud/agent/api/UpgradeCommand.java | 0 .../agent/api/UpgradeSnapshotCommand.java | 0 ...mplateToS3FromSecondaryStorageCommand.java | 0 .../agent/api/VMSnapshotBaseCommand.java | 0 .../src/com/cloud/agent/api/VMSnapshotTO.java | 0 .../agent/api/ValidateSnapshotAnswer.java | 0 .../agent/api/ValidateSnapshotCommand.java | 0 .../src/com/cloud/agent/api/VmStatsEntry.java | 0 .../api/baremetal/IpmISetBootDevCommand.java | 0 .../api/baremetal/IpmiBootorResetCommand.java | 0 .../api/baremetal/PreparePxeServerAnswer.java | 0 .../baremetal/PreparePxeServerCommand.java | 0 .../prepareCreateTemplateCommand.java | 0 .../cloud/agent/api/check/CheckSshAnswer.java | 0 .../agent/api/check/CheckSshCommand.java | 0 .../api/downloadSnapshotFromSwiftCommand.java | 0 ...ateFromSwiftToSecondaryStorageCommand.java | 0 .../proxy/CheckConsoleProxyLoadCommand.java | 0 .../api/proxy/ConsoleProxyLoadAnswer.java | 0 .../cloud/agent/api/proxy/ProxyCommand.java | 0 ...rtConsoleProxyAgentHttpHandlerCommand.java | 0 .../proxy/WatchConsoleProxyLoadCommand.java | 0 .../CreateLoadBalancerApplianceCommand.java | 0 .../DestroyLoadBalancerApplianceCommand.java | 0 .../agent/api/routing/DhcpEntryCommand.java | 0 .../GlobalLoadBalancerConfigAnswer.java | 0 .../GlobalLoadBalancerConfigCommand.java | 0 .../routing/HealthCheckLBConfigAnswer.java | 0 .../routing/HealthCheckLBConfigCommand.java | 0 .../agent/api/routing/IpAssocAnswer.java | 0 .../agent/api/routing/IpAssocCommand.java | 0 .../agent/api/routing/IpAssocVpcCommand.java | 0 .../routing/LoadBalancerConfigCommand.java | 0 .../api/routing/NetworkElementCommand.java | 0 .../routing/RemoteAccessVpnCfgCommand.java | 0 .../api/routing/SavePasswordCommand.java | 0 .../api/routing/SetFirewallRulesAnswer.java | 0 .../api/routing/SetFirewallRulesCommand.java | 0 .../api/routing/SetNetworkACLAnswer.java | 0 .../api/routing/SetNetworkACLCommand.java | 0 .../routing/SetPortForwardingRulesAnswer.java | 0 .../SetPortForwardingRulesCommand.java | 0 .../SetPortForwardingRulesVpcCommand.java | 0 .../agent/api/routing/SetSourceNatAnswer.java | 0 .../api/routing/SetSourceNatCommand.java | 0 .../api/routing/SetStaticNatRulesAnswer.java | 0 .../api/routing/SetStaticNatRulesCommand.java | 0 .../api/routing/SetStaticRouteAnswer.java | 0 .../api/routing/SetStaticRouteCommand.java | 0 .../api/routing/Site2SiteVpnCfgCommand.java | 0 .../api/routing/SiteLoadBalancerConfig.java | 0 .../agent/api/routing/UserDataCommand.java | 0 .../agent/api/routing/VmDataCommand.java | 0 .../agent/api/routing/VpnUsersCfgCommand.java | 0 .../api/storage/AbstractDownloadCommand.java | 0 .../api/storage/AbstractUploadCommand.java | 0 .../agent/api/storage/CopyVolumeAnswer.java | 0 .../agent/api/storage/CopyVolumeCommand.java | 0 .../cloud/agent/api/storage/CreateAnswer.java | 0 .../agent/api/storage/CreateCommand.java | 0 .../CreateEntityDownloadURLAnswer.java | 0 .../CreateEntityDownloadURLCommand.java | 0 .../storage/CreatePrivateTemplateAnswer.java | 0 .../storage/CreatePrivateTemplateCommand.java | 0 .../DeleteEntityDownloadURLAnswer.java | 0 .../DeleteEntityDownloadURLCommand.java | 0 .../api/storage/DeleteTemplateCommand.java | 0 .../api/storage/DeleteVolumeCommand.java | 0 .../agent/api/storage/DestroyAnswer.java | 0 .../agent/api/storage/DestroyCommand.java | 0 .../agent/api/storage/DownloadAnswer.java | 0 .../agent/api/storage/DownloadCommand.java | 0 .../api/storage/DownloadProgressCommand.java | 0 .../agent/api/storage/ListTemplateAnswer.java | 0 .../api/storage/ListTemplateCommand.java | 0 .../agent/api/storage/ListVolumeAnswer.java | 0 .../agent/api/storage/ListVolumeCommand.java | 0 .../ManageVolumeAvailabilityAnswer.java | 0 .../ManageVolumeAvailabilityCommand.java | 0 .../api/storage/MigrateVolumeAnswer.java | 0 .../api/storage/MigrateVolumeCommand.java | 0 .../storage/PrimaryStorageDownloadAnswer.java | 0 .../PrimaryStorageDownloadCommand.java | 0 .../agent/api/storage/ResizeVolumeAnswer.java | 0 .../api/storage/ResizeVolumeCommand.java | 0 .../agent/api/storage/StorageCommand.java | 0 .../agent/api/storage/UpgradeDiskAnswer.java | 0 .../agent/api/storage/UpgradeDiskCommand.java | 0 .../cloud/agent/api/storage/UploadAnswer.java | 0 .../agent/api/storage/UploadCommand.java | 0 .../api/storage/UploadProgressCommand.java | 0 .../cloud/agent/api/storage/ssCommand.java | 0 ...ateToSwiftFromSecondaryStorageCommand.java | 0 .../com/cloud/resource/ResourceListener.java | 40 ++++---- .../storage/resource/StoragePoolResource.java | 0 .../agent/test/AgentControlAnswerTest.java | 0 .../agent/test/AgentControlCommandTest.java | 0 .../cloudstack/api/agent/test/AnswerTest.java | 0 .../api/agent/test/AttachIsoCommandTest.java | 0 .../agent/test/AttachVolumeAnswerTest.java | 0 .../agent/test/AttachVolumeCommandTest.java | 0 .../agent/test/BackupSnapshotAnswerTest.java | 0 .../agent/test/BackupSnapshotCommandTest.java | 0 .../agent/test/BumpUpPriorityCommandTest.java | 0 .../api/agent/test/CancelCommandTest.java | 0 .../api/agent/test/ChangeAgentAnswerTest.java | 0 .../agent/test/ChangeAgentCommandTest.java | 0 .../api/agent/test/CheckHealthAnswerTest.java | 0 .../agent/test/CheckHealthCommandTest.java | 0 .../agent/test/CheckNetworkAnswerTest.java | 0 .../agent/test/CheckNetworkCommandTest.java | 0 .../agent/test/CheckOnHostCommandTest.java | 0 .../api/agent/test/SnapshotCommandTest.java | 0 .../api/test/ResizeVolumeCommandTest.java | 0 .../src/com/cloud/capacity/CapacityVO.java | 0 .../com/cloud/certificate/CertificateVO.java | 0 .../schema}/src/com/cloud/host/DetailVO.java | 0 .../schema}/src/com/cloud/host/HostTagVO.java | 0 .../schema}/src/com/cloud/host/HostVO.java | 0 .../hypervisor/HypervisorCapabilitiesVO.java | 0 .../src/com/cloud/network/VpnUserVO.java | 0 .../network/security/SecurityGroupRuleVO.java | 0 .../security/SecurityGroupRulesVO.java | 0 .../security/SecurityGroupVMMapVO.java | 0 .../network/security/SecurityGroupVO.java | 0 .../network/security/SecurityGroupWork.java | 0 .../network/security/SecurityGroupWorkVO.java | 0 .../network/security/VmRulesetLogVO.java | 0 .../src/com/cloud/storage/DiskOfferingVO.java | 0 .../com/cloud/storage/GuestOSCategoryVO.java | 0 .../src/com/cloud/storage/GuestOSVO.java | 0 .../com/cloud/storage/LaunchPermissionVO.java | 0 .../schema}/src/com/cloud/storage/S3VO.java | 0 .../com/cloud/storage/SnapshotPolicyVO.java | 0 .../com/cloud/storage/SnapshotScheduleVO.java | 0 .../src/com/cloud/storage/SnapshotVO.java | 0 .../cloud/storage/StoragePoolHostAssoc.java | 0 .../com/cloud/storage/StoragePoolHostVO.java | 20 ++-- .../com/cloud/storage/StoragePoolWorkVO.java | 0 .../src/com/cloud/storage/SwiftVO.java | 0 .../src/com/cloud/storage/UploadVO.java | 0 .../com/cloud/storage/VMTemplateDetailVO.java | 0 .../com/cloud/storage/VMTemplateHostVO.java | 0 .../src/com/cloud/storage/VMTemplateS3VO.java | 0 .../storage/VMTemplateStoragePoolVO.java | 0 .../com/cloud/storage/VMTemplateSwiftVO.java | 0 .../src/com/cloud/storage/VMTemplateVO.java | 0 .../com/cloud/storage/VMTemplateZoneVO.java | 0 .../src/com/cloud/storage/VolumeHostVO.java | 0 .../src/com/cloud/storage/VolumeVO.java | 0 framework/jobs/pom.xml | 33 +++++-- framework/pom.xml | 1 + ...oudStackPrimaryDataStoreLifeCycleImpl.java | 44 +++------ server/pom.xml | 5 + .../src/com/cloud/alert/AlertManager.java | 0 .../src/com/cloud/async/AsyncJobVO.java | 0 .../src/com/cloud/async/SyncQueueItemVO.java | 0 .../src/com/cloud/async/SyncQueueVO.java | 0 .../cloud/capacity/CapacityManagerImpl.java | 99 +++++++++---------- .../com/cloud/storage/OCFS2ManagerImpl.java | 48 ++++----- 308 files changed, 148 insertions(+), 181 deletions(-) rename {core => api}/src/com/cloud/exception/AgentControlChannelException.java (100%) rename {core => api}/src/com/cloud/resource/UnableDeleteHostException.java (100%) rename {core => api}/src/com/cloud/storage/StoragePoolDiscoverer.java (73%) delete mode 100644 core/src/com/cloud/agent/RecoveryHandler.java rename {api => core}/src/com/cloud/agent/api/AgentControlAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/AgentControlCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/AttachIsoCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/AttachVolumeAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/AttachVolumeCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/BackupSnapshotAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/BackupSnapshotCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/BumpUpPriorityCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/CancelCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/ChangeAgentAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/ChangeAgentCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/CheckHealthAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/CheckHealthCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/CheckNetworkAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/CheckNetworkCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/CheckOnHostAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/CheckOnHostCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/CheckRouterAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/CheckRouterCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/CheckS2SVpnConnectionsAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/CheckS2SVpnConnectionsCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/CheckStateAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/CheckStateCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/CheckVirtualMachineAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/CheckVirtualMachineCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/CleanupNetworkRulesCmd.java (100%) rename {api => core}/src/com/cloud/agent/api/CleanupSnapshotBackupCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/ClusterSyncAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/ClusterSyncCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/ComputeChecksumCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/ConsoleAccessAuthenticationAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/ConsoleAccessAuthenticationCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/ConsoleProxyLoadReportCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/CreatePrivateTemplateFromVolumeCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/CreateStoragePoolCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/CreateVMSnapshotAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/CreateVMSnapshotCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/CreateVolumeFromSnapshotAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/CreateVolumeFromVMSnapshotAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/CreateVolumeFromVMSnapshotCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/CronCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/DeleteObjectFromSwiftCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/DeleteSnapshotBackupAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/DeleteSnapshotBackupCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/DeleteSnapshotsDirCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/DeleteStoragePoolCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/DeleteTemplateFromS3Command.java (100%) rename {api => core}/src/com/cloud/agent/api/DeleteVMSnapshotAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/DeleteVMSnapshotCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/DownloadSnapshotFromS3Command.java (100%) rename {api => core}/src/com/cloud/agent/api/DownloadTemplateFromS3ToSecondaryStorageCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/FenceAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/FenceCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/GetDomRVersionAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/GetDomRVersionCmd.java (100%) rename {api => core}/src/com/cloud/agent/api/GetFileStatsAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/GetFileStatsCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/GetHostStatsAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/GetHostStatsCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/GetStorageStatsAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/GetStorageStatsCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/GetVmStatsAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/GetVmStatsCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/GetVncPortAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/GetVncPortCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/HostStatsEntry.java (100%) rename {api => core}/src/com/cloud/agent/api/MaintainAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/MaintainCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/ManageSnapshotAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/ManageSnapshotCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/MigrateAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/MigrateCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/MigrateWithStorageAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/MigrateWithStorageCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/MigrateWithStorageCompleteAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/MigrateWithStorageCompleteCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/MigrateWithStorageReceiveAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/MigrateWithStorageReceiveCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/MigrateWithStorageSendAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/MigrateWithStorageSendCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/ModifySshKeysCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/ModifyStoragePoolAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/ModifyStoragePoolCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/NetworkUsageAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/NetworkUsageCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/PingAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/PingCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/PingRoutingCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/PingRoutingWithNwGroupsCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/PingRoutingWithOvsCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/PingStorageCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/PingTestCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/PlugNicAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/PlugNicCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/PoolEjectCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/PrepareForMigrationAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/PrepareForMigrationCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/PrepareOCFS2NodesCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/PropagateResourceEventCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/ReadyAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/ReadyCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/RebootAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/RebootCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/RebootRouterCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/RevertToVMSnapshotAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/RevertToVMSnapshotCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/ScaleVmAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/ScaleVmCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/ScheduleHostScanTaskCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/SecStorageFirewallCfgCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/SecStorageSetupAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/SecStorageSetupCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/SecStorageVMSetupCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/SecurityGroupRuleAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/SecurityGroupRulesCmd.java (100%) rename {api => core}/src/com/cloud/agent/api/SetupAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/SetupCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/SetupGuestNetworkAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/SetupGuestNetworkCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/ShutdownCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/SnapshotCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/StartAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/StartCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/StartupAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/StartupCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/StartupExternalDhcpCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/StartupExternalFirewallCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/StartupExternalLoadBalancerCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/StartupProxyCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/StartupPxeServerCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/StartupRoutingCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/StartupSecondaryStorageCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/StartupStorageCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/StartupTrafficMonitorCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/StopAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/StopCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/TransferAgentCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/UnPlugNicAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/UnPlugNicCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/UnregisterVMCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/UpdateHostPasswordCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/UpgradeAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/UpgradeCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/UpgradeSnapshotCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/UploadTemplateToS3FromSecondaryStorageCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/VMSnapshotBaseCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/VMSnapshotTO.java (100%) rename {api => core}/src/com/cloud/agent/api/ValidateSnapshotAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/ValidateSnapshotCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/VmStatsEntry.java (100%) rename {api => core}/src/com/cloud/agent/api/baremetal/IpmISetBootDevCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/baremetal/IpmiBootorResetCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/baremetal/PreparePxeServerAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/baremetal/PreparePxeServerCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/baremetal/prepareCreateTemplateCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/check/CheckSshAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/check/CheckSshCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/downloadSnapshotFromSwiftCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/downloadTemplateFromSwiftToSecondaryStorageCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/proxy/CheckConsoleProxyLoadCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/proxy/ConsoleProxyLoadAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/proxy/ProxyCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/proxy/StartConsoleProxyAgentHttpHandlerCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/proxy/WatchConsoleProxyLoadCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/CreateLoadBalancerApplianceCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/DestroyLoadBalancerApplianceCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/DhcpEntryCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/GlobalLoadBalancerConfigAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/GlobalLoadBalancerConfigCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/HealthCheckLBConfigAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/HealthCheckLBConfigCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/IpAssocAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/IpAssocCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/IpAssocVpcCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/LoadBalancerConfigCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/NetworkElementCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/RemoteAccessVpnCfgCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/SavePasswordCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/SetFirewallRulesAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/SetFirewallRulesCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/SetNetworkACLAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/SetNetworkACLCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/SetPortForwardingRulesAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/SetPortForwardingRulesCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/SetPortForwardingRulesVpcCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/SetSourceNatAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/SetSourceNatCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/SetStaticNatRulesAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/SetStaticNatRulesCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/SetStaticRouteAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/SetStaticRouteCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/Site2SiteVpnCfgCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/SiteLoadBalancerConfig.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/UserDataCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/VmDataCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/routing/VpnUsersCfgCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/AbstractDownloadCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/AbstractUploadCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/CopyVolumeAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/CopyVolumeCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/CreateAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/CreateCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/CreateEntityDownloadURLAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/CreateEntityDownloadURLCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/CreatePrivateTemplateAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/CreatePrivateTemplateCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/DeleteEntityDownloadURLAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/DeleteEntityDownloadURLCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/DeleteTemplateCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/DeleteVolumeCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/DestroyAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/DestroyCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/DownloadAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/DownloadCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/DownloadProgressCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/ListTemplateAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/ListTemplateCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/ListVolumeAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/ListVolumeCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/ManageVolumeAvailabilityAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/ManageVolumeAvailabilityCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/MigrateVolumeAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/MigrateVolumeCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/PrimaryStorageDownloadAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/ResizeVolumeAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/ResizeVolumeCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/StorageCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/UpgradeDiskAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/UpgradeDiskCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/UploadAnswer.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/UploadCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/UploadProgressCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/storage/ssCommand.java (100%) rename {api => core}/src/com/cloud/agent/api/uploadTemplateToSwiftFromSecondaryStorageCommand.java (100%) rename {api => core}/src/com/cloud/storage/resource/StoragePoolResource.java (100%) rename {api => core}/test/org/apache/cloudstack/api/agent/test/AgentControlAnswerTest.java (100%) rename {api => core}/test/org/apache/cloudstack/api/agent/test/AgentControlCommandTest.java (100%) rename {api => core}/test/org/apache/cloudstack/api/agent/test/AnswerTest.java (100%) rename {api => core}/test/org/apache/cloudstack/api/agent/test/AttachIsoCommandTest.java (100%) rename {api => core}/test/org/apache/cloudstack/api/agent/test/AttachVolumeAnswerTest.java (100%) rename {api => core}/test/org/apache/cloudstack/api/agent/test/AttachVolumeCommandTest.java (100%) rename {api => core}/test/org/apache/cloudstack/api/agent/test/BackupSnapshotAnswerTest.java (100%) rename {api => core}/test/org/apache/cloudstack/api/agent/test/BackupSnapshotCommandTest.java (100%) rename {api => core}/test/org/apache/cloudstack/api/agent/test/BumpUpPriorityCommandTest.java (100%) rename {api => core}/test/org/apache/cloudstack/api/agent/test/CancelCommandTest.java (100%) rename {api => core}/test/org/apache/cloudstack/api/agent/test/ChangeAgentAnswerTest.java (100%) rename {api => core}/test/org/apache/cloudstack/api/agent/test/ChangeAgentCommandTest.java (100%) rename {api => core}/test/org/apache/cloudstack/api/agent/test/CheckHealthAnswerTest.java (100%) rename {api => core}/test/org/apache/cloudstack/api/agent/test/CheckHealthCommandTest.java (100%) rename {api => core}/test/org/apache/cloudstack/api/agent/test/CheckNetworkAnswerTest.java (100%) rename {api => core}/test/org/apache/cloudstack/api/agent/test/CheckNetworkCommandTest.java (100%) rename {api => core}/test/org/apache/cloudstack/api/agent/test/CheckOnHostCommandTest.java (100%) rename {api => core}/test/org/apache/cloudstack/api/agent/test/SnapshotCommandTest.java (100%) rename {api => core}/test/src/com/cloud/agent/api/test/ResizeVolumeCommandTest.java (100%) rename {core => engine/schema}/src/com/cloud/capacity/CapacityVO.java (100%) rename {core => engine/schema}/src/com/cloud/certificate/CertificateVO.java (100%) rename {core => engine/schema}/src/com/cloud/host/DetailVO.java (100%) rename {core => engine/schema}/src/com/cloud/host/HostTagVO.java (100%) rename {core => engine/schema}/src/com/cloud/host/HostVO.java (100%) rename {core => engine/schema}/src/com/cloud/hypervisor/HypervisorCapabilitiesVO.java (100%) rename {core => engine/schema}/src/com/cloud/network/VpnUserVO.java (100%) rename {core => engine/schema}/src/com/cloud/network/security/SecurityGroupRuleVO.java (100%) rename {core => engine/schema}/src/com/cloud/network/security/SecurityGroupRulesVO.java (100%) rename {core => engine/schema}/src/com/cloud/network/security/SecurityGroupVMMapVO.java (100%) rename {core => engine/schema}/src/com/cloud/network/security/SecurityGroupVO.java (100%) rename {core => engine/schema}/src/com/cloud/network/security/SecurityGroupWork.java (100%) rename {core => engine/schema}/src/com/cloud/network/security/SecurityGroupWorkVO.java (100%) rename {core => engine/schema}/src/com/cloud/network/security/VmRulesetLogVO.java (100%) rename {core => engine/schema}/src/com/cloud/storage/DiskOfferingVO.java (100%) rename {core => engine/schema}/src/com/cloud/storage/GuestOSCategoryVO.java (100%) rename {core => engine/schema}/src/com/cloud/storage/GuestOSVO.java (100%) rename {core => engine/schema}/src/com/cloud/storage/LaunchPermissionVO.java (100%) rename {core => engine/schema}/src/com/cloud/storage/S3VO.java (100%) rename {core => engine/schema}/src/com/cloud/storage/SnapshotPolicyVO.java (100%) rename {core => engine/schema}/src/com/cloud/storage/SnapshotScheduleVO.java (100%) rename {core => engine/schema}/src/com/cloud/storage/SnapshotVO.java (100%) rename {core => engine/schema}/src/com/cloud/storage/StoragePoolHostAssoc.java (100%) rename {core => engine/schema}/src/com/cloud/storage/StoragePoolHostVO.java (94%) rename {core => engine/schema}/src/com/cloud/storage/StoragePoolWorkVO.java (100%) rename {core => engine/schema}/src/com/cloud/storage/SwiftVO.java (100%) rename {core => engine/schema}/src/com/cloud/storage/UploadVO.java (100%) rename {core => engine/schema}/src/com/cloud/storage/VMTemplateDetailVO.java (100%) rename {core => engine/schema}/src/com/cloud/storage/VMTemplateHostVO.java (100%) rename {core => engine/schema}/src/com/cloud/storage/VMTemplateS3VO.java (100%) rename {core => engine/schema}/src/com/cloud/storage/VMTemplateStoragePoolVO.java (100%) rename {core => engine/schema}/src/com/cloud/storage/VMTemplateSwiftVO.java (100%) rename {core => engine/schema}/src/com/cloud/storage/VMTemplateVO.java (100%) rename {core => engine/schema}/src/com/cloud/storage/VMTemplateZoneVO.java (100%) rename {core => engine/schema}/src/com/cloud/storage/VolumeHostVO.java (100%) rename {core => engine/schema}/src/com/cloud/storage/VolumeVO.java (100%) rename {core => server}/src/com/cloud/alert/AlertManager.java (100%) rename {core => server}/src/com/cloud/async/AsyncJobVO.java (100%) rename {core => server}/src/com/cloud/async/SyncQueueItemVO.java (100%) rename {core => server}/src/com/cloud/async/SyncQueueVO.java (100%) diff --git a/core/src/com/cloud/exception/AgentControlChannelException.java b/api/src/com/cloud/exception/AgentControlChannelException.java similarity index 100% rename from core/src/com/cloud/exception/AgentControlChannelException.java rename to api/src/com/cloud/exception/AgentControlChannelException.java diff --git a/core/src/com/cloud/resource/UnableDeleteHostException.java b/api/src/com/cloud/resource/UnableDeleteHostException.java similarity index 100% rename from core/src/com/cloud/resource/UnableDeleteHostException.java rename to api/src/com/cloud/resource/UnableDeleteHostException.java diff --git a/core/src/com/cloud/storage/StoragePoolDiscoverer.java b/api/src/com/cloud/storage/StoragePoolDiscoverer.java similarity index 73% rename from core/src/com/cloud/storage/StoragePoolDiscoverer.java rename to api/src/com/cloud/storage/StoragePoolDiscoverer.java index c7dd362a5c3..40a925dc73e 100644 --- a/core/src/com/cloud/storage/StoragePoolDiscoverer.java +++ b/api/src/com/cloud/storage/StoragePoolDiscoverer.java @@ -19,8 +19,6 @@ package com.cloud.storage; import java.net.URI; import java.util.Map; -import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; - import com.cloud.exception.DiscoveryException; import com.cloud.utils.component.Adapter; @@ -29,7 +27,7 @@ import com.cloud.utils.component.Adapter; */ public interface StoragePoolDiscoverer extends Adapter { - Map> find(long dcId, Long podId, URI uri, Map details) throws DiscoveryException; - - Map> find(long dcId, Long podId, URI uri, Map details, String username, String password) throws DiscoveryException; + Map> find(long dcId, Long podId, URI uri, Map details) throws DiscoveryException; + + Map> find(long dcId, Long podId, URI uri, Map details, String username, String password) throws DiscoveryException; } diff --git a/core/src/com/cloud/agent/RecoveryHandler.java b/core/src/com/cloud/agent/RecoveryHandler.java deleted file mode 100644 index 418c7b1034f..00000000000 --- a/core/src/com/cloud/agent/RecoveryHandler.java +++ /dev/null @@ -1,31 +0,0 @@ -// 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.agent; - -import com.cloud.agent.api.Command; - -public interface RecoveryHandler { - /** - * Perform the necessary recovery because the success of this command - * is not known. - * - * @param agentId agent the commands were sent to. - * @param seq sequence number. - * @param cmds commands that failed. - */ - public void handle(long agentId, long seq, Command[] cmds); -} diff --git a/api/src/com/cloud/agent/api/AgentControlAnswer.java b/core/src/com/cloud/agent/api/AgentControlAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/AgentControlAnswer.java rename to core/src/com/cloud/agent/api/AgentControlAnswer.java diff --git a/api/src/com/cloud/agent/api/AgentControlCommand.java b/core/src/com/cloud/agent/api/AgentControlCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/AgentControlCommand.java rename to core/src/com/cloud/agent/api/AgentControlCommand.java diff --git a/api/src/com/cloud/agent/api/AttachIsoCommand.java b/core/src/com/cloud/agent/api/AttachIsoCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/AttachIsoCommand.java rename to core/src/com/cloud/agent/api/AttachIsoCommand.java diff --git a/api/src/com/cloud/agent/api/AttachVolumeAnswer.java b/core/src/com/cloud/agent/api/AttachVolumeAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/AttachVolumeAnswer.java rename to core/src/com/cloud/agent/api/AttachVolumeAnswer.java diff --git a/api/src/com/cloud/agent/api/AttachVolumeCommand.java b/core/src/com/cloud/agent/api/AttachVolumeCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/AttachVolumeCommand.java rename to core/src/com/cloud/agent/api/AttachVolumeCommand.java diff --git a/api/src/com/cloud/agent/api/BackupSnapshotAnswer.java b/core/src/com/cloud/agent/api/BackupSnapshotAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/BackupSnapshotAnswer.java rename to core/src/com/cloud/agent/api/BackupSnapshotAnswer.java diff --git a/api/src/com/cloud/agent/api/BackupSnapshotCommand.java b/core/src/com/cloud/agent/api/BackupSnapshotCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/BackupSnapshotCommand.java rename to core/src/com/cloud/agent/api/BackupSnapshotCommand.java diff --git a/api/src/com/cloud/agent/api/BumpUpPriorityCommand.java b/core/src/com/cloud/agent/api/BumpUpPriorityCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/BumpUpPriorityCommand.java rename to core/src/com/cloud/agent/api/BumpUpPriorityCommand.java diff --git a/api/src/com/cloud/agent/api/CancelCommand.java b/core/src/com/cloud/agent/api/CancelCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/CancelCommand.java rename to core/src/com/cloud/agent/api/CancelCommand.java diff --git a/api/src/com/cloud/agent/api/ChangeAgentAnswer.java b/core/src/com/cloud/agent/api/ChangeAgentAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/ChangeAgentAnswer.java rename to core/src/com/cloud/agent/api/ChangeAgentAnswer.java diff --git a/api/src/com/cloud/agent/api/ChangeAgentCommand.java b/core/src/com/cloud/agent/api/ChangeAgentCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/ChangeAgentCommand.java rename to core/src/com/cloud/agent/api/ChangeAgentCommand.java diff --git a/api/src/com/cloud/agent/api/CheckHealthAnswer.java b/core/src/com/cloud/agent/api/CheckHealthAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/CheckHealthAnswer.java rename to core/src/com/cloud/agent/api/CheckHealthAnswer.java diff --git a/api/src/com/cloud/agent/api/CheckHealthCommand.java b/core/src/com/cloud/agent/api/CheckHealthCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/CheckHealthCommand.java rename to core/src/com/cloud/agent/api/CheckHealthCommand.java diff --git a/api/src/com/cloud/agent/api/CheckNetworkAnswer.java b/core/src/com/cloud/agent/api/CheckNetworkAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/CheckNetworkAnswer.java rename to core/src/com/cloud/agent/api/CheckNetworkAnswer.java diff --git a/api/src/com/cloud/agent/api/CheckNetworkCommand.java b/core/src/com/cloud/agent/api/CheckNetworkCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/CheckNetworkCommand.java rename to core/src/com/cloud/agent/api/CheckNetworkCommand.java diff --git a/api/src/com/cloud/agent/api/CheckOnHostAnswer.java b/core/src/com/cloud/agent/api/CheckOnHostAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/CheckOnHostAnswer.java rename to core/src/com/cloud/agent/api/CheckOnHostAnswer.java diff --git a/api/src/com/cloud/agent/api/CheckOnHostCommand.java b/core/src/com/cloud/agent/api/CheckOnHostCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/CheckOnHostCommand.java rename to core/src/com/cloud/agent/api/CheckOnHostCommand.java diff --git a/api/src/com/cloud/agent/api/CheckRouterAnswer.java b/core/src/com/cloud/agent/api/CheckRouterAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/CheckRouterAnswer.java rename to core/src/com/cloud/agent/api/CheckRouterAnswer.java diff --git a/api/src/com/cloud/agent/api/CheckRouterCommand.java b/core/src/com/cloud/agent/api/CheckRouterCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/CheckRouterCommand.java rename to core/src/com/cloud/agent/api/CheckRouterCommand.java diff --git a/api/src/com/cloud/agent/api/CheckS2SVpnConnectionsAnswer.java b/core/src/com/cloud/agent/api/CheckS2SVpnConnectionsAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/CheckS2SVpnConnectionsAnswer.java rename to core/src/com/cloud/agent/api/CheckS2SVpnConnectionsAnswer.java diff --git a/api/src/com/cloud/agent/api/CheckS2SVpnConnectionsCommand.java b/core/src/com/cloud/agent/api/CheckS2SVpnConnectionsCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/CheckS2SVpnConnectionsCommand.java rename to core/src/com/cloud/agent/api/CheckS2SVpnConnectionsCommand.java diff --git a/api/src/com/cloud/agent/api/CheckStateAnswer.java b/core/src/com/cloud/agent/api/CheckStateAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/CheckStateAnswer.java rename to core/src/com/cloud/agent/api/CheckStateAnswer.java diff --git a/api/src/com/cloud/agent/api/CheckStateCommand.java b/core/src/com/cloud/agent/api/CheckStateCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/CheckStateCommand.java rename to core/src/com/cloud/agent/api/CheckStateCommand.java diff --git a/api/src/com/cloud/agent/api/CheckVirtualMachineAnswer.java b/core/src/com/cloud/agent/api/CheckVirtualMachineAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/CheckVirtualMachineAnswer.java rename to core/src/com/cloud/agent/api/CheckVirtualMachineAnswer.java diff --git a/api/src/com/cloud/agent/api/CheckVirtualMachineCommand.java b/core/src/com/cloud/agent/api/CheckVirtualMachineCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/CheckVirtualMachineCommand.java rename to core/src/com/cloud/agent/api/CheckVirtualMachineCommand.java diff --git a/api/src/com/cloud/agent/api/CleanupNetworkRulesCmd.java b/core/src/com/cloud/agent/api/CleanupNetworkRulesCmd.java similarity index 100% rename from api/src/com/cloud/agent/api/CleanupNetworkRulesCmd.java rename to core/src/com/cloud/agent/api/CleanupNetworkRulesCmd.java diff --git a/api/src/com/cloud/agent/api/CleanupSnapshotBackupCommand.java b/core/src/com/cloud/agent/api/CleanupSnapshotBackupCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/CleanupSnapshotBackupCommand.java rename to core/src/com/cloud/agent/api/CleanupSnapshotBackupCommand.java diff --git a/api/src/com/cloud/agent/api/ClusterSyncAnswer.java b/core/src/com/cloud/agent/api/ClusterSyncAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/ClusterSyncAnswer.java rename to core/src/com/cloud/agent/api/ClusterSyncAnswer.java diff --git a/api/src/com/cloud/agent/api/ClusterSyncCommand.java b/core/src/com/cloud/agent/api/ClusterSyncCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/ClusterSyncCommand.java rename to core/src/com/cloud/agent/api/ClusterSyncCommand.java diff --git a/api/src/com/cloud/agent/api/ComputeChecksumCommand.java b/core/src/com/cloud/agent/api/ComputeChecksumCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/ComputeChecksumCommand.java rename to core/src/com/cloud/agent/api/ComputeChecksumCommand.java diff --git a/api/src/com/cloud/agent/api/ConsoleAccessAuthenticationAnswer.java b/core/src/com/cloud/agent/api/ConsoleAccessAuthenticationAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/ConsoleAccessAuthenticationAnswer.java rename to core/src/com/cloud/agent/api/ConsoleAccessAuthenticationAnswer.java diff --git a/api/src/com/cloud/agent/api/ConsoleAccessAuthenticationCommand.java b/core/src/com/cloud/agent/api/ConsoleAccessAuthenticationCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/ConsoleAccessAuthenticationCommand.java rename to core/src/com/cloud/agent/api/ConsoleAccessAuthenticationCommand.java diff --git a/api/src/com/cloud/agent/api/ConsoleProxyLoadReportCommand.java b/core/src/com/cloud/agent/api/ConsoleProxyLoadReportCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/ConsoleProxyLoadReportCommand.java rename to core/src/com/cloud/agent/api/ConsoleProxyLoadReportCommand.java diff --git a/api/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java b/core/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java rename to core/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java diff --git a/api/src/com/cloud/agent/api/CreatePrivateTemplateFromVolumeCommand.java b/core/src/com/cloud/agent/api/CreatePrivateTemplateFromVolumeCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/CreatePrivateTemplateFromVolumeCommand.java rename to core/src/com/cloud/agent/api/CreatePrivateTemplateFromVolumeCommand.java diff --git a/api/src/com/cloud/agent/api/CreateStoragePoolCommand.java b/core/src/com/cloud/agent/api/CreateStoragePoolCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/CreateStoragePoolCommand.java rename to core/src/com/cloud/agent/api/CreateStoragePoolCommand.java diff --git a/api/src/com/cloud/agent/api/CreateVMSnapshotAnswer.java b/core/src/com/cloud/agent/api/CreateVMSnapshotAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/CreateVMSnapshotAnswer.java rename to core/src/com/cloud/agent/api/CreateVMSnapshotAnswer.java diff --git a/api/src/com/cloud/agent/api/CreateVMSnapshotCommand.java b/core/src/com/cloud/agent/api/CreateVMSnapshotCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/CreateVMSnapshotCommand.java rename to core/src/com/cloud/agent/api/CreateVMSnapshotCommand.java diff --git a/api/src/com/cloud/agent/api/CreateVolumeFromSnapshotAnswer.java b/core/src/com/cloud/agent/api/CreateVolumeFromSnapshotAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/CreateVolumeFromSnapshotAnswer.java rename to core/src/com/cloud/agent/api/CreateVolumeFromSnapshotAnswer.java diff --git a/api/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java b/core/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java rename to core/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java diff --git a/api/src/com/cloud/agent/api/CreateVolumeFromVMSnapshotAnswer.java b/core/src/com/cloud/agent/api/CreateVolumeFromVMSnapshotAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/CreateVolumeFromVMSnapshotAnswer.java rename to core/src/com/cloud/agent/api/CreateVolumeFromVMSnapshotAnswer.java diff --git a/api/src/com/cloud/agent/api/CreateVolumeFromVMSnapshotCommand.java b/core/src/com/cloud/agent/api/CreateVolumeFromVMSnapshotCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/CreateVolumeFromVMSnapshotCommand.java rename to core/src/com/cloud/agent/api/CreateVolumeFromVMSnapshotCommand.java diff --git a/api/src/com/cloud/agent/api/CronCommand.java b/core/src/com/cloud/agent/api/CronCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/CronCommand.java rename to core/src/com/cloud/agent/api/CronCommand.java diff --git a/api/src/com/cloud/agent/api/DeleteObjectFromSwiftCommand.java b/core/src/com/cloud/agent/api/DeleteObjectFromSwiftCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/DeleteObjectFromSwiftCommand.java rename to core/src/com/cloud/agent/api/DeleteObjectFromSwiftCommand.java diff --git a/api/src/com/cloud/agent/api/DeleteSnapshotBackupAnswer.java b/core/src/com/cloud/agent/api/DeleteSnapshotBackupAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/DeleteSnapshotBackupAnswer.java rename to core/src/com/cloud/agent/api/DeleteSnapshotBackupAnswer.java diff --git a/api/src/com/cloud/agent/api/DeleteSnapshotBackupCommand.java b/core/src/com/cloud/agent/api/DeleteSnapshotBackupCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/DeleteSnapshotBackupCommand.java rename to core/src/com/cloud/agent/api/DeleteSnapshotBackupCommand.java diff --git a/api/src/com/cloud/agent/api/DeleteSnapshotsDirCommand.java b/core/src/com/cloud/agent/api/DeleteSnapshotsDirCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/DeleteSnapshotsDirCommand.java rename to core/src/com/cloud/agent/api/DeleteSnapshotsDirCommand.java diff --git a/api/src/com/cloud/agent/api/DeleteStoragePoolCommand.java b/core/src/com/cloud/agent/api/DeleteStoragePoolCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/DeleteStoragePoolCommand.java rename to core/src/com/cloud/agent/api/DeleteStoragePoolCommand.java diff --git a/api/src/com/cloud/agent/api/DeleteTemplateFromS3Command.java b/core/src/com/cloud/agent/api/DeleteTemplateFromS3Command.java similarity index 100% rename from api/src/com/cloud/agent/api/DeleteTemplateFromS3Command.java rename to core/src/com/cloud/agent/api/DeleteTemplateFromS3Command.java diff --git a/api/src/com/cloud/agent/api/DeleteVMSnapshotAnswer.java b/core/src/com/cloud/agent/api/DeleteVMSnapshotAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/DeleteVMSnapshotAnswer.java rename to core/src/com/cloud/agent/api/DeleteVMSnapshotAnswer.java diff --git a/api/src/com/cloud/agent/api/DeleteVMSnapshotCommand.java b/core/src/com/cloud/agent/api/DeleteVMSnapshotCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/DeleteVMSnapshotCommand.java rename to core/src/com/cloud/agent/api/DeleteVMSnapshotCommand.java diff --git a/api/src/com/cloud/agent/api/DownloadSnapshotFromS3Command.java b/core/src/com/cloud/agent/api/DownloadSnapshotFromS3Command.java similarity index 100% rename from api/src/com/cloud/agent/api/DownloadSnapshotFromS3Command.java rename to core/src/com/cloud/agent/api/DownloadSnapshotFromS3Command.java diff --git a/api/src/com/cloud/agent/api/DownloadTemplateFromS3ToSecondaryStorageCommand.java b/core/src/com/cloud/agent/api/DownloadTemplateFromS3ToSecondaryStorageCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/DownloadTemplateFromS3ToSecondaryStorageCommand.java rename to core/src/com/cloud/agent/api/DownloadTemplateFromS3ToSecondaryStorageCommand.java diff --git a/api/src/com/cloud/agent/api/FenceAnswer.java b/core/src/com/cloud/agent/api/FenceAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/FenceAnswer.java rename to core/src/com/cloud/agent/api/FenceAnswer.java diff --git a/api/src/com/cloud/agent/api/FenceCommand.java b/core/src/com/cloud/agent/api/FenceCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/FenceCommand.java rename to core/src/com/cloud/agent/api/FenceCommand.java diff --git a/api/src/com/cloud/agent/api/GetDomRVersionAnswer.java b/core/src/com/cloud/agent/api/GetDomRVersionAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/GetDomRVersionAnswer.java rename to core/src/com/cloud/agent/api/GetDomRVersionAnswer.java diff --git a/api/src/com/cloud/agent/api/GetDomRVersionCmd.java b/core/src/com/cloud/agent/api/GetDomRVersionCmd.java similarity index 100% rename from api/src/com/cloud/agent/api/GetDomRVersionCmd.java rename to core/src/com/cloud/agent/api/GetDomRVersionCmd.java diff --git a/api/src/com/cloud/agent/api/GetFileStatsAnswer.java b/core/src/com/cloud/agent/api/GetFileStatsAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/GetFileStatsAnswer.java rename to core/src/com/cloud/agent/api/GetFileStatsAnswer.java diff --git a/api/src/com/cloud/agent/api/GetFileStatsCommand.java b/core/src/com/cloud/agent/api/GetFileStatsCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/GetFileStatsCommand.java rename to core/src/com/cloud/agent/api/GetFileStatsCommand.java diff --git a/api/src/com/cloud/agent/api/GetHostStatsAnswer.java b/core/src/com/cloud/agent/api/GetHostStatsAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/GetHostStatsAnswer.java rename to core/src/com/cloud/agent/api/GetHostStatsAnswer.java diff --git a/api/src/com/cloud/agent/api/GetHostStatsCommand.java b/core/src/com/cloud/agent/api/GetHostStatsCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/GetHostStatsCommand.java rename to core/src/com/cloud/agent/api/GetHostStatsCommand.java diff --git a/api/src/com/cloud/agent/api/GetStorageStatsAnswer.java b/core/src/com/cloud/agent/api/GetStorageStatsAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/GetStorageStatsAnswer.java rename to core/src/com/cloud/agent/api/GetStorageStatsAnswer.java diff --git a/api/src/com/cloud/agent/api/GetStorageStatsCommand.java b/core/src/com/cloud/agent/api/GetStorageStatsCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/GetStorageStatsCommand.java rename to core/src/com/cloud/agent/api/GetStorageStatsCommand.java diff --git a/api/src/com/cloud/agent/api/GetVmStatsAnswer.java b/core/src/com/cloud/agent/api/GetVmStatsAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/GetVmStatsAnswer.java rename to core/src/com/cloud/agent/api/GetVmStatsAnswer.java diff --git a/api/src/com/cloud/agent/api/GetVmStatsCommand.java b/core/src/com/cloud/agent/api/GetVmStatsCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/GetVmStatsCommand.java rename to core/src/com/cloud/agent/api/GetVmStatsCommand.java diff --git a/api/src/com/cloud/agent/api/GetVncPortAnswer.java b/core/src/com/cloud/agent/api/GetVncPortAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/GetVncPortAnswer.java rename to core/src/com/cloud/agent/api/GetVncPortAnswer.java diff --git a/api/src/com/cloud/agent/api/GetVncPortCommand.java b/core/src/com/cloud/agent/api/GetVncPortCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/GetVncPortCommand.java rename to core/src/com/cloud/agent/api/GetVncPortCommand.java diff --git a/api/src/com/cloud/agent/api/HostStatsEntry.java b/core/src/com/cloud/agent/api/HostStatsEntry.java similarity index 100% rename from api/src/com/cloud/agent/api/HostStatsEntry.java rename to core/src/com/cloud/agent/api/HostStatsEntry.java diff --git a/api/src/com/cloud/agent/api/MaintainAnswer.java b/core/src/com/cloud/agent/api/MaintainAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/MaintainAnswer.java rename to core/src/com/cloud/agent/api/MaintainAnswer.java diff --git a/api/src/com/cloud/agent/api/MaintainCommand.java b/core/src/com/cloud/agent/api/MaintainCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/MaintainCommand.java rename to core/src/com/cloud/agent/api/MaintainCommand.java diff --git a/api/src/com/cloud/agent/api/ManageSnapshotAnswer.java b/core/src/com/cloud/agent/api/ManageSnapshotAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/ManageSnapshotAnswer.java rename to core/src/com/cloud/agent/api/ManageSnapshotAnswer.java diff --git a/api/src/com/cloud/agent/api/ManageSnapshotCommand.java b/core/src/com/cloud/agent/api/ManageSnapshotCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/ManageSnapshotCommand.java rename to core/src/com/cloud/agent/api/ManageSnapshotCommand.java diff --git a/api/src/com/cloud/agent/api/MigrateAnswer.java b/core/src/com/cloud/agent/api/MigrateAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/MigrateAnswer.java rename to core/src/com/cloud/agent/api/MigrateAnswer.java diff --git a/api/src/com/cloud/agent/api/MigrateCommand.java b/core/src/com/cloud/agent/api/MigrateCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/MigrateCommand.java rename to core/src/com/cloud/agent/api/MigrateCommand.java diff --git a/api/src/com/cloud/agent/api/MigrateWithStorageAnswer.java b/core/src/com/cloud/agent/api/MigrateWithStorageAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/MigrateWithStorageAnswer.java rename to core/src/com/cloud/agent/api/MigrateWithStorageAnswer.java diff --git a/api/src/com/cloud/agent/api/MigrateWithStorageCommand.java b/core/src/com/cloud/agent/api/MigrateWithStorageCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/MigrateWithStorageCommand.java rename to core/src/com/cloud/agent/api/MigrateWithStorageCommand.java diff --git a/api/src/com/cloud/agent/api/MigrateWithStorageCompleteAnswer.java b/core/src/com/cloud/agent/api/MigrateWithStorageCompleteAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/MigrateWithStorageCompleteAnswer.java rename to core/src/com/cloud/agent/api/MigrateWithStorageCompleteAnswer.java diff --git a/api/src/com/cloud/agent/api/MigrateWithStorageCompleteCommand.java b/core/src/com/cloud/agent/api/MigrateWithStorageCompleteCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/MigrateWithStorageCompleteCommand.java rename to core/src/com/cloud/agent/api/MigrateWithStorageCompleteCommand.java diff --git a/api/src/com/cloud/agent/api/MigrateWithStorageReceiveAnswer.java b/core/src/com/cloud/agent/api/MigrateWithStorageReceiveAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/MigrateWithStorageReceiveAnswer.java rename to core/src/com/cloud/agent/api/MigrateWithStorageReceiveAnswer.java diff --git a/api/src/com/cloud/agent/api/MigrateWithStorageReceiveCommand.java b/core/src/com/cloud/agent/api/MigrateWithStorageReceiveCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/MigrateWithStorageReceiveCommand.java rename to core/src/com/cloud/agent/api/MigrateWithStorageReceiveCommand.java diff --git a/api/src/com/cloud/agent/api/MigrateWithStorageSendAnswer.java b/core/src/com/cloud/agent/api/MigrateWithStorageSendAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/MigrateWithStorageSendAnswer.java rename to core/src/com/cloud/agent/api/MigrateWithStorageSendAnswer.java diff --git a/api/src/com/cloud/agent/api/MigrateWithStorageSendCommand.java b/core/src/com/cloud/agent/api/MigrateWithStorageSendCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/MigrateWithStorageSendCommand.java rename to core/src/com/cloud/agent/api/MigrateWithStorageSendCommand.java diff --git a/api/src/com/cloud/agent/api/ModifySshKeysCommand.java b/core/src/com/cloud/agent/api/ModifySshKeysCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/ModifySshKeysCommand.java rename to core/src/com/cloud/agent/api/ModifySshKeysCommand.java diff --git a/api/src/com/cloud/agent/api/ModifyStoragePoolAnswer.java b/core/src/com/cloud/agent/api/ModifyStoragePoolAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/ModifyStoragePoolAnswer.java rename to core/src/com/cloud/agent/api/ModifyStoragePoolAnswer.java diff --git a/api/src/com/cloud/agent/api/ModifyStoragePoolCommand.java b/core/src/com/cloud/agent/api/ModifyStoragePoolCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/ModifyStoragePoolCommand.java rename to core/src/com/cloud/agent/api/ModifyStoragePoolCommand.java diff --git a/api/src/com/cloud/agent/api/NetworkUsageAnswer.java b/core/src/com/cloud/agent/api/NetworkUsageAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/NetworkUsageAnswer.java rename to core/src/com/cloud/agent/api/NetworkUsageAnswer.java diff --git a/api/src/com/cloud/agent/api/NetworkUsageCommand.java b/core/src/com/cloud/agent/api/NetworkUsageCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/NetworkUsageCommand.java rename to core/src/com/cloud/agent/api/NetworkUsageCommand.java diff --git a/api/src/com/cloud/agent/api/PingAnswer.java b/core/src/com/cloud/agent/api/PingAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/PingAnswer.java rename to core/src/com/cloud/agent/api/PingAnswer.java diff --git a/api/src/com/cloud/agent/api/PingCommand.java b/core/src/com/cloud/agent/api/PingCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/PingCommand.java rename to core/src/com/cloud/agent/api/PingCommand.java diff --git a/api/src/com/cloud/agent/api/PingRoutingCommand.java b/core/src/com/cloud/agent/api/PingRoutingCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/PingRoutingCommand.java rename to core/src/com/cloud/agent/api/PingRoutingCommand.java diff --git a/api/src/com/cloud/agent/api/PingRoutingWithNwGroupsCommand.java b/core/src/com/cloud/agent/api/PingRoutingWithNwGroupsCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/PingRoutingWithNwGroupsCommand.java rename to core/src/com/cloud/agent/api/PingRoutingWithNwGroupsCommand.java diff --git a/api/src/com/cloud/agent/api/PingRoutingWithOvsCommand.java b/core/src/com/cloud/agent/api/PingRoutingWithOvsCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/PingRoutingWithOvsCommand.java rename to core/src/com/cloud/agent/api/PingRoutingWithOvsCommand.java diff --git a/api/src/com/cloud/agent/api/PingStorageCommand.java b/core/src/com/cloud/agent/api/PingStorageCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/PingStorageCommand.java rename to core/src/com/cloud/agent/api/PingStorageCommand.java diff --git a/api/src/com/cloud/agent/api/PingTestCommand.java b/core/src/com/cloud/agent/api/PingTestCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/PingTestCommand.java rename to core/src/com/cloud/agent/api/PingTestCommand.java diff --git a/api/src/com/cloud/agent/api/PlugNicAnswer.java b/core/src/com/cloud/agent/api/PlugNicAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/PlugNicAnswer.java rename to core/src/com/cloud/agent/api/PlugNicAnswer.java diff --git a/api/src/com/cloud/agent/api/PlugNicCommand.java b/core/src/com/cloud/agent/api/PlugNicCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/PlugNicCommand.java rename to core/src/com/cloud/agent/api/PlugNicCommand.java diff --git a/api/src/com/cloud/agent/api/PoolEjectCommand.java b/core/src/com/cloud/agent/api/PoolEjectCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/PoolEjectCommand.java rename to core/src/com/cloud/agent/api/PoolEjectCommand.java diff --git a/api/src/com/cloud/agent/api/PrepareForMigrationAnswer.java b/core/src/com/cloud/agent/api/PrepareForMigrationAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/PrepareForMigrationAnswer.java rename to core/src/com/cloud/agent/api/PrepareForMigrationAnswer.java diff --git a/api/src/com/cloud/agent/api/PrepareForMigrationCommand.java b/core/src/com/cloud/agent/api/PrepareForMigrationCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/PrepareForMigrationCommand.java rename to core/src/com/cloud/agent/api/PrepareForMigrationCommand.java diff --git a/api/src/com/cloud/agent/api/PrepareOCFS2NodesCommand.java b/core/src/com/cloud/agent/api/PrepareOCFS2NodesCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/PrepareOCFS2NodesCommand.java rename to core/src/com/cloud/agent/api/PrepareOCFS2NodesCommand.java diff --git a/api/src/com/cloud/agent/api/PropagateResourceEventCommand.java b/core/src/com/cloud/agent/api/PropagateResourceEventCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/PropagateResourceEventCommand.java rename to core/src/com/cloud/agent/api/PropagateResourceEventCommand.java diff --git a/api/src/com/cloud/agent/api/ReadyAnswer.java b/core/src/com/cloud/agent/api/ReadyAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/ReadyAnswer.java rename to core/src/com/cloud/agent/api/ReadyAnswer.java diff --git a/api/src/com/cloud/agent/api/ReadyCommand.java b/core/src/com/cloud/agent/api/ReadyCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/ReadyCommand.java rename to core/src/com/cloud/agent/api/ReadyCommand.java diff --git a/api/src/com/cloud/agent/api/RebootAnswer.java b/core/src/com/cloud/agent/api/RebootAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/RebootAnswer.java rename to core/src/com/cloud/agent/api/RebootAnswer.java diff --git a/api/src/com/cloud/agent/api/RebootCommand.java b/core/src/com/cloud/agent/api/RebootCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/RebootCommand.java rename to core/src/com/cloud/agent/api/RebootCommand.java diff --git a/api/src/com/cloud/agent/api/RebootRouterCommand.java b/core/src/com/cloud/agent/api/RebootRouterCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/RebootRouterCommand.java rename to core/src/com/cloud/agent/api/RebootRouterCommand.java diff --git a/api/src/com/cloud/agent/api/RevertToVMSnapshotAnswer.java b/core/src/com/cloud/agent/api/RevertToVMSnapshotAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/RevertToVMSnapshotAnswer.java rename to core/src/com/cloud/agent/api/RevertToVMSnapshotAnswer.java diff --git a/api/src/com/cloud/agent/api/RevertToVMSnapshotCommand.java b/core/src/com/cloud/agent/api/RevertToVMSnapshotCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/RevertToVMSnapshotCommand.java rename to core/src/com/cloud/agent/api/RevertToVMSnapshotCommand.java diff --git a/api/src/com/cloud/agent/api/ScaleVmAnswer.java b/core/src/com/cloud/agent/api/ScaleVmAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/ScaleVmAnswer.java rename to core/src/com/cloud/agent/api/ScaleVmAnswer.java diff --git a/api/src/com/cloud/agent/api/ScaleVmCommand.java b/core/src/com/cloud/agent/api/ScaleVmCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/ScaleVmCommand.java rename to core/src/com/cloud/agent/api/ScaleVmCommand.java diff --git a/api/src/com/cloud/agent/api/ScheduleHostScanTaskCommand.java b/core/src/com/cloud/agent/api/ScheduleHostScanTaskCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/ScheduleHostScanTaskCommand.java rename to core/src/com/cloud/agent/api/ScheduleHostScanTaskCommand.java diff --git a/api/src/com/cloud/agent/api/SecStorageFirewallCfgCommand.java b/core/src/com/cloud/agent/api/SecStorageFirewallCfgCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/SecStorageFirewallCfgCommand.java rename to core/src/com/cloud/agent/api/SecStorageFirewallCfgCommand.java diff --git a/api/src/com/cloud/agent/api/SecStorageSetupAnswer.java b/core/src/com/cloud/agent/api/SecStorageSetupAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/SecStorageSetupAnswer.java rename to core/src/com/cloud/agent/api/SecStorageSetupAnswer.java diff --git a/api/src/com/cloud/agent/api/SecStorageSetupCommand.java b/core/src/com/cloud/agent/api/SecStorageSetupCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/SecStorageSetupCommand.java rename to core/src/com/cloud/agent/api/SecStorageSetupCommand.java diff --git a/api/src/com/cloud/agent/api/SecStorageVMSetupCommand.java b/core/src/com/cloud/agent/api/SecStorageVMSetupCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/SecStorageVMSetupCommand.java rename to core/src/com/cloud/agent/api/SecStorageVMSetupCommand.java diff --git a/api/src/com/cloud/agent/api/SecurityGroupRuleAnswer.java b/core/src/com/cloud/agent/api/SecurityGroupRuleAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/SecurityGroupRuleAnswer.java rename to core/src/com/cloud/agent/api/SecurityGroupRuleAnswer.java diff --git a/api/src/com/cloud/agent/api/SecurityGroupRulesCmd.java b/core/src/com/cloud/agent/api/SecurityGroupRulesCmd.java similarity index 100% rename from api/src/com/cloud/agent/api/SecurityGroupRulesCmd.java rename to core/src/com/cloud/agent/api/SecurityGroupRulesCmd.java diff --git a/api/src/com/cloud/agent/api/SetupAnswer.java b/core/src/com/cloud/agent/api/SetupAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/SetupAnswer.java rename to core/src/com/cloud/agent/api/SetupAnswer.java diff --git a/api/src/com/cloud/agent/api/SetupCommand.java b/core/src/com/cloud/agent/api/SetupCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/SetupCommand.java rename to core/src/com/cloud/agent/api/SetupCommand.java diff --git a/api/src/com/cloud/agent/api/SetupGuestNetworkAnswer.java b/core/src/com/cloud/agent/api/SetupGuestNetworkAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/SetupGuestNetworkAnswer.java rename to core/src/com/cloud/agent/api/SetupGuestNetworkAnswer.java diff --git a/api/src/com/cloud/agent/api/SetupGuestNetworkCommand.java b/core/src/com/cloud/agent/api/SetupGuestNetworkCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/SetupGuestNetworkCommand.java rename to core/src/com/cloud/agent/api/SetupGuestNetworkCommand.java diff --git a/api/src/com/cloud/agent/api/ShutdownCommand.java b/core/src/com/cloud/agent/api/ShutdownCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/ShutdownCommand.java rename to core/src/com/cloud/agent/api/ShutdownCommand.java diff --git a/api/src/com/cloud/agent/api/SnapshotCommand.java b/core/src/com/cloud/agent/api/SnapshotCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/SnapshotCommand.java rename to core/src/com/cloud/agent/api/SnapshotCommand.java diff --git a/api/src/com/cloud/agent/api/StartAnswer.java b/core/src/com/cloud/agent/api/StartAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/StartAnswer.java rename to core/src/com/cloud/agent/api/StartAnswer.java diff --git a/api/src/com/cloud/agent/api/StartCommand.java b/core/src/com/cloud/agent/api/StartCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/StartCommand.java rename to core/src/com/cloud/agent/api/StartCommand.java diff --git a/api/src/com/cloud/agent/api/StartupAnswer.java b/core/src/com/cloud/agent/api/StartupAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/StartupAnswer.java rename to core/src/com/cloud/agent/api/StartupAnswer.java diff --git a/api/src/com/cloud/agent/api/StartupCommand.java b/core/src/com/cloud/agent/api/StartupCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/StartupCommand.java rename to core/src/com/cloud/agent/api/StartupCommand.java diff --git a/api/src/com/cloud/agent/api/StartupExternalDhcpCommand.java b/core/src/com/cloud/agent/api/StartupExternalDhcpCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/StartupExternalDhcpCommand.java rename to core/src/com/cloud/agent/api/StartupExternalDhcpCommand.java diff --git a/api/src/com/cloud/agent/api/StartupExternalFirewallCommand.java b/core/src/com/cloud/agent/api/StartupExternalFirewallCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/StartupExternalFirewallCommand.java rename to core/src/com/cloud/agent/api/StartupExternalFirewallCommand.java diff --git a/api/src/com/cloud/agent/api/StartupExternalLoadBalancerCommand.java b/core/src/com/cloud/agent/api/StartupExternalLoadBalancerCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/StartupExternalLoadBalancerCommand.java rename to core/src/com/cloud/agent/api/StartupExternalLoadBalancerCommand.java diff --git a/api/src/com/cloud/agent/api/StartupProxyCommand.java b/core/src/com/cloud/agent/api/StartupProxyCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/StartupProxyCommand.java rename to core/src/com/cloud/agent/api/StartupProxyCommand.java diff --git a/api/src/com/cloud/agent/api/StartupPxeServerCommand.java b/core/src/com/cloud/agent/api/StartupPxeServerCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/StartupPxeServerCommand.java rename to core/src/com/cloud/agent/api/StartupPxeServerCommand.java diff --git a/api/src/com/cloud/agent/api/StartupRoutingCommand.java b/core/src/com/cloud/agent/api/StartupRoutingCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/StartupRoutingCommand.java rename to core/src/com/cloud/agent/api/StartupRoutingCommand.java diff --git a/api/src/com/cloud/agent/api/StartupSecondaryStorageCommand.java b/core/src/com/cloud/agent/api/StartupSecondaryStorageCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/StartupSecondaryStorageCommand.java rename to core/src/com/cloud/agent/api/StartupSecondaryStorageCommand.java diff --git a/api/src/com/cloud/agent/api/StartupStorageCommand.java b/core/src/com/cloud/agent/api/StartupStorageCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/StartupStorageCommand.java rename to core/src/com/cloud/agent/api/StartupStorageCommand.java diff --git a/api/src/com/cloud/agent/api/StartupTrafficMonitorCommand.java b/core/src/com/cloud/agent/api/StartupTrafficMonitorCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/StartupTrafficMonitorCommand.java rename to core/src/com/cloud/agent/api/StartupTrafficMonitorCommand.java diff --git a/api/src/com/cloud/agent/api/StopAnswer.java b/core/src/com/cloud/agent/api/StopAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/StopAnswer.java rename to core/src/com/cloud/agent/api/StopAnswer.java diff --git a/api/src/com/cloud/agent/api/StopCommand.java b/core/src/com/cloud/agent/api/StopCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/StopCommand.java rename to core/src/com/cloud/agent/api/StopCommand.java diff --git a/api/src/com/cloud/agent/api/TransferAgentCommand.java b/core/src/com/cloud/agent/api/TransferAgentCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/TransferAgentCommand.java rename to core/src/com/cloud/agent/api/TransferAgentCommand.java diff --git a/api/src/com/cloud/agent/api/UnPlugNicAnswer.java b/core/src/com/cloud/agent/api/UnPlugNicAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/UnPlugNicAnswer.java rename to core/src/com/cloud/agent/api/UnPlugNicAnswer.java diff --git a/api/src/com/cloud/agent/api/UnPlugNicCommand.java b/core/src/com/cloud/agent/api/UnPlugNicCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/UnPlugNicCommand.java rename to core/src/com/cloud/agent/api/UnPlugNicCommand.java diff --git a/api/src/com/cloud/agent/api/UnregisterVMCommand.java b/core/src/com/cloud/agent/api/UnregisterVMCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/UnregisterVMCommand.java rename to core/src/com/cloud/agent/api/UnregisterVMCommand.java diff --git a/api/src/com/cloud/agent/api/UpdateHostPasswordCommand.java b/core/src/com/cloud/agent/api/UpdateHostPasswordCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/UpdateHostPasswordCommand.java rename to core/src/com/cloud/agent/api/UpdateHostPasswordCommand.java diff --git a/api/src/com/cloud/agent/api/UpgradeAnswer.java b/core/src/com/cloud/agent/api/UpgradeAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/UpgradeAnswer.java rename to core/src/com/cloud/agent/api/UpgradeAnswer.java diff --git a/api/src/com/cloud/agent/api/UpgradeCommand.java b/core/src/com/cloud/agent/api/UpgradeCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/UpgradeCommand.java rename to core/src/com/cloud/agent/api/UpgradeCommand.java diff --git a/api/src/com/cloud/agent/api/UpgradeSnapshotCommand.java b/core/src/com/cloud/agent/api/UpgradeSnapshotCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/UpgradeSnapshotCommand.java rename to core/src/com/cloud/agent/api/UpgradeSnapshotCommand.java diff --git a/api/src/com/cloud/agent/api/UploadTemplateToS3FromSecondaryStorageCommand.java b/core/src/com/cloud/agent/api/UploadTemplateToS3FromSecondaryStorageCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/UploadTemplateToS3FromSecondaryStorageCommand.java rename to core/src/com/cloud/agent/api/UploadTemplateToS3FromSecondaryStorageCommand.java diff --git a/api/src/com/cloud/agent/api/VMSnapshotBaseCommand.java b/core/src/com/cloud/agent/api/VMSnapshotBaseCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/VMSnapshotBaseCommand.java rename to core/src/com/cloud/agent/api/VMSnapshotBaseCommand.java diff --git a/api/src/com/cloud/agent/api/VMSnapshotTO.java b/core/src/com/cloud/agent/api/VMSnapshotTO.java similarity index 100% rename from api/src/com/cloud/agent/api/VMSnapshotTO.java rename to core/src/com/cloud/agent/api/VMSnapshotTO.java diff --git a/api/src/com/cloud/agent/api/ValidateSnapshotAnswer.java b/core/src/com/cloud/agent/api/ValidateSnapshotAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/ValidateSnapshotAnswer.java rename to core/src/com/cloud/agent/api/ValidateSnapshotAnswer.java diff --git a/api/src/com/cloud/agent/api/ValidateSnapshotCommand.java b/core/src/com/cloud/agent/api/ValidateSnapshotCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/ValidateSnapshotCommand.java rename to core/src/com/cloud/agent/api/ValidateSnapshotCommand.java diff --git a/api/src/com/cloud/agent/api/VmStatsEntry.java b/core/src/com/cloud/agent/api/VmStatsEntry.java similarity index 100% rename from api/src/com/cloud/agent/api/VmStatsEntry.java rename to core/src/com/cloud/agent/api/VmStatsEntry.java diff --git a/api/src/com/cloud/agent/api/baremetal/IpmISetBootDevCommand.java b/core/src/com/cloud/agent/api/baremetal/IpmISetBootDevCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/baremetal/IpmISetBootDevCommand.java rename to core/src/com/cloud/agent/api/baremetal/IpmISetBootDevCommand.java diff --git a/api/src/com/cloud/agent/api/baremetal/IpmiBootorResetCommand.java b/core/src/com/cloud/agent/api/baremetal/IpmiBootorResetCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/baremetal/IpmiBootorResetCommand.java rename to core/src/com/cloud/agent/api/baremetal/IpmiBootorResetCommand.java diff --git a/api/src/com/cloud/agent/api/baremetal/PreparePxeServerAnswer.java b/core/src/com/cloud/agent/api/baremetal/PreparePxeServerAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/baremetal/PreparePxeServerAnswer.java rename to core/src/com/cloud/agent/api/baremetal/PreparePxeServerAnswer.java diff --git a/api/src/com/cloud/agent/api/baremetal/PreparePxeServerCommand.java b/core/src/com/cloud/agent/api/baremetal/PreparePxeServerCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/baremetal/PreparePxeServerCommand.java rename to core/src/com/cloud/agent/api/baremetal/PreparePxeServerCommand.java diff --git a/api/src/com/cloud/agent/api/baremetal/prepareCreateTemplateCommand.java b/core/src/com/cloud/agent/api/baremetal/prepareCreateTemplateCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/baremetal/prepareCreateTemplateCommand.java rename to core/src/com/cloud/agent/api/baremetal/prepareCreateTemplateCommand.java diff --git a/api/src/com/cloud/agent/api/check/CheckSshAnswer.java b/core/src/com/cloud/agent/api/check/CheckSshAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/check/CheckSshAnswer.java rename to core/src/com/cloud/agent/api/check/CheckSshAnswer.java diff --git a/api/src/com/cloud/agent/api/check/CheckSshCommand.java b/core/src/com/cloud/agent/api/check/CheckSshCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/check/CheckSshCommand.java rename to core/src/com/cloud/agent/api/check/CheckSshCommand.java diff --git a/api/src/com/cloud/agent/api/downloadSnapshotFromSwiftCommand.java b/core/src/com/cloud/agent/api/downloadSnapshotFromSwiftCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/downloadSnapshotFromSwiftCommand.java rename to core/src/com/cloud/agent/api/downloadSnapshotFromSwiftCommand.java diff --git a/api/src/com/cloud/agent/api/downloadTemplateFromSwiftToSecondaryStorageCommand.java b/core/src/com/cloud/agent/api/downloadTemplateFromSwiftToSecondaryStorageCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/downloadTemplateFromSwiftToSecondaryStorageCommand.java rename to core/src/com/cloud/agent/api/downloadTemplateFromSwiftToSecondaryStorageCommand.java diff --git a/api/src/com/cloud/agent/api/proxy/CheckConsoleProxyLoadCommand.java b/core/src/com/cloud/agent/api/proxy/CheckConsoleProxyLoadCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/proxy/CheckConsoleProxyLoadCommand.java rename to core/src/com/cloud/agent/api/proxy/CheckConsoleProxyLoadCommand.java diff --git a/api/src/com/cloud/agent/api/proxy/ConsoleProxyLoadAnswer.java b/core/src/com/cloud/agent/api/proxy/ConsoleProxyLoadAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/proxy/ConsoleProxyLoadAnswer.java rename to core/src/com/cloud/agent/api/proxy/ConsoleProxyLoadAnswer.java diff --git a/api/src/com/cloud/agent/api/proxy/ProxyCommand.java b/core/src/com/cloud/agent/api/proxy/ProxyCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/proxy/ProxyCommand.java rename to core/src/com/cloud/agent/api/proxy/ProxyCommand.java diff --git a/api/src/com/cloud/agent/api/proxy/StartConsoleProxyAgentHttpHandlerCommand.java b/core/src/com/cloud/agent/api/proxy/StartConsoleProxyAgentHttpHandlerCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/proxy/StartConsoleProxyAgentHttpHandlerCommand.java rename to core/src/com/cloud/agent/api/proxy/StartConsoleProxyAgentHttpHandlerCommand.java diff --git a/api/src/com/cloud/agent/api/proxy/WatchConsoleProxyLoadCommand.java b/core/src/com/cloud/agent/api/proxy/WatchConsoleProxyLoadCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/proxy/WatchConsoleProxyLoadCommand.java rename to core/src/com/cloud/agent/api/proxy/WatchConsoleProxyLoadCommand.java diff --git a/api/src/com/cloud/agent/api/routing/CreateLoadBalancerApplianceCommand.java b/core/src/com/cloud/agent/api/routing/CreateLoadBalancerApplianceCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/CreateLoadBalancerApplianceCommand.java rename to core/src/com/cloud/agent/api/routing/CreateLoadBalancerApplianceCommand.java diff --git a/api/src/com/cloud/agent/api/routing/DestroyLoadBalancerApplianceCommand.java b/core/src/com/cloud/agent/api/routing/DestroyLoadBalancerApplianceCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/DestroyLoadBalancerApplianceCommand.java rename to core/src/com/cloud/agent/api/routing/DestroyLoadBalancerApplianceCommand.java diff --git a/api/src/com/cloud/agent/api/routing/DhcpEntryCommand.java b/core/src/com/cloud/agent/api/routing/DhcpEntryCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/DhcpEntryCommand.java rename to core/src/com/cloud/agent/api/routing/DhcpEntryCommand.java diff --git a/api/src/com/cloud/agent/api/routing/GlobalLoadBalancerConfigAnswer.java b/core/src/com/cloud/agent/api/routing/GlobalLoadBalancerConfigAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/GlobalLoadBalancerConfigAnswer.java rename to core/src/com/cloud/agent/api/routing/GlobalLoadBalancerConfigAnswer.java diff --git a/api/src/com/cloud/agent/api/routing/GlobalLoadBalancerConfigCommand.java b/core/src/com/cloud/agent/api/routing/GlobalLoadBalancerConfigCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/GlobalLoadBalancerConfigCommand.java rename to core/src/com/cloud/agent/api/routing/GlobalLoadBalancerConfigCommand.java diff --git a/api/src/com/cloud/agent/api/routing/HealthCheckLBConfigAnswer.java b/core/src/com/cloud/agent/api/routing/HealthCheckLBConfigAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/HealthCheckLBConfigAnswer.java rename to core/src/com/cloud/agent/api/routing/HealthCheckLBConfigAnswer.java diff --git a/api/src/com/cloud/agent/api/routing/HealthCheckLBConfigCommand.java b/core/src/com/cloud/agent/api/routing/HealthCheckLBConfigCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/HealthCheckLBConfigCommand.java rename to core/src/com/cloud/agent/api/routing/HealthCheckLBConfigCommand.java diff --git a/api/src/com/cloud/agent/api/routing/IpAssocAnswer.java b/core/src/com/cloud/agent/api/routing/IpAssocAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/IpAssocAnswer.java rename to core/src/com/cloud/agent/api/routing/IpAssocAnswer.java diff --git a/api/src/com/cloud/agent/api/routing/IpAssocCommand.java b/core/src/com/cloud/agent/api/routing/IpAssocCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/IpAssocCommand.java rename to core/src/com/cloud/agent/api/routing/IpAssocCommand.java diff --git a/api/src/com/cloud/agent/api/routing/IpAssocVpcCommand.java b/core/src/com/cloud/agent/api/routing/IpAssocVpcCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/IpAssocVpcCommand.java rename to core/src/com/cloud/agent/api/routing/IpAssocVpcCommand.java diff --git a/api/src/com/cloud/agent/api/routing/LoadBalancerConfigCommand.java b/core/src/com/cloud/agent/api/routing/LoadBalancerConfigCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/LoadBalancerConfigCommand.java rename to core/src/com/cloud/agent/api/routing/LoadBalancerConfigCommand.java diff --git a/api/src/com/cloud/agent/api/routing/NetworkElementCommand.java b/core/src/com/cloud/agent/api/routing/NetworkElementCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/NetworkElementCommand.java rename to core/src/com/cloud/agent/api/routing/NetworkElementCommand.java diff --git a/api/src/com/cloud/agent/api/routing/RemoteAccessVpnCfgCommand.java b/core/src/com/cloud/agent/api/routing/RemoteAccessVpnCfgCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/RemoteAccessVpnCfgCommand.java rename to core/src/com/cloud/agent/api/routing/RemoteAccessVpnCfgCommand.java diff --git a/api/src/com/cloud/agent/api/routing/SavePasswordCommand.java b/core/src/com/cloud/agent/api/routing/SavePasswordCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/SavePasswordCommand.java rename to core/src/com/cloud/agent/api/routing/SavePasswordCommand.java diff --git a/api/src/com/cloud/agent/api/routing/SetFirewallRulesAnswer.java b/core/src/com/cloud/agent/api/routing/SetFirewallRulesAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/SetFirewallRulesAnswer.java rename to core/src/com/cloud/agent/api/routing/SetFirewallRulesAnswer.java diff --git a/api/src/com/cloud/agent/api/routing/SetFirewallRulesCommand.java b/core/src/com/cloud/agent/api/routing/SetFirewallRulesCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/SetFirewallRulesCommand.java rename to core/src/com/cloud/agent/api/routing/SetFirewallRulesCommand.java diff --git a/api/src/com/cloud/agent/api/routing/SetNetworkACLAnswer.java b/core/src/com/cloud/agent/api/routing/SetNetworkACLAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/SetNetworkACLAnswer.java rename to core/src/com/cloud/agent/api/routing/SetNetworkACLAnswer.java diff --git a/api/src/com/cloud/agent/api/routing/SetNetworkACLCommand.java b/core/src/com/cloud/agent/api/routing/SetNetworkACLCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/SetNetworkACLCommand.java rename to core/src/com/cloud/agent/api/routing/SetNetworkACLCommand.java diff --git a/api/src/com/cloud/agent/api/routing/SetPortForwardingRulesAnswer.java b/core/src/com/cloud/agent/api/routing/SetPortForwardingRulesAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/SetPortForwardingRulesAnswer.java rename to core/src/com/cloud/agent/api/routing/SetPortForwardingRulesAnswer.java diff --git a/api/src/com/cloud/agent/api/routing/SetPortForwardingRulesCommand.java b/core/src/com/cloud/agent/api/routing/SetPortForwardingRulesCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/SetPortForwardingRulesCommand.java rename to core/src/com/cloud/agent/api/routing/SetPortForwardingRulesCommand.java diff --git a/api/src/com/cloud/agent/api/routing/SetPortForwardingRulesVpcCommand.java b/core/src/com/cloud/agent/api/routing/SetPortForwardingRulesVpcCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/SetPortForwardingRulesVpcCommand.java rename to core/src/com/cloud/agent/api/routing/SetPortForwardingRulesVpcCommand.java diff --git a/api/src/com/cloud/agent/api/routing/SetSourceNatAnswer.java b/core/src/com/cloud/agent/api/routing/SetSourceNatAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/SetSourceNatAnswer.java rename to core/src/com/cloud/agent/api/routing/SetSourceNatAnswer.java diff --git a/api/src/com/cloud/agent/api/routing/SetSourceNatCommand.java b/core/src/com/cloud/agent/api/routing/SetSourceNatCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/SetSourceNatCommand.java rename to core/src/com/cloud/agent/api/routing/SetSourceNatCommand.java diff --git a/api/src/com/cloud/agent/api/routing/SetStaticNatRulesAnswer.java b/core/src/com/cloud/agent/api/routing/SetStaticNatRulesAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/SetStaticNatRulesAnswer.java rename to core/src/com/cloud/agent/api/routing/SetStaticNatRulesAnswer.java diff --git a/api/src/com/cloud/agent/api/routing/SetStaticNatRulesCommand.java b/core/src/com/cloud/agent/api/routing/SetStaticNatRulesCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/SetStaticNatRulesCommand.java rename to core/src/com/cloud/agent/api/routing/SetStaticNatRulesCommand.java diff --git a/api/src/com/cloud/agent/api/routing/SetStaticRouteAnswer.java b/core/src/com/cloud/agent/api/routing/SetStaticRouteAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/SetStaticRouteAnswer.java rename to core/src/com/cloud/agent/api/routing/SetStaticRouteAnswer.java diff --git a/api/src/com/cloud/agent/api/routing/SetStaticRouteCommand.java b/core/src/com/cloud/agent/api/routing/SetStaticRouteCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/SetStaticRouteCommand.java rename to core/src/com/cloud/agent/api/routing/SetStaticRouteCommand.java diff --git a/api/src/com/cloud/agent/api/routing/Site2SiteVpnCfgCommand.java b/core/src/com/cloud/agent/api/routing/Site2SiteVpnCfgCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/Site2SiteVpnCfgCommand.java rename to core/src/com/cloud/agent/api/routing/Site2SiteVpnCfgCommand.java diff --git a/api/src/com/cloud/agent/api/routing/SiteLoadBalancerConfig.java b/core/src/com/cloud/agent/api/routing/SiteLoadBalancerConfig.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/SiteLoadBalancerConfig.java rename to core/src/com/cloud/agent/api/routing/SiteLoadBalancerConfig.java diff --git a/api/src/com/cloud/agent/api/routing/UserDataCommand.java b/core/src/com/cloud/agent/api/routing/UserDataCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/UserDataCommand.java rename to core/src/com/cloud/agent/api/routing/UserDataCommand.java diff --git a/api/src/com/cloud/agent/api/routing/VmDataCommand.java b/core/src/com/cloud/agent/api/routing/VmDataCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/VmDataCommand.java rename to core/src/com/cloud/agent/api/routing/VmDataCommand.java diff --git a/api/src/com/cloud/agent/api/routing/VpnUsersCfgCommand.java b/core/src/com/cloud/agent/api/routing/VpnUsersCfgCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/routing/VpnUsersCfgCommand.java rename to core/src/com/cloud/agent/api/routing/VpnUsersCfgCommand.java diff --git a/api/src/com/cloud/agent/api/storage/AbstractDownloadCommand.java b/core/src/com/cloud/agent/api/storage/AbstractDownloadCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/AbstractDownloadCommand.java rename to core/src/com/cloud/agent/api/storage/AbstractDownloadCommand.java diff --git a/api/src/com/cloud/agent/api/storage/AbstractUploadCommand.java b/core/src/com/cloud/agent/api/storage/AbstractUploadCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/AbstractUploadCommand.java rename to core/src/com/cloud/agent/api/storage/AbstractUploadCommand.java diff --git a/api/src/com/cloud/agent/api/storage/CopyVolumeAnswer.java b/core/src/com/cloud/agent/api/storage/CopyVolumeAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/CopyVolumeAnswer.java rename to core/src/com/cloud/agent/api/storage/CopyVolumeAnswer.java diff --git a/api/src/com/cloud/agent/api/storage/CopyVolumeCommand.java b/core/src/com/cloud/agent/api/storage/CopyVolumeCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/CopyVolumeCommand.java rename to core/src/com/cloud/agent/api/storage/CopyVolumeCommand.java diff --git a/api/src/com/cloud/agent/api/storage/CreateAnswer.java b/core/src/com/cloud/agent/api/storage/CreateAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/CreateAnswer.java rename to core/src/com/cloud/agent/api/storage/CreateAnswer.java diff --git a/api/src/com/cloud/agent/api/storage/CreateCommand.java b/core/src/com/cloud/agent/api/storage/CreateCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/CreateCommand.java rename to core/src/com/cloud/agent/api/storage/CreateCommand.java diff --git a/api/src/com/cloud/agent/api/storage/CreateEntityDownloadURLAnswer.java b/core/src/com/cloud/agent/api/storage/CreateEntityDownloadURLAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/CreateEntityDownloadURLAnswer.java rename to core/src/com/cloud/agent/api/storage/CreateEntityDownloadURLAnswer.java diff --git a/api/src/com/cloud/agent/api/storage/CreateEntityDownloadURLCommand.java b/core/src/com/cloud/agent/api/storage/CreateEntityDownloadURLCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/CreateEntityDownloadURLCommand.java rename to core/src/com/cloud/agent/api/storage/CreateEntityDownloadURLCommand.java diff --git a/api/src/com/cloud/agent/api/storage/CreatePrivateTemplateAnswer.java b/core/src/com/cloud/agent/api/storage/CreatePrivateTemplateAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/CreatePrivateTemplateAnswer.java rename to core/src/com/cloud/agent/api/storage/CreatePrivateTemplateAnswer.java diff --git a/api/src/com/cloud/agent/api/storage/CreatePrivateTemplateCommand.java b/core/src/com/cloud/agent/api/storage/CreatePrivateTemplateCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/CreatePrivateTemplateCommand.java rename to core/src/com/cloud/agent/api/storage/CreatePrivateTemplateCommand.java diff --git a/api/src/com/cloud/agent/api/storage/DeleteEntityDownloadURLAnswer.java b/core/src/com/cloud/agent/api/storage/DeleteEntityDownloadURLAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/DeleteEntityDownloadURLAnswer.java rename to core/src/com/cloud/agent/api/storage/DeleteEntityDownloadURLAnswer.java diff --git a/api/src/com/cloud/agent/api/storage/DeleteEntityDownloadURLCommand.java b/core/src/com/cloud/agent/api/storage/DeleteEntityDownloadURLCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/DeleteEntityDownloadURLCommand.java rename to core/src/com/cloud/agent/api/storage/DeleteEntityDownloadURLCommand.java diff --git a/api/src/com/cloud/agent/api/storage/DeleteTemplateCommand.java b/core/src/com/cloud/agent/api/storage/DeleteTemplateCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/DeleteTemplateCommand.java rename to core/src/com/cloud/agent/api/storage/DeleteTemplateCommand.java diff --git a/api/src/com/cloud/agent/api/storage/DeleteVolumeCommand.java b/core/src/com/cloud/agent/api/storage/DeleteVolumeCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/DeleteVolumeCommand.java rename to core/src/com/cloud/agent/api/storage/DeleteVolumeCommand.java diff --git a/api/src/com/cloud/agent/api/storage/DestroyAnswer.java b/core/src/com/cloud/agent/api/storage/DestroyAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/DestroyAnswer.java rename to core/src/com/cloud/agent/api/storage/DestroyAnswer.java diff --git a/api/src/com/cloud/agent/api/storage/DestroyCommand.java b/core/src/com/cloud/agent/api/storage/DestroyCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/DestroyCommand.java rename to core/src/com/cloud/agent/api/storage/DestroyCommand.java diff --git a/api/src/com/cloud/agent/api/storage/DownloadAnswer.java b/core/src/com/cloud/agent/api/storage/DownloadAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/DownloadAnswer.java rename to core/src/com/cloud/agent/api/storage/DownloadAnswer.java diff --git a/api/src/com/cloud/agent/api/storage/DownloadCommand.java b/core/src/com/cloud/agent/api/storage/DownloadCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/DownloadCommand.java rename to core/src/com/cloud/agent/api/storage/DownloadCommand.java diff --git a/api/src/com/cloud/agent/api/storage/DownloadProgressCommand.java b/core/src/com/cloud/agent/api/storage/DownloadProgressCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/DownloadProgressCommand.java rename to core/src/com/cloud/agent/api/storage/DownloadProgressCommand.java diff --git a/api/src/com/cloud/agent/api/storage/ListTemplateAnswer.java b/core/src/com/cloud/agent/api/storage/ListTemplateAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/ListTemplateAnswer.java rename to core/src/com/cloud/agent/api/storage/ListTemplateAnswer.java diff --git a/api/src/com/cloud/agent/api/storage/ListTemplateCommand.java b/core/src/com/cloud/agent/api/storage/ListTemplateCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/ListTemplateCommand.java rename to core/src/com/cloud/agent/api/storage/ListTemplateCommand.java diff --git a/api/src/com/cloud/agent/api/storage/ListVolumeAnswer.java b/core/src/com/cloud/agent/api/storage/ListVolumeAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/ListVolumeAnswer.java rename to core/src/com/cloud/agent/api/storage/ListVolumeAnswer.java diff --git a/api/src/com/cloud/agent/api/storage/ListVolumeCommand.java b/core/src/com/cloud/agent/api/storage/ListVolumeCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/ListVolumeCommand.java rename to core/src/com/cloud/agent/api/storage/ListVolumeCommand.java diff --git a/api/src/com/cloud/agent/api/storage/ManageVolumeAvailabilityAnswer.java b/core/src/com/cloud/agent/api/storage/ManageVolumeAvailabilityAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/ManageVolumeAvailabilityAnswer.java rename to core/src/com/cloud/agent/api/storage/ManageVolumeAvailabilityAnswer.java diff --git a/api/src/com/cloud/agent/api/storage/ManageVolumeAvailabilityCommand.java b/core/src/com/cloud/agent/api/storage/ManageVolumeAvailabilityCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/ManageVolumeAvailabilityCommand.java rename to core/src/com/cloud/agent/api/storage/ManageVolumeAvailabilityCommand.java diff --git a/api/src/com/cloud/agent/api/storage/MigrateVolumeAnswer.java b/core/src/com/cloud/agent/api/storage/MigrateVolumeAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/MigrateVolumeAnswer.java rename to core/src/com/cloud/agent/api/storage/MigrateVolumeAnswer.java diff --git a/api/src/com/cloud/agent/api/storage/MigrateVolumeCommand.java b/core/src/com/cloud/agent/api/storage/MigrateVolumeCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/MigrateVolumeCommand.java rename to core/src/com/cloud/agent/api/storage/MigrateVolumeCommand.java diff --git a/api/src/com/cloud/agent/api/storage/PrimaryStorageDownloadAnswer.java b/core/src/com/cloud/agent/api/storage/PrimaryStorageDownloadAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/PrimaryStorageDownloadAnswer.java rename to core/src/com/cloud/agent/api/storage/PrimaryStorageDownloadAnswer.java diff --git a/api/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java b/core/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java rename to core/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java diff --git a/api/src/com/cloud/agent/api/storage/ResizeVolumeAnswer.java b/core/src/com/cloud/agent/api/storage/ResizeVolumeAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/ResizeVolumeAnswer.java rename to core/src/com/cloud/agent/api/storage/ResizeVolumeAnswer.java diff --git a/api/src/com/cloud/agent/api/storage/ResizeVolumeCommand.java b/core/src/com/cloud/agent/api/storage/ResizeVolumeCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/ResizeVolumeCommand.java rename to core/src/com/cloud/agent/api/storage/ResizeVolumeCommand.java diff --git a/api/src/com/cloud/agent/api/storage/StorageCommand.java b/core/src/com/cloud/agent/api/storage/StorageCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/StorageCommand.java rename to core/src/com/cloud/agent/api/storage/StorageCommand.java diff --git a/api/src/com/cloud/agent/api/storage/UpgradeDiskAnswer.java b/core/src/com/cloud/agent/api/storage/UpgradeDiskAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/UpgradeDiskAnswer.java rename to core/src/com/cloud/agent/api/storage/UpgradeDiskAnswer.java diff --git a/api/src/com/cloud/agent/api/storage/UpgradeDiskCommand.java b/core/src/com/cloud/agent/api/storage/UpgradeDiskCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/UpgradeDiskCommand.java rename to core/src/com/cloud/agent/api/storage/UpgradeDiskCommand.java diff --git a/api/src/com/cloud/agent/api/storage/UploadAnswer.java b/core/src/com/cloud/agent/api/storage/UploadAnswer.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/UploadAnswer.java rename to core/src/com/cloud/agent/api/storage/UploadAnswer.java diff --git a/api/src/com/cloud/agent/api/storage/UploadCommand.java b/core/src/com/cloud/agent/api/storage/UploadCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/UploadCommand.java rename to core/src/com/cloud/agent/api/storage/UploadCommand.java diff --git a/api/src/com/cloud/agent/api/storage/UploadProgressCommand.java b/core/src/com/cloud/agent/api/storage/UploadProgressCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/UploadProgressCommand.java rename to core/src/com/cloud/agent/api/storage/UploadProgressCommand.java diff --git a/api/src/com/cloud/agent/api/storage/ssCommand.java b/core/src/com/cloud/agent/api/storage/ssCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/storage/ssCommand.java rename to core/src/com/cloud/agent/api/storage/ssCommand.java diff --git a/api/src/com/cloud/agent/api/uploadTemplateToSwiftFromSecondaryStorageCommand.java b/core/src/com/cloud/agent/api/uploadTemplateToSwiftFromSecondaryStorageCommand.java similarity index 100% rename from api/src/com/cloud/agent/api/uploadTemplateToSwiftFromSecondaryStorageCommand.java rename to core/src/com/cloud/agent/api/uploadTemplateToSwiftFromSecondaryStorageCommand.java diff --git a/core/src/com/cloud/resource/ResourceListener.java b/core/src/com/cloud/resource/ResourceListener.java index 0efea12aee5..17fba6cd52d 100755 --- a/core/src/com/cloud/resource/ResourceListener.java +++ b/core/src/com/cloud/resource/ResourceListener.java @@ -20,7 +20,7 @@ import java.net.URI; import java.util.List; import java.util.Map; -import com.cloud.host.HostVO; +import com.cloud.host.Host; public interface ResourceListener { static final Integer EVENT_DISCOVER_BEFORE = 0x1; @@ -33,9 +33,9 @@ public interface ResourceListener { static final Integer EVENT_PREPARE_MAINTENANCE_AFTER = 0x1 << 7; static final Integer EVENT_ALL = (EVENT_DISCOVER_BEFORE | EVENT_DISCOVER_AFTER | EVENT_DELETE_HOST_BEFORE | EVENT_DELETE_HOST_AFTER | EVENT_CANCEL_MAINTENANCE_BEFORE | EVENT_CANCEL_MAINTENANCE_AFTER | EVENT_PREPARE_MAINTENANCE_BEFORE | EVENT_PREPARE_MAINTENANCE_AFTER); - + /** - * + * * @param dcid * @param podId * @param clusterId @@ -43,63 +43,63 @@ public interface ResourceListener { * @param username * @param password * @param hostTags - * + * * Called before Discover.find() */ void processDiscoverEventBefore(Long dcid, Long podId, Long clusterId, URI uri, String username, String password, List hostTags); /** - * + * * @param resources - * + * * Called after Discover.find() */ void processDiscoverEventAfter(Map> resources); /** - * + * * @param host - * + * * Called before host delete */ - void processDeleteHostEventBefore(HostVO host); + void processDeleteHostEventBefore(Host host); /** - * + * * @param host - * + * * Called after host delete. NOTE param host includes stale data which has been removed from database */ - void processDeletHostEventAfter(HostVO host); + void processDeletHostEventAfter(Host host); /** - * + * * @param hostId - * + * * Called before AgentManager.cancelMaintenance */ void processCancelMaintenaceEventBefore(Long hostId); /** - * + * * @param hostId - * + * * Called after AgentManager.cancelMaintenance */ void processCancelMaintenaceEventAfter(Long hostId); /** - * + * * @param hostId - * + * * Called before AgentManager.main */ void processPrepareMaintenaceEventBefore(Long hostId); /** - * + * * @param hostId - * + * * Called after AgentManager.main */ void processPrepareMaintenaceEventAfter(Long hostId); diff --git a/api/src/com/cloud/storage/resource/StoragePoolResource.java b/core/src/com/cloud/storage/resource/StoragePoolResource.java similarity index 100% rename from api/src/com/cloud/storage/resource/StoragePoolResource.java rename to core/src/com/cloud/storage/resource/StoragePoolResource.java diff --git a/api/test/org/apache/cloudstack/api/agent/test/AgentControlAnswerTest.java b/core/test/org/apache/cloudstack/api/agent/test/AgentControlAnswerTest.java similarity index 100% rename from api/test/org/apache/cloudstack/api/agent/test/AgentControlAnswerTest.java rename to core/test/org/apache/cloudstack/api/agent/test/AgentControlAnswerTest.java diff --git a/api/test/org/apache/cloudstack/api/agent/test/AgentControlCommandTest.java b/core/test/org/apache/cloudstack/api/agent/test/AgentControlCommandTest.java similarity index 100% rename from api/test/org/apache/cloudstack/api/agent/test/AgentControlCommandTest.java rename to core/test/org/apache/cloudstack/api/agent/test/AgentControlCommandTest.java diff --git a/api/test/org/apache/cloudstack/api/agent/test/AnswerTest.java b/core/test/org/apache/cloudstack/api/agent/test/AnswerTest.java similarity index 100% rename from api/test/org/apache/cloudstack/api/agent/test/AnswerTest.java rename to core/test/org/apache/cloudstack/api/agent/test/AnswerTest.java diff --git a/api/test/org/apache/cloudstack/api/agent/test/AttachIsoCommandTest.java b/core/test/org/apache/cloudstack/api/agent/test/AttachIsoCommandTest.java similarity index 100% rename from api/test/org/apache/cloudstack/api/agent/test/AttachIsoCommandTest.java rename to core/test/org/apache/cloudstack/api/agent/test/AttachIsoCommandTest.java diff --git a/api/test/org/apache/cloudstack/api/agent/test/AttachVolumeAnswerTest.java b/core/test/org/apache/cloudstack/api/agent/test/AttachVolumeAnswerTest.java similarity index 100% rename from api/test/org/apache/cloudstack/api/agent/test/AttachVolumeAnswerTest.java rename to core/test/org/apache/cloudstack/api/agent/test/AttachVolumeAnswerTest.java diff --git a/api/test/org/apache/cloudstack/api/agent/test/AttachVolumeCommandTest.java b/core/test/org/apache/cloudstack/api/agent/test/AttachVolumeCommandTest.java similarity index 100% rename from api/test/org/apache/cloudstack/api/agent/test/AttachVolumeCommandTest.java rename to core/test/org/apache/cloudstack/api/agent/test/AttachVolumeCommandTest.java diff --git a/api/test/org/apache/cloudstack/api/agent/test/BackupSnapshotAnswerTest.java b/core/test/org/apache/cloudstack/api/agent/test/BackupSnapshotAnswerTest.java similarity index 100% rename from api/test/org/apache/cloudstack/api/agent/test/BackupSnapshotAnswerTest.java rename to core/test/org/apache/cloudstack/api/agent/test/BackupSnapshotAnswerTest.java diff --git a/api/test/org/apache/cloudstack/api/agent/test/BackupSnapshotCommandTest.java b/core/test/org/apache/cloudstack/api/agent/test/BackupSnapshotCommandTest.java similarity index 100% rename from api/test/org/apache/cloudstack/api/agent/test/BackupSnapshotCommandTest.java rename to core/test/org/apache/cloudstack/api/agent/test/BackupSnapshotCommandTest.java diff --git a/api/test/org/apache/cloudstack/api/agent/test/BumpUpPriorityCommandTest.java b/core/test/org/apache/cloudstack/api/agent/test/BumpUpPriorityCommandTest.java similarity index 100% rename from api/test/org/apache/cloudstack/api/agent/test/BumpUpPriorityCommandTest.java rename to core/test/org/apache/cloudstack/api/agent/test/BumpUpPriorityCommandTest.java diff --git a/api/test/org/apache/cloudstack/api/agent/test/CancelCommandTest.java b/core/test/org/apache/cloudstack/api/agent/test/CancelCommandTest.java similarity index 100% rename from api/test/org/apache/cloudstack/api/agent/test/CancelCommandTest.java rename to core/test/org/apache/cloudstack/api/agent/test/CancelCommandTest.java diff --git a/api/test/org/apache/cloudstack/api/agent/test/ChangeAgentAnswerTest.java b/core/test/org/apache/cloudstack/api/agent/test/ChangeAgentAnswerTest.java similarity index 100% rename from api/test/org/apache/cloudstack/api/agent/test/ChangeAgentAnswerTest.java rename to core/test/org/apache/cloudstack/api/agent/test/ChangeAgentAnswerTest.java diff --git a/api/test/org/apache/cloudstack/api/agent/test/ChangeAgentCommandTest.java b/core/test/org/apache/cloudstack/api/agent/test/ChangeAgentCommandTest.java similarity index 100% rename from api/test/org/apache/cloudstack/api/agent/test/ChangeAgentCommandTest.java rename to core/test/org/apache/cloudstack/api/agent/test/ChangeAgentCommandTest.java diff --git a/api/test/org/apache/cloudstack/api/agent/test/CheckHealthAnswerTest.java b/core/test/org/apache/cloudstack/api/agent/test/CheckHealthAnswerTest.java similarity index 100% rename from api/test/org/apache/cloudstack/api/agent/test/CheckHealthAnswerTest.java rename to core/test/org/apache/cloudstack/api/agent/test/CheckHealthAnswerTest.java diff --git a/api/test/org/apache/cloudstack/api/agent/test/CheckHealthCommandTest.java b/core/test/org/apache/cloudstack/api/agent/test/CheckHealthCommandTest.java similarity index 100% rename from api/test/org/apache/cloudstack/api/agent/test/CheckHealthCommandTest.java rename to core/test/org/apache/cloudstack/api/agent/test/CheckHealthCommandTest.java diff --git a/api/test/org/apache/cloudstack/api/agent/test/CheckNetworkAnswerTest.java b/core/test/org/apache/cloudstack/api/agent/test/CheckNetworkAnswerTest.java similarity index 100% rename from api/test/org/apache/cloudstack/api/agent/test/CheckNetworkAnswerTest.java rename to core/test/org/apache/cloudstack/api/agent/test/CheckNetworkAnswerTest.java diff --git a/api/test/org/apache/cloudstack/api/agent/test/CheckNetworkCommandTest.java b/core/test/org/apache/cloudstack/api/agent/test/CheckNetworkCommandTest.java similarity index 100% rename from api/test/org/apache/cloudstack/api/agent/test/CheckNetworkCommandTest.java rename to core/test/org/apache/cloudstack/api/agent/test/CheckNetworkCommandTest.java diff --git a/api/test/org/apache/cloudstack/api/agent/test/CheckOnHostCommandTest.java b/core/test/org/apache/cloudstack/api/agent/test/CheckOnHostCommandTest.java similarity index 100% rename from api/test/org/apache/cloudstack/api/agent/test/CheckOnHostCommandTest.java rename to core/test/org/apache/cloudstack/api/agent/test/CheckOnHostCommandTest.java diff --git a/api/test/org/apache/cloudstack/api/agent/test/SnapshotCommandTest.java b/core/test/org/apache/cloudstack/api/agent/test/SnapshotCommandTest.java similarity index 100% rename from api/test/org/apache/cloudstack/api/agent/test/SnapshotCommandTest.java rename to core/test/org/apache/cloudstack/api/agent/test/SnapshotCommandTest.java diff --git a/api/test/src/com/cloud/agent/api/test/ResizeVolumeCommandTest.java b/core/test/src/com/cloud/agent/api/test/ResizeVolumeCommandTest.java similarity index 100% rename from api/test/src/com/cloud/agent/api/test/ResizeVolumeCommandTest.java rename to core/test/src/com/cloud/agent/api/test/ResizeVolumeCommandTest.java diff --git a/core/src/com/cloud/capacity/CapacityVO.java b/engine/schema/src/com/cloud/capacity/CapacityVO.java similarity index 100% rename from core/src/com/cloud/capacity/CapacityVO.java rename to engine/schema/src/com/cloud/capacity/CapacityVO.java diff --git a/core/src/com/cloud/certificate/CertificateVO.java b/engine/schema/src/com/cloud/certificate/CertificateVO.java similarity index 100% rename from core/src/com/cloud/certificate/CertificateVO.java rename to engine/schema/src/com/cloud/certificate/CertificateVO.java diff --git a/core/src/com/cloud/host/DetailVO.java b/engine/schema/src/com/cloud/host/DetailVO.java similarity index 100% rename from core/src/com/cloud/host/DetailVO.java rename to engine/schema/src/com/cloud/host/DetailVO.java diff --git a/core/src/com/cloud/host/HostTagVO.java b/engine/schema/src/com/cloud/host/HostTagVO.java similarity index 100% rename from core/src/com/cloud/host/HostTagVO.java rename to engine/schema/src/com/cloud/host/HostTagVO.java diff --git a/core/src/com/cloud/host/HostVO.java b/engine/schema/src/com/cloud/host/HostVO.java similarity index 100% rename from core/src/com/cloud/host/HostVO.java rename to engine/schema/src/com/cloud/host/HostVO.java diff --git a/core/src/com/cloud/hypervisor/HypervisorCapabilitiesVO.java b/engine/schema/src/com/cloud/hypervisor/HypervisorCapabilitiesVO.java similarity index 100% rename from core/src/com/cloud/hypervisor/HypervisorCapabilitiesVO.java rename to engine/schema/src/com/cloud/hypervisor/HypervisorCapabilitiesVO.java diff --git a/core/src/com/cloud/network/VpnUserVO.java b/engine/schema/src/com/cloud/network/VpnUserVO.java similarity index 100% rename from core/src/com/cloud/network/VpnUserVO.java rename to engine/schema/src/com/cloud/network/VpnUserVO.java diff --git a/core/src/com/cloud/network/security/SecurityGroupRuleVO.java b/engine/schema/src/com/cloud/network/security/SecurityGroupRuleVO.java similarity index 100% rename from core/src/com/cloud/network/security/SecurityGroupRuleVO.java rename to engine/schema/src/com/cloud/network/security/SecurityGroupRuleVO.java diff --git a/core/src/com/cloud/network/security/SecurityGroupRulesVO.java b/engine/schema/src/com/cloud/network/security/SecurityGroupRulesVO.java similarity index 100% rename from core/src/com/cloud/network/security/SecurityGroupRulesVO.java rename to engine/schema/src/com/cloud/network/security/SecurityGroupRulesVO.java diff --git a/core/src/com/cloud/network/security/SecurityGroupVMMapVO.java b/engine/schema/src/com/cloud/network/security/SecurityGroupVMMapVO.java similarity index 100% rename from core/src/com/cloud/network/security/SecurityGroupVMMapVO.java rename to engine/schema/src/com/cloud/network/security/SecurityGroupVMMapVO.java diff --git a/core/src/com/cloud/network/security/SecurityGroupVO.java b/engine/schema/src/com/cloud/network/security/SecurityGroupVO.java similarity index 100% rename from core/src/com/cloud/network/security/SecurityGroupVO.java rename to engine/schema/src/com/cloud/network/security/SecurityGroupVO.java diff --git a/core/src/com/cloud/network/security/SecurityGroupWork.java b/engine/schema/src/com/cloud/network/security/SecurityGroupWork.java similarity index 100% rename from core/src/com/cloud/network/security/SecurityGroupWork.java rename to engine/schema/src/com/cloud/network/security/SecurityGroupWork.java diff --git a/core/src/com/cloud/network/security/SecurityGroupWorkVO.java b/engine/schema/src/com/cloud/network/security/SecurityGroupWorkVO.java similarity index 100% rename from core/src/com/cloud/network/security/SecurityGroupWorkVO.java rename to engine/schema/src/com/cloud/network/security/SecurityGroupWorkVO.java diff --git a/core/src/com/cloud/network/security/VmRulesetLogVO.java b/engine/schema/src/com/cloud/network/security/VmRulesetLogVO.java similarity index 100% rename from core/src/com/cloud/network/security/VmRulesetLogVO.java rename to engine/schema/src/com/cloud/network/security/VmRulesetLogVO.java diff --git a/core/src/com/cloud/storage/DiskOfferingVO.java b/engine/schema/src/com/cloud/storage/DiskOfferingVO.java similarity index 100% rename from core/src/com/cloud/storage/DiskOfferingVO.java rename to engine/schema/src/com/cloud/storage/DiskOfferingVO.java diff --git a/core/src/com/cloud/storage/GuestOSCategoryVO.java b/engine/schema/src/com/cloud/storage/GuestOSCategoryVO.java similarity index 100% rename from core/src/com/cloud/storage/GuestOSCategoryVO.java rename to engine/schema/src/com/cloud/storage/GuestOSCategoryVO.java diff --git a/core/src/com/cloud/storage/GuestOSVO.java b/engine/schema/src/com/cloud/storage/GuestOSVO.java similarity index 100% rename from core/src/com/cloud/storage/GuestOSVO.java rename to engine/schema/src/com/cloud/storage/GuestOSVO.java diff --git a/core/src/com/cloud/storage/LaunchPermissionVO.java b/engine/schema/src/com/cloud/storage/LaunchPermissionVO.java similarity index 100% rename from core/src/com/cloud/storage/LaunchPermissionVO.java rename to engine/schema/src/com/cloud/storage/LaunchPermissionVO.java diff --git a/core/src/com/cloud/storage/S3VO.java b/engine/schema/src/com/cloud/storage/S3VO.java similarity index 100% rename from core/src/com/cloud/storage/S3VO.java rename to engine/schema/src/com/cloud/storage/S3VO.java diff --git a/core/src/com/cloud/storage/SnapshotPolicyVO.java b/engine/schema/src/com/cloud/storage/SnapshotPolicyVO.java similarity index 100% rename from core/src/com/cloud/storage/SnapshotPolicyVO.java rename to engine/schema/src/com/cloud/storage/SnapshotPolicyVO.java diff --git a/core/src/com/cloud/storage/SnapshotScheduleVO.java b/engine/schema/src/com/cloud/storage/SnapshotScheduleVO.java similarity index 100% rename from core/src/com/cloud/storage/SnapshotScheduleVO.java rename to engine/schema/src/com/cloud/storage/SnapshotScheduleVO.java diff --git a/core/src/com/cloud/storage/SnapshotVO.java b/engine/schema/src/com/cloud/storage/SnapshotVO.java similarity index 100% rename from core/src/com/cloud/storage/SnapshotVO.java rename to engine/schema/src/com/cloud/storage/SnapshotVO.java diff --git a/core/src/com/cloud/storage/StoragePoolHostAssoc.java b/engine/schema/src/com/cloud/storage/StoragePoolHostAssoc.java similarity index 100% rename from core/src/com/cloud/storage/StoragePoolHostAssoc.java rename to engine/schema/src/com/cloud/storage/StoragePoolHostAssoc.java diff --git a/core/src/com/cloud/storage/StoragePoolHostVO.java b/engine/schema/src/com/cloud/storage/StoragePoolHostVO.java similarity index 94% rename from core/src/com/cloud/storage/StoragePoolHostVO.java rename to engine/schema/src/com/cloud/storage/StoragePoolHostVO.java index a8a2bac4886..1a4b9b87dce 100644 --- a/core/src/com/cloud/storage/StoragePoolHostVO.java +++ b/engine/schema/src/com/cloud/storage/StoragePoolHostVO.java @@ -28,7 +28,6 @@ import javax.persistence.Temporal; import javax.persistence.TemporalType; import com.cloud.utils.db.GenericDaoBase; -import org.apache.cloudstack.api.InternalIdentity; /** * Join table for storage pools and hosts @@ -40,24 +39,24 @@ public class StoragePoolHostVO implements StoragePoolHostAssoc { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; - + @Column(name="pool_id") private long poolId; - + @Column(name="host_id") private long hostId; - + @Column(name="local_path") private String localPath; - + @Column(name=GenericDaoBase.CREATED_COLUMN) - private Date created = null; - + private final Date created = null; + @Column(name="last_updated") @Temporal(value=TemporalType.TIMESTAMP) - private Date lastUpdated = null; - - + private final Date lastUpdated = null; + + public StoragePoolHostVO() { super(); } @@ -76,6 +75,7 @@ public class StoragePoolHostVO implements StoragePoolHostAssoc { } + @Override public long getId() { return id; } diff --git a/core/src/com/cloud/storage/StoragePoolWorkVO.java b/engine/schema/src/com/cloud/storage/StoragePoolWorkVO.java similarity index 100% rename from core/src/com/cloud/storage/StoragePoolWorkVO.java rename to engine/schema/src/com/cloud/storage/StoragePoolWorkVO.java diff --git a/core/src/com/cloud/storage/SwiftVO.java b/engine/schema/src/com/cloud/storage/SwiftVO.java similarity index 100% rename from core/src/com/cloud/storage/SwiftVO.java rename to engine/schema/src/com/cloud/storage/SwiftVO.java diff --git a/core/src/com/cloud/storage/UploadVO.java b/engine/schema/src/com/cloud/storage/UploadVO.java similarity index 100% rename from core/src/com/cloud/storage/UploadVO.java rename to engine/schema/src/com/cloud/storage/UploadVO.java diff --git a/core/src/com/cloud/storage/VMTemplateDetailVO.java b/engine/schema/src/com/cloud/storage/VMTemplateDetailVO.java similarity index 100% rename from core/src/com/cloud/storage/VMTemplateDetailVO.java rename to engine/schema/src/com/cloud/storage/VMTemplateDetailVO.java diff --git a/core/src/com/cloud/storage/VMTemplateHostVO.java b/engine/schema/src/com/cloud/storage/VMTemplateHostVO.java similarity index 100% rename from core/src/com/cloud/storage/VMTemplateHostVO.java rename to engine/schema/src/com/cloud/storage/VMTemplateHostVO.java diff --git a/core/src/com/cloud/storage/VMTemplateS3VO.java b/engine/schema/src/com/cloud/storage/VMTemplateS3VO.java similarity index 100% rename from core/src/com/cloud/storage/VMTemplateS3VO.java rename to engine/schema/src/com/cloud/storage/VMTemplateS3VO.java diff --git a/core/src/com/cloud/storage/VMTemplateStoragePoolVO.java b/engine/schema/src/com/cloud/storage/VMTemplateStoragePoolVO.java similarity index 100% rename from core/src/com/cloud/storage/VMTemplateStoragePoolVO.java rename to engine/schema/src/com/cloud/storage/VMTemplateStoragePoolVO.java diff --git a/core/src/com/cloud/storage/VMTemplateSwiftVO.java b/engine/schema/src/com/cloud/storage/VMTemplateSwiftVO.java similarity index 100% rename from core/src/com/cloud/storage/VMTemplateSwiftVO.java rename to engine/schema/src/com/cloud/storage/VMTemplateSwiftVO.java diff --git a/core/src/com/cloud/storage/VMTemplateVO.java b/engine/schema/src/com/cloud/storage/VMTemplateVO.java similarity index 100% rename from core/src/com/cloud/storage/VMTemplateVO.java rename to engine/schema/src/com/cloud/storage/VMTemplateVO.java diff --git a/core/src/com/cloud/storage/VMTemplateZoneVO.java b/engine/schema/src/com/cloud/storage/VMTemplateZoneVO.java similarity index 100% rename from core/src/com/cloud/storage/VMTemplateZoneVO.java rename to engine/schema/src/com/cloud/storage/VMTemplateZoneVO.java diff --git a/core/src/com/cloud/storage/VolumeHostVO.java b/engine/schema/src/com/cloud/storage/VolumeHostVO.java similarity index 100% rename from core/src/com/cloud/storage/VolumeHostVO.java rename to engine/schema/src/com/cloud/storage/VolumeHostVO.java diff --git a/core/src/com/cloud/storage/VolumeVO.java b/engine/schema/src/com/cloud/storage/VolumeVO.java similarity index 100% rename from core/src/com/cloud/storage/VolumeVO.java rename to engine/schema/src/com/cloud/storage/VolumeVO.java diff --git a/framework/jobs/pom.xml b/framework/jobs/pom.xml index 56490216f16..5ae63af77ad 100644 --- a/framework/jobs/pom.xml +++ b/framework/jobs/pom.xml @@ -18,12 +18,31 @@ --> 4.0.0 - org.apache.cloudstack cloud-framework-jobs - 4.0.0-SNAPSHOT - - org.quartz-scheduler - quartz - 2.1.6 - + + org.apache.cloudstack + cloudstack-framework + 4.2.0-SNAPSHOT + ../pom.xml + + + + org.quartz-scheduler + quartz + 2.1.6 + + + org.apache.cloudstack + cloud-utils + ${project.version} + + + org.apache.cloudstack + cloud-api + ${project.version} + + + + install + diff --git a/framework/pom.xml b/framework/pom.xml index 4dfb409f04e..ddcdcb0439a 100644 --- a/framework/pom.xml +++ b/framework/pom.xml @@ -33,5 +33,6 @@ ipc rest events + jobs diff --git a/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java b/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java index a0c991b5ad6..7153282a2aa 100644 --- a/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java +++ b/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java @@ -30,12 +30,10 @@ import javax.inject.Inject; import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; -import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreRole; import org.apache.cloudstack.engine.subsystem.api.storage.HostScope; import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo; import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle; import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreParameters; -import org.apache.cloudstack.engine.subsystem.api.storage.ScopeType; import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; @@ -46,17 +44,12 @@ import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; import com.cloud.agent.api.CreateStoragePoolCommand; import com.cloud.agent.api.DeleteStoragePoolCommand; -import com.cloud.agent.api.ModifyStoragePoolCommand; import com.cloud.agent.api.StoragePoolInfo; import com.cloud.alert.AlertManager; -import com.cloud.capacity.Capacity; -import com.cloud.capacity.CapacityVO; -import com.cloud.capacity.dao.CapacityDao; import com.cloud.exception.DiscoveryException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.host.Host; import com.cloud.host.HostVO; -import com.cloud.host.Status; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.resource.ResourceManager; import com.cloud.server.ManagementServer; @@ -67,29 +60,14 @@ import com.cloud.storage.StoragePool; import com.cloud.storage.StoragePoolAutomation; import com.cloud.storage.StoragePoolDiscoverer; import com.cloud.storage.StoragePoolHostVO; -import com.cloud.storage.StoragePoolStatus; -import com.cloud.storage.StoragePoolWorkVO; -import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.StoragePoolHostDao; import com.cloud.storage.dao.StoragePoolWorkDao; import com.cloud.storage.dao.VolumeDao; -import com.cloud.user.Account; -import com.cloud.user.User; -import com.cloud.user.UserContext; import com.cloud.user.dao.UserDao; import com.cloud.utils.NumbersUtil; import com.cloud.utils.UriUtils; import com.cloud.utils.db.DB; -import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.exception.ExecutionException; -import com.cloud.vm.ConsoleProxyVO; -import com.cloud.vm.DomainRouterVO; -import com.cloud.vm.SecondaryStorageVmVO; -import com.cloud.vm.UserVmVO; -import com.cloud.vm.VMInstanceVO; -import com.cloud.vm.VirtualMachine; -import com.cloud.vm.VirtualMachine.State; import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.dao.ConsoleProxyDao; import com.cloud.vm.dao.DomainRouterDao; @@ -157,7 +135,7 @@ public class CloudStackPrimaryDataStoreLifeCycleImpl implements throw new InvalidParameterValueException( "Cluster id requires pod id"); } - + PrimaryDataStoreParameters parameters = new PrimaryDataStoreParameters(); URI uri = null; @@ -195,7 +173,7 @@ public class CloudStackPrimaryDataStoreLifeCycleImpl implements String tags = (String) dsInfos.get("tags"); Map details = (Map) dsInfos .get("details"); - + parameters.setTags(tags); parameters.setDetails(details); @@ -208,7 +186,7 @@ public class CloudStackPrimaryDataStoreLifeCycleImpl implements } String userInfo = uri.getUserInfo(); int port = uri.getPort(); - StoragePoolVO pool = null; + StoragePool pool = null; if (s_logger.isDebugEnabled()) { s_logger.debug("createPool Params @ scheme - " + scheme + " storageHost - " + storageHost + " hostPath - " @@ -272,7 +250,7 @@ public class CloudStackPrimaryDataStoreLifeCycleImpl implements parameters.setPath(hostPath); } else { for (StoragePoolDiscoverer discoverer : _discoverers) { - Map> pools; + Map> pools; try { pools = discoverer.find(zoneId, podId, uri, details); } catch (DiscoveryException e) { @@ -281,7 +259,7 @@ public class CloudStackPrimaryDataStoreLifeCycleImpl implements e); } if (pools != null) { - Map.Entry> entry = pools + Map.Entry> entry = pools .entrySet().iterator().next(); pool = entry.getKey(); details = entry.getValue(); @@ -310,7 +288,7 @@ public class CloudStackPrimaryDataStoreLifeCycleImpl implements parameters.setPath(hostPath); } else { StoragePoolType type = Enum.valueOf(StoragePoolType.class, scheme); - + if (type != null) { parameters.setType(type); parameters.setHost(storageHost); @@ -332,7 +310,7 @@ public class CloudStackPrimaryDataStoreLifeCycleImpl implements + " already in use by another pod (id=" + oldPodId + ")"); } } - + Object existingUuid = dsInfos.get("uuid"); String uuid = null; @@ -368,7 +346,7 @@ public class CloudStackPrimaryDataStoreLifeCycleImpl implements parameters.setName(poolName); parameters.setClusterId(clusterId); parameters.setProviderName(providerName); - + return dataStoreHelper.createPrimaryDataStore(parameters); } @@ -457,7 +435,7 @@ public class CloudStackPrimaryDataStoreLifeCycleImpl implements primaryDataStoreDao.expunge(primarystore.getId()); return false; } - + this.dataStoreHelper.attachCluster(store); return true; } @@ -527,11 +505,11 @@ public class CloudStackPrimaryDataStoreLifeCycleImpl implements } } } - + if (!deleteFlag) { throw new CloudRuntimeException("Failed to delete storage pool on host"); } - + return this.dataStoreHelper.deletePrimaryDataStore(store); } diff --git a/server/pom.xml b/server/pom.xml index 2d960bef303..808dd3eee0a 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -34,6 +34,11 @@ httpcore ${cs.httpcore.version} + + org.apache.cloudstack + cloud-framework-jobs + ${project.version} + org.apache.httpcomponents httpclient diff --git a/core/src/com/cloud/alert/AlertManager.java b/server/src/com/cloud/alert/AlertManager.java similarity index 100% rename from core/src/com/cloud/alert/AlertManager.java rename to server/src/com/cloud/alert/AlertManager.java diff --git a/core/src/com/cloud/async/AsyncJobVO.java b/server/src/com/cloud/async/AsyncJobVO.java similarity index 100% rename from core/src/com/cloud/async/AsyncJobVO.java rename to server/src/com/cloud/async/AsyncJobVO.java diff --git a/core/src/com/cloud/async/SyncQueueItemVO.java b/server/src/com/cloud/async/SyncQueueItemVO.java similarity index 100% rename from core/src/com/cloud/async/SyncQueueItemVO.java rename to server/src/com/cloud/async/SyncQueueItemVO.java diff --git a/core/src/com/cloud/async/SyncQueueVO.java b/server/src/com/cloud/async/SyncQueueVO.java similarity index 100% rename from core/src/com/cloud/async/SyncQueueVO.java rename to server/src/com/cloud/async/SyncQueueVO.java diff --git a/server/src/com/cloud/capacity/CapacityManagerImpl.java b/server/src/com/cloud/capacity/CapacityManagerImpl.java index 089307fc44c..1eb2fa5894a 100755 --- a/server/src/com/cloud/capacity/CapacityManagerImpl.java +++ b/server/src/com/cloud/capacity/CapacityManagerImpl.java @@ -28,12 +28,6 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; -import com.cloud.dc.ClusterDetailsDao; -import com.cloud.dc.DataCenter; -import com.cloud.dc.dao.ClusterDao; -import com.cloud.exception.InsufficientCapacityException; -import com.cloud.exception.InsufficientServerCapacityException; -import com.cloud.resource.ResourceState; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -50,7 +44,10 @@ import com.cloud.capacity.dao.CapacityDao; import com.cloud.configuration.Config; import com.cloud.configuration.ConfigurationManager; import com.cloud.configuration.dao.ConfigurationDao; +import com.cloud.dc.ClusterDetailsDao; +import com.cloud.dc.dao.ClusterDao; import com.cloud.exception.ConnectionException; +import com.cloud.host.Host; import com.cloud.host.HostVO; import com.cloud.host.Status; import com.cloud.host.dao.HostDao; @@ -104,9 +101,9 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, HostDao _hostDao; @Inject VMInstanceDao _vmDao; - @Inject + @Inject VolumeDao _volumeDao; - @Inject + @Inject VMTemplatePoolDao _templatePoolDao; @Inject AgentManager _agentManager; @@ -115,16 +112,16 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, @Inject StorageManager _storageMgr; @Inject - SwiftManager _swiftMgr; + SwiftManager _swiftMgr; @Inject - ConfigurationManager _configMgr; + ConfigurationManager _configMgr; @Inject HypervisorCapabilitiesDao _hypervisorCapabilitiesDao; @Inject protected VMSnapshotDao _vmSnapshotDao; @Inject protected UserVmDao _userVMDao; - + @Inject ClusterDetailsDao _clusterDetailsDao; @Inject @@ -191,8 +188,8 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, long actualTotalCpu = capacityCpu.getTotalCapacity(); float cpuOvercommitRatio =Float.parseFloat(_clusterDetailsDao.findDetail(clusterId,"cpuOvercommitRatio").getValue()); float memoryOvercommitRatio = Float.parseFloat(_clusterDetailsDao.findDetail(clusterId,"memoryOvercommitRatio").getValue()); - int vmCPU = (int) (svo.getCpu() * svo.getSpeed()); - long vmMem = (long) (svo.getRamSize() * 1024L * 1024L); + int vmCPU = svo.getCpu() * svo.getSpeed(); + long vmMem = svo.getRamSize() * 1024L * 1024L; long actualTotalMem = capacityMemory.getTotalCapacity(); long totalMem = (long) (actualTotalMem * memoryOvercommitRatio); long totalCpu = (long) (actualTotalCpu * cpuOvercommitRatio); @@ -266,8 +263,8 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, return; } - int cpu = (int) (svo.getCpu() * svo.getSpeed()); - long ram = (long) (svo.getRamSize() * 1024L * 1024L); + int cpu = svo.getCpu() * svo.getSpeed(); + long ram = svo.getRamSize() * 1024L * 1024L; Transaction txn = Transaction.currentTxn(); @@ -398,10 +395,10 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, failureReason = "Host does not have enough reserved CPU available"; } } else { - + long reservedCpuValueToUse = reservedCpu; long reservedMemValueToUse = reservedMem; - + if(!considerReservedCapacity){ if (s_logger.isDebugEnabled()) { s_logger.debug("considerReservedCapacity is" + considerReservedCapacity + " , not considering reserved capacity for calculating free capacity"); @@ -458,7 +455,7 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, return hasCapacity; } - + private long getVMSnapshotAllocatedCapacity(StoragePoolVO pool){ List volumes = _volumeDao.findByPoolId(pool.getId()); long totalSize = 0; @@ -486,39 +483,39 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, } return totalSize; } - + @Override public long getAllocatedPoolCapacity(StoragePoolVO pool, VMTemplateVO templateForVmCreation){ - + // Get size for all the volumes Pair sizes = _volumeDao.getCountAndTotalByPool(pool.getId()); long totalAllocatedSize = sizes.second() + sizes.first() * _extraBytesPerVolume; - - // Get size for VM Snapshots + + // Get size for VM Snapshots totalAllocatedSize = totalAllocatedSize + getVMSnapshotAllocatedCapacity(pool); // Iterate through all templates on this storage pool boolean tmpinstalled = false; List templatePoolVOs; templatePoolVOs = _templatePoolDao.listByPoolId(pool.getId()); - - for (VMTemplateStoragePoolVO templatePoolVO : templatePoolVOs) { + + for (VMTemplateStoragePoolVO templatePoolVO : templatePoolVOs) { if ((templateForVmCreation != null) && !tmpinstalled && (templatePoolVO.getTemplateId() == templateForVmCreation.getId())) { tmpinstalled = true; } long templateSize = templatePoolVO.getTemplateSize(); totalAllocatedSize += templateSize + _extraBytesPerVolume; } - + // Add the size for the templateForVmCreation if its not already present /*if ((templateForVmCreation != null) && !tmpinstalled) { - + }*/ - + return totalAllocatedSize; } - - + + @DB @Override public void updateCapacityForHost(HostVO host){ @@ -528,7 +525,7 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, for (ServiceOfferingVO offering : offerings) { offeringsMap.put(offering.getId(), offering); } - + long usedCpu = 0; long usedMemory = 0; long reservedMemory = 0; @@ -574,7 +571,7 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, + usedCpu); cpuCap.setUsedCapacity(usedCpu); } - + if (memCap.getUsedCapacity() == usedMemory && memCap.getReservedCapacity() == reservedMemory) { s_logger.debug("No need to calibrate memory capacity, host:" + host.getId() + " usedMem: " + memCap.getUsedCapacity() + " reservedMem: " + memCap.getReservedCapacity()); @@ -591,7 +588,7 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, + " new usedMem: " + usedMemory); memCap.setUsedCapacity(usedMemory); } - + try { _capacityDao.update(cpuCap.getId(), cpuCap); _capacityDao.update(memCap.getId(), memCap); @@ -610,24 +607,24 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, capacity.setReservedCapacity(reservedMemory); capacity.setCapacityState(capacityState); _capacityDao.persist(capacity); - + capacity = new CapacityVO( host.getId(), host.getDataCenterId(), - host.getPodId(), + host.getPodId(), host.getClusterId(), usedCpu, - (long)(host.getCpus().longValue() * host.getSpeed().longValue()), + host.getCpus().longValue() * host.getSpeed().longValue(), CapacityVO.CAPACITY_TYPE_CPU); capacity.setReservedCapacity(reservedCpu); capacity.setCapacityState(capacityState); _capacityDao.persist(capacity); txn.commit(); - + } - + } - + @Override public boolean preStateTransitionEvent(State oldState, Event event, State newState, VirtualMachine vm, boolean transitionStatus, Object opaque) { return true; @@ -681,7 +678,7 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, releaseVmCapacity(vm, false, false, oldHostId); } } - + if ((newState == State.Starting || newState == State.Migrating || event == Event.AgentReportMigrated) && vm.getHostId() != null) { boolean fromLastHost = false; if (vm.getLastHostId() == vm.getHostId()) { @@ -729,7 +726,7 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, _capacityDao.update(CapacityVOCpu.getId(), CapacityVOCpu); } else { CapacityVO capacity = new CapacityVO(server.getId(), server.getDataCenterId(), server.getPodId(), server.getClusterId(), 0L, - (long) (server.getCpus().longValue() * server.getSpeed().longValue()), + server.getCpus().longValue() * server.getSpeed().longValue(), CapacityVO.CAPACITY_TYPE_CPU); _capacityDao.persist(capacity); } @@ -815,32 +812,32 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, @Override public void processCancelMaintenaceEventAfter(Long hostId) { - updateCapacityForHost(_hostDao.findById(hostId)); + updateCapacityForHost(_hostDao.findById(hostId)); } @Override public void processCancelMaintenaceEventBefore(Long hostId) { // TODO Auto-generated method stub - + } @Override - public void processDeletHostEventAfter(HostVO host) { + public void processDeletHostEventAfter(Host host) { // TODO Auto-generated method stub - + } @Override - public void processDeleteHostEventBefore(HostVO host) { + public void processDeleteHostEventBefore(Host host) { // TODO Auto-generated method stub - + } @Override public void processDiscoverEventAfter( Map> resources) { // TODO Auto-generated method stub - + } @Override @@ -848,11 +845,11 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, Long clusterId, URI uri, String username, String password, List hostTags) { // TODO Auto-generated method stub - + } @Override - public void processPrepareMaintenaceEventAfter(Long hostId) { + public void processPrepareMaintenaceEventAfter(Long hostId) { _capacityDao.removeBy(Capacity.CAPACITY_TYPE_MEMORY, null, null, null, hostId); _capacityDao.removeBy(Capacity.CAPACITY_TYPE_CPU, null, null, null, hostId); } @@ -860,7 +857,7 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, @Override public void processPrepareMaintenaceEventBefore(Long hostId) { // TODO Auto-generated method stub - + } @Override @@ -871,7 +868,7 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager, Long maxGuestLimit = _hypervisorCapabilitiesDao.getMaxGuestsLimit(hypervisorType, hypervisorVersion); if(vmCount.longValue() >= maxGuestLimit.longValue()){ if (s_logger.isDebugEnabled()) { - s_logger.debug("Host name: " + host.getName() + ", hostId: "+ host.getId() + + s_logger.debug("Host name: " + host.getName() + ", hostId: "+ host.getId() + " already reached max Running VMs(count includes system VMs), limit is: " + maxGuestLimit + ",Running VM counts is: "+vmCount.longValue()); } return true; diff --git a/server/src/com/cloud/storage/OCFS2ManagerImpl.java b/server/src/com/cloud/storage/OCFS2ManagerImpl.java index 476bf04cae9..5eb9a4a5c44 100755 --- a/server/src/com/cloud/storage/OCFS2ManagerImpl.java +++ b/server/src/com/cloud/storage/OCFS2ManagerImpl.java @@ -56,7 +56,7 @@ import com.cloud.utils.exception.CloudRuntimeException; @Local(value ={OCFS2Manager.class}) public class OCFS2ManagerImpl extends ManagerBase implements OCFS2Manager, ResourceListener { private static final Logger s_logger = Logger.getLogger(OCFS2ManagerImpl.class); - + @Inject ClusterDetailsDao _clusterDetailsDao; @Inject AgentManager _agentMgr; @Inject HostDao _hostDao; @@ -64,7 +64,7 @@ public class OCFS2ManagerImpl extends ManagerBase implements OCFS2Manager, Resou @Inject ResourceManager _resourceMgr; @Inject StoragePoolHostDao _poolHostDao; @Inject PrimaryDataStoreDao _poolDao; - + @Override public boolean configure(String name, Map params) throws ConfigurationException { return true; @@ -96,8 +96,8 @@ public class OCFS2ManagerImpl extends ManagerBase implements OCFS2Manager, Resou } return lst; } - - + + private boolean prepareNodes(String clusterName, List hosts) { PrepareOCFS2NodesCommand cmd = new PrepareOCFS2NodesCommand(clusterName, marshalNodes(hosts)); for (HostVO h : hosts) { @@ -111,36 +111,36 @@ public class OCFS2ManagerImpl extends ManagerBase implements OCFS2Manager, Resou return false; } } - + return true; } - + private String getClusterName(Long clusterId) { ClusterVO cluster = _clusterDao.findById(clusterId); if (cluster == null) { throw new CloudRuntimeException("Cannot get cluster for id " + clusterId); } - - String clusterName = "OvmCluster" + cluster.getId(); + + String clusterName = "OvmCluster" + cluster.getId(); return clusterName; } - + @Override public boolean prepareNodes(List hosts, StoragePool pool) { if (pool.getPoolType() != StoragePoolType.OCFS2) { throw new CloudRuntimeException("None OCFS2 storage pool is getting into OCFS2 manager!"); } - + return prepareNodes(getClusterName(pool.getClusterId()), hosts); } @Override - public boolean prepareNodes(Long clusterId) { + public boolean prepareNodes(Long clusterId) { ClusterVO cluster = _clusterDao.findById(clusterId); if (cluster == null) { throw new CloudRuntimeException("Cannot find cluster for ID " + clusterId); } - + SearchCriteriaService sc = SearchCriteria2.create(HostVO.class); sc.addAnd(sc.getEntity().getClusterId(), Op.EQ, clusterId); sc.addAnd(sc.getEntity().getPodId(), Op.EQ, cluster.getPodId()); @@ -151,36 +151,36 @@ public class OCFS2ManagerImpl extends ManagerBase implements OCFS2Manager, Resou s_logger.debug("There is no host in cluster " + clusterId + ", no need to prepare OCFS2 nodes"); return true; } - + return prepareNodes(getClusterName(clusterId), hosts); } @Override public void processDiscoverEventBefore(Long dcid, Long podId, Long clusterId, URI uri, String username, String password, List hostTags) { // TODO Auto-generated method stub - + } @Override public void processDiscoverEventAfter(Map> resources) { // TODO Auto-generated method stub - + } @Override - public void processDeleteHostEventBefore(HostVO host) { + public void processDeleteHostEventBefore(Host host) { // TODO Auto-generated method stub - + } @Override - public void processDeletHostEventAfter(HostVO host) { + public void processDeletHostEventAfter(Host host) { String errMsg = String.format("Prepare OCFS2 nodes failed after delete host %1$s (zone:%2$s, pod:%3$s, cluster:%4$s", host.getId(), host.getDataCenterId(), host.getPodId(), host.getClusterId()); - + if (host.getHypervisorType() != HypervisorType.Ovm) { return; } - + boolean hasOcfs2 = false; List poolRefs = _poolHostDao.listByHostId(host.getId()); for (StoragePoolHostVO poolRef : poolRefs) { @@ -205,24 +205,24 @@ public class OCFS2ManagerImpl extends ManagerBase implements OCFS2Manager, Resou @Override public void processCancelMaintenaceEventBefore(Long hostId) { // TODO Auto-generated method stub - + } @Override public void processCancelMaintenaceEventAfter(Long hostId) { // TODO Auto-generated method stub - + } @Override public void processPrepareMaintenaceEventBefore(Long hostId) { // TODO Auto-generated method stub - + } @Override public void processPrepareMaintenaceEventAfter(Long hostId) { // TODO Auto-generated method stub - + } } From f6913b5088d62ddfbd5f56c797d8568ce68e3097 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Wed, 1 May 2013 15:15:57 -0700 Subject: [PATCH 27/66] Removed files that are no longer used and further separated out the files in the core project --- .../src/com/cloud/alert/AlertAdapter.java | 0 ... => DownloadSnapshotFromSwiftCommand.java} | 6 +-- ...teFromSwiftToSecondaryStorageCommand.java} | 6 +-- ...teToSwiftFromSecondaryStorageCommand.java} | 6 +-- .../com/cloud/storage/SecondaryStorage.java | 30 -------------- .../cloud/storage/SecondaryStorageLayer.java | 39 ------------------- .../storage/snapshot/SnapshotManagerImpl.java | 4 +- .../cloud/template/TemplateManagerImpl.java | 8 ++-- .../resource/NfsSecondaryStorageResource.java | 24 ++++++------ 9 files changed, 27 insertions(+), 96 deletions(-) rename {core => api}/src/com/cloud/alert/AlertAdapter.java (100%) rename core/src/com/cloud/agent/api/{downloadSnapshotFromSwiftCommand.java => DownloadSnapshotFromSwiftCommand.java} (90%) rename core/src/com/cloud/agent/api/{downloadTemplateFromSwiftToSecondaryStorageCommand.java => DownloadTemplateFromSwiftToSecondaryStorageCommand.java} (91%) rename core/src/com/cloud/agent/api/{uploadTemplateToSwiftFromSecondaryStorageCommand.java => UploadTemplateToSwiftFromSecondaryStorageCommand.java} (91%) delete mode 100644 core/src/com/cloud/storage/SecondaryStorage.java delete mode 100644 core/src/com/cloud/storage/SecondaryStorageLayer.java diff --git a/core/src/com/cloud/alert/AlertAdapter.java b/api/src/com/cloud/alert/AlertAdapter.java similarity index 100% rename from core/src/com/cloud/alert/AlertAdapter.java rename to api/src/com/cloud/alert/AlertAdapter.java diff --git a/core/src/com/cloud/agent/api/downloadSnapshotFromSwiftCommand.java b/core/src/com/cloud/agent/api/DownloadSnapshotFromSwiftCommand.java similarity index 90% rename from core/src/com/cloud/agent/api/downloadSnapshotFromSwiftCommand.java rename to core/src/com/cloud/agent/api/DownloadSnapshotFromSwiftCommand.java index a2ae611d316..0711b2ef2d8 100644 --- a/core/src/com/cloud/agent/api/downloadSnapshotFromSwiftCommand.java +++ b/core/src/com/cloud/agent/api/DownloadSnapshotFromSwiftCommand.java @@ -22,17 +22,17 @@ import com.cloud.agent.api.to.SwiftTO; /** * This currently assumes that both primary and secondary storage are mounted on the XenServer. */ -public class downloadSnapshotFromSwiftCommand extends SnapshotCommand { +public class DownloadSnapshotFromSwiftCommand extends SnapshotCommand { @LogLevel(Log4jLevel.Off) private SwiftTO _swift; private String _parent; - protected downloadSnapshotFromSwiftCommand() { + protected DownloadSnapshotFromSwiftCommand() { } - public downloadSnapshotFromSwiftCommand(SwiftTO swift, String secondaryStorageUrl, Long dcId, Long accountId, Long volumeId, String parent, String BackupUuid, int wait) { + public DownloadSnapshotFromSwiftCommand(SwiftTO swift, String secondaryStorageUrl, Long dcId, Long accountId, Long volumeId, String parent, String BackupUuid, int wait) { super(null, secondaryStorageUrl, BackupUuid, "", dcId, accountId, volumeId); setParent(parent); diff --git a/core/src/com/cloud/agent/api/downloadTemplateFromSwiftToSecondaryStorageCommand.java b/core/src/com/cloud/agent/api/DownloadTemplateFromSwiftToSecondaryStorageCommand.java similarity index 91% rename from core/src/com/cloud/agent/api/downloadTemplateFromSwiftToSecondaryStorageCommand.java rename to core/src/com/cloud/agent/api/DownloadTemplateFromSwiftToSecondaryStorageCommand.java index 82290656095..79ec882c8d7 100644 --- a/core/src/com/cloud/agent/api/downloadTemplateFromSwiftToSecondaryStorageCommand.java +++ b/core/src/com/cloud/agent/api/DownloadTemplateFromSwiftToSecondaryStorageCommand.java @@ -24,7 +24,7 @@ import com.cloud.agent.api.to.SwiftTO; * */ -public class downloadTemplateFromSwiftToSecondaryStorageCommand extends Command { +public class DownloadTemplateFromSwiftToSecondaryStorageCommand extends Command { @LogLevel(Log4jLevel.Off) private SwiftTO swift; private String secondaryStorageUrl; @@ -34,11 +34,11 @@ public class downloadTemplateFromSwiftToSecondaryStorageCommand extends Command private Long templateId; private String path; - protected downloadTemplateFromSwiftToSecondaryStorageCommand() { + protected DownloadTemplateFromSwiftToSecondaryStorageCommand() { } - public downloadTemplateFromSwiftToSecondaryStorageCommand(SwiftTO swift, String secondaryStorageUrl, Long dcId, Long accountId, Long templateId, String path, int wait) { + public DownloadTemplateFromSwiftToSecondaryStorageCommand(SwiftTO swift, String secondaryStorageUrl, Long dcId, Long accountId, Long templateId, String path, int wait) { this.swift = swift; this.secondaryStorageUrl = secondaryStorageUrl; diff --git a/core/src/com/cloud/agent/api/uploadTemplateToSwiftFromSecondaryStorageCommand.java b/core/src/com/cloud/agent/api/UploadTemplateToSwiftFromSecondaryStorageCommand.java similarity index 91% rename from core/src/com/cloud/agent/api/uploadTemplateToSwiftFromSecondaryStorageCommand.java rename to core/src/com/cloud/agent/api/UploadTemplateToSwiftFromSecondaryStorageCommand.java index 10001b149fa..7ba377da8c3 100644 --- a/core/src/com/cloud/agent/api/uploadTemplateToSwiftFromSecondaryStorageCommand.java +++ b/core/src/com/cloud/agent/api/UploadTemplateToSwiftFromSecondaryStorageCommand.java @@ -24,7 +24,7 @@ import com.cloud.agent.api.to.SwiftTO; * */ -public class uploadTemplateToSwiftFromSecondaryStorageCommand extends Command { +public class UploadTemplateToSwiftFromSecondaryStorageCommand extends Command { @LogLevel(Log4jLevel.Off) private SwiftTO swift; private String secondaryStorageUrl; @@ -33,11 +33,11 @@ public class uploadTemplateToSwiftFromSecondaryStorageCommand extends Command { private Long accountId; private Long templateId; - protected uploadTemplateToSwiftFromSecondaryStorageCommand() { + protected UploadTemplateToSwiftFromSecondaryStorageCommand() { } - public uploadTemplateToSwiftFromSecondaryStorageCommand(SwiftTO swift, String secondaryStorageUrl, Long dcId, Long accountId, Long templateId, int wait) { + public UploadTemplateToSwiftFromSecondaryStorageCommand(SwiftTO swift, String secondaryStorageUrl, Long dcId, Long accountId, Long templateId, int wait) { this.swift = swift; this.secondaryStorageUrl = secondaryStorageUrl; diff --git a/core/src/com/cloud/storage/SecondaryStorage.java b/core/src/com/cloud/storage/SecondaryStorage.java deleted file mode 100644 index dc01642767f..00000000000 --- a/core/src/com/cloud/storage/SecondaryStorage.java +++ /dev/null @@ -1,30 +0,0 @@ -// 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; - -public interface SecondaryStorage { - - String getBackupPath(); - - String getTemplatePath(); - - String getIsoPath(); - - void createTemplate(); - - void destroyTemplate(); -} diff --git a/core/src/com/cloud/storage/SecondaryStorageLayer.java b/core/src/com/cloud/storage/SecondaryStorageLayer.java deleted file mode 100644 index 539733d3531..00000000000 --- a/core/src/com/cloud/storage/SecondaryStorageLayer.java +++ /dev/null @@ -1,39 +0,0 @@ -// 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.net.URI; - -import com.cloud.storage.Storage.ImageFormat; -import com.cloud.utils.component.Adapter; - -public interface SecondaryStorageLayer extends Adapter { - - /** - * Mounts a template - * - * @param poolId the pool to mount it to. - * @param poolUuid the pool's uuid if it is needed. - * @param name unique name to the template. - * @param url url to access the template. - * @param format format of the template. - * @param accountId account id the template belongs to. - * @return a String that unique identifies the reference the template once it is mounted. - */ - String mountTemplate(long poolId, String poolUuid, String name, URI url, ImageFormat format, long accountId); - -} diff --git a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java index 7dafe4ac865..26aae48ba38 100755 --- a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java +++ b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java @@ -48,7 +48,7 @@ import com.cloud.agent.api.Command; import com.cloud.agent.api.DeleteSnapshotBackupCommand; import com.cloud.agent.api.DeleteSnapshotsDirCommand; import com.cloud.agent.api.DownloadSnapshotFromS3Command; -import com.cloud.agent.api.downloadSnapshotFromSwiftCommand; +import com.cloud.agent.api.DownloadSnapshotFromSwiftCommand; import com.cloud.agent.api.to.S3TO; import com.cloud.agent.api.to.SwiftTO; import com.cloud.alert.AlertManager; @@ -384,7 +384,7 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager, String parent = null; try { for (String backupUuid : BackupUuids) { - downloadSnapshotFromSwiftCommand cmd = new downloadSnapshotFromSwiftCommand(swift, secondaryStoragePoolUrl, dcId, accountId, volumeId, parent, backupUuid, _backupsnapshotwait); + DownloadSnapshotFromSwiftCommand cmd = new DownloadSnapshotFromSwiftCommand(swift, secondaryStoragePoolUrl, dcId, accountId, volumeId, parent, backupUuid, _backupsnapshotwait); Answer answer = _agentMgr.sendToSSVM(dcId, cmd); if ((answer == null) || !answer.getResult()) { throw new CloudRuntimeException("downloadSnapshotsFromSwift failed "); diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java index 8b5ee3aac1b..a8729e1490a 100755 --- a/server/src/com/cloud/template/TemplateManagerImpl.java +++ b/server/src/com/cloud/template/TemplateManagerImpl.java @@ -75,8 +75,8 @@ import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; import com.cloud.agent.api.AttachIsoCommand; import com.cloud.agent.api.ComputeChecksumCommand; -import com.cloud.agent.api.downloadTemplateFromSwiftToSecondaryStorageCommand; -import com.cloud.agent.api.uploadTemplateToSwiftFromSecondaryStorageCommand; +import com.cloud.agent.api.DownloadTemplateFromSwiftToSecondaryStorageCommand; +import com.cloud.agent.api.UploadTemplateToSwiftFromSecondaryStorageCommand; import com.cloud.agent.api.storage.DestroyCommand; import com.cloud.agent.api.storage.PrimaryStorageDownloadAnswer; import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand; @@ -579,7 +579,7 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager, return errMsg; } - downloadTemplateFromSwiftToSecondaryStorageCommand cmd = new downloadTemplateFromSwiftToSecondaryStorageCommand(swift, secHost.getName(), dcId, template.getAccountId(), templateId, + DownloadTemplateFromSwiftToSecondaryStorageCommand cmd = new DownloadTemplateFromSwiftToSecondaryStorageCommand(swift, secHost.getName(), dcId, template.getAccountId(), templateId, tmpltSwift.getPath(), _primaryStorageDownloadWait); try { Answer answer = _agentMgr.sendToSSVM(dcId, cmd); @@ -628,7 +628,7 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager, return errMsg; } - uploadTemplateToSwiftFromSecondaryStorageCommand cmd = new uploadTemplateToSwiftFromSecondaryStorageCommand(swift, secHost.getName(), secHost.getDataCenterId(), template.getAccountId(), + UploadTemplateToSwiftFromSecondaryStorageCommand cmd = new UploadTemplateToSwiftFromSecondaryStorageCommand(swift, secHost.getName(), secHost.getDataCenterId(), template.getAccountId(), templateId, _primaryStorageDownloadWait); Answer answer = null; try { diff --git a/services/secondary-storage/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java b/services/secondary-storage/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java index 638d5cad99d..e7fa5b2f1bc 100755 --- a/services/secondary-storage/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java +++ b/services/secondary-storage/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java @@ -80,9 +80,9 @@ import com.cloud.agent.api.SecStorageVMSetupCommand; import com.cloud.agent.api.StartupCommand; import com.cloud.agent.api.StartupSecondaryStorageCommand; import com.cloud.agent.api.UploadTemplateToS3FromSecondaryStorageCommand; -import com.cloud.agent.api.downloadSnapshotFromSwiftCommand; -import com.cloud.agent.api.downloadTemplateFromSwiftToSecondaryStorageCommand; -import com.cloud.agent.api.uploadTemplateToSwiftFromSecondaryStorageCommand; +import com.cloud.agent.api.DownloadSnapshotFromSwiftCommand; +import com.cloud.agent.api.DownloadTemplateFromSwiftToSecondaryStorageCommand; +import com.cloud.agent.api.UploadTemplateToSwiftFromSecondaryStorageCommand; import com.cloud.agent.api.storage.CreateEntityDownloadURLCommand; import com.cloud.agent.api.storage.DeleteEntityDownloadURLCommand; import com.cloud.agent.api.storage.DeleteTemplateCommand; @@ -190,20 +190,20 @@ SecondaryStorageResource { return execute((ListTemplateCommand)cmd); } else if (cmd instanceof ListVolumeCommand){ return execute((ListVolumeCommand)cmd); - }else if (cmd instanceof downloadSnapshotFromSwiftCommand){ - return execute((downloadSnapshotFromSwiftCommand)cmd); + }else if (cmd instanceof DownloadSnapshotFromSwiftCommand){ + return execute((DownloadSnapshotFromSwiftCommand)cmd); } else if (cmd instanceof DownloadSnapshotFromS3Command) { return execute((DownloadSnapshotFromS3Command) cmd); } else if (cmd instanceof DeleteSnapshotBackupCommand){ return execute((DeleteSnapshotBackupCommand)cmd); } else if (cmd instanceof DeleteSnapshotsDirCommand){ return execute((DeleteSnapshotsDirCommand)cmd); - } else if (cmd instanceof downloadTemplateFromSwiftToSecondaryStorageCommand) { - return execute((downloadTemplateFromSwiftToSecondaryStorageCommand) cmd); + } else if (cmd instanceof DownloadTemplateFromSwiftToSecondaryStorageCommand) { + return execute((DownloadTemplateFromSwiftToSecondaryStorageCommand) cmd); } else if (cmd instanceof DownloadTemplateFromS3ToSecondaryStorageCommand) { return execute((DownloadTemplateFromS3ToSecondaryStorageCommand) cmd); - } else if (cmd instanceof uploadTemplateToSwiftFromSecondaryStorageCommand) { - return execute((uploadTemplateToSwiftFromSecondaryStorageCommand) cmd); + } else if (cmd instanceof UploadTemplateToSwiftFromSecondaryStorageCommand) { + return execute((UploadTemplateToSwiftFromSecondaryStorageCommand) cmd); } else if (cmd instanceof UploadTemplateToS3FromSecondaryStorageCommand) { return execute((UploadTemplateToS3FromSecondaryStorageCommand) cmd); } else if (cmd instanceof DeleteObjectFromSwiftCommand) { @@ -281,7 +281,7 @@ SecondaryStorageResource { } - private Answer execute(downloadTemplateFromSwiftToSecondaryStorageCommand cmd) { + private Answer execute(DownloadTemplateFromSwiftToSecondaryStorageCommand cmd) { SwiftTO swift = cmd.getSwift(); String secondaryStorageUrl = cmd.getSecondaryStorageUrl(); Long accountId = cmd.getAccountId(); @@ -324,7 +324,7 @@ SecondaryStorageResource { } } - private Answer execute(uploadTemplateToSwiftFromSecondaryStorageCommand cmd) { + private Answer execute(UploadTemplateToSwiftFromSecondaryStorageCommand cmd) { SwiftTO swift = cmd.getSwift(); String secondaryStorageUrl = cmd.getSecondaryStorageUrl(); Long accountId = cmd.getAccountId(); @@ -769,7 +769,7 @@ SecondaryStorageResource { SNAPSHOT_ROOT_DIR, accountId, volumeId); } - public Answer execute(downloadSnapshotFromSwiftCommand cmd){ + public Answer execute(DownloadSnapshotFromSwiftCommand cmd){ SwiftTO swift = cmd.getSwift(); String secondaryStorageUrl = cmd.getSecondaryStorageUrl(); Long accountId = cmd.getAccountId(); From 572e71e57d7f5f3cef9c20e55b79773cca013e00 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Thu, 2 May 2013 06:50:38 -0700 Subject: [PATCH 28/66] Moved most of the VOs and DAOs from server package into engine-schema as well --- .../com/cloud/info/ConsoleProxyLoadInfo.java | 0 .../com/cloud/info/RunningHostCountInfo.java | 0 .../com/cloud/network/UserIpv6Address.java | 0 .../src/com/cloud/vm/ConsoleProxy.java | 0 .../src/com/cloud/vm/SecondaryStorageVm.java | 0 {core => api}/src/com/cloud/vm/SystemVm.java | 0 .../src/com/cloud/vm/VirtualMachineName.java | 0 .../src/com/cloud/vm/VmDetailConstants.java | 0 core/src/com/cloud/vm/ConsoleProxyVO.java | 151 --------- .../src/com/cloud/alert/dao/AlertDao.java | 0 .../src/com/cloud/alert/dao/AlertDaoImpl.java | 0 .../com/cloud/capacity/dao/CapacityDao.java | 0 .../cloud/capacity/dao/CapacityDaoImpl.java | 1 - .../cloud/certificate/dao/CertificateDao.java | 0 .../certificate/dao/CertificateDaoImpl.java | 0 .../ClusterInvalidSessionException.java | 0 .../cluster/ManagementServerHostPeerVO.java | 0 .../cloud/cluster/ManagementServerHostVO.java | 0 .../cluster/agentlb/HostTransferMapVO.java | 0 .../agentlb/dao/HostTransferMapDao.java | 0 .../agentlb/dao/HostTransferMapDaoImpl.java | 0 .../cluster/dao/ManagementServerHostDao.java | 0 .../dao/ManagementServerHostDaoImpl.java | 0 .../dao/ManagementServerHostPeerDao.java | 0 .../dao/ManagementServerHostPeerDaoImpl.java | 0 .../configuration/dao/ConfigurationDao.java | 0 .../dao/ConfigurationDaoImpl.java | 0 .../configuration/dao/ResourceCountDao.java | 0 .../dao/ResourceCountDaoImpl.java | 0 .../configuration/dao/ResourceLimitDao.java | 0 .../dao/ResourceLimitDaoImpl.java | 0 .../src/com/cloud/dc/AccountVlanMapVO.java | 0 .../src/com/cloud/dc/ClusterDetailsDao.java | 0 .../com/cloud/dc/ClusterDetailsDaoImpl.java | 0 .../src/com/cloud/dc/ClusterDetailsVO.java | 0 .../schema}/src/com/cloud/dc/ClusterVO.java | 0 .../src/com/cloud/dc/ClusterVSMMapVO.java | 0 .../com/cloud/dc/DataCenterIpAddressVO.java | 0 .../dc/DataCenterLinkLocalIpAddressVO.java | 0 .../src/com/cloud/dc/DataCenterVO.java | 0 .../src/com/cloud/dc/DataCenterVnetVO.java | 0 .../schema}/src/com/cloud/dc/DcDetailVO.java | 0 .../schema}/src/com/cloud/dc/HostPodVO.java | 0 .../schema}/src/com/cloud/dc/PodCluster.java | 0 .../src/com/cloud/dc/PodVlanMapVO.java | 0 .../schema}/src/com/cloud/dc/PodVlanVO.java | 0 .../cloud/dc/StorageNetworkIpAddressVO.java | 0 .../com/cloud/dc/StorageNetworkIpRangeVO.java | 0 .../schema}/src/com/cloud/dc/VlanVO.java | 0 .../com/cloud/dc/dao/AccountVlanMapDao.java | 0 .../cloud/dc/dao/AccountVlanMapDaoImpl.java | 0 .../src/com/cloud/dc/dao/ClusterDao.java | 0 .../src/com/cloud/dc/dao/ClusterDaoImpl.java | 0 .../com/cloud/dc/dao/ClusterVSMMapDao.java | 0 .../cloud/dc/dao/ClusterVSMMapDaoImpl.java | 0 .../src/com/cloud/dc/dao/DataCenterDao.java | 0 .../com/cloud/dc/dao/DataCenterDaoImpl.java | 0 .../cloud/dc/dao/DataCenterIpAddressDao.java | 0 .../dc/dao/DataCenterIpAddressDaoImpl.java | 0 .../dao/DataCenterLinkLocalIpAddressDao.java | 0 .../DataCenterLinkLocalIpAddressDaoImpl.java | 0 .../com/cloud/dc/dao/DataCenterVnetDao.java | 0 .../cloud/dc/dao/DataCenterVnetDaoImpl.java | 0 .../src/com/cloud/dc/dao/DcDetailsDao.java | 0 .../com/cloud/dc/dao/DcDetailsDaoImpl.java | 0 .../src/com/cloud/dc/dao/HostPodDao.java | 0 .../src/com/cloud/dc/dao/HostPodDaoImpl.java | 0 .../src/com/cloud/dc/dao/PodVlanDao.java | 0 .../src/com/cloud/dc/dao/PodVlanDaoImpl.java | 0 .../src/com/cloud/dc/dao/PodVlanMapDao.java | 0 .../com/cloud/dc/dao/PodVlanMapDaoImpl.java | 0 .../dc/dao/StorageNetworkIpAddressDao.java | 0 .../dao/StorageNetworkIpAddressDaoImpl.java | 0 .../dc/dao/StorageNetworkIpRangeDao.java | 0 .../dc/dao/StorageNetworkIpRangeDaoImpl.java | 0 .../schema}/src/com/cloud/dc/dao/VlanDao.java | 0 .../src/com/cloud/dc/dao/VlanDaoImpl.java | 0 .../src/com/cloud/domain/DomainVO.java | 0 .../src/com/cloud/domain/dao/DomainDao.java | 0 .../com/cloud/domain/dao/DomainDaoImpl.java | 0 .../src/com/cloud/host/dao/HostDao.java | 0 .../src/com/cloud/host/dao/HostDaoImpl.java | 0 .../com/cloud/host/dao/HostDetailsDao.java | 0 .../cloud/host/dao/HostDetailsDaoImpl.java | 0 .../src/com/cloud/host/dao/HostTagsDao.java | 0 .../com/cloud/host/dao/HostTagsDaoImpl.java | 0 .../dao/HypervisorCapabilitiesDao.java | 0 .../dao/HypervisorCapabilitiesDaoImpl.java | 0 .../src/com/cloud/keystore/KeystoreDao.java | 0 .../com/cloud/keystore/KeystoreDaoImpl.java | 0 .../src/com/cloud/keystore/KeystoreVO.java | 0 .../cloud/migration/DiskOffering20Dao.java | 0 .../migration/DiskOffering20DaoImpl.java | 0 .../com/cloud/migration/DiskOffering20VO.java | 0 .../cloud/migration/DiskOffering21Dao.java | 0 .../migration/DiskOffering21DaoImpl.java | 0 .../com/cloud/migration/DiskOffering21VO.java | 0 .../cloud/migration/ServiceOffering20Dao.java | 0 .../migration/ServiceOffering20DaoImpl.java | 0 .../cloud/migration/ServiceOffering20VO.java | 0 .../cloud/migration/ServiceOffering21Dao.java | 0 .../migration/ServiceOffering21DaoImpl.java | 0 .../cloud/migration/ServiceOffering21VO.java | 0 .../cloud/network/LBHealthCheckPolicyVO.java | 0 .../com/cloud/network/UserIpv6AddressVO.java | 0 .../as/AutoScalePolicyConditionMapVO.java | 0 .../cloud/network/as/AutoScalePolicyVO.java | 0 .../as/AutoScaleVmGroupPolicyMapVO.java | 0 .../cloud/network/as/AutoScaleVmGroupVO.java | 0 .../network/as/AutoScaleVmProfileVO.java | 0 .../src/com/cloud/network/as/ConditionVO.java | 0 .../src/com/cloud/network/as/CounterVO.java | 0 .../dao/AutoScalePolicyConditionMapDao.java | 0 .../AutoScalePolicyConditionMapDaoImpl.java | 0 .../network/as/dao/AutoScalePolicyDao.java | 0 .../as/dao/AutoScalePolicyDaoImpl.java | 0 .../network/as/dao/AutoScaleVmGroupDao.java | 0 .../as/dao/AutoScaleVmGroupDaoImpl.java | 0 .../as/dao/AutoScaleVmGroupPolicyMapDao.java | 0 .../dao/AutoScaleVmGroupPolicyMapDaoImpl.java | 0 .../network/as/dao/AutoScaleVmProfileDao.java | 0 .../as/dao/AutoScaleVmProfileDaoImpl.java | 0 .../cloud/network/as/dao/ConditionDao.java | 0 .../network/as/dao/ConditionDaoImpl.java | 0 .../com/cloud/network/as/dao/CounterDao.java | 0 .../cloud/network/as/dao/CounterDaoImpl.java | 0 .../dao/ExternalFirewallDeviceDao.java | 0 .../dao/ExternalFirewallDeviceDaoImpl.java | 0 .../network/dao/ExternalFirewallDeviceVO.java | 0 .../dao/ExternalLoadBalancerDeviceDao.java | 0 .../ExternalLoadBalancerDeviceDaoImpl.java | 0 .../dao/ExternalLoadBalancerDeviceVO.java | 0 .../network/dao/FirewallRulesCidrsDao.java | 0 .../dao/FirewallRulesCidrsDaoImpl.java | 0 .../network/dao/FirewallRulesCidrsVO.java | 0 .../cloud/network/dao/FirewallRulesDao.java | 0 .../network/dao/FirewallRulesDaoImpl.java | 0 .../com/cloud/network/dao/IPAddressDao.java | 0 .../cloud/network/dao/IPAddressDaoImpl.java | 0 .../com/cloud/network/dao/IPAddressVO.java | 0 .../dao/InlineLoadBalancerNicMapDao.java | 0 .../dao/InlineLoadBalancerNicMapDaoImpl.java | 0 .../dao/InlineLoadBalancerNicMapVO.java | 0 .../network/dao/LBHealthCheckPolicyDao.java | 0 .../dao/LBHealthCheckPolicyDaoImpl.java | 0 .../network/dao/LBStickinessPolicyDao.java | 0 .../dao/LBStickinessPolicyDaoImpl.java | 0 .../network/dao/LBStickinessPolicyVO.java | 0 .../cloud/network/dao/LoadBalancerDao.java | 0 .../network/dao/LoadBalancerDaoImpl.java | 0 .../network/dao/LoadBalancerVMMapDao.java | 0 .../network/dao/LoadBalancerVMMapDaoImpl.java | 0 .../network/dao/LoadBalancerVMMapVO.java | 0 .../com/cloud/network/dao/LoadBalancerVO.java | 0 .../cloud/network/dao/NetworkAccountDao.java | 0 .../network/dao/NetworkAccountDaoImpl.java | 0 .../cloud/network/dao/NetworkAccountVO.java | 0 .../src/com/cloud/network/dao/NetworkDao.java | 0 .../com/cloud/network/dao/NetworkDaoImpl.java | 0 .../cloud/network/dao/NetworkDomainDao.java | 0 .../network/dao/NetworkDomainDaoImpl.java | 0 .../cloud/network/dao/NetworkDomainVO.java | 0 .../dao/NetworkExternalFirewallDao.java | 0 .../dao/NetworkExternalFirewallDaoImpl.java | 0 .../dao/NetworkExternalFirewallVO.java | 0 .../dao/NetworkExternalLoadBalancerDao.java | 0 .../NetworkExternalLoadBalancerDaoImpl.java | 0 .../dao/NetworkExternalLoadBalancerVO.java | 0 .../com/cloud/network/dao/NetworkOpDao.java | 0 .../cloud/network/dao/NetworkOpDaoImpl.java | 0 .../com/cloud/network/dao/NetworkOpVO.java | 0 .../network/dao/NetworkRuleConfigDao.java | 0 .../network/dao/NetworkRuleConfigDaoImpl.java | 0 .../network/dao/NetworkRuleConfigVO.java | 0 .../network/dao/NetworkServiceMapDao.java | 0 .../network/dao/NetworkServiceMapDaoImpl.java | 0 .../network/dao/NetworkServiceMapVO.java | 0 .../src/com/cloud/network/dao/NetworkVO.java | 0 .../cloud/network/dao/PhysicalNetworkDao.java | 0 .../network/dao/PhysicalNetworkDaoImpl.java | 0 ...PhysicalNetworkIsolationMethodDaoImpl.java | 0 .../dao/PhysicalNetworkIsolationMethodVO.java | 0 .../PhysicalNetworkServiceProviderDao.java | 0 ...PhysicalNetworkServiceProviderDaoImpl.java | 0 .../dao/PhysicalNetworkServiceProviderVO.java | 0 .../dao/PhysicalNetworkTagDaoImpl.java | 0 .../network/dao/PhysicalNetworkTagVO.java | 0 .../dao/PhysicalNetworkTrafficTypeDao.java | 0 .../PhysicalNetworkTrafficTypeDaoImpl.java | 0 .../dao/PhysicalNetworkTrafficTypeVO.java | 0 .../cloud/network/dao/PhysicalNetworkVO.java | 0 .../com/cloud/network/dao/PortProfileDao.java | 0 .../cloud/network/dao/PortProfileDaoImpl.java | 0 .../com/cloud/network/dao/PortProfileVO.java | 0 .../cloud/network/dao/RemoteAccessVpnDao.java | 0 .../network/dao/RemoteAccessVpnDaoImpl.java | 0 .../cloud/network/dao/RemoteAccessVpnVO.java | 0 .../cloud/network/dao/RouterNetworkDao.java | 0 .../network/dao/RouterNetworkDaoImpl.java | 0 .../cloud/network/dao/RouterNetworkVO.java | 0 .../dao/Site2SiteCustomerGatewayDao.java | 0 .../dao/Site2SiteCustomerGatewayDaoImpl.java | 0 .../dao/Site2SiteCustomerGatewayVO.java | 0 .../dao/Site2SiteVpnConnectionDao.java | 0 .../dao/Site2SiteVpnConnectionDaoImpl.java | 0 .../network/dao/Site2SiteVpnConnectionVO.java | 0 .../network/dao/Site2SiteVpnGatewayDao.java | 0 .../dao/Site2SiteVpnGatewayDaoImpl.java | 0 .../network/dao/Site2SiteVpnGatewayVO.java | 0 .../cloud/network/dao/UserIpv6AddressDao.java | 0 .../network/dao/UserIpv6AddressDaoImpl.java | 0 .../network/dao/VirtualRouterProviderDao.java | 0 .../dao/VirtualRouterProviderDaoImpl.java | 0 .../src/com/cloud/network/dao/VpnUserDao.java | 0 .../com/cloud/network/dao/VpnUserDaoImpl.java | 0 .../element/VirtualRouterProviderVO.java | 0 .../cloud/network/rules/FirewallRuleVO.java | 0 .../network/rules/PortForwardingRuleVO.java | 0 .../rules/dao/PortForwardingRulesDao.java | 0 .../rules/dao/PortForwardingRulesDaoImpl.java | 0 .../security/dao/SecurityGroupDao.java | 0 .../security/dao/SecurityGroupDaoImpl.java | 0 .../security/dao/SecurityGroupRuleDao.java | 0 .../dao/SecurityGroupRuleDaoImpl.java | 0 .../security/dao/SecurityGroupRulesDao.java | 0 .../dao/SecurityGroupRulesDaoImpl.java | 0 .../security/dao/SecurityGroupVMMapDao.java | 0 .../dao/SecurityGroupVMMapDaoImpl.java | 0 .../security/dao/SecurityGroupWorkDao.java | 0 .../dao/SecurityGroupWorkDaoImpl.java | 45 ++- .../network/security/dao/VmRulesetLogDao.java | 0 .../security/dao/VmRulesetLogDaoImpl.java | 0 .../com/cloud/network/vpc/PrivateIpVO.java | 0 .../com/cloud/network/vpc/StaticRouteVO.java | 0 .../com/cloud/network/vpc/VpcGatewayVO.java | 0 .../network/vpc/VpcOfferingServiceMapVO.java | 0 .../com/cloud/network/vpc/VpcOfferingVO.java | 0 .../cloud/network/vpc/VpcServiceMapVO.java | 0 .../src/com/cloud/network/vpc/VpcVO.java | 0 .../cloud/network/vpc/dao/PrivateIpDao.java | 0 .../network/vpc/dao/PrivateIpDaoImpl.java | 0 .../cloud/network/vpc/dao/StaticRouteDao.java | 0 .../network/vpc/dao/StaticRouteDaoImpl.java | 0 .../src/com/cloud/network/vpc/dao/VpcDao.java | 0 .../com/cloud/network/vpc/dao/VpcDaoImpl.java | 0 .../cloud/network/vpc/dao/VpcGatewayDao.java | 0 .../network/vpc/dao/VpcGatewayDaoImpl.java | 0 .../cloud/network/vpc/dao/VpcOfferingDao.java | 0 .../network/vpc/dao/VpcOfferingDaoImpl.java | 0 .../vpc/dao/VpcOfferingServiceMapDao.java | 0 .../vpc/dao/VpcOfferingServiceMapDaoImpl.java | 0 .../network/vpc/dao/VpcServiceMapDao.java | 0 .../network/vpc/dao/VpcServiceMapDaoImpl.java | 0 .../NetworkOfferingServiceMapVO.java | 0 .../cloud/offerings/NetworkOfferingVO.java | 0 .../offerings/dao/NetworkOfferingDao.java | 0 .../offerings/dao/NetworkOfferingDaoImpl.java | 0 .../dao/NetworkOfferingServiceMapDao.java | 0 .../dao/NetworkOfferingServiceMapDaoImpl.java | 0 .../com/cloud/projects/ProjectAccountVO.java | 0 .../cloud/projects/ProjectInvitationVO.java | 0 .../src/com/cloud/projects/ProjectVO.java | 0 .../cloud/projects/dao/ProjectAccountDao.java | 0 .../projects/dao/ProjectAccountDaoImpl.java | 0 .../com/cloud/projects/dao/ProjectDao.java | 0 .../cloud/projects/dao/ProjectDaoImpl.java | 0 .../projects/dao/ProjectInvitationDao.java | 0 .../dao/ProjectInvitationDaoImpl.java | 0 .../cloud/secstorage/CommandExecLogDao.java | 0 .../secstorage/CommandExecLogDaoImpl.java | 0 .../cloud/secstorage/CommandExecLogVO.java | 0 .../com/cloud/service/ServiceOfferingVO.java | 0 .../cloud/service/dao/ServiceOfferingDao.java | 0 .../service/dao/ServiceOfferingDaoImpl.java | 0 .../cloud/storage/dao/DiskOfferingDao.java | 0 .../storage/dao/DiskOfferingDaoImpl.java | 0 .../cloud/storage/dao/GuestOSCategoryDao.java | 0 .../storage/dao/GuestOSCategoryDaoImpl.java | 0 .../src/com/cloud/storage/dao/GuestOSDao.java | 0 .../com/cloud/storage/dao/GuestOSDaoImpl.java | 0 .../storage/dao/LaunchPermissionDao.java | 0 .../storage/dao/LaunchPermissionDaoImpl.java | 0 .../src/com/cloud/storage/dao/S3Dao.java | 0 .../src/com/cloud/storage/dao/S3DaoImpl.java | 0 .../com/cloud/storage/dao/SnapshotDao.java | 0 .../cloud/storage/dao/SnapshotDaoImpl.java | 0 .../cloud/storage/dao/SnapshotPolicyDao.java | 0 .../storage/dao/SnapshotPolicyDaoImpl.java | 0 .../storage/dao/SnapshotScheduleDao.java | 0 .../storage/dao/SnapshotScheduleDaoImpl.java | 0 .../dao/StoragePoolDetailsDaoImpl.java | 0 .../cloud/storage/dao/StoragePoolHostDao.java | 0 .../storage/dao/StoragePoolHostDaoImpl.java | 0 .../cloud/storage/dao/StoragePoolWorkDao.java | 0 .../storage/dao/StoragePoolWorkDaoImpl.java | 0 .../src/com/cloud/storage/dao/SwiftDao.java | 0 .../com/cloud/storage/dao/SwiftDaoImpl.java | 0 .../src/com/cloud/storage/dao/UploadDao.java | 0 .../com/cloud/storage/dao/UploadDaoImpl.java | 0 .../com/cloud/storage/dao/VMTemplateDao.java | 0 .../cloud/storage/dao/VMTemplateDaoImpl.java | 0 .../storage/dao/VMTemplateDetailsDao.java | 0 .../storage/dao/VMTemplateDetailsDaoImpl.java | 0 .../cloud/storage/dao/VMTemplateHostDao.java | 0 .../storage/dao/VMTemplateHostDaoImpl.java | 0 .../cloud/storage/dao/VMTemplatePoolDao.java | 0 .../storage/dao/VMTemplatePoolDaoImpl.java | 0 .../cloud/storage/dao/VMTemplateS3Dao.java | 0 .../storage/dao/VMTemplateS3DaoImpl.java | 0 .../cloud/storage/dao/VMTemplateSwiftDao.java | 0 .../storage/dao/VMTemplateSwiftDaoImpl.java | 0 .../cloud/storage/dao/VMTemplateZoneDao.java | 0 .../storage/dao/VMTemplateZoneDaoImpl.java | 0 .../src/com/cloud/storage/dao/VolumeDao.java | 0 .../com/cloud/storage/dao/VolumeDaoImpl.java | 0 .../com/cloud/storage/dao/VolumeHostDao.java | 0 .../cloud/storage/dao/VolumeHostDaoImpl.java | 0 .../src/com/cloud/tags/ResourceTagVO.java | 0 .../com/cloud/tags/dao/ResourceTagDao.java | 0 .../cloud/tags/dao/ResourceTagsDaoImpl.java | 0 .../com/cloud/upgrade/DatabaseCreator.java | 0 .../upgrade/DatabaseIntegrityChecker.java | 0 .../cloud/upgrade/DatabaseUpgradeChecker.java | 8 +- .../PremiumDatabaseUpgradeChecker.java | 0 .../src/com/cloud/upgrade/dao/DbUpgrade.java | 0 .../com/cloud/upgrade/dao/DbUpgradeUtils.java | 0 .../cloud/upgrade/dao/Upgrade217to218.java | 0 .../com/cloud/upgrade/dao/Upgrade218to22.java | 17 +- .../dao/Upgrade218to224DomainVlans.java | 0 .../upgrade/dao/Upgrade218to22Premium.java | 0 .../cloud/upgrade/dao/Upgrade2210to2211.java | 0 .../cloud/upgrade/dao/Upgrade2211to2212.java | 0 .../upgrade/dao/Upgrade2211to2212Premium.java | 0 .../cloud/upgrade/dao/Upgrade2212to2213.java | 0 .../cloud/upgrade/dao/Upgrade2213to2214.java | 48 +-- .../cloud/upgrade/dao/Upgrade2214to30.java | 0 .../cloud/upgrade/dao/Upgrade221to222.java | 0 .../upgrade/dao/Upgrade221to222Premium.java | 0 .../cloud/upgrade/dao/Upgrade222to224.java | 0 .../upgrade/dao/Upgrade222to224Premium.java | 0 .../cloud/upgrade/dao/Upgrade224to225.java | 0 .../cloud/upgrade/dao/Upgrade225to226.java | 0 .../cloud/upgrade/dao/Upgrade227to228.java | 0 .../upgrade/dao/Upgrade227to228Premium.java | 0 .../cloud/upgrade/dao/Upgrade228to229.java | 0 .../cloud/upgrade/dao/Upgrade229to2210.java | 0 .../cloud/upgrade/dao/Upgrade301to302.java | 0 .../com/cloud/upgrade/dao/Upgrade302to40.java | 0 .../com/cloud/upgrade/dao/Upgrade30to301.java | 0 .../com/cloud/upgrade/dao/Upgrade30xBase.java | 0 .../com/cloud/upgrade/dao/Upgrade40to41.java | 0 .../cloud/upgrade/dao/Upgrade410to420.java | 0 .../upgrade/dao/UpgradeSnapshot217to224.java | 0 .../upgrade/dao/UpgradeSnapshot223to224.java | 0 .../src/com/cloud/upgrade/dao/VersionDao.java | 0 .../com/cloud/upgrade/dao/VersionDaoImpl.java | 0 .../src/com/cloud/upgrade/dao/VersionVO.java | 0 .../usage/ExternalPublicIpStatisticsVO.java | 0 .../src/com/cloud/usage/UsageIPAddressVO.java | 0 .../src/com/cloud/usage/UsageJobVO.java | 0 .../usage/UsageLoadBalancerPolicyVO.java | 0 .../cloud/usage/UsageNetworkOfferingVO.java | 0 .../src/com/cloud/usage/UsageNetworkVO.java | 0 .../usage/UsagePortForwardingRuleVO.java | 0 .../com/cloud/usage/UsageSecurityGroupVO.java | 0 .../src/com/cloud/usage/UsageStorageVO.java | 0 .../com/cloud/usage/UsageVMInstanceVO.java | 0 .../schema}/src/com/cloud/usage/UsageVO.java | 0 .../src/com/cloud/usage/UsageVPNUserVO.java | 0 .../src/com/cloud/usage/UsageVolumeVO.java | 0 .../dao/ExternalPublicIpStatisticsDao.java | 0 .../ExternalPublicIpStatisticsDaoImpl.java | 0 .../src/com/cloud/usage/dao/UsageDao.java | 16 +- .../src/com/cloud/usage/dao/UsageDaoImpl.java | 23 +- .../cloud/usage/dao/UsageIPAddressDao.java | 0 .../usage/dao/UsageIPAddressDaoImpl.java | 0 .../src/com/cloud/usage/dao/UsageJobDao.java | 4 +- .../com/cloud/usage/dao/UsageJobDaoImpl.java | 6 +- .../usage/dao/UsageLoadBalancerPolicyDao.java | 0 .../dao/UsageLoadBalancerPolicyDaoImpl.java | 0 .../com/cloud/usage/dao/UsageNetworkDao.java | 0 .../cloud/usage/dao/UsageNetworkDaoImpl.java | 0 .../usage/dao/UsageNetworkOfferingDao.java | 0 .../dao/UsageNetworkOfferingDaoImpl.java | 0 .../usage/dao/UsagePortForwardingRuleDao.java | 0 .../dao/UsagePortForwardingRuleDaoImpl.java | 0 .../usage/dao/UsageSecurityGroupDao.java | 0 .../usage/dao/UsageSecurityGroupDaoImpl.java | 0 .../com/cloud/usage/dao/UsageStorageDao.java | 0 .../cloud/usage/dao/UsageStorageDaoImpl.java | 0 .../cloud/usage/dao/UsageVMInstanceDao.java | 0 .../usage/dao/UsageVMInstanceDaoImpl.java | 0 .../com/cloud/usage/dao/UsageVPNUserDao.java | 0 .../cloud/usage/dao/UsageVPNUserDaoImpl.java | 0 .../com/cloud/usage/dao/UsageVolumeDao.java | 0 .../cloud/usage/dao/UsageVolumeDaoImpl.java | 0 .../src/com/cloud/user/AccountDetailVO.java | 0 .../src/com/cloud/user/AccountDetailsDao.java | 0 .../com/cloud/user/AccountDetailsDaoImpl.java | 0 .../src/com/cloud/user/dao/AccountDao.java | 0 .../com/cloud/user/dao/AccountDaoImpl.java | 0 .../src/com/cloud/user/dao/SSHKeyPairDao.java | 0 .../com/cloud/user/dao/SSHKeyPairDaoImpl.java | 0 .../com/cloud/user/dao/UserAccountDao.java | 0 .../cloud/user/dao/UserAccountDaoImpl.java | 0 .../src/com/cloud/user/dao/UserDao.java | 0 .../src/com/cloud/user/dao/UserDaoImpl.java | 0 .../com/cloud/user/dao/UserStatisticsDao.java | 0 .../cloud/user/dao/UserStatisticsDaoImpl.java | 0 .../com/cloud/user/dao/UserStatsLogDao.java | 0 .../cloud/user/dao/UserStatsLogDaoImpl.java | 0 .../src/com/cloud/vm/ConsoleProxyVO.java | 287 ++++++++++++++++++ .../src/com/cloud/vm/DomainRouterVO.java | 0 .../com/cloud/vm/InstanceGroupVMMapVO.java | 0 .../src/com/cloud/vm/InstanceGroupVO.java | 0 .../schema}/src/com/cloud/vm/ItWorkDao.java | 0 .../src/com/cloud/vm/ItWorkDaoImpl.java | 0 .../schema}/src/com/cloud/vm/ItWorkVO.java | 0 .../schema}/src/com/cloud/vm/NicVO.java | 0 .../com/cloud/vm/SecondaryStorageVmVO.java | 0 .../com/cloud/vm/UserVmCloneSettingVO.java | 0 .../src/com/cloud/vm/UserVmDetailVO.java | 0 .../schema}/src/com/cloud/vm/UserVmVO.java | 0 .../src/com/cloud/vm/dao/ConsoleProxyDao.java | 0 .../com/cloud/vm/dao/ConsoleProxyDaoImpl.java | 0 .../src/com/cloud/vm/dao/DomainRouterDao.java | 0 .../com/cloud/vm/dao/DomainRouterDaoImpl.java | 0 .../com/cloud/vm/dao/InstanceGroupDao.java | 0 .../cloud/vm/dao/InstanceGroupDaoImpl.java | 0 .../cloud/vm/dao/InstanceGroupVMMapDao.java | 0 .../vm/dao/InstanceGroupVMMapDaoImpl.java | 0 .../schema}/src/com/cloud/vm/dao/NicDao.java | 0 .../src/com/cloud/vm/dao/NicDaoImpl.java | 0 .../com/cloud/vm/dao/NicSecondaryIpDao.java | 0 .../cloud/vm/dao/NicSecondaryIpDaoImpl.java | 0 .../com/cloud/vm/dao/NicSecondaryIpVO.java | 0 .../cloud/vm/dao/SecondaryStorageVmDao.java | 0 .../vm/dao/SecondaryStorageVmDaoImpl.java | 0 .../cloud/vm/dao/UserVmCloneSettingDao.java | 0 .../vm/dao/UserVmCloneSettingDaoImpl.java | 0 .../src/com/cloud/vm/dao/UserVmDao.java | 0 .../src/com/cloud/vm/dao/UserVmDaoImpl.java | 0 .../src/com/cloud/vm/dao/UserVmData.java | 0 .../com/cloud/vm/dao/UserVmDetailsDao.java | 0 .../cloud/vm/dao/UserVmDetailsDaoImpl.java | 0 .../src/com/cloud/vm/dao/VMInstanceDao.java | 0 .../com/cloud/vm/dao/VMInstanceDaoImpl.java | 0 .../cloud/vm/snapshot/dao/VMSnapshotDao.java | 0 .../vm/snapshot/dao/VMSnapshotDaoImpl.java | 0 .../affinity/AffinityGroupVMMapVO.java | 0 .../cloudstack/affinity/AffinityGroupVO.java | 0 .../affinity/dao/AffinityGroupDao.java | 0 .../affinity/dao/AffinityGroupDaoImpl.java | 0 .../affinity/dao/AffinityGroupVMMapDao.java | 0 .../dao/AffinityGroupVMMapDaoImpl.java | 0 .../cloudstack/region/RegionSyncVO.java | 0 .../apache/cloudstack/region/RegionVO.java | 0 .../cloudstack/region/dao/RegionDao.java | 0 .../cloudstack/region/dao/RegionDaoImpl.java | 0 .../gslb/GlobalLoadBalancerDaoImpl.java | 0 .../gslb/GlobalLoadBalancerLbRuleMapDao.java | 0 .../GlobalLoadBalancerLbRuleMapDaoImpl.java | 0 .../gslb/GlobalLoadBalancerLbRuleMapVO.java | 0 .../gslb/GlobalLoadBalancerRuleDao.java | 0 .../region/gslb/GlobalLoadBalancerRuleVO.java | 0 .../src/com/cloud/cluster/CheckPointVO.java | 121 -------- .../com/cloud/cluster/dao/StackMaidDao.java | 44 --- .../cloud/cluster/dao/StackMaidDaoImpl.java | 208 ------------- .../consoleproxy/ConsoleProxyManagerImpl.java | 194 +----------- .../src/com/cloud/maint/AgentUpgradeVO.java | 63 ---- .../src/com/cloud/maint/UpgradeManager.java | 47 --- .../com/cloud/maint/UpgradeManagerImpl.java | 189 ------------ .../com/cloud/maint/UpgradeManagerMBean.java | 23 -- .../src/com/cloud/maint/UpgradeMonitor.java | 34 --- .../com/cloud/maint/dao/AgentUpgradeDao.java | 23 -- .../cloud/maint/dao/AgentUpgradeDaoImpl.java | 29 -- .../migration/Db21to22MigrationUtil.java | 228 -------------- .../Db22beta4to22GAMigrationUtil.java | 128 -------- .../src/com/cloud/maint/Version.java | 0 479 files changed, 374 insertions(+), 1563 deletions(-) rename {core => api}/src/com/cloud/info/ConsoleProxyLoadInfo.java (100%) rename {core => api}/src/com/cloud/info/RunningHostCountInfo.java (100%) rename {server => api}/src/com/cloud/network/UserIpv6Address.java (100%) rename {core => api}/src/com/cloud/vm/ConsoleProxy.java (100%) rename {core => api}/src/com/cloud/vm/SecondaryStorageVm.java (100%) rename {core => api}/src/com/cloud/vm/SystemVm.java (100%) rename {core => api}/src/com/cloud/vm/VirtualMachineName.java (100%) rename {core => api}/src/com/cloud/vm/VmDetailConstants.java (100%) delete mode 100644 core/src/com/cloud/vm/ConsoleProxyVO.java rename {server => engine/schema}/src/com/cloud/alert/dao/AlertDao.java (100%) rename {server => engine/schema}/src/com/cloud/alert/dao/AlertDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/capacity/dao/CapacityDao.java (100%) rename {server => engine/schema}/src/com/cloud/capacity/dao/CapacityDaoImpl.java (99%) rename {server => engine/schema}/src/com/cloud/certificate/dao/CertificateDao.java (100%) rename {server => engine/schema}/src/com/cloud/certificate/dao/CertificateDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/cluster/ClusterInvalidSessionException.java (100%) rename {server => engine/schema}/src/com/cloud/cluster/ManagementServerHostPeerVO.java (100%) rename {server => engine/schema}/src/com/cloud/cluster/ManagementServerHostVO.java (100%) rename {server => engine/schema}/src/com/cloud/cluster/agentlb/HostTransferMapVO.java (100%) rename {server => engine/schema}/src/com/cloud/cluster/agentlb/dao/HostTransferMapDao.java (100%) rename {server => engine/schema}/src/com/cloud/cluster/agentlb/dao/HostTransferMapDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/cluster/dao/ManagementServerHostDao.java (100%) rename {server => engine/schema}/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/cluster/dao/ManagementServerHostPeerDao.java (100%) rename {server => engine/schema}/src/com/cloud/cluster/dao/ManagementServerHostPeerDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/configuration/dao/ConfigurationDao.java (100%) rename {server => engine/schema}/src/com/cloud/configuration/dao/ConfigurationDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/configuration/dao/ResourceCountDao.java (100%) rename {server => engine/schema}/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/configuration/dao/ResourceLimitDao.java (100%) rename {server => engine/schema}/src/com/cloud/configuration/dao/ResourceLimitDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/dc/AccountVlanMapVO.java (100%) rename {server => engine/schema}/src/com/cloud/dc/ClusterDetailsDao.java (100%) rename {server => engine/schema}/src/com/cloud/dc/ClusterDetailsDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/dc/ClusterDetailsVO.java (100%) rename {server => engine/schema}/src/com/cloud/dc/ClusterVO.java (100%) rename {server => engine/schema}/src/com/cloud/dc/ClusterVSMMapVO.java (100%) rename {server => engine/schema}/src/com/cloud/dc/DataCenterIpAddressVO.java (100%) rename {server => engine/schema}/src/com/cloud/dc/DataCenterLinkLocalIpAddressVO.java (100%) rename {server => engine/schema}/src/com/cloud/dc/DataCenterVO.java (100%) rename {server => engine/schema}/src/com/cloud/dc/DataCenterVnetVO.java (100%) rename {server => engine/schema}/src/com/cloud/dc/DcDetailVO.java (100%) rename {server => engine/schema}/src/com/cloud/dc/HostPodVO.java (100%) rename {server => engine/schema}/src/com/cloud/dc/PodCluster.java (100%) rename {server => engine/schema}/src/com/cloud/dc/PodVlanMapVO.java (100%) rename {server => engine/schema}/src/com/cloud/dc/PodVlanVO.java (100%) rename {server => engine/schema}/src/com/cloud/dc/StorageNetworkIpAddressVO.java (100%) rename {server => engine/schema}/src/com/cloud/dc/StorageNetworkIpRangeVO.java (100%) rename {server => engine/schema}/src/com/cloud/dc/VlanVO.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/AccountVlanMapDao.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/AccountVlanMapDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/ClusterDao.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/ClusterDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/ClusterVSMMapDao.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/ClusterVSMMapDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/DataCenterDao.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/DataCenterDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/DataCenterIpAddressDao.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDao.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/DataCenterVnetDao.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/DcDetailsDao.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/DcDetailsDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/HostPodDao.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/HostPodDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/PodVlanDao.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/PodVlanDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/PodVlanMapDao.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/PodVlanMapDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/StorageNetworkIpAddressDao.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/StorageNetworkIpAddressDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/StorageNetworkIpRangeDao.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/StorageNetworkIpRangeDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/VlanDao.java (100%) rename {server => engine/schema}/src/com/cloud/dc/dao/VlanDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/domain/DomainVO.java (100%) rename {server => engine/schema}/src/com/cloud/domain/dao/DomainDao.java (100%) rename {server => engine/schema}/src/com/cloud/domain/dao/DomainDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/host/dao/HostDao.java (100%) rename {server => engine/schema}/src/com/cloud/host/dao/HostDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/host/dao/HostDetailsDao.java (100%) rename {server => engine/schema}/src/com/cloud/host/dao/HostDetailsDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/host/dao/HostTagsDao.java (100%) rename {server => engine/schema}/src/com/cloud/host/dao/HostTagsDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/hypervisor/dao/HypervisorCapabilitiesDao.java (100%) rename {server => engine/schema}/src/com/cloud/hypervisor/dao/HypervisorCapabilitiesDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/keystore/KeystoreDao.java (100%) rename {server => engine/schema}/src/com/cloud/keystore/KeystoreDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/keystore/KeystoreVO.java (100%) rename {server => engine/schema}/src/com/cloud/migration/DiskOffering20Dao.java (100%) rename {server => engine/schema}/src/com/cloud/migration/DiskOffering20DaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/migration/DiskOffering20VO.java (100%) rename {server => engine/schema}/src/com/cloud/migration/DiskOffering21Dao.java (100%) rename {server => engine/schema}/src/com/cloud/migration/DiskOffering21DaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/migration/DiskOffering21VO.java (100%) rename {server => engine/schema}/src/com/cloud/migration/ServiceOffering20Dao.java (100%) rename {server => engine/schema}/src/com/cloud/migration/ServiceOffering20DaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/migration/ServiceOffering20VO.java (100%) rename {server => engine/schema}/src/com/cloud/migration/ServiceOffering21Dao.java (100%) rename {server => engine/schema}/src/com/cloud/migration/ServiceOffering21DaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/migration/ServiceOffering21VO.java (100%) rename {server => engine/schema}/src/com/cloud/network/LBHealthCheckPolicyVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/UserIpv6AddressVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/as/AutoScalePolicyConditionMapVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/as/AutoScalePolicyVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/as/AutoScaleVmGroupPolicyMapVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/as/AutoScaleVmGroupVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/as/AutoScaleVmProfileVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/as/ConditionVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/as/CounterVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/as/dao/AutoScalePolicyConditionMapDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/as/dao/AutoScalePolicyConditionMapDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/as/dao/AutoScalePolicyDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/as/dao/AutoScalePolicyDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/as/dao/AutoScaleVmGroupDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/as/dao/AutoScaleVmGroupDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/as/dao/AutoScaleVmGroupPolicyMapDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/as/dao/AutoScaleVmGroupPolicyMapDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/as/dao/AutoScaleVmProfileDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/as/dao/AutoScaleVmProfileDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/as/dao/ConditionDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/as/dao/ConditionDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/as/dao/CounterDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/as/dao/CounterDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/ExternalFirewallDeviceDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/ExternalFirewallDeviceDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/ExternalFirewallDeviceVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/ExternalLoadBalancerDeviceDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/ExternalLoadBalancerDeviceDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/ExternalLoadBalancerDeviceVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/FirewallRulesCidrsDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/FirewallRulesCidrsDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/FirewallRulesCidrsVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/FirewallRulesDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/FirewallRulesDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/IPAddressDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/IPAddressDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/IPAddressVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/InlineLoadBalancerNicMapDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/InlineLoadBalancerNicMapDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/InlineLoadBalancerNicMapVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/LBHealthCheckPolicyDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/LBHealthCheckPolicyDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/LBStickinessPolicyDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/LBStickinessPolicyDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/LBStickinessPolicyVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/LoadBalancerDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/LoadBalancerDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/LoadBalancerVMMapDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/LoadBalancerVMMapDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/LoadBalancerVMMapVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/LoadBalancerVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/NetworkAccountDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/NetworkAccountDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/NetworkAccountVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/NetworkDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/NetworkDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/NetworkDomainDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/NetworkDomainDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/NetworkDomainVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/NetworkExternalFirewallDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/NetworkExternalFirewallDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/NetworkExternalFirewallVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/NetworkExternalLoadBalancerDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/NetworkExternalLoadBalancerDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/NetworkExternalLoadBalancerVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/NetworkOpDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/NetworkOpDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/NetworkOpVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/NetworkRuleConfigDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/NetworkRuleConfigDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/NetworkRuleConfigVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/NetworkServiceMapDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/NetworkServiceMapDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/NetworkServiceMapVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/NetworkVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/PhysicalNetworkDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/PhysicalNetworkDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/PhysicalNetworkIsolationMethodDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/PhysicalNetworkIsolationMethodVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/PhysicalNetworkServiceProviderVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/PhysicalNetworkTagDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/PhysicalNetworkTagVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/PhysicalNetworkTrafficTypeDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/PhysicalNetworkTrafficTypeDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/PhysicalNetworkTrafficTypeVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/PhysicalNetworkVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/PortProfileDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/PortProfileDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/PortProfileVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/RemoteAccessVpnDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/RemoteAccessVpnDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/RemoteAccessVpnVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/RouterNetworkDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/RouterNetworkDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/RouterNetworkVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/Site2SiteCustomerGatewayDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/Site2SiteCustomerGatewayDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/Site2SiteCustomerGatewayVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/Site2SiteVpnConnectionDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/Site2SiteVpnConnectionDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/Site2SiteVpnConnectionVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/Site2SiteVpnGatewayDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/Site2SiteVpnGatewayDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/Site2SiteVpnGatewayVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/UserIpv6AddressDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/UserIpv6AddressDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/VirtualRouterProviderDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/VirtualRouterProviderDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/VpnUserDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/VpnUserDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/element/VirtualRouterProviderVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/rules/FirewallRuleVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/rules/PortForwardingRuleVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/rules/dao/PortForwardingRulesDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/rules/dao/PortForwardingRulesDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/security/dao/SecurityGroupDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/security/dao/SecurityGroupDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/security/dao/SecurityGroupRuleDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/security/dao/SecurityGroupRuleDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/security/dao/SecurityGroupRulesDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/security/dao/SecurityGroupRulesDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/security/dao/SecurityGroupVMMapDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/security/dao/SecurityGroupVMMapDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/security/dao/SecurityGroupWorkDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/security/dao/SecurityGroupWorkDaoImpl.java (93%) rename {server => engine/schema}/src/com/cloud/network/security/dao/VmRulesetLogDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/vpc/PrivateIpVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/vpc/StaticRouteVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/vpc/VpcGatewayVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/vpc/VpcOfferingServiceMapVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/vpc/VpcOfferingVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/vpc/VpcServiceMapVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/vpc/VpcVO.java (100%) rename {server => engine/schema}/src/com/cloud/network/vpc/dao/PrivateIpDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/vpc/dao/PrivateIpDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/vpc/dao/StaticRouteDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/vpc/dao/StaticRouteDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/vpc/dao/VpcDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/vpc/dao/VpcDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/vpc/dao/VpcGatewayDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/vpc/dao/VpcGatewayDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/vpc/dao/VpcOfferingDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/vpc/dao/VpcOfferingDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/vpc/dao/VpcOfferingServiceMapDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/vpc/dao/VpcOfferingServiceMapDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/vpc/dao/VpcServiceMapDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/vpc/dao/VpcServiceMapDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/offerings/NetworkOfferingServiceMapVO.java (100%) rename {server => engine/schema}/src/com/cloud/offerings/NetworkOfferingVO.java (100%) rename {server => engine/schema}/src/com/cloud/offerings/dao/NetworkOfferingDao.java (100%) rename {server => engine/schema}/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDao.java (100%) rename {server => engine/schema}/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/projects/ProjectAccountVO.java (100%) rename {server => engine/schema}/src/com/cloud/projects/ProjectInvitationVO.java (100%) rename {server => engine/schema}/src/com/cloud/projects/ProjectVO.java (100%) rename {server => engine/schema}/src/com/cloud/projects/dao/ProjectAccountDao.java (100%) rename {server => engine/schema}/src/com/cloud/projects/dao/ProjectAccountDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/projects/dao/ProjectDao.java (100%) rename {server => engine/schema}/src/com/cloud/projects/dao/ProjectDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/projects/dao/ProjectInvitationDao.java (100%) rename {server => engine/schema}/src/com/cloud/projects/dao/ProjectInvitationDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/secstorage/CommandExecLogDao.java (100%) rename {server => engine/schema}/src/com/cloud/secstorage/CommandExecLogDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/secstorage/CommandExecLogVO.java (100%) rename {server => engine/schema}/src/com/cloud/service/ServiceOfferingVO.java (100%) rename {server => engine/schema}/src/com/cloud/service/dao/ServiceOfferingDao.java (100%) rename {server => engine/schema}/src/com/cloud/service/dao/ServiceOfferingDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/DiskOfferingDao.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/DiskOfferingDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/GuestOSCategoryDao.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/GuestOSCategoryDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/GuestOSDao.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/GuestOSDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/LaunchPermissionDao.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/LaunchPermissionDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/S3Dao.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/S3DaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/SnapshotDao.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/SnapshotDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/SnapshotPolicyDao.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/SnapshotPolicyDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/SnapshotScheduleDao.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/SnapshotScheduleDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/StoragePoolHostDao.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/StoragePoolHostDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/StoragePoolWorkDao.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/StoragePoolWorkDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/SwiftDao.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/SwiftDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/UploadDao.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/UploadDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/VMTemplateDao.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/VMTemplateDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/VMTemplateDetailsDao.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/VMTemplateHostDao.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/VMTemplateHostDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/VMTemplatePoolDao.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/VMTemplatePoolDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/VMTemplateS3Dao.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/VMTemplateS3DaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/VMTemplateSwiftDao.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/VMTemplateSwiftDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/VMTemplateZoneDao.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/VMTemplateZoneDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/VolumeDao.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/VolumeDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/VolumeHostDao.java (100%) rename {server => engine/schema}/src/com/cloud/storage/dao/VolumeHostDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/tags/ResourceTagVO.java (100%) rename {server => engine/schema}/src/com/cloud/tags/dao/ResourceTagDao.java (100%) rename {server => engine/schema}/src/com/cloud/tags/dao/ResourceTagsDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/DatabaseCreator.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/DatabaseIntegrityChecker.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/DatabaseUpgradeChecker.java (98%) rename {server => engine/schema}/src/com/cloud/upgrade/PremiumDatabaseUpgradeChecker.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/DbUpgrade.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/DbUpgradeUtils.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/Upgrade217to218.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/Upgrade218to22.java (99%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/Upgrade218to224DomainVlans.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/Upgrade218to22Premium.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/Upgrade2210to2211.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/Upgrade2211to2212.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/Upgrade2211to2212Premium.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/Upgrade2212to2213.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/Upgrade2213to2214.java (96%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/Upgrade2214to30.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/Upgrade221to222.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/Upgrade221to222Premium.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/Upgrade222to224.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/Upgrade222to224Premium.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/Upgrade224to225.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/Upgrade225to226.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/Upgrade227to228.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/Upgrade227to228Premium.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/Upgrade228to229.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/Upgrade229to2210.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/Upgrade301to302.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/Upgrade302to40.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/Upgrade30to301.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/Upgrade30xBase.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/Upgrade40to41.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/Upgrade410to420.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/UpgradeSnapshot217to224.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/UpgradeSnapshot223to224.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/VersionDao.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/VersionDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/upgrade/dao/VersionVO.java (100%) rename {server => engine/schema}/src/com/cloud/usage/ExternalPublicIpStatisticsVO.java (100%) rename {server => engine/schema}/src/com/cloud/usage/UsageIPAddressVO.java (100%) rename {server => engine/schema}/src/com/cloud/usage/UsageJobVO.java (100%) rename {server => engine/schema}/src/com/cloud/usage/UsageLoadBalancerPolicyVO.java (100%) rename {server => engine/schema}/src/com/cloud/usage/UsageNetworkOfferingVO.java (100%) rename {server => engine/schema}/src/com/cloud/usage/UsageNetworkVO.java (100%) rename {server => engine/schema}/src/com/cloud/usage/UsagePortForwardingRuleVO.java (100%) rename {server => engine/schema}/src/com/cloud/usage/UsageSecurityGroupVO.java (100%) rename {server => engine/schema}/src/com/cloud/usage/UsageStorageVO.java (100%) rename {server => engine/schema}/src/com/cloud/usage/UsageVMInstanceVO.java (100%) rename {server => engine/schema}/src/com/cloud/usage/UsageVO.java (100%) rename {server => engine/schema}/src/com/cloud/usage/UsageVPNUserVO.java (100%) rename {server => engine/schema}/src/com/cloud/usage/UsageVolumeVO.java (100%) rename {server => engine/schema}/src/com/cloud/usage/dao/ExternalPublicIpStatisticsDao.java (100%) rename {server => engine/schema}/src/com/cloud/usage/dao/ExternalPublicIpStatisticsDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/usage/dao/UsageDao.java (70%) rename {server => engine/schema}/src/com/cloud/usage/dao/UsageDaoImpl.java (94%) rename {server => engine/schema}/src/com/cloud/usage/dao/UsageIPAddressDao.java (100%) rename {server => engine/schema}/src/com/cloud/usage/dao/UsageIPAddressDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/usage/dao/UsageJobDao.java (92%) rename {server => engine/schema}/src/com/cloud/usage/dao/UsageJobDaoImpl.java (97%) rename {server => engine/schema}/src/com/cloud/usage/dao/UsageLoadBalancerPolicyDao.java (100%) rename {server => engine/schema}/src/com/cloud/usage/dao/UsageLoadBalancerPolicyDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/usage/dao/UsageNetworkDao.java (100%) rename {server => engine/schema}/src/com/cloud/usage/dao/UsageNetworkDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/usage/dao/UsageNetworkOfferingDao.java (100%) rename {server => engine/schema}/src/com/cloud/usage/dao/UsageNetworkOfferingDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/usage/dao/UsagePortForwardingRuleDao.java (100%) rename {server => engine/schema}/src/com/cloud/usage/dao/UsagePortForwardingRuleDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/usage/dao/UsageSecurityGroupDao.java (100%) rename {server => engine/schema}/src/com/cloud/usage/dao/UsageSecurityGroupDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/usage/dao/UsageStorageDao.java (100%) rename {server => engine/schema}/src/com/cloud/usage/dao/UsageStorageDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/usage/dao/UsageVMInstanceDao.java (100%) rename {server => engine/schema}/src/com/cloud/usage/dao/UsageVMInstanceDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/usage/dao/UsageVPNUserDao.java (100%) rename {server => engine/schema}/src/com/cloud/usage/dao/UsageVPNUserDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/usage/dao/UsageVolumeDao.java (100%) rename {server => engine/schema}/src/com/cloud/usage/dao/UsageVolumeDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/user/AccountDetailVO.java (100%) rename {server => engine/schema}/src/com/cloud/user/AccountDetailsDao.java (100%) rename {server => engine/schema}/src/com/cloud/user/AccountDetailsDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/user/dao/AccountDao.java (100%) rename {server => engine/schema}/src/com/cloud/user/dao/AccountDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/user/dao/SSHKeyPairDao.java (100%) rename {server => engine/schema}/src/com/cloud/user/dao/SSHKeyPairDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/user/dao/UserAccountDao.java (100%) rename {server => engine/schema}/src/com/cloud/user/dao/UserAccountDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/user/dao/UserDao.java (100%) rename {server => engine/schema}/src/com/cloud/user/dao/UserDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/user/dao/UserStatisticsDao.java (100%) rename {server => engine/schema}/src/com/cloud/user/dao/UserStatisticsDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/user/dao/UserStatsLogDao.java (100%) rename {server => engine/schema}/src/com/cloud/user/dao/UserStatsLogDaoImpl.java (100%) create mode 100644 engine/schema/src/com/cloud/vm/ConsoleProxyVO.java rename {core => engine/schema}/src/com/cloud/vm/DomainRouterVO.java (100%) rename {core => engine/schema}/src/com/cloud/vm/InstanceGroupVMMapVO.java (100%) rename {core => engine/schema}/src/com/cloud/vm/InstanceGroupVO.java (100%) rename {server => engine/schema}/src/com/cloud/vm/ItWorkDao.java (100%) rename {server => engine/schema}/src/com/cloud/vm/ItWorkDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/vm/ItWorkVO.java (100%) rename {server => engine/schema}/src/com/cloud/vm/NicVO.java (100%) rename {core => engine/schema}/src/com/cloud/vm/SecondaryStorageVmVO.java (100%) rename {core => engine/schema}/src/com/cloud/vm/UserVmCloneSettingVO.java (100%) rename {core => engine/schema}/src/com/cloud/vm/UserVmDetailVO.java (100%) rename {core => engine/schema}/src/com/cloud/vm/UserVmVO.java (100%) rename {server => engine/schema}/src/com/cloud/vm/dao/ConsoleProxyDao.java (100%) rename {server => engine/schema}/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/vm/dao/DomainRouterDao.java (100%) rename {server => engine/schema}/src/com/cloud/vm/dao/DomainRouterDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/vm/dao/InstanceGroupDao.java (100%) rename {server => engine/schema}/src/com/cloud/vm/dao/InstanceGroupDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/vm/dao/InstanceGroupVMMapDao.java (100%) rename {server => engine/schema}/src/com/cloud/vm/dao/InstanceGroupVMMapDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/vm/dao/NicDao.java (100%) rename {server => engine/schema}/src/com/cloud/vm/dao/NicDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/vm/dao/NicSecondaryIpDao.java (100%) rename {server => engine/schema}/src/com/cloud/vm/dao/NicSecondaryIpDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/vm/dao/NicSecondaryIpVO.java (100%) rename {server => engine/schema}/src/com/cloud/vm/dao/SecondaryStorageVmDao.java (100%) rename {server => engine/schema}/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/vm/dao/UserVmCloneSettingDao.java (100%) rename {server => engine/schema}/src/com/cloud/vm/dao/UserVmCloneSettingDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/vm/dao/UserVmDao.java (100%) rename {server => engine/schema}/src/com/cloud/vm/dao/UserVmDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/vm/dao/UserVmData.java (100%) rename {server => engine/schema}/src/com/cloud/vm/dao/UserVmDetailsDao.java (100%) rename {server => engine/schema}/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/vm/dao/VMInstanceDao.java (100%) rename {server => engine/schema}/src/com/cloud/vm/dao/VMInstanceDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/vm/snapshot/dao/VMSnapshotDao.java (100%) rename {server => engine/schema}/src/com/cloud/vm/snapshot/dao/VMSnapshotDaoImpl.java (100%) rename {server => engine/schema}/src/org/apache/cloudstack/affinity/AffinityGroupVMMapVO.java (100%) rename {server => engine/schema}/src/org/apache/cloudstack/affinity/AffinityGroupVO.java (100%) rename {server => engine/schema}/src/org/apache/cloudstack/affinity/dao/AffinityGroupDao.java (100%) rename {server => engine/schema}/src/org/apache/cloudstack/affinity/dao/AffinityGroupDaoImpl.java (100%) rename {server => engine/schema}/src/org/apache/cloudstack/affinity/dao/AffinityGroupVMMapDao.java (100%) rename {server => engine/schema}/src/org/apache/cloudstack/affinity/dao/AffinityGroupVMMapDaoImpl.java (100%) rename {server => engine/schema}/src/org/apache/cloudstack/region/RegionSyncVO.java (100%) rename {server => engine/schema}/src/org/apache/cloudstack/region/RegionVO.java (100%) rename {server => engine/schema}/src/org/apache/cloudstack/region/dao/RegionDao.java (100%) rename {server => engine/schema}/src/org/apache/cloudstack/region/dao/RegionDaoImpl.java (100%) rename {server => engine/schema}/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerDaoImpl.java (100%) rename {server => engine/schema}/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerLbRuleMapDao.java (100%) rename {server => engine/schema}/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerLbRuleMapDaoImpl.java (100%) rename {server => engine/schema}/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerLbRuleMapVO.java (100%) rename {server => engine/schema}/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerRuleDao.java (100%) rename {server => engine/schema}/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerRuleVO.java (100%) delete mode 100644 server/src/com/cloud/cluster/CheckPointVO.java delete mode 100644 server/src/com/cloud/cluster/dao/StackMaidDao.java delete mode 100644 server/src/com/cloud/cluster/dao/StackMaidDaoImpl.java delete mode 100644 server/src/com/cloud/maint/AgentUpgradeVO.java delete mode 100644 server/src/com/cloud/maint/UpgradeManager.java delete mode 100644 server/src/com/cloud/maint/UpgradeManagerImpl.java delete mode 100644 server/src/com/cloud/maint/UpgradeManagerMBean.java delete mode 100644 server/src/com/cloud/maint/UpgradeMonitor.java delete mode 100644 server/src/com/cloud/maint/dao/AgentUpgradeDao.java delete mode 100644 server/src/com/cloud/maint/dao/AgentUpgradeDaoImpl.java delete mode 100755 server/src/com/cloud/migration/Db21to22MigrationUtil.java delete mode 100644 server/src/com/cloud/migration/Db22beta4to22GAMigrationUtil.java rename {server => utils}/src/com/cloud/maint/Version.java (100%) diff --git a/core/src/com/cloud/info/ConsoleProxyLoadInfo.java b/api/src/com/cloud/info/ConsoleProxyLoadInfo.java similarity index 100% rename from core/src/com/cloud/info/ConsoleProxyLoadInfo.java rename to api/src/com/cloud/info/ConsoleProxyLoadInfo.java diff --git a/core/src/com/cloud/info/RunningHostCountInfo.java b/api/src/com/cloud/info/RunningHostCountInfo.java similarity index 100% rename from core/src/com/cloud/info/RunningHostCountInfo.java rename to api/src/com/cloud/info/RunningHostCountInfo.java diff --git a/server/src/com/cloud/network/UserIpv6Address.java b/api/src/com/cloud/network/UserIpv6Address.java similarity index 100% rename from server/src/com/cloud/network/UserIpv6Address.java rename to api/src/com/cloud/network/UserIpv6Address.java diff --git a/core/src/com/cloud/vm/ConsoleProxy.java b/api/src/com/cloud/vm/ConsoleProxy.java similarity index 100% rename from core/src/com/cloud/vm/ConsoleProxy.java rename to api/src/com/cloud/vm/ConsoleProxy.java diff --git a/core/src/com/cloud/vm/SecondaryStorageVm.java b/api/src/com/cloud/vm/SecondaryStorageVm.java similarity index 100% rename from core/src/com/cloud/vm/SecondaryStorageVm.java rename to api/src/com/cloud/vm/SecondaryStorageVm.java diff --git a/core/src/com/cloud/vm/SystemVm.java b/api/src/com/cloud/vm/SystemVm.java similarity index 100% rename from core/src/com/cloud/vm/SystemVm.java rename to api/src/com/cloud/vm/SystemVm.java diff --git a/core/src/com/cloud/vm/VirtualMachineName.java b/api/src/com/cloud/vm/VirtualMachineName.java similarity index 100% rename from core/src/com/cloud/vm/VirtualMachineName.java rename to api/src/com/cloud/vm/VirtualMachineName.java diff --git a/core/src/com/cloud/vm/VmDetailConstants.java b/api/src/com/cloud/vm/VmDetailConstants.java similarity index 100% rename from core/src/com/cloud/vm/VmDetailConstants.java rename to api/src/com/cloud/vm/VmDetailConstants.java diff --git a/core/src/com/cloud/vm/ConsoleProxyVO.java b/core/src/com/cloud/vm/ConsoleProxyVO.java deleted file mode 100644 index c57b44f32f0..00000000000 --- a/core/src/com/cloud/vm/ConsoleProxyVO.java +++ /dev/null @@ -1,151 +0,0 @@ -// 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 java.util.Date; - -import javax.persistence.Column; -import javax.persistence.DiscriminatorValue; -import javax.persistence.Entity; -import javax.persistence.PrimaryKeyJoinColumn; -import javax.persistence.Table; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; -import javax.persistence.Transient; - -import com.cloud.hypervisor.Hypervisor.HypervisorType; - -/** - * ConsoleProxyVO domain object - */ - -@Entity -@Table(name = "console_proxy") -@PrimaryKeyJoinColumn(name = "id") -@DiscriminatorValue(value = "ConsoleProxy") -public class ConsoleProxyVO extends VMInstanceVO implements ConsoleProxy { - - @Column(name = "public_ip_address", nullable = false) - private String publicIpAddress; - - @Column(name = "public_mac_address", nullable = false) - private String publicMacAddress; - - @Column(name = "public_netmask", nullable = false) - private String publicNetmask; - - @Column(name = "active_session", updatable = true, nullable = false) - private int activeSession; - - @Temporal(TemporalType.TIMESTAMP) - @Column(name = "last_update", updatable = true, nullable = true) - private Date lastUpdateTime; - - @Column(name = "session_details", updatable = true, nullable = true) - private byte[] sessionDetails; - - @Transient - private boolean sslEnabled = false; - - @Transient - private int port; - - /** - * Correct constructor to use. - * - */ - public ConsoleProxyVO(long id, long serviceOfferingId, String name, long templateId, HypervisorType hypervisorType, long guestOSId, long dataCenterId, long domainId, long accountId, - int activeSession, boolean haEnabled) { - super(id, serviceOfferingId, name, name, Type.ConsoleProxy, templateId, hypervisorType, guestOSId, domainId, accountId, haEnabled); - this.activeSession = activeSession; - } - - protected ConsoleProxyVO() { - super(); - } - - public void setPublicIpAddress(String publicIpAddress) { - this.publicIpAddress = publicIpAddress; - } - - public void setPublicNetmask(String publicNetmask) { - this.publicNetmask = publicNetmask; - } - - public void setPublicMacAddress(String publicMacAddress) { - this.publicMacAddress = publicMacAddress; - } - - public void setActiveSession(int activeSession) { - this.activeSession = activeSession; - } - - public void setLastUpdateTime(Date time) { - this.lastUpdateTime = time; - } - - public void setSessionDetails(byte[] details) { - this.sessionDetails = details; - } - - @Override - public String getPublicIpAddress() { - return this.publicIpAddress; - } - - @Override - public String getPublicNetmask() { - return this.publicNetmask; - } - - @Override - public String getPublicMacAddress() { - return this.publicMacAddress; - } - - @Override - public int getActiveSession() { - return this.activeSession; - } - - @Override - public Date getLastUpdateTime() { - return this.lastUpdateTime; - } - - @Override - public byte[] getSessionDetails() { - return this.sessionDetails; - } - - public boolean isSslEnabled() { - return sslEnabled; - } - - public void setSslEnabled(boolean sslEnabled) { - this.sslEnabled = sslEnabled; - } - - public void setPort(int port) { - this.port = port; - } - - public int getPort() { - return port; - } - -} diff --git a/server/src/com/cloud/alert/dao/AlertDao.java b/engine/schema/src/com/cloud/alert/dao/AlertDao.java similarity index 100% rename from server/src/com/cloud/alert/dao/AlertDao.java rename to engine/schema/src/com/cloud/alert/dao/AlertDao.java diff --git a/server/src/com/cloud/alert/dao/AlertDaoImpl.java b/engine/schema/src/com/cloud/alert/dao/AlertDaoImpl.java similarity index 100% rename from server/src/com/cloud/alert/dao/AlertDaoImpl.java rename to engine/schema/src/com/cloud/alert/dao/AlertDaoImpl.java diff --git a/server/src/com/cloud/capacity/dao/CapacityDao.java b/engine/schema/src/com/cloud/capacity/dao/CapacityDao.java similarity index 100% rename from server/src/com/cloud/capacity/dao/CapacityDao.java rename to engine/schema/src/com/cloud/capacity/dao/CapacityDao.java diff --git a/server/src/com/cloud/capacity/dao/CapacityDaoImpl.java b/engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java similarity index 99% rename from server/src/com/cloud/capacity/dao/CapacityDaoImpl.java rename to engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java index ec5081a6edf..0b9ff1a5ece 100755 --- a/server/src/com/cloud/capacity/dao/CapacityDaoImpl.java +++ b/engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java @@ -27,7 +27,6 @@ import java.util.Map; import javax.ejb.Local; import javax.inject.Inject; -import com.cloud.configuration.Config; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; import org.apache.log4j.Logger; diff --git a/server/src/com/cloud/certificate/dao/CertificateDao.java b/engine/schema/src/com/cloud/certificate/dao/CertificateDao.java similarity index 100% rename from server/src/com/cloud/certificate/dao/CertificateDao.java rename to engine/schema/src/com/cloud/certificate/dao/CertificateDao.java diff --git a/server/src/com/cloud/certificate/dao/CertificateDaoImpl.java b/engine/schema/src/com/cloud/certificate/dao/CertificateDaoImpl.java similarity index 100% rename from server/src/com/cloud/certificate/dao/CertificateDaoImpl.java rename to engine/schema/src/com/cloud/certificate/dao/CertificateDaoImpl.java diff --git a/server/src/com/cloud/cluster/ClusterInvalidSessionException.java b/engine/schema/src/com/cloud/cluster/ClusterInvalidSessionException.java similarity index 100% rename from server/src/com/cloud/cluster/ClusterInvalidSessionException.java rename to engine/schema/src/com/cloud/cluster/ClusterInvalidSessionException.java diff --git a/server/src/com/cloud/cluster/ManagementServerHostPeerVO.java b/engine/schema/src/com/cloud/cluster/ManagementServerHostPeerVO.java similarity index 100% rename from server/src/com/cloud/cluster/ManagementServerHostPeerVO.java rename to engine/schema/src/com/cloud/cluster/ManagementServerHostPeerVO.java diff --git a/server/src/com/cloud/cluster/ManagementServerHostVO.java b/engine/schema/src/com/cloud/cluster/ManagementServerHostVO.java similarity index 100% rename from server/src/com/cloud/cluster/ManagementServerHostVO.java rename to engine/schema/src/com/cloud/cluster/ManagementServerHostVO.java diff --git a/server/src/com/cloud/cluster/agentlb/HostTransferMapVO.java b/engine/schema/src/com/cloud/cluster/agentlb/HostTransferMapVO.java similarity index 100% rename from server/src/com/cloud/cluster/agentlb/HostTransferMapVO.java rename to engine/schema/src/com/cloud/cluster/agentlb/HostTransferMapVO.java diff --git a/server/src/com/cloud/cluster/agentlb/dao/HostTransferMapDao.java b/engine/schema/src/com/cloud/cluster/agentlb/dao/HostTransferMapDao.java similarity index 100% rename from server/src/com/cloud/cluster/agentlb/dao/HostTransferMapDao.java rename to engine/schema/src/com/cloud/cluster/agentlb/dao/HostTransferMapDao.java diff --git a/server/src/com/cloud/cluster/agentlb/dao/HostTransferMapDaoImpl.java b/engine/schema/src/com/cloud/cluster/agentlb/dao/HostTransferMapDaoImpl.java similarity index 100% rename from server/src/com/cloud/cluster/agentlb/dao/HostTransferMapDaoImpl.java rename to engine/schema/src/com/cloud/cluster/agentlb/dao/HostTransferMapDaoImpl.java diff --git a/server/src/com/cloud/cluster/dao/ManagementServerHostDao.java b/engine/schema/src/com/cloud/cluster/dao/ManagementServerHostDao.java similarity index 100% rename from server/src/com/cloud/cluster/dao/ManagementServerHostDao.java rename to engine/schema/src/com/cloud/cluster/dao/ManagementServerHostDao.java diff --git a/server/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java b/engine/schema/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java similarity index 100% rename from server/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java rename to engine/schema/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java diff --git a/server/src/com/cloud/cluster/dao/ManagementServerHostPeerDao.java b/engine/schema/src/com/cloud/cluster/dao/ManagementServerHostPeerDao.java similarity index 100% rename from server/src/com/cloud/cluster/dao/ManagementServerHostPeerDao.java rename to engine/schema/src/com/cloud/cluster/dao/ManagementServerHostPeerDao.java diff --git a/server/src/com/cloud/cluster/dao/ManagementServerHostPeerDaoImpl.java b/engine/schema/src/com/cloud/cluster/dao/ManagementServerHostPeerDaoImpl.java similarity index 100% rename from server/src/com/cloud/cluster/dao/ManagementServerHostPeerDaoImpl.java rename to engine/schema/src/com/cloud/cluster/dao/ManagementServerHostPeerDaoImpl.java diff --git a/server/src/com/cloud/configuration/dao/ConfigurationDao.java b/engine/schema/src/com/cloud/configuration/dao/ConfigurationDao.java similarity index 100% rename from server/src/com/cloud/configuration/dao/ConfigurationDao.java rename to engine/schema/src/com/cloud/configuration/dao/ConfigurationDao.java diff --git a/server/src/com/cloud/configuration/dao/ConfigurationDaoImpl.java b/engine/schema/src/com/cloud/configuration/dao/ConfigurationDaoImpl.java similarity index 100% rename from server/src/com/cloud/configuration/dao/ConfigurationDaoImpl.java rename to engine/schema/src/com/cloud/configuration/dao/ConfigurationDaoImpl.java diff --git a/server/src/com/cloud/configuration/dao/ResourceCountDao.java b/engine/schema/src/com/cloud/configuration/dao/ResourceCountDao.java similarity index 100% rename from server/src/com/cloud/configuration/dao/ResourceCountDao.java rename to engine/schema/src/com/cloud/configuration/dao/ResourceCountDao.java diff --git a/server/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java b/engine/schema/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java similarity index 100% rename from server/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java rename to engine/schema/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java diff --git a/server/src/com/cloud/configuration/dao/ResourceLimitDao.java b/engine/schema/src/com/cloud/configuration/dao/ResourceLimitDao.java similarity index 100% rename from server/src/com/cloud/configuration/dao/ResourceLimitDao.java rename to engine/schema/src/com/cloud/configuration/dao/ResourceLimitDao.java diff --git a/server/src/com/cloud/configuration/dao/ResourceLimitDaoImpl.java b/engine/schema/src/com/cloud/configuration/dao/ResourceLimitDaoImpl.java similarity index 100% rename from server/src/com/cloud/configuration/dao/ResourceLimitDaoImpl.java rename to engine/schema/src/com/cloud/configuration/dao/ResourceLimitDaoImpl.java diff --git a/server/src/com/cloud/dc/AccountVlanMapVO.java b/engine/schema/src/com/cloud/dc/AccountVlanMapVO.java similarity index 100% rename from server/src/com/cloud/dc/AccountVlanMapVO.java rename to engine/schema/src/com/cloud/dc/AccountVlanMapVO.java diff --git a/server/src/com/cloud/dc/ClusterDetailsDao.java b/engine/schema/src/com/cloud/dc/ClusterDetailsDao.java similarity index 100% rename from server/src/com/cloud/dc/ClusterDetailsDao.java rename to engine/schema/src/com/cloud/dc/ClusterDetailsDao.java diff --git a/server/src/com/cloud/dc/ClusterDetailsDaoImpl.java b/engine/schema/src/com/cloud/dc/ClusterDetailsDaoImpl.java similarity index 100% rename from server/src/com/cloud/dc/ClusterDetailsDaoImpl.java rename to engine/schema/src/com/cloud/dc/ClusterDetailsDaoImpl.java diff --git a/server/src/com/cloud/dc/ClusterDetailsVO.java b/engine/schema/src/com/cloud/dc/ClusterDetailsVO.java similarity index 100% rename from server/src/com/cloud/dc/ClusterDetailsVO.java rename to engine/schema/src/com/cloud/dc/ClusterDetailsVO.java diff --git a/server/src/com/cloud/dc/ClusterVO.java b/engine/schema/src/com/cloud/dc/ClusterVO.java similarity index 100% rename from server/src/com/cloud/dc/ClusterVO.java rename to engine/schema/src/com/cloud/dc/ClusterVO.java diff --git a/server/src/com/cloud/dc/ClusterVSMMapVO.java b/engine/schema/src/com/cloud/dc/ClusterVSMMapVO.java similarity index 100% rename from server/src/com/cloud/dc/ClusterVSMMapVO.java rename to engine/schema/src/com/cloud/dc/ClusterVSMMapVO.java diff --git a/server/src/com/cloud/dc/DataCenterIpAddressVO.java b/engine/schema/src/com/cloud/dc/DataCenterIpAddressVO.java similarity index 100% rename from server/src/com/cloud/dc/DataCenterIpAddressVO.java rename to engine/schema/src/com/cloud/dc/DataCenterIpAddressVO.java diff --git a/server/src/com/cloud/dc/DataCenterLinkLocalIpAddressVO.java b/engine/schema/src/com/cloud/dc/DataCenterLinkLocalIpAddressVO.java similarity index 100% rename from server/src/com/cloud/dc/DataCenterLinkLocalIpAddressVO.java rename to engine/schema/src/com/cloud/dc/DataCenterLinkLocalIpAddressVO.java diff --git a/server/src/com/cloud/dc/DataCenterVO.java b/engine/schema/src/com/cloud/dc/DataCenterVO.java similarity index 100% rename from server/src/com/cloud/dc/DataCenterVO.java rename to engine/schema/src/com/cloud/dc/DataCenterVO.java diff --git a/server/src/com/cloud/dc/DataCenterVnetVO.java b/engine/schema/src/com/cloud/dc/DataCenterVnetVO.java similarity index 100% rename from server/src/com/cloud/dc/DataCenterVnetVO.java rename to engine/schema/src/com/cloud/dc/DataCenterVnetVO.java diff --git a/server/src/com/cloud/dc/DcDetailVO.java b/engine/schema/src/com/cloud/dc/DcDetailVO.java similarity index 100% rename from server/src/com/cloud/dc/DcDetailVO.java rename to engine/schema/src/com/cloud/dc/DcDetailVO.java diff --git a/server/src/com/cloud/dc/HostPodVO.java b/engine/schema/src/com/cloud/dc/HostPodVO.java similarity index 100% rename from server/src/com/cloud/dc/HostPodVO.java rename to engine/schema/src/com/cloud/dc/HostPodVO.java diff --git a/server/src/com/cloud/dc/PodCluster.java b/engine/schema/src/com/cloud/dc/PodCluster.java similarity index 100% rename from server/src/com/cloud/dc/PodCluster.java rename to engine/schema/src/com/cloud/dc/PodCluster.java diff --git a/server/src/com/cloud/dc/PodVlanMapVO.java b/engine/schema/src/com/cloud/dc/PodVlanMapVO.java similarity index 100% rename from server/src/com/cloud/dc/PodVlanMapVO.java rename to engine/schema/src/com/cloud/dc/PodVlanMapVO.java diff --git a/server/src/com/cloud/dc/PodVlanVO.java b/engine/schema/src/com/cloud/dc/PodVlanVO.java similarity index 100% rename from server/src/com/cloud/dc/PodVlanVO.java rename to engine/schema/src/com/cloud/dc/PodVlanVO.java diff --git a/server/src/com/cloud/dc/StorageNetworkIpAddressVO.java b/engine/schema/src/com/cloud/dc/StorageNetworkIpAddressVO.java similarity index 100% rename from server/src/com/cloud/dc/StorageNetworkIpAddressVO.java rename to engine/schema/src/com/cloud/dc/StorageNetworkIpAddressVO.java diff --git a/server/src/com/cloud/dc/StorageNetworkIpRangeVO.java b/engine/schema/src/com/cloud/dc/StorageNetworkIpRangeVO.java similarity index 100% rename from server/src/com/cloud/dc/StorageNetworkIpRangeVO.java rename to engine/schema/src/com/cloud/dc/StorageNetworkIpRangeVO.java diff --git a/server/src/com/cloud/dc/VlanVO.java b/engine/schema/src/com/cloud/dc/VlanVO.java similarity index 100% rename from server/src/com/cloud/dc/VlanVO.java rename to engine/schema/src/com/cloud/dc/VlanVO.java diff --git a/server/src/com/cloud/dc/dao/AccountVlanMapDao.java b/engine/schema/src/com/cloud/dc/dao/AccountVlanMapDao.java similarity index 100% rename from server/src/com/cloud/dc/dao/AccountVlanMapDao.java rename to engine/schema/src/com/cloud/dc/dao/AccountVlanMapDao.java diff --git a/server/src/com/cloud/dc/dao/AccountVlanMapDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/AccountVlanMapDaoImpl.java similarity index 100% rename from server/src/com/cloud/dc/dao/AccountVlanMapDaoImpl.java rename to engine/schema/src/com/cloud/dc/dao/AccountVlanMapDaoImpl.java diff --git a/server/src/com/cloud/dc/dao/ClusterDao.java b/engine/schema/src/com/cloud/dc/dao/ClusterDao.java similarity index 100% rename from server/src/com/cloud/dc/dao/ClusterDao.java rename to engine/schema/src/com/cloud/dc/dao/ClusterDao.java diff --git a/server/src/com/cloud/dc/dao/ClusterDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/ClusterDaoImpl.java similarity index 100% rename from server/src/com/cloud/dc/dao/ClusterDaoImpl.java rename to engine/schema/src/com/cloud/dc/dao/ClusterDaoImpl.java diff --git a/server/src/com/cloud/dc/dao/ClusterVSMMapDao.java b/engine/schema/src/com/cloud/dc/dao/ClusterVSMMapDao.java similarity index 100% rename from server/src/com/cloud/dc/dao/ClusterVSMMapDao.java rename to engine/schema/src/com/cloud/dc/dao/ClusterVSMMapDao.java diff --git a/server/src/com/cloud/dc/dao/ClusterVSMMapDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/ClusterVSMMapDaoImpl.java similarity index 100% rename from server/src/com/cloud/dc/dao/ClusterVSMMapDaoImpl.java rename to engine/schema/src/com/cloud/dc/dao/ClusterVSMMapDaoImpl.java diff --git a/server/src/com/cloud/dc/dao/DataCenterDao.java b/engine/schema/src/com/cloud/dc/dao/DataCenterDao.java similarity index 100% rename from server/src/com/cloud/dc/dao/DataCenterDao.java rename to engine/schema/src/com/cloud/dc/dao/DataCenterDao.java diff --git a/server/src/com/cloud/dc/dao/DataCenterDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java similarity index 100% rename from server/src/com/cloud/dc/dao/DataCenterDaoImpl.java rename to engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java diff --git a/server/src/com/cloud/dc/dao/DataCenterIpAddressDao.java b/engine/schema/src/com/cloud/dc/dao/DataCenterIpAddressDao.java similarity index 100% rename from server/src/com/cloud/dc/dao/DataCenterIpAddressDao.java rename to engine/schema/src/com/cloud/dc/dao/DataCenterIpAddressDao.java diff --git a/server/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java similarity index 100% rename from server/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java rename to engine/schema/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java diff --git a/server/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDao.java b/engine/schema/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDao.java similarity index 100% rename from server/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDao.java rename to engine/schema/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDao.java diff --git a/server/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDaoImpl.java similarity index 100% rename from server/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDaoImpl.java rename to engine/schema/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDaoImpl.java diff --git a/server/src/com/cloud/dc/dao/DataCenterVnetDao.java b/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDao.java similarity index 100% rename from server/src/com/cloud/dc/dao/DataCenterVnetDao.java rename to engine/schema/src/com/cloud/dc/dao/DataCenterVnetDao.java diff --git a/server/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java similarity index 100% rename from server/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java rename to engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java diff --git a/server/src/com/cloud/dc/dao/DcDetailsDao.java b/engine/schema/src/com/cloud/dc/dao/DcDetailsDao.java similarity index 100% rename from server/src/com/cloud/dc/dao/DcDetailsDao.java rename to engine/schema/src/com/cloud/dc/dao/DcDetailsDao.java diff --git a/server/src/com/cloud/dc/dao/DcDetailsDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DcDetailsDaoImpl.java similarity index 100% rename from server/src/com/cloud/dc/dao/DcDetailsDaoImpl.java rename to engine/schema/src/com/cloud/dc/dao/DcDetailsDaoImpl.java diff --git a/server/src/com/cloud/dc/dao/HostPodDao.java b/engine/schema/src/com/cloud/dc/dao/HostPodDao.java similarity index 100% rename from server/src/com/cloud/dc/dao/HostPodDao.java rename to engine/schema/src/com/cloud/dc/dao/HostPodDao.java diff --git a/server/src/com/cloud/dc/dao/HostPodDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/HostPodDaoImpl.java similarity index 100% rename from server/src/com/cloud/dc/dao/HostPodDaoImpl.java rename to engine/schema/src/com/cloud/dc/dao/HostPodDaoImpl.java diff --git a/server/src/com/cloud/dc/dao/PodVlanDao.java b/engine/schema/src/com/cloud/dc/dao/PodVlanDao.java similarity index 100% rename from server/src/com/cloud/dc/dao/PodVlanDao.java rename to engine/schema/src/com/cloud/dc/dao/PodVlanDao.java diff --git a/server/src/com/cloud/dc/dao/PodVlanDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/PodVlanDaoImpl.java similarity index 100% rename from server/src/com/cloud/dc/dao/PodVlanDaoImpl.java rename to engine/schema/src/com/cloud/dc/dao/PodVlanDaoImpl.java diff --git a/server/src/com/cloud/dc/dao/PodVlanMapDao.java b/engine/schema/src/com/cloud/dc/dao/PodVlanMapDao.java similarity index 100% rename from server/src/com/cloud/dc/dao/PodVlanMapDao.java rename to engine/schema/src/com/cloud/dc/dao/PodVlanMapDao.java diff --git a/server/src/com/cloud/dc/dao/PodVlanMapDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/PodVlanMapDaoImpl.java similarity index 100% rename from server/src/com/cloud/dc/dao/PodVlanMapDaoImpl.java rename to engine/schema/src/com/cloud/dc/dao/PodVlanMapDaoImpl.java diff --git a/server/src/com/cloud/dc/dao/StorageNetworkIpAddressDao.java b/engine/schema/src/com/cloud/dc/dao/StorageNetworkIpAddressDao.java similarity index 100% rename from server/src/com/cloud/dc/dao/StorageNetworkIpAddressDao.java rename to engine/schema/src/com/cloud/dc/dao/StorageNetworkIpAddressDao.java diff --git a/server/src/com/cloud/dc/dao/StorageNetworkIpAddressDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/StorageNetworkIpAddressDaoImpl.java similarity index 100% rename from server/src/com/cloud/dc/dao/StorageNetworkIpAddressDaoImpl.java rename to engine/schema/src/com/cloud/dc/dao/StorageNetworkIpAddressDaoImpl.java diff --git a/server/src/com/cloud/dc/dao/StorageNetworkIpRangeDao.java b/engine/schema/src/com/cloud/dc/dao/StorageNetworkIpRangeDao.java similarity index 100% rename from server/src/com/cloud/dc/dao/StorageNetworkIpRangeDao.java rename to engine/schema/src/com/cloud/dc/dao/StorageNetworkIpRangeDao.java diff --git a/server/src/com/cloud/dc/dao/StorageNetworkIpRangeDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/StorageNetworkIpRangeDaoImpl.java similarity index 100% rename from server/src/com/cloud/dc/dao/StorageNetworkIpRangeDaoImpl.java rename to engine/schema/src/com/cloud/dc/dao/StorageNetworkIpRangeDaoImpl.java diff --git a/server/src/com/cloud/dc/dao/VlanDao.java b/engine/schema/src/com/cloud/dc/dao/VlanDao.java similarity index 100% rename from server/src/com/cloud/dc/dao/VlanDao.java rename to engine/schema/src/com/cloud/dc/dao/VlanDao.java diff --git a/server/src/com/cloud/dc/dao/VlanDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/VlanDaoImpl.java similarity index 100% rename from server/src/com/cloud/dc/dao/VlanDaoImpl.java rename to engine/schema/src/com/cloud/dc/dao/VlanDaoImpl.java diff --git a/server/src/com/cloud/domain/DomainVO.java b/engine/schema/src/com/cloud/domain/DomainVO.java similarity index 100% rename from server/src/com/cloud/domain/DomainVO.java rename to engine/schema/src/com/cloud/domain/DomainVO.java diff --git a/server/src/com/cloud/domain/dao/DomainDao.java b/engine/schema/src/com/cloud/domain/dao/DomainDao.java similarity index 100% rename from server/src/com/cloud/domain/dao/DomainDao.java rename to engine/schema/src/com/cloud/domain/dao/DomainDao.java diff --git a/server/src/com/cloud/domain/dao/DomainDaoImpl.java b/engine/schema/src/com/cloud/domain/dao/DomainDaoImpl.java similarity index 100% rename from server/src/com/cloud/domain/dao/DomainDaoImpl.java rename to engine/schema/src/com/cloud/domain/dao/DomainDaoImpl.java diff --git a/server/src/com/cloud/host/dao/HostDao.java b/engine/schema/src/com/cloud/host/dao/HostDao.java similarity index 100% rename from server/src/com/cloud/host/dao/HostDao.java rename to engine/schema/src/com/cloud/host/dao/HostDao.java diff --git a/server/src/com/cloud/host/dao/HostDaoImpl.java b/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java similarity index 100% rename from server/src/com/cloud/host/dao/HostDaoImpl.java rename to engine/schema/src/com/cloud/host/dao/HostDaoImpl.java diff --git a/server/src/com/cloud/host/dao/HostDetailsDao.java b/engine/schema/src/com/cloud/host/dao/HostDetailsDao.java similarity index 100% rename from server/src/com/cloud/host/dao/HostDetailsDao.java rename to engine/schema/src/com/cloud/host/dao/HostDetailsDao.java diff --git a/server/src/com/cloud/host/dao/HostDetailsDaoImpl.java b/engine/schema/src/com/cloud/host/dao/HostDetailsDaoImpl.java similarity index 100% rename from server/src/com/cloud/host/dao/HostDetailsDaoImpl.java rename to engine/schema/src/com/cloud/host/dao/HostDetailsDaoImpl.java diff --git a/server/src/com/cloud/host/dao/HostTagsDao.java b/engine/schema/src/com/cloud/host/dao/HostTagsDao.java similarity index 100% rename from server/src/com/cloud/host/dao/HostTagsDao.java rename to engine/schema/src/com/cloud/host/dao/HostTagsDao.java diff --git a/server/src/com/cloud/host/dao/HostTagsDaoImpl.java b/engine/schema/src/com/cloud/host/dao/HostTagsDaoImpl.java similarity index 100% rename from server/src/com/cloud/host/dao/HostTagsDaoImpl.java rename to engine/schema/src/com/cloud/host/dao/HostTagsDaoImpl.java diff --git a/server/src/com/cloud/hypervisor/dao/HypervisorCapabilitiesDao.java b/engine/schema/src/com/cloud/hypervisor/dao/HypervisorCapabilitiesDao.java similarity index 100% rename from server/src/com/cloud/hypervisor/dao/HypervisorCapabilitiesDao.java rename to engine/schema/src/com/cloud/hypervisor/dao/HypervisorCapabilitiesDao.java diff --git a/server/src/com/cloud/hypervisor/dao/HypervisorCapabilitiesDaoImpl.java b/engine/schema/src/com/cloud/hypervisor/dao/HypervisorCapabilitiesDaoImpl.java similarity index 100% rename from server/src/com/cloud/hypervisor/dao/HypervisorCapabilitiesDaoImpl.java rename to engine/schema/src/com/cloud/hypervisor/dao/HypervisorCapabilitiesDaoImpl.java diff --git a/server/src/com/cloud/keystore/KeystoreDao.java b/engine/schema/src/com/cloud/keystore/KeystoreDao.java similarity index 100% rename from server/src/com/cloud/keystore/KeystoreDao.java rename to engine/schema/src/com/cloud/keystore/KeystoreDao.java diff --git a/server/src/com/cloud/keystore/KeystoreDaoImpl.java b/engine/schema/src/com/cloud/keystore/KeystoreDaoImpl.java similarity index 100% rename from server/src/com/cloud/keystore/KeystoreDaoImpl.java rename to engine/schema/src/com/cloud/keystore/KeystoreDaoImpl.java diff --git a/server/src/com/cloud/keystore/KeystoreVO.java b/engine/schema/src/com/cloud/keystore/KeystoreVO.java similarity index 100% rename from server/src/com/cloud/keystore/KeystoreVO.java rename to engine/schema/src/com/cloud/keystore/KeystoreVO.java diff --git a/server/src/com/cloud/migration/DiskOffering20Dao.java b/engine/schema/src/com/cloud/migration/DiskOffering20Dao.java similarity index 100% rename from server/src/com/cloud/migration/DiskOffering20Dao.java rename to engine/schema/src/com/cloud/migration/DiskOffering20Dao.java diff --git a/server/src/com/cloud/migration/DiskOffering20DaoImpl.java b/engine/schema/src/com/cloud/migration/DiskOffering20DaoImpl.java similarity index 100% rename from server/src/com/cloud/migration/DiskOffering20DaoImpl.java rename to engine/schema/src/com/cloud/migration/DiskOffering20DaoImpl.java diff --git a/server/src/com/cloud/migration/DiskOffering20VO.java b/engine/schema/src/com/cloud/migration/DiskOffering20VO.java similarity index 100% rename from server/src/com/cloud/migration/DiskOffering20VO.java rename to engine/schema/src/com/cloud/migration/DiskOffering20VO.java diff --git a/server/src/com/cloud/migration/DiskOffering21Dao.java b/engine/schema/src/com/cloud/migration/DiskOffering21Dao.java similarity index 100% rename from server/src/com/cloud/migration/DiskOffering21Dao.java rename to engine/schema/src/com/cloud/migration/DiskOffering21Dao.java diff --git a/server/src/com/cloud/migration/DiskOffering21DaoImpl.java b/engine/schema/src/com/cloud/migration/DiskOffering21DaoImpl.java similarity index 100% rename from server/src/com/cloud/migration/DiskOffering21DaoImpl.java rename to engine/schema/src/com/cloud/migration/DiskOffering21DaoImpl.java diff --git a/server/src/com/cloud/migration/DiskOffering21VO.java b/engine/schema/src/com/cloud/migration/DiskOffering21VO.java similarity index 100% rename from server/src/com/cloud/migration/DiskOffering21VO.java rename to engine/schema/src/com/cloud/migration/DiskOffering21VO.java diff --git a/server/src/com/cloud/migration/ServiceOffering20Dao.java b/engine/schema/src/com/cloud/migration/ServiceOffering20Dao.java similarity index 100% rename from server/src/com/cloud/migration/ServiceOffering20Dao.java rename to engine/schema/src/com/cloud/migration/ServiceOffering20Dao.java diff --git a/server/src/com/cloud/migration/ServiceOffering20DaoImpl.java b/engine/schema/src/com/cloud/migration/ServiceOffering20DaoImpl.java similarity index 100% rename from server/src/com/cloud/migration/ServiceOffering20DaoImpl.java rename to engine/schema/src/com/cloud/migration/ServiceOffering20DaoImpl.java diff --git a/server/src/com/cloud/migration/ServiceOffering20VO.java b/engine/schema/src/com/cloud/migration/ServiceOffering20VO.java similarity index 100% rename from server/src/com/cloud/migration/ServiceOffering20VO.java rename to engine/schema/src/com/cloud/migration/ServiceOffering20VO.java diff --git a/server/src/com/cloud/migration/ServiceOffering21Dao.java b/engine/schema/src/com/cloud/migration/ServiceOffering21Dao.java similarity index 100% rename from server/src/com/cloud/migration/ServiceOffering21Dao.java rename to engine/schema/src/com/cloud/migration/ServiceOffering21Dao.java diff --git a/server/src/com/cloud/migration/ServiceOffering21DaoImpl.java b/engine/schema/src/com/cloud/migration/ServiceOffering21DaoImpl.java similarity index 100% rename from server/src/com/cloud/migration/ServiceOffering21DaoImpl.java rename to engine/schema/src/com/cloud/migration/ServiceOffering21DaoImpl.java diff --git a/server/src/com/cloud/migration/ServiceOffering21VO.java b/engine/schema/src/com/cloud/migration/ServiceOffering21VO.java similarity index 100% rename from server/src/com/cloud/migration/ServiceOffering21VO.java rename to engine/schema/src/com/cloud/migration/ServiceOffering21VO.java diff --git a/server/src/com/cloud/network/LBHealthCheckPolicyVO.java b/engine/schema/src/com/cloud/network/LBHealthCheckPolicyVO.java similarity index 100% rename from server/src/com/cloud/network/LBHealthCheckPolicyVO.java rename to engine/schema/src/com/cloud/network/LBHealthCheckPolicyVO.java diff --git a/server/src/com/cloud/network/UserIpv6AddressVO.java b/engine/schema/src/com/cloud/network/UserIpv6AddressVO.java similarity index 100% rename from server/src/com/cloud/network/UserIpv6AddressVO.java rename to engine/schema/src/com/cloud/network/UserIpv6AddressVO.java diff --git a/server/src/com/cloud/network/as/AutoScalePolicyConditionMapVO.java b/engine/schema/src/com/cloud/network/as/AutoScalePolicyConditionMapVO.java similarity index 100% rename from server/src/com/cloud/network/as/AutoScalePolicyConditionMapVO.java rename to engine/schema/src/com/cloud/network/as/AutoScalePolicyConditionMapVO.java diff --git a/server/src/com/cloud/network/as/AutoScalePolicyVO.java b/engine/schema/src/com/cloud/network/as/AutoScalePolicyVO.java similarity index 100% rename from server/src/com/cloud/network/as/AutoScalePolicyVO.java rename to engine/schema/src/com/cloud/network/as/AutoScalePolicyVO.java diff --git a/server/src/com/cloud/network/as/AutoScaleVmGroupPolicyMapVO.java b/engine/schema/src/com/cloud/network/as/AutoScaleVmGroupPolicyMapVO.java similarity index 100% rename from server/src/com/cloud/network/as/AutoScaleVmGroupPolicyMapVO.java rename to engine/schema/src/com/cloud/network/as/AutoScaleVmGroupPolicyMapVO.java diff --git a/server/src/com/cloud/network/as/AutoScaleVmGroupVO.java b/engine/schema/src/com/cloud/network/as/AutoScaleVmGroupVO.java similarity index 100% rename from server/src/com/cloud/network/as/AutoScaleVmGroupVO.java rename to engine/schema/src/com/cloud/network/as/AutoScaleVmGroupVO.java diff --git a/server/src/com/cloud/network/as/AutoScaleVmProfileVO.java b/engine/schema/src/com/cloud/network/as/AutoScaleVmProfileVO.java similarity index 100% rename from server/src/com/cloud/network/as/AutoScaleVmProfileVO.java rename to engine/schema/src/com/cloud/network/as/AutoScaleVmProfileVO.java diff --git a/server/src/com/cloud/network/as/ConditionVO.java b/engine/schema/src/com/cloud/network/as/ConditionVO.java similarity index 100% rename from server/src/com/cloud/network/as/ConditionVO.java rename to engine/schema/src/com/cloud/network/as/ConditionVO.java diff --git a/server/src/com/cloud/network/as/CounterVO.java b/engine/schema/src/com/cloud/network/as/CounterVO.java similarity index 100% rename from server/src/com/cloud/network/as/CounterVO.java rename to engine/schema/src/com/cloud/network/as/CounterVO.java diff --git a/server/src/com/cloud/network/as/dao/AutoScalePolicyConditionMapDao.java b/engine/schema/src/com/cloud/network/as/dao/AutoScalePolicyConditionMapDao.java similarity index 100% rename from server/src/com/cloud/network/as/dao/AutoScalePolicyConditionMapDao.java rename to engine/schema/src/com/cloud/network/as/dao/AutoScalePolicyConditionMapDao.java diff --git a/server/src/com/cloud/network/as/dao/AutoScalePolicyConditionMapDaoImpl.java b/engine/schema/src/com/cloud/network/as/dao/AutoScalePolicyConditionMapDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/as/dao/AutoScalePolicyConditionMapDaoImpl.java rename to engine/schema/src/com/cloud/network/as/dao/AutoScalePolicyConditionMapDaoImpl.java diff --git a/server/src/com/cloud/network/as/dao/AutoScalePolicyDao.java b/engine/schema/src/com/cloud/network/as/dao/AutoScalePolicyDao.java similarity index 100% rename from server/src/com/cloud/network/as/dao/AutoScalePolicyDao.java rename to engine/schema/src/com/cloud/network/as/dao/AutoScalePolicyDao.java diff --git a/server/src/com/cloud/network/as/dao/AutoScalePolicyDaoImpl.java b/engine/schema/src/com/cloud/network/as/dao/AutoScalePolicyDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/as/dao/AutoScalePolicyDaoImpl.java rename to engine/schema/src/com/cloud/network/as/dao/AutoScalePolicyDaoImpl.java diff --git a/server/src/com/cloud/network/as/dao/AutoScaleVmGroupDao.java b/engine/schema/src/com/cloud/network/as/dao/AutoScaleVmGroupDao.java similarity index 100% rename from server/src/com/cloud/network/as/dao/AutoScaleVmGroupDao.java rename to engine/schema/src/com/cloud/network/as/dao/AutoScaleVmGroupDao.java diff --git a/server/src/com/cloud/network/as/dao/AutoScaleVmGroupDaoImpl.java b/engine/schema/src/com/cloud/network/as/dao/AutoScaleVmGroupDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/as/dao/AutoScaleVmGroupDaoImpl.java rename to engine/schema/src/com/cloud/network/as/dao/AutoScaleVmGroupDaoImpl.java diff --git a/server/src/com/cloud/network/as/dao/AutoScaleVmGroupPolicyMapDao.java b/engine/schema/src/com/cloud/network/as/dao/AutoScaleVmGroupPolicyMapDao.java similarity index 100% rename from server/src/com/cloud/network/as/dao/AutoScaleVmGroupPolicyMapDao.java rename to engine/schema/src/com/cloud/network/as/dao/AutoScaleVmGroupPolicyMapDao.java diff --git a/server/src/com/cloud/network/as/dao/AutoScaleVmGroupPolicyMapDaoImpl.java b/engine/schema/src/com/cloud/network/as/dao/AutoScaleVmGroupPolicyMapDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/as/dao/AutoScaleVmGroupPolicyMapDaoImpl.java rename to engine/schema/src/com/cloud/network/as/dao/AutoScaleVmGroupPolicyMapDaoImpl.java diff --git a/server/src/com/cloud/network/as/dao/AutoScaleVmProfileDao.java b/engine/schema/src/com/cloud/network/as/dao/AutoScaleVmProfileDao.java similarity index 100% rename from server/src/com/cloud/network/as/dao/AutoScaleVmProfileDao.java rename to engine/schema/src/com/cloud/network/as/dao/AutoScaleVmProfileDao.java diff --git a/server/src/com/cloud/network/as/dao/AutoScaleVmProfileDaoImpl.java b/engine/schema/src/com/cloud/network/as/dao/AutoScaleVmProfileDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/as/dao/AutoScaleVmProfileDaoImpl.java rename to engine/schema/src/com/cloud/network/as/dao/AutoScaleVmProfileDaoImpl.java diff --git a/server/src/com/cloud/network/as/dao/ConditionDao.java b/engine/schema/src/com/cloud/network/as/dao/ConditionDao.java similarity index 100% rename from server/src/com/cloud/network/as/dao/ConditionDao.java rename to engine/schema/src/com/cloud/network/as/dao/ConditionDao.java diff --git a/server/src/com/cloud/network/as/dao/ConditionDaoImpl.java b/engine/schema/src/com/cloud/network/as/dao/ConditionDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/as/dao/ConditionDaoImpl.java rename to engine/schema/src/com/cloud/network/as/dao/ConditionDaoImpl.java diff --git a/server/src/com/cloud/network/as/dao/CounterDao.java b/engine/schema/src/com/cloud/network/as/dao/CounterDao.java similarity index 100% rename from server/src/com/cloud/network/as/dao/CounterDao.java rename to engine/schema/src/com/cloud/network/as/dao/CounterDao.java diff --git a/server/src/com/cloud/network/as/dao/CounterDaoImpl.java b/engine/schema/src/com/cloud/network/as/dao/CounterDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/as/dao/CounterDaoImpl.java rename to engine/schema/src/com/cloud/network/as/dao/CounterDaoImpl.java diff --git a/server/src/com/cloud/network/dao/ExternalFirewallDeviceDao.java b/engine/schema/src/com/cloud/network/dao/ExternalFirewallDeviceDao.java similarity index 100% rename from server/src/com/cloud/network/dao/ExternalFirewallDeviceDao.java rename to engine/schema/src/com/cloud/network/dao/ExternalFirewallDeviceDao.java diff --git a/server/src/com/cloud/network/dao/ExternalFirewallDeviceDaoImpl.java b/engine/schema/src/com/cloud/network/dao/ExternalFirewallDeviceDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/ExternalFirewallDeviceDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/ExternalFirewallDeviceDaoImpl.java diff --git a/server/src/com/cloud/network/dao/ExternalFirewallDeviceVO.java b/engine/schema/src/com/cloud/network/dao/ExternalFirewallDeviceVO.java similarity index 100% rename from server/src/com/cloud/network/dao/ExternalFirewallDeviceVO.java rename to engine/schema/src/com/cloud/network/dao/ExternalFirewallDeviceVO.java diff --git a/server/src/com/cloud/network/dao/ExternalLoadBalancerDeviceDao.java b/engine/schema/src/com/cloud/network/dao/ExternalLoadBalancerDeviceDao.java similarity index 100% rename from server/src/com/cloud/network/dao/ExternalLoadBalancerDeviceDao.java rename to engine/schema/src/com/cloud/network/dao/ExternalLoadBalancerDeviceDao.java diff --git a/server/src/com/cloud/network/dao/ExternalLoadBalancerDeviceDaoImpl.java b/engine/schema/src/com/cloud/network/dao/ExternalLoadBalancerDeviceDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/ExternalLoadBalancerDeviceDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/ExternalLoadBalancerDeviceDaoImpl.java diff --git a/server/src/com/cloud/network/dao/ExternalLoadBalancerDeviceVO.java b/engine/schema/src/com/cloud/network/dao/ExternalLoadBalancerDeviceVO.java similarity index 100% rename from server/src/com/cloud/network/dao/ExternalLoadBalancerDeviceVO.java rename to engine/schema/src/com/cloud/network/dao/ExternalLoadBalancerDeviceVO.java diff --git a/server/src/com/cloud/network/dao/FirewallRulesCidrsDao.java b/engine/schema/src/com/cloud/network/dao/FirewallRulesCidrsDao.java similarity index 100% rename from server/src/com/cloud/network/dao/FirewallRulesCidrsDao.java rename to engine/schema/src/com/cloud/network/dao/FirewallRulesCidrsDao.java diff --git a/server/src/com/cloud/network/dao/FirewallRulesCidrsDaoImpl.java b/engine/schema/src/com/cloud/network/dao/FirewallRulesCidrsDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/FirewallRulesCidrsDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/FirewallRulesCidrsDaoImpl.java diff --git a/server/src/com/cloud/network/dao/FirewallRulesCidrsVO.java b/engine/schema/src/com/cloud/network/dao/FirewallRulesCidrsVO.java similarity index 100% rename from server/src/com/cloud/network/dao/FirewallRulesCidrsVO.java rename to engine/schema/src/com/cloud/network/dao/FirewallRulesCidrsVO.java diff --git a/server/src/com/cloud/network/dao/FirewallRulesDao.java b/engine/schema/src/com/cloud/network/dao/FirewallRulesDao.java similarity index 100% rename from server/src/com/cloud/network/dao/FirewallRulesDao.java rename to engine/schema/src/com/cloud/network/dao/FirewallRulesDao.java diff --git a/server/src/com/cloud/network/dao/FirewallRulesDaoImpl.java b/engine/schema/src/com/cloud/network/dao/FirewallRulesDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/FirewallRulesDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/FirewallRulesDaoImpl.java diff --git a/server/src/com/cloud/network/dao/IPAddressDao.java b/engine/schema/src/com/cloud/network/dao/IPAddressDao.java similarity index 100% rename from server/src/com/cloud/network/dao/IPAddressDao.java rename to engine/schema/src/com/cloud/network/dao/IPAddressDao.java diff --git a/server/src/com/cloud/network/dao/IPAddressDaoImpl.java b/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/IPAddressDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java diff --git a/server/src/com/cloud/network/dao/IPAddressVO.java b/engine/schema/src/com/cloud/network/dao/IPAddressVO.java similarity index 100% rename from server/src/com/cloud/network/dao/IPAddressVO.java rename to engine/schema/src/com/cloud/network/dao/IPAddressVO.java diff --git a/server/src/com/cloud/network/dao/InlineLoadBalancerNicMapDao.java b/engine/schema/src/com/cloud/network/dao/InlineLoadBalancerNicMapDao.java similarity index 100% rename from server/src/com/cloud/network/dao/InlineLoadBalancerNicMapDao.java rename to engine/schema/src/com/cloud/network/dao/InlineLoadBalancerNicMapDao.java diff --git a/server/src/com/cloud/network/dao/InlineLoadBalancerNicMapDaoImpl.java b/engine/schema/src/com/cloud/network/dao/InlineLoadBalancerNicMapDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/InlineLoadBalancerNicMapDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/InlineLoadBalancerNicMapDaoImpl.java diff --git a/server/src/com/cloud/network/dao/InlineLoadBalancerNicMapVO.java b/engine/schema/src/com/cloud/network/dao/InlineLoadBalancerNicMapVO.java similarity index 100% rename from server/src/com/cloud/network/dao/InlineLoadBalancerNicMapVO.java rename to engine/schema/src/com/cloud/network/dao/InlineLoadBalancerNicMapVO.java diff --git a/server/src/com/cloud/network/dao/LBHealthCheckPolicyDao.java b/engine/schema/src/com/cloud/network/dao/LBHealthCheckPolicyDao.java similarity index 100% rename from server/src/com/cloud/network/dao/LBHealthCheckPolicyDao.java rename to engine/schema/src/com/cloud/network/dao/LBHealthCheckPolicyDao.java diff --git a/server/src/com/cloud/network/dao/LBHealthCheckPolicyDaoImpl.java b/engine/schema/src/com/cloud/network/dao/LBHealthCheckPolicyDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/LBHealthCheckPolicyDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/LBHealthCheckPolicyDaoImpl.java diff --git a/server/src/com/cloud/network/dao/LBStickinessPolicyDao.java b/engine/schema/src/com/cloud/network/dao/LBStickinessPolicyDao.java similarity index 100% rename from server/src/com/cloud/network/dao/LBStickinessPolicyDao.java rename to engine/schema/src/com/cloud/network/dao/LBStickinessPolicyDao.java diff --git a/server/src/com/cloud/network/dao/LBStickinessPolicyDaoImpl.java b/engine/schema/src/com/cloud/network/dao/LBStickinessPolicyDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/LBStickinessPolicyDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/LBStickinessPolicyDaoImpl.java diff --git a/server/src/com/cloud/network/dao/LBStickinessPolicyVO.java b/engine/schema/src/com/cloud/network/dao/LBStickinessPolicyVO.java similarity index 100% rename from server/src/com/cloud/network/dao/LBStickinessPolicyVO.java rename to engine/schema/src/com/cloud/network/dao/LBStickinessPolicyVO.java diff --git a/server/src/com/cloud/network/dao/LoadBalancerDao.java b/engine/schema/src/com/cloud/network/dao/LoadBalancerDao.java similarity index 100% rename from server/src/com/cloud/network/dao/LoadBalancerDao.java rename to engine/schema/src/com/cloud/network/dao/LoadBalancerDao.java diff --git a/server/src/com/cloud/network/dao/LoadBalancerDaoImpl.java b/engine/schema/src/com/cloud/network/dao/LoadBalancerDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/LoadBalancerDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/LoadBalancerDaoImpl.java diff --git a/server/src/com/cloud/network/dao/LoadBalancerVMMapDao.java b/engine/schema/src/com/cloud/network/dao/LoadBalancerVMMapDao.java similarity index 100% rename from server/src/com/cloud/network/dao/LoadBalancerVMMapDao.java rename to engine/schema/src/com/cloud/network/dao/LoadBalancerVMMapDao.java diff --git a/server/src/com/cloud/network/dao/LoadBalancerVMMapDaoImpl.java b/engine/schema/src/com/cloud/network/dao/LoadBalancerVMMapDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/LoadBalancerVMMapDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/LoadBalancerVMMapDaoImpl.java diff --git a/server/src/com/cloud/network/dao/LoadBalancerVMMapVO.java b/engine/schema/src/com/cloud/network/dao/LoadBalancerVMMapVO.java similarity index 100% rename from server/src/com/cloud/network/dao/LoadBalancerVMMapVO.java rename to engine/schema/src/com/cloud/network/dao/LoadBalancerVMMapVO.java diff --git a/server/src/com/cloud/network/dao/LoadBalancerVO.java b/engine/schema/src/com/cloud/network/dao/LoadBalancerVO.java similarity index 100% rename from server/src/com/cloud/network/dao/LoadBalancerVO.java rename to engine/schema/src/com/cloud/network/dao/LoadBalancerVO.java diff --git a/server/src/com/cloud/network/dao/NetworkAccountDao.java b/engine/schema/src/com/cloud/network/dao/NetworkAccountDao.java similarity index 100% rename from server/src/com/cloud/network/dao/NetworkAccountDao.java rename to engine/schema/src/com/cloud/network/dao/NetworkAccountDao.java diff --git a/server/src/com/cloud/network/dao/NetworkAccountDaoImpl.java b/engine/schema/src/com/cloud/network/dao/NetworkAccountDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/NetworkAccountDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/NetworkAccountDaoImpl.java diff --git a/server/src/com/cloud/network/dao/NetworkAccountVO.java b/engine/schema/src/com/cloud/network/dao/NetworkAccountVO.java similarity index 100% rename from server/src/com/cloud/network/dao/NetworkAccountVO.java rename to engine/schema/src/com/cloud/network/dao/NetworkAccountVO.java diff --git a/server/src/com/cloud/network/dao/NetworkDao.java b/engine/schema/src/com/cloud/network/dao/NetworkDao.java similarity index 100% rename from server/src/com/cloud/network/dao/NetworkDao.java rename to engine/schema/src/com/cloud/network/dao/NetworkDao.java diff --git a/server/src/com/cloud/network/dao/NetworkDaoImpl.java b/engine/schema/src/com/cloud/network/dao/NetworkDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/NetworkDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/NetworkDaoImpl.java diff --git a/server/src/com/cloud/network/dao/NetworkDomainDao.java b/engine/schema/src/com/cloud/network/dao/NetworkDomainDao.java similarity index 100% rename from server/src/com/cloud/network/dao/NetworkDomainDao.java rename to engine/schema/src/com/cloud/network/dao/NetworkDomainDao.java diff --git a/server/src/com/cloud/network/dao/NetworkDomainDaoImpl.java b/engine/schema/src/com/cloud/network/dao/NetworkDomainDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/NetworkDomainDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/NetworkDomainDaoImpl.java diff --git a/server/src/com/cloud/network/dao/NetworkDomainVO.java b/engine/schema/src/com/cloud/network/dao/NetworkDomainVO.java similarity index 100% rename from server/src/com/cloud/network/dao/NetworkDomainVO.java rename to engine/schema/src/com/cloud/network/dao/NetworkDomainVO.java diff --git a/server/src/com/cloud/network/dao/NetworkExternalFirewallDao.java b/engine/schema/src/com/cloud/network/dao/NetworkExternalFirewallDao.java similarity index 100% rename from server/src/com/cloud/network/dao/NetworkExternalFirewallDao.java rename to engine/schema/src/com/cloud/network/dao/NetworkExternalFirewallDao.java diff --git a/server/src/com/cloud/network/dao/NetworkExternalFirewallDaoImpl.java b/engine/schema/src/com/cloud/network/dao/NetworkExternalFirewallDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/NetworkExternalFirewallDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/NetworkExternalFirewallDaoImpl.java diff --git a/server/src/com/cloud/network/dao/NetworkExternalFirewallVO.java b/engine/schema/src/com/cloud/network/dao/NetworkExternalFirewallVO.java similarity index 100% rename from server/src/com/cloud/network/dao/NetworkExternalFirewallVO.java rename to engine/schema/src/com/cloud/network/dao/NetworkExternalFirewallVO.java diff --git a/server/src/com/cloud/network/dao/NetworkExternalLoadBalancerDao.java b/engine/schema/src/com/cloud/network/dao/NetworkExternalLoadBalancerDao.java similarity index 100% rename from server/src/com/cloud/network/dao/NetworkExternalLoadBalancerDao.java rename to engine/schema/src/com/cloud/network/dao/NetworkExternalLoadBalancerDao.java diff --git a/server/src/com/cloud/network/dao/NetworkExternalLoadBalancerDaoImpl.java b/engine/schema/src/com/cloud/network/dao/NetworkExternalLoadBalancerDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/NetworkExternalLoadBalancerDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/NetworkExternalLoadBalancerDaoImpl.java diff --git a/server/src/com/cloud/network/dao/NetworkExternalLoadBalancerVO.java b/engine/schema/src/com/cloud/network/dao/NetworkExternalLoadBalancerVO.java similarity index 100% rename from server/src/com/cloud/network/dao/NetworkExternalLoadBalancerVO.java rename to engine/schema/src/com/cloud/network/dao/NetworkExternalLoadBalancerVO.java diff --git a/server/src/com/cloud/network/dao/NetworkOpDao.java b/engine/schema/src/com/cloud/network/dao/NetworkOpDao.java similarity index 100% rename from server/src/com/cloud/network/dao/NetworkOpDao.java rename to engine/schema/src/com/cloud/network/dao/NetworkOpDao.java diff --git a/server/src/com/cloud/network/dao/NetworkOpDaoImpl.java b/engine/schema/src/com/cloud/network/dao/NetworkOpDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/NetworkOpDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/NetworkOpDaoImpl.java diff --git a/server/src/com/cloud/network/dao/NetworkOpVO.java b/engine/schema/src/com/cloud/network/dao/NetworkOpVO.java similarity index 100% rename from server/src/com/cloud/network/dao/NetworkOpVO.java rename to engine/schema/src/com/cloud/network/dao/NetworkOpVO.java diff --git a/server/src/com/cloud/network/dao/NetworkRuleConfigDao.java b/engine/schema/src/com/cloud/network/dao/NetworkRuleConfigDao.java similarity index 100% rename from server/src/com/cloud/network/dao/NetworkRuleConfigDao.java rename to engine/schema/src/com/cloud/network/dao/NetworkRuleConfigDao.java diff --git a/server/src/com/cloud/network/dao/NetworkRuleConfigDaoImpl.java b/engine/schema/src/com/cloud/network/dao/NetworkRuleConfigDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/NetworkRuleConfigDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/NetworkRuleConfigDaoImpl.java diff --git a/server/src/com/cloud/network/dao/NetworkRuleConfigVO.java b/engine/schema/src/com/cloud/network/dao/NetworkRuleConfigVO.java similarity index 100% rename from server/src/com/cloud/network/dao/NetworkRuleConfigVO.java rename to engine/schema/src/com/cloud/network/dao/NetworkRuleConfigVO.java diff --git a/server/src/com/cloud/network/dao/NetworkServiceMapDao.java b/engine/schema/src/com/cloud/network/dao/NetworkServiceMapDao.java similarity index 100% rename from server/src/com/cloud/network/dao/NetworkServiceMapDao.java rename to engine/schema/src/com/cloud/network/dao/NetworkServiceMapDao.java diff --git a/server/src/com/cloud/network/dao/NetworkServiceMapDaoImpl.java b/engine/schema/src/com/cloud/network/dao/NetworkServiceMapDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/NetworkServiceMapDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/NetworkServiceMapDaoImpl.java diff --git a/server/src/com/cloud/network/dao/NetworkServiceMapVO.java b/engine/schema/src/com/cloud/network/dao/NetworkServiceMapVO.java similarity index 100% rename from server/src/com/cloud/network/dao/NetworkServiceMapVO.java rename to engine/schema/src/com/cloud/network/dao/NetworkServiceMapVO.java diff --git a/server/src/com/cloud/network/dao/NetworkVO.java b/engine/schema/src/com/cloud/network/dao/NetworkVO.java similarity index 100% rename from server/src/com/cloud/network/dao/NetworkVO.java rename to engine/schema/src/com/cloud/network/dao/NetworkVO.java diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkDao.java b/engine/schema/src/com/cloud/network/dao/PhysicalNetworkDao.java similarity index 100% rename from server/src/com/cloud/network/dao/PhysicalNetworkDao.java rename to engine/schema/src/com/cloud/network/dao/PhysicalNetworkDao.java diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkDaoImpl.java b/engine/schema/src/com/cloud/network/dao/PhysicalNetworkDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/PhysicalNetworkDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/PhysicalNetworkDaoImpl.java diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkIsolationMethodDaoImpl.java b/engine/schema/src/com/cloud/network/dao/PhysicalNetworkIsolationMethodDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/PhysicalNetworkIsolationMethodDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/PhysicalNetworkIsolationMethodDaoImpl.java diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkIsolationMethodVO.java b/engine/schema/src/com/cloud/network/dao/PhysicalNetworkIsolationMethodVO.java similarity index 100% rename from server/src/com/cloud/network/dao/PhysicalNetworkIsolationMethodVO.java rename to engine/schema/src/com/cloud/network/dao/PhysicalNetworkIsolationMethodVO.java diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDao.java b/engine/schema/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDao.java similarity index 100% rename from server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDao.java rename to engine/schema/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDao.java diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDaoImpl.java b/engine/schema/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/PhysicalNetworkServiceProviderDaoImpl.java diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderVO.java b/engine/schema/src/com/cloud/network/dao/PhysicalNetworkServiceProviderVO.java similarity index 100% rename from server/src/com/cloud/network/dao/PhysicalNetworkServiceProviderVO.java rename to engine/schema/src/com/cloud/network/dao/PhysicalNetworkServiceProviderVO.java diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkTagDaoImpl.java b/engine/schema/src/com/cloud/network/dao/PhysicalNetworkTagDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/PhysicalNetworkTagDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/PhysicalNetworkTagDaoImpl.java diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkTagVO.java b/engine/schema/src/com/cloud/network/dao/PhysicalNetworkTagVO.java similarity index 100% rename from server/src/com/cloud/network/dao/PhysicalNetworkTagVO.java rename to engine/schema/src/com/cloud/network/dao/PhysicalNetworkTagVO.java diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkTrafficTypeDao.java b/engine/schema/src/com/cloud/network/dao/PhysicalNetworkTrafficTypeDao.java similarity index 100% rename from server/src/com/cloud/network/dao/PhysicalNetworkTrafficTypeDao.java rename to engine/schema/src/com/cloud/network/dao/PhysicalNetworkTrafficTypeDao.java diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkTrafficTypeDaoImpl.java b/engine/schema/src/com/cloud/network/dao/PhysicalNetworkTrafficTypeDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/PhysicalNetworkTrafficTypeDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/PhysicalNetworkTrafficTypeDaoImpl.java diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkTrafficTypeVO.java b/engine/schema/src/com/cloud/network/dao/PhysicalNetworkTrafficTypeVO.java similarity index 100% rename from server/src/com/cloud/network/dao/PhysicalNetworkTrafficTypeVO.java rename to engine/schema/src/com/cloud/network/dao/PhysicalNetworkTrafficTypeVO.java diff --git a/server/src/com/cloud/network/dao/PhysicalNetworkVO.java b/engine/schema/src/com/cloud/network/dao/PhysicalNetworkVO.java similarity index 100% rename from server/src/com/cloud/network/dao/PhysicalNetworkVO.java rename to engine/schema/src/com/cloud/network/dao/PhysicalNetworkVO.java diff --git a/server/src/com/cloud/network/dao/PortProfileDao.java b/engine/schema/src/com/cloud/network/dao/PortProfileDao.java similarity index 100% rename from server/src/com/cloud/network/dao/PortProfileDao.java rename to engine/schema/src/com/cloud/network/dao/PortProfileDao.java diff --git a/server/src/com/cloud/network/dao/PortProfileDaoImpl.java b/engine/schema/src/com/cloud/network/dao/PortProfileDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/PortProfileDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/PortProfileDaoImpl.java diff --git a/server/src/com/cloud/network/dao/PortProfileVO.java b/engine/schema/src/com/cloud/network/dao/PortProfileVO.java similarity index 100% rename from server/src/com/cloud/network/dao/PortProfileVO.java rename to engine/schema/src/com/cloud/network/dao/PortProfileVO.java diff --git a/server/src/com/cloud/network/dao/RemoteAccessVpnDao.java b/engine/schema/src/com/cloud/network/dao/RemoteAccessVpnDao.java similarity index 100% rename from server/src/com/cloud/network/dao/RemoteAccessVpnDao.java rename to engine/schema/src/com/cloud/network/dao/RemoteAccessVpnDao.java diff --git a/server/src/com/cloud/network/dao/RemoteAccessVpnDaoImpl.java b/engine/schema/src/com/cloud/network/dao/RemoteAccessVpnDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/RemoteAccessVpnDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/RemoteAccessVpnDaoImpl.java diff --git a/server/src/com/cloud/network/dao/RemoteAccessVpnVO.java b/engine/schema/src/com/cloud/network/dao/RemoteAccessVpnVO.java similarity index 100% rename from server/src/com/cloud/network/dao/RemoteAccessVpnVO.java rename to engine/schema/src/com/cloud/network/dao/RemoteAccessVpnVO.java diff --git a/server/src/com/cloud/network/dao/RouterNetworkDao.java b/engine/schema/src/com/cloud/network/dao/RouterNetworkDao.java similarity index 100% rename from server/src/com/cloud/network/dao/RouterNetworkDao.java rename to engine/schema/src/com/cloud/network/dao/RouterNetworkDao.java diff --git a/server/src/com/cloud/network/dao/RouterNetworkDaoImpl.java b/engine/schema/src/com/cloud/network/dao/RouterNetworkDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/RouterNetworkDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/RouterNetworkDaoImpl.java diff --git a/server/src/com/cloud/network/dao/RouterNetworkVO.java b/engine/schema/src/com/cloud/network/dao/RouterNetworkVO.java similarity index 100% rename from server/src/com/cloud/network/dao/RouterNetworkVO.java rename to engine/schema/src/com/cloud/network/dao/RouterNetworkVO.java diff --git a/server/src/com/cloud/network/dao/Site2SiteCustomerGatewayDao.java b/engine/schema/src/com/cloud/network/dao/Site2SiteCustomerGatewayDao.java similarity index 100% rename from server/src/com/cloud/network/dao/Site2SiteCustomerGatewayDao.java rename to engine/schema/src/com/cloud/network/dao/Site2SiteCustomerGatewayDao.java diff --git a/server/src/com/cloud/network/dao/Site2SiteCustomerGatewayDaoImpl.java b/engine/schema/src/com/cloud/network/dao/Site2SiteCustomerGatewayDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/Site2SiteCustomerGatewayDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/Site2SiteCustomerGatewayDaoImpl.java diff --git a/server/src/com/cloud/network/dao/Site2SiteCustomerGatewayVO.java b/engine/schema/src/com/cloud/network/dao/Site2SiteCustomerGatewayVO.java similarity index 100% rename from server/src/com/cloud/network/dao/Site2SiteCustomerGatewayVO.java rename to engine/schema/src/com/cloud/network/dao/Site2SiteCustomerGatewayVO.java diff --git a/server/src/com/cloud/network/dao/Site2SiteVpnConnectionDao.java b/engine/schema/src/com/cloud/network/dao/Site2SiteVpnConnectionDao.java similarity index 100% rename from server/src/com/cloud/network/dao/Site2SiteVpnConnectionDao.java rename to engine/schema/src/com/cloud/network/dao/Site2SiteVpnConnectionDao.java diff --git a/server/src/com/cloud/network/dao/Site2SiteVpnConnectionDaoImpl.java b/engine/schema/src/com/cloud/network/dao/Site2SiteVpnConnectionDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/Site2SiteVpnConnectionDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/Site2SiteVpnConnectionDaoImpl.java diff --git a/server/src/com/cloud/network/dao/Site2SiteVpnConnectionVO.java b/engine/schema/src/com/cloud/network/dao/Site2SiteVpnConnectionVO.java similarity index 100% rename from server/src/com/cloud/network/dao/Site2SiteVpnConnectionVO.java rename to engine/schema/src/com/cloud/network/dao/Site2SiteVpnConnectionVO.java diff --git a/server/src/com/cloud/network/dao/Site2SiteVpnGatewayDao.java b/engine/schema/src/com/cloud/network/dao/Site2SiteVpnGatewayDao.java similarity index 100% rename from server/src/com/cloud/network/dao/Site2SiteVpnGatewayDao.java rename to engine/schema/src/com/cloud/network/dao/Site2SiteVpnGatewayDao.java diff --git a/server/src/com/cloud/network/dao/Site2SiteVpnGatewayDaoImpl.java b/engine/schema/src/com/cloud/network/dao/Site2SiteVpnGatewayDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/Site2SiteVpnGatewayDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/Site2SiteVpnGatewayDaoImpl.java diff --git a/server/src/com/cloud/network/dao/Site2SiteVpnGatewayVO.java b/engine/schema/src/com/cloud/network/dao/Site2SiteVpnGatewayVO.java similarity index 100% rename from server/src/com/cloud/network/dao/Site2SiteVpnGatewayVO.java rename to engine/schema/src/com/cloud/network/dao/Site2SiteVpnGatewayVO.java diff --git a/server/src/com/cloud/network/dao/UserIpv6AddressDao.java b/engine/schema/src/com/cloud/network/dao/UserIpv6AddressDao.java similarity index 100% rename from server/src/com/cloud/network/dao/UserIpv6AddressDao.java rename to engine/schema/src/com/cloud/network/dao/UserIpv6AddressDao.java diff --git a/server/src/com/cloud/network/dao/UserIpv6AddressDaoImpl.java b/engine/schema/src/com/cloud/network/dao/UserIpv6AddressDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/UserIpv6AddressDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/UserIpv6AddressDaoImpl.java diff --git a/server/src/com/cloud/network/dao/VirtualRouterProviderDao.java b/engine/schema/src/com/cloud/network/dao/VirtualRouterProviderDao.java similarity index 100% rename from server/src/com/cloud/network/dao/VirtualRouterProviderDao.java rename to engine/schema/src/com/cloud/network/dao/VirtualRouterProviderDao.java diff --git a/server/src/com/cloud/network/dao/VirtualRouterProviderDaoImpl.java b/engine/schema/src/com/cloud/network/dao/VirtualRouterProviderDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/VirtualRouterProviderDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/VirtualRouterProviderDaoImpl.java diff --git a/server/src/com/cloud/network/dao/VpnUserDao.java b/engine/schema/src/com/cloud/network/dao/VpnUserDao.java similarity index 100% rename from server/src/com/cloud/network/dao/VpnUserDao.java rename to engine/schema/src/com/cloud/network/dao/VpnUserDao.java diff --git a/server/src/com/cloud/network/dao/VpnUserDaoImpl.java b/engine/schema/src/com/cloud/network/dao/VpnUserDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/VpnUserDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/VpnUserDaoImpl.java diff --git a/server/src/com/cloud/network/element/VirtualRouterProviderVO.java b/engine/schema/src/com/cloud/network/element/VirtualRouterProviderVO.java similarity index 100% rename from server/src/com/cloud/network/element/VirtualRouterProviderVO.java rename to engine/schema/src/com/cloud/network/element/VirtualRouterProviderVO.java diff --git a/server/src/com/cloud/network/rules/FirewallRuleVO.java b/engine/schema/src/com/cloud/network/rules/FirewallRuleVO.java similarity index 100% rename from server/src/com/cloud/network/rules/FirewallRuleVO.java rename to engine/schema/src/com/cloud/network/rules/FirewallRuleVO.java diff --git a/server/src/com/cloud/network/rules/PortForwardingRuleVO.java b/engine/schema/src/com/cloud/network/rules/PortForwardingRuleVO.java similarity index 100% rename from server/src/com/cloud/network/rules/PortForwardingRuleVO.java rename to engine/schema/src/com/cloud/network/rules/PortForwardingRuleVO.java diff --git a/server/src/com/cloud/network/rules/dao/PortForwardingRulesDao.java b/engine/schema/src/com/cloud/network/rules/dao/PortForwardingRulesDao.java similarity index 100% rename from server/src/com/cloud/network/rules/dao/PortForwardingRulesDao.java rename to engine/schema/src/com/cloud/network/rules/dao/PortForwardingRulesDao.java diff --git a/server/src/com/cloud/network/rules/dao/PortForwardingRulesDaoImpl.java b/engine/schema/src/com/cloud/network/rules/dao/PortForwardingRulesDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/rules/dao/PortForwardingRulesDaoImpl.java rename to engine/schema/src/com/cloud/network/rules/dao/PortForwardingRulesDaoImpl.java diff --git a/server/src/com/cloud/network/security/dao/SecurityGroupDao.java b/engine/schema/src/com/cloud/network/security/dao/SecurityGroupDao.java similarity index 100% rename from server/src/com/cloud/network/security/dao/SecurityGroupDao.java rename to engine/schema/src/com/cloud/network/security/dao/SecurityGroupDao.java diff --git a/server/src/com/cloud/network/security/dao/SecurityGroupDaoImpl.java b/engine/schema/src/com/cloud/network/security/dao/SecurityGroupDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/security/dao/SecurityGroupDaoImpl.java rename to engine/schema/src/com/cloud/network/security/dao/SecurityGroupDaoImpl.java diff --git a/server/src/com/cloud/network/security/dao/SecurityGroupRuleDao.java b/engine/schema/src/com/cloud/network/security/dao/SecurityGroupRuleDao.java similarity index 100% rename from server/src/com/cloud/network/security/dao/SecurityGroupRuleDao.java rename to engine/schema/src/com/cloud/network/security/dao/SecurityGroupRuleDao.java diff --git a/server/src/com/cloud/network/security/dao/SecurityGroupRuleDaoImpl.java b/engine/schema/src/com/cloud/network/security/dao/SecurityGroupRuleDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/security/dao/SecurityGroupRuleDaoImpl.java rename to engine/schema/src/com/cloud/network/security/dao/SecurityGroupRuleDaoImpl.java diff --git a/server/src/com/cloud/network/security/dao/SecurityGroupRulesDao.java b/engine/schema/src/com/cloud/network/security/dao/SecurityGroupRulesDao.java similarity index 100% rename from server/src/com/cloud/network/security/dao/SecurityGroupRulesDao.java rename to engine/schema/src/com/cloud/network/security/dao/SecurityGroupRulesDao.java diff --git a/server/src/com/cloud/network/security/dao/SecurityGroupRulesDaoImpl.java b/engine/schema/src/com/cloud/network/security/dao/SecurityGroupRulesDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/security/dao/SecurityGroupRulesDaoImpl.java rename to engine/schema/src/com/cloud/network/security/dao/SecurityGroupRulesDaoImpl.java diff --git a/server/src/com/cloud/network/security/dao/SecurityGroupVMMapDao.java b/engine/schema/src/com/cloud/network/security/dao/SecurityGroupVMMapDao.java similarity index 100% rename from server/src/com/cloud/network/security/dao/SecurityGroupVMMapDao.java rename to engine/schema/src/com/cloud/network/security/dao/SecurityGroupVMMapDao.java diff --git a/server/src/com/cloud/network/security/dao/SecurityGroupVMMapDaoImpl.java b/engine/schema/src/com/cloud/network/security/dao/SecurityGroupVMMapDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/security/dao/SecurityGroupVMMapDaoImpl.java rename to engine/schema/src/com/cloud/network/security/dao/SecurityGroupVMMapDaoImpl.java diff --git a/server/src/com/cloud/network/security/dao/SecurityGroupWorkDao.java b/engine/schema/src/com/cloud/network/security/dao/SecurityGroupWorkDao.java similarity index 100% rename from server/src/com/cloud/network/security/dao/SecurityGroupWorkDao.java rename to engine/schema/src/com/cloud/network/security/dao/SecurityGroupWorkDao.java diff --git a/server/src/com/cloud/network/security/dao/SecurityGroupWorkDaoImpl.java b/engine/schema/src/com/cloud/network/security/dao/SecurityGroupWorkDaoImpl.java similarity index 93% rename from server/src/com/cloud/network/security/dao/SecurityGroupWorkDaoImpl.java rename to engine/schema/src/com/cloud/network/security/dao/SecurityGroupWorkDaoImpl.java index dcd1238186e..3154ffeb873 100644 --- a/server/src/com/cloud/network/security/dao/SecurityGroupWorkDaoImpl.java +++ b/engine/schema/src/com/cloud/network/security/dao/SecurityGroupWorkDaoImpl.java @@ -24,17 +24,16 @@ import javax.ejb.Local; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; -import com.cloud.ha.HaWorkVO; import com.cloud.network.security.SecurityGroupWork; -import com.cloud.network.security.SecurityGroupWorkVO; import com.cloud.network.security.SecurityGroupWork.Step; +import com.cloud.network.security.SecurityGroupWorkVO; import com.cloud.utils.db.DB; import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; -import com.cloud.utils.db.Transaction; import com.cloud.utils.db.SearchCriteria.Op; +import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; @Component @@ -42,12 +41,12 @@ import com.cloud.utils.exception.CloudRuntimeException; public class SecurityGroupWorkDaoImpl extends GenericDaoBase implements SecurityGroupWorkDao { private static final Logger s_logger = Logger.getLogger(SecurityGroupWorkDaoImpl.class); - private SearchBuilder VmIdTakenSearch; - private SearchBuilder VmIdSeqNumSearch; - private SearchBuilder VmIdUnTakenSearch; - private SearchBuilder UntakenWorkSearch; - private SearchBuilder VmIdStepSearch; - private SearchBuilder CleanupSearch; + private final SearchBuilder VmIdTakenSearch; + private final SearchBuilder VmIdSeqNumSearch; + private final SearchBuilder VmIdUnTakenSearch; + private final SearchBuilder UntakenWorkSearch; + private final SearchBuilder VmIdStepSearch; + private final SearchBuilder CleanupSearch; protected SecurityGroupWorkDaoImpl() { @@ -56,38 +55,38 @@ public class SecurityGroupWorkDaoImpl extends GenericDaoBase sc = VmIdSeqNumSearch.create(); sc.setParameters("vmId", vmId); sc.setParameters("seqno", logSequenceNumber); - - final Filter filter = new Filter(HaWorkVO.class, null, true, 0l, 1l); + + final Filter filter = new Filter(SecurityGroupWorkVO.class, null, true, 0l, 1l); final List vos = lockRows(sc, filter, true); if (vos.size() == 0) { @@ -183,7 +182,7 @@ public class SecurityGroupWorkDaoImpl extends GenericDaoBase result = listIncludingRemovedBy(sc); - + return result; } - + @Override public List findAndCleanupUnfinishedWork(Date timeBefore) { final SearchCriteria sc = CleanupSearch.create(); @@ -230,7 +229,7 @@ public class SecurityGroupWorkDaoImpl extends GenericDaoBase findScheduledWork() { final SearchCriteria sc = UntakenWorkSearch.create(); @@ -238,5 +237,5 @@ public class SecurityGroupWorkDaoImpl extends GenericDaoBase> upgradedVersions = new TreeMap>(); diff --git a/server/src/com/cloud/upgrade/PremiumDatabaseUpgradeChecker.java b/engine/schema/src/com/cloud/upgrade/PremiumDatabaseUpgradeChecker.java similarity index 100% rename from server/src/com/cloud/upgrade/PremiumDatabaseUpgradeChecker.java rename to engine/schema/src/com/cloud/upgrade/PremiumDatabaseUpgradeChecker.java diff --git a/server/src/com/cloud/upgrade/dao/DbUpgrade.java b/engine/schema/src/com/cloud/upgrade/dao/DbUpgrade.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/DbUpgrade.java rename to engine/schema/src/com/cloud/upgrade/dao/DbUpgrade.java diff --git a/server/src/com/cloud/upgrade/dao/DbUpgradeUtils.java b/engine/schema/src/com/cloud/upgrade/dao/DbUpgradeUtils.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/DbUpgradeUtils.java rename to engine/schema/src/com/cloud/upgrade/dao/DbUpgradeUtils.java diff --git a/server/src/com/cloud/upgrade/dao/Upgrade217to218.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade217to218.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/Upgrade217to218.java rename to engine/schema/src/com/cloud/upgrade/dao/Upgrade217to218.java diff --git a/server/src/com/cloud/upgrade/dao/Upgrade218to22.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade218to22.java similarity index 99% rename from server/src/com/cloud/upgrade/dao/Upgrade218to22.java rename to engine/schema/src/com/cloud/upgrade/dao/Upgrade218to22.java index 01fa2cc9cfa..2ef842ac6d2 100644 --- a/server/src/com/cloud/upgrade/dao/Upgrade218to22.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade218to22.java @@ -37,12 +37,9 @@ import java.util.UUID; import org.apache.log4j.Logger; import com.cloud.configuration.Resource.ResourceType; -import com.cloud.consoleproxy.ConsoleProxyManager; import com.cloud.event.EventTypes; import com.cloud.event.EventVO; import com.cloud.event.UsageEventVO; -import com.cloud.network.router.VpcVirtualNetworkApplianceManager; -import com.cloud.storage.secondary.SecondaryStorageVmManager; import com.cloud.utils.DateUtil; import com.cloud.utils.NumbersUtil; import com.cloud.utils.exception.CloudRuntimeException; @@ -1146,7 +1143,7 @@ public class Upgrade218to22 implements DbUpgrade { if (!userVmSet.next()) { s_logger.warn("Skipping user_statistics upgrade for account id=" + accountId + " in datacenter id=" + dataCenterId); continue; - } + } deviceId = userVmSet.getLong(1); } else { s_logger.debug("Account id=" + accountId + " doesn't own any user vms and domRs, so skipping user_statistics update"); @@ -1407,9 +1404,9 @@ public class Upgrade218to22 implements DbUpgrade { rs.close(); pstmt.close(); - int proxyRamSize = NumbersUtil.parseInt(getConfigValue(conn, "consoleproxy.ram.size"), ConsoleProxyManager.DEFAULT_PROXY_VM_RAMSIZE); - int domrRamSize = NumbersUtil.parseInt(getConfigValue(conn, "router.ram.size"), VpcVirtualNetworkApplianceManager.DEFAULT_ROUTER_VM_RAMSIZE); - int ssvmRamSize = NumbersUtil.parseInt(getConfigValue(conn, "secstorage.vm.ram.size"), SecondaryStorageVmManager.DEFAULT_SS_VM_RAMSIZE); + int proxyRamSize = NumbersUtil.parseInt(getConfigValue(conn, "consoleproxy.ram.size"), 1024); // ConsoleProxyManager.DEFAULT_PROXY_VM_RAMSIZE); + int domrRamSize = NumbersUtil.parseInt(getConfigValue(conn, "router.ram.size"), 128); // VpcVirtualNetworkApplianceManager.DEFAULT_ROUTER_VM_RAMSIZE); + int ssvmRamSize = NumbersUtil.parseInt(getConfigValue(conn, "secstorage.vm.ram.size"), 256); // SecondaryStorageVmManager.DEFAULT_SS_VM_RAMSIZE); pstmt = conn .prepareStatement("select h.id, count(v.id) from host h, vm_instance v where h.type='Routing' and v.state='Running' and v.`type`='ConsoleProxy' and v.host_id=h.id group by h.id"); @@ -1566,9 +1563,9 @@ public class Upgrade218to22 implements DbUpgrade { rs.close(); pstmt.close(); - int proxyCpuMhz = NumbersUtil.parseInt(getConfigValue(conn, "consoleproxy.cpu.mhz"), ConsoleProxyManager.DEFAULT_PROXY_VM_CPUMHZ); - int domrCpuMhz = NumbersUtil.parseInt(getConfigValue(conn, "router.cpu.mhz"), VpcVirtualNetworkApplianceManager.DEFAULT_ROUTER_CPU_MHZ); - int ssvmCpuMhz = NumbersUtil.parseInt(getConfigValue(conn, "secstorage.vm.cpu.mhz"), SecondaryStorageVmManager.DEFAULT_SS_VM_CPUMHZ); + int proxyCpuMhz = NumbersUtil.parseInt(getConfigValue(conn, "consoleproxy.cpu.mhz"), 500); // ConsoleProxyManager.DEFAULT_PROXY_VM_CPUMHZ); + int domrCpuMhz = NumbersUtil.parseInt(getConfigValue(conn, "router.cpu.mhz"), 500); // VpcVirtualNetworkApplianceManager.DEFAULT_ROUTER_CPU_MHZ); + int ssvmCpuMhz = NumbersUtil.parseInt(getConfigValue(conn, "secstorage.vm.cpu.mhz"), 500); // SecondaryStorageVmManager.DEFAULT_SS_VM_CPUMHZ); pstmt = conn .prepareStatement("select h.id, count(v.id) from host h, vm_instance v where h.type='Routing' and v.state='Running' and v.`type`='ConsoleProxy' and v.host_id=h.id group by h.id"); diff --git a/server/src/com/cloud/upgrade/dao/Upgrade218to224DomainVlans.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade218to224DomainVlans.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/Upgrade218to224DomainVlans.java rename to engine/schema/src/com/cloud/upgrade/dao/Upgrade218to224DomainVlans.java diff --git a/server/src/com/cloud/upgrade/dao/Upgrade218to22Premium.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade218to22Premium.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/Upgrade218to22Premium.java rename to engine/schema/src/com/cloud/upgrade/dao/Upgrade218to22Premium.java diff --git a/server/src/com/cloud/upgrade/dao/Upgrade2210to2211.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade2210to2211.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/Upgrade2210to2211.java rename to engine/schema/src/com/cloud/upgrade/dao/Upgrade2210to2211.java diff --git a/server/src/com/cloud/upgrade/dao/Upgrade2211to2212.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade2211to2212.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/Upgrade2211to2212.java rename to engine/schema/src/com/cloud/upgrade/dao/Upgrade2211to2212.java diff --git a/server/src/com/cloud/upgrade/dao/Upgrade2211to2212Premium.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade2211to2212Premium.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/Upgrade2211to2212Premium.java rename to engine/schema/src/com/cloud/upgrade/dao/Upgrade2211to2212Premium.java diff --git a/server/src/com/cloud/upgrade/dao/Upgrade2212to2213.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade2212to2213.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/Upgrade2212to2213.java rename to engine/schema/src/com/cloud/upgrade/dao/Upgrade2212to2213.java diff --git a/server/src/com/cloud/upgrade/dao/Upgrade2213to2214.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade2213to2214.java similarity index 96% rename from server/src/com/cloud/upgrade/dao/Upgrade2213to2214.java rename to engine/schema/src/com/cloud/upgrade/dao/Upgrade2213to2214.java index 48b08e41e0a..d3528e3335f 100644 --- a/server/src/com/cloud/upgrade/dao/Upgrade2213to2214.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade2213to2214.java @@ -26,9 +26,9 @@ import java.util.List; import org.apache.log4j.Logger; -import com.cloud.consoleproxy.ConsoleProxyManagerImpl; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.script.Script; +import com.cloud.vm.ConsoleProxyVO; public class Upgrade2213to2214 implements DbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade2213to2214.class); @@ -70,13 +70,13 @@ public class Upgrade2213to2214 implements DbUpgrade { if (privateKeyMd5.equalsIgnoreCase("432ea1370f57ccd774f4f36052c5fd73")) { s_logger.debug("Need to upgrade cloudstack provided certificate"); pstmt = conn.prepareStatement("update `cloud`.`keystore` set `cloud`.`keystore`.key = ?, certificate = ? where name = 'CPVMCertificate'"); - pstmt.setString(1, ConsoleProxyManagerImpl.keyContent); - pstmt.setString(2, ConsoleProxyManagerImpl.certContent); + pstmt.setString(1, ConsoleProxyVO.keyContent); + pstmt.setString(2, ConsoleProxyVO.certContent); pstmt.executeUpdate(); - + pstmt = conn.prepareStatement("insert into `cloud`.`keystore` (name, certificate, seq, domain_suffix) VALUES (?,?,?,?)"); pstmt.setString(1, "root"); - pstmt.setString(2, ConsoleProxyManagerImpl.rootCa); + pstmt.setString(2, ConsoleProxyVO.rootCa); pstmt.setInt(3, 0); pstmt.setString(4, "realhostip.com"); pstmt.executeUpdate(); @@ -87,7 +87,7 @@ public class Upgrade2213to2214 implements DbUpgrade { } catch (SQLException e) { s_logger.debug("Failed to upgrade keystore: " + e.toString()); } - + } @Override @@ -162,10 +162,10 @@ public class Upgrade2213to2214 implements DbUpgrade { pstmt.close(); } catch (SQLException e) { throw new CloudRuntimeException("Unable to execute changes for op_vm_ruleset_log", e); - } + } - //Drop i_async__removed, i_async_job__removed (if exists) and add i_async_job__removed + //Drop i_async__removed, i_async_job__removed (if exists) and add i_async_job__removed keys = new ArrayList(); keys.add("i_async__removed"); keys.add("i_async_job__removed"); @@ -177,21 +177,21 @@ public class Upgrade2213to2214 implements DbUpgrade { } catch (SQLException e) { throw new CloudRuntimeException("Unable to insert index for removed column in async_job", e); } - + keys = new ArrayList(); keys.add("fk_ssh_keypair__account_id"); keys.add("fk_ssh_keypair__domain_id"); keys.add("fk_ssh_keypairs__account_id"); keys.add("fk_ssh_keypairs__domain_id"); DbUpgradeUtils.dropKeysIfExist(conn, "ssh_keypairs", keys, true); - + keys = new ArrayList(); keys.add("fk_ssh_keypair__account_id"); keys.add("fk_ssh_keypair__domain_id"); keys.add("fk_ssh_keypairs__account_id"); keys.add("fk_ssh_keypairs__domain_id"); DbUpgradeUtils.dropKeysIfExist(conn, "ssh_keypairs", keys, false); - + try { PreparedStatement pstmt; pstmt = conn.prepareStatement("ALTER TABLE `cloud`.`ssh_keypairs` ADD CONSTRAINT `fk_ssh_keypairs__account_id` FOREIGN KEY `fk_ssh_keypairs__account_id` (`account_id`) REFERENCES `account` (`id`) ON DELETE CASCADE"); pstmt.executeUpdate(); @@ -199,7 +199,7 @@ public class Upgrade2213to2214 implements DbUpgrade { } catch (SQLException e) { throw new CloudRuntimeException("Unable to execute ssh_keypairs table update for adding account_id foreign key", e); } - + try { PreparedStatement pstmt; pstmt = conn.prepareStatement("ALTER TABLE `cloud`.`ssh_keypairs` ADD CONSTRAINT `fk_ssh_keypairs__domain_id` FOREIGN KEY `fk_ssh_keypairs__domain_id` (`domain_id`) REFERENCES `domain` (`id`) ON DELETE CASCADE"); pstmt.executeUpdate(); @@ -208,7 +208,7 @@ public class Upgrade2213to2214 implements DbUpgrade { throw new CloudRuntimeException("Unable to execute ssh_keypairs table update for adding domain_id foreign key", e); } - //Drop i_async__removed, i_async_job__removed (if exists) and add i_async_job__removed + //Drop i_async__removed, i_async_job__removed (if exists) and add i_async_job__removed keys = new ArrayList(); keys.add("i_async__removed"); keys.add("i_async_job__removed"); @@ -220,7 +220,7 @@ public class Upgrade2213to2214 implements DbUpgrade { } catch (SQLException e) { throw new CloudRuntimeException("Unable to insert index for removed column in async_job", e); } - + //Drop storage pool details keys (if exists) and insert one with correct name keys = new ArrayList(); keys.add("fk_storage_pool__pool_id"); @@ -234,7 +234,7 @@ public class Upgrade2213to2214 implements DbUpgrade { } catch (SQLException e) { throw new CloudRuntimeException("Unable to insert foreign key in storage_pool_details ", e); } - + //Drop securityGroup keys (if exists) and insert one with correct name keys = new ArrayList(); keys.add("fk_security_group___account_id"); @@ -248,21 +248,21 @@ public class Upgrade2213to2214 implements DbUpgrade { } catch (SQLException e) { throw new CloudRuntimeException("Unable to insert foreign key in security_group table ", e); } - + //Drop vmInstance keys (if exists) and insert one with correct name keys = new ArrayList(); keys.add("i_vm_instance__host_id"); keys.add("fk_vm_instance__host_id"); - + keys.add("fk_vm_instance__last_host_id"); keys.add("i_vm_instance__last_host_id"); - + keys.add("fk_vm_instance__service_offering_id"); keys.add("i_vm_instance__service_offering_id"); - + keys.add("fk_vm_instance__account_id"); keys.add("i_vm_instance__account_id"); - + DbUpgradeUtils.dropKeysIfExist(conn, "cloud.vm_instance", keys, true); DbUpgradeUtils.dropKeysIfExist(conn, "cloud.vm_instance", keys, false); try { @@ -278,18 +278,18 @@ public class Upgrade2213to2214 implements DbUpgrade { } catch (SQLException e) { throw new CloudRuntimeException("Unable to insert foreign key in vm_instance table ", e); } - + //Drop user_ip_address keys (if exists) and insert one with correct name keys = new ArrayList(); keys.add("fk_user_ip_address__account_id"); keys.add("i_user_ip_address__account_id"); - + keys.add("fk_user_ip_address__vlan_db_id"); keys.add("i_user_ip_address__vlan_db_id"); - + keys.add("fk_user_ip_address__data_center_id"); keys.add("i_user_ip_address__data_center_id"); - + DbUpgradeUtils.dropKeysIfExist(conn, "cloud.user_ip_address", keys, true); DbUpgradeUtils.dropKeysIfExist(conn, "cloud.user_ip_address", keys, false); try { diff --git a/server/src/com/cloud/upgrade/dao/Upgrade2214to30.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade2214to30.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/Upgrade2214to30.java rename to engine/schema/src/com/cloud/upgrade/dao/Upgrade2214to30.java diff --git a/server/src/com/cloud/upgrade/dao/Upgrade221to222.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade221to222.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/Upgrade221to222.java rename to engine/schema/src/com/cloud/upgrade/dao/Upgrade221to222.java diff --git a/server/src/com/cloud/upgrade/dao/Upgrade221to222Premium.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade221to222Premium.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/Upgrade221to222Premium.java rename to engine/schema/src/com/cloud/upgrade/dao/Upgrade221to222Premium.java diff --git a/server/src/com/cloud/upgrade/dao/Upgrade222to224.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade222to224.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/Upgrade222to224.java rename to engine/schema/src/com/cloud/upgrade/dao/Upgrade222to224.java diff --git a/server/src/com/cloud/upgrade/dao/Upgrade222to224Premium.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade222to224Premium.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/Upgrade222to224Premium.java rename to engine/schema/src/com/cloud/upgrade/dao/Upgrade222to224Premium.java diff --git a/server/src/com/cloud/upgrade/dao/Upgrade224to225.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade224to225.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/Upgrade224to225.java rename to engine/schema/src/com/cloud/upgrade/dao/Upgrade224to225.java diff --git a/server/src/com/cloud/upgrade/dao/Upgrade225to226.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade225to226.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/Upgrade225to226.java rename to engine/schema/src/com/cloud/upgrade/dao/Upgrade225to226.java diff --git a/server/src/com/cloud/upgrade/dao/Upgrade227to228.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade227to228.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/Upgrade227to228.java rename to engine/schema/src/com/cloud/upgrade/dao/Upgrade227to228.java diff --git a/server/src/com/cloud/upgrade/dao/Upgrade227to228Premium.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade227to228Premium.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/Upgrade227to228Premium.java rename to engine/schema/src/com/cloud/upgrade/dao/Upgrade227to228Premium.java diff --git a/server/src/com/cloud/upgrade/dao/Upgrade228to229.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade228to229.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/Upgrade228to229.java rename to engine/schema/src/com/cloud/upgrade/dao/Upgrade228to229.java diff --git a/server/src/com/cloud/upgrade/dao/Upgrade229to2210.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade229to2210.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/Upgrade229to2210.java rename to engine/schema/src/com/cloud/upgrade/dao/Upgrade229to2210.java diff --git a/server/src/com/cloud/upgrade/dao/Upgrade301to302.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade301to302.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/Upgrade301to302.java rename to engine/schema/src/com/cloud/upgrade/dao/Upgrade301to302.java diff --git a/server/src/com/cloud/upgrade/dao/Upgrade302to40.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade302to40.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/Upgrade302to40.java rename to engine/schema/src/com/cloud/upgrade/dao/Upgrade302to40.java diff --git a/server/src/com/cloud/upgrade/dao/Upgrade30to301.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade30to301.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/Upgrade30to301.java rename to engine/schema/src/com/cloud/upgrade/dao/Upgrade30to301.java diff --git a/server/src/com/cloud/upgrade/dao/Upgrade30xBase.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade30xBase.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/Upgrade30xBase.java rename to engine/schema/src/com/cloud/upgrade/dao/Upgrade30xBase.java diff --git a/server/src/com/cloud/upgrade/dao/Upgrade40to41.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade40to41.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/Upgrade40to41.java rename to engine/schema/src/com/cloud/upgrade/dao/Upgrade40to41.java diff --git a/server/src/com/cloud/upgrade/dao/Upgrade410to420.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/Upgrade410to420.java rename to engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java diff --git a/server/src/com/cloud/upgrade/dao/UpgradeSnapshot217to224.java b/engine/schema/src/com/cloud/upgrade/dao/UpgradeSnapshot217to224.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/UpgradeSnapshot217to224.java rename to engine/schema/src/com/cloud/upgrade/dao/UpgradeSnapshot217to224.java diff --git a/server/src/com/cloud/upgrade/dao/UpgradeSnapshot223to224.java b/engine/schema/src/com/cloud/upgrade/dao/UpgradeSnapshot223to224.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/UpgradeSnapshot223to224.java rename to engine/schema/src/com/cloud/upgrade/dao/UpgradeSnapshot223to224.java diff --git a/server/src/com/cloud/upgrade/dao/VersionDao.java b/engine/schema/src/com/cloud/upgrade/dao/VersionDao.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/VersionDao.java rename to engine/schema/src/com/cloud/upgrade/dao/VersionDao.java diff --git a/server/src/com/cloud/upgrade/dao/VersionDaoImpl.java b/engine/schema/src/com/cloud/upgrade/dao/VersionDaoImpl.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/VersionDaoImpl.java rename to engine/schema/src/com/cloud/upgrade/dao/VersionDaoImpl.java diff --git a/server/src/com/cloud/upgrade/dao/VersionVO.java b/engine/schema/src/com/cloud/upgrade/dao/VersionVO.java similarity index 100% rename from server/src/com/cloud/upgrade/dao/VersionVO.java rename to engine/schema/src/com/cloud/upgrade/dao/VersionVO.java diff --git a/server/src/com/cloud/usage/ExternalPublicIpStatisticsVO.java b/engine/schema/src/com/cloud/usage/ExternalPublicIpStatisticsVO.java similarity index 100% rename from server/src/com/cloud/usage/ExternalPublicIpStatisticsVO.java rename to engine/schema/src/com/cloud/usage/ExternalPublicIpStatisticsVO.java diff --git a/server/src/com/cloud/usage/UsageIPAddressVO.java b/engine/schema/src/com/cloud/usage/UsageIPAddressVO.java similarity index 100% rename from server/src/com/cloud/usage/UsageIPAddressVO.java rename to engine/schema/src/com/cloud/usage/UsageIPAddressVO.java diff --git a/server/src/com/cloud/usage/UsageJobVO.java b/engine/schema/src/com/cloud/usage/UsageJobVO.java similarity index 100% rename from server/src/com/cloud/usage/UsageJobVO.java rename to engine/schema/src/com/cloud/usage/UsageJobVO.java diff --git a/server/src/com/cloud/usage/UsageLoadBalancerPolicyVO.java b/engine/schema/src/com/cloud/usage/UsageLoadBalancerPolicyVO.java similarity index 100% rename from server/src/com/cloud/usage/UsageLoadBalancerPolicyVO.java rename to engine/schema/src/com/cloud/usage/UsageLoadBalancerPolicyVO.java diff --git a/server/src/com/cloud/usage/UsageNetworkOfferingVO.java b/engine/schema/src/com/cloud/usage/UsageNetworkOfferingVO.java similarity index 100% rename from server/src/com/cloud/usage/UsageNetworkOfferingVO.java rename to engine/schema/src/com/cloud/usage/UsageNetworkOfferingVO.java diff --git a/server/src/com/cloud/usage/UsageNetworkVO.java b/engine/schema/src/com/cloud/usage/UsageNetworkVO.java similarity index 100% rename from server/src/com/cloud/usage/UsageNetworkVO.java rename to engine/schema/src/com/cloud/usage/UsageNetworkVO.java diff --git a/server/src/com/cloud/usage/UsagePortForwardingRuleVO.java b/engine/schema/src/com/cloud/usage/UsagePortForwardingRuleVO.java similarity index 100% rename from server/src/com/cloud/usage/UsagePortForwardingRuleVO.java rename to engine/schema/src/com/cloud/usage/UsagePortForwardingRuleVO.java diff --git a/server/src/com/cloud/usage/UsageSecurityGroupVO.java b/engine/schema/src/com/cloud/usage/UsageSecurityGroupVO.java similarity index 100% rename from server/src/com/cloud/usage/UsageSecurityGroupVO.java rename to engine/schema/src/com/cloud/usage/UsageSecurityGroupVO.java diff --git a/server/src/com/cloud/usage/UsageStorageVO.java b/engine/schema/src/com/cloud/usage/UsageStorageVO.java similarity index 100% rename from server/src/com/cloud/usage/UsageStorageVO.java rename to engine/schema/src/com/cloud/usage/UsageStorageVO.java diff --git a/server/src/com/cloud/usage/UsageVMInstanceVO.java b/engine/schema/src/com/cloud/usage/UsageVMInstanceVO.java similarity index 100% rename from server/src/com/cloud/usage/UsageVMInstanceVO.java rename to engine/schema/src/com/cloud/usage/UsageVMInstanceVO.java diff --git a/server/src/com/cloud/usage/UsageVO.java b/engine/schema/src/com/cloud/usage/UsageVO.java similarity index 100% rename from server/src/com/cloud/usage/UsageVO.java rename to engine/schema/src/com/cloud/usage/UsageVO.java diff --git a/server/src/com/cloud/usage/UsageVPNUserVO.java b/engine/schema/src/com/cloud/usage/UsageVPNUserVO.java similarity index 100% rename from server/src/com/cloud/usage/UsageVPNUserVO.java rename to engine/schema/src/com/cloud/usage/UsageVPNUserVO.java diff --git a/server/src/com/cloud/usage/UsageVolumeVO.java b/engine/schema/src/com/cloud/usage/UsageVolumeVO.java similarity index 100% rename from server/src/com/cloud/usage/UsageVolumeVO.java rename to engine/schema/src/com/cloud/usage/UsageVolumeVO.java diff --git a/server/src/com/cloud/usage/dao/ExternalPublicIpStatisticsDao.java b/engine/schema/src/com/cloud/usage/dao/ExternalPublicIpStatisticsDao.java similarity index 100% rename from server/src/com/cloud/usage/dao/ExternalPublicIpStatisticsDao.java rename to engine/schema/src/com/cloud/usage/dao/ExternalPublicIpStatisticsDao.java diff --git a/server/src/com/cloud/usage/dao/ExternalPublicIpStatisticsDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/ExternalPublicIpStatisticsDaoImpl.java similarity index 100% rename from server/src/com/cloud/usage/dao/ExternalPublicIpStatisticsDaoImpl.java rename to engine/schema/src/com/cloud/usage/dao/ExternalPublicIpStatisticsDaoImpl.java diff --git a/server/src/com/cloud/usage/dao/UsageDao.java b/engine/schema/src/com/cloud/usage/dao/UsageDao.java similarity index 70% rename from server/src/com/cloud/usage/dao/UsageDao.java rename to engine/schema/src/com/cloud/usage/dao/UsageDao.java index a25b0dc78ef..6d0c162b52b 100644 --- a/server/src/com/cloud/usage/dao/UsageDao.java +++ b/engine/schema/src/com/cloud/usage/dao/UsageDao.java @@ -16,11 +16,8 @@ // under the License. package com.cloud.usage.dao; -import java.util.Date; import java.util.List; -import com.cloud.event.UsageEventVO; -import com.cloud.exception.UsageServerException; import com.cloud.usage.UsageVO; import com.cloud.user.AccountVO; import com.cloud.user.UserStatisticsVO; @@ -31,11 +28,12 @@ import com.cloud.utils.db.SearchCriteria; public interface UsageDao extends GenericDao { void deleteRecordsForAccount(Long accountId); List searchAllRecords(SearchCriteria sc, Filter filter); - void saveAccounts(List accounts) throws UsageServerException; - void updateAccounts(List accounts) throws UsageServerException; - void saveUserStats(List userStats) throws UsageServerException; - void updateUserStats(List userStats) throws UsageServerException; - Long getLastAccountId() throws UsageServerException; - Long getLastUserStatsId() throws UsageServerException; + + void saveAccounts(List accounts); + void updateAccounts(List accounts); + void saveUserStats(List userStats); + void updateUserStats(List userStats); + Long getLastAccountId(); + Long getLastUserStatsId(); List listPublicTemplatesByAccount(long accountId); } diff --git a/server/src/com/cloud/usage/dao/UsageDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageDaoImpl.java similarity index 94% rename from server/src/com/cloud/usage/dao/UsageDaoImpl.java rename to engine/schema/src/com/cloud/usage/dao/UsageDaoImpl.java index f9ae70c1f20..a5867f0656e 100644 --- a/server/src/com/cloud/usage/dao/UsageDaoImpl.java +++ b/engine/schema/src/com/cloud/usage/dao/UsageDaoImpl.java @@ -29,7 +29,6 @@ import javax.ejb.Local; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; -import com.cloud.exception.UsageServerException; import com.cloud.usage.UsageVO; import com.cloud.user.AccountVO; import com.cloud.user.UserStatisticsVO; @@ -38,6 +37,7 @@ import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; +import com.cloud.utils.exception.CloudRuntimeException; @Component @Local(value={UsageDao.class}) @@ -60,7 +60,8 @@ public class UsageDaoImpl extends GenericDaoBase implements Usage public UsageDaoImpl () {} - public void deleteRecordsForAccount(Long accountId) { + @Override + public void deleteRecordsForAccount(Long accountId) { String sql = ((accountId == null) ? DELETE_ALL : DELETE_ALL_BY_ACCOUNTID); Transaction txn = Transaction.open(Transaction.USAGE_DB); PreparedStatement pstmt = null; @@ -86,7 +87,7 @@ public class UsageDaoImpl extends GenericDaoBase implements Usage } @Override - public void saveAccounts(List accounts) throws UsageServerException { + public void saveAccounts(List accounts) { Transaction txn = Transaction.currentTxn(); try { txn.start(); @@ -115,12 +116,12 @@ public class UsageDaoImpl extends GenericDaoBase implements Usage } catch (Exception ex) { txn.rollback(); s_logger.error("error saving account to cloud_usage db", ex); - throw new UsageServerException(ex.getMessage()); + throw new CloudRuntimeException(ex.getMessage()); } } @Override - public void updateAccounts(List accounts) throws UsageServerException { + public void updateAccounts(List accounts) { Transaction txn = Transaction.currentTxn(); try { txn.start(); @@ -145,12 +146,12 @@ public class UsageDaoImpl extends GenericDaoBase implements Usage } catch (Exception ex) { txn.rollback(); s_logger.error("error saving account to cloud_usage db", ex); - throw new UsageServerException(ex.getMessage()); + throw new CloudRuntimeException(ex.getMessage()); } } @Override - public void saveUserStats(List userStats) throws UsageServerException { + public void saveUserStats(List userStats) { Transaction txn = Transaction.currentTxn(); try { txn.start(); @@ -186,12 +187,12 @@ public class UsageDaoImpl extends GenericDaoBase implements Usage } catch (Exception ex) { txn.rollback(); s_logger.error("error saving user stats to cloud_usage db", ex); - throw new UsageServerException(ex.getMessage()); + throw new CloudRuntimeException(ex.getMessage()); } } @Override - public void updateUserStats(List userStats) throws UsageServerException { + public void updateUserStats(List userStats) { Transaction txn = Transaction.currentTxn(); try { txn.start(); @@ -213,7 +214,7 @@ public class UsageDaoImpl extends GenericDaoBase implements Usage } catch (Exception ex) { txn.rollback(); s_logger.error("error saving user stats to cloud_usage db", ex); - throw new UsageServerException(ex.getMessage()); + throw new CloudRuntimeException(ex.getMessage()); } } @@ -250,7 +251,7 @@ public class UsageDaoImpl extends GenericDaoBase implements Usage } return null; } - + @Override public List listPublicTemplatesByAccount(long accountId) { Transaction txn = Transaction.currentTxn(); diff --git a/server/src/com/cloud/usage/dao/UsageIPAddressDao.java b/engine/schema/src/com/cloud/usage/dao/UsageIPAddressDao.java similarity index 100% rename from server/src/com/cloud/usage/dao/UsageIPAddressDao.java rename to engine/schema/src/com/cloud/usage/dao/UsageIPAddressDao.java diff --git a/server/src/com/cloud/usage/dao/UsageIPAddressDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageIPAddressDaoImpl.java similarity index 100% rename from server/src/com/cloud/usage/dao/UsageIPAddressDaoImpl.java rename to engine/schema/src/com/cloud/usage/dao/UsageIPAddressDaoImpl.java diff --git a/server/src/com/cloud/usage/dao/UsageJobDao.java b/engine/schema/src/com/cloud/usage/dao/UsageJobDao.java similarity index 92% rename from server/src/com/cloud/usage/dao/UsageJobDao.java rename to engine/schema/src/com/cloud/usage/dao/UsageJobDao.java index 6921046610b..9ec391804f2 100644 --- a/server/src/com/cloud/usage/dao/UsageJobDao.java +++ b/engine/schema/src/com/cloud/usage/dao/UsageJobDao.java @@ -18,7 +18,6 @@ package com.cloud.usage.dao; import java.util.Date; -import com.cloud.exception.UsageServerException; import com.cloud.usage.UsageJobVO; import com.cloud.utils.db.GenericDao; @@ -30,5 +29,6 @@ public interface UsageJobDao extends GenericDao { long getLastJobSuccessDateMillis(); Date getLastHeartbeat(); UsageJobVO isOwner(String hostname, int pid); - void updateJobSuccess(Long jobId, long startMillis, long endMillis, long execTime, boolean success) throws UsageServerException; + + void updateJobSuccess(Long jobId, long startMillis, long endMillis, long execTime, boolean success); } diff --git a/server/src/com/cloud/usage/dao/UsageJobDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageJobDaoImpl.java similarity index 97% rename from server/src/com/cloud/usage/dao/UsageJobDaoImpl.java rename to engine/schema/src/com/cloud/usage/dao/UsageJobDaoImpl.java index 3c7a3dc110d..783300faeed 100644 --- a/server/src/com/cloud/usage/dao/UsageJobDaoImpl.java +++ b/engine/schema/src/com/cloud/usage/dao/UsageJobDaoImpl.java @@ -26,12 +26,12 @@ import javax.ejb.Local; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; -import com.cloud.exception.UsageServerException; import com.cloud.usage.UsageJobVO; import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; +import com.cloud.utils.exception.CloudRuntimeException; @Component @Local(value={UsageJobDao.class}) @@ -60,7 +60,7 @@ public class UsageJobDaoImpl extends GenericDaoBase implements } @Override - public void updateJobSuccess(Long jobId, long startMillis, long endMillis, long execTime, boolean success) throws UsageServerException { + public void updateJobSuccess(Long jobId, long startMillis, long endMillis, long execTime, boolean success) { Transaction txn = Transaction.open(Transaction.USAGE_DB); try { txn.start(); @@ -79,7 +79,7 @@ public class UsageJobDaoImpl extends GenericDaoBase implements } catch (Exception ex) { txn.rollback(); s_logger.error("error updating job success date", ex); - throw new UsageServerException(ex.getMessage()); + throw new CloudRuntimeException(ex.getMessage()); } finally { txn.close(); } diff --git a/server/src/com/cloud/usage/dao/UsageLoadBalancerPolicyDao.java b/engine/schema/src/com/cloud/usage/dao/UsageLoadBalancerPolicyDao.java similarity index 100% rename from server/src/com/cloud/usage/dao/UsageLoadBalancerPolicyDao.java rename to engine/schema/src/com/cloud/usage/dao/UsageLoadBalancerPolicyDao.java diff --git a/server/src/com/cloud/usage/dao/UsageLoadBalancerPolicyDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageLoadBalancerPolicyDaoImpl.java similarity index 100% rename from server/src/com/cloud/usage/dao/UsageLoadBalancerPolicyDaoImpl.java rename to engine/schema/src/com/cloud/usage/dao/UsageLoadBalancerPolicyDaoImpl.java diff --git a/server/src/com/cloud/usage/dao/UsageNetworkDao.java b/engine/schema/src/com/cloud/usage/dao/UsageNetworkDao.java similarity index 100% rename from server/src/com/cloud/usage/dao/UsageNetworkDao.java rename to engine/schema/src/com/cloud/usage/dao/UsageNetworkDao.java diff --git a/server/src/com/cloud/usage/dao/UsageNetworkDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageNetworkDaoImpl.java similarity index 100% rename from server/src/com/cloud/usage/dao/UsageNetworkDaoImpl.java rename to engine/schema/src/com/cloud/usage/dao/UsageNetworkDaoImpl.java diff --git a/server/src/com/cloud/usage/dao/UsageNetworkOfferingDao.java b/engine/schema/src/com/cloud/usage/dao/UsageNetworkOfferingDao.java similarity index 100% rename from server/src/com/cloud/usage/dao/UsageNetworkOfferingDao.java rename to engine/schema/src/com/cloud/usage/dao/UsageNetworkOfferingDao.java diff --git a/server/src/com/cloud/usage/dao/UsageNetworkOfferingDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageNetworkOfferingDaoImpl.java similarity index 100% rename from server/src/com/cloud/usage/dao/UsageNetworkOfferingDaoImpl.java rename to engine/schema/src/com/cloud/usage/dao/UsageNetworkOfferingDaoImpl.java diff --git a/server/src/com/cloud/usage/dao/UsagePortForwardingRuleDao.java b/engine/schema/src/com/cloud/usage/dao/UsagePortForwardingRuleDao.java similarity index 100% rename from server/src/com/cloud/usage/dao/UsagePortForwardingRuleDao.java rename to engine/schema/src/com/cloud/usage/dao/UsagePortForwardingRuleDao.java diff --git a/server/src/com/cloud/usage/dao/UsagePortForwardingRuleDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsagePortForwardingRuleDaoImpl.java similarity index 100% rename from server/src/com/cloud/usage/dao/UsagePortForwardingRuleDaoImpl.java rename to engine/schema/src/com/cloud/usage/dao/UsagePortForwardingRuleDaoImpl.java diff --git a/server/src/com/cloud/usage/dao/UsageSecurityGroupDao.java b/engine/schema/src/com/cloud/usage/dao/UsageSecurityGroupDao.java similarity index 100% rename from server/src/com/cloud/usage/dao/UsageSecurityGroupDao.java rename to engine/schema/src/com/cloud/usage/dao/UsageSecurityGroupDao.java diff --git a/server/src/com/cloud/usage/dao/UsageSecurityGroupDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageSecurityGroupDaoImpl.java similarity index 100% rename from server/src/com/cloud/usage/dao/UsageSecurityGroupDaoImpl.java rename to engine/schema/src/com/cloud/usage/dao/UsageSecurityGroupDaoImpl.java diff --git a/server/src/com/cloud/usage/dao/UsageStorageDao.java b/engine/schema/src/com/cloud/usage/dao/UsageStorageDao.java similarity index 100% rename from server/src/com/cloud/usage/dao/UsageStorageDao.java rename to engine/schema/src/com/cloud/usage/dao/UsageStorageDao.java diff --git a/server/src/com/cloud/usage/dao/UsageStorageDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageStorageDaoImpl.java similarity index 100% rename from server/src/com/cloud/usage/dao/UsageStorageDaoImpl.java rename to engine/schema/src/com/cloud/usage/dao/UsageStorageDaoImpl.java diff --git a/server/src/com/cloud/usage/dao/UsageVMInstanceDao.java b/engine/schema/src/com/cloud/usage/dao/UsageVMInstanceDao.java similarity index 100% rename from server/src/com/cloud/usage/dao/UsageVMInstanceDao.java rename to engine/schema/src/com/cloud/usage/dao/UsageVMInstanceDao.java diff --git a/server/src/com/cloud/usage/dao/UsageVMInstanceDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageVMInstanceDaoImpl.java similarity index 100% rename from server/src/com/cloud/usage/dao/UsageVMInstanceDaoImpl.java rename to engine/schema/src/com/cloud/usage/dao/UsageVMInstanceDaoImpl.java diff --git a/server/src/com/cloud/usage/dao/UsageVPNUserDao.java b/engine/schema/src/com/cloud/usage/dao/UsageVPNUserDao.java similarity index 100% rename from server/src/com/cloud/usage/dao/UsageVPNUserDao.java rename to engine/schema/src/com/cloud/usage/dao/UsageVPNUserDao.java diff --git a/server/src/com/cloud/usage/dao/UsageVPNUserDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageVPNUserDaoImpl.java similarity index 100% rename from server/src/com/cloud/usage/dao/UsageVPNUserDaoImpl.java rename to engine/schema/src/com/cloud/usage/dao/UsageVPNUserDaoImpl.java diff --git a/server/src/com/cloud/usage/dao/UsageVolumeDao.java b/engine/schema/src/com/cloud/usage/dao/UsageVolumeDao.java similarity index 100% rename from server/src/com/cloud/usage/dao/UsageVolumeDao.java rename to engine/schema/src/com/cloud/usage/dao/UsageVolumeDao.java diff --git a/server/src/com/cloud/usage/dao/UsageVolumeDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageVolumeDaoImpl.java similarity index 100% rename from server/src/com/cloud/usage/dao/UsageVolumeDaoImpl.java rename to engine/schema/src/com/cloud/usage/dao/UsageVolumeDaoImpl.java diff --git a/server/src/com/cloud/user/AccountDetailVO.java b/engine/schema/src/com/cloud/user/AccountDetailVO.java similarity index 100% rename from server/src/com/cloud/user/AccountDetailVO.java rename to engine/schema/src/com/cloud/user/AccountDetailVO.java diff --git a/server/src/com/cloud/user/AccountDetailsDao.java b/engine/schema/src/com/cloud/user/AccountDetailsDao.java similarity index 100% rename from server/src/com/cloud/user/AccountDetailsDao.java rename to engine/schema/src/com/cloud/user/AccountDetailsDao.java diff --git a/server/src/com/cloud/user/AccountDetailsDaoImpl.java b/engine/schema/src/com/cloud/user/AccountDetailsDaoImpl.java similarity index 100% rename from server/src/com/cloud/user/AccountDetailsDaoImpl.java rename to engine/schema/src/com/cloud/user/AccountDetailsDaoImpl.java diff --git a/server/src/com/cloud/user/dao/AccountDao.java b/engine/schema/src/com/cloud/user/dao/AccountDao.java similarity index 100% rename from server/src/com/cloud/user/dao/AccountDao.java rename to engine/schema/src/com/cloud/user/dao/AccountDao.java diff --git a/server/src/com/cloud/user/dao/AccountDaoImpl.java b/engine/schema/src/com/cloud/user/dao/AccountDaoImpl.java similarity index 100% rename from server/src/com/cloud/user/dao/AccountDaoImpl.java rename to engine/schema/src/com/cloud/user/dao/AccountDaoImpl.java diff --git a/server/src/com/cloud/user/dao/SSHKeyPairDao.java b/engine/schema/src/com/cloud/user/dao/SSHKeyPairDao.java similarity index 100% rename from server/src/com/cloud/user/dao/SSHKeyPairDao.java rename to engine/schema/src/com/cloud/user/dao/SSHKeyPairDao.java diff --git a/server/src/com/cloud/user/dao/SSHKeyPairDaoImpl.java b/engine/schema/src/com/cloud/user/dao/SSHKeyPairDaoImpl.java similarity index 100% rename from server/src/com/cloud/user/dao/SSHKeyPairDaoImpl.java rename to engine/schema/src/com/cloud/user/dao/SSHKeyPairDaoImpl.java diff --git a/server/src/com/cloud/user/dao/UserAccountDao.java b/engine/schema/src/com/cloud/user/dao/UserAccountDao.java similarity index 100% rename from server/src/com/cloud/user/dao/UserAccountDao.java rename to engine/schema/src/com/cloud/user/dao/UserAccountDao.java diff --git a/server/src/com/cloud/user/dao/UserAccountDaoImpl.java b/engine/schema/src/com/cloud/user/dao/UserAccountDaoImpl.java similarity index 100% rename from server/src/com/cloud/user/dao/UserAccountDaoImpl.java rename to engine/schema/src/com/cloud/user/dao/UserAccountDaoImpl.java diff --git a/server/src/com/cloud/user/dao/UserDao.java b/engine/schema/src/com/cloud/user/dao/UserDao.java similarity index 100% rename from server/src/com/cloud/user/dao/UserDao.java rename to engine/schema/src/com/cloud/user/dao/UserDao.java diff --git a/server/src/com/cloud/user/dao/UserDaoImpl.java b/engine/schema/src/com/cloud/user/dao/UserDaoImpl.java similarity index 100% rename from server/src/com/cloud/user/dao/UserDaoImpl.java rename to engine/schema/src/com/cloud/user/dao/UserDaoImpl.java diff --git a/server/src/com/cloud/user/dao/UserStatisticsDao.java b/engine/schema/src/com/cloud/user/dao/UserStatisticsDao.java similarity index 100% rename from server/src/com/cloud/user/dao/UserStatisticsDao.java rename to engine/schema/src/com/cloud/user/dao/UserStatisticsDao.java diff --git a/server/src/com/cloud/user/dao/UserStatisticsDaoImpl.java b/engine/schema/src/com/cloud/user/dao/UserStatisticsDaoImpl.java similarity index 100% rename from server/src/com/cloud/user/dao/UserStatisticsDaoImpl.java rename to engine/schema/src/com/cloud/user/dao/UserStatisticsDaoImpl.java diff --git a/server/src/com/cloud/user/dao/UserStatsLogDao.java b/engine/schema/src/com/cloud/user/dao/UserStatsLogDao.java similarity index 100% rename from server/src/com/cloud/user/dao/UserStatsLogDao.java rename to engine/schema/src/com/cloud/user/dao/UserStatsLogDao.java diff --git a/server/src/com/cloud/user/dao/UserStatsLogDaoImpl.java b/engine/schema/src/com/cloud/user/dao/UserStatsLogDaoImpl.java similarity index 100% rename from server/src/com/cloud/user/dao/UserStatsLogDaoImpl.java rename to engine/schema/src/com/cloud/user/dao/UserStatsLogDaoImpl.java diff --git a/engine/schema/src/com/cloud/vm/ConsoleProxyVO.java b/engine/schema/src/com/cloud/vm/ConsoleProxyVO.java new file mode 100644 index 00000000000..5c1da4855cd --- /dev/null +++ b/engine/schema/src/com/cloud/vm/ConsoleProxyVO.java @@ -0,0 +1,287 @@ +// 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 java.util.Date; + +import javax.persistence.Column; +import javax.persistence.DiscriminatorValue; +import javax.persistence.Entity; +import javax.persistence.PrimaryKeyJoinColumn; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Transient; + +import com.cloud.hypervisor.Hypervisor.HypervisorType; + +/** + * ConsoleProxyVO domain object + */ + +@Entity +@Table(name = "console_proxy") +@PrimaryKeyJoinColumn(name = "id") +@DiscriminatorValue(value = "ConsoleProxy") +public class ConsoleProxyVO extends VMInstanceVO implements ConsoleProxy { + public static final String keyContent = + "-----BEGIN PRIVATE KEY-----\n" + + "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCDT9AtEfs+s/I8QXp6rrCw0iNJ\n" + + "0+GgsybNHheU+JpL39LMTZykCrZhZnyDvwdxCoOfE38Sa32baHKNds+y2SHnMNsOkw8OcNucHEBX\n" + + "1FIpOBGph9D6xC+umx9od6xMWETUv7j6h2u+WC3OhBM8fHCBqIiAol31/IkcqDxxsHlQ8S/oCfTl\n" + + "XJUY6Yn628OA1XijKdRnadV0hZ829cv/PZKljjwQUTyrd0KHQeksBH+YAYSo2JUl8ekNLsOi8/cP\n" + + "tfojnltzRI1GXi0ZONs8VnDzJ0a2gqZY+uxlz+CGbLnGnlN4j9cBpE+MfUE+35Dq121sTpsSgF85\n" + + "Mz+pVhn2S633AgMBAAECggEAH/Szd9RxbVADenCA6wxKSa3KErRyq1YN8ksJeCKMAj0FIt0caruE\n" + + "qO11DebWW8cwQu1Otl/cYI6pmg24/BBldMrp9IELX/tNJo+lhPpRyGAxxC0eSXinFfoASb8d+jJd\n" + + "Bd1mmemM6fSxqRlxSP4LrzIhjhR1g2CiyYuTsiM9UtoVKGyHwe7KfFwirUOJo3Mr18zUVNm7YqY4\n" + + "IVhOSq59zkH3ULBlYq4bG50jpxa5mNSCZ7IpafPY/kE/CbR+FWNt30+rk69T+qb5abg6+XGm+OAm\n" + + "bnQ18yZEqX6nJLk7Ch0cfA5orGgrTMOrM71wK7tBBDQ308kOxDGebx6j0qD36QKBgQDTRDr8kuhA\n" + + "9sUyKr9vk2DQCMpNvEeiwI3JRMqmmxpNAtg01aJ3Ya57vX5Fc+zcuV87kP6FM1xgpHQvnw5LWo2J\n" + + "s7ANwQcP8ricEW5zkZhSjI4ssMeAubmsHOloGxmLFYZqwx0JI7CWViGTLMcUlqKblmHcjeQDeDfP\n" + + "P1TaCItFmwKBgQCfHZwVvIcaDs5vxVpZ4ftvflIrW8qq0uOVK6QIf9A/YTGhCXl2qxxTg2A6+0rg\n" + + "ZqI7zKzUDxIbVv0KlgCbpHDC9d5+sdtDB3wW2pimuJ3p1z4/RHb4n/lDwXCACZl1S5l24yXX2pFZ\n" + + "wdPCXmy5PYkHMssFLNhI24pprUIQs66M1QKBgQDQwjAjWisD3pRXESSfZRsaFkWJcM28hdbVFhPF\n" + + "c6gWhwQLmTp0CuL2RPXcPUPFi6sN2iWWi3zxxi9Eyz+9uBn6AsOpo56N5MME/LiOnETO9TKb+Ib6\n" + + "rQtKhjshcv3XkIqFPo2XdVvOAgglPO7vajX91iiXXuH7h7RmJud6l0y/lwKBgE+bi90gLuPtpoEr\n" + + "VzIDKz40ED5bNYHT80NNy0rpT7J2GVN9nwStRYXPBBVeZq7xCpgqpgmO5LtDAWULeZBlbHlOdBwl\n" + + "NhNKKl5wzdEUKwW0yBL1WSS5PQgWPwgARYP25/ggW22sj+49WIo1neXsEKPGWObk8e050f1fTt92\n" + + "Vo1lAoGAb1gCoyBCzvi7sqFxm4V5oapnJeiQQJFjhoYWqGa26rQ+AvXXNuBcigIeDXNJPctSF0Uc\n" + + "p11KbbCgiruBbckvM1vGsk6Sx4leRk+IFHRpJktFUek4o0eUg0shOsyyvyet48Dfg0a8FvcxROs0\n" + + "gD+IYds5doiob/hcm1hnNB/3vk4=\n" + + "-----END PRIVATE KEY-----\n"; + + public static final String certContent = + "-----BEGIN CERTIFICATE-----\n" + + "MIIFZTCCBE2gAwIBAgIHKBCduBUoKDANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE\n" + + "BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY\n" + + "BgNVBAoTEUdvRGFkZHkuY29tLCBJbmMuMTMwMQYDVQQLEypodHRwOi8vY2VydGlm\n" + + "aWNhdGVzLmdvZGFkZHkuY29tL3JlcG9zaXRvcnkxMDAuBgNVBAMTJ0dvIERhZGR5\n" + + "IFNlY3VyZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTERMA8GA1UEBRMIMDc5Njky\n" + + "ODcwHhcNMTIwMjAzMDMzMDQwWhcNMTcwMjA3MDUxMTIzWjBZMRkwFwYDVQQKDBAq\n" + + "LnJlYWxob3N0aXAuY29tMSEwHwYDVQQLDBhEb21haW4gQ29udHJvbCBWYWxpZGF0\n" + + "ZWQxGTAXBgNVBAMMECoucmVhbGhvc3RpcC5jb20wggEiMA0GCSqGSIb3DQEBAQUA\n" + + "A4IBDwAwggEKAoIBAQCDT9AtEfs+s/I8QXp6rrCw0iNJ0+GgsybNHheU+JpL39LM\n" + + "TZykCrZhZnyDvwdxCoOfE38Sa32baHKNds+y2SHnMNsOkw8OcNucHEBX1FIpOBGp\n" + + "h9D6xC+umx9od6xMWETUv7j6h2u+WC3OhBM8fHCBqIiAol31/IkcqDxxsHlQ8S/o\n" + + "CfTlXJUY6Yn628OA1XijKdRnadV0hZ829cv/PZKljjwQUTyrd0KHQeksBH+YAYSo\n" + + "2JUl8ekNLsOi8/cPtfojnltzRI1GXi0ZONs8VnDzJ0a2gqZY+uxlz+CGbLnGnlN4\n" + + "j9cBpE+MfUE+35Dq121sTpsSgF85Mz+pVhn2S633AgMBAAGjggG+MIIBujAPBgNV\n" + + "HRMBAf8EBTADAQEAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAOBgNV\n" + + "HQ8BAf8EBAMCBaAwMwYDVR0fBCwwKjAooCagJIYiaHR0cDovL2NybC5nb2RhZGR5\n" + + "LmNvbS9nZHMxLTY0LmNybDBTBgNVHSAETDBKMEgGC2CGSAGG/W0BBxcBMDkwNwYI\n" + + "KwYBBQUHAgEWK2h0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3Np\n" + + "dG9yeS8wgYAGCCsGAQUFBwEBBHQwcjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3Au\n" + + "Z29kYWRkeS5jb20vMEoGCCsGAQUFBzAChj5odHRwOi8vY2VydGlmaWNhdGVzLmdv\n" + + "ZGFkZHkuY29tL3JlcG9zaXRvcnkvZ2RfaW50ZXJtZWRpYXRlLmNydDAfBgNVHSME\n" + + "GDAWgBT9rGEyk2xF1uLuhV+auud2mWjM5zArBgNVHREEJDAighAqLnJlYWxob3N0\n" + + "aXAuY29tgg5yZWFsaG9zdGlwLmNvbTAdBgNVHQ4EFgQUZyJz9/QLy5TWIIscTXID\n" + + "E8Xk47YwDQYJKoZIhvcNAQEFBQADggEBAKiUV3KK16mP0NpS92fmQkCLqm+qUWyN\n" + + "BfBVgf9/M5pcT8EiTZlS5nAtzAE/eRpBeR3ubLlaAogj4rdH7YYVJcDDLLoB2qM3\n" + + "qeCHu8LFoblkb93UuFDWqRaVPmMlJRnhsRkL1oa2gM2hwQTkBDkP7w5FG1BELCgl\n" + + "gZI2ij2yxjge6pOEwSyZCzzbCcg9pN+dNrYyGEtB4k+BBnPA3N4r14CWbk+uxjrQ\n" + + "6j2Ip+b7wOc5IuMEMl8xwTyjuX3lsLbAZyFI9RCyofwA9NqIZ1GeB6Zd196rubQp\n" + + "93cmBqGGjZUs3wMrGlm7xdjlX6GQ9UvmvkMub9+lL99A5W50QgCmFeI=\n" + + "-----END CERTIFICATE-----\n"; + + public static final String rootCa = + "-----BEGIN CERTIFICATE-----\n" + + "MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx\n" + + "ITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g\n" + + "RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMTYw\n" + + "MTU0MzdaFw0yNjExMTYwMTU0MzdaMIHKMQswCQYDVQQGEwJVUzEQMA4GA1UECBMH\n" + + "QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5j\n" + + "b20sIEluYy4xMzAxBgNVBAsTKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5j\n" + + "b20vcmVwb3NpdG9yeTEwMC4GA1UEAxMnR28gRGFkZHkgU2VjdXJlIENlcnRpZmlj\n" + + "YXRpb24gQXV0aG9yaXR5MREwDwYDVQQFEwgwNzk2OTI4NzCCASIwDQYJKoZIhvcN\n" + + "AQEBBQADggEPADCCAQoCggEBAMQt1RWMnCZM7DI161+4WQFapmGBWTtwY6vj3D3H\n" + + "KrjJM9N55DrtPDAjhI6zMBS2sofDPZVUBJ7fmd0LJR4h3mUpfjWoqVTr9vcyOdQm\n" + + "VZWt7/v+WIbXnvQAjYwqDL1CBM6nPwT27oDyqu9SoWlm2r4arV3aLGbqGmu75RpR\n" + + "SgAvSMeYddi5Kcju+GZtCpyz8/x4fKL4o/K1w/O5epHBp+YlLpyo7RJlbmr2EkRT\n" + + "cDCVw5wrWCs9CHRK8r5RsL+H0EwnWGu1NcWdrxcx+AuP7q2BNgWJCJjPOq8lh8BJ\n" + + "6qf9Z/dFjpfMFDniNoW1fho3/Rb2cRGadDAW/hOUoz+EDU8CAwEAAaOCATIwggEu\n" + + "MB0GA1UdDgQWBBT9rGEyk2xF1uLuhV+auud2mWjM5zAfBgNVHSMEGDAWgBTSxLDS\n" + + "kdRMEXGzYcs9of7dqGrU4zASBgNVHRMBAf8ECDAGAQH/AgEAMDMGCCsGAQUFBwEB\n" + + "BCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZ29kYWRkeS5jb20wRgYDVR0f\n" + + "BD8wPTA7oDmgN4Y1aHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBv\n" + + "c2l0b3J5L2dkcm9vdC5jcmwwSwYDVR0gBEQwQjBABgRVHSAAMDgwNgYIKwYBBQUH\n" + + "AgEWKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeTAO\n" + + "BgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBANKGwOy9+aG2Z+5mC6IG\n" + + "OgRQjhVyrEp0lVPLN8tESe8HkGsz2ZbwlFalEzAFPIUyIXvJxwqoJKSQ3kbTJSMU\n" + + "A2fCENZvD117esyfxVgqwcSeIaha86ykRvOe5GPLL5CkKSkB2XIsKd83ASe8T+5o\n" + + "0yGPwLPk9Qnt0hCqU7S+8MxZC9Y7lhyVJEnfzuz9p0iRFEUOOjZv2kWzRaJBydTX\n" + + "RE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsxuxN89txJx9OjxUUAiKEngHUuH\n" + + "qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV\n" + + "U+4=\n" + + "-----END CERTIFICATE-----\n" + + "-----BEGIN CERTIFICATE-----\n" + + "MIIE+zCCBGSgAwIBAgICAQ0wDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Zh\n" + + "bGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu\n" + + "Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g\n" + + "QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAe\n" + + "BgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTA0MDYyOTE3MDYyMFoX\n" + + "DTI0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBE\n" + + "YWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3MgMiBDZXJ0\n" + + "aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgC\n" + + "ggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv\n" + + "2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+q\n" + + "N1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiO\n" + + "r18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lN\n" + + "f4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+YihfukEH\n" + + "U1jPEX44dMX4/7VpkI+EdOqXG68CAQOjggHhMIIB3TAdBgNVHQ4EFgQU0sSw0pHU\n" + + "TBFxs2HLPaH+3ahq1OMwgdIGA1UdIwSByjCBx6GBwaSBvjCBuzEkMCIGA1UEBxMb\n" + + "VmFsaUNlcnQgVmFsaWRhdGlvbiBOZXR3b3JrMRcwFQYDVQQKEw5WYWxpQ2VydCwg\n" + + "SW5jLjE1MDMGA1UECxMsVmFsaUNlcnQgQ2xhc3MgMiBQb2xpY3kgVmFsaWRhdGlv\n" + + "biBBdXRob3JpdHkxITAfBgNVBAMTGGh0dHA6Ly93d3cudmFsaWNlcnQuY29tLzEg\n" + + "MB4GCSqGSIb3DQEJARYRaW5mb0B2YWxpY2VydC5jb22CAQEwDwYDVR0TAQH/BAUw\n" + + "AwEB/zAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmdv\n" + + "ZGFkZHkuY29tMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jZXJ0aWZpY2F0ZXMu\n" + + "Z29kYWRkeS5jb20vcmVwb3NpdG9yeS9yb290LmNybDBLBgNVHSAERDBCMEAGBFUd\n" + + "IAAwODA2BggrBgEFBQcCARYqaHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNv\n" + + "bS9yZXBvc2l0b3J5MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOBgQC1\n" + + "QPmnHfbq/qQaQlpE9xXUhUaJwL6e4+PrxeNYiY+Sn1eocSxI0YGyeR+sBjUZsE4O\n" + + "WBsUs5iB0QQeyAfJg594RAoYC5jcdnplDQ1tgMQLARzLrUc+cb53S8wGd9D0Vmsf\n" + + "SxOaFIqII6hR8INMqzW/Rn453HWkrugp++85j09VZw==\n" + + "-----END CERTIFICATE-----\n" + + "-----BEGIN CERTIFICATE-----\n" + + "MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0\n" + + "IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz\n" + + "BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y\n" + + "aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG\n" + + "9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy\n" + + "NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y\n" + + "azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs\n" + + "YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw\n" + + "Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl\n" + + "cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY\n" + + "dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9\n" + + "WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS\n" + + "v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v\n" + + "UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu\n" + + "IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC\n" + + "W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd\n" + + "-----END CERTIFICATE-----\n"; + + @Column(name = "public_ip_address", nullable = false) + private String publicIpAddress; + + @Column(name = "public_mac_address", nullable = false) + private String publicMacAddress; + + @Column(name = "public_netmask", nullable = false) + private String publicNetmask; + + @Column(name = "active_session", updatable = true, nullable = false) + private int activeSession; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "last_update", updatable = true, nullable = true) + private Date lastUpdateTime; + + @Column(name = "session_details", updatable = true, nullable = true) + private byte[] sessionDetails; + + @Transient + private boolean sslEnabled = false; + + @Transient + private int port; + + /** + * Correct constructor to use. + * + */ + public ConsoleProxyVO(long id, long serviceOfferingId, String name, long templateId, HypervisorType hypervisorType, long guestOSId, long dataCenterId, long domainId, long accountId, + int activeSession, boolean haEnabled) { + super(id, serviceOfferingId, name, name, Type.ConsoleProxy, templateId, hypervisorType, guestOSId, domainId, accountId, haEnabled); + this.activeSession = activeSession; + } + + protected ConsoleProxyVO() { + super(); + } + + public void setPublicIpAddress(String publicIpAddress) { + this.publicIpAddress = publicIpAddress; + } + + public void setPublicNetmask(String publicNetmask) { + this.publicNetmask = publicNetmask; + } + + public void setPublicMacAddress(String publicMacAddress) { + this.publicMacAddress = publicMacAddress; + } + + public void setActiveSession(int activeSession) { + this.activeSession = activeSession; + } + + public void setLastUpdateTime(Date time) { + this.lastUpdateTime = time; + } + + public void setSessionDetails(byte[] details) { + this.sessionDetails = details; + } + + @Override + public String getPublicIpAddress() { + return this.publicIpAddress; + } + + @Override + public String getPublicNetmask() { + return this.publicNetmask; + } + + @Override + public String getPublicMacAddress() { + return this.publicMacAddress; + } + + @Override + public int getActiveSession() { + return this.activeSession; + } + + @Override + public Date getLastUpdateTime() { + return this.lastUpdateTime; + } + + @Override + public byte[] getSessionDetails() { + return this.sessionDetails; + } + + public boolean isSslEnabled() { + return sslEnabled; + } + + public void setSslEnabled(boolean sslEnabled) { + this.sslEnabled = sslEnabled; + } + + public void setPort(int port) { + this.port = port; + } + + public int getPort() { + return port; + } + +} diff --git a/core/src/com/cloud/vm/DomainRouterVO.java b/engine/schema/src/com/cloud/vm/DomainRouterVO.java similarity index 100% rename from core/src/com/cloud/vm/DomainRouterVO.java rename to engine/schema/src/com/cloud/vm/DomainRouterVO.java diff --git a/core/src/com/cloud/vm/InstanceGroupVMMapVO.java b/engine/schema/src/com/cloud/vm/InstanceGroupVMMapVO.java similarity index 100% rename from core/src/com/cloud/vm/InstanceGroupVMMapVO.java rename to engine/schema/src/com/cloud/vm/InstanceGroupVMMapVO.java diff --git a/core/src/com/cloud/vm/InstanceGroupVO.java b/engine/schema/src/com/cloud/vm/InstanceGroupVO.java similarity index 100% rename from core/src/com/cloud/vm/InstanceGroupVO.java rename to engine/schema/src/com/cloud/vm/InstanceGroupVO.java diff --git a/server/src/com/cloud/vm/ItWorkDao.java b/engine/schema/src/com/cloud/vm/ItWorkDao.java similarity index 100% rename from server/src/com/cloud/vm/ItWorkDao.java rename to engine/schema/src/com/cloud/vm/ItWorkDao.java diff --git a/server/src/com/cloud/vm/ItWorkDaoImpl.java b/engine/schema/src/com/cloud/vm/ItWorkDaoImpl.java similarity index 100% rename from server/src/com/cloud/vm/ItWorkDaoImpl.java rename to engine/schema/src/com/cloud/vm/ItWorkDaoImpl.java diff --git a/server/src/com/cloud/vm/ItWorkVO.java b/engine/schema/src/com/cloud/vm/ItWorkVO.java similarity index 100% rename from server/src/com/cloud/vm/ItWorkVO.java rename to engine/schema/src/com/cloud/vm/ItWorkVO.java diff --git a/server/src/com/cloud/vm/NicVO.java b/engine/schema/src/com/cloud/vm/NicVO.java similarity index 100% rename from server/src/com/cloud/vm/NicVO.java rename to engine/schema/src/com/cloud/vm/NicVO.java diff --git a/core/src/com/cloud/vm/SecondaryStorageVmVO.java b/engine/schema/src/com/cloud/vm/SecondaryStorageVmVO.java similarity index 100% rename from core/src/com/cloud/vm/SecondaryStorageVmVO.java rename to engine/schema/src/com/cloud/vm/SecondaryStorageVmVO.java diff --git a/core/src/com/cloud/vm/UserVmCloneSettingVO.java b/engine/schema/src/com/cloud/vm/UserVmCloneSettingVO.java similarity index 100% rename from core/src/com/cloud/vm/UserVmCloneSettingVO.java rename to engine/schema/src/com/cloud/vm/UserVmCloneSettingVO.java diff --git a/core/src/com/cloud/vm/UserVmDetailVO.java b/engine/schema/src/com/cloud/vm/UserVmDetailVO.java similarity index 100% rename from core/src/com/cloud/vm/UserVmDetailVO.java rename to engine/schema/src/com/cloud/vm/UserVmDetailVO.java diff --git a/core/src/com/cloud/vm/UserVmVO.java b/engine/schema/src/com/cloud/vm/UserVmVO.java similarity index 100% rename from core/src/com/cloud/vm/UserVmVO.java rename to engine/schema/src/com/cloud/vm/UserVmVO.java diff --git a/server/src/com/cloud/vm/dao/ConsoleProxyDao.java b/engine/schema/src/com/cloud/vm/dao/ConsoleProxyDao.java similarity index 100% rename from server/src/com/cloud/vm/dao/ConsoleProxyDao.java rename to engine/schema/src/com/cloud/vm/dao/ConsoleProxyDao.java diff --git a/server/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java similarity index 100% rename from server/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java rename to engine/schema/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java diff --git a/server/src/com/cloud/vm/dao/DomainRouterDao.java b/engine/schema/src/com/cloud/vm/dao/DomainRouterDao.java similarity index 100% rename from server/src/com/cloud/vm/dao/DomainRouterDao.java rename to engine/schema/src/com/cloud/vm/dao/DomainRouterDao.java diff --git a/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/DomainRouterDaoImpl.java similarity index 100% rename from server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java rename to engine/schema/src/com/cloud/vm/dao/DomainRouterDaoImpl.java diff --git a/server/src/com/cloud/vm/dao/InstanceGroupDao.java b/engine/schema/src/com/cloud/vm/dao/InstanceGroupDao.java similarity index 100% rename from server/src/com/cloud/vm/dao/InstanceGroupDao.java rename to engine/schema/src/com/cloud/vm/dao/InstanceGroupDao.java diff --git a/server/src/com/cloud/vm/dao/InstanceGroupDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/InstanceGroupDaoImpl.java similarity index 100% rename from server/src/com/cloud/vm/dao/InstanceGroupDaoImpl.java rename to engine/schema/src/com/cloud/vm/dao/InstanceGroupDaoImpl.java diff --git a/server/src/com/cloud/vm/dao/InstanceGroupVMMapDao.java b/engine/schema/src/com/cloud/vm/dao/InstanceGroupVMMapDao.java similarity index 100% rename from server/src/com/cloud/vm/dao/InstanceGroupVMMapDao.java rename to engine/schema/src/com/cloud/vm/dao/InstanceGroupVMMapDao.java diff --git a/server/src/com/cloud/vm/dao/InstanceGroupVMMapDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/InstanceGroupVMMapDaoImpl.java similarity index 100% rename from server/src/com/cloud/vm/dao/InstanceGroupVMMapDaoImpl.java rename to engine/schema/src/com/cloud/vm/dao/InstanceGroupVMMapDaoImpl.java diff --git a/server/src/com/cloud/vm/dao/NicDao.java b/engine/schema/src/com/cloud/vm/dao/NicDao.java similarity index 100% rename from server/src/com/cloud/vm/dao/NicDao.java rename to engine/schema/src/com/cloud/vm/dao/NicDao.java diff --git a/server/src/com/cloud/vm/dao/NicDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java similarity index 100% rename from server/src/com/cloud/vm/dao/NicDaoImpl.java rename to engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java diff --git a/server/src/com/cloud/vm/dao/NicSecondaryIpDao.java b/engine/schema/src/com/cloud/vm/dao/NicSecondaryIpDao.java similarity index 100% rename from server/src/com/cloud/vm/dao/NicSecondaryIpDao.java rename to engine/schema/src/com/cloud/vm/dao/NicSecondaryIpDao.java diff --git a/server/src/com/cloud/vm/dao/NicSecondaryIpDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/NicSecondaryIpDaoImpl.java similarity index 100% rename from server/src/com/cloud/vm/dao/NicSecondaryIpDaoImpl.java rename to engine/schema/src/com/cloud/vm/dao/NicSecondaryIpDaoImpl.java diff --git a/server/src/com/cloud/vm/dao/NicSecondaryIpVO.java b/engine/schema/src/com/cloud/vm/dao/NicSecondaryIpVO.java similarity index 100% rename from server/src/com/cloud/vm/dao/NicSecondaryIpVO.java rename to engine/schema/src/com/cloud/vm/dao/NicSecondaryIpVO.java diff --git a/server/src/com/cloud/vm/dao/SecondaryStorageVmDao.java b/engine/schema/src/com/cloud/vm/dao/SecondaryStorageVmDao.java similarity index 100% rename from server/src/com/cloud/vm/dao/SecondaryStorageVmDao.java rename to engine/schema/src/com/cloud/vm/dao/SecondaryStorageVmDao.java diff --git a/server/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java similarity index 100% rename from server/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java rename to engine/schema/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java diff --git a/server/src/com/cloud/vm/dao/UserVmCloneSettingDao.java b/engine/schema/src/com/cloud/vm/dao/UserVmCloneSettingDao.java similarity index 100% rename from server/src/com/cloud/vm/dao/UserVmCloneSettingDao.java rename to engine/schema/src/com/cloud/vm/dao/UserVmCloneSettingDao.java diff --git a/server/src/com/cloud/vm/dao/UserVmCloneSettingDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/UserVmCloneSettingDaoImpl.java similarity index 100% rename from server/src/com/cloud/vm/dao/UserVmCloneSettingDaoImpl.java rename to engine/schema/src/com/cloud/vm/dao/UserVmCloneSettingDaoImpl.java diff --git a/server/src/com/cloud/vm/dao/UserVmDao.java b/engine/schema/src/com/cloud/vm/dao/UserVmDao.java similarity index 100% rename from server/src/com/cloud/vm/dao/UserVmDao.java rename to engine/schema/src/com/cloud/vm/dao/UserVmDao.java diff --git a/server/src/com/cloud/vm/dao/UserVmDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java similarity index 100% rename from server/src/com/cloud/vm/dao/UserVmDaoImpl.java rename to engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java diff --git a/server/src/com/cloud/vm/dao/UserVmData.java b/engine/schema/src/com/cloud/vm/dao/UserVmData.java similarity index 100% rename from server/src/com/cloud/vm/dao/UserVmData.java rename to engine/schema/src/com/cloud/vm/dao/UserVmData.java diff --git a/server/src/com/cloud/vm/dao/UserVmDetailsDao.java b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDao.java similarity index 100% rename from server/src/com/cloud/vm/dao/UserVmDetailsDao.java rename to engine/schema/src/com/cloud/vm/dao/UserVmDetailsDao.java diff --git a/server/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java similarity index 100% rename from server/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java rename to engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java diff --git a/server/src/com/cloud/vm/dao/VMInstanceDao.java b/engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java similarity index 100% rename from server/src/com/cloud/vm/dao/VMInstanceDao.java rename to engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java diff --git a/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java similarity index 100% rename from server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java rename to engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java diff --git a/server/src/com/cloud/vm/snapshot/dao/VMSnapshotDao.java b/engine/schema/src/com/cloud/vm/snapshot/dao/VMSnapshotDao.java similarity index 100% rename from server/src/com/cloud/vm/snapshot/dao/VMSnapshotDao.java rename to engine/schema/src/com/cloud/vm/snapshot/dao/VMSnapshotDao.java diff --git a/server/src/com/cloud/vm/snapshot/dao/VMSnapshotDaoImpl.java b/engine/schema/src/com/cloud/vm/snapshot/dao/VMSnapshotDaoImpl.java similarity index 100% rename from server/src/com/cloud/vm/snapshot/dao/VMSnapshotDaoImpl.java rename to engine/schema/src/com/cloud/vm/snapshot/dao/VMSnapshotDaoImpl.java diff --git a/server/src/org/apache/cloudstack/affinity/AffinityGroupVMMapVO.java b/engine/schema/src/org/apache/cloudstack/affinity/AffinityGroupVMMapVO.java similarity index 100% rename from server/src/org/apache/cloudstack/affinity/AffinityGroupVMMapVO.java rename to engine/schema/src/org/apache/cloudstack/affinity/AffinityGroupVMMapVO.java diff --git a/server/src/org/apache/cloudstack/affinity/AffinityGroupVO.java b/engine/schema/src/org/apache/cloudstack/affinity/AffinityGroupVO.java similarity index 100% rename from server/src/org/apache/cloudstack/affinity/AffinityGroupVO.java rename to engine/schema/src/org/apache/cloudstack/affinity/AffinityGroupVO.java diff --git a/server/src/org/apache/cloudstack/affinity/dao/AffinityGroupDao.java b/engine/schema/src/org/apache/cloudstack/affinity/dao/AffinityGroupDao.java similarity index 100% rename from server/src/org/apache/cloudstack/affinity/dao/AffinityGroupDao.java rename to engine/schema/src/org/apache/cloudstack/affinity/dao/AffinityGroupDao.java diff --git a/server/src/org/apache/cloudstack/affinity/dao/AffinityGroupDaoImpl.java b/engine/schema/src/org/apache/cloudstack/affinity/dao/AffinityGroupDaoImpl.java similarity index 100% rename from server/src/org/apache/cloudstack/affinity/dao/AffinityGroupDaoImpl.java rename to engine/schema/src/org/apache/cloudstack/affinity/dao/AffinityGroupDaoImpl.java diff --git a/server/src/org/apache/cloudstack/affinity/dao/AffinityGroupVMMapDao.java b/engine/schema/src/org/apache/cloudstack/affinity/dao/AffinityGroupVMMapDao.java similarity index 100% rename from server/src/org/apache/cloudstack/affinity/dao/AffinityGroupVMMapDao.java rename to engine/schema/src/org/apache/cloudstack/affinity/dao/AffinityGroupVMMapDao.java diff --git a/server/src/org/apache/cloudstack/affinity/dao/AffinityGroupVMMapDaoImpl.java b/engine/schema/src/org/apache/cloudstack/affinity/dao/AffinityGroupVMMapDaoImpl.java similarity index 100% rename from server/src/org/apache/cloudstack/affinity/dao/AffinityGroupVMMapDaoImpl.java rename to engine/schema/src/org/apache/cloudstack/affinity/dao/AffinityGroupVMMapDaoImpl.java diff --git a/server/src/org/apache/cloudstack/region/RegionSyncVO.java b/engine/schema/src/org/apache/cloudstack/region/RegionSyncVO.java similarity index 100% rename from server/src/org/apache/cloudstack/region/RegionSyncVO.java rename to engine/schema/src/org/apache/cloudstack/region/RegionSyncVO.java diff --git a/server/src/org/apache/cloudstack/region/RegionVO.java b/engine/schema/src/org/apache/cloudstack/region/RegionVO.java similarity index 100% rename from server/src/org/apache/cloudstack/region/RegionVO.java rename to engine/schema/src/org/apache/cloudstack/region/RegionVO.java diff --git a/server/src/org/apache/cloudstack/region/dao/RegionDao.java b/engine/schema/src/org/apache/cloudstack/region/dao/RegionDao.java similarity index 100% rename from server/src/org/apache/cloudstack/region/dao/RegionDao.java rename to engine/schema/src/org/apache/cloudstack/region/dao/RegionDao.java diff --git a/server/src/org/apache/cloudstack/region/dao/RegionDaoImpl.java b/engine/schema/src/org/apache/cloudstack/region/dao/RegionDaoImpl.java similarity index 100% rename from server/src/org/apache/cloudstack/region/dao/RegionDaoImpl.java rename to engine/schema/src/org/apache/cloudstack/region/dao/RegionDaoImpl.java diff --git a/server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerDaoImpl.java b/engine/schema/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerDaoImpl.java similarity index 100% rename from server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerDaoImpl.java rename to engine/schema/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerDaoImpl.java diff --git a/server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerLbRuleMapDao.java b/engine/schema/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerLbRuleMapDao.java similarity index 100% rename from server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerLbRuleMapDao.java rename to engine/schema/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerLbRuleMapDao.java diff --git a/server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerLbRuleMapDaoImpl.java b/engine/schema/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerLbRuleMapDaoImpl.java similarity index 100% rename from server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerLbRuleMapDaoImpl.java rename to engine/schema/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerLbRuleMapDaoImpl.java diff --git a/server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerLbRuleMapVO.java b/engine/schema/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerLbRuleMapVO.java similarity index 100% rename from server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerLbRuleMapVO.java rename to engine/schema/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerLbRuleMapVO.java diff --git a/server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerRuleDao.java b/engine/schema/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerRuleDao.java similarity index 100% rename from server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerRuleDao.java rename to engine/schema/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerRuleDao.java diff --git a/server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerRuleVO.java b/engine/schema/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerRuleVO.java similarity index 100% rename from server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerRuleVO.java rename to engine/schema/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancerRuleVO.java diff --git a/server/src/com/cloud/cluster/CheckPointVO.java b/server/src/com/cloud/cluster/CheckPointVO.java deleted file mode 100644 index db4f828721a..00000000000 --- a/server/src/com/cloud/cluster/CheckPointVO.java +++ /dev/null @@ -1,121 +0,0 @@ -// 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.cluster; - -import java.util.Date; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; - -import com.cloud.utils.db.GenericDao; -import org.apache.cloudstack.api.InternalIdentity; - -@Entity -@Table(name="stack_maid") -public class CheckPointVO implements InternalIdentity { - - @Id - @GeneratedValue(strategy=GenerationType.IDENTITY) - @Column(name="id") - private long id; - - @Column(name="msid") - private long msid; - - @Column(name="thread_id") - private long threadId; - - @Column(name="seq") - private long seq; - - @Column(name="cleanup_delegate", length=128) - private String delegate; - - @Column(name="cleanup_context", length=65535) - private String context; - - @Column(name=GenericDao.CREATED_COLUMN) - private Date created; - - public CheckPointVO() { - } - - public CheckPointVO(long seq) { - this.seq = seq; - } - - public long getId() { - return id; - } - - public long getMsid() { - return msid; - } - - public void setMsid(long msid) { - this.msid = msid; - } - - public long getThreadId() { - return threadId; - } - - public void setThreadId(long threadId) { - this.threadId = threadId; - } - - public long getSeq() { - return seq; - } - - public void setSeq(long seq) { - this.seq = seq; - } - - public String getDelegate() { - return delegate; - } - - public void setDelegate(String delegate) { - this.delegate = delegate; - } - - public String getContext() { - return context; - } - - public void setContext(String context) { - this.context = context; - } - - public Date getCreated() { - return this.created; - } - - public void setCreated(Date created) { - this.created = created; - } - - @Override - public String toString() { - return new StringBuilder("Task[").append(id).append("-").append(context).append("-").append(delegate).append("]").toString(); - } -} diff --git a/server/src/com/cloud/cluster/dao/StackMaidDao.java b/server/src/com/cloud/cluster/dao/StackMaidDao.java deleted file mode 100644 index eb13b5cb2c2..00000000000 --- a/server/src/com/cloud/cluster/dao/StackMaidDao.java +++ /dev/null @@ -1,44 +0,0 @@ -// 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.cluster.dao; - -import java.util.Date; -import java.util.List; - -import com.cloud.cluster.CheckPointVO; -import com.cloud.utils.db.GenericDao; - -public interface StackMaidDao extends GenericDao { - public long pushCleanupDelegate(long msid, int seq, String delegateClzName, Object context); - public CheckPointVO popCleanupDelegate(long msid); - public void clearStack(long msid); - - public List listLeftoversByMsid(long msid); - public List listLeftoversByCutTime(Date cutTime); - - /** - * Take over the task items of another management server and clean them up. - * - * @param takeOverMsid management server id to take over. - * @param selfId the management server id of this node. - * @return list of tasks to take over. - */ - boolean takeover(long takeOverMsid, long selfId); - - List listCleanupTasks(long selfId); - List listLeftoversByCutTime(Date cutTime, long msid); -} diff --git a/server/src/com/cloud/cluster/dao/StackMaidDaoImpl.java b/server/src/com/cloud/cluster/dao/StackMaidDaoImpl.java deleted file mode 100644 index 243b00ff4a3..00000000000 --- a/server/src/com/cloud/cluster/dao/StackMaidDaoImpl.java +++ /dev/null @@ -1,208 +0,0 @@ -// 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.cluster.dao; - -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.TimeZone; - -import javax.ejb.Local; - -import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; - -import com.cloud.cluster.CheckPointVO; -import com.cloud.serializer.SerializerHelper; -import com.cloud.utils.DateUtil; -import com.cloud.utils.db.DB; -import com.cloud.utils.db.Filter; -import com.cloud.utils.db.GenericDaoBase; -import com.cloud.utils.db.SearchBuilder; -import com.cloud.utils.db.SearchCriteria; -import com.cloud.utils.db.SearchCriteria.Op; -import com.cloud.utils.db.Transaction; - -@Component -@Local(value = { StackMaidDao.class }) @DB(txn=false) -public class StackMaidDaoImpl extends GenericDaoBase implements StackMaidDao { - private static final Logger s_logger = Logger.getLogger(StackMaidDaoImpl.class); - - private SearchBuilder popSearch; - private SearchBuilder clearSearch; - private final SearchBuilder AllFieldsSearch; - - public StackMaidDaoImpl() { - popSearch = createSearchBuilder(); - popSearch.and("msid", popSearch.entity().getMsid(), SearchCriteria.Op.EQ); - popSearch.and("threadId", popSearch.entity().getThreadId(), SearchCriteria.Op.EQ); - - clearSearch = createSearchBuilder(); - clearSearch.and("msid", clearSearch.entity().getMsid(), SearchCriteria.Op.EQ); - - AllFieldsSearch = createSearchBuilder(); - AllFieldsSearch.and("msid", AllFieldsSearch.entity().getMsid(), Op.EQ); - AllFieldsSearch.and("thread", AllFieldsSearch.entity().getThreadId(), Op.EQ); - AllFieldsSearch.done(); - } - - @Override - public boolean takeover(long takeOverMsid, long selfId) { - CheckPointVO task = createForUpdate(); - task.setMsid(selfId); - task.setThreadId(0); - - SearchCriteria sc = AllFieldsSearch.create(); - sc.setParameters("msid", takeOverMsid); - return update(task, sc) > 0; - - } - - @Override - public List listCleanupTasks(long msId) { - SearchCriteria sc = AllFieldsSearch.create(); - sc.setParameters("msid", msId); - sc.setParameters("thread", 0); - - return this.search(sc, null); - } - - @Override - public long pushCleanupDelegate(long msid, int seq, String delegateClzName, Object context) { - CheckPointVO delegateItem = new CheckPointVO(); - delegateItem.setMsid(msid); - delegateItem.setThreadId(Thread.currentThread().getId()); - delegateItem.setSeq(seq); - delegateItem.setDelegate(delegateClzName); - delegateItem.setContext(SerializerHelper.toSerializedStringOld(context)); - delegateItem.setCreated(DateUtil.currentGMTTime()); - - super.persist(delegateItem); - return delegateItem.getId(); - } - - @Override - public CheckPointVO popCleanupDelegate(long msid) { - SearchCriteria sc = popSearch.create(); - sc.setParameters("msid", msid); - sc.setParameters("threadId", Thread.currentThread().getId()); - - Filter filter = new Filter(CheckPointVO.class, "seq", false, 0L, (long)1); - List l = listIncludingRemovedBy(sc, filter); - if(l != null && l.size() > 0) { - expunge(l.get(0).getId()); - return l.get(0); - } - - return null; - } - - @Override - public void clearStack(long msid) { - SearchCriteria sc = clearSearch.create(); - sc.setParameters("msid", msid); - - expunge(sc); - } - - @Override - @DB - public List listLeftoversByMsid(long msid) { - List l = new ArrayList(); - String sql = "select * from stack_maid where msid=? order by msid asc, thread_id asc, seq desc"; - - Transaction txn = Transaction.currentTxn(); - PreparedStatement pstmt = null; - try { - pstmt = txn.prepareAutoCloseStatement(sql); - pstmt.setLong(1, msid); - - ResultSet rs = pstmt.executeQuery(); - while(rs.next()) { - l.add(toEntityBean(rs, false)); - } - } catch (SQLException e) { - s_logger.error("unexcpected exception " + e.getMessage(), e); - } catch (Throwable e) { - s_logger.error("unexcpected exception " + e.getMessage(), e); - } finally { - txn.close(); - } - return l; - } - - @Override - @DB - public List listLeftoversByCutTime(Date cutTime) { - - List l = new ArrayList(); - String sql = "select * from stack_maid where created < ? order by msid asc, thread_id asc, seq desc"; - - Transaction txn = Transaction.open(Transaction.CLOUD_DB); - PreparedStatement pstmt = null; - try { - pstmt = txn.prepareAutoCloseStatement(sql); - String gmtCutTime = DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), cutTime); - pstmt.setString(1, gmtCutTime); - - ResultSet rs = pstmt.executeQuery(); - while(rs.next()) { - l.add(toEntityBean(rs, false)); - } - } catch (SQLException e) { - s_logger.error("unexcpected exception " + e.getMessage(), e); - } catch (Throwable e) { - s_logger.error("unexcpected exception " + e.getMessage(), e); - } finally { - txn.close(); - } - return l; - } - - @Override - @DB - public List listLeftoversByCutTime(Date cutTime, long msid) { - - List l = new ArrayList(); - String sql = "select * from stack_maid where created < ? and msid = ? order by msid asc, thread_id asc, seq desc"; - - Transaction txn = Transaction.open(Transaction.CLOUD_DB); - PreparedStatement pstmt = null; - try { - pstmt = txn.prepareAutoCloseStatement(sql); - String gmtCutTime = DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), cutTime); - pstmt.setString(1, gmtCutTime); - pstmt.setLong(2, msid); - - ResultSet rs = pstmt.executeQuery(); - while(rs.next()) { - l.add(toEntityBean(rs, false)); - } - } catch (SQLException e) { - s_logger.error("unexcpected exception " + e.getMessage(), e); - } catch (Throwable e) { - s_logger.error("unexcpected exception " + e.getMessage(), e); - } finally { - txn.close(); - } - return l; - } -} - diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java index c4ad8170d6d..9a7a46faf3d 100755 --- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java +++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java @@ -5,7 +5,7 @@ // 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, @@ -23,7 +23,6 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.UUID; import javax.ejb.Local; import javax.inject.Inject; @@ -98,7 +97,6 @@ import com.cloud.resource.UnableDeleteHostException; import com.cloud.server.ManagementServer; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; -import com.cloud.servlet.ConsoleProxyPasswordBasedEncryptor; import com.cloud.storage.StorageManager; import com.cloud.storage.StoragePoolStatus; import com.cloud.storage.VMTemplateHostVO; @@ -263,186 +261,6 @@ public class ConsoleProxyManagerImpl extends ManagerBase implements ConsoleProxy private final GlobalLock _allocProxyLock = GlobalLock.getInternLock(getAllocProxyLockName()); - /* - * private final String keyContent = - * "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALV5vGlkiWwoZX4hTRplPXP8qtST\n" - * + "hwZhko8noeY5vf8ECwmd+vrCTw/JvnOtkx/8oYNbg/SeUt1EfOsk6gqJdBblGFBZRMcUJlIpqE9z\n" + - * "uv68U9G8Gfi/qvRSY336hibw0J5bZ4vn1QqmyHDB+Czea9AjFUV7AEVG15+vED7why+/AgMBAAEC\n" - * + "gYBmFBPnNKYYMKDmUdUNA+WNWJK/ADzzWe8WlzR6TACTcbLDthl289WFC/YVG42mcHRpbxDKiEQU\n" + - * "MnIR0rHTO34Qb/2HcuyweStU2gqR6omxBvMnFpJr90nD1HcOMJzeLHsphau0/EmKKey+gk4PyieD\n" - * + "KqTM7LTjjHv8xPM4n+WAAQJBAOMNCeFKlJ4kMokWhU74B5/w/NGyT1BHUN0VmilHSiJC8JqS4BiI\n" + - * "ZpAeET3VmilO6QTGh2XVhEDGteu3uZR6ipUCQQDMnRzMgQ/50LFeIQo4IBtwlEouczMlPQF4c21R\n" - * + "1d720moxILVPT0NJZTQUDDmmgbL+B7CgtcCR2NlP5sKPZVADAkEAh4Xq1cy8dMBKYcVNgNtPQcqI\n" + - * "PWpfKR3ISI5yXB0vRNAL6Vet5zbTcUZhKDVtNSbis3UEsGYH8NorEC2z2cpjGQJANhJi9Ow6c5Mh\n" - * + "/DURBUn+1l5pyCKrZnDbvaALSLATLvjmFTuGjoHszy2OeKnOZmEqExWnKKE/VYuPyhy6V7i3TwJA\n" + - * "f8skDgtPK0OsBCa6IljPaHoWBjPc4kFkSTSS1d56hUcWSikTmiuKdLyBb85AADSZYsvHWrte4opN\n" + "dhNukMJuRA==\n"; - * - * private final String certContent = "-----BEGIN CERTIFICATE-----\n" + - * "MIIE3jCCA8agAwIBAgIFAqv56tIwDQYJKoZIhvcNAQEFBQAwgcoxCzAJBgNVBAYT\n" - * + "AlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYD\n" + - * "VQQKExFHb0RhZGR5LmNvbSwgSW5jLjEzMDEGA1UECxMqaHR0cDovL2NlcnRpZmlj\n" - * + "YXRlcy5nb2RhZGR5LmNvbS9yZXBvc2l0b3J5MTAwLgYDVQQDEydHbyBEYWRkeSBT\n" + - * "ZWN1cmUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxETAPBgNVBAUTCDA3OTY5Mjg3\n" - * + "MB4XDTA5MDIxMTA0NTc1NloXDTEyMDIwNzA1MTEyM1owWTEZMBcGA1UECgwQKi5y\n" + - * "ZWFsaG9zdGlwLmNvbTEhMB8GA1UECwwYRG9tYWluIENvbnRyb2wgVmFsaWRhdGVk\n" - * + "MRkwFwYDVQQDDBAqLnJlYWxob3N0aXAuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GN\n" + - * "ADCBiQKBgQC1ebxpZIlsKGV+IU0aZT1z/KrUk4cGYZKPJ6HmOb3/BAsJnfr6wk8P\n" - * + "yb5zrZMf/KGDW4P0nlLdRHzrJOoKiXQW5RhQWUTHFCZSKahPc7r+vFPRvBn4v6r0\n" + - * "UmN9+oYm8NCeW2eL59UKpshwwfgs3mvQIxVFewBFRtefrxA+8IcvvwIDAQABo4IB\n" - * + "vTCCAbkwDwYDVR0TAQH/BAUwAwEBADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYB\n" + - * "BQUHAwIwDgYDVR0PAQH/BAQDAgWgMDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9j\n" - * + "cmwuZ29kYWRkeS5jb20vZ2RzMS0yLmNybDBTBgNVHSAETDBKMEgGC2CGSAGG/W0B\n" + - * "BxcBMDkwNwYIKwYBBQUHAgEWK2h0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5j\n" - * + "b20vcmVwb3NpdG9yeS8wgYAGCCsGAQUFBwEBBHQwcjAkBggrBgEFBQcwAYYYaHR0\n" + - * "cDovL29jc3AuZ29kYWRkeS5jb20vMEoGCCsGAQUFBzAChj5odHRwOi8vY2VydGlm\n" - * + "aWNhdGVzLmdvZGFkZHkuY29tL3JlcG9zaXRvcnkvZ2RfaW50ZXJtZWRpYXRlLmNy\n" + - * "dDAfBgNVHSMEGDAWgBT9rGEyk2xF1uLuhV+auud2mWjM5zArBgNVHREEJDAighAq\n" - * + "LnJlYWxob3N0aXAuY29tgg5yZWFsaG9zdGlwLmNvbTAdBgNVHQ4EFgQUHxwmdK5w\n" + - * "9/YVeZ/3fHyi6nQfzoYwDQYJKoZIhvcNAQEFBQADggEBABv/XinvId6oWXJtmku+\n" - * + "7m90JhSVH0ycoIGjgdaIkcExQGP08MCilbUsPcbhLheSFdgn/cR4e1MP083lacoj\n" + - * "OGauY7b8f/cuquGkT49Ns14awPlEzRjjycQEjjLxFEuL5CFWa2t2gKRE1dSfhDQ+\n" - * + "fJ6GBCs1XgZLuhkKS8fPf+YmG2ZjHzYDjYoSx7paDXgEm+kbYIZdCK51lA0BUAjP\n" + - * "9ZMGhsu/PpAbh5U/DtcIqxY0xeqD4TeGsBzXg6uLhv+jKHDtXg5fYPe+z0n5DCEL\n" - * + "k0fLF4+i/pt9hVCz0QrZ28RUhXf825+EOL0Gw+Uzt+7RV2cCaJrlu4cDrDom2FRy\n" + "E8I=\n" + - * "-----END CERTIFICATE-----\n"; - */ - public static final String keyContent = - "-----BEGIN PRIVATE KEY-----\n" + - "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCDT9AtEfs+s/I8QXp6rrCw0iNJ\n" + - "0+GgsybNHheU+JpL39LMTZykCrZhZnyDvwdxCoOfE38Sa32baHKNds+y2SHnMNsOkw8OcNucHEBX\n" + - "1FIpOBGph9D6xC+umx9od6xMWETUv7j6h2u+WC3OhBM8fHCBqIiAol31/IkcqDxxsHlQ8S/oCfTl\n" + - "XJUY6Yn628OA1XijKdRnadV0hZ829cv/PZKljjwQUTyrd0KHQeksBH+YAYSo2JUl8ekNLsOi8/cP\n" + - "tfojnltzRI1GXi0ZONs8VnDzJ0a2gqZY+uxlz+CGbLnGnlN4j9cBpE+MfUE+35Dq121sTpsSgF85\n" + - "Mz+pVhn2S633AgMBAAECggEAH/Szd9RxbVADenCA6wxKSa3KErRyq1YN8ksJeCKMAj0FIt0caruE\n" + - "qO11DebWW8cwQu1Otl/cYI6pmg24/BBldMrp9IELX/tNJo+lhPpRyGAxxC0eSXinFfoASb8d+jJd\n" + - "Bd1mmemM6fSxqRlxSP4LrzIhjhR1g2CiyYuTsiM9UtoVKGyHwe7KfFwirUOJo3Mr18zUVNm7YqY4\n" + - "IVhOSq59zkH3ULBlYq4bG50jpxa5mNSCZ7IpafPY/kE/CbR+FWNt30+rk69T+qb5abg6+XGm+OAm\n" + - "bnQ18yZEqX6nJLk7Ch0cfA5orGgrTMOrM71wK7tBBDQ308kOxDGebx6j0qD36QKBgQDTRDr8kuhA\n" + - "9sUyKr9vk2DQCMpNvEeiwI3JRMqmmxpNAtg01aJ3Ya57vX5Fc+zcuV87kP6FM1xgpHQvnw5LWo2J\n" + - "s7ANwQcP8ricEW5zkZhSjI4ssMeAubmsHOloGxmLFYZqwx0JI7CWViGTLMcUlqKblmHcjeQDeDfP\n" + - "P1TaCItFmwKBgQCfHZwVvIcaDs5vxVpZ4ftvflIrW8qq0uOVK6QIf9A/YTGhCXl2qxxTg2A6+0rg\n" + - "ZqI7zKzUDxIbVv0KlgCbpHDC9d5+sdtDB3wW2pimuJ3p1z4/RHb4n/lDwXCACZl1S5l24yXX2pFZ\n" + - "wdPCXmy5PYkHMssFLNhI24pprUIQs66M1QKBgQDQwjAjWisD3pRXESSfZRsaFkWJcM28hdbVFhPF\n" + - "c6gWhwQLmTp0CuL2RPXcPUPFi6sN2iWWi3zxxi9Eyz+9uBn6AsOpo56N5MME/LiOnETO9TKb+Ib6\n" + - "rQtKhjshcv3XkIqFPo2XdVvOAgglPO7vajX91iiXXuH7h7RmJud6l0y/lwKBgE+bi90gLuPtpoEr\n" + - "VzIDKz40ED5bNYHT80NNy0rpT7J2GVN9nwStRYXPBBVeZq7xCpgqpgmO5LtDAWULeZBlbHlOdBwl\n" + - "NhNKKl5wzdEUKwW0yBL1WSS5PQgWPwgARYP25/ggW22sj+49WIo1neXsEKPGWObk8e050f1fTt92\n" + - "Vo1lAoGAb1gCoyBCzvi7sqFxm4V5oapnJeiQQJFjhoYWqGa26rQ+AvXXNuBcigIeDXNJPctSF0Uc\n" + - "p11KbbCgiruBbckvM1vGsk6Sx4leRk+IFHRpJktFUek4o0eUg0shOsyyvyet48Dfg0a8FvcxROs0\n" + - "gD+IYds5doiob/hcm1hnNB/3vk4=\n" + - "-----END PRIVATE KEY-----\n"; - - public static final String certContent = - "-----BEGIN CERTIFICATE-----\n" + - "MIIFZTCCBE2gAwIBAgIHKBCduBUoKDANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE\n" + - "BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY\n" + - "BgNVBAoTEUdvRGFkZHkuY29tLCBJbmMuMTMwMQYDVQQLEypodHRwOi8vY2VydGlm\n" + - "aWNhdGVzLmdvZGFkZHkuY29tL3JlcG9zaXRvcnkxMDAuBgNVBAMTJ0dvIERhZGR5\n" + - "IFNlY3VyZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTERMA8GA1UEBRMIMDc5Njky\n" + - "ODcwHhcNMTIwMjAzMDMzMDQwWhcNMTcwMjA3MDUxMTIzWjBZMRkwFwYDVQQKDBAq\n" + - "LnJlYWxob3N0aXAuY29tMSEwHwYDVQQLDBhEb21haW4gQ29udHJvbCBWYWxpZGF0\n" + - "ZWQxGTAXBgNVBAMMECoucmVhbGhvc3RpcC5jb20wggEiMA0GCSqGSIb3DQEBAQUA\n" + - "A4IBDwAwggEKAoIBAQCDT9AtEfs+s/I8QXp6rrCw0iNJ0+GgsybNHheU+JpL39LM\n" + - "TZykCrZhZnyDvwdxCoOfE38Sa32baHKNds+y2SHnMNsOkw8OcNucHEBX1FIpOBGp\n" + - "h9D6xC+umx9od6xMWETUv7j6h2u+WC3OhBM8fHCBqIiAol31/IkcqDxxsHlQ8S/o\n" + - "CfTlXJUY6Yn628OA1XijKdRnadV0hZ829cv/PZKljjwQUTyrd0KHQeksBH+YAYSo\n" + - "2JUl8ekNLsOi8/cPtfojnltzRI1GXi0ZONs8VnDzJ0a2gqZY+uxlz+CGbLnGnlN4\n" + - "j9cBpE+MfUE+35Dq121sTpsSgF85Mz+pVhn2S633AgMBAAGjggG+MIIBujAPBgNV\n" + - "HRMBAf8EBTADAQEAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAOBgNV\n" + - "HQ8BAf8EBAMCBaAwMwYDVR0fBCwwKjAooCagJIYiaHR0cDovL2NybC5nb2RhZGR5\n" + - "LmNvbS9nZHMxLTY0LmNybDBTBgNVHSAETDBKMEgGC2CGSAGG/W0BBxcBMDkwNwYI\n" + - "KwYBBQUHAgEWK2h0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3Np\n" + - "dG9yeS8wgYAGCCsGAQUFBwEBBHQwcjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3Au\n" + - "Z29kYWRkeS5jb20vMEoGCCsGAQUFBzAChj5odHRwOi8vY2VydGlmaWNhdGVzLmdv\n" + - "ZGFkZHkuY29tL3JlcG9zaXRvcnkvZ2RfaW50ZXJtZWRpYXRlLmNydDAfBgNVHSME\n" + - "GDAWgBT9rGEyk2xF1uLuhV+auud2mWjM5zArBgNVHREEJDAighAqLnJlYWxob3N0\n" + - "aXAuY29tgg5yZWFsaG9zdGlwLmNvbTAdBgNVHQ4EFgQUZyJz9/QLy5TWIIscTXID\n" + - "E8Xk47YwDQYJKoZIhvcNAQEFBQADggEBAKiUV3KK16mP0NpS92fmQkCLqm+qUWyN\n" + - "BfBVgf9/M5pcT8EiTZlS5nAtzAE/eRpBeR3ubLlaAogj4rdH7YYVJcDDLLoB2qM3\n" + - "qeCHu8LFoblkb93UuFDWqRaVPmMlJRnhsRkL1oa2gM2hwQTkBDkP7w5FG1BELCgl\n" + - "gZI2ij2yxjge6pOEwSyZCzzbCcg9pN+dNrYyGEtB4k+BBnPA3N4r14CWbk+uxjrQ\n" + - "6j2Ip+b7wOc5IuMEMl8xwTyjuX3lsLbAZyFI9RCyofwA9NqIZ1GeB6Zd196rubQp\n" + - "93cmBqGGjZUs3wMrGlm7xdjlX6GQ9UvmvkMub9+lL99A5W50QgCmFeI=\n" + - "-----END CERTIFICATE-----\n"; - - public static final String rootCa = - "-----BEGIN CERTIFICATE-----\n" + - "MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx\n" + - "ITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g\n" + - "RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMTYw\n" + - "MTU0MzdaFw0yNjExMTYwMTU0MzdaMIHKMQswCQYDVQQGEwJVUzEQMA4GA1UECBMH\n" + - "QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5j\n" + - "b20sIEluYy4xMzAxBgNVBAsTKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5j\n" + - "b20vcmVwb3NpdG9yeTEwMC4GA1UEAxMnR28gRGFkZHkgU2VjdXJlIENlcnRpZmlj\n" + - "YXRpb24gQXV0aG9yaXR5MREwDwYDVQQFEwgwNzk2OTI4NzCCASIwDQYJKoZIhvcN\n" + - "AQEBBQADggEPADCCAQoCggEBAMQt1RWMnCZM7DI161+4WQFapmGBWTtwY6vj3D3H\n" + - "KrjJM9N55DrtPDAjhI6zMBS2sofDPZVUBJ7fmd0LJR4h3mUpfjWoqVTr9vcyOdQm\n" + - "VZWt7/v+WIbXnvQAjYwqDL1CBM6nPwT27oDyqu9SoWlm2r4arV3aLGbqGmu75RpR\n" + - "SgAvSMeYddi5Kcju+GZtCpyz8/x4fKL4o/K1w/O5epHBp+YlLpyo7RJlbmr2EkRT\n" + - "cDCVw5wrWCs9CHRK8r5RsL+H0EwnWGu1NcWdrxcx+AuP7q2BNgWJCJjPOq8lh8BJ\n" + - "6qf9Z/dFjpfMFDniNoW1fho3/Rb2cRGadDAW/hOUoz+EDU8CAwEAAaOCATIwggEu\n" + - "MB0GA1UdDgQWBBT9rGEyk2xF1uLuhV+auud2mWjM5zAfBgNVHSMEGDAWgBTSxLDS\n" + - "kdRMEXGzYcs9of7dqGrU4zASBgNVHRMBAf8ECDAGAQH/AgEAMDMGCCsGAQUFBwEB\n" + - "BCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZ29kYWRkeS5jb20wRgYDVR0f\n" + - "BD8wPTA7oDmgN4Y1aHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBv\n" + - "c2l0b3J5L2dkcm9vdC5jcmwwSwYDVR0gBEQwQjBABgRVHSAAMDgwNgYIKwYBBQUH\n" + - "AgEWKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeTAO\n" + - "BgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBANKGwOy9+aG2Z+5mC6IG\n" + - "OgRQjhVyrEp0lVPLN8tESe8HkGsz2ZbwlFalEzAFPIUyIXvJxwqoJKSQ3kbTJSMU\n" + - "A2fCENZvD117esyfxVgqwcSeIaha86ykRvOe5GPLL5CkKSkB2XIsKd83ASe8T+5o\n" + - "0yGPwLPk9Qnt0hCqU7S+8MxZC9Y7lhyVJEnfzuz9p0iRFEUOOjZv2kWzRaJBydTX\n" + - "RE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsxuxN89txJx9OjxUUAiKEngHUuH\n" + - "qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV\n" + - "U+4=\n" + - "-----END CERTIFICATE-----\n" + - "-----BEGIN CERTIFICATE-----\n" + - "MIIE+zCCBGSgAwIBAgICAQ0wDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Zh\n" + - "bGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu\n" + - "Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g\n" + - "QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAe\n" + - "BgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTA0MDYyOTE3MDYyMFoX\n" + - "DTI0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBE\n" + - "YWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3MgMiBDZXJ0\n" + - "aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgC\n" + - "ggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv\n" + - "2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+q\n" + - "N1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiO\n" + - "r18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lN\n" + - "f4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+YihfukEH\n" + - "U1jPEX44dMX4/7VpkI+EdOqXG68CAQOjggHhMIIB3TAdBgNVHQ4EFgQU0sSw0pHU\n" + - "TBFxs2HLPaH+3ahq1OMwgdIGA1UdIwSByjCBx6GBwaSBvjCBuzEkMCIGA1UEBxMb\n" + - "VmFsaUNlcnQgVmFsaWRhdGlvbiBOZXR3b3JrMRcwFQYDVQQKEw5WYWxpQ2VydCwg\n" + - "SW5jLjE1MDMGA1UECxMsVmFsaUNlcnQgQ2xhc3MgMiBQb2xpY3kgVmFsaWRhdGlv\n" + - "biBBdXRob3JpdHkxITAfBgNVBAMTGGh0dHA6Ly93d3cudmFsaWNlcnQuY29tLzEg\n" + - "MB4GCSqGSIb3DQEJARYRaW5mb0B2YWxpY2VydC5jb22CAQEwDwYDVR0TAQH/BAUw\n" + - "AwEB/zAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmdv\n" + - "ZGFkZHkuY29tMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jZXJ0aWZpY2F0ZXMu\n" + - "Z29kYWRkeS5jb20vcmVwb3NpdG9yeS9yb290LmNybDBLBgNVHSAERDBCMEAGBFUd\n" + - "IAAwODA2BggrBgEFBQcCARYqaHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNv\n" + - "bS9yZXBvc2l0b3J5MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOBgQC1\n" + - "QPmnHfbq/qQaQlpE9xXUhUaJwL6e4+PrxeNYiY+Sn1eocSxI0YGyeR+sBjUZsE4O\n" + - "WBsUs5iB0QQeyAfJg594RAoYC5jcdnplDQ1tgMQLARzLrUc+cb53S8wGd9D0Vmsf\n" + - "SxOaFIqII6hR8INMqzW/Rn453HWkrugp++85j09VZw==\n" + - "-----END CERTIFICATE-----\n" + - "-----BEGIN CERTIFICATE-----\n" + - "MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0\n" + - "IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz\n" + - "BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y\n" + - "aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG\n" + - "9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy\n" + - "NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y\n" + - "azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs\n" + - "YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw\n" + - "Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl\n" + - "cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY\n" + - "dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9\n" + - "WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS\n" + - "v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v\n" + - "UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu\n" + - "IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC\n" + - "W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd\n" + - "-----END CERTIFICATE-----\n"; - @Inject private KeystoreDao _ksDao; @Inject @@ -781,7 +599,7 @@ public class ConsoleProxyManagerImpl extends ManagerBase implements ConsoleProxy if(proxy.getActiveSession() >= _capacityPerProxy){ it.remove(); } - } + } if (s_logger.isTraceEnabled()) { s_logger.trace("Running proxy pool size : " + runningList.size()); for (ConsoleProxyVO proxy : runningList) { @@ -1338,7 +1156,7 @@ public class ConsoleProxyManagerImpl extends ManagerBase implements ConsoleProxy //expunge the vm boolean result = _itMgr.expunge(proxy, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount()); if (result) { - HostVO host = _hostDao.findByTypeNameAndZoneId(proxy.getDataCenterId(), proxy.getHostName(), + HostVO host = _hostDao.findByTypeNameAndZoneId(proxy.getDataCenterId(), proxy.getHostName(), Host.Type.ConsoleProxy); if (host != null) { s_logger.debug("Removing host entry for proxy id=" + vmId); @@ -1363,9 +1181,9 @@ public class ConsoleProxyManagerImpl extends ManagerBase implements ConsoleProxy if (lock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_SYNC)) { KeystoreVO ksVo = _ksDao.findByName(CERTIFICATE_NAME); if (ksVo == null) { - _ksDao.save(CERTIFICATE_NAME, certContent, keyContent, "realhostip.com"); + _ksDao.save(CERTIFICATE_NAME, ConsoleProxyVO.certContent, ConsoleProxyVO.keyContent, "realhostip.com"); KeystoreVO caRoot = new KeystoreVO(); - caRoot.setCertificate(rootCa); + caRoot.setCertificate(ConsoleProxyVO.rootCa); caRoot.setDomainSuffix("realhostip.com"); caRoot.setName("root"); caRoot.setIndex(0); @@ -1906,5 +1724,5 @@ public class ConsoleProxyManagerImpl extends ManagerBase implements ConsoleProxy @Override public void prepareStop(VirtualMachineProfile profile) { } - + } diff --git a/server/src/com/cloud/maint/AgentUpgradeVO.java b/server/src/com/cloud/maint/AgentUpgradeVO.java deleted file mode 100644 index b36f5b7dd6c..00000000000 --- a/server/src/com/cloud/maint/AgentUpgradeVO.java +++ /dev/null @@ -1,63 +0,0 @@ -// 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.maint; - -import org.apache.cloudstack.api.InternalIdentity; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.Id; -import javax.persistence.Table; - - -@Entity -@Table(name="op_host_upgrade") -public class AgentUpgradeVO implements InternalIdentity { - @Id - @Column(name="host_id") - private long id; - - @Column(name="version") - private String version; - - @Column(name="state") - @Enumerated(value=EnumType.STRING) - private UpgradeManager.State state; - - protected AgentUpgradeVO() { - } - - public AgentUpgradeVO(long id, String version, UpgradeManager.State state) { - this.id = id; - this.version = version; - this.state = state; - } - - public long getId() { - return id; - } - - public String getVersion() { - return version; - } - - public UpgradeManager.State getState() { - return state; - } -} diff --git a/server/src/com/cloud/maint/UpgradeManager.java b/server/src/com/cloud/maint/UpgradeManager.java deleted file mode 100644 index 71bca225b32..00000000000 --- a/server/src/com/cloud/maint/UpgradeManager.java +++ /dev/null @@ -1,47 +0,0 @@ -// 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.maint; - -import com.cloud.utils.component.Manager; - -/** - * Upgrade Manager manages the upgrade of agents. - * - */ -public interface UpgradeManager extends Manager { - enum State { - RequiresUpdate, - WaitingForUpdate, - UpToDate; - }; - - /** - * Checks if the agent requires an upgrade before it can process - * any commands. - * - * @param hostId host id. - * @return state of the agent. - */ - State registerForUpgrade(long hostId, String version); - - /** - * @return the URL to download the new agent. - */ -// String getAgentUrl(); - - -} diff --git a/server/src/com/cloud/maint/UpgradeManagerImpl.java b/server/src/com/cloud/maint/UpgradeManagerImpl.java deleted file mode 100644 index 54e1ff4401e..00000000000 --- a/server/src/com/cloud/maint/UpgradeManagerImpl.java +++ /dev/null @@ -1,189 +0,0 @@ -// 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.maint; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.nio.ByteBuffer; -import java.nio.channels.Channels; -import java.nio.channels.ReadableByteChannel; -import java.nio.channels.WritableByteChannel; -import java.util.Date; -import java.util.Map; -import java.util.Properties; - -import javax.ejb.Local; -import javax.inject.Inject; -import javax.naming.ConfigurationException; - -import org.apache.commons.httpclient.HttpClient; -import org.apache.commons.httpclient.HttpException; -import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager; -import org.apache.commons.httpclient.methods.GetMethod; -import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; - -import com.cloud.configuration.dao.ConfigurationDao; -import com.cloud.maint.dao.AgentUpgradeDao; -import com.cloud.utils.PropertiesUtil; -import com.cloud.utils.component.ManagerBase; - -/** - * - * UpgradeManagerImpl implements the upgrade process. It's functionalities - * include - * 1. Identifying agents that require an upgrade before it can connect. - * 2. Spread out a release update to agents so that the entire system - * does not come down at the same time. - */ -@Component -@Local(UpgradeManager.class) -public class UpgradeManagerImpl extends ManagerBase implements UpgradeManager { - private final static Logger s_logger = Logger.getLogger(UpgradeManagerImpl.class); - private static final MultiThreadedHttpConnectionManager s_httpClientManager = new MultiThreadedHttpConnectionManager(); - - String _minimalVersion; - String _recommendedVersion; -// String _upgradeUrl; - String _agentPath; - long _checkInterval; - - @Inject AgentUpgradeDao _upgradeDao; - @Inject ConfigurationDao _configDao; - - @Override - public State registerForUpgrade(long hostId, String version) { - State state = State.UpToDate; - s_logger.debug("Minimal version is " + _minimalVersion + "; version is " + version + "; recommended version is " + _recommendedVersion); - if (Version.compare(version, _minimalVersion) < 0) { - state = State.RequiresUpdate; - } else if (Version.compare(version, _recommendedVersion) < 0) { - state = State.WaitingForUpdate; - } else { - state = State.UpToDate; - } - - /* - if (state != State.UpToDate) { - AgentUpgradeVO vo = _upgradeDao.findById(hostId); - if (vo == null) { - vo = new AgentUpgradeVO(hostId, version, state); - _upgradeDao.persist(vo); - } - } - */ - - return state; - } - - public String deployNewAgent(String url) { - s_logger.info("Updating agent with binary from " + url); - - final HttpClient client = new HttpClient(s_httpClientManager); - final GetMethod method = new GetMethod(url); - int response; - File file = null; - try { - response = client.executeMethod(method); - if (response != HttpURLConnection.HTTP_OK) { - s_logger.warn("Retrieving the agent gives response code: " + response); - return "Retrieving the file from " + url + " got response code: " + response; - } - - final InputStream is = method.getResponseBodyAsStream(); - file = File.createTempFile("agent-", "-" + Long.toString(new Date().getTime())); - file.deleteOnExit(); - - s_logger.debug("Retrieving new agent into " + file.getAbsolutePath()); - - final FileOutputStream fos = new FileOutputStream(file); - - final ByteBuffer buffer = ByteBuffer.allocate(2048); - final ReadableByteChannel in = Channels.newChannel(is); - final WritableByteChannel out = fos.getChannel(); - - while (in.read(buffer) != -1) { - buffer.flip(); - out.write(buffer); - buffer.clear(); - } - - in.close(); - out.close(); - - s_logger.debug("New Agent zip file is now retrieved"); - } catch (final HttpException e) { - return "Unable to retrieve the file from " + url; - } catch (final IOException e) { - return "Unable to retrieve the file from " + url; - } finally { - method.releaseConnection(); - } - - file.delete(); - - return "File will be deployed."; - } - -// @Override -// public String getAgentUrl() { -// return _upgradeUrl; -// } - - @Override - public boolean configure(String name, Map params) throws ConfigurationException { - - final Map configs = _configDao.getConfiguration("UpgradeManager", params); - - File agentUpgradeFile = PropertiesUtil.findConfigFile("agent-update.properties"); - Properties agentUpgradeProps = new Properties(); - try { - if (agentUpgradeFile != null) { - agentUpgradeProps.load(new FileInputStream(agentUpgradeFile)); - } - - _minimalVersion = agentUpgradeProps.getProperty("agent.minimal.version"); - _recommendedVersion = agentUpgradeProps.getProperty("agent.recommended.version"); - - if (_minimalVersion == null) { - _minimalVersion = "0.0.0.0"; - } - - if (_recommendedVersion == null) { - _recommendedVersion = _minimalVersion; - } - - //_upgradeUrl = configs.get("upgrade.url"); - -// if (_upgradeUrl == null) { -// s_logger.debug("There is no upgrade url found in configuration table"); -// // _upgradeUrl = "http://updates.vmops.com/releases/rss.xml"; -// } - - return true; - } catch (IOException ex) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Error reading agent-update.properties: " + ex); - } - } - return false; - } -} diff --git a/server/src/com/cloud/maint/UpgradeManagerMBean.java b/server/src/com/cloud/maint/UpgradeManagerMBean.java deleted file mode 100644 index 1c7cb310b18..00000000000 --- a/server/src/com/cloud/maint/UpgradeManagerMBean.java +++ /dev/null @@ -1,23 +0,0 @@ -// 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.maint; - -import com.cloud.utils.mgmt.ManagementBean; - -public interface UpgradeManagerMBean extends ManagementBean { - public String deployNewAgent(String location); -} diff --git a/server/src/com/cloud/maint/UpgradeMonitor.java b/server/src/com/cloud/maint/UpgradeMonitor.java deleted file mode 100644 index ca78fe22ece..00000000000 --- a/server/src/com/cloud/maint/UpgradeMonitor.java +++ /dev/null @@ -1,34 +0,0 @@ -// 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.maint; - -/** - * has been released. - * - */ -public class UpgradeMonitor implements Runnable { - private String _url; - private long _period; - - public UpgradeMonitor(String url, long period) { - _url = url; - } - - public void run() { - - } -} diff --git a/server/src/com/cloud/maint/dao/AgentUpgradeDao.java b/server/src/com/cloud/maint/dao/AgentUpgradeDao.java deleted file mode 100644 index e9763db5804..00000000000 --- a/server/src/com/cloud/maint/dao/AgentUpgradeDao.java +++ /dev/null @@ -1,23 +0,0 @@ -// 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.maint.dao; - -import com.cloud.maint.AgentUpgradeVO; -import com.cloud.utils.db.GenericDao; - -public interface AgentUpgradeDao extends GenericDao { -} diff --git a/server/src/com/cloud/maint/dao/AgentUpgradeDaoImpl.java b/server/src/com/cloud/maint/dao/AgentUpgradeDaoImpl.java deleted file mode 100644 index 80c6d851aef..00000000000 --- a/server/src/com/cloud/maint/dao/AgentUpgradeDaoImpl.java +++ /dev/null @@ -1,29 +0,0 @@ -// 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.maint.dao; - -import javax.ejb.Local; - -import org.springframework.stereotype.Component; - -import com.cloud.maint.AgentUpgradeVO; -import com.cloud.utils.db.GenericDaoBase; - -@Component -@Local(AgentUpgradeDao.class) -public class AgentUpgradeDaoImpl extends GenericDaoBase implements AgentUpgradeDao { -} diff --git a/server/src/com/cloud/migration/Db21to22MigrationUtil.java b/server/src/com/cloud/migration/Db21to22MigrationUtil.java deleted file mode 100755 index 66a7d59f53a..00000000000 --- a/server/src/com/cloud/migration/Db21to22MigrationUtil.java +++ /dev/null @@ -1,228 +0,0 @@ -// 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.migration; - -import java.io.File; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.util.List; - -import javax.inject.Inject; - -import org.apache.log4j.xml.DOMConfigurator; - -import com.cloud.configuration.Resource; -import com.cloud.configuration.Resource.ResourceType; -import com.cloud.configuration.ResourceCountVO; -import com.cloud.configuration.dao.ConfigurationDao; -import com.cloud.configuration.dao.ResourceCountDao; -import com.cloud.dc.DataCenter.NetworkType; -import com.cloud.dc.DataCenterVO; -import com.cloud.dc.dao.ClusterDao; -import com.cloud.dc.dao.DataCenterDao; -import com.cloud.domain.DomainVO; -import com.cloud.domain.dao.DomainDao; -import com.cloud.host.dao.HostDao; -import com.cloud.resource.ResourceManager; -import com.cloud.user.Account; -import com.cloud.user.dao.AccountDao; -import com.cloud.utils.PropertiesUtil; -import com.cloud.utils.db.SearchBuilder; -import com.cloud.utils.db.SearchCriteria; -import com.cloud.utils.db.Transaction; -import com.cloud.vm.InstanceGroupVMMapVO; -import com.cloud.vm.InstanceGroupVO; -import com.cloud.vm.dao.InstanceGroupDao; -import com.cloud.vm.dao.InstanceGroupVMMapDao; - -public class Db21to22MigrationUtil { - - @Inject private ClusterDao _clusterDao; - @Inject private HostDao _hostDao; - @Inject private AccountDao _accountDao; - @Inject private DomainDao _domainDao; - @Inject private ResourceCountDao _resourceCountDao; - @Inject private InstanceGroupDao _vmGroupDao; - @Inject private InstanceGroupVMMapDao _groupVMMapDao; - @Inject private ConfigurationDao _configurationDao; - @Inject private DataCenterDao _zoneDao; - @Inject private ResourceManager _resourceMgr; - - private void doMigration() { - setupComponents(); - - migrateResourceCounts(); - - setupInstanceGroups(); - - migrateZones(); - - setupClusterGuid(); - - System.out.println("Migration done"); - } - - /* add guid in cluster table */ - private void setupClusterGuid() { - - //FIXME moving out XenServer code out of server. This upgrade step need to be taken care of - /* - XenServerConnectionPool _connPool = XenServerConnectionPool.getInstance(); - List clusters = _clusterDao.listByHyTypeWithoutGuid(HypervisorType.XenServer.toString()); - for (ClusterVO cluster : clusters) { - List hosts = _resourceMgr.listAllHostsInCluster(cluster.getId()); - for (HostVO host : hosts) { - String ip = host.getPrivateIpAddress(); - String username = host.getDetail("username"); - String password = host.getDetail("password"); - if (ip == null || ip.isEmpty() || username == null || username.isEmpty() || password == null - || password.isEmpty()) { - continue; - } - Queue pass=new LinkedList(); - pass.add(password); - Connection conn = _connPool.slaveConnect(ip, username, pass); - if (conn == null) - continue; - Pool.Record pr = null; - try { - pr = XenServerConnectionPool.getPoolRecord(conn); - } catch (Exception e) { - continue; - } finally { - try { - Session.localLogout(conn); - } catch (Exception e) { - } - } - cluster.setGuid(pr.uuid); - _clusterDao.update(cluster.getId(), cluster); - break; - } - } - */ - } - - - /** - * This method migrates the zones based on bug: 7204 - * based on the param direct.attach.untagged.vlan.enabled, we update zone to basic or advanced for 2.2 - */ - private void migrateZones(){ - try { - System.out.println("Migrating zones"); - String val = _configurationDao.getValue("direct.attach.untagged.vlan.enabled"); - NetworkType networkType; - if(val == null || val.equalsIgnoreCase("true")){ - networkType = NetworkType.Basic; - }else{ - networkType = NetworkType.Advanced; - } - List existingZones = _zoneDao.listAll(); - for(DataCenterVO zone : existingZones){ - zone.setNetworkType(networkType); - _zoneDao.update(zone.getId(), zone); - } - } catch (Exception e) { - System.out.println("Unhandled exception in migrateZones()" + e); - } - } - - private void migrateResourceCounts() { - System.out.println("migrating resource counts"); - SearchBuilder sb = _resourceCountDao.createSearchBuilder(); - sb.and("type", sb.entity().getType(), SearchCriteria.Op.EQ); - - for (ResourceType type : Resource.ResourceType.values()) { - SearchCriteria sc = sb.create(); - sc.setParameters("type", type); - - List resourceCounts = _resourceCountDao.search(sc, null); - for (ResourceCountVO resourceCount : resourceCounts) { - if (resourceCount.getAccountId() != null) { - Account acct = _accountDao.findById(resourceCount.getAccountId()); - Long domainId = acct.getDomainId(); - while (domainId != null) { - _resourceCountDao.updateDomainCount(domainId, type, true, resourceCount.getCount()); - DomainVO domain = _domainDao.findById(domainId); - domainId = domain.getParent(); - } - } - } - } - System.out.println("done migrating resource counts"); - } - - private void setupComponents() { - } - - private void setupInstanceGroups() { - System.out.println("setting up vm instance groups"); - - //Search for all the vms that have not null groups - Long vmId = 0L; - Long accountId = 0L; - String groupName; - Transaction txn = Transaction.open(Transaction.CLOUD_DB); - txn.start(); - try { - String request = "SELECT vm.id, uservm.account_id, vm.group from vm_instance vm, user_vm uservm where vm.group is not null and vm.removed is null and vm.id=uservm.id order by id"; - System.out.println(request); - PreparedStatement statement = txn.prepareStatement(request); - ResultSet result = statement.executeQuery(); - while (result.next()) { - vmId = result.getLong(1); - accountId = result.getLong(2); - groupName = result.getString(3); - InstanceGroupVO group = _vmGroupDao.findByAccountAndName(accountId, groupName); - //Create vm group if the group doesn't exist for this account - if (group == null) { - group = new InstanceGroupVO(groupName, accountId); - group = _vmGroupDao.persist(group); - System.out.println("Created new isntance group with name " + groupName + " for account id=" + accountId); - } - - if (group != null) { - InstanceGroupVMMapVO groupVmMapVO = new InstanceGroupVMMapVO(group.getId(), vmId); - _groupVMMapDao.persist(groupVmMapVO); - System.out.println("Assigned vm id=" + vmId + " to group with name " + groupName + " for account id=" + accountId); - } - } - txn.commit(); - statement.close(); - } catch (Exception e) { - System.out.println("Unhandled exception: " + e); - } finally { - txn.close(); - } - } - - - public static void main(String[] args) { - File file = PropertiesUtil.findConfigFile("log4j-cloud.xml"); - - if (file != null) { - System.out.println("Log4j configuration from : " + file.getAbsolutePath()); - DOMConfigurator.configureAndWatch(file.getAbsolutePath(), 10000); - } else { - System.out.println("Configure log4j with default properties"); - } - - new Db21to22MigrationUtil().doMigration(); - System.exit(0); - } -} diff --git a/server/src/com/cloud/migration/Db22beta4to22GAMigrationUtil.java b/server/src/com/cloud/migration/Db22beta4to22GAMigrationUtil.java deleted file mode 100644 index 4487d654571..00000000000 --- a/server/src/com/cloud/migration/Db22beta4to22GAMigrationUtil.java +++ /dev/null @@ -1,128 +0,0 @@ -// 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.migration; - -import java.io.File; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; - -import org.apache.log4j.xml.DOMConfigurator; - -import com.cloud.utils.PropertiesUtil; -import com.cloud.utils.db.DB; -import com.cloud.utils.db.Transaction; -import com.cloud.utils.exception.CloudRuntimeException; - -@DB(txn=false) -public class Db22beta4to22GAMigrationUtil { - - private Map pfRuleIdToIpAddressIdMap = new HashMap(); - private final String FindPfIdToPublicIpId = "SELECT id,ip_address_id from firewall_rules where is_static_nat=1"; - private final String FindVmIdPerPfRule = "SELECT instance_id from port_forwarding_rules where id = ?"; - private final String WriteVmIdToIpAddrTable = "UPDATE user_ip_address set vm_id = ? where id = ?"; - protected Db22beta4to22GAMigrationUtil() { - } - - @DB - //This method gets us a map of pf/firewall id <-> ip address id - //Using the keyset, we will iterate over the pf table to find corresponding vm id - //When we get the vm id, we will use the val for each key to update the corresponding ip addr row with the vm id - public void populateMap(){ - Long key = null; - Long val = null; - - Transaction txn = Transaction.open(Transaction.CLOUD_DB); - - StringBuilder sql = new StringBuilder(FindPfIdToPublicIpId); - - PreparedStatement pstmt = null; - try { - pstmt = txn.prepareAutoCloseStatement(sql.toString()); - - ResultSet rs = pstmt.executeQuery(); - while (rs.next()) { - key = rs.getLong("id"); - val = rs.getLong("ip_address_id"); - pfRuleIdToIpAddressIdMap.put(key, val); - } - - } catch (SQLException e) { - throw new CloudRuntimeException("Unable to execute " + pstmt.toString(), e); - } - - } - - @DB - public void updateVmIdForIpAddresses(){ - Transaction txn = Transaction.open(Transaction.CLOUD_DB); - Set pfIds = pfRuleIdToIpAddressIdMap.keySet(); - StringBuilder sql = new StringBuilder(FindVmIdPerPfRule); - Long vmId = null; - Long ipAddressId = null; - PreparedStatement pstmt = null; - for(Long pfId : pfIds){ - try { - pstmt = txn.prepareAutoCloseStatement(sql.toString()); - pstmt.setLong(1, pfId); - ResultSet rs = pstmt.executeQuery(); - while(rs.next()) { - vmId = rs.getLong("instance_id"); - } - ipAddressId = pfRuleIdToIpAddressIdMap.get(pfId); - finallyUpdate(ipAddressId, vmId, txn); - } catch (SQLException e) { - throw new CloudRuntimeException("Unable to execute " + pstmt.toString(), e); - } - } - } - - @DB - public void finallyUpdate(Long ipAddressId, Long vmId, Transaction txn){ - - StringBuilder sql = new StringBuilder(WriteVmIdToIpAddrTable); - - PreparedStatement pstmt = null; - try { - pstmt = txn.prepareAutoCloseStatement(sql.toString()); - pstmt.setLong(1, vmId); - pstmt.setLong(2, ipAddressId); - int rs = pstmt.executeUpdate(); - } catch (SQLException e) { - throw new CloudRuntimeException("Unable to execute " + pstmt.toString(), e); - } - } - - public static void main(String[] args) { - - File file = PropertiesUtil.findConfigFile("log4j-cloud.xml"); - - if(file != null) { - System.out.println("Log4j configuration from : " + file.getAbsolutePath()); - DOMConfigurator.configureAndWatch(file.getAbsolutePath(), 10000); - } else { - System.out.println("Configure log4j with default properties"); - } - - Db22beta4to22GAMigrationUtil util = new Db22beta4to22GAMigrationUtil(); - util.populateMap(); - util.updateVmIdForIpAddresses(); - } -} diff --git a/server/src/com/cloud/maint/Version.java b/utils/src/com/cloud/maint/Version.java similarity index 100% rename from server/src/com/cloud/maint/Version.java rename to utils/src/com/cloud/maint/Version.java From 074df0b4157b9e68e5d4775b3efc0ff79a1ecc04 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Thu, 2 May 2013 15:20:49 -0700 Subject: [PATCH 29/66] Fixed an incorrect unit test for affinity group. Removed some useless pom.xml. --- client/tomcatconf/applicationContext.xml.in | 3 - framework/events/pom.xml | 51 +-- pom.xml | 1 - .../AffinityApiTestConfiguration.java | 366 ------------------ .../affinity/AffinityApiUnitTest.java | 20 +- server/test/resources/affinityContext.xml | 7 +- services/console-proxy/plugin/pom.xml | 8 +- services/console-proxy/pom.xml | 6 +- services/console-proxy/server/pom.xml | 2 +- services/pom.xml | 37 -- services/secondary-storage/pom.xml | 6 +- utils/pom.xml | 3 +- 12 files changed, 44 insertions(+), 466 deletions(-) delete mode 100644 server/test/org/apache/cloudstack/affinity/AffinityApiTestConfiguration.java delete mode 100644 services/pom.xml diff --git a/client/tomcatconf/applicationContext.xml.in b/client/tomcatconf/applicationContext.xml.in index d78700b4b64..36f232c737c 100644 --- a/client/tomcatconf/applicationContext.xml.in +++ b/client/tomcatconf/applicationContext.xml.in @@ -167,7 +167,6 @@ - @@ -303,7 +302,6 @@ - @@ -705,7 +703,6 @@ - diff --git a/framework/events/pom.xml b/framework/events/pom.xml index 7c788c35bbd..747c5a1a667 100644 --- a/framework/events/pom.xml +++ b/framework/events/pom.xml @@ -1,23 +1,14 @@ - + + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 cloud-framework-events Apache CloudStack Framework - Event Notification @@ -30,18 +21,18 @@ org.apache.cloudstack - cloud-utils - ${project.version} - + cloud-utils + ${project.version} + - com.google.code.gson - gson - ${cs.gson.version} + com.google.code.gson + gson + ${cs.gson.version} + + + com.google.guava + guava + ${cs.guava.version} - - install - src - test - diff --git a/pom.xml b/pom.xml index 7f4a74664e0..f20e4af5a4c 100644 --- a/pom.xml +++ b/pom.xml @@ -169,7 +169,6 @@ plugins patches framework - services test client diff --git a/server/test/org/apache/cloudstack/affinity/AffinityApiTestConfiguration.java b/server/test/org/apache/cloudstack/affinity/AffinityApiTestConfiguration.java deleted file mode 100644 index a1224db62c3..00000000000 --- a/server/test/org/apache/cloudstack/affinity/AffinityApiTestConfiguration.java +++ /dev/null @@ -1,366 +0,0 @@ -// 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 org.apache.cloudstack.affinity; - -import java.io.IOException; - -import com.cloud.server.ConfigurationServer; -import com.cloud.user.AccountDetailsDao; -import com.cloud.user.AccountManager; -import com.cloud.user.ResourceLimitService; -import com.cloud.user.UserContextInitializer; -import org.apache.cloudstack.acl.SecurityChecker; -import org.apache.cloudstack.affinity.dao.AffinityGroupDao; -import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao; -import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDaoImpl; -import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; -import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao; -import org.mockito.Mockito; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.FilterType; -import org.springframework.context.annotation.ComponentScan.Filter; -import org.springframework.core.type.classreading.MetadataReader; -import org.springframework.core.type.classreading.MetadataReaderFactory; -import org.springframework.core.type.filter.TypeFilter; -import com.cloud.utils.component.ComponentContext; -import com.cloud.agent.AgentManager; -import com.cloud.alert.AlertManager; -import com.cloud.api.query.dao.UserAccountJoinDaoImpl; -import com.cloud.capacity.dao.CapacityDaoImpl; -import com.cloud.cluster.agentlb.dao.HostTransferMapDaoImpl; -import com.cloud.configuration.dao.ConfigurationDao; -import com.cloud.dc.ClusterDetailsDao; -import com.cloud.dc.dao.DcDetailsDao; -import com.cloud.dc.dao.AccountVlanMapDaoImpl; -import com.cloud.dc.dao.ClusterDaoImpl; -import com.cloud.dc.dao.DataCenterDaoImpl; -import com.cloud.dc.dao.DataCenterIpAddressDaoImpl; -import com.cloud.dc.dao.DataCenterLinkLocalIpAddressDao; -import com.cloud.dc.dao.DataCenterLinkLocalIpAddressDaoImpl; -import com.cloud.dc.dao.DataCenterVnetDaoImpl; -import com.cloud.dc.dao.DcDetailsDaoImpl; -import com.cloud.dc.dao.HostPodDaoImpl; -import com.cloud.dc.dao.PodVlanDaoImpl; -import com.cloud.dc.dao.PodVlanMapDaoImpl; -import com.cloud.dc.dao.VlanDaoImpl; -import com.cloud.domain.dao.DomainDaoImpl; -import com.cloud.event.EventUtils; -import com.cloud.event.dao.EventDao; -import com.cloud.event.dao.EventDaoImpl; -import com.cloud.event.dao.UsageEventDaoImpl; -import com.cloud.host.dao.HostDaoImpl; -import com.cloud.host.dao.HostDetailsDaoImpl; -import com.cloud.host.dao.HostTagsDaoImpl; -import com.cloud.network.Ipv6AddressManager; -import com.cloud.network.NetworkManager; -import com.cloud.network.NetworkModel; -import com.cloud.network.NetworkService; -import com.cloud.network.StorageNetworkManager; -import com.cloud.network.dao.AccountGuestVlanMapDaoImpl; -import com.cloud.network.dao.FirewallRulesCidrsDaoImpl; -import com.cloud.network.dao.FirewallRulesDaoImpl; -import com.cloud.network.dao.IPAddressDaoImpl; -import com.cloud.network.dao.LoadBalancerDaoImpl; -import com.cloud.network.dao.NetworkDao; -import com.cloud.network.dao.NetworkDomainDaoImpl; -import com.cloud.network.dao.NetworkServiceMapDaoImpl; -import com.cloud.network.dao.PhysicalNetworkDaoImpl; -import com.cloud.network.dao.PhysicalNetworkServiceProviderDaoImpl; -import com.cloud.network.dao.PhysicalNetworkTrafficTypeDaoImpl; -import com.cloud.network.dao.UserIpv6AddressDaoImpl; -import com.cloud.network.element.DhcpServiceProvider; -import com.cloud.network.element.IpDeployer; -import com.cloud.network.element.NetworkElement; -import com.cloud.network.guru.NetworkGuru; -import com.cloud.network.lb.LoadBalancingRulesManager; -import com.cloud.network.rules.FirewallManager; -import com.cloud.network.rules.RulesManager; -import com.cloud.network.rules.dao.PortForwardingRulesDaoImpl; -import com.cloud.network.vpc.NetworkACLManager; -import com.cloud.network.vpc.VpcManager; -import com.cloud.network.vpc.dao.PrivateIpDaoImpl; -import com.cloud.network.vpn.RemoteAccessVpnService; -import com.cloud.offerings.dao.NetworkOfferingDao; -import com.cloud.offerings.dao.NetworkOfferingServiceMapDao; -import com.cloud.projects.ProjectManager; -import com.cloud.service.dao.ServiceOfferingDaoImpl; -import com.cloud.storage.dao.DiskOfferingDaoImpl; -import com.cloud.storage.dao.S3DaoImpl; -import com.cloud.storage.dao.SnapshotDaoImpl; -import com.cloud.storage.dao.StoragePoolDetailsDaoImpl; -import com.cloud.storage.dao.SwiftDaoImpl; -import com.cloud.storage.dao.VolumeDaoImpl; -import com.cloud.storage.s3.S3Manager; -import com.cloud.storage.secondary.SecondaryStorageVmManager; -import com.cloud.storage.swift.SwiftManager; -import com.cloud.tags.dao.ResourceTagsDaoImpl; -import com.cloud.user.dao.AccountDao; -import com.cloud.user.dao.AccountDaoImpl; -import com.cloud.user.dao.UserDaoImpl; -import com.cloud.utils.component.SpringComponentScanUtils; -import com.cloud.utils.db.GenericDao; -import com.cloud.utils.db.GenericDaoBase; -import com.cloud.vm.UserVmVO; -import com.cloud.vm.dao.InstanceGroupDaoImpl; -import com.cloud.vm.dao.NicDaoImpl; -import com.cloud.vm.dao.NicSecondaryIpDaoImpl; -import com.cloud.vm.dao.UserVmDao; -import com.cloud.vm.dao.VMInstanceDaoImpl; - -@Configuration -@ComponentScan(basePackageClasses = { AccountVlanMapDaoImpl.class, VolumeDaoImpl.class, HostPodDaoImpl.class, - DomainDaoImpl.class, SwiftDaoImpl.class, ServiceOfferingDaoImpl.class, VlanDaoImpl.class, - IPAddressDaoImpl.class, ResourceTagsDaoImpl.class, InstanceGroupDaoImpl.class, - UserAccountJoinDaoImpl.class, CapacityDaoImpl.class, SnapshotDaoImpl.class, HostDaoImpl.class, - VMInstanceDaoImpl.class, HostTransferMapDaoImpl.class, PortForwardingRulesDaoImpl.class, - PrivateIpDaoImpl.class, UsageEventDaoImpl.class, PodVlanMapDaoImpl.class, DiskOfferingDaoImpl.class, - DataCenterDaoImpl.class, DataCenterIpAddressDaoImpl.class, - DataCenterVnetDaoImpl.class, PodVlanDaoImpl.class, DcDetailsDaoImpl.class, NicSecondaryIpDaoImpl.class, - UserIpv6AddressDaoImpl.class, S3DaoImpl.class, UserDaoImpl.class, NicDaoImpl.class, NetworkDomainDaoImpl.class, - HostDetailsDaoImpl.class, HostTagsDaoImpl.class, ClusterDaoImpl.class, FirewallRulesDaoImpl.class, - FirewallRulesCidrsDaoImpl.class, PhysicalNetworkDaoImpl.class, PhysicalNetworkTrafficTypeDaoImpl.class, - PhysicalNetworkServiceProviderDaoImpl.class, LoadBalancerDaoImpl.class, NetworkServiceMapDaoImpl.class, - PrimaryDataStoreDaoImpl.class, StoragePoolDetailsDaoImpl.class, AffinityGroupServiceImpl.class, - ComponentContext.class, AffinityGroupProcessor.class, UserVmVO.class, EventUtils.class, UserVmVO.class, AccountGuestVlanMapDaoImpl.class - }, includeFilters = { @Filter(value = AffinityApiTestConfiguration.Library.class, type = FilterType.CUSTOM) }, useDefaultFilters = false) -public class AffinityApiTestConfiguration { - - @Bean - public AccountDao accountDao() { - return Mockito.mock(AccountDao.class); - } - - @Bean - public EventUtils eventUtils() { - return Mockito.mock(EventUtils.class); - } - - @Bean - public AffinityGroupProcessor affinityGroupProcessor() { - return Mockito.mock(AffinityGroupProcessor.class); - } - - @Bean - public ComponentContext componentContext() { - return Mockito.mock(ComponentContext.class); - } - - - @Bean - public UserContextInitializer userContextInitializer() { - return Mockito.mock(UserContextInitializer.class); - } - - @Bean - public UserVmVO userVmVO() { - return Mockito.mock(UserVmVO.class); - } - - @Bean - public AffinityGroupDao affinityGroupDao() { - return Mockito.mock(AffinityGroupDao.class); - } - - @Bean - public AffinityGroupVMMapDao affinityGroupVMMapDao() { - return Mockito.mock(AffinityGroupVMMapDao.class); - } - - @Bean - public AccountManager acctMgr() { - return Mockito.mock(AccountManager.class); - } - - @Bean - public NetworkService ntwkSvc() { - return Mockito.mock(NetworkService.class); - } - - @Bean - public NetworkModel ntwkMdl() { - return Mockito.mock(NetworkModel.class); - } - - @Bean - public AlertManager alertMgr() { - return Mockito.mock(AlertManager.class); - } - - @Bean - public SecurityChecker securityChkr() { - return Mockito.mock(SecurityChecker.class); - } - - @Bean - public ResourceLimitService resourceSvc() { - return Mockito.mock(ResourceLimitService.class); - } - - @Bean - public ProjectManager projectMgr() { - return Mockito.mock(ProjectManager.class); - } - - @Bean - public SecondaryStorageVmManager ssvmMgr() { - return Mockito.mock(SecondaryStorageVmManager.class); - } - - @Bean - public SwiftManager swiftMgr() { - return Mockito.mock(SwiftManager.class); - } - - @Bean - public S3Manager s3Mgr() { - return Mockito.mock(S3Manager.class); - } - - @Bean - public VpcManager vpcMgr() { - return Mockito.mock(VpcManager.class); - } - - @Bean - public UserVmDao userVMDao() { - return Mockito.mock(UserVmDao.class); - } - - @Bean - public RulesManager rulesMgr() { - return Mockito.mock(RulesManager.class); - } - - @Bean - public LoadBalancingRulesManager lbRulesMgr() { - return Mockito.mock(LoadBalancingRulesManager.class); - } - - @Bean - public RemoteAccessVpnService vpnMgr() { - return Mockito.mock(RemoteAccessVpnService.class); - } - - @Bean - public NetworkGuru ntwkGuru() { - return Mockito.mock(NetworkGuru.class); - } - - @Bean - public NetworkElement ntwkElement() { - return Mockito.mock(NetworkElement.class); - } - - @Bean - public IpDeployer ipDeployer() { - return Mockito.mock(IpDeployer.class); - } - - @Bean - public DhcpServiceProvider dhcpProvider() { - return Mockito.mock(DhcpServiceProvider.class); - } - - @Bean - public FirewallManager firewallMgr() { - return Mockito.mock(FirewallManager.class); - } - - @Bean - public AgentManager agentMgr() { - return Mockito.mock(AgentManager.class); - } - - @Bean - public StorageNetworkManager storageNtwkMgr() { - return Mockito.mock(StorageNetworkManager.class); - } - - @Bean - public NetworkACLManager ntwkAclMgr() { - return Mockito.mock(NetworkACLManager.class); - } - - @Bean - public Ipv6AddressManager ipv6Mgr() { - return Mockito.mock(Ipv6AddressManager.class); - } - - @Bean - public ConfigurationDao configDao() { - return Mockito.mock(ConfigurationDao.class); - } - - @Bean - public NetworkManager networkManager() { - return Mockito.mock(NetworkManager.class); - } - - @Bean - public NetworkOfferingDao networkOfferingDao() { - return Mockito.mock(NetworkOfferingDao.class); - } - - @Bean - public EventDao eventDao() { - return Mockito.mock(EventDao.class); - } - - @Bean - public NetworkDao networkDao() { - return Mockito.mock(NetworkDao.class); - } - - @Bean - public NetworkOfferingServiceMapDao networkOfferingServiceMapDao() { - return Mockito.mock(NetworkOfferingServiceMapDao.class); - } - - @Bean - public DataCenterLinkLocalIpAddressDao datacenterLinkLocalIpAddressDao() { - return Mockito.mock(DataCenterLinkLocalIpAddressDao.class); - } - - @Bean - public ConfigurationServer configurationServer() { - return Mockito.mock(ConfigurationServer.class); - } - - @Bean - public ClusterDetailsDao clusterDetailsDao() { - return Mockito.mock(ClusterDetailsDao.class); - } - - @Bean - public AccountDetailsDao accountDetailsDao() { - return Mockito.mock(AccountDetailsDao.class); - } - - - public static class Library implements TypeFilter { - - @Override - public boolean match(MetadataReader mdr, MetadataReaderFactory arg1) throws IOException { - mdr.getClassMetadata().getClassName(); - ComponentScan cs = AffinityApiTestConfiguration.class.getAnnotation(ComponentScan.class); - return SpringComponentScanUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs); - } - - } -} diff --git a/server/test/org/apache/cloudstack/affinity/AffinityApiUnitTest.java b/server/test/org/apache/cloudstack/affinity/AffinityApiUnitTest.java index a5e6d15bf0b..f9c5728c4c2 100644 --- a/server/test/org/apache/cloudstack/affinity/AffinityApiUnitTest.java +++ b/server/test/org/apache/cloudstack/affinity/AffinityApiUnitTest.java @@ -16,13 +16,20 @@ // under the License. package org.apache.cloudstack.affinity; -import static org.junit.Assert.*; +import static org.junit.Assert.assertNotNull; +import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.anyLong; -import static org.mockito.Mockito.*; +import static org.mockito.Matchers.anyObject; +import static org.mockito.Matchers.anyString; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.List; +import javax.inject.Inject; +import javax.naming.ConfigurationException; + import org.apache.cloudstack.affinity.dao.AffinityGroupDao; import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao; import org.junit.Before; @@ -49,15 +56,12 @@ import com.cloud.vm.UserVmVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.dao.UserVmDao; -import javax.inject.Inject; -import javax.naming.ConfigurationException; - @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:/affinityContext.xml") public class AffinityApiUnitTest { @Inject - AffinityGroupServiceImpl _affinityService; + AffinityGroupService _affinityService; @Inject AccountManager _acctMgr; @@ -82,7 +86,7 @@ public class AffinityApiUnitTest { @Inject AccountDao _accountDao; - + @Inject EventDao _eventDao; @@ -91,7 +95,6 @@ public class AffinityApiUnitTest { @BeforeClass public static void setUp() throws ConfigurationException { - } @Before @@ -119,6 +122,7 @@ public class AffinityApiUnitTest { @Test public void createAffinityGroupTest() { + when(_groupDao.isNameInUse(anyLong(), anyLong(), eq("group1"))).thenReturn(false); AffinityGroup group = _affinityService.createAffinityGroup("user", domainId, "group1", "mock", "affinity group one"); assertNotNull("Affinity group 'group1' of type 'mock' failed to create ", group); diff --git a/server/test/resources/affinityContext.xml b/server/test/resources/affinityContext.xml index 15476c1a1b3..d41a63d648b 100644 --- a/server/test/resources/affinityContext.xml +++ b/server/test/resources/affinityContext.xml @@ -26,7 +26,7 @@ - + @@ -35,12 +35,7 @@ - - - - - diff --git a/services/console-proxy/plugin/pom.xml b/services/console-proxy/plugin/pom.xml index 4cbe6d1c8f4..55db33bd951 100644 --- a/services/console-proxy/plugin/pom.xml +++ b/services/console-proxy/plugin/pom.xml @@ -20,16 +20,10 @@ 4.0.0 cloud-plugin-console-proxy Apache CloudStack Console Proxy Plugin - pom org.apache.cloudstack - cloud-service-console-proxy + cloudstack-service-console-proxy 4.2.0-SNAPSHOT ../pom.xml - - install - src - test - diff --git a/services/console-proxy/pom.xml b/services/console-proxy/pom.xml index 1453e8cc264..2c9e2e6e2c7 100644 --- a/services/console-proxy/pom.xml +++ b/services/console-proxy/pom.xml @@ -18,14 +18,14 @@ --> 4.0.0 - cloud-service-console-proxy + cloudstack-service-console-proxy Apache CloudStack Console Proxy Service pom org.apache.cloudstack - cloud-services + cloudstack 4.2.0-SNAPSHOT - ../pom.xml + ../../pom.xml install diff --git a/services/console-proxy/server/pom.xml b/services/console-proxy/server/pom.xml index 3ac5d5957f7..c3e360b079f 100644 --- a/services/console-proxy/server/pom.xml +++ b/services/console-proxy/server/pom.xml @@ -22,7 +22,7 @@ Apache CloudStack Console Proxy org.apache.cloudstack - cloud-service-console-proxy + cloudstack-service-console-proxy 4.2.0-SNAPSHOT ../pom.xml diff --git a/services/pom.xml b/services/pom.xml deleted file mode 100644 index 54b22bbbf62..00000000000 --- a/services/pom.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - 4.0.0 - cloud-services - Apache CloudStack Cloud Services - pom - - org.apache.cloudstack - cloudstack - 4.2.0-SNAPSHOT - ../pom.xml - - - install - - - console-proxy - secondary-storage - - diff --git a/services/secondary-storage/pom.xml b/services/secondary-storage/pom.xml index 2c8a1d0b9b8..0797c9895f7 100644 --- a/services/secondary-storage/pom.xml +++ b/services/secondary-storage/pom.xml @@ -18,13 +18,13 @@ --> 4.0.0 - cloud-secondary-storage + cloudstack-service-secondary-storage Apache CloudStack Secondary Storage Service org.apache.cloudstack - cloud-services + cloudstack 4.2.0-SNAPSHOT - ../pom.xml + ../../pom.xml diff --git a/utils/pom.xml b/utils/pom.xml index 27430267cfe..0690c35c57b 100644 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -73,11 +73,12 @@ commons-discovery ${cs.discovery.version} - + commons-logging commons-logging From 3722d66aae90c26bb315dfbebf8489256c7f46e9 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Mon, 6 May 2013 06:29:59 -0700 Subject: [PATCH 30/66] Fixed up unit testing to use only an in class TestConfiguration --- engine/api/pom.xml | 10 +- .../com/cloud/storage/StoragePoolHostVO.java | 4 +- .../StorageAllocatorTestConfiguration.java | 4 +- .../storage/test/ChildTestConfiguration.java | 4 +- .../agent/manager/SimulatorManagerImpl.java | 78 +++- pom.xml | 62 +-- server/pom.xml | 5 + .../com/cloud/network/NetworkServiceImpl.java | 399 ++++++++++-------- .../cloud/servlet/ConsoleProxyServlet.java | 29 +- ...SecurityGroupManagerTestConfiguration.java | 4 +- .../SnapshotDaoTestConfiguration.java | 4 +- .../dao/StoragePoolDaoTestConfiguration.java | 4 +- ...serVmCloneSettingDaoTestConfiguration.java | 4 +- .../vm/dao/UserVmDaoTestConfiguration.java | 4 +- .../com/cloud/vpc/VpcTestConfiguration.java | 4 +- .../affinity/AffinityApiUnitTest.java | 67 ++- .../ChildTestConfiguration.java | 4 +- server/test/resources/affinityContext.xml | 42 -- services/console-proxy/pom.xml | 4 +- services/secondary-storage/pom.xml | 6 +- tools/marvin/pom.xml | 49 ++- .../usage/UsageManagerTestConfiguration.java | 5 +- .../src/com/cloud/utils/AnnotationHelper.java | 28 +- .../component/SpringComponentScanUtils.java | 41 -- .../cloudstack/test/utils/SpringUtils.java | 113 +++++ 25 files changed, 611 insertions(+), 367 deletions(-) delete mode 100644 server/test/resources/affinityContext.xml delete mode 100644 utils/src/com/cloud/utils/component/SpringComponentScanUtils.java create mode 100644 utils/src/org/apache/cloudstack/test/utils/SpringUtils.java diff --git a/engine/api/pom.xml b/engine/api/pom.xml index 1e8e8c3eb38..1b8f26c2320 100644 --- a/engine/api/pom.xml +++ b/engine/api/pom.xml @@ -30,11 +30,6 @@ cloud-api ${project.version} - - org.apache.cloudstack - cloud-framework-api - ${project.version} - org.apache.cxf cxf-bundle-jaxrs @@ -55,6 +50,11 @@ cloud-framework-rest ${project.version} + + org.apache.cloudstack + cloud-framework-ipc + ${project.version} + install diff --git a/engine/schema/src/com/cloud/storage/StoragePoolHostVO.java b/engine/schema/src/com/cloud/storage/StoragePoolHostVO.java index 1a4b9b87dce..1b02f6d9754 100644 --- a/engine/schema/src/com/cloud/storage/StoragePoolHostVO.java +++ b/engine/schema/src/com/cloud/storage/StoragePoolHostVO.java @@ -50,11 +50,11 @@ public class StoragePoolHostVO implements StoragePoolHostAssoc { private String localPath; @Column(name=GenericDaoBase.CREATED_COLUMN) - private final Date created = null; + private Date created = null; @Column(name="last_updated") @Temporal(value=TemporalType.TIMESTAMP) - private final Date lastUpdated = null; + private Date lastUpdated = null; public StoragePoolHostVO() { diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/allocator/StorageAllocatorTestConfiguration.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/allocator/StorageAllocatorTestConfiguration.java index b815fc13446..4790086b2e1 100644 --- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/allocator/StorageAllocatorTestConfiguration.java +++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/allocator/StorageAllocatorTestConfiguration.java @@ -20,6 +20,7 @@ import java.io.IOException; import org.apache.cloudstack.storage.allocator.StorageAllocatorTestConfiguration.Library; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDaoImpl; +import org.apache.cloudstack.test.utils.SpringUtils; import org.mockito.Mockito; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -36,7 +37,6 @@ import com.cloud.host.dao.HostDaoImpl; import com.cloud.storage.StorageManager; import com.cloud.storage.dao.StoragePoolDetailsDaoImpl; import com.cloud.storage.dao.VMTemplateDaoImpl; -import com.cloud.utils.component.SpringComponentScanUtils; import com.cloud.vm.UserVmManager; @@ -67,7 +67,7 @@ public class StorageAllocatorTestConfiguration { public boolean match(MetadataReader mdr, MetadataReaderFactory arg1) throws IOException { mdr.getClassMetadata().getClassName(); ComponentScan cs = StorageAllocatorTestConfiguration.class.getAnnotation(ComponentScan.class); - return SpringComponentScanUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs); + return SpringUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs); } } } diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/ChildTestConfiguration.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/ChildTestConfiguration.java index a063bdda8ad..0dcdebd6553 100644 --- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/ChildTestConfiguration.java +++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/ChildTestConfiguration.java @@ -24,6 +24,7 @@ import org.apache.cloudstack.framework.rpc.RpcProvider; import org.apache.cloudstack.storage.HostEndpointRpcServer; import org.apache.cloudstack.storage.endpoint.EndPointSelector; import org.apache.cloudstack.storage.test.ChildTestConfiguration.Library; +import org.apache.cloudstack.test.utils.SpringUtils; import org.mockito.Mockito; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -75,7 +76,6 @@ import com.cloud.storage.swift.SwiftManager; import com.cloud.tags.dao.ResourceTagsDaoImpl; import com.cloud.template.TemplateManager; import com.cloud.user.dao.UserDaoImpl; -import com.cloud.utils.component.SpringComponentScanUtils; import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.dao.ConsoleProxyDaoImpl; import com.cloud.vm.dao.DomainRouterDao; @@ -222,7 +222,7 @@ public class ChildTestConfiguration extends TestConfiguration { public boolean match(MetadataReader mdr, MetadataReaderFactory arg1) throws IOException { mdr.getClassMetadata().getClassName(); ComponentScan cs = ChildTestConfiguration.class.getAnnotation(ComponentScan.class); - return SpringComponentScanUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs); + return SpringUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs); } } diff --git a/plugins/hypervisors/simulator/src/com/cloud/agent/manager/SimulatorManagerImpl.java b/plugins/hypervisors/simulator/src/com/cloud/agent/manager/SimulatorManagerImpl.java index c234cc5cb2e..ab6eec3394a 100644 --- a/plugins/hypervisors/simulator/src/com/cloud/agent/manager/SimulatorManagerImpl.java +++ b/plugins/hypervisors/simulator/src/com/cloud/agent/manager/SimulatorManagerImpl.java @@ -16,12 +16,74 @@ // under the License. package com.cloud.agent.manager; -import com.cloud.agent.api.*; +import java.util.HashMap; +import java.util.Map; + +import javax.ejb.Local; +import javax.inject.Inject; +import javax.naming.ConfigurationException; + +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; + +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.AttachIsoCommand; +import com.cloud.agent.api.AttachVolumeCommand; +import com.cloud.agent.api.BackupSnapshotCommand; +import com.cloud.agent.api.BumpUpPriorityCommand; +import com.cloud.agent.api.CheckHealthCommand; +import com.cloud.agent.api.CheckNetworkCommand; +import com.cloud.agent.api.CheckRouterCommand; +import com.cloud.agent.api.CheckVirtualMachineCommand; +import com.cloud.agent.api.CleanupNetworkRulesCmd; +import com.cloud.agent.api.ClusterSyncCommand; +import com.cloud.agent.api.Command; +import com.cloud.agent.api.ComputeChecksumCommand; +import com.cloud.agent.api.CreatePrivateTemplateFromSnapshotCommand; +import com.cloud.agent.api.CreatePrivateTemplateFromVolumeCommand; +import com.cloud.agent.api.CreateStoragePoolCommand; +import com.cloud.agent.api.CreateVolumeFromSnapshotCommand; +import com.cloud.agent.api.DeleteSnapshotBackupCommand; +import com.cloud.agent.api.DeleteStoragePoolCommand; +import com.cloud.agent.api.GetDomRVersionCmd; +import com.cloud.agent.api.GetHostStatsCommand; +import com.cloud.agent.api.GetStorageStatsCommand; +import com.cloud.agent.api.GetVmStatsCommand; +import com.cloud.agent.api.GetVncPortCommand; +import com.cloud.agent.api.MaintainCommand; +import com.cloud.agent.api.ManageSnapshotCommand; +import com.cloud.agent.api.MigrateCommand; +import com.cloud.agent.api.ModifyStoragePoolCommand; +import com.cloud.agent.api.NetworkUsageCommand; +import com.cloud.agent.api.PingTestCommand; +import com.cloud.agent.api.PrepareForMigrationCommand; +import com.cloud.agent.api.RebootCommand; +import com.cloud.agent.api.SecStorageSetupCommand; +import com.cloud.agent.api.SecStorageVMSetupCommand; +import com.cloud.agent.api.SecurityGroupRulesCmd; +import com.cloud.agent.api.StartCommand; +import com.cloud.agent.api.StopCommand; +import com.cloud.agent.api.StoragePoolInfo; import com.cloud.agent.api.check.CheckSshCommand; import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand; import com.cloud.agent.api.proxy.WatchConsoleProxyLoadCommand; -import com.cloud.agent.api.routing.*; -import com.cloud.agent.api.storage.*; +import com.cloud.agent.api.routing.DhcpEntryCommand; +import com.cloud.agent.api.routing.IpAssocCommand; +import com.cloud.agent.api.routing.LoadBalancerConfigCommand; +import com.cloud.agent.api.routing.SavePasswordCommand; +import com.cloud.agent.api.routing.SetFirewallRulesCommand; +import com.cloud.agent.api.routing.SetPortForwardingRulesCommand; +import com.cloud.agent.api.routing.SetStaticNatRulesCommand; +import com.cloud.agent.api.routing.VmDataCommand; +import com.cloud.agent.api.storage.CopyVolumeCommand; +import com.cloud.agent.api.storage.CreateCommand; +import com.cloud.agent.api.storage.DeleteTemplateCommand; +import com.cloud.agent.api.storage.DestroyCommand; +import com.cloud.agent.api.storage.DownloadCommand; +import com.cloud.agent.api.storage.DownloadProgressCommand; +import com.cloud.agent.api.storage.ListTemplateCommand; +import com.cloud.agent.api.storage.ListVolumeCommand; +import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand; import com.cloud.simulator.MockConfigurationVO; import com.cloud.simulator.MockHost; import com.cloud.simulator.MockVMVO; @@ -34,14 +96,6 @@ import com.cloud.utils.db.DB; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.VirtualMachine.State; -import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; - -import javax.ejb.Local; -import javax.inject.Inject; -import javax.naming.ConfigurationException; -import java.util.HashMap; -import java.util.Map; @Component @Local(value = { SimulatorManager.class }) @@ -256,7 +310,7 @@ public class SimulatorManagerImpl extends ManagerBase implements SimulatorManage return Answer.createUnsupportedCommandAnswer(cmd); } } catch(Exception e) { - s_logger.error("Failed execute cmd: " + e.toString()); + s_logger.error("Failed execute cmd: ", e); txn.rollback(); return new Answer(cmd, false, e.toString()); } finally { diff --git a/pom.xml b/pom.xml index f20e4af5a4c..9dbd1bf8d7a 100644 --- a/pom.xml +++ b/pom.xml @@ -1,13 +1,12 @@ + 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. --> 4.0.0 @@ -171,6 +170,7 @@ framework test client + services @@ -206,22 +206,18 @@ ${org.springframework.version} org.mockito @@ -265,6 +261,20 @@ ${basedir}/${cs.target.dir}/test-classes + + maven-clean-plugin + + true + + + target + + **/* + + + + + org.apache.maven.plugins maven-release-plugin @@ -504,7 +514,7 @@ target-eclipse - + developer tools/devcloud/devcloud.cfg @@ -521,7 +531,7 @@ developer - + diff --git a/server/pom.xml b/server/pom.xml index 808dd3eee0a..429d60819e3 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -95,6 +95,11 @@ cloud-framework-events ${project.version} + + org.apache.cloudstack + cloud-utils + ${project.version} + install diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java b/server/src/com/cloud/network/NetworkServiceImpl.java index 230d907aaa3..5e8be92fdb5 100755 --- a/server/src/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/com/cloud/network/NetworkServiceImpl.java @@ -5,7 +5,7 @@ // 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, @@ -16,13 +16,55 @@ // under the License. package com.cloud.network; +import java.net.Inet6Address; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.security.InvalidParameterException; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; +import java.util.UUID; + +import javax.ejb.Local; +import javax.inject.Inject; +import javax.naming.ConfigurationException; + +import org.apache.cloudstack.acl.ControlledEntity.ACLType; +import org.apache.cloudstack.acl.SecurityChecker; +import org.apache.cloudstack.acl.SecurityChecker.AccessType; +import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd; +import org.apache.cloudstack.api.command.admin.network.ListDedicatedGuestVlanRangesCmd; +import org.apache.cloudstack.api.command.admin.usage.ListTrafficTypeImplementorsCmd; +import org.apache.cloudstack.api.command.user.network.CreateNetworkCmd; +import org.apache.cloudstack.api.command.user.network.ListNetworksCmd; +import org.apache.cloudstack.api.command.user.network.RestartNetworkCmd; +import org.apache.cloudstack.api.command.user.vm.ListNicsCmd; +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; + import com.cloud.configuration.Config; import com.cloud.configuration.ConfigurationManager; import com.cloud.configuration.dao.ConfigurationDao; -import com.cloud.dc.*; +import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter.NetworkType; +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.DataCenterVnetVO; +import com.cloud.dc.Pod; import com.cloud.dc.Vlan.VlanType; -import com.cloud.dc.dao.*; +import com.cloud.dc.VlanVO; +import com.cloud.dc.dao.AccountVlanMapDao; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.dc.dao.DataCenterVnetDao; +import com.cloud.dc.dao.HostPodDao; +import com.cloud.dc.dao.VlanDao; import com.cloud.deploy.DeployDestination; import com.cloud.domain.Domain; import com.cloud.domain.DomainVO; @@ -32,7 +74,14 @@ import com.cloud.event.EventTypes; import com.cloud.event.UsageEventUtils; import com.cloud.event.dao.EventDao; import com.cloud.event.dao.UsageEventDao; -import com.cloud.exception.*; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientAddressCapacityException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.PermissionDeniedException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.exception.UnsupportedServiceException; import com.cloud.host.dao.HostDao; import com.cloud.network.IpAddress.State; import com.cloud.network.Network.Capability; @@ -44,7 +93,22 @@ import com.cloud.network.Networks.TrafficType; import com.cloud.network.PhysicalNetwork.BroadcastDomainRange; import com.cloud.network.VirtualRouterProvider.VirtualRouterProviderType; import com.cloud.network.addr.PublicIp; -import com.cloud.network.dao.*; +import com.cloud.network.dao.AccountGuestVlanMapDao; +import com.cloud.network.dao.AccountGuestVlanMapVO; +import com.cloud.network.dao.FirewallRulesDao; +import com.cloud.network.dao.IPAddressDao; +import com.cloud.network.dao.IPAddressVO; +import com.cloud.network.dao.NetworkDao; +import com.cloud.network.dao.NetworkDomainDao; +import com.cloud.network.dao.NetworkDomainVO; +import com.cloud.network.dao.NetworkServiceMapDao; +import com.cloud.network.dao.NetworkVO; +import com.cloud.network.dao.PhysicalNetworkDao; +import com.cloud.network.dao.PhysicalNetworkServiceProviderDao; +import com.cloud.network.dao.PhysicalNetworkServiceProviderVO; +import com.cloud.network.dao.PhysicalNetworkTrafficTypeDao; +import com.cloud.network.dao.PhysicalNetworkTrafficTypeVO; +import com.cloud.network.dao.PhysicalNetworkVO; import com.cloud.network.element.NetworkElement; import com.cloud.network.element.VirtualRouterElement; import com.cloud.network.element.VpcVirtualRouterElement; @@ -68,7 +132,14 @@ import com.cloud.projects.ProjectManager; import com.cloud.server.ResourceTag.TaggedResourceType; import com.cloud.tags.ResourceTagVO; import com.cloud.tags.dao.ResourceTagDao; -import com.cloud.user.*; +import com.cloud.user.Account; +import com.cloud.user.AccountManager; +import com.cloud.user.AccountVO; +import com.cloud.user.DomainManager; +import com.cloud.user.ResourceLimitService; +import com.cloud.user.User; +import com.cloud.user.UserContext; +import com.cloud.user.UserVO; import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.UserDao; import com.cloud.utils.AnnotationHelper; @@ -76,36 +147,29 @@ import com.cloud.utils.Journal; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; import com.cloud.utils.component.ManagerBase; -import com.cloud.utils.db.*; +import com.cloud.utils.db.DB; +import com.cloud.utils.db.Filter; +import com.cloud.utils.db.JoinBuilder; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria.Op; +import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.NetUtils; -import com.cloud.vm.*; -import com.cloud.vm.dao.*; -import org.apache.cloudstack.acl.ControlledEntity.ACLType; -import org.apache.cloudstack.acl.SecurityChecker; -import org.apache.cloudstack.acl.SecurityChecker.AccessType; -import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd; -import org.apache.cloudstack.api.command.admin.network.ListDedicatedGuestVlanRangesCmd; -import org.apache.cloudstack.api.command.admin.usage.ListTrafficTypeImplementorsCmd; -import org.apache.cloudstack.api.command.user.network.CreateNetworkCmd; -import org.apache.cloudstack.api.command.user.network.ListNetworksCmd; -import org.apache.cloudstack.api.command.user.network.RestartNetworkCmd; -import org.apache.cloudstack.api.command.user.vm.ListNicsCmd; -import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; - -import javax.ejb.Local; -import javax.inject.Inject; -import javax.naming.ConfigurationException; -import java.net.Inet6Address; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.security.InvalidParameterException; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.*; +import com.cloud.vm.Nic; +import com.cloud.vm.NicSecondaryIp; +import com.cloud.vm.NicVO; +import com.cloud.vm.ReservationContext; +import com.cloud.vm.ReservationContextImpl; +import com.cloud.vm.SecondaryStorageVmVO; +import com.cloud.vm.UserVmVO; +import com.cloud.vm.VMInstanceVO; +import com.cloud.vm.VirtualMachine; +import com.cloud.vm.dao.NicDao; +import com.cloud.vm.dao.NicSecondaryIpDao; +import com.cloud.vm.dao.NicSecondaryIpVO; +import com.cloud.vm.dao.UserVmDao; +import com.cloud.vm.dao.VMInstanceDao; /** * NetworkServiceImpl implements NetworkService. @@ -151,9 +215,9 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { @Inject UsageEventDao _usageEventDao; - + @Inject List _networkGurus; - + @Inject NetworkDomainDao _networkDomainDao; @Inject @@ -161,10 +225,10 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { @Inject FirewallRulesDao _firewallDao; - + @Inject ResourceLimitService _resourceLimitMgr; - + @Inject DomainManager _domainMgr; @Inject @@ -175,7 +239,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { PhysicalNetworkDao _physicalNetworkDao; @Inject PhysicalNetworkServiceProviderDao _pNSPDao; - + @Inject PhysicalNetworkTrafficTypeDao _pNTrafficTypeDao; @@ -255,7 +319,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { if (purposes == null || purposes.isEmpty()) { // since no active rules are there check if any rules are applied on the public IP but are in // revoking state - + purposes = getPublicIpPurposeInRules(ip, true, includingFirewall); if (ip.isOneToOneNat()) { if (purposes == null) { @@ -372,9 +436,9 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { } return true; } - - + + private Set getPublicIpPurposeInRules(PublicIp ip, boolean includeRevoked, boolean includingFirewall) { Set result = new HashSet(); @@ -403,15 +467,15 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { return _networksDao.listByZoneAndGuestType(owner.getId(), zoneId, Network.GuestType.Isolated, false); } - + @Override public List getIsolatedNetworksWithSourceNATOwnedByAccountInZone(long zoneId, Account owner) { return _networksDao.listSourceNATEnabledNetworks(owner.getId(), zoneId, Network.GuestType.Isolated); } - - + + @Override @ActionEvent(eventType = EventTypes.EVENT_NET_IP_ASSIGN, eventDescription = "allocating Ip", create = true) @@ -457,7 +521,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { _accountMgr.checkAccess(caller, null, false, ipOwner); long callerUserId = UserContext.current().getCallerUserId(); DataCenter zone = _configMgr.getZone(zoneId); - + return _networkMgr.allocateIp(ipOwner, isSystem, caller, callerUserId, zone); } @@ -489,6 +553,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { } + @Override public NicSecondaryIp allocateSecondaryGuestIP (Account ipOwner, long zoneId, Long nicId, Long networkId, String requestedIp) throws InsufficientAddressCapacityException { Long accountId = null; @@ -596,6 +661,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { } } + @Override @DB public boolean releaseSecondaryIpFromNic (long ipAddressId) { Account caller = UserContext.current().getCaller(); @@ -757,7 +823,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { public Network getNetwork(long id) { return _networksDao.findById(id); } - + private void checkSharedNetworkCidrOverlap(Long zoneId, long physicalNetworkId, String cidr) { if (zoneId == null || cidr == null) { @@ -808,7 +874,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { } } } - + @Override @DB @ActionEvent(eventType = EventTypes.EVENT_NETWORK_CREATE, eventDescription = "creating network") @@ -840,15 +906,12 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { if (ntwkOff == null || ntwkOff.isSystemOnly()) { InvalidParameterValueException ex = new InvalidParameterValueException("Unable to find network offering by specified id"); if (ntwkOff != null) { - ex.addProxyObject(ntwkOff, networkOfferingId, "networkOfferingId"); + ex.addProxyObject(ntwkOff, networkOfferingId, "networkOfferingId"); // Get the VO object's table name. String tablename = AnnotationHelper.getTableName(ntwkOff); if (tablename != null) { ex.addProxyObject(tablename, networkOfferingId, "networkOfferingId"); - } else { - s_logger.info("\nCould not retrieve table name (annotation) from " + tablename + " VO proxy object\n"); } - throw ex; } throw ex; } @@ -870,12 +933,12 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { if (zone == null) { throw new InvalidParameterValueException("Specified zone id was not found"); } - + if (Grouping.AllocationState.Disabled == zone.getAllocationState() && !_accountMgr.isRootAdmin(caller.getType())) { // See DataCenterVO.java PermissionDeniedException ex = new PermissionDeniedException("Cannot perform this operation since specified Zone is currently disabled"); ex.addProxyObject(zone, zoneId, "zoneId"); - throw ex; + throw ex; } // Only domain and account ACL types are supported in Acton. @@ -895,7 +958,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { } } else if (ntwkOff.getGuestType() == GuestType.Shared) { if (!(aclType == ACLType.Domain || aclType == ACLType.Account)) { - throw new InvalidParameterValueException("AclType should be " + ACLType.Domain + " or " + + throw new InvalidParameterValueException("AclType should be " + ACLType.Domain + " or " + ACLType.Account + " for network of type " + Network.GuestType.Shared); } } @@ -931,7 +994,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { } DomainVO domain = _domainDao.findById(domainId); - if (domain == null) { + if (domain == null) { throw new InvalidParameterValueException("Unable to find domain by specified id"); } _accountMgr.checkAccess(caller, domain); @@ -957,7 +1020,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { if (startIPv6 != null) { ipv6 = true; } - + if (gateway != null) { try { // getByName on a literal representation will only check validity of the address @@ -974,8 +1037,8 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { throw new InvalidParameterValueException("Gateway parameter is invalid"); } } - - + + String cidr = null; if (ipv4) { // if end ip is not specified, default it to startIp @@ -1008,18 +1071,18 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { } } - + if (ipv6) { if (endIPv6 == null) { endIPv6 = startIPv6; } _networkModel.checkIp6Parameters(startIPv6, endIPv6, ip6Gateway, ip6Cidr); - + if (zone.getNetworkType() != NetworkType.Advanced || ntwkOff.getGuestType() != Network.GuestType.Shared) { throw new InvalidParameterValueException("Can only support create IPv6 network with advance shared network!"); } } - + // Regular user can create Guest Isolated Source Nat enabled network only if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL && (ntwkOff.getTrafficType() != TrafficType.Guest || ntwkOff.getGuestType() != Network.GuestType.Isolated @@ -1033,7 +1096,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL && (ntwkOff.getSpecifyVlan() || vlanId != null)) { throw new InvalidParameterValueException("Regular user is not allowed to specify vlanId"); } - + if (ipv4) { // For non-root admins check cidr limit - if it's allowed by global config value if (caller.getType() != Account.ACCOUNT_TYPE_ADMIN && cidr != null) { @@ -1051,7 +1114,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { if (ipv6 && providersConfiguredForExternalNetworking(ntwkProviders)) { throw new InvalidParameterValueException("Cannot support IPv6 on network offering with external devices!"); } - + if (cidr != null && providersConfiguredForExternalNetworking(ntwkProviders)) { if (ntwkOff.getGuestType() == GuestType.Shared && (zone.getNetworkType() == NetworkType.Advanced) && isSharedNetworkOfferingWithServices(networkOfferingId)) { @@ -1067,9 +1130,9 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { // 2) GuestType is Isolated, but SourceNat service is disabled boolean createVlan = (startIP != null && endIP != null && zone.getNetworkType() == NetworkType.Advanced && ((ntwkOff.getGuestType() == Network.GuestType.Shared) - || (ntwkOff.getGuestType() == GuestType.Isolated && + || (ntwkOff.getGuestType() == GuestType.Isolated && !areServicesSupportedByNetworkOffering(ntwkOff.getId(), Service.SourceNat)))); - + if (!createVlan) { // Only support advance shared network in IPv6, which means createVlan is a must if (ipv6) { @@ -1087,7 +1150,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { } else { s_logger.info("\nCould not retrieve table name (annotation) from " + tablename + " VO proxy object\n"); } - throw ex; + throw ex; } Transaction txn = Transaction.currentTxn(); @@ -1114,15 +1177,15 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { if (!_configMgr.isOfferingForVpc(ntwkOff)){ throw new InvalidParameterValueException("Network offering can't be used for VPC networks"); } - network = _vpcMgr.createVpcGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId, + network = _vpcMgr.createVpcGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId, networkDomain, owner, sharedDomainId, pNtwk, zoneId, aclType, subdomainAccess, vpcId, caller); } else { if (_configMgr.isOfferingForVpc(ntwkOff)){ throw new InvalidParameterValueException("Network offering can be used for VPC networks only"); } - network = _networkMgr.createGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId, + network = _networkMgr.createGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId, networkDomain, owner, sharedDomainId, pNtwk, zoneId, aclType, subdomainAccess, vpcId, ip6Gateway, ip6Cidr); - } + } if (caller.getType() == Account.ACCOUNT_TYPE_ADMIN && createVlan) { // Create vlan ip range @@ -1232,13 +1295,13 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { } else { permittedAccounts.clear(); Project project = _projectMgr.getProject(projectId); - if (project == null) { + if (project == null) { throw new InvalidParameterValueException("Unable to find project by specified id"); } if (!_projectMgr.canAccessProjectAccount(caller, project.getProjectAccountId())) { // getProject() returns type ProjectVO. InvalidParameterValueException ex = new InvalidParameterValueException("Account " + caller + " cannot access specified project id"); - ex.addProxyObject(project, projectId, "projectId"); + ex.addProxyObject(project, projectId, "projectId"); throw ex; } permittedAccounts.add(project.getProjectAccountId()); @@ -1250,15 +1313,15 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { path = _domainDao.findById(domainId).getPath(); } else { path = _domainDao.findById(caller.getDomainId()).getPath(); - } - + } + if (listAll && domainId == null) { isRecursive = true; } Filter searchFilter = new Filter(NetworkVO.class, "id", false, cmd.getStartIndex(), cmd.getPageSizeVal()); SearchBuilder sb = _networksDao.createSearchBuilder(); - + if (forVpc != null) { if (forVpc) { sb.and("vpc", sb.entity().getVpcId(), Op.NNULL); @@ -1302,8 +1365,8 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { SearchBuilder accountSearch = _accountDao.createSearchBuilder(); accountSearch.and("typeNEQ", accountSearch.entity().getType(), SearchCriteria.Op.NEQ); accountSearch.and("typeEQ", accountSearch.entity().getType(), SearchCriteria.Op.EQ); - - + + sb.join("accountSearch", accountSearch, sb.entity().getAccountId(), accountSearch.entity().getId(), JoinBuilder.JoinType.INNER); List networksToReturn = new ArrayList(); @@ -1312,7 +1375,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { 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, permittedAccounts)); //get domain level networks @@ -1326,12 +1389,12 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { } 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, 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, isRecursive)); //add networks of subdomains @@ -1371,7 +1434,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { networksToReturn=supportedNetworks; } - + if (canUseForDeploy != null) { List networksForDeploy = new ArrayList(); for (NetworkVO network : networksToReturn) { @@ -1379,16 +1442,16 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { networksForDeploy.add(network); } } - + networksToReturn=networksForDeploy; } - + return networksToReturn; } - - private SearchCriteria buildNetworkSearchCriteria(SearchBuilder sb, String keyword, Long id, + + private SearchCriteria buildNetworkSearchCriteria(SearchBuilder sb, String keyword, Long id, Boolean isSystem, Long zoneId, String guestIpType, String trafficType, Long physicalNetworkId, String aclType, boolean skipProjectNetworks, Boolean restartRequired, Boolean specifyIpRanges, Long vpcId, Map tags, String zoneType) { @@ -1413,9 +1476,9 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { } if(zoneType != null) { - sc.setJoinParameters("zoneSearch", "networkType", zoneType); + sc.setJoinParameters("zoneSearch", "networkType", zoneType); } - + if (guestIpType != null) { sc.addAnd("guestType", SearchCriteria.Op.EQ, guestIpType); } @@ -1445,11 +1508,11 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { if (specifyIpRanges != null) { sc.addAnd("specifyIpRanges", SearchCriteria.Op.EQ, specifyIpRanges); } - + if (vpcId != null) { sc.addAnd("vpcId", SearchCriteria.Op.EQ, vpcId); } - + if (tags != null && !tags.isEmpty()) { int count = 0; sc.setJoinParameters("tagSearch", "resourceType", TaggedResourceType.Network.toString()); @@ -1532,7 +1595,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { } List networkIds = new ArrayList(); - + List maps = _networkDomainDao.listDomainNetworkMapByDomain(allowedDomains.toArray()); for (NetworkDomainVO map : maps) { @@ -1561,16 +1624,16 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { NetworkVO network = _networksDao.findById(networkId); if (network == null) { // see NetworkVO.java - + InvalidParameterValueException ex = new InvalidParameterValueException("unable to find network with specified id"); - ex.addProxyObject(network, networkId, "networkId"); + ex.addProxyObject(network, networkId, "networkId"); throw ex; } // don't allow to delete system network if (isNetworkSystem(network)) { InvalidParameterValueException ex = new InvalidParameterValueException("Network with specified id is system and can't be removed"); - ex.addProxyObject(network, network.getId(), "networkId"); + ex.addProxyObject(network, network.getId(), "networkId"); throw ex; } @@ -1585,7 +1648,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { return _networkMgr.destroyNetwork(networkId, context); } - + @Override @ActionEvent(eventType = EventTypes.EVENT_NETWORK_RESTART, eventDescription = "restarting network", async = true) public boolean restartNetwork(RestartNetworkCmd cmd, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { @@ -1597,7 +1660,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { // Check if network exists NetworkVO network = _networksDao.findById(networkId); - if (network == null) { + if (network == null) { InvalidParameterValueException ex = new InvalidParameterValueException("Network with specified id doesn't exist"); ex.addProxyObject("networks", networkId, "networkId"); throw ex; @@ -1607,9 +1670,9 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { if (!(network.getState() == Network.State.Implemented || network.getState() == Network.State.Setup)) { throw new InvalidParameterValueException("Network is not in the right state to be restarted. Correct states are: " + Network.State.Implemented + ", " + Network.State.Setup); } - + if (network.getBroadcastDomainType() == BroadcastDomainType.Lswitch ) { - /** + /** * Unable to restart these networks now. * TODO Restarting a SDN based network requires updating the nics and the configuration * in the controller. This requires a non-trivial rewrite of the restart procedure. @@ -1635,15 +1698,15 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { return _networksDao.getActiveNicsIn(networkId); } - - - + + + protected Map getNetworkOfferingServiceCapabilities(NetworkOffering offering, Service service) { if (!areServicesSupportedByNetworkOffering(offering.getId(), service)) { - // TBD: We should be sending networkOfferingId and not the offering object itself. + // TBD: We should be sending networkOfferingId and not the offering object itself. throw new UnsupportedServiceException("Service " + service.getName() + " is not supported by the network offering " + offering); } @@ -1676,14 +1739,14 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { return serviceCapabilities; } - - + + @Override public IpAddress getIp(long ipAddressId) { return _ipAddressDao.findById(ipAddressId); } - + protected boolean providersConfiguredForExternalNetworking(Collection providers) { for(String providerStr : providers){ Provider provider = Network.Provider.getProvider(providerStr); @@ -1707,32 +1770,32 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { return false; } - + protected boolean areServicesSupportedByNetworkOffering(long networkOfferingId, Service... services) { return (_ntwkOfferingSrvcDao.areServicesSupportedByNetworkOffering(networkOfferingId, services)); } - + protected boolean areServicesSupportedInNetwork(long networkId, Service... services) { return (_ntwkSrvcDao.areServicesSupportedInNetwork(networkId, services)); } - - - - + + + + private boolean checkForNonStoppedVmInNetwork(long networkId) { - List vms = _userVmDao.listByNetworkIdAndStates(networkId, VirtualMachine.State.Starting, + List vms = _userVmDao.listByNetworkIdAndStates(networkId, VirtualMachine.State.Starting, VirtualMachine.State.Running, VirtualMachine.State.Migrating, VirtualMachine.State.Stopping); return vms.isEmpty(); } - + @Override @DB @ActionEvent(eventType = EventTypes.EVENT_NETWORK_UPDATE, eventDescription = "updating network", async = true) - public Network updateGuestNetwork(long networkId, String name, String displayText, Account callerAccount, + public Network updateGuestNetwork(long networkId, String name, String displayText, Account callerAccount, User callerUser, String domainSuffix, Long networkOfferingId, Boolean changeCidr, String guestVmCidr) { boolean restartNetwork = false; @@ -1744,7 +1807,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { ex.addProxyObject("networks", networkId, "networkId"); throw ex; } - + //perform below validation if the network is vpc network if (network.getVpcId() != null && networkOfferingId != null) { Vpc vpc = _vpcMgr.getVpc(network.getVpcId()); @@ -1766,7 +1829,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { if (network.getTrafficType() != Networks.TrafficType.Guest) { throw new InvalidParameterValueException("Can't allow networks which traffic type is not " + TrafficType.Guest); } - + _accountMgr.checkAccess(callerAccount, null, true, network); if (name != null) { @@ -1790,14 +1853,14 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { if (networkOfferingId != null) { if (networkOffering == null || networkOffering.isSystemOnly()) { InvalidParameterValueException ex = new InvalidParameterValueException("Unable to find network offering with specified id"); - ex.addProxyObject(networkOffering, networkOfferingId, "networkOfferingId"); + ex.addProxyObject(networkOffering, networkOfferingId, "networkOfferingId"); throw ex; } - + // network offering should be in Enabled state if (networkOffering.getState() != NetworkOffering.State.Enabled) { InvalidParameterValueException ex = new InvalidParameterValueException("Network offering with specified id is not in " + NetworkOffering.State.Enabled + " state, can't upgrade to it"); - ex.addProxyObject(networkOffering, networkOfferingId, "networkOfferingId"); + ex.addProxyObject(networkOffering, networkOfferingId, "networkOfferingId"); throw ex; } //can't update from vpc to non-vpc network offering @@ -1811,7 +1874,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { if (networkOfferingId != oldNetworkOfferingId) { Collection newProviders = _networkMgr.finalizeServicesAndProvidersForNetwork(networkOffering, network.getPhysicalNetworkId()).values(); Collection oldProviders = _networkMgr.finalizeServicesAndProvidersForNetwork(oldNtwkOff, network.getPhysicalNetworkId()).values(); - + if (providersConfiguredForExternalNetworking(newProviders) != providersConfiguredForExternalNetworking(oldProviders) && !changeCidr) { throw new InvalidParameterValueException("Updating network failed since guest CIDR needs to be changed!"); @@ -1819,7 +1882,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { if (changeCidr) { if (!checkForNonStoppedVmInNetwork(network.getId())) { InvalidParameterValueException ex = new InvalidParameterValueException("All user vm of network of specified id should be stopped before changing CIDR!"); - ex.addProxyObject(network, networkId, "networkId"); + ex.addProxyObject(network, networkId, "networkId"); throw ex; } } @@ -1952,7 +2015,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { if (!_networkMgr.shutdownNetworkElementsAndResources(context, true, network)) { s_logger.warn("Failed to shutdown the network elements and resources as a part of network restart: " + network); CloudRuntimeException ex = new CloudRuntimeException("Failed to shutdown the network elements and resources as a part of update to network of specified id"); - ex.addProxyObject(network, networkId, "networkId"); + ex.addProxyObject(network, networkId, "networkId"); throw ex; } } else { @@ -1971,13 +2034,13 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { if (!_networkMgr.shutdownNetwork(network.getId(), context, true)) { s_logger.warn("Failed to shutdown the network as a part of update to network with specified id"); CloudRuntimeException ex = new CloudRuntimeException("Failed to shutdown the network as a part of update of specified network id"); - ex.addProxyObject(network, networkId, "networkId"); + ex.addProxyObject(network, networkId, "networkId"); throw ex; } } } else { CloudRuntimeException ex = new CloudRuntimeException("Failed to shutdown the network elements and resources as a part of update to network with specified id; network is in wrong state: " + network.getState()); - ex.addProxyObject(network, networkId, "networkId"); + ex.addProxyObject(network, networkId, "networkId"); throw ex; } } @@ -2039,7 +2102,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { } catch (Exception ex) { s_logger.warn("Failed to implement network " + network + " elements and resources as a part of network update due to ", ex); CloudRuntimeException e = new CloudRuntimeException("Failed to implement network (with specified id) elements and resources as a part of network update"); - e.addProxyObject(network, networkId, "networkId"); + e.addProxyObject(network, networkId, "networkId"); throw e; } } @@ -2072,7 +2135,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { protected Set getAvailableIps(Network network, String requestedIp) { String[] cidr = network.getCidr().split("/"); List ips = _nicDao.listIpAddressInNetwork(network.getId()); - Set usedIps = new TreeSet(); + Set usedIps = new TreeSet(); for (String ip : ips) { if (requestedIp != null && requestedIp.equals(ip)) { @@ -2092,7 +2155,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { } - + protected boolean canUpgrade(Network network, long oldNetworkOfferingId, long newNetworkOfferingId) { NetworkOffering oldNetworkOffering = _networkOfferingDao.findByIdIncludingRemoved(oldNetworkOfferingId); NetworkOffering newNetworkOffering = _networkOfferingDao.findById(newNetworkOfferingId); @@ -2162,12 +2225,12 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { return canIpsUseOffering(publicIps, newNetworkOfferingId); } - + @Override @DB @ActionEvent(eventType = EventTypes.EVENT_PHYSICAL_NETWORK_CREATE, eventDescription = "Creating Physical Network", create = true) - public PhysicalNetwork createPhysicalNetwork(Long zoneId, String vnetRange, String networkSpeed, List + public PhysicalNetwork createPhysicalNetwork(Long zoneId, String vnetRange, String networkSpeed, List isolationMethods, String broadcastDomainRangeStr, Long domainId, List tags, String name) { // Check if zone exists @@ -2272,13 +2335,13 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { // add security group provider to the physical network addDefaultSecurityGroupProviderToPhysicalNetwork(pNetwork.getId()); - + // add VPCVirtualRouter as the defualt network service provider addDefaultVpcVirtualRouterToPhysicalNetwork(pNetwork.getId()); // add baremetal as the defualt network service provider /* addDefaultBaremetalProvidersToPhysicalNetwork(pNetwork.getId()); */ - + txn.commit(); return pNetwork; } catch (Exception ex) { @@ -2317,7 +2380,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { PhysicalNetworkVO network = _physicalNetworkDao.findById(id); if (network == null) { InvalidParameterValueException ex = new InvalidParameterValueException("Physical Network with specified id doesn't exist in the system"); - ex.addProxyObject(network, id, "physicalNetworkId"); + ex.addProxyObject(network, id, "physicalNetworkId"); throw ex; } @@ -2325,7 +2388,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { DataCenter zone = _dcDao.findById(network.getDataCenterId()); if (zone == null) { InvalidParameterValueException ex = new InvalidParameterValueException("Zone with id=" + network.getDataCenterId() + " doesn't exist in the system"); - ex.addProxyObject(zone, network.getDataCenterId(), "dataCenterId"); + ex.addProxyObject(zone, network.getDataCenterId(), "dataCenterId"); throw ex; } if (newVnetRangeString != null) { @@ -2598,7 +2661,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { PhysicalNetworkVO pNetwork = _physicalNetworkDao.findById(physicalNetworkId); if (pNetwork == null) { InvalidParameterValueException ex = new InvalidParameterValueException("Physical Network with specified id doesn't exist in the system"); - ex.addProxyObject(pNetwork, physicalNetworkId, "physicalNetworkId"); + ex.addProxyObject(pNetwork, physicalNetworkId, "physicalNetworkId"); throw ex; } @@ -2625,7 +2688,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { // delete service providers List providers = _pNSPDao.listBy(physicalNetworkId); - + for(PhysicalNetworkServiceProviderVO provider : providers){ try { deleteNetworkServiceProvider(provider.getId()); @@ -2642,7 +2705,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { _pNTrafficTypeDao.deleteTrafficTypes(physicalNetworkId); boolean success = _physicalNetworkDao.remove(physicalNetworkId); - + txn.commit(); return success; @@ -2994,7 +3057,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { } } - + @Override @DB @ActionEvent(eventType = EventTypes.EVENT_SERVICE_PROVIDER_CREATE, eventDescription = "Creating Physical Network ServiceProvider", create = true) @@ -3013,7 +3076,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { PhysicalNetworkVO destNetwork = _physicalNetworkDao.findById(destinationPhysicalNetworkId); if (destNetwork == null) { InvalidParameterValueException ex = new InvalidParameterValueException("Destination Physical Network with specified id doesn't exist in the system"); - ex.addProxyObject(destNetwork, destinationPhysicalNetworkId, "destinationPhysicalNetworkId"); + ex.addProxyObject(destNetwork, destinationPhysicalNetworkId, "destinationPhysicalNetworkId"); throw ex; } } @@ -3255,7 +3318,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { } else { pNtwks = _physicalNetworkDao.listByZone(zoneId); } - + if (pNtwks.isEmpty()) { throw new InvalidParameterValueException("Unable to find physical network in zone id=" + zoneId); } @@ -3282,8 +3345,8 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { } } - - + + @Override @DB @ActionEvent(eventType = EventTypes.EVENT_TRAFFIC_TYPE_CREATE, eventDescription = "Creating Physical Network TrafficType", create = true) @@ -3448,7 +3511,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { return new Pair, Integer>(result.first(), result.second()); } - + @@ -3475,23 +3538,23 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { if (networkElement == null) { throw new CloudRuntimeException("Unable to find the Network Element implementing the VirtualRouter Provider"); } - + VirtualRouterElement element = (VirtualRouterElement)networkElement; element.addElement(nsp.getId(), VirtualRouterProviderType.VirtualRouter); return nsp; } - + protected PhysicalNetworkServiceProvider addDefaultVpcVirtualRouterToPhysicalNetwork(long physicalNetworkId) { - PhysicalNetworkServiceProvider nsp = addProviderToPhysicalNetwork(physicalNetworkId, + PhysicalNetworkServiceProvider nsp = addProviderToPhysicalNetwork(physicalNetworkId, Network.Provider.VPCVirtualRouter.getName(), null, null); - + NetworkElement networkElement = _networkModel.getElementImplementingProvider(Network.Provider.VPCVirtualRouter.getName()); if (networkElement == null) { throw new CloudRuntimeException("Unable to find the Network Element implementing the VPCVirtualRouter Provider"); } - + VpcVirtualRouterElement element = (VpcVirtualRouterElement)networkElement; element.addElement(nsp.getId(), VirtualRouterProviderType.VPCVirtualRouter); @@ -3500,7 +3563,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { protected PhysicalNetworkServiceProvider addDefaultSecurityGroupProviderToPhysicalNetwork(long physicalNetworkId) { - PhysicalNetworkServiceProvider nsp = addProviderToPhysicalNetwork(physicalNetworkId, + PhysicalNetworkServiceProvider nsp = addProviderToPhysicalNetwork(physicalNetworkId, Network.Provider.SecurityGroupProvider.getName(), null, null); return nsp; @@ -3510,13 +3573,13 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { PhysicalNetworkVO pvo = _physicalNetworkDao.findById(physicalNetworkId); DataCenterVO dvo = _dcDao.findById(pvo.getDataCenterId()); if (dvo.getNetworkType() == NetworkType.Basic) { - + // Baremetal is currently disabled /* addProviderToPhysicalNetwork(physicalNetworkId, "BaremetalDhcpProvider", null, null); addProviderToPhysicalNetwork(physicalNetworkId, "BaremetalPxeProvider", null, null); addProviderToPhysicalNetwork(physicalNetworkId, "BaremetaUserdataProvider", null, null); -*/ +*/ } return null; } @@ -3530,13 +3593,13 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { } } - - + + private boolean getAllowSubdomainAccessGlobal() { return _allowSubdomainNetworkAccess; } - + @Override public List> listTrafficTypeImplementor(ListTrafficTypeImplementorsCmd cmd) { @@ -3561,7 +3624,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { return results; } - + @Override @ActionEvent(eventType = EventTypes.EVENT_NET_IP_ASSIGN, eventDescription = "associating Ip", async = true) public IpAddress associateIPToNetwork(long ipId, long networkId) throws InsufficientAddressCapacityException, @@ -3577,20 +3640,20 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { " to VPC.Specify vpcId to associate ip address to VPC"); } return _networkMgr.associateIPToGuestNetwork(ipId, networkId, true); - + } - + @Override @DB public Network createPrivateNetwork(String networkName, String displayText, long physicalNetworkId, String vlan, String startIp, String endIp, String gateway, String netmask, long networkOwnerId, Long vpcId, Boolean sourceNat) throws ResourceAllocationException, ConcurrentOperationException, InsufficientCapacityException { - + Account owner = _accountMgr.getAccount(networkOwnerId); - + // Get system network offeirng NetworkOfferingVO ntwkOff = findSystemNetworkOffering(NetworkOffering.SystemPrivateGatewayNetworkOffering); - + // Validate physical network PhysicalNetwork pNtwk = _physicalNetworkDao.findById(physicalNetworkId); if (pNtwk == null) { @@ -3599,7 +3662,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { ex.addProxyObject("physical_network", physicalNetworkId, "physicalNetworkId"); throw ex; } - + // VALIDATE IP INFO // if end ip is not specified, default it to startIp if (!NetUtils.isValidIp(startIp)) { @@ -3620,49 +3683,49 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { } cidr = NetUtils.ipAndNetMaskToCidr(gateway, netmask); - - + + Transaction txn = Transaction.currentTxn(); txn.start(); - + //lock datacenter as we need to get mac address seq from there DataCenterVO dc = _dcDao.lockRow(pNtwk.getDataCenterId(), true); - + //check if we need to create guest network Network privateNetwork = _networksDao.getPrivateNetwork(BroadcastDomainType.Vlan.toUri(vlan).toString(), cidr, networkOwnerId, pNtwk.getDataCenterId()); if (privateNetwork == null) { //create Guest network - privateNetwork = _networkMgr.createGuestNetwork(ntwkOff.getId(), networkName, displayText, gateway, cidr, vlan, + privateNetwork = _networkMgr.createGuestNetwork(ntwkOff.getId(), networkName, displayText, gateway, cidr, vlan, null, owner, null, pNtwk, pNtwk.getDataCenterId(), ACLType.Account, null, null, null, null); s_logger.debug("Created private network " + privateNetwork); } else { s_logger.debug("Private network already exists: " + privateNetwork); } - + //add entry to private_ip_address table PrivateIpVO privateIp = _privateIpDao.findByIpAndSourceNetworkId(privateNetwork.getId(), startIp); if (privateIp != null) { throw new InvalidParameterValueException("Private ip address " + startIp + " already used for private gateway" + " in zone " + _configMgr.getZone(pNtwk.getDataCenterId()).getName()); } - + Long mac = dc.getMacAddress(); Long nextMac = mac + 1; dc.setMacAddress(nextMac); privateIp = new PrivateIpVO(startIp, privateNetwork.getId(), nextMac, vpcId, sourceNat); _privateIpDao.persist(privateIp); - + _dcDao.update(dc.getId(), dc); - + txn.commit(); s_logger.debug("Private network " + privateNetwork + " is created"); return privateNetwork; } - + private NetworkOfferingVO findSystemNetworkOffering(String offeringName) { List allOfferings = _networkOfferingDao.listSystemNetworkOfferings(); for (NetworkOfferingVO offer: allOfferings){ diff --git a/server/src/com/cloud/servlet/ConsoleProxyServlet.java b/server/src/com/cloud/servlet/ConsoleProxyServlet.java index ebb91746268..097986bda62 100644 --- a/server/src/com/cloud/servlet/ConsoleProxyServlet.java +++ b/server/src/com/cloud/servlet/ConsoleProxyServlet.java @@ -73,7 +73,7 @@ public class ConsoleProxyServlet extends HttpServlet { @Inject AccountManager _accountMgr; @Inject VirtualMachineManager _vmMgr; @Inject ManagementServer _ms; - @Inject IdentityService _identityService; + @Inject IdentityService _identityService; static ManagementServer s_ms; @@ -81,13 +81,13 @@ public class ConsoleProxyServlet extends HttpServlet { public ConsoleProxyServlet() { } - + @Override public void init(ServletConfig config) throws ServletException { - SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, config.getServletContext()); + SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, config.getServletContext()); s_ms = _ms; } - + @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) { doGet(req, resp); @@ -274,7 +274,7 @@ public class ConsoleProxyServlet extends HttpServlet { private void handleAuthRequest(HttpServletRequest req, HttpServletResponse resp, long vmId) { - // TODO authentication channel between console proxy VM and management server needs to be secured, + // TODO authentication channel between console proxy VM and management server needs to be secured, // the data is now being sent through private network, but this is apparently not enough VMInstanceVO vm = _vmMgr.findById(vmId); if(vm == null) { @@ -334,11 +334,11 @@ public class ConsoleProxyServlet extends HttpServlet { private String getEncryptorPassword() { String key = _ms.getEncryptionKey(); String iv = _ms.getEncryptionIV(); - + ConsoleProxyPasswordBasedEncryptor.KeyIVPair keyIvPair = new ConsoleProxyPasswordBasedEncryptor.KeyIVPair(key, iv); return _gson.toJson(keyIvPair); } - + private String composeThumbnailUrl(String rootUrl, VMInstanceVO vm, HostVO hostVo, int w, int h) { StringBuffer sb = new StringBuffer(rootUrl); @@ -385,8 +385,7 @@ public class ConsoleProxyServlet extends HttpServlet { Ternary parsedHostInfo = parseHostInfo(portInfo.first()); String sid = vm.getVncPassword(); - String tag = String.valueOf(vm.getId()); - tag = _identityService.getIdentityUuid("vm_instance", tag); + String tag = vm.getUuid(); String ticket = genAccessTicket(host, String.valueOf(portInfo.second()), sid, tag); ConsoleProxyPasswordBasedEncryptor encryptor = new ConsoleProxyPasswordBasedEncryptor(getEncryptorPassword()); ConsoleProxyClientParam param = new ConsoleProxyClientParam(); @@ -473,12 +472,12 @@ public class ConsoleProxyServlet extends HttpServlet { } catch (PermissionDeniedException ex) { if (accountObj.getType() == Account.ACCOUNT_TYPE_NORMAL) { if (s_logger.isDebugEnabled()) { - s_logger.debug("VM access is denied. VM owner account " + vm.getAccountId() + s_logger.debug("VM access is denied. VM owner account " + vm.getAccountId() + " does not match the account id in session " + accountObj.getId() + " and caller is a normal user"); } } else if(accountObj.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN || accountObj.getType() == Account.ACCOUNT_TYPE_READ_ONLY_ADMIN) { if(s_logger.isDebugEnabled()) { - s_logger.debug("VM access is denied. VM owner account " + vm.getAccountId() + s_logger.debug("VM access is denied. VM owner account " + vm.getAccountId() + " does not match the account id in session " + accountObj.getId() + " and the domain-admin caller does not manage the target domain"); } } @@ -515,7 +514,7 @@ public class ConsoleProxyServlet extends HttpServlet { account = _accountMgr.getAccount(user.getAccountId()); } - if ((user == null) || (user.getRemoved() != null) || !user.getState().equals(Account.State.enabled) + if ((user == null) || (user.getRemoved() != null) || !user.getState().equals(Account.State.enabled) || (account == null) || !account.getState().equals(Account.State.enabled)) { s_logger.warn("Deleted/Disabled/Locked user with id=" + userId + " attempting to access public API"); return false; @@ -586,7 +585,7 @@ public class ConsoleProxyServlet extends HttpServlet { if (!user.getState().equals(Account.State.enabled) || !account.getState().equals(Account.State.enabled)) { s_logger.debug("disabled or locked user accessing the api, userid = " + user.getId() + "; name = " + user.getUsername() + "; state: " + user.getState() + "; accountState: " + account.getState()); return false; - } + } // verify secret key exists secretKey = user.getSecretKey(); @@ -632,10 +631,10 @@ public class ConsoleProxyServlet extends HttpServlet { case '>': sb.append(">"); break; case '&': sb.append("&"); break; case '"': sb.append("""); break; - case ' ': sb.append(" ");break; + case ' ': sb.append(" ");break; default: sb.append(c); break; } } return sb.toString(); - } + } } diff --git a/server/test/com/cloud/network/security/SecurityGroupManagerTestConfiguration.java b/server/test/com/cloud/network/security/SecurityGroupManagerTestConfiguration.java index b3a9ff12dab..e2e9d68c013 100644 --- a/server/test/com/cloud/network/security/SecurityGroupManagerTestConfiguration.java +++ b/server/test/com/cloud/network/security/SecurityGroupManagerTestConfiguration.java @@ -19,6 +19,7 @@ package com.cloud.network.security; import java.io.IOException; +import org.apache.cloudstack.test.utils.SpringUtils; import org.mockito.Mockito; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -60,7 +61,6 @@ import com.cloud.tags.dao.ResourceTagsDaoImpl; import com.cloud.user.AccountManager; import com.cloud.user.DomainManager; import com.cloud.user.dao.AccountDaoImpl; -import com.cloud.utils.component.SpringComponentScanUtils; import com.cloud.vm.UserVmManager; import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.dao.NicDaoImpl; @@ -151,7 +151,7 @@ public class SecurityGroupManagerTestConfiguration { public boolean match(MetadataReader mdr, MetadataReaderFactory arg1) throws IOException { mdr.getClassMetadata().getClassName(); ComponentScan cs = SecurityGroupManagerTestConfiguration.class.getAnnotation(ComponentScan.class); - return SpringComponentScanUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs); + return SpringUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs); } } diff --git a/server/test/com/cloud/snapshot/SnapshotDaoTestConfiguration.java b/server/test/com/cloud/snapshot/SnapshotDaoTestConfiguration.java index cc410dbc4ca..6695edc0225 100644 --- a/server/test/com/cloud/snapshot/SnapshotDaoTestConfiguration.java +++ b/server/test/com/cloud/snapshot/SnapshotDaoTestConfiguration.java @@ -19,6 +19,7 @@ package com.cloud.snapshot; import java.io.IOException; +import org.apache.cloudstack.test.utils.SpringUtils; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.Configuration; @@ -36,7 +37,6 @@ import com.cloud.host.dao.HostTagsDaoImpl; import com.cloud.storage.dao.SnapshotDaoImpl; import com.cloud.storage.dao.VolumeDaoImpl; import com.cloud.tags.dao.ResourceTagsDaoImpl; -import com.cloud.utils.component.SpringComponentScanUtils; import com.cloud.vm.dao.NicDaoImpl; import com.cloud.vm.dao.VMInstanceDaoImpl; @@ -65,7 +65,7 @@ public class SnapshotDaoTestConfiguration { public boolean match(MetadataReader mdr, MetadataReaderFactory arg1) throws IOException { mdr.getClassMetadata().getClassName(); ComponentScan cs = SnapshotDaoTestConfiguration.class.getAnnotation(ComponentScan.class); - return SpringComponentScanUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs); + return SpringUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs); } } diff --git a/server/test/com/cloud/storage/dao/StoragePoolDaoTestConfiguration.java b/server/test/com/cloud/storage/dao/StoragePoolDaoTestConfiguration.java index 58de4d2730b..2f79ff04258 100644 --- a/server/test/com/cloud/storage/dao/StoragePoolDaoTestConfiguration.java +++ b/server/test/com/cloud/storage/dao/StoragePoolDaoTestConfiguration.java @@ -20,6 +20,7 @@ package com.cloud.storage.dao; import java.io.IOException; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDaoImpl; +import org.apache.cloudstack.test.utils.SpringUtils; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.Configuration; @@ -28,7 +29,6 @@ import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.core.type.filter.TypeFilter; -import com.cloud.utils.component.SpringComponentScanUtils; @Configuration @ComponentScan(basePackageClasses={ @@ -46,7 +46,7 @@ public class StoragePoolDaoTestConfiguration { public boolean match(MetadataReader mdr, MetadataReaderFactory arg1) throws IOException { mdr.getClassMetadata().getClassName(); ComponentScan cs = StoragePoolDaoTestConfiguration.class.getAnnotation(ComponentScan.class); - return SpringComponentScanUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs); + return SpringUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs); } } diff --git a/server/test/com/cloud/vm/dao/UserVmCloneSettingDaoTestConfiguration.java b/server/test/com/cloud/vm/dao/UserVmCloneSettingDaoTestConfiguration.java index 6e22e174f58..3bd4df8543f 100644 --- a/server/test/com/cloud/vm/dao/UserVmCloneSettingDaoTestConfiguration.java +++ b/server/test/com/cloud/vm/dao/UserVmCloneSettingDaoTestConfiguration.java @@ -19,6 +19,7 @@ package com.cloud.vm.dao; import java.io.IOException; +import org.apache.cloudstack.test.utils.SpringUtils; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.Configuration; @@ -27,7 +28,6 @@ import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.core.type.filter.TypeFilter; -import com.cloud.utils.component.SpringComponentScanUtils; import com.cloud.vm.dao.UserVmCloneSettingDaoImpl; @Configuration @@ -45,7 +45,7 @@ public class UserVmCloneSettingDaoTestConfiguration { public boolean match(MetadataReader mdr, MetadataReaderFactory arg1) throws IOException { mdr.getClassMetadata().getClassName(); ComponentScan cs = UserVmCloneSettingDaoTestConfiguration.class.getAnnotation(ComponentScan.class); - return SpringComponentScanUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs); + return SpringUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs); } } diff --git a/server/test/com/cloud/vm/dao/UserVmDaoTestConfiguration.java b/server/test/com/cloud/vm/dao/UserVmDaoTestConfiguration.java index 6a63fabd44b..7af772c1b17 100644 --- a/server/test/com/cloud/vm/dao/UserVmDaoTestConfiguration.java +++ b/server/test/com/cloud/vm/dao/UserVmDaoTestConfiguration.java @@ -19,6 +19,7 @@ package com.cloud.vm.dao; import java.io.IOException; +import org.apache.cloudstack.test.utils.SpringUtils; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.Configuration; @@ -27,7 +28,6 @@ import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.core.type.filter.TypeFilter; -import com.cloud.utils.component.SpringComponentScanUtils; @Configuration @ComponentScan(basePackageClasses={ @@ -43,7 +43,7 @@ public class UserVmDaoTestConfiguration { public boolean match(MetadataReader mdr, MetadataReaderFactory arg1) throws IOException { mdr.getClassMetadata().getClassName(); ComponentScan cs = UserVmDaoTestConfiguration.class.getAnnotation(ComponentScan.class); - return SpringComponentScanUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs); + return SpringUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs); } } diff --git a/server/test/com/cloud/vpc/VpcTestConfiguration.java b/server/test/com/cloud/vpc/VpcTestConfiguration.java index b1f2f80c076..7ae83f3a9c9 100644 --- a/server/test/com/cloud/vpc/VpcTestConfiguration.java +++ b/server/test/com/cloud/vpc/VpcTestConfiguration.java @@ -19,6 +19,7 @@ package com.cloud.vpc; import java.io.IOException; +import org.apache.cloudstack.test.utils.SpringUtils; import org.mockito.Mockito; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -91,7 +92,6 @@ import com.cloud.tags.dao.ResourceTagsDaoImpl; import com.cloud.user.AccountManager; import com.cloud.user.dao.AccountDaoImpl; import com.cloud.user.dao.UserStatisticsDaoImpl; -import com.cloud.utils.component.SpringComponentScanUtils; import com.cloud.vm.UserVmManager; import com.cloud.vm.dao.DomainRouterDaoImpl; import com.cloud.vm.dao.NicDaoImpl; @@ -236,7 +236,7 @@ public class VpcTestConfiguration { public boolean match(MetadataReader mdr, MetadataReaderFactory arg1) throws IOException { mdr.getClassMetadata().getClassName(); ComponentScan cs = VpcTestConfiguration.class.getAnnotation(ComponentScan.class); - return SpringComponentScanUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs); + return SpringUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs); } } } diff --git a/server/test/org/apache/cloudstack/affinity/AffinityApiUnitTest.java b/server/test/org/apache/cloudstack/affinity/AffinityApiUnitTest.java index f9c5728c4c2..484b044e28e 100644 --- a/server/test/org/apache/cloudstack/affinity/AffinityApiUnitTest.java +++ b/server/test/org/apache/cloudstack/affinity/AffinityApiUnitTest.java @@ -24,6 +24,7 @@ import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.when; +import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -32,13 +33,23 @@ import javax.naming.ConfigurationException; import org.apache.cloudstack.affinity.dao.AffinityGroupDao; import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao; +import org.apache.cloudstack.test.utils.SpringUtils; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.ComponentScan.Filter; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.FilterType; +import org.springframework.core.type.classreading.MetadataReader; +import org.springframework.core.type.classreading.MetadataReaderFactory; +import org.springframework.core.type.filter.TypeFilter; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; import com.cloud.event.EventUtils; import com.cloud.event.EventVO; @@ -48,6 +59,7 @@ import com.cloud.exception.ResourceInUseException; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.user.Account; import com.cloud.user.AccountManager; +import com.cloud.user.AccountService; import com.cloud.user.AccountVO; import com.cloud.user.UserContext; import com.cloud.user.dao.AccountDao; @@ -57,7 +69,7 @@ import com.cloud.vm.VirtualMachine; import com.cloud.vm.dao.UserVmDao; @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(locations = "classpath:/affinityContext.xml") +@ContextConfiguration(loader = AnnotationConfigContextLoader.class) public class AffinityApiUnitTest { @Inject @@ -188,4 +200,57 @@ public class AffinityApiUnitTest { _affinityService.updateVMAffinityGroups(10L, affinityGroupIds); } + @Configuration + @ComponentScan(basePackageClasses = {AffinityGroupServiceImpl.class, EventUtils.class}, includeFilters = {@Filter(value = TestConfiguration.Library.class, type = FilterType.CUSTOM)}, useDefaultFilters = false) + public static class TestConfiguration extends SpringUtils.CloudStackTestConfiguration { + + @Bean + public AccountDao accountDao() { + return Mockito.mock(AccountDao.class); + } + + @Bean + public AccountService accountService() { + return Mockito.mock(AccountService.class); + } + + @Bean + public AffinityGroupProcessor affinityGroupProcessor() { + return Mockito.mock(AffinityGroupProcessor.class); + } + + @Bean + public AffinityGroupDao affinityGroupDao() { + return Mockito.mock(AffinityGroupDao.class); + } + + @Bean + public AffinityGroupVMMapDao affinityGroupVMMapDao() { + return Mockito.mock(AffinityGroupVMMapDao.class); + } + + @Bean + public AccountManager accountManager() { + return Mockito.mock(AccountManager.class); + } + + @Bean + public EventDao eventDao() { + return Mockito.mock(EventDao.class); + } + + @Bean + public UserVmDao userVMDao() { + return Mockito.mock(UserVmDao.class); + } + + public static class Library implements TypeFilter { + + @Override + public boolean match(MetadataReader mdr, MetadataReaderFactory arg1) throws IOException { + ComponentScan cs = TestConfiguration.class.getAnnotation(ComponentScan.class); + return SpringUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs); + } + } + } } diff --git a/server/test/org/apache/cloudstack/networkoffering/ChildTestConfiguration.java b/server/test/org/apache/cloudstack/networkoffering/ChildTestConfiguration.java index d47deaa7018..6f52397251b 100644 --- a/server/test/org/apache/cloudstack/networkoffering/ChildTestConfiguration.java +++ b/server/test/org/apache/cloudstack/networkoffering/ChildTestConfiguration.java @@ -27,6 +27,7 @@ import org.apache.cloudstack.acl.SecurityChecker; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDaoImpl; import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao; +import org.apache.cloudstack.test.utils.SpringUtils; import org.mockito.Mockito; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -94,7 +95,6 @@ import com.cloud.storage.swift.SwiftManager; import com.cloud.tags.dao.ResourceTagsDaoImpl; import com.cloud.user.dao.AccountDaoImpl; import com.cloud.user.dao.UserDaoImpl; -import com.cloud.utils.component.SpringComponentScanUtils; import com.cloud.vm.dao.InstanceGroupDaoImpl; import com.cloud.vm.dao.NicDaoImpl; import com.cloud.vm.dao.NicSecondaryIpDaoImpl; @@ -338,7 +338,7 @@ public class ChildTestConfiguration { public boolean match(MetadataReader mdr, MetadataReaderFactory arg1) throws IOException { mdr.getClassMetadata().getClassName(); ComponentScan cs = ChildTestConfiguration.class.getAnnotation(ComponentScan.class); - return SpringComponentScanUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs); + return SpringUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs); } } diff --git a/server/test/resources/affinityContext.xml b/server/test/resources/affinityContext.xml deleted file mode 100644 index d41a63d648b..00000000000 --- a/server/test/resources/affinityContext.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/services/console-proxy/pom.xml b/services/console-proxy/pom.xml index 2c9e2e6e2c7..3aac7b25a80 100644 --- a/services/console-proxy/pom.xml +++ b/services/console-proxy/pom.xml @@ -23,9 +23,9 @@ pom org.apache.cloudstack - cloudstack + cloudstack-services 4.2.0-SNAPSHOT - ../../pom.xml + ../pom.xml install diff --git a/services/secondary-storage/pom.xml b/services/secondary-storage/pom.xml index 0797c9895f7..eb6c0ee9b50 100644 --- a/services/secondary-storage/pom.xml +++ b/services/secondary-storage/pom.xml @@ -18,13 +18,13 @@ --> 4.0.0 - cloudstack-service-secondary-storage + cloud-secondary-storage Apache CloudStack Secondary Storage Service org.apache.cloudstack - cloudstack + cloudstack-services 4.2.0-SNAPSHOT - ../../pom.xml + ../pom.xml diff --git a/tools/marvin/pom.xml b/tools/marvin/pom.xml index c0505664486..25134a8968b 100644 --- a/tools/marvin/pom.xml +++ b/tools/marvin/pom.xml @@ -1,15 +1,14 @@ + 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. --> + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 cloud-marvin Apache CloudStack marvin @@ -35,7 +34,7 @@ - + Deleting ${project.artifactId} API sources @@ -83,7 +82,7 @@ - + marvin.sync @@ -160,6 +159,26 @@ + + org.codehaus.gmaven + gmaven-plugin + 1.5 + + + setproperty + validate + + execute + + + + pom.properties['resolved.basedir']=project.basedir.absolutePath.replace('\','/').replace('D:','/cyg/d'); + pom.properties['resolved.userdir']='${user.dir}'.replace('\','/').replace('D:','/cyg/d'); + + + + + org.codehaus.mojo exec-maven-plugin @@ -177,18 +196,18 @@ deployAndRun.py -c - ${user.dir}/${marvin.config} + ${resolved.userdir}/${marvin.config} -t /tmp/t.log -r /tmp/r.log -f - ${basedir}/marvin/testSetupSuccess.py + ${resolved.basedir}/marvin/testSetupSuccess.py - - + + diff --git a/usage/test/com/cloud/usage/UsageManagerTestConfiguration.java b/usage/test/com/cloud/usage/UsageManagerTestConfiguration.java index d7cf04644b8..1d3ed7b245d 100644 --- a/usage/test/com/cloud/usage/UsageManagerTestConfiguration.java +++ b/usage/test/com/cloud/usage/UsageManagerTestConfiguration.java @@ -25,7 +25,8 @@ import com.cloud.usage.dao.*; import com.cloud.usage.parser.*; import com.cloud.user.dao.AccountDaoImpl; import com.cloud.user.dao.UserStatisticsDaoImpl; -import com.cloud.utils.component.SpringComponentScanUtils; + +import org.apache.cloudstack.test.utils.SpringUtils; import org.mockito.Mockito; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -87,7 +88,7 @@ public class UsageManagerTestConfiguration { public boolean match(MetadataReader mdr, MetadataReaderFactory arg1) throws IOException { mdr.getClassMetadata().getClassName(); ComponentScan cs = UsageManagerTestConfiguration.class.getAnnotation(ComponentScan.class); - return SpringComponentScanUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs); + return SpringUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs); } } diff --git a/utils/src/com/cloud/utils/AnnotationHelper.java b/utils/src/com/cloud/utils/AnnotationHelper.java index 954b870eb76..e7a6166677e 100755 --- a/utils/src/com/cloud/utils/AnnotationHelper.java +++ b/utils/src/com/cloud/utils/AnnotationHelper.java @@ -20,40 +20,38 @@ import javax.persistence.Table; import org.apache.log4j.Logger; -import com.cloud.utils.exception.CSExceptionErrorCode; - public class AnnotationHelper extends Object { // This class contains routines to help query annotation elements of objects. - + public static final Logger s_logger = Logger.getLogger(AnnotationHelper.class.getName()); - + public static String getTableName(Object proxyObj) { // The cglib class is generated by cglib during runtime. - + Class curClass = proxyObj.getClass(); if (curClass == null) { - s_logger.info("\nCould not retrieve class information for proxy object\n"); + s_logger.trace("Could not retrieve class information for proxy object"); return null; } - + while (curClass.getSuperclass() != null && curClass.getSuperclass().getName() != "java.lang.Object") { curClass = curClass.getSuperclass(); } // At this point, curClass is the root base class of proxyObj's class, and curClass is not java.lang.Object. - Table tabObj = (Table)curClass.getAnnotation(Table.class); + Table tabObj = curClass.getAnnotation(Table.class); if (tabObj == null) { - s_logger.info("\n" + curClass + "does not have a Table annotation\n"); + s_logger.trace(curClass + "does not have a Table annotation"); return null; } - + return tabObj.name(); } - + } - - - - + + + + diff --git a/utils/src/com/cloud/utils/component/SpringComponentScanUtils.java b/utils/src/com/cloud/utils/component/SpringComponentScanUtils.java deleted file mode 100644 index 28b84e68ce9..00000000000 --- a/utils/src/com/cloud/utils/component/SpringComponentScanUtils.java +++ /dev/null @@ -1,41 +0,0 @@ -// 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 -// 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.utils.component; - -import org.springframework.context.annotation.ComponentScan; - -import com.cloud.utils.exception.CloudRuntimeException; - -public class SpringComponentScanUtils { - - public static boolean includedInBasePackageClasses(String clazzName, ComponentScan cs) { - Class clazzToCheck; - try { - clazzToCheck = Class.forName(clazzName); - } catch (ClassNotFoundException e) { - throw new CloudRuntimeException("Unable to find " + clazzName); - } - Class[] clazzes = cs.basePackageClasses(); - for (Class clazz : clazzes) { - if (clazzToCheck.isAssignableFrom(clazz)) { - return true; - } - } - return false; - } -} diff --git a/utils/src/org/apache/cloudstack/test/utils/SpringUtils.java b/utils/src/org/apache/cloudstack/test/utils/SpringUtils.java new file mode 100644 index 00000000000..220bd80e8d3 --- /dev/null +++ b/utils/src/org/apache/cloudstack/test/utils/SpringUtils.java @@ -0,0 +1,113 @@ +// 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 +// 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 org.apache.cloudstack.test.utils; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; + +import com.cloud.utils.component.ComponentContext; +import com.cloud.utils.component.ComponentInstantiationPostProcessor; +import com.cloud.utils.component.ComponentMethodInterceptor; +import com.cloud.utils.db.TransactionContextBuilder; +import com.cloud.utils.exception.CloudRuntimeException; + +public class SpringUtils { + + /** + * This method allows you to use @ComponentScan for your unit testing but + * it limits the scope of the classes found to the class specified in + * the @ComponentScan annotation. + * + * Without using this method, the default behavior of @ComponentScan is + * to actually scan in the package of the class specified rather than + * only the class. This can cause extra classes to be loaded which causes + * the classes these extra classes depend on to be loaded. The end effect + * is often most of the project gets loaded. + * + * In order to use this method properly, you must do the following:
  • + * - Specify @ComponentScan with basePackageClasses, includeFilters, and + * useDefaultFilters=true. See the following example. + * + *
    +     *     @ComponentScan(basePackageClasses={AffinityGroupServiceImpl.class, EventUtils.class},
    +     *     includeFilters={@Filter(value=TestConfiguration.Library.class, type=FilterType.CUSTOM)},
    +     *     useDefaultFilters=false)
    +     * 
    + * + * - Create a Library class and use that to call this method. See the + * following example. The Library class you define here is the Library + * class being added in the filter above. + * + *
    +     * public static class Library implements TypeFilter {
    +     *      @Override
    +     *      public boolean match(MetadataReader mdr, MetadataReaderFactory arg1) throws IOException {
    +     *          ComponentScan cs = TestConfiguration.class.getAnnotation(ComponentScan.class);
    +     *          return SpringUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs);
    +     *      }
    +     * }
    +     * 
    + * + * @param clazzName name of the class that should be included in the Spring components + * @param cs ComponentScan annotation that was declared on the configuration + * + * @return + */ + public static boolean includedInBasePackageClasses(String clazzName, ComponentScan cs) { + Class clazzToCheck; + try { + clazzToCheck = Class.forName(clazzName); + } catch (ClassNotFoundException e) { + throw new CloudRuntimeException("Unable to find " + clazzName); + } + Class[] clazzes = cs.basePackageClasses(); + for (Class clazz : clazzes) { + if (clazzToCheck.isAssignableFrom(clazz)) { + return true; + } + } + return false; + } + + public static class CloudStackTestConfiguration { + + @Bean + public ComponentContext componentContext() { + return new ComponentContext(); + } + + @Bean + public TransactionContextBuilder transactionContextBuilder() { + return new TransactionContextBuilder(); + } + + @Bean + public ComponentInstantiationPostProcessor instantiatePostProcessor() { + ComponentInstantiationPostProcessor processor = new ComponentInstantiationPostProcessor(); + + List interceptors = new ArrayList(); + interceptors.add(new TransactionContextBuilder()); + processor.setInterceptors(interceptors); + + return processor; + } + } +} From e5d331ee58738dde8aa50d8a119d979b6d04d822 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Mon, 6 May 2013 06:31:47 -0700 Subject: [PATCH 31/66] Missing file and updated .gitignore --- .gitignore | 6 ++---- services/pom.xml | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 services/pom.xml diff --git a/.gitignore b/.gitignore index f41862895ec..016554a5f75 100644 --- a/.gitignore +++ b/.gitignore @@ -18,10 +18,7 @@ build/replace.properties build/build.number bin/ -cloudstack-proprietary/ -premium/ .lock-wscript -artifacts/ .waf-* waf-* target/ @@ -37,7 +34,7 @@ cloud-*.tar.bz2 *.egg-info/ *.prefs build.number -api.log.*.gz +*.log.*.gz cloud.log.*.* unittest deps/cloud.userlibraries @@ -59,6 +56,7 @@ tools/cli/build/ *.iso *.tar.gz *.tgz +.* target-eclipse awsapi/modules/* !.gitignore diff --git a/services/pom.xml b/services/pom.xml new file mode 100644 index 00000000000..805bcdb5e6d --- /dev/null +++ b/services/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + cloudstack-services + Apache CloudStack Cloud Services + pom + + org.apache.cloudstack + cloudstack + 4.2.0-SNAPSHOT + ../pom.xml + + + install + + + console-proxy + secondary-storage + + From 2639b9f91eaeefe46901598467fda34a520f52be Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Mon, 6 May 2013 10:34:22 -0700 Subject: [PATCH 32/66] Moved over the VLAN daos --- .../schema}/src/com/cloud/network/dao/AccountGuestVlanMapDao.java | 0 .../src/com/cloud/network/dao/AccountGuestVlanMapDaoImpl.java | 0 .../schema}/src/com/cloud/network/dao/AccountGuestVlanMapVO.java | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename {server => engine/schema}/src/com/cloud/network/dao/AccountGuestVlanMapDao.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/AccountGuestVlanMapDaoImpl.java (100%) rename {server => engine/schema}/src/com/cloud/network/dao/AccountGuestVlanMapVO.java (100%) diff --git a/server/src/com/cloud/network/dao/AccountGuestVlanMapDao.java b/engine/schema/src/com/cloud/network/dao/AccountGuestVlanMapDao.java similarity index 100% rename from server/src/com/cloud/network/dao/AccountGuestVlanMapDao.java rename to engine/schema/src/com/cloud/network/dao/AccountGuestVlanMapDao.java diff --git a/server/src/com/cloud/network/dao/AccountGuestVlanMapDaoImpl.java b/engine/schema/src/com/cloud/network/dao/AccountGuestVlanMapDaoImpl.java similarity index 100% rename from server/src/com/cloud/network/dao/AccountGuestVlanMapDaoImpl.java rename to engine/schema/src/com/cloud/network/dao/AccountGuestVlanMapDaoImpl.java diff --git a/server/src/com/cloud/network/dao/AccountGuestVlanMapVO.java b/engine/schema/src/com/cloud/network/dao/AccountGuestVlanMapVO.java similarity index 100% rename from server/src/com/cloud/network/dao/AccountGuestVlanMapVO.java rename to engine/schema/src/com/cloud/network/dao/AccountGuestVlanMapVO.java From bc823f946c2493ab315a2b7e7ef7dccce9950994 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Mon, 6 May 2013 16:34:03 -0700 Subject: [PATCH 33/66] Fixed up the simulator to run with windows paths in cygwin --- .../com/cloud/simulator/MockSecStorageVO.java | 3 ++- .../cloud/simulator/MockStoragePoolVO.java | 3 ++- .../src/com/cloud/simulator/MockVolumeVO.java | 3 ++- server/pom.xml | 5 ---- test/integration/smoke/test_vm_life_cycle.py | 2 ++ tools/marvin/pom.xml | 24 +++++++++++++++++-- 6 files changed, 30 insertions(+), 10 deletions(-) diff --git a/plugins/hypervisors/simulator/src/com/cloud/simulator/MockSecStorageVO.java b/plugins/hypervisors/simulator/src/com/cloud/simulator/MockSecStorageVO.java index 532d2a7ff56..87905eedbd1 100644 --- a/plugins/hypervisors/simulator/src/com/cloud/simulator/MockSecStorageVO.java +++ b/plugins/hypervisors/simulator/src/com/cloud/simulator/MockSecStorageVO.java @@ -48,6 +48,7 @@ public class MockSecStorageVO implements InternalIdentity { } + @Override public long getId() { return this.id; } @@ -57,7 +58,7 @@ public class MockSecStorageVO implements InternalIdentity { } public void setMountPoint(String mountPoint) { - this.mountPoint = mountPoint; + this.mountPoint = mountPoint.replace('\\', '/'); } public String getUrl() { diff --git a/plugins/hypervisors/simulator/src/com/cloud/simulator/MockStoragePoolVO.java b/plugins/hypervisors/simulator/src/com/cloud/simulator/MockStoragePoolVO.java index 06aa169a62a..7f1b7ccf610 100644 --- a/plugins/hypervisors/simulator/src/com/cloud/simulator/MockStoragePoolVO.java +++ b/plugins/hypervisors/simulator/src/com/cloud/simulator/MockStoragePoolVO.java @@ -66,6 +66,7 @@ public class MockStoragePoolVO implements InternalIdentity { this.hostGuid = hostGuid; } + @Override public long getId() { return this.id; } @@ -91,7 +92,7 @@ public class MockStoragePoolVO implements InternalIdentity { } public void setMountPoint(String mountPoint) { - this.mountPoint = mountPoint; + this.mountPoint = mountPoint.replace('\\', '/'); } public long getCapacity() { diff --git a/plugins/hypervisors/simulator/src/com/cloud/simulator/MockVolumeVO.java b/plugins/hypervisors/simulator/src/com/cloud/simulator/MockVolumeVO.java index 6dd59e8507c..b7191b887f6 100644 --- a/plugins/hypervisors/simulator/src/com/cloud/simulator/MockVolumeVO.java +++ b/plugins/hypervisors/simulator/src/com/cloud/simulator/MockVolumeVO.java @@ -66,6 +66,7 @@ public class MockVolumeVO implements InternalIdentity { @Enumerated(value=EnumType.STRING) private VMTemplateStorageResourceAssoc.Status status; + @Override public long getId() { return id; } @@ -90,7 +91,7 @@ public class MockVolumeVO implements InternalIdentity { } public void setPath(String path) { - this.path = path; + this.path = path.replace('\\', '/'); } public long getPoolId() { diff --git a/server/pom.xml b/server/pom.xml index 429d60819e3..808dd3eee0a 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -95,11 +95,6 @@ cloud-framework-events ${project.version} - - org.apache.cloudstack - cloud-utils - ${project.version} - install diff --git a/test/integration/smoke/test_vm_life_cycle.py b/test/integration/smoke/test_vm_life_cycle.py index ae36c648e0a..21c26357ab2 100644 --- a/test/integration/smoke/test_vm_life_cycle.py +++ b/test/integration/smoke/test_vm_life_cycle.py @@ -163,6 +163,8 @@ class TestDeployVM(cloudstackTestCase): cls.services["account"], domainid=domain.id ) + cls.debug(str("============" )) + cls.debug(cls.account.id) cls.service_offering = ServiceOffering.create( cls.apiclient, diff --git a/tools/marvin/pom.xml b/tools/marvin/pom.xml index 25134a8968b..089c445ed9e 100644 --- a/tools/marvin/pom.xml +++ b/tools/marvin/pom.xml @@ -220,6 +220,26 @@ + + org.codehaus.gmaven + gmaven-plugin + 1.5 + + + setproperty + validate + + execute + + + + pom.properties['resolved.userdir']='${user.dir}'.replace('\','/').replace('D:','/cyg/d'); + pom.properties['resolved.marvin.config']='${marvin.config}'.replace('\','/').replace('D:','/cyg/d'); + + + + + org.codehaus.mojo exec-maven-plugin @@ -237,11 +257,11 @@ --with-marvin --marvin-config - ${user.dir}/${marvin.config} + ${resolved.user.dir}/${resolved.marvin.config} --load -a tags=${tag} - ${user.dir}/${test} + ${resolved.user.dir}/${test} -v From 5a6a1158fd1f99caf65718810a467562e09cba03 Mon Sep 17 00:00:00 2001 From: Dave Cahill Date: Fri, 19 Apr 2013 17:31:44 +0900 Subject: [PATCH 34/66] Add docs for MidoNet networking plugin [CLOUDSTACK-996] Signed-off-by: Dave Cahill --- docs/en-US/MidoNet_Plugin_Guide.ent | 22 ++++++ docs/en-US/MidoNet_Plugin_Guide.xml | 52 +++++++++++++ docs/en-US/plugin-midonet-about.xml | 27 +++++++ docs/en-US/plugin-midonet-features.xml | 57 ++++++++++++++ docs/en-US/plugin-midonet-introduction.xml | 26 +++++++ docs/en-US/plugin-midonet-preparations.xml | 90 ++++++++++++++++++++++ docs/en-US/plugin-midonet-provider.xml | 39 ++++++++++ docs/en-US/plugin-midonet-revisions.xml | 45 +++++++++++ docs/en-US/plugin-midonet-ui.xml | 65 ++++++++++++++++ docs/en-US/plugin-midonet-usage.xml | 29 +++++++ docs/publican-plugin-midonet.cfg | 28 +++++++ 11 files changed, 480 insertions(+) create mode 100644 docs/en-US/MidoNet_Plugin_Guide.ent create mode 100644 docs/en-US/MidoNet_Plugin_Guide.xml create mode 100644 docs/en-US/plugin-midonet-about.xml create mode 100644 docs/en-US/plugin-midonet-features.xml create mode 100644 docs/en-US/plugin-midonet-introduction.xml create mode 100644 docs/en-US/plugin-midonet-preparations.xml create mode 100644 docs/en-US/plugin-midonet-provider.xml create mode 100644 docs/en-US/plugin-midonet-revisions.xml create mode 100644 docs/en-US/plugin-midonet-ui.xml create mode 100644 docs/en-US/plugin-midonet-usage.xml create mode 100644 docs/publican-plugin-midonet.cfg diff --git a/docs/en-US/MidoNet_Plugin_Guide.ent b/docs/en-US/MidoNet_Plugin_Guide.ent new file mode 100644 index 00000000000..f31c40748c2 --- /dev/null +++ b/docs/en-US/MidoNet_Plugin_Guide.ent @@ -0,0 +1,22 @@ + + + + + + diff --git a/docs/en-US/MidoNet_Plugin_Guide.xml b/docs/en-US/MidoNet_Plugin_Guide.xml new file mode 100644 index 00000000000..86182e60b71 --- /dev/null +++ b/docs/en-US/MidoNet_Plugin_Guide.xml @@ -0,0 +1,52 @@ + + +%BOOK_ENTITIES; + +%xinclude; +]> + + + + + + &PRODUCT; Plugin Guide for the MidoNet Plugin + Apache CloudStack + 4.2.0 + 1 + + + + Plugin Guide for the MidoNet Plugin. + + + + + + + + + + + + + + + + diff --git a/docs/en-US/plugin-midonet-about.xml b/docs/en-US/plugin-midonet-about.xml new file mode 100644 index 00000000000..dd9b3ad08e0 --- /dev/null +++ b/docs/en-US/plugin-midonet-about.xml @@ -0,0 +1,27 @@ + + +%BOOK_ENTITIES; + +%xinclude; +]> + + + The MidoNet Plugin + + + diff --git a/docs/en-US/plugin-midonet-features.xml b/docs/en-US/plugin-midonet-features.xml new file mode 100644 index 00000000000..f242d63d0ee --- /dev/null +++ b/docs/en-US/plugin-midonet-features.xml @@ -0,0 +1,57 @@ + + +%BOOK_ENTITIES; + +%xinclude; +]> + +
    + Features of the MidoNet Plugin + + + + In &PRODUCT; 4.2.0 only the KVM hypervisor is supported for use in combination with MidoNet. + + + + In &PRODUCT; release 4.2.0 this plugin supports several services in the Advanced Isolated network mode. + + + + When tenants create new isolated layer 3 networks, instead of spinning up extra Virtual Router VMs, the relevant L3 elements (routers etc) are created in the MidoNet virtual topology by making the appropriate calls to the MidoNet API. Instead of using VLANs, isolation is provided by MidoNet. + + + + Aside from the above service (Connectivity), several extra features are supported in the 4.2.0 release: + + + + DHCP + Firewall (ingress) + Source NAT + Static NAT + Port Forwarding + + + + The plugin has been tested with MidoNet version 12.12. (Caddo). + + + + +
    diff --git a/docs/en-US/plugin-midonet-introduction.xml b/docs/en-US/plugin-midonet-introduction.xml new file mode 100644 index 00000000000..7793ecbc884 --- /dev/null +++ b/docs/en-US/plugin-midonet-introduction.xml @@ -0,0 +1,26 @@ + + +%BOOK_ENTITIES; + +%xinclude; +]> + +
    + Introduction to the MidoNet Plugin + The MidoNet plugin allows &PRODUCT; to use the MidoNet virtualized networking solution as a provider for &PRODUCT; networks and services. For more information on MidoNet and how it works, see http://www.midokura.com/midonet/. +
    diff --git a/docs/en-US/plugin-midonet-preparations.xml b/docs/en-US/plugin-midonet-preparations.xml new file mode 100644 index 00000000000..cf78774ec2b --- /dev/null +++ b/docs/en-US/plugin-midonet-preparations.xml @@ -0,0 +1,90 @@ + + +%BOOK_ENTITIES; + +%xinclude; +]> + +
    + Prerequisites + + In order to use the MidoNet plugin, the compute hosts must be running the MidoNet Agent, and the MidoNet API server must be available. Please consult the MidoNet User Guide for more information. The following section describes the &PRODUCT; side setup. + + + + &PRODUCT; needs to have at least one physical network with the isolation method set to "MIDO". This network should be enabled for the Guest and Public traffic types. + + + + Next, we need to set the following &PRODUCT; settings under "Global Settings" in the UI: + +&PRODUCT; settings + + + + Setting Name + Description + Example + + + + + midonet.apiserver.address + Specify the address at which the Midonet API server can be contacted + http://192.168.1.144:8081/midolmanj-mgmt + + + midonet.providerrouter.id + Specifies the UUID of the Midonet provider router + d7c5e6a3-e2f4-426b-b728-b7ce6a0448e5 + + + +
    +
    + + + + We also want MidoNet to take care of public traffic, so in componentContext.xml we need to replace this line: + + ]]> + + + With this: + + ]]> + + + +
    + + + + On the compute host, MidoNet takes advantage of per-traffic type VIF driver support in &PRODUCT; KVM. + + + In agent.properties, we set the following to make MidoNet take care of Guest and Public traffic: + +libvirt.vif.driver.Guest=com.cloud.network.resource.MidoNetVifDriver +libvirt.vif.driver.Public=com.cloud.network.resource.MidoNetVifDriver + + This is explained further in MidoNet User Guide. + + + +
    diff --git a/docs/en-US/plugin-midonet-provider.xml b/docs/en-US/plugin-midonet-provider.xml new file mode 100644 index 00000000000..904828caecd --- /dev/null +++ b/docs/en-US/plugin-midonet-provider.xml @@ -0,0 +1,39 @@ + + +%BOOK_ENTITIES; + +%xinclude; +]> + +
    + Enabling the MidoNet service provider via the API + + To enable via the API, use the following API calls: + addNetworkServiceProvider + + name = "MidoNet" + physicalnetworkid = <the uuid of the physical network> + + updateNetworkServiceProvider + + id = <the provider uuid returned by the previous call> + state = "Enabled" + + + +
    \ No newline at end of file diff --git a/docs/en-US/plugin-midonet-revisions.xml b/docs/en-US/plugin-midonet-revisions.xml new file mode 100644 index 00000000000..73def2325b5 --- /dev/null +++ b/docs/en-US/plugin-midonet-revisions.xml @@ -0,0 +1,45 @@ + + +%BOOK_ENTITIES; +]> + + + + + Revision History + + + + 0-0 + Wed Mar 13 2013 + + Dave + Cahill + dcahill@midokura.com + + + + Documentation created for 4.2.0 version of the MidoNet Plugin + + + + + + diff --git a/docs/en-US/plugin-midonet-ui.xml b/docs/en-US/plugin-midonet-ui.xml new file mode 100644 index 00000000000..8ee9850e5a7 --- /dev/null +++ b/docs/en-US/plugin-midonet-ui.xml @@ -0,0 +1,65 @@ + + +%BOOK_ENTITIES; + +%xinclude; +]> + +
    + Enabling the MidoNet service provider via the UI + To allow &PRODUCT; to use the MidoNet Plugin the network service provider needs to be enabled on the physical network. + + + + The steps to enable via the UI are as follows: + + + In the left navbar, click Infrastructure + + + + In Zones, click View All + + + + Click the name of the Zone on which you are setting up MidoNet + + + + Click the Physical Network tab + + + + Click the Name of the Network on which you are setting up MidoNet + + + + Click Configure on the Network Service Providers box + + + + Click on the name MidoNet + + + + Click the Enable Provider button in the Network tab + + + + +
    diff --git a/docs/en-US/plugin-midonet-usage.xml b/docs/en-US/plugin-midonet-usage.xml new file mode 100644 index 00000000000..a314581dcda --- /dev/null +++ b/docs/en-US/plugin-midonet-usage.xml @@ -0,0 +1,29 @@ + + +%BOOK_ENTITIES; + +%xinclude; +]> + + + Using the MidoNet Plugin + + + + + diff --git a/docs/publican-plugin-midonet.cfg b/docs/publican-plugin-midonet.cfg new file mode 100644 index 00000000000..6558d99e897 --- /dev/null +++ b/docs/publican-plugin-midonet.cfg @@ -0,0 +1,28 @@ +# Publican configuration file for CloudStack Complete Documentation Set +# Contains all technical docs except release notes +# Config::Simple 4.58 +# Tue May 29 00:57:27 2012 +# +# 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. + +xml_lang: en-US +type: Book +docname: MidoNet_Plugin_Guide +brand: cloudstack +chunk_first: 1 +chunk_section_depth: 1 +condition: install From fd3c3b6c47959001dddbf9b6b17e4ea26f013bd2 Mon Sep 17 00:00:00 2001 From: Radhika PC Date: Tue, 7 May 2013 11:30:17 +0530 Subject: [PATCH 35/66] CLOUDSTACK-893 first cut --- docs/en-US/gslb.xml | 235 +++++++++++++++++++++++++++++++++ docs/en-US/images/add-gslb.png | Bin 0 -> 17665 bytes docs/en-US/images/gslb.png | Bin 0 -> 184080 bytes 3 files changed, 235 insertions(+) create mode 100644 docs/en-US/gslb.xml create mode 100644 docs/en-US/images/add-gslb.png create mode 100644 docs/en-US/images/gslb.png diff --git a/docs/en-US/gslb.xml b/docs/en-US/gslb.xml new file mode 100644 index 00000000000..385642d394d --- /dev/null +++ b/docs/en-US/gslb.xml @@ -0,0 +1,235 @@ + + +%BOOK_ENTITIES; +]> + + +
    + Global Server Load Balancing Support + &PRODUCT; supports Global Server Load Balancing (GSLB) functionalities to provide business + continuity, and enable seamless resource movement within a &PRODUCT; environment. &PRODUCT; + achieve this by extending its functionality of integrating with NetScaler Application Delivery + Controller (ADC), which also provides various GSLB capabilities, such as disaster recovery and + load balancing. The DNS redirection technique is used to achieve GSLB in &PRODUCT;. + In order to support his functionality, region level services and service provider are + introduced. A new service 'GSLB' is introduced as a region level service. The GSLB service + provider is introduced that will provider the GSLB service. Currently, NetScaler is the + supported GSLB provider in &PRODUCT;. GSLB functionality works in an Active-Active data center + environment. +
    + About Global Server Load Balancing + Global Server Load Balancing (GSLB) is an extension of load balancing functionality, which + is highly efficient in avoiding downtime. Based on the nature of deployment, GSLB represents a + set of technologies that is used for various purposes, such as load sharing, disaster + recovery, performance, and legal obligations. With GSLB, workloads can be distributed across + multiple data centers situated at geographically separated locations. GSLB can also provide an + alternate location for accessing a resource in the event of a failure, or to provide a means + of shifting traffic easily to simplify maintenance, or both. +
    +
    + Prerequisites and Guidelines + + + The GSLB functionality is supported both Basic and Advanced zones. + + + GSLB is added as a new network service. + + + GSLB service provider can be added to a physical network in a zone. + + + The admin is allowed to enable or disable GSLB functionality at region level. + + + The admin is allowed to configure a zone as GSLB capable or enabled. + A zone shall be considered as GSLB capable only if a GSLB service provider is + provisioned in the zone. + + + When users have VMs deployed in multiple availability zones which are GSLB enabled, + user is allowed to use the GSLB functionality to load balance traffic across the VMs in + multiple zones. + + + The users are allowed to use GSLB to load balance across the VMs across zones in a + region only if the admin has enabled GSLB in that region. + + + The users are allowed to load balance traffic across the availability zones in the + same region or different regions. + + + The admin is allowed to configure DNS name for the entire cloud. + + + The users can specify an unique name, across the cloud, for a globally load balanced + service. The provided name will be used as the domain under the DNS name associated with + the cloud. + The user-provided name along with the admin-provided DNS name is used to produce a + globally resolvable FQDN for the globally load balanced service of the user. For example, + if the admin has configured xyztelco.com as the DNS name for the cloud, and user specifies + 'foo' for the GSLB virtual service, then the FQDN name of the GSLB virtual service is + foo.xyztelco.com. + + + While setting up GSLB, users can select a load balancing method, such as round robin + or least RTT, that would be the load balance traffic used across the zones that are part + of GSLB. + + + The user shall be able to set weight to zone-level virtual server. Weight shall be + considered by the load balancing method is distributing the traffic. + + + The GSLB functionality shall support session persistence, where series of client + requests for particular domain name is sent to a virtual server on the same zone. + Statistics is collected from each GSLB virtual server. + + +
    +
    + Adding a GSLB Rule + + + Log in to the &PRODUCT; UI as administrator. + + + In the left navigation pane, click Region. + + + Select the region for which you want to create a GSLB rule. + + + In the Details tab, click View GSLB. + + + Click Add GSLB. + The Add GSLB page is displayed as follows: + + + + + + gslb-add.png: adding a gslb rule + + + + + Specify the following: + + + Name: Name for the GSLB rule. + + + Description: (Optional) A short description of + the GSLB rule that can be displayed to users. + + + GSLB Domain Name: A preferred domain name for the + service. + + + Algorithm: (Optional) The algorithm to use to + load balance the traffic across the zones. The options are Round Robin, Least + Connection, and Proximity. + + + Service Type: The transport protocol to use for + GSLB. The options are TCP and UDP. + + + Domain: (Optional) The domain for which you want + to create the GSLB rule. + + + Account: (Optional) The account on which you want + to apply the GSLB rule. + + + + + Click OK to confirm. + + +
    +
    + Assigning Load Balancing Rules to GSLB + +
    +
    + How Does GSLB Works in &PRODUCT;? + The following is an illustrated conceptual model of how GLSB functionality is provided in + &PRODUCT;: An organization, xyztelco, has set up a public cloud that spans two zones, Zone-1 + and Zone-2, across geographically separated data centers that are managed by &PRODUCT;. + Tenant-A of the cloud launches a highly available solution by using xyztelco cloud. For that + purpose, they launch two instances each in both the zones: VM1 and VM2 in Zone-1 and VM5 and + VM6 in Zone-2. Tenant-A acquires a public IP, IP-1 in Zone-1, and configures a load balancer + rule to load balance the traffic between VM1 and VM2 instances. &PRODUCT; orchestrates setting + up a virtual server on the LB service provider in Zone-1. Virtual server 1 that is set up on + the LB service provider in Zone-1 represents a publicly accessible virtual server that client + reaches at IP-1. The client traffic to virtual server 1 at IP-1 will be load balanced across + VM1 and VM2 instances. + Tenant-A acquires another public IP, IP-2 in Zone-2 and sets up a load balancer rule to + load balance the traffic between VM5 and VM6 instances. Similarly in Zone-2, &PRODUCT; + orchestrates setting up a virtual server on the LB service provider. Virtual server 2 that is + setup on the LB service provider in Zone-2 represents a publicly accessible virtual server + that client reaches at IP-2. The client traffic that reaches virtual server 2 at IP-2 is load + balanced across VM5 and VM6 instances. At this point Tenant-A has the service enabled in both + the zones, but has no means to set up a disaster recovery plan if one of the zone fails. + Additionally, there is no way for Tenant-A to load balance the traffic intelligently to one of + the zones based on load, proximity and so on. The cloud administrator of xyztelco provisions a + GSLB service provider to both the zones. A GSLB provider is typically an ADC that has the + ability to act as an ADNS (Authoritative Domain Name Server) and has the mechanism to monitor + health of virtual servers both at local and remote sites. The cloud admin enables GSLB as a + service to the tenants that use zones 1 and 2. + + + + + + gslb.png: GSLB architecture + + + Tenant-A wishes to leverage the GSLB service provided by the xyztelco cloud. Tenant-A + configures a GSLB rule to load balance traffic across virtual server 1 at Zone-1 and virtual + server 2 at Zone-2. The domain name is provided as A.xyztelco.com. &PRODUCT; orchestrates + setting up GSLB virtual server 1 on the GSLB service provider at Zone-1. &PRODUCT; binds + virtual server 1 of Zone-1 and virtual server 2 of Zone-2 to GLSB virtual server 1. GSLB + virtual server 1 is configured to start monitoring the health of virtual server 1 and 2 in + Zone-1. &PRODUCT; will also orchestrate setting up GSLB virtual server 2 on GSLB service + provider at Zone-2. &PRODUCT; will bind virtual server 1 of Zone-1 and virtual server 2 of + Zone-2 to GLSB virtual server 2. GSLB virtual server 2 is configured to start monitoring the + health of virtual server 1 and 2. &PRODUCT; will bind the domain A.xyztelco.com to both the + GSLB virtual server 1 and 2. At this point, Tenant-A service will be globally reachable at + A.xyztelco.com. The private DNS server for the domain xyztelcom.com is configured by the admin + out-of-band to resolve the domain A.xyztelco.com to the GSLB providers at both the zones, + which are configured as ADNS for the domain A.xyztelco.com. A client when sends a DNS request + to resolve A.xyztelcom.com, will eventually get DNS delegation to the address of GSLB + providers at Zone 1 and 2. A client DNS request will be received by the GSLB provider. The + GSLB provider, depending on the domain for which it needs to resolve, will pick up the GSLB + virtual server associated with the domain. Depending on the health of the virtual servers + being load balanced, DNS request for the domain will be resolved to the public IP associated + with the selected virtual server. +
    +
    + Known Limitation + Currently, &PRODUCT; does not support orchestration of services across the zones. The + notion of services and service providers in region are to be introduced. +
    +
    diff --git a/docs/en-US/images/add-gslb.png b/docs/en-US/images/add-gslb.png new file mode 100644 index 0000000000000000000000000000000000000000..827a913093b5e68a6afbd74fd172a28d82815aff GIT binary patch literal 17665 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 literal 0 HcmV?d00001 diff --git a/docs/en-US/images/gslb.png b/docs/en-US/images/gslb.png new file mode 100644 index 0000000000000000000000000000000000000000..8d1a389936c31e3ed46c24f7a6787fd21a873c65 GIT binary patch literal 184080 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¬Q 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≦pX2w0y$m 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 literal 0 HcmV?d00001 From d6e0452af1785a259e52a760c1f5c372a52a7574 Mon Sep 17 00:00:00 2001 From: Hugo Trippaers Date: Tue, 7 May 2013 09:58:16 +0200 Subject: [PATCH 36/66] Recent pom switcharoo caused the client to lose the dependecy on console-proxy, which it needs to include the systemvm --- client/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/client/pom.xml b/client/pom.xml index a7c7009ffc2..147959bd7f0 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -239,6 +239,11 @@ cloud-plugin-host-anti-affinity ${project.version} + + org.apache.cloudstack + cloud-console-proxy + ${project.version} + install From 9037d3b3d06eba017ab0aaba84b92e5b10dbc59f Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Tue, 7 May 2013 13:50:12 +0530 Subject: [PATCH 37/66] dedicateGuestVlanRange is admin only API Adding ACL for the dedicateGuestVlanRange API. Signed-off-by: Prasanna Santhanam --- client/tomcatconf/commands.properties.in | 1 + 1 file changed, 1 insertion(+) diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in index 6e3a5e4a40c..22de93dc65d 100644 --- a/client/tomcatconf/commands.properties.in +++ b/client/tomcatconf/commands.properties.in @@ -126,6 +126,7 @@ createVlanIpRange=1 deleteVlanIpRange=1 listVlanIpRanges=1 dedicatePublicIpRange=1 +dedicateGuestVlanRange=1 releasePublicIpRange=1 #### address commands From 26d637a0fb77e803b9f03cfcbc46076931a3c4b6 Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Tue, 7 May 2013 13:50:56 +0530 Subject: [PATCH 38/66] Adding tracelogs to the API discovery service Signed-off-by: Prasanna Santhanam --- .../apache/cloudstack/discovery/ApiDiscoveryServiceImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/api/discovery/src/org/apache/cloudstack/discovery/ApiDiscoveryServiceImpl.java b/plugins/api/discovery/src/org/apache/cloudstack/discovery/ApiDiscoveryServiceImpl.java index 2d7dbd18671..08fb573e4d9 100755 --- a/plugins/api/discovery/src/org/apache/cloudstack/discovery/ApiDiscoveryServiceImpl.java +++ b/plugins/api/discovery/src/org/apache/cloudstack/discovery/ApiDiscoveryServiceImpl.java @@ -83,6 +83,9 @@ public class ApiDiscoveryServiceImpl implements ApiDiscoveryService { } String apiName = apiCmdAnnotation.name(); + if (s_logger.isTraceEnabled()) { + s_logger.trace("Found api: " + apiName); + } ApiDiscoveryResponse response = getCmdRequestMap(cmdClass, apiCmdAnnotation); String responseName = apiCmdAnnotation.responseObject().getName(); From 64522b6bd582f55eb4ca6a5e4850e39847beda34 Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Tue, 7 May 2013 13:51:34 +0530 Subject: [PATCH 39/66] moving test data to top level dictionary Signed-off-by: Prasanna Santhanam --- .../integration/smoke/test_guest_vlan_range.py | 18 ++++++++++++------ tools/marvin/marvin/cloudstackConnection.py | 2 +- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/test/integration/smoke/test_guest_vlan_range.py b/test/integration/smoke/test_guest_vlan_range.py index eca0e61f137..01cd68c1435 100644 --- a/test/integration/smoke/test_guest_vlan_range.py +++ b/test/integration/smoke/test_guest_vlan_range.py @@ -43,7 +43,8 @@ class Services: "username": "test", "password": "password", }, - "name": "testphysicalnetwork" + "name": "testphysicalnetwork", + "vlan": "2118-2120", } @@ -64,7 +65,7 @@ class TesDedicateGuestVlanRange(cloudstackTestCase): domainid=cls.domain.id ) cls._cleanup = [ - #cls.account, + cls.account, ] return @@ -72,6 +73,13 @@ class TesDedicateGuestVlanRange(cloudstackTestCase): def tearDownClass(cls): try: # Cleanup resources used + list_physical_network_response = PhysicalNetwork.list(cls.api_client) + if list_physical_network_response is not None and len(list_physical_network_response) > 0: + physical_network = list_physical_network_response[0] + removeGuestVlanRangeResponse = \ + physical_network.update(cls.api_client, + id=physical_network.id, + removevlan=cls.services["vlan"]) cleanup_resources(cls.api_client, cls._cleanup) except Exception as e: raise Exception("Warning: Exception during cleanup : %s" % e) @@ -119,12 +127,12 @@ class TesDedicateGuestVlanRange(cloudstackTestCase): physical_network_response = list_physical_network_response[0] self.debug("Adding guest vlan range") - addGuestVlanRangeResponse = physical_network_response.update(self.apiclient, id=physical_network_response.id, vlan="387-390") + addGuestVlanRangeResponse = physical_network_response.update(self.apiclient, id=physical_network_response.id, vlan=self.services["vlan"]) self.debug("Dedicating guest vlan range"); dedicate_guest_vlan_range_response = PhysicalNetwork.dedicate( self.apiclient, - "387-390", + self.services["vlan"], physicalnetworkid=physical_network_response.id, account=self.account.name, domainid=self.account.domainid @@ -153,5 +161,3 @@ class TesDedicateGuestVlanRange(cloudstackTestCase): "Check account name is system account in listDedicatedGuestVlanRanges" ) - self.debug("Removing guest vlan range") - removeGuestVlanRangeResponse = physical_network_response.update(self.apiclient, id=physical_network_response.id, removevlan="387-390") diff --git a/tools/marvin/marvin/cloudstackConnection.py b/tools/marvin/marvin/cloudstackConnection.py index 9a4c387a87a..803911721e9 100644 --- a/tools/marvin/marvin/cloudstackConnection.py +++ b/tools/marvin/marvin/cloudstackConnection.py @@ -113,7 +113,7 @@ class cloudConnection(object): ) signature = base64.encodestring(hmac.new( self.securityKey, hashStr, hashlib.sha1).digest()).strip() - self.logging.info("Computed Signature by Marvin: %s" % signature) + self.logging.debug("Computed Signature by Marvin: %s" % signature) return signature def request(self, command, auth=True, payload={}, method='GET'): From 8b965c56859c32983da4d2414f5c4d34de34769d Mon Sep 17 00:00:00 2001 From: Hugo Trippaers Date: Tue, 7 May 2013 10:57:23 +0200 Subject: [PATCH 40/66] commit e0d8f01ecd92a1a7b74558d02a28be3b2f20a10d enabled all tests, but the tests in vmware-base are horribly broken and will not compile with the current CloudStack. Removing the tests to fix the nonoss build and they are so broken they should be rewritten from scratch anyway. --- vmware-base/pom.xml | 4 - .../vmware/mo/TestVmwareContextFactory.java | 43 - .../hypervisor/vmware/mo/TestVmwareMO.java | 39 - .../vmware/util/TestVmwareUtil.java | 107 -- .../test/com/cloud/vmware/TestVMWare.java | 1342 ----------------- 5 files changed, 1535 deletions(-) delete mode 100644 vmware-base/test/com/cloud/hypervisor/vmware/mo/TestVmwareContextFactory.java delete mode 100644 vmware-base/test/com/cloud/hypervisor/vmware/mo/TestVmwareMO.java delete mode 100755 vmware-base/test/com/cloud/hypervisor/vmware/util/TestVmwareUtil.java delete mode 100644 vmware-base/test/com/cloud/vmware/TestVMWare.java diff --git a/vmware-base/pom.xml b/vmware-base/pom.xml index 8fa811fb3f2..da4fb21c713 100644 --- a/vmware-base/pom.xml +++ b/vmware-base/pom.xml @@ -59,8 +59,4 @@ 1.4 - - install - src - diff --git a/vmware-base/test/com/cloud/hypervisor/vmware/mo/TestVmwareContextFactory.java b/vmware-base/test/com/cloud/hypervisor/vmware/mo/TestVmwareContextFactory.java deleted file mode 100644 index 81a62d2993a..00000000000 --- a/vmware-base/test/com/cloud/hypervisor/vmware/mo/TestVmwareContextFactory.java +++ /dev/null @@ -1,43 +0,0 @@ -// 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.hypervisor.vmware.mo; - -import com.cloud.hypervisor.vmware.util.VmwareClient; -import com.cloud.hypervisor.vmware.util.VmwareContext; - - -public class TestVmwareContextFactory { - private static volatile int s_seq = 1; - - static { - // skip certificate check - System.setProperty("axis.socketSecureFactory", "org.apache.axis.components.net.SunFakeTrustSocketFactory"); - } - - public static VmwareContext create(String vCenterAddress, String vCenterUserName, String vCenterPassword) throws Exception { - assert(vCenterAddress != null); - assert(vCenterUserName != null); - assert(vCenterPassword != null); - - String serviceUrl = "https://" + vCenterAddress + "/sdk/vimService"; - VmwareClient vimClient = new VmwareClient(vCenterAddress + "-" + s_seq++); - vimClient.connect(serviceUrl, vCenterUserName, vCenterPassword); - - VmwareContext context = new VmwareContext(vimClient, vCenterAddress); - return context; - } -} diff --git a/vmware-base/test/com/cloud/hypervisor/vmware/mo/TestVmwareMO.java b/vmware-base/test/com/cloud/hypervisor/vmware/mo/TestVmwareMO.java deleted file mode 100644 index c9807f443f1..00000000000 --- a/vmware-base/test/com/cloud/hypervisor/vmware/mo/TestVmwareMO.java +++ /dev/null @@ -1,39 +0,0 @@ -// 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.hypervisor.vmware.mo; - -import java.util.GregorianCalendar; - -import org.apache.log4j.Logger; - -import com.cloud.hypervisor.vmware.mo.SnapshotDescriptor.SnapshotInfo; -import com.cloud.hypervisor.vmware.util.VmwareContext; -import com.cloud.utils.Pair; -import com.cloud.utils.testcase.Log4jEnabledTestCase; -import com.google.gson.Gson; -import com.vmware.vim25.DynamicProperty; -import com.vmware.vim25.ManagedObjectReference; -import com.vmware.vim25.ObjectContent; -import com.vmware.vim25.VirtualMachineConfigSpec; - -public class TestVmwareMO extends Log4jEnabledTestCase { - private static final Logger s_logger = Logger.getLogger(TestVmwareMO.class); - - public void test() { - } -} - diff --git a/vmware-base/test/com/cloud/hypervisor/vmware/util/TestVmwareUtil.java b/vmware-base/test/com/cloud/hypervisor/vmware/util/TestVmwareUtil.java deleted file mode 100755 index d1dd11b7c8e..00000000000 --- a/vmware-base/test/com/cloud/hypervisor/vmware/util/TestVmwareUtil.java +++ /dev/null @@ -1,107 +0,0 @@ -// 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.hypervisor.vmware.util; -import java.io.File; - -import junit.framework.Assert; - -import org.apache.log4j.Logger; - -import com.cloud.hypervisor.vmware.resource.SshHelper; -import com.cloud.hypervisor.vmware.resource.VmwareContextFactory; -import com.cloud.utils.Pair; -import com.cloud.utils.testcase.Log4jEnabledTestCase; -import com.vmware.vim25.ManagedObjectReference; - -public class TestVmwareUtil extends Log4jEnabledTestCase { - private static final Logger s_logger = Logger.getLogger(TestVmwareUtil.class); - - public void testContextCreation() { - try { - VmwareContext context = VmwareContextFactory.create("vsphere-1.lab.vmops.com", "Administrator", "Suite219"); - Assert.assertTrue(true); - context.close(); - } catch(Exception e) { - s_logger.error("Unexpected exception : ", e); - } - } - - public void testSearchIndex() { - try { - VmwareContext context = VmwareContextFactory.create("vsphere-1.lab.vmops.com", "Administrator", "Suite219"); - Assert.assertTrue(true); - - ManagedObjectReference morHost = context.getService().findByDnsName(context.getServiceContent().getSearchIndex(), - null, "esxhost-1.lab.vmops.com", false); - Assert.assertTrue(morHost.getType().equalsIgnoreCase("HostSystem")); - - morHost = context.getService().findByIp(context.getServiceContent().getSearchIndex(), - null, "192.168.1.168", false); - Assert.assertTrue(morHost == null); - context.close(); - } catch(Exception e) { - s_logger.error("Unexpected exception : ", e); - } - } - - public void testVmxFileDownload() { - try { - VmwareContext context = VmwareContextFactory.create("vsphere-1.lab.vmops.com", "Administrator", "Suite219"); - byte[] vmxContent = context.getResourceContent("https://vsphere-1.lab.vmops.com/folder/ServerRoom-Fedora32/ServerRoom-Fedora32.vmx?dcPath=cupertino&dsName=NFS%20datastore"); - System.out.print(new String(vmxContent)); - context.close(); - } catch(Exception e) { - s_logger.error("Unexpected exception : ", e); - } - } - - public void testVmxFileParser() { - String[] tokens = "[NFS datastore] Fedora-clone-test/Fedora-clone-test.vmx".split("\\[|\\]|/"); - - for(String str : tokens) { - System.out.println("Token " + str); - } - } - - public void testSsh() { - try { - File file = new File("c:\\temp\\id_rsa.kelven"); - if(!file.exists()) { - System.out.println("key file does not exist!"); - } - - Pair result = SshHelper.sshExecute("192.168.1.107", 22, "kelven", file, null, "ls -al"); - System.out.println("Result: " + result.second()); - } catch(Exception e) { - s_logger.error("Unexpected exception : ", e); - } - } - - public void testScp() { - try { - File file = new File("c:\\temp\\id_rsa.kelven"); - if(!file.exists()) { - System.out.println("key file does not exist!"); - } - - SshHelper.scpTo("192.168.1.107", 22, "kelven", file, null, "~", "Hello, world".getBytes(), - "hello.txt", null); - } catch(Exception e) { - s_logger.error("Unexpected exception : ", e); - } - } -} diff --git a/vmware-base/test/com/cloud/vmware/TestVMWare.java b/vmware-base/test/com/cloud/vmware/TestVMWare.java deleted file mode 100644 index f2d08e17f5a..00000000000 --- a/vmware-base/test/com/cloud/vmware/TestVMWare.java +++ /dev/null @@ -1,1342 +0,0 @@ -// 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.vmware; - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.URL; -import java.rmi.RemoteException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLSession; - -import org.apache.log4j.xml.DOMConfigurator; - -import com.cloud.hypervisor.vmware.mo.DatacenterMO; -import com.cloud.hypervisor.vmware.mo.DistributedVirtualSwitchMO; -import com.cloud.hypervisor.vmware.mo.HypervisorHostHelper; -import com.cloud.hypervisor.vmware.util.VmwareContext; -import com.cloud.utils.PropertiesUtil; -import com.vmware.vim25.HostIpConfig; -import com.vmware.vim25.HostVirtualNicSpec; -import com.vmware.vim25.ArrayOfManagedObjectReference; -import com.vmware.vim25.DVPortgroupConfigInfo; -import com.vmware.vim25.DVPortgroupConfigSpec; -import com.vmware.vim25.DVSSecurityPolicy; -import com.vmware.vim25.DVSTrafficShapingPolicy; -import com.vmware.vim25.DatastoreInfo; -import com.vmware.vim25.DynamicProperty; -import com.vmware.vim25.HostConfigManager; -import com.vmware.vim25.HostIpConfig; -import com.vmware.vim25.HostPortGroupSpec; -import com.vmware.vim25.HostVirtualNicSpec; -import com.vmware.vim25.HttpNfcLeaseDeviceUrl; -import com.vmware.vim25.HttpNfcLeaseInfo; -import com.vmware.vim25.HttpNfcLeaseState; -import com.vmware.vim25.InvalidProperty; -import com.vmware.vim25.ManagedObjectReference; -import com.vmware.vim25.ObjectContent; -import com.vmware.vim25.ObjectSpec; -import com.vmware.vim25.OvfCreateImportSpecParams; -import com.vmware.vim25.OvfCreateImportSpecResult; -import com.vmware.vim25.OvfFileItem; -import com.vmware.vim25.PropertyFilterSpec; -import com.vmware.vim25.PropertySpec; -import com.vmware.vim25.RuntimeFault; -import com.vmware.vim25.SelectionSpec; -import com.vmware.vim25.TraversalSpec; -import com.vmware.vim25.VMwareDVSPortSetting; -import com.vmware.vim25.VirtualDeviceConfigSpec; -import com.vmware.vim25.VirtualDeviceConfigSpecOperation; -import com.vmware.vim25.VirtualEthernetCard; -import com.vmware.vim25.VirtualEthernetCardNetworkBackingInfo; -import com.vmware.vim25.VirtualMachineCloneSpec; -import com.vmware.vim25.VirtualMachineConfigSpec; -import com.vmware.vim25.VirtualMachineRelocateSpec; -import com.vmware.vim25.VirtualNicManagerNetConfig; -import com.vmware.vim25.VirtualPCNet32; -import com.vmware.vim25.VmwareDistributedVirtualSwitchVlanSpec; - -public class TestVMWare { - private static ExtendedAppUtil cb; - private static String[] _args; - - private static final int IND_DATACENTER_MOR = 3; - private static final int IND_DVSWITCH_MOR = 4; - private static final int IND_DVSWITCH_NAME = 5; - private static final int IND_DVPORTGROUP_NAME = 6; - private static final int IND_DVPORTGROUP_VLAN = 7; - private static final int IND_DVPORTGROUP_PORTCOUNT = 8; - private static final int MAX_ARGS = 9; - static { - try { - javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1]; - javax.net.ssl.TrustManager tm = new TrustAllManager(); - trustAllCerts[0] = tm; - javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext.getInstance("SSL"); - sc.init(null, trustAllCerts, null); - javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); - } catch (Exception e) { - } - } - - private static void setupLog4j() { - File file = PropertiesUtil.findConfigFile("log4j-cloud.xml"); - - if(file != null) { - System.out.println("Log4j configuration from : " + file.getAbsolutePath()); - DOMConfigurator.configureAndWatch(file.getAbsolutePath(), 10000); - } else { - System.out.println("Configure log4j with default properties"); - } - } - - private void getAndPrintInventoryContents() throws Exception { - TraversalSpec resourcePoolTraversalSpec = new TraversalSpec(); - resourcePoolTraversalSpec.setName("resourcePoolTraversalSpec"); - resourcePoolTraversalSpec.setType("ResourcePool"); - resourcePoolTraversalSpec.setPath("resourcePool"); - resourcePoolTraversalSpec.setSkip(new Boolean(false)); - resourcePoolTraversalSpec.setSelectSet( - new SelectionSpec [] { new SelectionSpec(null,null,"resourcePoolTraversalSpec") }); - - TraversalSpec computeResourceRpTraversalSpec = new TraversalSpec(); - computeResourceRpTraversalSpec.setName("computeResourceRpTraversalSpec"); - computeResourceRpTraversalSpec.setType("ComputeResource"); - computeResourceRpTraversalSpec.setPath("resourcePool"); - computeResourceRpTraversalSpec.setSkip(new Boolean(false)); - computeResourceRpTraversalSpec.setSelectSet( - new SelectionSpec [] { new SelectionSpec(null,null,"resourcePoolTraversalSpec") }); - - TraversalSpec computeResourceHostTraversalSpec = new TraversalSpec(); - computeResourceHostTraversalSpec.setName("computeResourceHostTraversalSpec"); - computeResourceHostTraversalSpec.setType("ComputeResource"); - computeResourceHostTraversalSpec.setPath("host"); - computeResourceHostTraversalSpec.setSkip(new Boolean(false)); - - TraversalSpec datacenterHostTraversalSpec = new TraversalSpec(); - datacenterHostTraversalSpec.setName("datacenterHostTraversalSpec"); - datacenterHostTraversalSpec.setType("Datacenter"); - datacenterHostTraversalSpec.setPath("hostFolder"); - datacenterHostTraversalSpec.setSkip(new Boolean(false)); - datacenterHostTraversalSpec.setSelectSet( - new SelectionSpec [] { new SelectionSpec(null,null,"folderTraversalSpec") }); - - TraversalSpec datacenterVmTraversalSpec = new TraversalSpec(); - datacenterVmTraversalSpec.setName("datacenterVmTraversalSpec"); - datacenterVmTraversalSpec.setType("Datacenter"); - datacenterVmTraversalSpec.setPath("vmFolder"); - datacenterVmTraversalSpec.setSkip(new Boolean(false)); - datacenterVmTraversalSpec.setSelectSet( - new SelectionSpec [] { new SelectionSpec(null,null,"folderTraversalSpec") }); - - TraversalSpec folderTraversalSpec = new TraversalSpec(); - folderTraversalSpec.setName("folderTraversalSpec"); - folderTraversalSpec.setType("Folder"); - folderTraversalSpec.setPath("childEntity"); - folderTraversalSpec.setSkip(new Boolean(false)); - folderTraversalSpec.setSelectSet( - new SelectionSpec [] { new SelectionSpec(null,null,"folderTraversalSpec"), - datacenterHostTraversalSpec, - datacenterVmTraversalSpec, - computeResourceRpTraversalSpec, - computeResourceHostTraversalSpec, - resourcePoolTraversalSpec }); - - PropertySpec[] propspecary = new PropertySpec[] { new PropertySpec() }; - propspecary[0].setAll(new Boolean(false)); - propspecary[0].setPathSet(new String[] { "name" }); - propspecary[0].setType("ManagedEntity"); - - PropertyFilterSpec spec = new PropertyFilterSpec(); - spec.setPropSet(propspecary); - spec.setObjectSet(new ObjectSpec[] { new ObjectSpec() }); - spec.getObjectSet(0).setObj(cb.getServiceConnection3().getRootFolder()); - spec.getObjectSet(0).setSkip(new Boolean(false)); - spec.getObjectSet(0).setSelectSet( - new SelectionSpec[] { folderTraversalSpec }); - - // Recursively get all ManagedEntity ManagedObjectReferences - // and the "name" property for all ManagedEntities retrieved - ObjectContent[] ocary = - cb.getServiceConnection3().getService().retrieveProperties( - cb.getServiceConnection3().getServiceContent().getPropertyCollector(), - new PropertyFilterSpec[] { spec } - ); - - // If we get contents back. print them out. - if (ocary != null) { - ObjectContent oc = null; - ManagedObjectReference mor = null; - DynamicProperty[] pcary = null; - DynamicProperty pc = null; - for (int oci = 0; oci < ocary.length; oci++) { - oc = ocary[oci]; - mor = oc.getObj(); - pcary = oc.getPropSet(); - - System.out.println("Object Type : " + mor.getType()); - System.out.println("Reference Value : " + mor.get_value()); - - if (pcary != null) { - for (int pci = 0; pci < pcary.length; pci++) { - pc = pcary[pci]; - System.out.println(" Property Name : " + pc.getName()); - if (pc != null) { - if (!pc.getVal().getClass().isArray()) { - System.out.println(" Property Value : " + pc.getVal()); - } - else { - Object[] ipcary = (Object[])pc.getVal(); - System.out.println("Val : " + pc.getVal()); - for (int ii = 0; ii < ipcary.length; ii++) { - Object oval = ipcary[ii]; - if (oval.getClass().getName().indexOf("ManagedObjectReference") >= 0) { - ManagedObjectReference imor = (ManagedObjectReference)oval; - - System.out.println("Inner Object Type : " + imor.getType()); - System.out.println("Inner Reference Value : " + imor.get_value()); - } - else { - System.out.println("Inner Property Value : " + oval); - } - } - } - } - } - } - } - } else { - System.out.println("No Managed Entities retrieved!"); - } - } - - private void listDataCenters() { - try { - ManagedObjectReference[] morDatacenters = getDataCenterMors(); - if(morDatacenters != null) { - for(ManagedObjectReference mor : morDatacenters) { - System.out.println("Datacenter : " + mor.get_value()); - - Map properites = new HashMap(); - properites.put("name", null); - properites.put("vmFolder", null); - properites.put("hostFolder", null); - - getProperites(mor, properites); - for(Map.Entry entry : properites.entrySet()) { - if(entry.getValue() instanceof ManagedObjectReference) { - ManagedObjectReference morProp = (ManagedObjectReference)entry.getValue(); - System.out.println("\t" + entry.getKey() + ":(" + morProp.getType() + ", " + morProp.get_value() + ")"); - } else { - System.out.println("\t" + entry.getKey() + ":" + entry.getValue()); - } - } - - System.out.println("Datacenter clusters"); - ManagedObjectReference[] clusters = getDataCenterClusterMors(mor); - if(clusters != null) { - for(ManagedObjectReference morCluster : clusters) { - Object[] props = this.getProperties(morCluster, new String[] {"name"}); - System.out.println("cluster : " + props[0]); - - System.out.println("cluster hosts"); - ManagedObjectReference[] hosts = getClusterHostMors(morCluster); - if(hosts != null) { - for(ManagedObjectReference morHost : hosts) { - Object[] props2 = this.getProperties(morHost, new String[] {"name"}); - System.out.println("host : " + props2[0]); - } - } - } - } - - System.out.println("Datacenter standalone hosts"); - ManagedObjectReference[] hosts = getDataCenterStandaloneHostMors(mor); - if(hosts != null) { - for(ManagedObjectReference morHost : hosts) { - Object[] props = this.getProperties(morHost, new String[] {"name"}); - System.out.println("host : " + props[0]); - } - } - - System.out.println("Datacenter datastores"); - ManagedObjectReference[] stores = getDataCenterDatastoreMors(mor); - if(stores != null) { - for(ManagedObjectReference morStore : stores) { - // data store name property does not work for some reason - Object[] props = getProperties(morStore, new String[] {"info" }); - - System.out.println(morStore.getType() + ": " + ((DatastoreInfo)props[0]).getName()); - } - } - - System.out.println("Datacenter VMs"); - ManagedObjectReference[] vms = getDataCenterVMMors(mor); - if(stores != null) { - for(ManagedObjectReference morVm : vms) { - Object[] props = this.getProperties(morVm, new String[] {"name"}); - System.out.println("VM name: " + props[0] + ", ref val: " + morVm.get_value()); - } - } - } - } - } catch(RuntimeFault e) { - e.printStackTrace(); - } catch(RemoteException e) { - e.printStackTrace(); - } - } - - private void listInventoryFolders() { - TraversalSpec folderTraversalSpec = new TraversalSpec(); - folderTraversalSpec.setName("folderTraversalSpec"); - folderTraversalSpec.setType("Folder"); - folderTraversalSpec.setPath("childEntity"); - folderTraversalSpec.setSkip(new Boolean(false)); - folderTraversalSpec.setSelectSet( - new SelectionSpec [] { new SelectionSpec(null, null, "folderTraversalSpec")} - ); - - PropertySpec[] propSpecs = new PropertySpec[] { new PropertySpec() }; - propSpecs[0].setAll(new Boolean(false)); - propSpecs[0].setPathSet(new String[] { "name" }); - propSpecs[0].setType("ManagedEntity"); - - PropertyFilterSpec filterSpec = new PropertyFilterSpec(); - filterSpec.setPropSet(propSpecs); - filterSpec.setObjectSet(new ObjectSpec[] { new ObjectSpec() }); - filterSpec.getObjectSet(0).setObj(cb.getServiceConnection3().getRootFolder()); - filterSpec.getObjectSet(0).setSkip(new Boolean(false)); - filterSpec.getObjectSet(0).setSelectSet( - new SelectionSpec[] { folderTraversalSpec } - ); - - try { - ObjectContent[] objContent = cb.getServiceConnection3().getService().retrieveProperties( - cb.getServiceConnection3().getServiceContent().getPropertyCollector(), - new PropertyFilterSpec[] { filterSpec } - ); - printContent(objContent); - } catch (InvalidProperty e) { - e.printStackTrace(); - } catch (RuntimeFault e) { - e.printStackTrace(); - } catch (RemoteException e) { - e.printStackTrace(); - } - } - - private TraversalSpec getFolderRecursiveTraversalSpec() { - SelectionSpec recurseFolders = new SelectionSpec(); - recurseFolders.setName("folder2childEntity"); - - TraversalSpec folder2childEntity = new TraversalSpec(); - folder2childEntity.setType("Folder"); - folder2childEntity.setPath("childEntity"); - folder2childEntity.setName(recurseFolders.getName()); - folder2childEntity.setSelectSet(new SelectionSpec[] { recurseFolders }); - - return folder2childEntity; - } - - private ManagedObjectReference[] getDataCenterMors() throws RuntimeFault, RemoteException { - PropertySpec pSpec = new PropertySpec(); - pSpec.setType("Datacenter"); - pSpec.setPathSet(new String[] { "name"} ); - - ObjectSpec oSpec = new ObjectSpec(); - oSpec.setObj(cb.getServiceConnection3().getRootFolder()); - oSpec.setSkip(Boolean.TRUE); - oSpec.setSelectSet(new SelectionSpec[] { getFolderRecursiveTraversalSpec() }); - - PropertyFilterSpec pfSpec = new PropertyFilterSpec(); - pfSpec.setPropSet(new PropertySpec[] { pSpec }); - pfSpec.setObjectSet(new ObjectSpec[] { oSpec }); - - ObjectContent[] ocs = cb.getServiceConnection3().getService().retrieveProperties( - cb.getServiceConnection3().getServiceContent().getPropertyCollector(), - new PropertyFilterSpec[] { pfSpec }); - - if(ocs != null) { - ManagedObjectReference[] morDatacenters = new ManagedObjectReference[ocs.length]; - for(int i = 0; i < ocs.length; i++) - morDatacenters[i] = ocs[i].getObj(); - - return morDatacenters; - } - return null; - } - - private ManagedObjectReference[] getDataCenterVMMors(ManagedObjectReference morDatacenter) throws RuntimeFault, RemoteException { - PropertySpec pSpec = new PropertySpec(); - pSpec.setType("VirtualMachine"); - pSpec.setPathSet(new String[] { "name"} ); - - ObjectSpec oSpec = new ObjectSpec(); - oSpec.setObj(morDatacenter); - oSpec.setSkip(Boolean.TRUE); - - TraversalSpec tSpec = new TraversalSpec(); - tSpec.setName("dc2VMFolder"); - tSpec.setType("Datacenter"); - tSpec.setPath("vmFolder"); - tSpec.setSelectSet(new SelectionSpec[] { getFolderRecursiveTraversalSpec() } ); - - oSpec.setSelectSet(new SelectionSpec[] { tSpec }); - - PropertyFilterSpec pfSpec = new PropertyFilterSpec(); - pfSpec.setPropSet(new PropertySpec[] { pSpec }); - pfSpec.setObjectSet(new ObjectSpec[] { oSpec }); - - ObjectContent[] ocs = cb.getServiceConnection3().getService().retrieveProperties( - cb.getServiceConnection3().getServiceContent().getPropertyCollector(), - new PropertyFilterSpec[] { pfSpec }); - - if(ocs != null) { - ManagedObjectReference[] morVMs = new ManagedObjectReference[ocs.length]; - for(int i = 0; i < ocs.length; i++) - morVMs[i] = ocs[i].getObj(); - - return morVMs; - } - return null; - } - - private ManagedObjectReference[] getDataCenterDatastoreMors(ManagedObjectReference morDatacenter) throws RuntimeFault, RemoteException { - Object[] stores = getProperties(morDatacenter, new String[] { "datastore" }); - if(stores != null && stores.length == 1) { - return ((ArrayOfManagedObjectReference)stores[0]).getManagedObjectReference(); - } - return null; - } - - private ManagedObjectReference[] getDataCenterClusterMors(ManagedObjectReference morDatacenter) throws RuntimeFault, RemoteException { - PropertySpec pSpec = new PropertySpec(); - pSpec.setType("ClusterComputeResource"); - pSpec.setPathSet(new String[] { "name"} ); - - ObjectSpec oSpec = new ObjectSpec(); - oSpec.setObj(morDatacenter); - oSpec.setSkip(Boolean.TRUE); - - TraversalSpec tSpec = new TraversalSpec(); - tSpec.setName("traversalHostFolder"); - tSpec.setType("Datacenter"); - tSpec.setPath("hostFolder"); - tSpec.setSkip(false); - tSpec.setSelectSet(new SelectionSpec[] { getFolderRecursiveTraversalSpec() }); - - oSpec.setSelectSet(new TraversalSpec[] { tSpec }); - - PropertyFilterSpec pfSpec = new PropertyFilterSpec(); - pfSpec.setPropSet(new PropertySpec[] { pSpec }); - pfSpec.setObjectSet(new ObjectSpec[] { oSpec }); - - ObjectContent[] ocs = cb.getServiceConnection3().getService().retrieveProperties( - cb.getServiceConnection3().getServiceContent().getPropertyCollector(), - new PropertyFilterSpec[] { pfSpec }); - - if(ocs != null) { - ManagedObjectReference[] morDatacenters = new ManagedObjectReference[ocs.length]; - for(int i = 0; i < ocs.length; i++) - morDatacenters[i] = ocs[i].getObj(); - - return morDatacenters; - } - return null; - } - - private ManagedObjectReference[] getDataCenterStandaloneHostMors(ManagedObjectReference morDatacenter) throws RuntimeFault, RemoteException { - PropertySpec pSpec = new PropertySpec(); - pSpec.setType("ComputeResource"); - pSpec.setPathSet(new String[] { "name"} ); - - ObjectSpec oSpec = new ObjectSpec(); - oSpec.setObj(morDatacenter); - oSpec.setSkip(Boolean.TRUE); - - TraversalSpec tSpec = new TraversalSpec(); - tSpec.setName("traversalHostFolder"); - tSpec.setType("Datacenter"); - tSpec.setPath("hostFolder"); - tSpec.setSkip(false); - tSpec.setSelectSet(new SelectionSpec[] { getFolderRecursiveTraversalSpec() }); - - oSpec.setSelectSet(new TraversalSpec[] { tSpec }); - - PropertyFilterSpec pfSpec = new PropertyFilterSpec(); - pfSpec.setPropSet(new PropertySpec[] { pSpec }); - pfSpec.setObjectSet(new ObjectSpec[] { oSpec }); - - ObjectContent[] ocs = cb.getServiceConnection3().getService().retrieveProperties( - cb.getServiceConnection3().getServiceContent().getPropertyCollector(), - new PropertyFilterSpec[] { pfSpec }); - - if(ocs != null) { - List listComputeResources = new ArrayList(); - for(ObjectContent oc : ocs) { - if(oc.getObj().getType().equalsIgnoreCase("ComputeResource")) - listComputeResources.add(oc.getObj()); - } - - List listHosts = new ArrayList(); - for(ManagedObjectReference morComputeResource : listComputeResources) { - ManagedObjectReference[] hosts = getComputeResourceHostMors(morComputeResource); - if(hosts != null) { - for(ManagedObjectReference host: hosts) - listHosts.add(host); - } - } - - return listHosts.toArray(new ManagedObjectReference[0]); - } - return null; - } - - private ManagedObjectReference[] getComputeResourceHostMors(ManagedObjectReference morCompute) throws RuntimeFault, RemoteException { - PropertySpec pSpec = new PropertySpec(); - pSpec.setType("HostSystem"); - pSpec.setPathSet(new String[] { "name"} ); - - ObjectSpec oSpec = new ObjectSpec(); - oSpec.setObj(morCompute); - oSpec.setSkip(true); - - TraversalSpec tSpec = new TraversalSpec(); - tSpec.setName("computeResource2Host"); - tSpec.setType("ComputeResource"); - tSpec.setPath("host"); - tSpec.setSkip(false); - oSpec.setSelectSet(new TraversalSpec[] { tSpec }); - - PropertyFilterSpec pfSpec = new PropertyFilterSpec(); - pfSpec.setPropSet(new PropertySpec[] { pSpec }); - pfSpec.setObjectSet(new ObjectSpec[] { oSpec }); - - ObjectContent[] ocs = cb.getServiceConnection3().getService().retrieveProperties( - cb.getServiceConnection3().getServiceContent().getPropertyCollector(), - new PropertyFilterSpec[] { pfSpec }); - - if(ocs != null) { - ManagedObjectReference[] morDatacenters = new ManagedObjectReference[ocs.length]; - for(int i = 0; i < ocs.length; i++) - morDatacenters[i] = ocs[i].getObj(); - - return morDatacenters; - } - return null; - } - - private ManagedObjectReference[] getClusterHostMors(ManagedObjectReference morCluster) throws RuntimeFault, RemoteException { - // ClusterComputeResource inherits from ComputeResource - return getComputeResourceHostMors(morCluster); - } - - private ObjectContent[] getDataCenterProperites(String[] properites) throws RuntimeFault, RemoteException { - PropertySpec pSpec = new PropertySpec(); - pSpec.setType("Datacenter"); - pSpec.setPathSet(properites ); - - SelectionSpec recurseFolders = new SelectionSpec(); - recurseFolders.setName("folder2childEntity"); - - TraversalSpec folder2childEntity = new TraversalSpec(); - folder2childEntity.setType("Folder"); - folder2childEntity.setPath("childEntity"); - folder2childEntity.setName(recurseFolders.getName()); - folder2childEntity.setSelectSet(new SelectionSpec[] { recurseFolders }); - - ObjectSpec oSpec = new ObjectSpec(); - oSpec.setObj(cb.getServiceConnection3().getRootFolder()); - oSpec.setSkip(Boolean.TRUE); - oSpec.setSelectSet(new SelectionSpec[] { folder2childEntity }); - - PropertyFilterSpec pfSpec = new PropertyFilterSpec(); - pfSpec.setPropSet(new PropertySpec[] { pSpec }); - pfSpec.setObjectSet(new ObjectSpec[] { oSpec }); - - return cb.getServiceConnection3().getService().retrieveProperties( - cb.getServiceConnection3().getServiceContent().getPropertyCollector(), - new PropertyFilterSpec[] { pfSpec }); - } - - private void printContent(ObjectContent[] objContent) { - if(objContent != null) { - for(ObjectContent oc : objContent) { - ManagedObjectReference mor = oc.getObj(); - DynamicProperty[] objProps = oc.getPropSet(); - - System.out.println("Object type: " + mor.getType()); - if(objProps != null) { - for(DynamicProperty objProp : objProps) { - if(!objProp.getClass().isArray()) { - System.out.println("\t" + objProp.getName() + "=" + objProp.getVal()); - } else { - Object[] ipcary = (Object[])objProp.getVal(); - System.out.print("\t" + objProp.getName() + "=["); - int i = 0; - for(Object item : ipcary) { - if (item.getClass().getName().indexOf("ManagedObjectReference") >= 0) { - ManagedObjectReference imor = (ManagedObjectReference)item; - System.out.print("(" + imor.getType() + "," + imor.get_value() + ")"); - } else { - System.out.print(item); - } - - if(i < ipcary.length - 1) - System.out.print(", "); - i++; - } - - System.out.println("]"); - } - } - } - } - } - } - - private void getProperites(ManagedObjectReference mor, Map properties) throws RuntimeFault, RemoteException { - PropertySpec pSpec = new PropertySpec(); - pSpec.setType(mor.getType()); - pSpec.setPathSet(properties.keySet().toArray(new String[0])); - - ObjectSpec oSpec = new ObjectSpec(); - oSpec.setObj(mor); - - PropertyFilterSpec pfSpec = new PropertyFilterSpec(); - pfSpec.setPropSet(new PropertySpec[] {pSpec} ); - pfSpec.setObjectSet(new ObjectSpec[] {oSpec} ); - - ObjectContent[] ocs = cb.getServiceConnection3().getService().retrieveProperties( - cb.getServiceConnection3().getServiceContent().getPropertyCollector(), - new PropertyFilterSpec[] {pfSpec} ); - - if(ocs != null) { - for(ObjectContent oc : ocs) { - DynamicProperty[] propSet = oc.getPropSet(); - if(propSet != null) { - for(DynamicProperty prop : propSet) { - properties.put(prop.getName(), prop.getVal()); - } - } - } - } - } - - private Object[] getProperties(ManagedObjectReference moRef, String[] properties) throws RuntimeFault, RemoteException { - PropertySpec pSpec = new PropertySpec(); - pSpec.setType(moRef.getType()); - pSpec.setPathSet(properties); - - ObjectSpec oSpec = new ObjectSpec(); - // Set the starting object - oSpec.setObj(moRef); - - PropertyFilterSpec pfSpec = new PropertyFilterSpec(); - pfSpec.setPropSet(new PropertySpec[] {pSpec} ); - pfSpec.setObjectSet(new ObjectSpec[] {oSpec} ); - ObjectContent[] ocs = cb.getServiceConnection3().getService().retrieveProperties( - cb.getServiceConnection3().getServiceContent().getPropertyCollector(), - new PropertyFilterSpec[] {pfSpec} ); - - Object[] ret = new Object[properties.length]; - if(ocs != null) { - for(int i = 0; i< ocs.length; ++i) { - ObjectContent oc = ocs[i]; - DynamicProperty[] dps = oc.getPropSet(); - if(dps != null) { - for(int j = 0; j < dps.length; ++j) { - DynamicProperty dp = dps[j]; - for(int p = 0; p < ret.length; ++p) { - if(properties[p].equals(dp.getName())) { - ret[p] = dp.getVal(); - } - } - } - } - } - } - return ret; - } - - private void powerOnVm() throws Exception { - ManagedObjectReference morVm = new ManagedObjectReference(); - morVm.setType("VirtualMachine"); - morVm.set_value("vm-480"); - - cb.getServiceConnection3().getService().powerOnVM_Task(morVm, null); - } - - private void powerOffVm() throws Exception { - ManagedObjectReference morVm = new ManagedObjectReference(); - morVm.setType("VirtualMachine"); - morVm.set_value("vm-66"); - - cb.getServiceConnection3().getService().powerOffVM_Task(morVm); - } - - private void createSnapshot() throws Exception { - ManagedObjectReference morVm = new ManagedObjectReference(); - morVm.setType("VirtualMachine"); - morVm.set_value("vm-66"); - cb.getServiceConnection3().getService().createSnapshot_Task(morVm, "RunningSnapshotProg", "", false, false); - } - - private void registerTemplate() throws Exception { - ManagedObjectReference morFolder = new ManagedObjectReference(); - morFolder.setType("Folder"); - morFolder.set_value("group-v3"); - - ManagedObjectReference morHost = new ManagedObjectReference(); - morHost.setType("HostSystem"); - morHost.set_value("host-48"); - - System.out.println("Begin registerVM_Task"); - ManagedObjectReference taskmor = cb.getServiceConnection3().getService().registerVM_Task( - morFolder, "[NFS datastore] Template-Fedora/Template-Fedora.vmtx", "Template-Fedora", true, - null, morHost); - System.out.println("End registerVM_Task"); - - String result = cb.getServiceUtil3().waitForTask(taskmor); - if (result.equalsIgnoreCase("Sucess")) { - System.out.println("Registering The Virtual Machine ..........Done"); - } else { - System.out.println("Some Exception While Registering The VM"); - } - } - - private void createVmFromTemplate() throws Exception { - VirtualMachineCloneSpec cloneSpec = new VirtualMachineCloneSpec(); - - ManagedObjectReference morDatastore = new ManagedObjectReference(); - morDatastore.setType("Datastore"); - morDatastore.set_value("datastore-30"); - - ManagedObjectReference morHost = new ManagedObjectReference(); - morHost.setType("HostSystem"); - morHost.set_value("host-48"); - - ManagedObjectReference morPool = new ManagedObjectReference(); - morPool.setType("ResourcePool"); - morPool.set_value("resgroup-41"); - - VirtualMachineRelocateSpec relocSpec = new VirtualMachineRelocateSpec(); - cloneSpec.setLocation(relocSpec); - cloneSpec.setPowerOn(false); - cloneSpec.setTemplate(false); - - relocSpec.setDatastore(morDatastore); - relocSpec.setHost(morHost); - relocSpec.setPool(morPool); - - ManagedObjectReference morTemplate = new ManagedObjectReference(); - morTemplate.setType("VirtualMachine"); - morTemplate.set_value("vm-76"); - - ManagedObjectReference morFolder = new ManagedObjectReference(); - morFolder.setType("Folder"); - morFolder.set_value("group-v3"); - - ManagedObjectReference cloneTask - = cb.getServiceConnection3().getService().cloneVM_Task(morTemplate, morFolder, - "Fedora-clone-test", cloneSpec); - - String status = cb.getServiceUtil3().waitForTask(cloneTask); - if(status.equalsIgnoreCase("failure")) { - System.out.println("Failure -: Virtual Machine cannot be cloned"); - } - - if(status.equalsIgnoreCase("sucess")) { - System.out.println("Virtual Machine Cloned successfully."); - } - } - - private void addNic() throws Exception { - ManagedObjectReference morVm = new ManagedObjectReference(); - morVm.setType("VirtualMachine"); - morVm.set_value("vm-77"); - - ManagedObjectReference morNetwork = new ManagedObjectReference(); - morNetwork.setType("DistributedVirtualPortgroup"); - morNetwork.set_value("dvportgroup-56"); - - VirtualDeviceConfigSpec nicSpec = new VirtualDeviceConfigSpec(); - nicSpec.setOperation(VirtualDeviceConfigSpecOperation.add); - VirtualEthernetCard nic = new VirtualPCNet32(); - VirtualEthernetCardNetworkBackingInfo nicBacking - = new VirtualEthernetCardNetworkBackingInfo(); - nicBacking.setDeviceName("Adapter to dSwitch-vlan26"); - nicBacking.setNetwork(morNetwork); - - nic.setAddressType("generated"); - nic.setBacking(nicBacking); - nic.setKey(4); - nicSpec.setDevice(nic); - - VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec(); - VirtualDeviceConfigSpec [] nicSpecArray = {nicSpec}; - vmConfigSpec.setDeviceChange(nicSpecArray); - - ManagedObjectReference tmor - = cb.getServiceConnection3().getService().reconfigVM_Task( - morVm, vmConfigSpec); - - String status = cb.getServiceUtil3().waitForTask(tmor); - if(status.equalsIgnoreCase("failure")) { - System.out.println("Failure -: Virtual Machine cannot be cloned"); - } - - if(status.equalsIgnoreCase("sucess")) { - System.out.println("Virtual Machine Cloned successfully."); - } - } - - // add virtual NIC to vmkernel - private void addNicToNetwork() throws Exception { - ManagedObjectReference morHost = new ManagedObjectReference(); - morHost.setType("HostSystem"); - morHost.set_value("host-48"); - - HostPortGroupSpec portgrp = new HostPortGroupSpec(); - portgrp.setName("VM Network vlan26"); - - Object cmobj = cb.getServiceUtil3().getDynamicProperty(morHost, "configManager"); - HostConfigManager configMgr = (HostConfigManager)cmobj; - ManagedObjectReference nwSystem = configMgr.getNetworkSystem(); - - HostVirtualNicSpec vNicSpec = new HostVirtualNicSpec(); - HostIpConfig ipConfig = new HostIpConfig(); - ipConfig.setDhcp(false); - ipConfig.setIpAddress("192.168.26.177"); - ipConfig.setSubnetMask("255.255.255.0"); - - vNicSpec.setIp(ipConfig); - vNicSpec.setPortgroup("VM Network vlan26"); - - cb.getServiceConnection3().getService().addVirtualNic(nwSystem, - "dvPortGroup-vlan26", vNicSpec); - } - - private void createDatacenter() throws Exception { - cb.getServiceConnection3().getService().createDatacenter( - cb.getServiceConnection3().getRootFolder(), - "cloud.dc.test"); - } - - private void getPropertyWithPath() throws Exception { - ManagedObjectReference morHost = new ManagedObjectReference(); - morHost.setType("HostSystem"); - morHost.set_value("host-161"); - - VirtualNicManagerNetConfig[] netConfigs = (VirtualNicManagerNetConfig[])cb.getServiceUtil3().getDynamicProperty(morHost, "config.virtualNicManagerInfo.netConfig"); - } - - private void getHostVMs() throws Exception { - ManagedObjectReference morHost = new ManagedObjectReference(); - morHost.setType("HostSystem"); - morHost.set_value("host-48"); - - PropertySpec pSpec = new PropertySpec(); - pSpec.setType("VirtualMachine"); - pSpec.setPathSet(new String[] { "name", "runtime.powerState", "config.template" }); - - TraversalSpec host2VmTraversal = new TraversalSpec(); - host2VmTraversal.setType("HostSystem"); - host2VmTraversal.setPath("vm"); - host2VmTraversal.setName("host2VmTraversal"); - - ObjectSpec oSpec = new ObjectSpec(); - oSpec.setObj(morHost); - oSpec.setSkip(Boolean.TRUE); - oSpec.setSelectSet(new SelectionSpec[] { host2VmTraversal }); - - PropertyFilterSpec pfSpec = new PropertyFilterSpec(); - pfSpec.setPropSet(new PropertySpec[] { pSpec }); - pfSpec.setObjectSet(new ObjectSpec[] { oSpec }); - - ObjectContent[] ocs = cb.getServiceConnection3().getService().retrieveProperties( - cb.getServiceConnection3().getServiceContent().getPropertyCollector(), - new PropertyFilterSpec[] { pfSpec }); - this.printContent(ocs); - } - - private void testFT() throws Exception { - - ManagedObjectReference morVm = new ManagedObjectReference(); - morVm.setType("VirtualMachine"); - morVm.set_value("vm-480"); - - ManagedObjectReference morHost = new ManagedObjectReference(); - morHost.setType("HostSystem"); - morHost.set_value("host-470"); - - System.out.println("Create secondary VM"); - ManagedObjectReference morTask = cb.getServiceConnection3().getService().createSecondaryVM_Task(morVm, morHost); - String result = cb.getServiceUtil3().waitForTask(morTask); - - System.out.println("Create secondary VM resutl : " + result); - } - - private void testFTEnable() throws Exception { - ManagedObjectReference morVm = new ManagedObjectReference(); - morVm.setType("VirtualMachine"); - morVm.set_value("vm-480"); - - ManagedObjectReference morHost = new ManagedObjectReference(); - morHost.setType("HostSystem"); - morHost.set_value("host-470"); - - ManagedObjectReference morSecondaryVm = new ManagedObjectReference(); - morSecondaryVm.setType("VirtualMachine"); - morSecondaryVm.set_value("vm-485"); - - System.out.println("Enable FT"); - ManagedObjectReference morTask = cb.getServiceConnection3().getService().enableSecondaryVM_Task(morVm, - morSecondaryVm, morHost); - String result = cb.getServiceUtil3().waitForTask(morTask); - - System.out.println("Enable FT resutl : " + result); - } - private DatacenterMO setupDatacenterObject(String serverAddress, String dcMor) { - VmwareContext context = new VmwareContext(cb, serverAddress); - - ManagedObjectReference morDc = new ManagedObjectReference(); - morDc.setType("Datacenter"); - morDc.set_value(dcMor); - - return new DatacenterMO(context, morDc); - } - - private DistributedVirtualSwitchMO setupDistributedVirtualSwitchObject(String dvsMor, String serverAddress) { - VmwareContext context = new VmwareContext(cb, serverAddress); - return new DistributedVirtualSwitchMO(context, setupDVS(dvsMor)); - } - - private ManagedObjectReference setupDVS(String dvsMor) { - ManagedObjectReference morDvs = new ManagedObjectReference(); - morDvs.setType("VmwareDistributedVirtualSwitch"); - morDvs.set_value(dvsMor); - return morDvs; - } - - private void testDvSwitchOperations() throws Exception { - String dvSwitchName, dcMor; - ManagedObjectReference queriedDvs; - ManagedObjectReference morDvs; - DatacenterMO dcMo; - URL serviceUrl; - - // Initialize mor for existing DVS - if (_args.length <= IND_DVSWITCH_NAME) { - System.out.println("Using default parameters as required command line arguments are not provided."); - System.out.println("Sequence of arguments: "); - morDvs = setupDVS("dvs-921"); - dvSwitchName = "dvSwitch0"; - dcMor = "datacenter-2"; - } else { - morDvs = setupDVS(_args[IND_DVSWITCH_MOR]); - dvSwitchName = _args[IND_DVSWITCH_NAME]; - dcMor = _args[IND_DATACENTER_MOR]; - } - - serviceUrl = new URL(cb.getServiceUrl()); - - // Initialize Datacenter Object that pertains to above DVS - dcMo = setupDatacenterObject(serviceUrl.getHost(), dcMor); - - // Query for DVS with name - queriedDvs = dcMo.getDvSwitchMor(dvSwitchName); - - System.out.print("\nTest fetch dvSwitch object from vCenter : "); - if (morDvs.equals(queriedDvs)) { - System.out.println("Success\n"); - } else { - System.out.println("Failed\n"); - } - } - - private void testDvPortGroupOpearations() throws Exception { - // addDvPortGroup, updateDvPortGroup, getDvPortGroup, hasDvPortGroup - ManagedObjectReference morDvs, morDvPortGroup; - DatacenterMO dcMo; - DistributedVirtualSwitchMO dvsMo; - int networkRateMbps; - int networkRateMbpsToUpdate; - DVSTrafficShapingPolicy shapingPolicy; - VmwareDistributedVirtualSwitchVlanSpec vlanSpec; - DVSSecurityPolicy secPolicy; - VMwareDVSPortSetting dvsPortSetting; - DVPortgroupConfigSpec dvPortGroupSpec; - DVPortgroupConfigInfo dvPortgroupInfo = null; - String dvPortGroupName, dcMor; - Integer vid; - int numPorts; - int timeOutMs; - URL serviceUrl; - - if (_args.length < MAX_ARGS) { - System.out.println("Using default parameters as required command line arguments are not provided."); - System.out.println("Sequence of arguments: "); - morDvs = setupDVS("dvs-921"); - dvPortGroupName = "cloud.public.201.dvSwitch0.1"; - networkRateMbps = 201; - vid = new Integer(399); // VLAN 399 - timeOutMs = 7000; - numPorts = 64; - dcMor = "datacenter-2"; - } else { - morDvs = setupDVS(_args[IND_DVSWITCH_MOR]); - dvPortGroupName = _args[IND_DVPORTGROUP_NAME]; - vid = new Integer(IND_DVPORTGROUP_VLAN); - dcMor = _args[IND_DATACENTER_MOR]; - numPorts = Integer.parseInt(_args[IND_DVPORTGROUP_PORTCOUNT]); - timeOutMs = 7000; - networkRateMbps = 201; - } - serviceUrl = new URL(cb.getServiceUrl()); - - // Initialize Datacenter Object that pertains to above DVS - dcMo = setupDatacenterObject(serviceUrl.getHost(), dcMor); - // Create dvPortGroup configuration spec - dvsMo = setupDistributedVirtualSwitchObject(morDvs.get_value(), serviceUrl.getHost()); - - shapingPolicy = HypervisorHostHelper.getDVSShapingPolicy(networkRateMbps); - secPolicy = HypervisorHostHelper.createDVSSecurityPolicy(); - if (vid != null) { - vlanSpec = HypervisorHostHelper.createDVPortVlanIdSpec(vid); - } else { - vlanSpec = HypervisorHostHelper.createDVPortVlanSpec(); - } - dvsPortSetting = HypervisorHostHelper.createVmwareDVPortSettingSpec(shapingPolicy, secPolicy, vlanSpec); - dvPortGroupSpec = HypervisorHostHelper.createDvPortGroupSpec(dvPortGroupName, dvsPortSetting, numPorts); - if (!dcMo.hasDvPortGroup(dvPortGroupName)) { - System.out.print("\nTest create dvPortGroup : "); - try { - // Call method to create dvPortGroup - dvsMo.createDVPortGroup(dvPortGroupSpec); - System.out.println("Success\n"); - HypervisorHostHelper.waitForDvPortGroupReady(dcMo, dvPortGroupName, timeOutMs); - } catch (Exception e) { - System.out.println("Failed\n"); - throw new Exception(e); - } - } - - // Test for presence of dvPortGroup - System.out.print("\nTest presence of dvPortGroup : "); - if (dcMo.hasDvPortGroup(dvPortGroupName)) { - System.out.println("Success\n"); - } else { - System.out.println("Failed\n"); - } - - // Test get existing dvPortGroup - System.out.print("\nTest fetch dvPortGroup configuration : "); - try { - dvPortgroupInfo = dcMo.getDvPortGroupSpec(dvPortGroupName); - if (dvPortgroupInfo != null) - System.out.println("Success\n"); - } catch (Exception e) { - System.out.println("Failed\n"); - } - // Test compare dvPortGroup configuration - System.out.print("\nTest compare dvPortGroup configuration : "); - - if (HypervisorHostHelper.isSpecMatch(dvPortgroupInfo, vid, shapingPolicy)) { - System.out.println("Success\n"); - // We haven't modified the dvPortGroup after creating above. - // Hence expecting to be matching. - // NOTE : Hopefully nothing changes the configuration externally. - } else { - System.out.println("Failed\n"); - } - - // Test update dvPortGroup configuration - networkRateMbpsToUpdate = 210; - shapingPolicy = HypervisorHostHelper.getDVSShapingPolicy(networkRateMbpsToUpdate); - dvsPortSetting = HypervisorHostHelper.createVmwareDVPortSettingSpec(shapingPolicy, secPolicy, vlanSpec); - dvPortGroupSpec.setDefaultPortConfig(dvsPortSetting); - dvPortGroupSpec.setConfigVersion(dvPortgroupInfo.getConfigVersion()); - morDvPortGroup = dcMo.getDvPortGroupMor(dvPortGroupName); - System.out.print("\nTest update dvPortGroup configuration : "); - if (!HypervisorHostHelper.isSpecMatch(dvPortgroupInfo, vid, shapingPolicy)) { - try { - dvsMo.updateDvPortGroup(morDvPortGroup, dvPortGroupSpec); - System.out.println("Success\n"); - } catch (Exception e) { - System.out.println("Failed\n"); - throw new Exception(e); - } - } - } - private void importOVF() throws Exception { - ManagedObjectReference morHost = new ManagedObjectReference(); - morHost.setType("HostSystem"); - morHost.set_value("host-223"); - - ManagedObjectReference morRp = new ManagedObjectReference(); - morRp.setType("ResourcePool"); - morRp.set_value("resgroup-222"); - - ManagedObjectReference morDs = new ManagedObjectReference(); - morDs.setType("Datastore"); - morDs.set_value("datastore-30"); - - ManagedObjectReference morVmFolder = new ManagedObjectReference(); - morVmFolder.setType("Folder"); - morVmFolder.set_value("group-v3"); - - ManagedObjectReference morNetwork = new ManagedObjectReference(); - morNetwork.setType("Network"); - morNetwork.set_value("network-32"); - - ManagedObjectReference morOvf = cb.getServiceConnection3().getServiceContent().getOvfManager(); - - OvfCreateImportSpecParams importSpecParams = new OvfCreateImportSpecParams(); - importSpecParams.setHostSystem(morHost); - importSpecParams.setLocale("US"); - importSpecParams.setEntityName("winxpsp3-ovf-deployed"); - importSpecParams.setDeploymentOption(""); - importSpecParams.setDiskProvisioning("thin"); - -/* - OvfNetworkMapping networkMapping = new OvfNetworkMapping(); - networkMapping.setName("VM Network"); - networkMapping.setNetwork(morNetwork); // network); - importSpecParams.setNetworkMapping(new OvfNetworkMapping[] { networkMapping }); -*/ - importSpecParams.setPropertyMapping(null); - - String ovfDescriptor = readOvfContent("C:\\research\\vmware\\winxpsp3-ovf\\winxpsp3-ovf.ovf"); - OvfCreateImportSpecResult ovfImportResult = cb.getServiceConnection3().getService().createImportSpec( - morOvf, ovfDescriptor, morRp, morDs, importSpecParams); - - if(ovfImportResult != null) { - long totalBytes = addTotalBytes(ovfImportResult); - - ManagedObjectReference morLease = cb.getServiceConnection3().getService().importVApp(morRp, - ovfImportResult.getImportSpec(), morVmFolder, morHost); - - HttpNfcLeaseState state; - for(;;) { - state = (HttpNfcLeaseState)cb.getServiceUtil3().getDynamicProperty(morLease, "state"); - if(state == HttpNfcLeaseState.ready || state == HttpNfcLeaseState.error) - break; - } - - if(state == HttpNfcLeaseState.ready) { - HttpNfcLeaseInfo httpNfcLeaseInfo = (HttpNfcLeaseInfo)cb.getServiceUtil3().getDynamicProperty(morLease, "info"); - HttpNfcLeaseDeviceUrl[] deviceUrls = httpNfcLeaseInfo.getDeviceUrl(); - long bytesAlreadyWritten = 0; - for (HttpNfcLeaseDeviceUrl deviceUrl : deviceUrls) { - - String deviceKey = deviceUrl.getImportKey(); - for (OvfFileItem ovfFileItem : ovfImportResult.getFileItem()) { - if (deviceKey.equals(ovfFileItem.getDeviceId())) { - System.out.println("Import key==OvfFileItem device id: " + deviceKey); - System.out.println("device URL: " + deviceUrl.getUrl()); - - String absoluteFile = "C:\\research\\vmware\\winxpsp3-ovf\\" + ovfFileItem.getPath(); - String urlToPost = deviceUrl.getUrl().replace("*", "esxhost-1.lab.vmops.com"); - - uploadVmdkFile(ovfFileItem.isCreate(), absoluteFile, urlToPost, bytesAlreadyWritten, totalBytes); - bytesAlreadyWritten += ovfFileItem.getSize(); - System.out.println("Completed uploading the VMDK file:" + absoluteFile); - } - } - } - cb.getServiceConnection3().getService().httpNfcLeaseProgress(morLease, 100); - cb.getServiceConnection3().getService().httpNfcLeaseComplete(morLease); - } - } - } - - private static void uploadVmdkFile(boolean put, String diskFilePath, String urlStr, long bytesAlreadyWritten, long totalBytes) throws IOException { - HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { - public boolean verify(String urlHostName, SSLSession session) { - return true; - } - }); - - HttpsURLConnection conn = (HttpsURLConnection) new URL(urlStr).openConnection(); - - conn.setDoOutput(true); - conn.setUseCaches(false); - - int CHUCK_LEN = 64*1024; - conn.setChunkedStreamingMode(CHUCK_LEN); - conn.setRequestMethod(put? "PUT" : "POST"); // Use a post method to write the file. - conn.setRequestProperty("Connection", "Keep-Alive"); - conn.setRequestProperty("Content-Type", "application/x-vnd.vmware-streamVmdk"); - conn.setRequestProperty("Content-Length", Long.toString(new File(diskFilePath).length())); - BufferedOutputStream bos = new BufferedOutputStream(conn.getOutputStream()); - BufferedInputStream diskis = new BufferedInputStream(new FileInputStream(diskFilePath)); - int bytesAvailable = diskis.available(); - int bufferSize = Math.min(bytesAvailable, CHUCK_LEN); - byte[] buffer = new byte[bufferSize]; - long totalBytesWritten = 0; - while (true) { - int bytesRead = diskis.read(buffer, 0, bufferSize); - if (bytesRead == -1) - { - System.out.println("Total bytes written: " + totalBytesWritten); - break; - } - totalBytesWritten += bytesRead; - bos.write(buffer, 0, bufferSize); - bos.flush(); - System.out.println("Total bytes written: " + totalBytesWritten); - -/* - int progressPercent = (int) (((bytesAlreadyWritten + totalBytesWritten) * 100) / totalBytes); - leaseUpdater.setPercent(progressPercent); -*/ - } - diskis.close(); - bos.flush(); - bos.close(); - conn.disconnect(); - } - - public static long addTotalBytes(OvfCreateImportSpecResult ovfImportResult) { - OvfFileItem[] fileItemArr = ovfImportResult.getFileItem(); - long totalBytes = 0; - if (fileItemArr != null) { - for (OvfFileItem fi : fileItemArr) { - printOvfFileItem(fi); - totalBytes += fi.getSize(); - } - } - return totalBytes; - } - - private static void printOvfFileItem(OvfFileItem fi) { - System.out.println("================ OvfFileItem ================"); - System.out.println("chunkSize: " + fi.getChunkSize()); - System.out.println("create: " + fi.isCreate()); - System.out.println("deviceId: " + fi.getDeviceId()); - System.out.println("path: " + fi.getPath()); - System.out.println("size: " + fi.getSize()); - System.out.println("=============================================="); - } - - public static String readOvfContent(String ovfFilePath) throws IOException { - StringBuffer strContent = new StringBuffer(); - BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(ovfFilePath))); - String lineStr; - while ((lineStr = in.readLine()) != null) { - strContent.append(lineStr); - } - - in.close(); - return strContent.toString(); - } - - public static String escapeSpecialChars(String str) { - str = str.replaceAll("<", "<"); - return str.replaceAll(">", ">"); // do not escape "&" -> "&", "\"" -> """ - } - - public static void main(String[] args) throws Exception { - setupLog4j(); - TestVMWare client = new TestVMWare(); - - // skip certificate check - System.setProperty("axis.socketSecureFactory", "org.apache.axis.components.net.SunFakeTrustSocketFactory"); - - String serviceUrl = "https://" + args[0] + "/sdk/vimService"; - - try { - String[] params = new String[] {"--url", serviceUrl, "--username", args[1], "--password", args[2] }; - - cb = ExtendedAppUtil.initialize("Connect", params); - cb.connect(); - System.out.println("Connection Succesful."); - _args = args; - - // client.listInventoryFolders(); - // client.listDataCenters(); - // client.powerOnVm(); - // client.createSnapshot(); - // client.registerTemplate(); - // client.createVmFromTemplate(); - // client.addNic(); - // client.addNicToNetwork(); - - // client.createDatacenter(); - // client.getPropertyWithPath(); - // client.getHostVMs(); - // client.testFT(); - // client.testFTEnable(); - - // client.importOVF(); - - // Test get DvSwitch - client.testDvSwitchOperations(); - // Test add DvPortGroup, - // Test update vPortGroup, - // Test get DvPortGroup, - // Test compare DvPortGroup - client.testDvPortGroupOpearations(); - - // Test addDvNic - // Test deleteDvNic - // client.testDvNicOperations(); - - cb.disConnect(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public static class TrustAllManager implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager { - - public java.security.cert.X509Certificate[] getAcceptedIssuers() { - return null; - } - - public boolean isServerTrusted(java.security.cert.X509Certificate[] certs) { - return true; - } - - public boolean isClientTrusted(java.security.cert.X509Certificate[] certs) { - return true; - } - - public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) - throws java.security.cert.CertificateException { - return; - } - public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) - throws java.security.cert.CertificateException { - return; - } - } -} - From 9ee853313439a2cb4c3cbd9ae2a650ed6b44274a Mon Sep 17 00:00:00 2001 From: Hugo Trippaers Date: Tue, 7 May 2013 11:44:23 +0200 Subject: [PATCH 41/66] commit e0d8f01ecd92a1a7b74558d02a28be3b2f20a10d enabled all tests. Fix AWSAPI build by removing broken tests and excluding failing tests. --- awsapi/pom.xml | 33 +- .../com/cloud/gate/model/ModelTestCase.java | 368 ------------------ .../cloud/gate/persist/PersitTestCase.java | 73 ---- 3 files changed, 11 insertions(+), 463 deletions(-) delete mode 100644 awsapi/test/com/cloud/gate/model/ModelTestCase.java delete mode 100644 awsapi/test/com/cloud/gate/persist/PersitTestCase.java diff --git a/awsapi/pom.xml b/awsapi/pom.xml index f19a71381d3..d4573491723 100644 --- a/awsapi/pom.xml +++ b/awsapi/pom.xml @@ -286,12 +286,6 @@ - install - src - src @@ -307,6 +301,17 @@ + + org.apache.maven.plugins + maven-surefire-plugin + + + com/cloud/gate/util/UtilTestCase.java + com/cloud/gate/service/ServiceTestCase.java + com/cloud/gate/util/CloudStackClientTestCase.java + + + org.apache.maven.plugins maven-war-plugin @@ -364,22 +369,6 @@ - diff --git a/awsapi/test/com/cloud/gate/model/ModelTestCase.java b/awsapi/test/com/cloud/gate/model/ModelTestCase.java deleted file mode 100644 index 91aeaa75215..00000000000 --- a/awsapi/test/com/cloud/gate/model/ModelTestCase.java +++ /dev/null @@ -1,368 +0,0 @@ -// 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.gate.model; - -import java.util.Date; -import java.util.Iterator; -import java.util.List; - -import org.apache.log4j.Logger; -import org.hibernate.Query; -import org.hibernate.Session; -import org.hibernate.Transaction; -import org.junit.Assert; - -import com.cloud.bridge.model.MHost; -import com.cloud.bridge.model.MHostMount; -import com.cloud.bridge.model.SBucket; -import com.cloud.bridge.model.SHost; -import com.cloud.bridge.model.SMeta; -import com.cloud.bridge.model.SObject; -import com.cloud.bridge.util.CloudSessionFactory; -import com.cloud.bridge.util.QueryHelper; -import com.cloud.gate.testcase.BaseTestCase; - -public class ModelTestCase extends BaseTestCase { - protected final static Logger logger = Logger.getLogger(ModelTestCase.class); - - public void testSHost() { - SHost host; - - // create the record - Session session = CloudSessionFactory.getInstance().openSession(); - try { - Transaction txn = session.beginTransaction(); - host = new SHost(); - host.setHost("localhost"); - host.setExportRoot("/"); - host.setUserOnHost("root"); - host.setUserPassword("password"); - session.saveOrUpdate(host); - txn.commit(); - } finally { - session.close(); - } - Assert.assertTrue(host.getId() != 0); - - // retrive the record - session = CloudSessionFactory.getInstance().openSession(); - try { - Transaction txn = session.beginTransaction(); - host = (SHost)session.get(SHost.class, (long)host.getId()); - txn.commit(); - - Assert.assertTrue(host.getHost().equals("localhost")); - Assert.assertTrue(host.getUserOnHost().equals("root")); - Assert.assertTrue(host.getUserPassword().equals("password")); - - logger.info("Retrived record, host:" + host.getHost() - + ", user: " + host.getUserOnHost() - + ", password: " + host.getUserPassword()); - - } finally { - session.close(); - } - - // delete the record - session = CloudSessionFactory.getInstance().openSession(); - try { - Transaction txn = session.beginTransaction(); - host = (SHost)session.get(SHost.class, (long)host.getId()); - session.delete(host); - txn.commit(); - } finally { - session.close(); - } - - session = CloudSessionFactory.getInstance().openSession(); - try { - Transaction txn = session.beginTransaction(); - host = (SHost)session.get(SHost.class, (long)host.getId()); - txn.commit(); - - Assert.assertTrue(host == null); - } finally { - session.close(); - } - } - - public void testSBucket() { - SHost host; - SBucket bucket; - Session session; - - session = CloudSessionFactory.getInstance().openSession(); - try { - Transaction txn = session.beginTransaction(); - host = new SHost(); - host.setHost("localhost"); - host.setUserOnHost("root"); - host.setUserPassword("password"); - host.setExportRoot("/"); - - bucket = new SBucket(); - bucket.setName("Bucket"); - bucket.setOwnerCanonicalId("OwnerId-dummy"); - bucket.setCreateTime(new Date()); - - host.getBuckets().add(bucket); - bucket.setShost(host); - - session.save(host); - session.save(bucket); - txn.commit(); - } finally { - session.close(); - } - - long bucketId = bucket.getId(); - - // load bucket - session = CloudSessionFactory.getInstance().openSession(); - try { - Transaction txn = session.beginTransaction(); - bucket = (SBucket)session.get(SBucket.class, bucketId); - txn.commit(); - - Assert.assertTrue(bucket.getShost().getHost().equals("localhost")); - Assert.assertTrue(bucket.getName().equals("Bucket")); - Assert.assertTrue(bucket.getOwnerCanonicalId().equals("OwnerId-dummy")); - } finally { - session.close(); - } - - // delete the bucket - session = CloudSessionFactory.getInstance().openSession(); - try { - Transaction txn = session.beginTransaction(); - bucket = (SBucket)session.get(SBucket.class, bucketId); - session.delete(bucket); - - host = (SHost)session.get(SHost.class, host.getId()); - session.delete(host); - txn.commit(); - } finally { - session.close(); - } - - // verify the deletion - session = CloudSessionFactory.getInstance().openSession(); - try { - Transaction txn = session.beginTransaction(); - bucket = (SBucket)session.get(SBucket.class, bucketId); - txn.commit(); - - Assert.assertTrue(bucket == null); - } finally { - session.close(); - } - } - - public void testSObject() { - SHost host; - SBucket bucket; - Session session; - SObject sobject; - - // setup - session = CloudSessionFactory.getInstance().openSession(); - try { - Transaction txn = session.beginTransaction(); - host = new SHost(); - host.setHost("localhost"); - host.setUserOnHost("root"); - host.setUserPassword("password"); - host.setExportRoot("/"); - - bucket = new SBucket(); - bucket.setName("Bucket"); - bucket.setOwnerCanonicalId("OwnerId-dummy"); - bucket.setCreateTime(new Date()); - bucket.setShost(host); - host.getBuckets().add(bucket); - - sobject = new SObject(); - sobject.setNameKey("ObjectNameKey"); - sobject.setOwnerCanonicalId("OwnerId-dummy"); - sobject.setCreateTime(new Date()); - sobject.setBucket(bucket); - bucket.getObjectsInBucket().add(sobject); - - session.save(host); - session.save(bucket); - session.save(sobject); - txn.commit(); - - } finally { - session.close(); - } - - session = CloudSessionFactory.getInstance().openSession(); - try { - Transaction txn = session.beginTransaction(); - sobject = (SObject)session.get(SObject.class, sobject.getId()); - txn.commit(); - Assert.assertTrue(sobject.getBucket().getName().equals("Bucket")); - Assert.assertTrue(sobject.getNameKey().equals("ObjectNameKey")); - Assert.assertTrue(sobject.getOwnerCanonicalId().equals("OwnerId-dummy")); - } finally { - session.close(); - } - - // test delete cascade - session = CloudSessionFactory.getInstance().openSession(); - try { - Transaction txn = session.beginTransaction(); - bucket = (SBucket)session.get(SBucket.class, bucket.getId()); - session.delete(bucket); - - host = (SHost)session.get(SHost.class, host.getId()); - session.delete(host); - txn.commit(); - } finally { - session.close(); - } - } - - public void testMeta() { - Session session; - - session = CloudSessionFactory.getInstance().openSession(); - try { - Transaction txn = session.beginTransaction(); - SMeta meta = new SMeta(); - meta.setTarget("SObject"); - meta.setTargetId(1); - meta.setName("param1"); - meta.setValue("value1"); - session.save(meta); - - logger.info("Meta 1: " + meta.getId()); - - meta = new SMeta(); - meta.setTarget("SObject"); - meta.setTargetId(1); - meta.setName("param2"); - meta.setValue("value2"); - session.save(meta); - - logger.info("Meta 2: " + meta.getId()); - - txn.commit(); - } finally { - session.close(); - } - - session = CloudSessionFactory.getInstance().openSession(); - try { - Transaction txn = session.beginTransaction(); - Query query = session.createQuery("from SMeta where target=? and targetId=?"); - QueryHelper.bindParameters(query, new Object[] { - "SObject", new Long(1) - }); - List l = QueryHelper.executeQuery(query); - txn.commit(); - - for(SMeta meta: l) { - logger.info("" + meta.getName() + "=" + meta.getValue()); - } - } finally { - session.close(); - } - - session = CloudSessionFactory.getInstance().openSession(); - try { - Transaction txn = session.beginTransaction(); - Query query = session.createQuery("delete from SMeta where target=?"); - QueryHelper.bindParameters(query, new Object[] {"SObject"}); - query.executeUpdate(); - txn.commit(); - } finally { - session.close(); - } - } - - public void testHosts() { - Session session; - SHost shost; - MHost mhost; - MHostMount hostMount; - - session = CloudSessionFactory.getInstance().openSession(); - try { - Transaction txn = session.beginTransaction(); - shost = new SHost(); - shost.setHost("Storage host1"); - shost.setUserOnHost("root"); - shost.setUserPassword("password"); - shost.setExportRoot("/"); - session.save(shost); - - mhost = new MHost(); - mhost.setHostKey("1"); - mhost.setHost("management host1"); - mhost.setVersion("v1"); - session.save(mhost); - - hostMount = new MHostMount(); - hostMount.setMhost(mhost); - hostMount.setShost(shost); - hostMount.setMountPath("/mnt"); - session.save(hostMount); - txn.commit(); - } finally { - session.close(); - } - - session = CloudSessionFactory.getInstance().openSession(); - try { - Transaction txn = session.beginTransaction(); - mhost = (MHost)session.createQuery("from MHost where hostKey=?"). - setLong(0, new Long(1)).uniqueResult(); - - if(mhost != null) { - Iterator it = mhost.getMounts().iterator(); - while(it.hasNext()) { - MHostMount mount = (MHostMount)it.next(); - Assert.assertTrue(mount.getMountPath().equals("/mnt")); - - logger.info(mount.getMountPath()); - } - } - txn.commit(); - } finally { - session.close(); - } - - session = CloudSessionFactory.getInstance().openSession(); - try { - Transaction txn = session.beginTransaction(); - mhost = (MHost)session.createQuery("from MHost where hostKey=?"). - setLong(0, new Long(1)).uniqueResult(); - if(mhost != null) - session.delete(mhost); - - shost = (SHost)session.createQuery("from SHost where host=?"). - setString(0, "Storage host1").uniqueResult(); - if(shost != null) - session.delete(shost); - txn.commit(); - } finally { - session.close(); - } - } -} diff --git a/awsapi/test/com/cloud/gate/persist/PersitTestCase.java b/awsapi/test/com/cloud/gate/persist/PersitTestCase.java deleted file mode 100644 index 4961d932682..00000000000 --- a/awsapi/test/com/cloud/gate/persist/PersitTestCase.java +++ /dev/null @@ -1,73 +0,0 @@ -// 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.gate.persist; - -import org.apache.log4j.Logger; - -import com.cloud.bridge.persist.PersistContext; -import com.cloud.gate.testcase.BaseTestCase; - -public class PersitTestCase extends BaseTestCase { - protected final static Logger logger = Logger.getLogger(PersitTestCase.class); - - public void testNamedLock() { - Thread t1 = new Thread(new Runnable() { - public void run() { - for(int i = 0; i < 10; i++) { - if(PersistContext.acquireNamedLock("TestLock", 3)) { - logger.info("Thread 1 acquired lock"); - try { - Thread.currentThread().sleep(BaseTestCase.getRandomMilliseconds(5000, 10000)); - } catch (InterruptedException e) { - } - logger.info("Thread 1 to release lock"); - PersistContext.releaseNamedLock("TestLock"); - } else { - logger.info("Thread 1 is unable to acquire lock"); - } - } - } - }); - - Thread t2 = new Thread(new Runnable() { - public void run() { - for(int i = 0; i < 10; i++) { - if(PersistContext.acquireNamedLock("TestLock", 3)) { - logger.info("Thread 2 acquired lock"); - try { - Thread.currentThread().sleep(BaseTestCase.getRandomMilliseconds(1000, 5000)); - } catch (InterruptedException e) { - } - logger.info("Thread 2 to release lock"); - PersistContext.releaseNamedLock("TestLock"); - } else { - logger.info("Thread 2 is unable to acquire lock"); - } - } - } - }); - - t1.start(); - t2.start(); - - try { - t1.join(); - t2.join(); - } catch(InterruptedException e) { - } - } -} From 1d24cbc3071e6b6b75449e01ec8d1a4dc9744ec4 Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Tue, 7 May 2013 15:26:48 +0530 Subject: [PATCH 42/66] add debug logs when access checkers fail to find API When the access checkers fail for api discovery, we fail silently. instead record a debug message. Signed-off-by: Prasanna Santhanam --- .../org/apache/cloudstack/discovery/ApiDiscoveryServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/api/discovery/src/org/apache/cloudstack/discovery/ApiDiscoveryServiceImpl.java b/plugins/api/discovery/src/org/apache/cloudstack/discovery/ApiDiscoveryServiceImpl.java index 08fb573e4d9..860240faef0 100755 --- a/plugins/api/discovery/src/org/apache/cloudstack/discovery/ApiDiscoveryServiceImpl.java +++ b/plugins/api/discovery/src/org/apache/cloudstack/discovery/ApiDiscoveryServiceImpl.java @@ -219,6 +219,7 @@ public class ApiDiscoveryServiceImpl implements ApiDiscoveryService { try { apiChecker.checkAccess(user, name); } catch (Exception ex) { + s_logger.debug("API discovery access check failed for " + name + " with " + ex.getMessage()); return null; } } From b8642c80efa8e4a3a7ae56db1264231ac0d7bf20 Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Tue, 7 May 2013 15:27:26 +0530 Subject: [PATCH 43/66] adding ACL for dedicateGuestVlanRange set of APIs Signed-off-by: Prasanna Santhanam --- client/tomcatconf/commands.properties.in | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in index 22de93dc65d..687c3c16c75 100644 --- a/client/tomcatconf/commands.properties.in +++ b/client/tomcatconf/commands.properties.in @@ -126,8 +126,10 @@ createVlanIpRange=1 deleteVlanIpRange=1 listVlanIpRanges=1 dedicatePublicIpRange=1 -dedicateGuestVlanRange=1 releasePublicIpRange=1 +dedicateGuestVlanRange=1 +releaseDedicatedGuestVlanRange=1 +listDedicatedGuestVlanRanges=1 #### address commands associateIpAddress=15 From 808b49b21685ec850230c121492127f2047830c7 Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Tue, 7 May 2013 15:28:20 +0530 Subject: [PATCH 44/66] Adding isolation method to the zone creation of marvin Signed-off-by: Prasanna Santhanam --- setup/dev/advanced.cfg | 3 +++ setup/dev/basic.cfg | 3 +++ tools/marvin/marvin/configGenerator.py | 1 + tools/marvin/marvin/deployDataCenter.py | 1 + tools/marvin/marvin/sandbox/advanced/advanced_env.py | 3 +++ tools/marvin/marvin/sandbox/basic/basic_env.py | 1 + tools/marvin/marvin/sandbox/demo/simulator/simulator_setup.py | 2 ++ 7 files changed, 14 insertions(+) diff --git a/setup/dev/advanced.cfg b/setup/dev/advanced.cfg index 431598947c6..63e435bb18f 100644 --- a/setup/dev/advanced.cfg +++ b/setup/dev/advanced.cfg @@ -46,6 +46,9 @@ "broadcastdomainrange": "ZONE", "name": "VpcVirtualRouter" } + ], + "isolationmethods": [ + "VLAN" ] } ], diff --git a/setup/dev/basic.cfg b/setup/dev/basic.cfg index 3f56a3ce980..326874d1f19 100644 --- a/setup/dev/basic.cfg +++ b/setup/dev/basic.cfg @@ -42,6 +42,9 @@ "broadcastdomainrange": "Pod", "name": "SecurityGroupProvider" } + ], + "isolationmethods": [ + "L3" ] } ], diff --git a/tools/marvin/marvin/configGenerator.py b/tools/marvin/marvin/configGenerator.py index e2a6a24d69f..4e82bbe387d 100644 --- a/tools/marvin/marvin/configGenerator.py +++ b/tools/marvin/marvin/configGenerator.py @@ -133,6 +133,7 @@ class physical_network(): self.traffictypes = [] self.broadcastdomainrange = 'Zone' self.vlan = None + self.isolationmethods = [] '''enable default virtual router provider''' vrouter = provider() vrouter.name = 'VirtualRouter' diff --git a/tools/marvin/marvin/deployDataCenter.py b/tools/marvin/marvin/deployDataCenter.py index 5ca1ebfb4f8..21685923b37 100644 --- a/tools/marvin/marvin/deployDataCenter.py +++ b/tools/marvin/marvin/deployDataCenter.py @@ -169,6 +169,7 @@ class deployDataCenters(): phynet = createPhysicalNetwork.createPhysicalNetworkCmd() phynet.zoneid = zoneid phynet.name = net.name + phynet.isolationmethods = net.isolationmethods phynetwrk = self.apiClient.createPhysicalNetwork(phynet) self.addTrafficTypes(phynetwrk.id, net.traffictypes) return phynetwrk diff --git a/tools/marvin/marvin/sandbox/advanced/advanced_env.py b/tools/marvin/marvin/sandbox/advanced/advanced_env.py index db78a84b33b..bf880f38055 100644 --- a/tools/marvin/marvin/sandbox/advanced/advanced_env.py +++ b/tools/marvin/marvin/sandbox/advanced/advanced_env.py @@ -46,6 +46,7 @@ def describeResources(config): z.name = 'Sandbox-%s'%(config.get('cloudstack', 'hypervisor')) z.networktype = 'Advanced' z.guestcidraddress = '10.1.1.0/24' + z.securitygroupenabled = 'false' vpcprovider = provider() vpcprovider.name = 'VpcVirtualRouter' @@ -57,6 +58,7 @@ def describeResources(config): pn.traffictypes = [traffictype("Guest"), traffictype("Management", {"simulator" : "cloud-simulator-mgmt"}), traffictype("Public", {"simulator":"cloud-simulator-public"})] + pn.isolationmethods = ["VLAN"] pn.providers.append(vpcprovider) pn2 = physical_network() @@ -64,6 +66,7 @@ def describeResources(config): pn2.vlan = config.get('cloudstack', 'pnet2.vlan') pn2.tags = ["cloud-simulator-guest"] pn2.traffictypes = [traffictype('Guest', {'simulator': 'cloud-simulator-guest'})] + pn2.isolationmethods = ["VLAN"] pn2.providers.append(vpcprovider) z.physical_networks.append(pn) diff --git a/tools/marvin/marvin/sandbox/basic/basic_env.py b/tools/marvin/marvin/sandbox/basic/basic_env.py index e588fdcc882..cf1869fa499 100644 --- a/tools/marvin/marvin/sandbox/basic/basic_env.py +++ b/tools/marvin/marvin/sandbox/basic/basic_env.py @@ -55,6 +55,7 @@ def describeResources(config): pn = physical_network() pn.name = "Sandbox-pnet" pn.traffictypes = [traffictype("Guest"), traffictype("Management")] + pn.isolationmethods = ["L3"] pn.providers.append(sgprovider) z.physical_networks.append(pn) diff --git a/tools/marvin/marvin/sandbox/demo/simulator/simulator_setup.py b/tools/marvin/marvin/sandbox/demo/simulator/simulator_setup.py index e4ec9b7b1b1..d45d48243bd 100644 --- a/tools/marvin/marvin/sandbox/demo/simulator/simulator_setup.py +++ b/tools/marvin/marvin/sandbox/demo/simulator/simulator_setup.py @@ -41,6 +41,7 @@ def describeResources(config): z.name = 'Sandbox-%s'%(config.get('environment', 'hypervisor')) z.networktype = 'Advanced' z.guestcidraddress = '10.1.1.0/24' + z.securitygroupenabled = 'false' vpcprovider = provider() vpcprovider.name = 'VpcVirtualRouter' @@ -48,6 +49,7 @@ def describeResources(config): pn = physical_network() pn.name = "Sandbox-pnet" pn.traffictypes = [traffictype("Guest"), traffictype("Management"), traffictype("Public")] + pn.isolationmethods = ["VLAN"] pn.providers.append(vpcprovider) pn.vlan = config.get('cloudstack', 'zone.vlan') From 887f405ce3b02abef807e7dc8b40cbc4f33ae5bd Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Tue, 7 May 2013 15:28:43 +0530 Subject: [PATCH 45/66] Renaming TesDedicateVlanRange -> TestDedicateVlanRange Signed-off-by: Prasanna Santhanam --- test/integration/smoke/test_guest_vlan_range.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/integration/smoke/test_guest_vlan_range.py b/test/integration/smoke/test_guest_vlan_range.py index 01cd68c1435..17234775ca1 100644 --- a/test/integration/smoke/test_guest_vlan_range.py +++ b/test/integration/smoke/test_guest_vlan_range.py @@ -44,15 +44,15 @@ class Services: "password": "password", }, "name": "testphysicalnetwork", - "vlan": "2118-2120", + "vlan": "118-120", } -class TesDedicateGuestVlanRange(cloudstackTestCase): +class TestDedicateGuestVlanRange(cloudstackTestCase): @classmethod def setUpClass(cls): - cls.api_client = super(TesDedicateGuestVlanRange, cls).getClsTestClient().getApiClient() + cls.api_client = super(TestDedicateGuestVlanRange, cls).getClsTestClient().getApiClient() cls.services = Services().services # Get Zone, Domain cls.domain = get_domain(cls.api_client, cls.services) From b9f262aa1c30b38b5a2135faa62818fcb32e73d6 Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Tue, 7 May 2013 17:06:15 +0530 Subject: [PATCH 46/66] Fixing the gmaven configuration for marvin/pom.xml For the marvin checkin test custom properties had a typo when run for the *nix environment. Signed-off-by: Prasanna Santhanam --- tools/marvin/pom.xml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tools/marvin/pom.xml b/tools/marvin/pom.xml index 089c445ed9e..b8f7d7430a5 100644 --- a/tools/marvin/pom.xml +++ b/tools/marvin/pom.xml @@ -232,9 +232,13 @@ execute + + ${user.dir} + ${marvin.config} + - pom.properties['resolved.userdir']='${user.dir}'.replace('\','/').replace('D:','/cyg/d'); - pom.properties['resolved.marvin.config']='${marvin.config}'.replace('\','/').replace('D:','/cyg/d'); + project.properties['resolved.user.dir']='${user.dir}'.replace('\','/').replace('D:','/cyg/d'); + project.properties['resolved.marvin.config']='${marvin.config}'.replace('\','/').replace('D:','/cyg/d'); From 43fdb144e19332fa4a37a1c01376921545ebbc28 Mon Sep 17 00:00:00 2001 From: Radhika PC Date: Tue, 7 May 2013 18:26:08 +0530 Subject: [PATCH 47/66] CLOUDSTACK-893 api --- docs/en-US/added-API-commands-4.2.xml | 43 +++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/docs/en-US/added-API-commands-4.2.xml b/docs/en-US/added-API-commands-4.2.xml index 34716240657..7417bd15f35 100644 --- a/docs/en-US/added-API-commands-4.2.xml +++ b/docs/en-US/added-API-commands-4.2.xml @@ -63,5 +63,48 @@ more IDs separated by comma); type (string); olderthan (yyyy-mm-dd format). The response parameters are: true, false + + createGlobalLoadBalancerRule + Creates a GSLB rule. The request parameters are name (the name of the global load + balancer rule); domain name ( the preferred domain name for the service); lb algorithm (the + algorithm used to load balance the traffic across the zones); session persistence (source IP + and HTTP cookie); account name; and domain Id. + + + assignToGlobalLoadBalancerRule + Assigns a load balancing rule or list of load balancing rules to GSLB. The request + parameters are: id (the UUID of global load balancer rule); loadbalancerrulelist (the list + load balancer rules that will be assigned to global load balancer rule. These are second + tier load balancing rules created with createLoadBalancerRule API. Weight is optional, the + default is 1). + + + removeFromGlobalLoadBalancerRule + Removes a load balancer rule association with global load balancer rule. The request + parameters are id (the UUID of global load balancer rule); loadbalancerrulelist (the list + load balancer rules that will be assigned to global load balancer rule). + + + deleteGlobalLoadBalancerRule + Deletes a global load balancer rule. The request parameters is: id (the unique ID of the + global load balancer rule). + + + listGlobalLoadBalancerRule + Lists load balancer rules. account (lists resources by account. Use with the domainId + parameter); domainid (lists only resources belonging to the domain specified) id (the unique + ID of the global load balancer rule) isrecursive (defaults to false, but if true, lists all + resources from the parent specified by the domainId till leaves); keyword (List by keyword); + listall (if set to false, list only resources belonging to the command's caller; if set to + true - list resources that the caller is authorized to see. Default value is false); page; + pagesize; projectid (lists objects by project); regionid (region ID); tags (lists resources + by tags: key/value pairs). + + + updateGlobalLoadBalancerRule + Archives the specified events. The request parameters are: ids (allowed to pass one or + more IDs separated by comma); type (string); olderthan (yyyy-mm-dd format). + The response parameters are: true, false + From 732566e70368ef771d2f29f951bfba3b8272f9c3 Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Tue, 7 May 2013 13:02:29 -0700 Subject: [PATCH 48/66] CLOUDSTACK-2364: fixed private gateway creation in VPC - the vnet for the private gateway network is not stored in data_center_vnet table --- .../com/cloud/network/NetworkManagerImpl.java | 39 +++++++++++-------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index a995661b9ce..4fffbc11072 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -2005,23 +2005,28 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L if (_networksDao.countByZoneAndUri(zoneId, uri) > 0) { throw new InvalidParameterValueException("Network with vlan " + vlanId + " already exists in zone " + zoneId); } else { - DataCenterVnetVO dcVnet = _datacenterVnetDao.findVnet(zoneId, vlanId.toString()).get(0); - // Fail network creation if specified vlan is dedicated to a different account - if (dcVnet.getAccountGuestVlanMapId() != null) { - Long accountGuestVlanMapId = dcVnet.getAccountGuestVlanMapId(); - AccountGuestVlanMapVO map = _accountGuestVlanMapDao.findById(accountGuestVlanMapId); - if (map.getAccountId() != owner.getAccountId()) { - throw new InvalidParameterValueException("Vlan " + vlanId + " is dedicated to a different account"); - } - // Fail network creation if owner has a dedicated range of vlans but the specified vlan belongs to the system pool - } else { - List maps = _accountGuestVlanMapDao.listAccountGuestVlanMapsByAccount(owner.getAccountId()); - if (maps != null && !maps.isEmpty()) { - int vnetsAllocatedToAccount = _datacenterVnetDao.countVnetsAllocatedToAccount(zoneId, owner.getAccountId()); - int vnetsDedicatedToAccount = _datacenterVnetDao.countVnetsDedicatedToAccount(zoneId, owner.getAccountId()); - if (vnetsAllocatedToAccount < vnetsDedicatedToAccount) { - throw new InvalidParameterValueException("Specified vlan " + vlanId + " doesn't belong" + - " to the vlan range dedicated to the owner "+ owner.getAccountName()); + List dcVnets = _datacenterVnetDao.findVnet(zoneId, vlanId.toString()); + //for the network that is created as part of private gateway, + //the vnet is not coming from the data center vnet table, so the list can be empty + if (!dcVnets.isEmpty()) { + DataCenterVnetVO dcVnet = dcVnets.get(0); + // Fail network creation if specified vlan is dedicated to a different account + if (dcVnet.getAccountGuestVlanMapId() != null) { + Long accountGuestVlanMapId = dcVnet.getAccountGuestVlanMapId(); + AccountGuestVlanMapVO map = _accountGuestVlanMapDao.findById(accountGuestVlanMapId); + if (map.getAccountId() != owner.getAccountId()) { + throw new InvalidParameterValueException("Vlan " + vlanId + " is dedicated to a different account"); + } + // Fail network creation if owner has a dedicated range of vlans but the specified vlan belongs to the system pool + } else { + List maps = _accountGuestVlanMapDao.listAccountGuestVlanMapsByAccount(owner.getAccountId()); + if (maps != null && !maps.isEmpty()) { + int vnetsAllocatedToAccount = _datacenterVnetDao.countVnetsAllocatedToAccount(zoneId, owner.getAccountId()); + int vnetsDedicatedToAccount = _datacenterVnetDao.countVnetsDedicatedToAccount(zoneId, owner.getAccountId()); + if (vnetsAllocatedToAccount < vnetsDedicatedToAccount) { + throw new InvalidParameterValueException("Specified vlan " + vlanId + " doesn't belong" + + " to the vlan range dedicated to the owner "+ owner.getAccountName()); + } } } } From 5b74b4d6fe68e81d76ce8743c017201212f0d7aa Mon Sep 17 00:00:00 2001 From: Brian Federle Date: Tue, 7 May 2013 15:44:28 -0700 Subject: [PATCH 49/66] UI plugin API: Support IE-compatible CSS loading If browser is IE < 9, use document.createStyleSheet to properly load plugin's CSS dynamically. --- ui/scripts/plugins.js | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/ui/scripts/plugins.js b/ui/scripts/plugins.js index 122f4a03491..6a886ba0ae6 100644 --- a/ui/scripts/plugins.js +++ b/ui/scripts/plugins.js @@ -20,15 +20,20 @@ } var loadCSS = function(path) { - var $link = $(''); + if (document.createStyleSheet) { + // IE-compatible CSS loading + document.createStyleSheet(path); + } else { + var $link = $(''); - $link.attr({ - rel: 'stylesheet', - type: 'text/css', - href: path - }); + $link.attr({ + rel: 'stylesheet', + type: 'text/css', + href: path + }); - $('head').append($link); + $('html head').append($link); + } }; $.extend(cloudStack.pluginAPI, { From 64dc39a2b068e0cb82ad300a98ae83e323137364 Mon Sep 17 00:00:00 2001 From: Hiroaki KAWAI Date: Wed, 8 May 2013 10:06:44 +0900 Subject: [PATCH 50/66] Fix typo Reported by Soheil Eizadi at dev@cloudstack.apache.org --- .../src/com/cloud/api/commands/DeleteNiciraNvpDeviceCmd.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 plugins/network-elements/nicira-nvp/src/com/cloud/api/commands/DeleteNiciraNvpDeviceCmd.java diff --git a/plugins/network-elements/nicira-nvp/src/com/cloud/api/commands/DeleteNiciraNvpDeviceCmd.java b/plugins/network-elements/nicira-nvp/src/com/cloud/api/commands/DeleteNiciraNvpDeviceCmd.java old mode 100644 new mode 100755 index 8d21a55a65e..9ba1c836a98 --- a/plugins/network-elements/nicira-nvp/src/com/cloud/api/commands/DeleteNiciraNvpDeviceCmd.java +++ b/plugins/network-elements/nicira-nvp/src/com/cloud/api/commands/DeleteNiciraNvpDeviceCmd.java @@ -95,7 +95,7 @@ public class DeleteNiciraNvpDeviceCmd extends BaseAsyncCmd { @Override public String getEventType() { - return EventTypes.EVENT_EXTERNAL_LB_DEVICE_DELETE; + return EventTypes.EVENT_EXTERNAL_NVP_CONTROLLER_DELETE; } @Override From 20bc334f2c9df58d658c9541b1fa43a47521d979 Mon Sep 17 00:00:00 2001 From: Koushik Das Date: Wed, 8 May 2013 08:32:48 +0530 Subject: [PATCH 51/66] CLOUDSTACK-2357 : Failed to update VNMC provider to enabled state --- .../src/com/cloud/network/element/CiscoVnmcElement.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java b/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java index 443bb40f57f..470c4e88217 100644 --- a/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java +++ b/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java @@ -434,16 +434,14 @@ public class CiscoVnmcElement extends AdapterBase implements SourceNatServicePro @Override public boolean isReady(PhysicalNetworkServiceProvider provider) { - // TODO Auto-generated method stub - return false; + return true; } @Override public boolean shutdownProviderInstances( PhysicalNetworkServiceProvider provider, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException { - // TODO Auto-generated method stub - return false; + return true; } @Override From 3a41a83f885cfd05b9fd951738abab30353618df Mon Sep 17 00:00:00 2001 From: Likitha Shetty Date: Wed, 8 May 2013 11:20:12 +0530 Subject: [PATCH 52/66] [MARVIN] Fixing dedicate_guest_vlan_range test --- test/integration/smoke/test_guest_vlan_range.py | 17 +++++++---------- tools/marvin/marvin/integration/lib/base.py | 2 +- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/test/integration/smoke/test_guest_vlan_range.py b/test/integration/smoke/test_guest_vlan_range.py index 17234775ca1..13cf335b893 100644 --- a/test/integration/smoke/test_guest_vlan_range.py +++ b/test/integration/smoke/test_guest_vlan_range.py @@ -149,15 +149,12 @@ class TestDedicateGuestVlanRange(cloudstackTestCase): ) self.debug("Releasing guest vlan range"); - dedicated_guest_vlan_response.release(self.apiclient) - list_dedicated_guest_vlan_range_response = PhysicalNetwork.listDedicated( - self.apiclient, - id=dedicate_guest_vlan_range_response.id - ) - dedicated_guest_vlan_response = list_dedicated_guest_vlan_range_response[0] + dedicate_guest_vlan_range_response.release(self.apiclient) + list_dedicated_guest_vlan_range_response = PhysicalNetwork.listDedicated(self.apiclient) self.assertEqual( - dedicated_guest_vlan_response.account, - "system", - "Check account name is system account in listDedicatedGuestVlanRanges" - ) + list_dedicated_guest_vlan_range_response, + None, + "Check vlan range is not available in listDedicatedGuestVlanRanges" + + ) diff --git a/tools/marvin/marvin/integration/lib/base.py b/tools/marvin/marvin/integration/lib/base.py index cdb6a36c41d..92b8a2d1e10 100755 --- a/tools/marvin/marvin/integration/lib/base.py +++ b/tools/marvin/marvin/integration/lib/base.py @@ -2202,7 +2202,7 @@ class PhysicalNetwork: cmd = listDedicatedGuestVlanRanges.listDedicatedGuestVlanRangesCmd() [setattr(cmd, k, v) for k, v in kwargs.items()] - return map(lambda pn : PhysicalNetwork(pn.__dict__), apiclient.listDedicatedGuestVlanRanges(cmd)) + return apiclient.listDedicatedGuestVlanRanges(cmd) @classmethod def list(cls, apiclient, **kwargs): From b6cb23cb99c9daee41b46a3fc13fffabfb791dc3 Mon Sep 17 00:00:00 2001 From: Sanjay Tripathi Date: Wed, 3 Apr 2013 11:56:17 +0530 Subject: [PATCH 53/66] CLOUDSTACK-957: Localization -- Add UK keyboard support. --- .../console-proxy/server/css/ajaxviewer.css | 6 +- services/console-proxy/server/js/ajaxkeys.js | 295 ++++++++++++++++-- .../console-proxy/server/js/ajaxviewer.js | 128 ++------ .../consoleproxy/ConsoleProxyClientBase.java | 1 + 4 files changed, 295 insertions(+), 135 deletions(-) diff --git a/services/console-proxy/server/css/ajaxviewer.css b/services/console-proxy/server/css/ajaxviewer.css index 5ea552b176f..fd2fb3c44e9 100644 --- a/services/console-proxy/server/css/ajaxviewer.css +++ b/services/console-proxy/server/css/ajaxviewer.css @@ -91,12 +91,12 @@ body { position: absolute; top:32; width: 260; - height: 65; + height: 95; display: block; display: none; border-top: 1px solid black; - background-image:url(/resource/images/back.gif); - background-repeat:repeat-x repeat-y; + background-image:url(/resource/images/back.gif); + background-repeat:repeat-x repeat-y; } #toolbar ul li ul li { diff --git a/services/console-proxy/server/js/ajaxkeys.js b/services/console-proxy/server/js/ajaxkeys.js index 2ecf5b561e0..1ed41c562d4 100644 --- a/services/console-proxy/server/js/ajaxkeys.js +++ b/services/console-proxy/server/js/ajaxkeys.js @@ -23,55 +23,286 @@ under the License. * They are used by the ajaxviewer.js */ -//client event type. corresponds to events in ajaxviewer. -X11_KEY_CIRCUMFLEX_ACCENT = 0x5e; // ^ -X11_KEY_YEN_MARK = 0xa5; +//client event type. corresponds to events in ajaxviewer. + + +//use java AWT key modifier masks +JS_KEY_BACKSPACE = 8; +JS_KEY_TAB = 9; +JS_KEY_ENTER = 13; +JS_KEY_SHIFT = 16; +JS_KEY_CTRL = 17; +JS_KEY_ALT = 18; +JS_KEY_CAPSLOCK = 20; +JS_KEY_ESCAPE = 27; +JS_KEY_PAGEUP = 33; +JS_KEY_PAGEDOWN = 34; +JS_KEY_END = 35; +JS_KEY_HOME = 36; +JS_KEY_LEFT = 37; +JS_KEY_UP = 38; +JS_KEY_RIGHT = 39; +JS_KEY_DOWN = 40; +JS_KEY_INSERT = 45; +JS_KEY_DELETE = 46; +JS_KEY_SELECT_KEY = 93; +JS_KEY_NUMPAD0 = 96; +JS_KEY_NUMPAD1 = 97; +JS_KEY_NUMPAD2 = 98; +JS_KEY_NUMPAD3 = 99; +JS_KEY_NUMPAD4 = 100; +JS_KEY_NUMPAD5 = 101; +JS_KEY_NUMPAD6 = 102; +JS_KEY_NUMPAD7 = 103; +JS_KEY_NUMPAD8 = 104; +JS_KEY_NUMPAD9 = 105; +JS_KEY_MULTIPLY = 106; +JS_KEY_ADD = 107; +JS_KEY_SUBSTRACT = 109; +JS_KEY_DECIMAL_POINT = 110; +JS_KEY_DIVIDE = 111; +JS_KEY_F1 = 112; +JS_KEY_F2 = 113; +JS_KEY_F3 = 114; +JS_KEY_F4 = 115; +JS_KEY_F5 = 116; +JS_KEY_F6 = 117; +JS_KEY_F7 = 118; +JS_KEY_F8 = 119; +JS_KEY_F9 = 120; +JS_KEY_F10 = 121; +JS_KEY_F11 = 122; +JS_KEY_F12 = 123; +JS_KEY_SEMI_COLON = 186; // ; +JS_KEY_COMMA = 188; // , +JS_KEY_DASH = 189; // - +JS_KEY_PERIOD = 190; // . +JS_KEY_FORWARD_SLASH = 191; // / +JS_KEY_GRAVE_ACCENT = 192; // ` +JS_KEY_OPEN_BRACKET = 219; // [ +JS_KEY_BACK_SLASH = 220; // \ +JS_KEY_CLOSE_BRACKET = 221; // ] +JS_KEY_SINGLE_QUOTE = 222; // ' + + +//X11 keysym definitions +X11_KEY_CAPSLOCK = 0xffe5; +X11_KEY_BACKSPACE = 0xff08; +X11_KEY_TAB = 0xff09; +X11_KEY_ENTER = 0xff0d; +X11_KEY_ESCAPE = 0xff1b; +X11_KEY_INSERT = 0xff63; +X11_KEY_DELETE = 0xffff; +X11_KEY_HOME = 0xff50; +X11_KEY_END = 0xff57; +X11_KEY_PAGEUP = 0xff55; +X11_KEY_PAGEDOWN = 0xff56; +X11_KEY_LEFT = 0xff51; +X11_KEY_UP = 0xff52; +X11_KEY_RIGHT = 0xff53; +X11_KEY_DOWN = 0xff54; +X11_KEY_F1 = 0xffbe; +X11_KEY_F2 = 0xffbf; +X11_KEY_F3 = 0xffc0; +X11_KEY_F4 = 0xffc1; +X11_KEY_F5 = 0xffc2; +X11_KEY_F6 = 0xffc3; +X11_KEY_F7 = 0xffc4; +X11_KEY_F8 = 0xffc5; +X11_KEY_F9 = 0xffc6; +X11_KEY_F10 = 0xffc7; +X11_KEY_F11 = 0xffc8; +X11_KEY_F12 = 0xffc9; +X11_KEY_SHIFT = 0xffe1; +X11_KEY_CTRL = 0xffe3; +X11_KEY_ALT = 0xffe9; +X11_KEY_GRAVE_ACCENT = 0x60; +X11_KEY_SUBSTRACT = 0x2d; +X11_KEY_ADD = 0x2b; X11_KEY_OPEN_BRACKET = 0x5b; X11_KEY_CLOSE_BRACKET = 0x5d; +X11_KEY_BACK_SLASH = 0x7c; +X11_KEY_REVERSE_SOLIUS = 0x5c; // another back slash (back slash on JP keyboard) +X11_KEY_SINGLE_QUOTE = 0x22; +X11_KEY_COMMA = 0x3c; +X11_KEY_PERIOD = 0x3e; +X11_KEY_FORWARD_SLASH = 0x3f; +X11_KEY_DASH = 0x2d; X11_KEY_COLON = 0x3a; -X11_KEY_REVERSE_SOLIUS = 0x5c; // another back slash (back slash on JP keyboard) -X11_KEY_CAPSLOCK = 0xffe5; X11_KEY_SEMI_COLON = 0x3b; -X11_KEY_SHIFT = 0xffe1; -X11_KEY_ADD = 0x2b; +X11_KEY_NUMPAD0 = 0x30; +X11_KEY_NUMPAD1 = 0x31; +X11_KEY_NUMPAD2 = 0x32; +X11_KEY_NUMPAD3 = 0x33; +X11_KEY_NUMPAD4 = 0x34; +X11_KEY_NUMPAD5 = 0x35; +X11_KEY_NUMPAD6 = 0x36; +X11_KEY_NUMPAD7 = 0x37; +X11_KEY_NUMPAD8 = 0x38; +X11_KEY_NUMPAD9 = 0x39; +X11_KEY_DECIMAL_POINT = 0x2e; +X11_KEY_DIVIDE = 0x3f; +X11_KEY_TILDE = 0x7e; // ~ +X11_KEY_CIRCUMFLEX_ACCENT = 0x5e; // ^ +X11_KEY_YEN_MARK = 0xa5; // Japanese YEN mark +X11_KEY_ASTERISK = 0x2a; KEY_DOWN = 5; KEY_UP = 6; +KEYBOARD_TYPE_COOKED = "us"; +KEYBOARD_TYPE_JP = "jp"; +KEYBOARD_TYPE_UK = "uk"; + //JP keyboard type -// +// var keyboardTables = [ - {tindex: 0, keyboardType: "EN-Cooked", mappingTable: - {X11: [ {keycode: 222, entry: X11_KEY_CIRCUMFLEX_ACCENT}, + {tindex: 0, keyboardType: KEYBOARD_TYPE_COOKED, mappingTable: + {X11: [ {keycode: 222, entry: X11_KEY_CIRCUMFLEX_ACCENT}, {keycode: 220, entry: X11_KEY_YEN_MARK}, - {keycode: 219, entry: X11_KEY_OPEN_BRACKET}, - {keycode: 221, entry: X11_KEY_CLOSE_BRACKET}, - {keycode: 59, entry: X11_KEY_COLON, browser: "Firefox"}, {keycode: 186, entry: X11_KEY_COLON, browser: "Chrome"}, {keycode: 9, entry: 9, guestos: "XenServer"}, {keycode: 226, entry: X11_KEY_REVERSE_SOLIUS}, + {keycode: 240, entry: [ {type: KEY_DOWN, code: X11_KEY_CAPSLOCK, modifiers: 0 }, {type: KEY_UP, code: X11_KEY_CAPSLOCK, modifiers: 0 }, ] + } + ], + keyPress: [ + {keycode: 59, entry: [ + {type: KEY_DOWN, code: X11_KEY_SEMI_COLON, modifiers: 0 }, + {type: KEY_UP, code: X11_KEY_SEMI_COLON, modifiers: 0 }, + ] }, - ], - keyPress: [ - {keycode: 59, entry: [ - {type: KEY_DOWN, code: X11_KEY_SEMI_COLON, modifiers: 0 }, - {type: KEY_UP, code: X11_KEY_SEMI_COLON, modifiers: 0 }, - ] - }, - {keycode: 43, entry: [ - {type: KEY_DOWN, code: X11_KEY_SHIFT, modifiers: 0, shift: false }, - {type: KEY_DOWN, code: X11_KEY_ADD, modifiers: 0, shift: false }, - {type: KEY_UP, code: X11_KEY_ADD, modifiers: 0, shift: false }, - {type: KEY_UP, code: X11_KEY_SHIFT, modifiers: 0, shift: false }, - {type: KEY_DOWN, code: X11_KEY_ADD, modifiers: 0, shift: true }, - {type: KEY_UP, code: X11_KEY_ADD, modifiers: 0, shift: true }, - ] - }, - ] - } - } ] + {keycode: 43, entry: [ + {type: KEY_DOWN, code: X11_KEY_SHIFT, modifiers: 0, shift: false }, + {type: KEY_DOWN, code: X11_KEY_ADD, modifiers: 0, shift: false }, + {type: KEY_UP, code: X11_KEY_ADD, modifiers: 0, shift: false }, + {type: KEY_UP, code: X11_KEY_SHIFT, modifiers: 0, shift: false }, + {type: KEY_DOWN, code: X11_KEY_ADD, modifiers: 0, shift: true }, + {type: KEY_UP, code: X11_KEY_ADD, modifiers: 0, shift: true }, + ] + } + ] + } + }, {tindex: 1, keyboardType: KEYBOARD_TYPE_JP, mappingTable: + // intialize keyboard mapping for RAW keyboard + {X11: [ + {keycode: JS_KEY_CAPSLOCK, entry : X11_KEY_CAPSLOCK}, + {keycode: JS_KEY_BACKSPACE, entry : X11_KEY_BACKSPACE}, + {keycode: JS_KEY_TAB, entry : X11_KEY_TAB}, + {keycode: JS_KEY_ENTER, entry : X11_KEY_ENTER}, + {keycode: JS_KEY_ESCAPE, entry : X11_KEY_ESCAPE}, + {keycode: JS_KEY_INSERT, entry : X11_KEY_INSERT}, + {keycode: JS_KEY_DELETE, entry : X11_KEY_DELETE}, + {keycode: JS_KEY_HOME, entry : X11_KEY_HOME}, + {keycode: JS_KEY_END, entry : X11_KEY_END}, + {keycode: JS_KEY_PAGEUP, entry : X11_KEY_PAGEUP}, + {keycode: JS_KEY_PAGEDOWN, entry : X11_KEY_PAGEDOWN}, + {keycode: JS_KEY_LEFT, entry : X11_KEY_LEFT}, + {keycode: JS_KEY_UP, entry : X11_KEY_UP}, + {keycode: JS_KEY_RIGHT, entry : X11_KEY_RIGHT}, + {keycode: JS_KEY_DOWN, entry : X11_KEY_DOWN}, + {keycode: JS_KEY_F1, entry : X11_KEY_F1}, + {keycode: JS_KEY_F2, entry : X11_KEY_F2}, + {keycode: JS_KEY_F3, entry : X11_KEY_F3}, + {keycode: JS_KEY_F4, entry : X11_KEY_F4}, + {keycode: JS_KEY_F5, entry : X11_KEY_F5}, + {keycode: JS_KEY_F6, entry : X11_KEY_F6}, + {keycode: JS_KEY_F7, entry : X11_KEY_F7}, + {keycode: JS_KEY_F8, entry : X11_KEY_F8}, + {keycode: JS_KEY_F9, entry : X11_KEY_F9}, + {keycode: JS_KEY_F10, entry : X11_KEY_F10}, + {keycode: JS_KEY_F11, entry : X11_KEY_F11}, + {keycode: JS_KEY_F12, entry : X11_KEY_F12}, + {keycode: JS_KEY_SHIFT, entry : X11_KEY_SHIFT}, + {keycode: JS_KEY_CTRL, entry : X11_KEY_CTRL}, + {keycode: JS_KEY_ALT, entry : X11_KEY_ALT}, + {keycode: JS_KEY_GRAVE_ACCENT, entry : X11_KEY_GRAVE_ACCENT}, + {keycode: JS_KEY_SUBSTRACT, entry : X11_KEY_SUBSTRACT}, + {keycode: JS_KEY_ADD, entry : X11_KEY_ADD}, + {keycode: JS_KEY_OPEN_BRACKET, entry : X11_KEY_OPEN_BRACKET}, + {keycode: JS_KEY_CLOSE_BRACKET, entry : X11_KEY_CLOSE_BRACKET}, + {keycode: JS_KEY_BACK_SLASH, entry : X11_KEY_BACK_SLASH}, + {keycode: JS_KEY_SINGLE_QUOTE, entry : X11_KEY_SINGLE_QUOTE}, + {keycode: JS_KEY_COMMA, entry : X11_KEY_COMMA}, + {keycode: JS_KEY_PERIOD, entry : X11_KEY_PERIOD}, + {keycode: JS_KEY_FORWARD_SLASH, entry : X11_KEY_FORWARD_SLASH}, + {keycode: JS_KEY_DASH, entry : X11_KEY_DASH}, + {keycode: JS_KEY_SEMI_COLON, entry : X11_KEY_SEMI_COLON}, + {keycode: JS_KEY_NUMPAD0, entry : X11_KEY_NUMPAD0}, + {keycode: JS_KEY_NUMPAD1, entry : X11_KEY_NUMPAD1}, + {keycode: JS_KEY_NUMPAD2, entry : X11_KEY_NUMPAD2}, + {keycode: JS_KEY_NUMPAD3, entry : X11_KEY_NUMPAD3}, + {keycode: JS_KEY_NUMPAD4, entry : X11_KEY_NUMPAD4}, + {keycode: JS_KEY_NUMPAD5, entry : X11_KEY_NUMPAD5}, + {keycode: JS_KEY_NUMPAD6, entry : X11_KEY_NUMPAD6}, + {keycode: JS_KEY_NUMPAD7, entry : X11_KEY_NUMPAD7}, + {keycode: JS_KEY_NUMPAD8, entry : X11_KEY_NUMPAD8}, + {keycode: JS_KEY_NUMPAD9, entry : X11_KEY_NUMPAD9}, + {keycode: JS_KEY_DECIMAL_POINT, entry : X11_KEY_DECIMAL_POINT}, + {keycode: JS_KEY_DIVIDE, entry : X11_KEY_DIVIDE}, + {keycode: JS_KEY_MULTIPLY, entry : [ + {type: KEY_DOWN, code: X11_KEY_SHIFT, modifiers: 0 }, + {type: KEY_DOWN, code: X11_KEY_ASTERISK, modifiers: 0 }, + {type: KEY_UP, code: X11_KEY_ASTERISK, modifiers: 0 }, + {type: KEY_UP, code: X11_KEY_SHIFT, modifiers: 0 } + ]}, + {keycode: JS_KEY_ADD, entry : false} + ], + keyPress: [ + {keycode: 61, entry: [ + {type: KEY_DOWN, code: X11_KEY_ADD, modifiers: 0, shift: false }, + {type: KEY_UP, code: X11_KEY_ADD, modifiers: 0, shift: false } + ]}, + {keycode: 43, entry: [ + {type: KEY_DOWN, code: X11_KEY_SHIFT, modifiers: 0, shift: false }, + {type: KEY_DOWN, code: X11_KEY_ADD, modifiers: 0, shift: false }, + {type: KEY_UP, code: X11_KEY_ADD, modifiers: 0, shift: false }, + {type: KEY_UP, code: X11_KEY_SHIFT, modifiers: 0, shift: false }, + {type: KEY_DOWN, code: X11_KEY_ADD, modifiers: 0, shift: true }, + {type: KEY_UP, code: X11_KEY_ADD, modifiers: 0, shift: true } + ]} + ] + } + }, {tindex: 2, keyboardType: KEYBOARD_TYPE_UK, mappingTable: + {X11: [], + keyPress: [ + //[34 = "] + {keycode: 34, entry: + [{type : KEY_DOWN, code : 0x40, modifiers : 64, shift : true}] + }, + //[35 = #] + {keycode: 35, entry: + [{type : KEY_DOWN, code : 0x5c, modifiers : 0, shift : false}] + }, + // [64 = @] + {keycode: 64, entry: + [{type : KEY_DOWN, code : 0x22, modifiers : 64, shift : true}] + }, + // [92 = \] + {keycode: 92, entry: + [{type : KEY_DOWN, code : 0xa6, modifiers : 0, shift : false}] + }, + // [126 = ~] + {keycode: 126, entry: + [{type : KEY_DOWN, code : 0x7c, modifiers : 64, shift : true}] + }, + // [163 = £] + {keycode: 163, entry: + [{type : KEY_DOWN, code : 0x23, modifiers : 64, shift : true}] + }, + // [172 = ¬] + {keycode: 172, entry: + [{type : KEY_DOWN, code : 0x7e, modifiers : 64, shift : true}] + }, + // [166 = ¦] + {keycode: 166, entry: + [{type : KEY_DOWN, code : 0x60, modifiers : 896, shift : false}] + } + ] + } + }] diff --git a/services/console-proxy/server/js/ajaxviewer.js b/services/console-proxy/server/js/ajaxviewer.js index e95615d8946..a6e1edafaea 100644 --- a/services/console-proxy/server/js/ajaxviewer.js +++ b/services/console-proxy/server/js/ajaxviewer.js @@ -99,92 +99,13 @@ function KeyboardMapper() { // KeyboardMapper.KEYBOARD_TYPE_RAW = 0; KeyboardMapper.KEYBOARD_TYPE_COOKED = 1; +KeyboardMapper.KEYBOARD_TYPE_UK = 2; KeyboardMapper.prototype = { - + setKeyboardType : function(keyboardType) { this.keyboardType = keyboardType; - - if(keyboardType == KeyboardMapper.KEYBOARD_TYPE_RAW) { - // intialize keyboard mapping for RAW keyboard - this.jsX11KeysymMap[AjaxViewer.JS_KEY_CAPSLOCK] = AjaxViewer.X11_KEY_CAPSLOCK; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_BACKSPACE] = AjaxViewer.X11_KEY_BACKSPACE; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_TAB] = AjaxViewer.X11_KEY_TAB; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_ENTER] = AjaxViewer.X11_KEY_ENTER; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_ESCAPE] = AjaxViewer.X11_KEY_ESCAPE; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_INSERT] = AjaxViewer.X11_KEY_INSERT; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_DELETE] = AjaxViewer.X11_KEY_DELETE; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_HOME] = AjaxViewer.X11_KEY_HOME; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_END] = AjaxViewer.X11_KEY_END; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_PAGEUP] = AjaxViewer.X11_KEY_PAGEUP; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_PAGEDOWN] = AjaxViewer.X11_KEY_PAGEDOWN; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_LEFT] = AjaxViewer.X11_KEY_LEFT; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_UP] = AjaxViewer.X11_KEY_UP; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_RIGHT] = AjaxViewer.X11_KEY_RIGHT; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_DOWN] = AjaxViewer.X11_KEY_DOWN; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_F1] = AjaxViewer.X11_KEY_F1; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_F2] = AjaxViewer.X11_KEY_F2; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_F3] = AjaxViewer.X11_KEY_F3; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_F4] = AjaxViewer.X11_KEY_F4; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_F5] = AjaxViewer.X11_KEY_F5; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_F6] = AjaxViewer.X11_KEY_F6; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_F7] = AjaxViewer.X11_KEY_F7; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_F8] = AjaxViewer.X11_KEY_F8; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_F9] = AjaxViewer.X11_KEY_F9; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_F10] = AjaxViewer.X11_KEY_F10; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_F11] = AjaxViewer.X11_KEY_F11; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_F12] = AjaxViewer.X11_KEY_F12; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_SHIFT] = AjaxViewer.X11_KEY_SHIFT; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_CTRL] = AjaxViewer.X11_KEY_CTRL; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_ALT] = AjaxViewer.X11_KEY_ALT; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_GRAVE_ACCENT] = AjaxViewer.X11_KEY_GRAVE_ACCENT; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_SUBSTRACT] = AjaxViewer.X11_KEY_SUBSTRACT; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_ADD] = AjaxViewer.X11_KEY_ADD; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_OPEN_BRACKET] = AjaxViewer.X11_KEY_OPEN_BRACKET; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_CLOSE_BRACKET] = AjaxViewer.X11_KEY_CLOSE_BRACKET; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_BACK_SLASH] = AjaxViewer.X11_KEY_BACK_SLASH; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_SINGLE_QUOTE] = AjaxViewer.X11_KEY_SINGLE_QUOTE; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_COMMA] = AjaxViewer.X11_KEY_COMMA; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_PERIOD] = AjaxViewer.X11_KEY_PERIOD; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_FORWARD_SLASH] = AjaxViewer.X11_KEY_FORWARD_SLASH; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_DASH] = AjaxViewer.X11_KEY_DASH; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_SEMI_COLON] = AjaxViewer.X11_KEY_SEMI_COLON; - - this.jsX11KeysymMap[AjaxViewer.JS_KEY_NUMPAD0] = AjaxViewer.X11_KEY_NUMPAD0; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_NUMPAD1] = AjaxViewer.X11_KEY_NUMPAD1; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_NUMPAD2] = AjaxViewer.X11_KEY_NUMPAD2; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_NUMPAD3] = AjaxViewer.X11_KEY_NUMPAD3; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_NUMPAD4] = AjaxViewer.X11_KEY_NUMPAD4; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_NUMPAD5] = AjaxViewer.X11_KEY_NUMPAD5; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_NUMPAD6] = AjaxViewer.X11_KEY_NUMPAD6; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_NUMPAD7] = AjaxViewer.X11_KEY_NUMPAD7; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_NUMPAD8] = AjaxViewer.X11_KEY_NUMPAD8; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_NUMPAD9] = AjaxViewer.X11_KEY_NUMPAD9; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_DECIMAL_POINT] = AjaxViewer.X11_KEY_DECIMAL_POINT; - this.jsX11KeysymMap[AjaxViewer.JS_KEY_DIVIDE] = AjaxViewer.X11_KEY_DIVIDE; - - this.jsX11KeysymMap[AjaxViewer.JS_KEY_MULTIPLY] = [ - {type: AjaxViewer.KEY_DOWN, code: AjaxViewer.X11_KEY_SHIFT, modifiers: 0 }, - {type: AjaxViewer.KEY_DOWN, code: AjaxViewer.X11_KEY_ASTERISK, modifiers: 0 }, - {type: AjaxViewer.KEY_UP, code: AjaxViewer.X11_KEY_ASTERISK, modifiers: 0 }, - {type: AjaxViewer.KEY_UP, code: AjaxViewer.X11_KEY_SHIFT, modifiers: 0 } - ]; - - this.jsX11KeysymMap[AjaxViewer.JS_KEY_ADD] = false; - this.jsKeyPressX11KeysymMap = []; - this.jsKeyPressX11KeysymMap[61] = [ - {type: AjaxViewer.KEY_DOWN, code: AjaxViewer.X11_KEY_ADD, modifiers: 0, shift: false }, - {type: AjaxViewer.KEY_UP, code: AjaxViewer.X11_KEY_ADD, modifiers: 0, shift: false } - ]; - this.jsKeyPressX11KeysymMap[43] = [ - {type: AjaxViewer.KEY_DOWN, code: AjaxViewer.X11_KEY_SHIFT, modifiers: 0, shift: false }, - {type: AjaxViewer.KEY_DOWN, code: AjaxViewer.X11_KEY_ADD, modifiers: 0, shift: false }, - {type: AjaxViewer.KEY_UP, code: AjaxViewer.X11_KEY_ADD, modifiers: 0, shift: false }, - {type: AjaxViewer.KEY_UP, code: AjaxViewer.X11_KEY_SHIFT, modifiers: 0, shift: false }, - {type: AjaxViewer.KEY_DOWN, code: AjaxViewer.X11_KEY_ADD, modifiers: 0, shift: true }, - {type: AjaxViewer.KEY_UP, code: AjaxViewer.X11_KEY_ADD, modifiers: 0, shift: true } - ]; - } else { + if(keyboardType == KeyboardMapper.KEYBOARD_TYPE_COOKED || keyboardType == KeyboardMapper.KEYBOARD_TYPE_UK) { // initialize mapping for COOKED keyboard this.jsX11KeysymMap[AjaxViewer.JS_KEY_CAPSLOCK] = AjaxViewer.X11_KEY_CAPSLOCK; this.jsX11KeysymMap[AjaxViewer.JS_KEY_BACKSPACE] = AjaxViewer.X11_KEY_BACKSPACE; @@ -325,7 +246,6 @@ KeyboardMapper.prototype = { // ENTER/BACKSPACE key should already have been sent through KEY DOWN/KEY UP event if(code == AjaxViewer.JS_KEY_ENTER || code == AjaxViewer.JS_KEY_BACKSPACE) return; - if(code > 0) { var X11Keysym = code; X11Keysym = this.jsKeyPressX11KeysymMap[code]; @@ -475,6 +395,7 @@ AjaxViewer.STATUS_SENDING = 3; AjaxViewer.STATUS_SENT = 4; AjaxViewer.KEYBOARD_TYPE_ENGLISH = "us"; +AjaxViewer.KEYBOARD_TYPE_UK_ENGLISH = "uk"; AjaxViewer.KEYBOARD_TYPE_JAPANESE = "jp"; AjaxViewer.JS_KEY_BACKSPACE = 8; @@ -736,6 +657,10 @@ AjaxViewer.prototype = { this.keyboardMappers[AjaxViewer.KEYBOARD_TYPE_ENGLISH] = mapper; mapper.setKeyboardType(KeyboardMapper.KEYBOARD_TYPE_COOKED); + var mapper = new KeyboardMapper(); + this.keyboardMappers[AjaxViewer.KEYBOARD_TYPE_UK_ENGLISH] = mapper; + mapper.setKeyboardType(KeyboardMapper.KEYBOARD_TYPE_UK); + mapper = new KeyboardMapper(); this.keyboardMappers[AjaxViewer.KEYBOARD_TYPE_JAPANESE] = mapper; mapper.setKeyboardType(KeyboardMapper.KEYBOARD_TYPE_RAW); @@ -795,25 +720,25 @@ AjaxViewer.prototype = { */ // create the mapping table based on the tables input - if (keyboardTables != undefined ) { + if (keyboardTables != undefined ) { - for(var i = 0; i < keyboardTables.length; i++) { - var mappingTbl = keyboardTables[i]; - var mappings = mappingTbl.mappingTable; - var x11Maps = mappings.X11; - for (var j = 0; j < x11Maps.length; j++) { - var code = x11Maps[j].keycode; - var mappedEntry = x11Maps[j].entry; - mapper.jsX11KeysymMap[code] = mappedEntry; + for(var i = 0; i < keyboardTables.length; i++) { + var mappingTbl = keyboardTables[i]; + var keyboardType = mappingTbl.keyboardType; + var mappings = mappingTbl.mappingTable; + var x11Maps = mappings.X11; + for (var j = 0; j < x11Maps.length; j++) { + var code = x11Maps[j].keycode; + var mappedEntry = x11Maps[j].entry; + this.keyboardMappers[keyboardType].jsX11KeysymMap[code] = mappedEntry; + } + var keyPressMaps = mappings.keyPress; + for (var j = 0; j < keyPressMaps.length; j++) { + var code = keyPressMaps[j].keycode; + var mappedEntry = keyPressMaps[j].entry; + this.keyboardMappers[keyboardType].jsKeyPressX11KeysymMap[code] = mappedEntry; + } } - var keyPressMaps = mappings.keyPress; - for (var j = 0; j < keyPressMaps.length; j++) { - var code = keyPressMaps[j].keycode; - var mappedEntry = keyPressMaps[j].entry; - mapper.jsKeyPressX11KeysymMap[code] = mappedEntry; - } - - } } }, // end of the setupKeyboardTranslationTable function @@ -867,6 +792,9 @@ AjaxViewer.prototype = { } else if(cmd == "keyboard_us") { $("#toolbar").find(".pulldown").find("ul").hide(); this.currentKeyboard = AjaxViewer.KEYBOARD_TYPE_ENGLISH; + } else if(cmd == "keyboard_uk") { + $("#toolbar").find(".pulldown").find("ul").hide(); + this.currentKeyboard = AjaxViewer.KEYBOARD_TYPE_UK_ENGLISH; } else if(cmd == "sendCtrlAltDel") { this.sendKeyboardEvent(AjaxViewer.KEY_DOWN, 0xffe9, 0); // X11 Alt this.sendKeyboardEvent(AjaxViewer.KEY_DOWN, 0xffe3, 0); // X11 Ctrl diff --git a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyClientBase.java b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyClientBase.java index 289bdab2f8a..f4c912a9e53 100644 --- a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyClientBase.java +++ b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyClientBase.java @@ -329,6 +329,7 @@ public abstract class ConsoleProxyClientBase implements ConsoleProxyClient, Cons "", "", "
  • ", From 5ef2f1f26fcd159cb48b25882ea10cb3fc44d1b9 Mon Sep 17 00:00:00 2001 From: Sangeetha Hariharan Date: Fri, 3 May 2013 17:02:32 -0700 Subject: [PATCH 54/66] CLOUDSTACK-2329, CLOUDSTACK-1820: Tests for regions Marvin tests and corresponding library changes for the regions feature. Signed-off-by: Prasanna Santhanam --- test/integration/component/test_regions.py | 443 ++++++++++++++++++++ tools/marvin/marvin/integration/lib/base.py | 54 +++ 2 files changed, 497 insertions(+) create mode 100644 test/integration/component/test_regions.py diff --git a/test/integration/component/test_regions.py b/test/integration/component/test_regions.py new file mode 100644 index 00000000000..1b24871ce4c --- /dev/null +++ b/test/integration/component/test_regions.py @@ -0,0 +1,443 @@ +#!/usr/bin/env python +# 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. + +from marvin.cloudstackTestCase import * +from marvin.cloudstackAPI import * +from marvin.integration.lib.utils import * +from marvin.integration.lib.base import * +from marvin.integration.lib.common import * +from marvin import remoteSSHClient +from nose.plugins.attrib import attr + +class Services: + """ + """ + + def __init__(self): + self.services = { + "domain": { + "name": "testuuid", + "domainUUID": "domain1" + }, + "account": { + "email": "test@test.com", + "firstname": "Testuuid", + "lastname": "Useruuid", + "username": "test", + # Random characters are appended for unique + # username + "password": "password", + "accountUUID": "account1", + "userUUID": "user1" + }, + "user": { + "email": "test@test.com", + "firstname": "Testuuid", + "lastname": "Useruuid", + "username": "test", + # Random characters are appended for unique + # username + "password": "password", + "userUUID": "user2" + }, + "ostype": 'CentOS 5.3 (64-bit)', + "region": { + "regionid": "2", + "regionname": "Region2", + "regionendpoint": "http://region2:8080/client" + } + } + + +class TestRegions(cloudstackTestCase): + """ + Testing Regions related Apis + """ + @classmethod + def setUpClass(cls): + cls.api_client = super(TestRegions, cls).getClsTestClient().getApiClient() + cls.services = Services().services + cls.domain = get_domain(cls.api_client, cls.services) + cls.cleanup = [] + return + + @attr(tags=["basic", "advanced"]) + def test_createAccountWithUUID(self): + """ + Test for creating Account by passing id parameter + + # Validate the following + # 1.Create an Account by passing id parameter.Verify the account is created. + # 2.List this account by passing id parameter.Verify that list account is able to lis this account. + # 3.Delete account should succeed. + + """ + account = Account.create( + self.api_client, + self.services["account"], + domainid=self.domain.id + ) + self.assertIn ( self.services["account"]["accountUUID"] , account.id, + "Account is not created with the accountId passed") + + list_account = Account.list(self.api_client, + id=account.id + ) + + self.assertEqual( + isinstance(list_account, list), + True, + "Check for list account response by uuid failed" + ) + + print (list_account) + + account_response = list_account[0] + + print (account_response) + + self.assertEqual( account_response.id, + account.id, + "listAccount response does not match with account Id " + ) + self.assertEqual( + account_response.user[0].firstname, + self.services["account"]["firstname"], + "listAccount response does not match with account firstname" + ) + + self.cleanup.append(account) + return + + @attr(tags=["basic", "advanced"]) + def test_createUserWithUUID(self): + """ + Test for creating User by passing id parameter + + # Validate the following + # 1.Create a User by passing id parameter.Verify the user is created. + # 2.List this user by passing id parameter.Verify that list user is able to list this user. + # 3.Delete User should succeed. + + """ + + user = User.create( + self.api_client, + self.services["user"], + account="Admin", + domainid=self.domain.id + ) + self.assertIn ( self.services["user"]["userUUID"] , user.id, + "User is not created successfully with the userId passed") + + list_user = User.list(self.api_client, + id=user.id + ) + + self.assertEqual( + isinstance(list_user, list), + True, + "Check for list user response by uuid failed" + ) + + + user_response = list_user[0] + + + self.assertEqual( user_response.id, + user.id, + "list User response does not match with user Id " + ) + self.assertEqual( + user_response.firstname, + self.services["user"]["firstname"], + "listUser response does not match with user firstname" + ) + + user.delete(self.api_client) + + list_user = User.list(self.api_client, + id=user.id + ) + + self.assertIsNone( + list_user, + "Deletion of user failed" + ) + + + return + + @attr(tags=["basic", "advanced"]) + def test_createdomainWithUUID(self): + """ + Test for creating Domain by passing id parameter + + # Validate the following + # 1.Create a domain by passing id parameter.Verify the domain is created. + # 2.List this domain by passing id parameter.Verify that list domain is able to list this domain. + # 3.Delete domain should succeed. + + """ + + domain = Domain.create( + self.api_client, + self.services["domain"] + ) + self.assertIn ( self.services["domain"]["domainUUID"] , domain.id, + "Domain is not created with the doaminId passed") + + list_domain = Domain.list(self.api_client, + id=domain.id + ) + + self.assertEqual( + isinstance(list_domain, list), + True, + "Check for list domain response by uuid failed" + ) + + + domain_response = list_domain[0] + + + self.assertEqual( domain_response.id, + domain.id, + "list domain response does not match with domain Id " + ) + self.assertIn( + self.services["domain"]["name"], + domain_response.name, + "list domaiin response does not match with user firstname" + ) + try: + domain.delete(self.api_client) + except Exception as e: + self.fail("Failed to delete domain: %s" % e) + + return + + @attr(tags=["basic", "advanced"]) + def test_createRegion(self): + """ + Test for add Region + """ + + region = Region.create(self.api_client, + self.services["region"] + ) + + list_region = Region.list(self.api_client, + id=self.services["region"]["regionid"] + ) + + self.assertEqual( + isinstance(list_region, list), + True, + "Check for list Region response" + ) + region_response = list_region[0] + + print (region_response) + print (self.services["region"]) + + self.assertEqual( + str(region_response.id), + self.services["region"]["regionid"], + "listRegion response does not match with region Id created" + ) + + self.assertEqual( + region_response.name, + self.services["region"]["regionname"], + "listRegion response does not match with region name created" + ) + self.assertEqual( + region_response.endpoint, + self.services["region"]["regionendpoint"], + "listRegion response does not match with region endpoint created" + ) + + region = region.delete(self.api_client) + + return + + @attr(tags=["basic", "advanced"]) + def test_createDupRegion(self): + """ + Test for duplicate checks on id and name parameters when adding regions + """ + + self.services["region"]["regionid"]="5" + self.services["region"]["regionname"]="Region5" + self.services["region"]["regionendpoint"]="http://region5:8080/client" + + + region = Region.create(self.api_client, + self.services["region"] + ) + + list_region = Region.list(self.api_client, + id=self.services["region"]["regionid"] + ) + + self.assertEqual( + isinstance(list_region, list), + True + ) + """ + Creating regions with duplicate id should not be allowed + """ + + self.services["region"]["regionid"]="5" + self.services["region"]["regionname"]="Region51" + self.services["region"]["regionendpoint"]="http://region51:8080/client" + + try: + region = Region.create(self.api_client, + self.services["region"] + ) + self.assertIsNone(region, + "Creating regions with duplicate id is allowed" + ) + except: + print " Creating Region with duplicate Id is not allowed" + pass + + """ + Creating regions with duplicate name should not be allowed + """ + + self.services["region"]["regionid"]="51" + self.services["region"]["regionname"]="Region5" + self.services["region"]["regionendpoint"]="http://region51:8080/client" + + try: + region = Region.create(self.api_client, + self.services["region"] + ) + except: + print " Creating Region with duplicate Name is not allowed" + pass + + region.delete(self.api_client) + + return + + @attr(tags=["basic", "advanced"]) + def test_updateRegion(self): + """ + Test for update Region + """ + + self.services["region"]["regionid"]="3" + self.services["region"]["regionname"]="Region3" + self.services["region"]["regionendpoint"]="http://region3:8080/client" + region = Region.create(self.api_client, + self.services["region"] + ) + + self.services["region"]["regionname"]="Region3upd" + self.services["region"]["regionendpoint"]="http://region3upd:8080/client" + + updated_region = region.update(self.api_client, + self.services["region"] + ) + + list_region = Region.list(self.api_client, + id=self.services["region"]["regionid"] + ) + + self.assertEqual( + isinstance(list_region, list), + True, + "Check for list Region response" + ) + region_response = list_region[0] + + self.assertEqual( + str(region_response.id), + self.services["region"]["regionid"], + "listRegion response does not match with region Id created" + ) + + self.assertEqual( + region_response.name, + self.services["region"]["regionname"], + "listRegion response does not match with region name created" + ) + self.assertEqual( + region_response.endpoint, + self.services["region"]["regionendpoint"], + "listRegion response does not match with region endpoint created" + ) + + region.delete(self.api_client) + + return + + @attr(tags=["basic", "advanced"]) + def test_deleteRegion(self): + """ + Test for delete Region + """ + + self.services["region"]["regionid"]="4" + self.services["region"]["regionname"]="Region4" + self.services["region"]["regionendpoint"]="http://region4:8080/client" + + region = Region.create(self.api_client, + self.services["region"] + ) + + list_region = Region.list(self.api_client, + id=self.services["region"]["regionid"] + ) + + print (list_region); + + self.assertEqual( + len(list_region), + 1, + "Check for Region response" + ) + + region = region.delete(self.api_client) + + list_region = Region.list(self.api_client, + id=self.services["region"]["regionid"] + ) + + print (list_region); + + self.assertIsNone(list_region, + "Check for empty Region response" + ) + + return + + + @classmethod + def tearDown(cls): + + try: + cls.api_client = super(TestRegions, cls).getClsTestClient().getApiClient() + #Clean up + cleanup_resources(cls.api_client, cls.cleanup) + except Exception as e: + raise Exception("Warning: Exception during cleanup : %s" % e) diff --git a/tools/marvin/marvin/integration/lib/base.py b/tools/marvin/marvin/integration/lib/base.py index 92b8a2d1e10..899c203d87e 100755 --- a/tools/marvin/marvin/integration/lib/base.py +++ b/tools/marvin/marvin/integration/lib/base.py @@ -40,6 +40,9 @@ class Domain: cmd = createDomain.createDomainCmd() + if "domainUUID" in services: + cmd.domainid = "-".join([services["domainUUID"],random_gen()]) + if name: cmd.name = "-".join([name, random_gen()]) elif "name" in services: @@ -97,6 +100,13 @@ class Account: cmd.password = services["password"] cmd.username = "-".join([services["username"], random_gen()]) + if "accountUUID" in services: + cmd.accountid = "-".join([services["accountUUID"],random_gen()]) + + if "userUUID" in services: + cmd.userid = "-".join([services["userUUID"],random_gen()]) + + if domainid: cmd.domainid = domainid account = apiclient.createAccount(cmd) @@ -135,6 +145,9 @@ class User: cmd.firstname = services["firstname"] cmd.lastname = services["lastname"] + if "userUUID" in services: + cmd.userid = "-".join([services["userUUID"],random_gen()]) + # Password Encoding mdf = hashlib.md5() mdf.update(services["password"]) @@ -3108,3 +3121,44 @@ class VmSnapshot: cmd.vmsnapshotid = vmsnapshotid return apiclient.deleteVMSnapshot(cmd) + +class Region: + """ Regions related Api """ + def __init__(self, items): + self.__dict__.update(items) + + @classmethod + def create(cls, apiclient, services): + cmd = addRegion.addRegionCmd() + cmd.id = services["regionid"] + cmd.endpoint = services["regionendpoint"] + cmd.name = services["regionname"] + try: + region = apiclient.addRegion(cmd) + if region is not None: + return Region(region.__dict__) + except Exception as e: + raise e + + @classmethod + def list(cls, apiclient, **kwargs): + cmd = listRegions.listRegionsCmd() + [setattr(cmd, k, v) for k, v in kwargs.items()] + region = apiclient.listRegions(cmd) + return region + + def update(self, apiclient, services): + cmd = updateRegion.updateRegionCmd() + cmd.id = self.id + if services["regionendpoint"]: + cmd.endpoint = services["regionendpoint"] + if services["regionname"]: + cmd.name = services["regionname"] + region = apiclient.updateRegion(cmd) + return region + + def delete(self, apiclient): + cmd = removeRegion.removeRegionCmd() + cmd.id = self.id + region = apiclient.removeRegion(cmd) + return region From 548a8d8c1f391812bb492b42704d21dd99ac59b7 Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Wed, 8 May 2013 12:39:34 +0530 Subject: [PATCH 55/66] Breaking down region tests region tests will be run in smoke and regression. In smoke we only test the basic creation of a region. More extensive testing of duplicate regions, test for updating region atteributes is in component. Separated the class for testing accounts within region (account sync) into a a new suite. Signed-off-by: Prasanna Santhanam --- test/integration/component/test_regions.py | 471 ++++-------------- .../component/test_regions_accounts.py | 206 ++++++++ test/integration/smoke/test_regions.py | 93 ++++ tools/marvin/marvin/integration/lib/base.py | 8 +- 4 files changed, 387 insertions(+), 391 deletions(-) create mode 100644 test/integration/component/test_regions_accounts.py create mode 100644 test/integration/smoke/test_regions.py diff --git a/test/integration/component/test_regions.py b/test/integration/component/test_regions.py index 1b24871ce4c..daf16cd1f44 100644 --- a/test/integration/component/test_regions.py +++ b/test/integration/component/test_regions.py @@ -21,423 +21,120 @@ from marvin.cloudstackAPI import * from marvin.integration.lib.utils import * from marvin.integration.lib.base import * from marvin.integration.lib.common import * -from marvin import remoteSSHClient from nose.plugins.attrib import attr +from random import choice class Services: - """ - """ - def __init__(self): self.services = { - "domain": { - "name": "testuuid", - "domainUUID": "domain1" - }, - "account": { - "email": "test@test.com", - "firstname": "Testuuid", - "lastname": "Useruuid", - "username": "test", - # Random characters are appended for unique - # username - "password": "password", - "accountUUID": "account1", - "userUUID": "user1" - }, - "user": { - "email": "test@test.com", - "firstname": "Testuuid", - "lastname": "Useruuid", - "username": "test", - # Random characters are appended for unique - # username - "password": "password", - "userUUID": "user2" - }, - "ostype": 'CentOS 5.3 (64-bit)', - "region": { - "regionid": "2", - "regionname": "Region2", - "regionendpoint": "http://region2:8080/client" - } + "region": { + "regionid": "2", + "regionname": "Region2", + "regionendpoint": "http://region2:8080/client" + } } - class TestRegions(cloudstackTestCase): + """Test Regions - CRUD tests for regions """ - Testing Regions related Apis - """ + @classmethod def setUpClass(cls): cls.api_client = super(TestRegions, cls).getClsTestClient().getApiClient() cls.services = Services().services - cls.domain = get_domain(cls.api_client, cls.services) - cls.cleanup = [] + cls.domain = get_domain(cls.api_client, cls.services) + cls.cleanup = [] return - @attr(tags=["basic", "advanced"]) - def test_createAccountWithUUID(self): - """ - Test for creating Account by passing id parameter + def setUp(self): + pseudo_random_int = choice(xrange(1, 200)) + self.services["region"]["regionid"] = pseudo_random_int + self.services["region"]["regionname"] = "region" + str(pseudo_random_int) + self.services["region"]["regionendpoint"] = "http://region" + str(pseudo_random_int) + ":8080/client" - # Validate the following - # 1.Create an Account by passing id parameter.Verify the account is created. - # 2.List this account by passing id parameter.Verify that list account is able to lis this account. - # 3.Delete account should succeed. - - """ - account = Account.create( - self.api_client, - self.services["account"], - domainid=self.domain.id - ) - self.assertIn ( self.services["account"]["accountUUID"] , account.id, - "Account is not created with the accountId passed") - - list_account = Account.list(self.api_client, - id=account.id - ) - - self.assertEqual( - isinstance(list_account, list), - True, - "Check for list account response by uuid failed" - ) - - print (list_account) - - account_response = list_account[0] - - print (account_response) - - self.assertEqual( account_response.id, - account.id, - "listAccount response does not match with account Id " - ) - self.assertEqual( - account_response.user[0].firstname, - self.services["account"]["firstname"], - "listAccount response does not match with account firstname" - ) - - self.cleanup.append(account) - return - - @attr(tags=["basic", "advanced"]) - def test_createUserWithUUID(self): - """ - Test for creating User by passing id parameter - - # Validate the following - # 1.Create a User by passing id parameter.Verify the user is created. - # 2.List this user by passing id parameter.Verify that list user is able to list this user. - # 3.Delete User should succeed. - - """ - - user = User.create( - self.api_client, - self.services["user"], - account="Admin", - domainid=self.domain.id - ) - self.assertIn ( self.services["user"]["userUUID"] , user.id, - "User is not created successfully with the userId passed") - - list_user = User.list(self.api_client, - id=user.id - ) - - self.assertEqual( - isinstance(list_user, list), - True, - "Check for list user response by uuid failed" - ) - - - user_response = list_user[0] - - - self.assertEqual( user_response.id, - user.id, - "list User response does not match with user Id " - ) - self.assertEqual( - user_response.firstname, - self.services["user"]["firstname"], - "listUser response does not match with user firstname" - ) - - user.delete(self.api_client) - - list_user = User.list(self.api_client, - id=user.id - ) - - self.assertIsNone( - list_user, - "Deletion of user failed" - ) - - - return - - @attr(tags=["basic", "advanced"]) - def test_createdomainWithUUID(self): - """ - Test for creating Domain by passing id parameter - - # Validate the following - # 1.Create a domain by passing id parameter.Verify the domain is created. - # 2.List this domain by passing id parameter.Verify that list domain is able to list this domain. - # 3.Delete domain should succeed. - - """ - - domain = Domain.create( - self.api_client, - self.services["domain"] - ) - self.assertIn ( self.services["domain"]["domainUUID"] , domain.id, - "Domain is not created with the doaminId passed") - - list_domain = Domain.list(self.api_client, - id=domain.id - ) - - self.assertEqual( - isinstance(list_domain, list), - True, - "Check for list domain response by uuid failed" - ) - - - domain_response = list_domain[0] - - - self.assertEqual( domain_response.id, - domain.id, - "list domain response does not match with domain Id " - ) - self.assertIn( - self.services["domain"]["name"], - domain_response.name, - "list domaiin response does not match with user firstname" - ) - try: - domain.delete(self.api_client) - except Exception as e: - self.fail("Failed to delete domain: %s" % e) - - return - - @attr(tags=["basic", "advanced"]) - def test_createRegion(self): - """ - Test for add Region - """ - - region = Region.create(self.api_client, + self.region = Region.create(self.api_client, self.services["region"] - ) + ) + self.cleanup = [] + self.cleanup.append(self.region) - list_region = Region.list(self.api_client, + list_region = Region.list(self.api_client, id=self.services["region"]["regionid"] - ) - - self.assertEqual( - isinstance(list_region, list), - True, - "Check for list Region response" - ) - region_response = list_region[0] - - print (region_response) - print (self.services["region"]) + ) self.assertEqual( - str(region_response.id), - self.services["region"]["regionid"], - "listRegion response does not match with region Id created" - ) + isinstance(list_region, list), + True, + msg="Region creation failed" + ) - self.assertEqual( - region_response.name, - self.services["region"]["regionname"], - "listRegion response does not match with region name created" - ) - self.assertEqual( - region_response.endpoint, - self.services["region"]["regionendpoint"], - "listRegion response does not match with region endpoint created" - ) - - region = region.delete(self.api_client) - - return - - @attr(tags=["basic", "advanced"]) - def test_createDupRegion(self): - """ - Test for duplicate checks on id and name parameters when adding regions - """ - - self.services["region"]["regionid"]="5" - self.services["region"]["regionname"]="Region5" - self.services["region"]["regionendpoint"]="http://region5:8080/client" - - - region = Region.create(self.api_client, - self.services["region"] - ) - - list_region = Region.list(self.api_client, - id=self.services["region"]["regionid"] - ) - - self.assertEqual( - isinstance(list_region, list), - True - ) - """ - Creating regions with duplicate id should not be allowed + @attr(tags=["simulator", "basic", "advanced"]) + def test_createRegionWithExistingRegionId(self): + """Test for duplicate checks on region id """ + self.services["region"]["regionname"] = random_gen() #alter region name but not id + self.assertRaises(Exception, Region.create, self.api_client, self.services["region"]) - self.services["region"]["regionid"]="5" - self.services["region"]["regionname"]="Region51" - self.services["region"]["regionendpoint"]="http://region51:8080/client" + @attr(tags=["simulator", "basic", "advanced"]) + def test_createRegionWithExistingRegionName(self): + """Test for duplicate checks on region name + """ + random_int = choice(xrange(1, 200)) + self.services["region"]["regionid"] = random_int #alter id but not name + self.services["region"]["regionendpoint"] = "http://region" + str(random_int) + ":8080/client" + self.assertRaises(Exception, Region.create, self.api_client, self.services["region"]) - try: - region = Region.create(self.api_client, - self.services["region"] - ) - self.assertIsNone(region, - "Creating regions with duplicate id is allowed" - ) - except: - print " Creating Region with duplicate Id is not allowed" - pass - - """ - Creating regions with duplicate name should not be allowed - """ - - self.services["region"]["regionid"]="51" - self.services["region"]["regionname"]="Region5" - self.services["region"]["regionendpoint"]="http://region51:8080/client" - - try: - region = Region.create(self.api_client, - self.services["region"] - ) - except: - print " Creating Region with duplicate Name is not allowed" - pass - - region.delete(self.api_client) - - return - - @attr(tags=["basic", "advanced"]) + @attr(tags=["simulator", "basic", "advanced"]) def test_updateRegion(self): - """ - Test for update Region - """ + """ Test for update Region + """ + self.services["region"]["regionname"] = "Region3" + random_gen() + self.services["region"]["regionendpoint"] = "http://region3updated:8080/client" - self.services["region"]["regionid"]="3" - self.services["region"]["regionname"]="Region3" - self.services["region"]["regionendpoint"]="http://region3:8080/client" - region = Region.create(self.api_client, - self.services["region"] - ) + updated_region = self.region.update(self.api_client, + self.services["region"] + ) - self.services["region"]["regionname"]="Region3upd" - self.services["region"]["regionendpoint"]="http://region3upd:8080/client" + list_region = Region.list(self.api_client, + id=self.services["region"]["regionid"] + ) - updated_region = region.update(self.api_client, - self.services["region"] - ) + self.assertEqual( + isinstance(list_region, list), + True, + "Check for list Region response" + ) + region_response = list_region[0] - list_region = Region.list(self.api_client, - id=self.services["region"]["regionid"] - ) + self.assertEqual( + region_response.id, + updated_region.id, + "listRegion response does not match with region Id created" + ) - self.assertEqual( - isinstance(list_region, list), - True, - "Check for list Region response" - ) - region_response = list_region[0] + self.assertEqual( + region_response.name, + updated_region.name, + "listRegion response does not match with region name created" + ) + self.assertEqual( + region_response.endpoint, + updated_region.endpoint, + "listRegion response does not match with region endpoint created" + ) - self.assertEqual( - str(region_response.id), - self.services["region"]["regionid"], - "listRegion response does not match with region Id created" - ) + def tearDown(self): + """ Test for delete region as cleanup + """ + try: + #Clean up + cleanup_resources(self.api_client, self.cleanup) + except Exception as e: + raise Exception("Warning: Exception during cleanup : %s" % e) - self.assertEqual( - region_response.name, - self.services["region"]["regionname"], - "listRegion response does not match with region name created" - ) - self.assertEqual( - region_response.endpoint, - self.services["region"]["regionendpoint"], - "listRegion response does not match with region endpoint created" - ) - - region.delete(self.api_client) - - return - - @attr(tags=["basic", "advanced"]) - def test_deleteRegion(self): - """ - Test for delete Region - """ - - self.services["region"]["regionid"]="4" - self.services["region"]["regionname"]="Region4" - self.services["region"]["regionendpoint"]="http://region4:8080/client" - - region = Region.create(self.api_client, - self.services["region"] - ) - - list_region = Region.list(self.api_client, - id=self.services["region"]["regionid"] - ) - - print (list_region); - - self.assertEqual( - len(list_region), - 1, - "Check for Region response" - ) - - region = region.delete(self.api_client) - - list_region = Region.list(self.api_client, - id=self.services["region"]["regionid"] - ) - - print (list_region); - - self.assertIsNone(list_region, - "Check for empty Region response" - ) - - return - - - @classmethod - def tearDown(cls): - - try: - cls.api_client = super(TestRegions, cls).getClsTestClient().getApiClient() - #Clean up - cleanup_resources(cls.api_client, cls.cleanup) - except Exception as e: - raise Exception("Warning: Exception during cleanup : %s" % e) + @classmethod + def tearDownClass(cls): + """ + Nothing to do + """ + pass diff --git a/test/integration/component/test_regions_accounts.py b/test/integration/component/test_regions_accounts.py new file mode 100644 index 00000000000..113f725f598 --- /dev/null +++ b/test/integration/component/test_regions_accounts.py @@ -0,0 +1,206 @@ +# 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. + +from marvin.cloudstackTestCase import * +from marvin.cloudstackAPI import * +from marvin.integration.lib.utils import * +from marvin.integration.lib.base import * +from marvin.integration.lib.common import * +from nose.plugins.attrib import attr + +class Services: + def __init__(self): + self.services = { + "domain": { + "name": "testuuid", + "domainUUID": "domain1" + }, + "account": { + "email": "test@test.com", + "firstname": "Testuuid", + "lastname": "Useruuid", + "username": "test", + "password": "password", + "accountUUID": "account1", + "userUUID": "user1" + }, + "user": { + "email": "test@test.com", + "firstname": "Testuuid", + "lastname": "Useruuid", + "username": "test", + "password": "password", + "userUUID": "user2" + }, + } + + +class TestRegionsAccounts(cloudstackTestCase): + """Test Accounts in Regions - CRUD tests for accounts in regions + """ + + @classmethod + def setUpClass(cls): + cls.api_client = super(TestRegionsAccounts, cls).getClsTestClient().getApiClient() + cls.services = Services().services + cls.domain = get_domain(cls.api_client, cls.services) + cls.cleanup = [] + return + + @attr(tags=["simulator", "basic", "advanced"]) + def test_createAccountWithUUID(self): + """Test for creating account by passing id parameter + + # Validate the following + # 1.Create an Account by passing id parameter.Verify the account is created. + # 2.List this account by passing id parameter.Verify that list account is able to lis this account. + # 3.Delete account should succeed. + """ + account = Account.create( + self.api_client, + self.services["account"], + domainid=self.domain.id + ) + self.assertIn(self.services["account"]["accountUUID"], account.id, + "Account is not created with the accountId passed") + + list_account = Account.list(self.api_client, + id=account.id) + + self.assertEqual( + isinstance(list_account, list), + True, + "Check for list account response by uuid failed" + ) + + account_response = list_account[0] + self.assertEqual(account_response.id, + account.id, + "listAccount response does not match with account Id " + ) + self.assertEqual( + account_response.user[0].firstname, + self.services["account"]["firstname"], + "listAccount response does not match with account firstname" + ) + + self.cleanup.append(account) + return + + @attr(tags=["simulator", "basic", "advanced"]) + def test_createUserWithUUID(self): + """Test for creating User by passing id parameter + + # Validate the following + # 1.Create a User by passing id parameter.Verify the user is created. + # 2.List this user by passing id parameter.Verify that list user is able to list this user. + # 3.Delete User should succeed. + """ + + user = User.create( + self.api_client, + self.services["user"], + account="admin", + domainid=self.domain.id + ) + self.assertIn(self.services["user"]["userUUID"], user.id, + "User is not created successfully with the userId passed") + + list_user = User.list(self.api_client, id=user.id) + + self.assertEqual( + isinstance(list_user, list), + True, + "Check for list user response by uuid failed" + ) + + user_response = list_user[0] + + self.assertEqual(user_response.id, + user.id, + "list User response does not match with user Id " + ) + self.assertEqual( + user_response.firstname, + self.services["user"]["firstname"], + "listUser response does not match with user firstname" + ) + + user.delete(self.api_client) + + list_user = User.list(self.api_client, + id=user.id + ) + + self.assertIsNone( + list_user, + "Deletion of user failed" + ) + return + + @attr(tags=["simulator", "basic", "advanced"]) + def test_createdomainWithUUID(self): + """Test for creating Domain by passing id parameter + + # Validate the following + # 1.Create a domain by passing id parameter.Verify the domain is created. + # 2.List this domain by passing id parameter.Verify that list domain is able to list this domain. + # 3.Delete domain should succeed. + """ + + domain = Domain.create( + self.api_client, + self.services["domain"] + ) + + self.assertIn(self.services["domain"]["domainUUID"], domain.id, + "Domain is not created with the doaminId passed") + + list_domain = Domain.list(self.api_client, + id=domain.id + ) + + self.assertEqual( + isinstance(list_domain, list), + True, + "Check for list domain response by uuid failed" + ) + + domain_response = list_domain[0] + + self.assertEqual(domain_response.id, + domain.id, + "list domain response does not match with domain Id " + ) + self.assertIn( + self.services["domain"]["name"], + domain_response.name, + "list domaiin response does not match with user firstname" + ) + try: + domain.delete(self.api_client) + except Exception as e: + self.fail("Failed to delete domain: %s" % e) + return + + @classmethod + def tearDownClass(cls): + try: + #Clean up + cleanup_resources(cls.api_client, cls.cleanup) + except Exception as e: + raise Exception("Warning: Exception during cleanup : %s" % e) \ No newline at end of file diff --git a/test/integration/smoke/test_regions.py b/test/integration/smoke/test_regions.py new file mode 100644 index 00000000000..5d12e74e8dd --- /dev/null +++ b/test/integration/smoke/test_regions.py @@ -0,0 +1,93 @@ +# 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. + +from marvin.cloudstackTestCase import * +from marvin.cloudstackAPI import * +from marvin.integration.lib.utils import * +from marvin.integration.lib.base import * +from marvin.integration.lib.common import * +from nose.plugins.attrib import attr + +class Services: + def __init__(self): + self.services = { + "region": { + "regionid": "2", + "regionname": "Region2", + "regionendpoint": "http://region2:8080/client" + } + } + + +class TestRegions(cloudstackTestCase): + """Test Regions - basic region creation + """ + + @classmethod + def setUpClass(cls): + cls.api_client = super(TestRegions, cls).getClsTestClient().getApiClient() + cls.services = Services().services + cls.domain = get_domain(cls.api_client, cls.services) + cls.cleanup = [] + + @attr(tags=["simulator", "basic", "advanced"]) + def test_createRegion(self): + """ Test for create region + """ + region = Region.create(self.api_client, + self.services["region"] + ) + + list_region = Region.list(self.api_client, + id=self.services["region"]["regionid"] + ) + + self.assertEqual( + isinstance(list_region, list), + True, + "Check for list Region response" + ) + region_response = list_region[0] + + self.assertEqual( + str(region_response.id), + self.services["region"]["regionid"], + "listRegion response does not match with region Id created" + ) + + self.assertEqual( + region_response.name, + self.services["region"]["regionname"], + "listRegion response does not match with region name created" + ) + self.assertEqual( + region_response.endpoint, + self.services["region"]["regionendpoint"], + "listRegion response does not match with region endpoint created" + ) + self.cleanup.append(region) + return + + @classmethod + def tearDownClass(cls): + try: + #Clean up + cleanup_resources(cls.api_client, cls.cleanup) + list_region = Region.list(cls.api_client, id=cls.services["region"]["regionid"]) + assert list_region is None, "Region deletion fails" + except Exception as e: + raise Exception("Warning: Region cleanup/delete fails with : %s" % e) \ No newline at end of file diff --git a/tools/marvin/marvin/integration/lib/base.py b/tools/marvin/marvin/integration/lib/base.py index 899c203d87e..ecdc8412fdb 100755 --- a/tools/marvin/marvin/integration/lib/base.py +++ b/tools/marvin/marvin/integration/lib/base.py @@ -40,8 +40,8 @@ class Domain: cmd = createDomain.createDomainCmd() - if "domainUUID" in services: - cmd.domainid = "-".join([services["domainUUID"],random_gen()]) + if "domainUUID" in services: + cmd.domainid = "-".join([services["domainUUID"], random_gen()]) if name: cmd.name = "-".join([name, random_gen()]) @@ -3151,9 +3151,9 @@ class Region: cmd = updateRegion.updateRegionCmd() cmd.id = self.id if services["regionendpoint"]: - cmd.endpoint = services["regionendpoint"] + cmd.endpoint = services["regionendpoint"] if services["regionname"]: - cmd.name = services["regionname"] + cmd.name = services["regionname"] region = apiclient.updateRegion(cmd) return region From 93db64fc2531d72713c6b26d9e749f9aa6fd6640 Mon Sep 17 00:00:00 2001 From: Talluri Date: Wed, 8 May 2013 00:57:26 +0530 Subject: [PATCH 56/66] CLOUDSTACK-2359: fix missing network type in the test scripts test_volumes.py and test_templates.py Signed-off-by: Prasanna Santhanam --- test/integration/smoke/test_guest_vlan_range.py | 2 +- test/integration/smoke/test_templates.py | 1 + test/integration/smoke/test_volumes.py | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/test/integration/smoke/test_guest_vlan_range.py b/test/integration/smoke/test_guest_vlan_range.py index 13cf335b893..bd533430f51 100644 --- a/test/integration/smoke/test_guest_vlan_range.py +++ b/test/integration/smoke/test_guest_vlan_range.py @@ -44,7 +44,7 @@ class Services: "password": "password", }, "name": "testphysicalnetwork", - "vlan": "118-120", + "vlan": "2118-2120", } diff --git a/test/integration/smoke/test_templates.py b/test/integration/smoke/test_templates.py index fa4bc4014ec..b2ad4ca5634 100644 --- a/test/integration/smoke/test_templates.py +++ b/test/integration/smoke/test_templates.py @@ -292,6 +292,7 @@ class TestTemplates(cloudstackTestCase): # Get Zone, Domain and templates cls.domain = get_domain(cls.api_client, cls.services) cls.zone = get_zone(cls.api_client, cls.services) + cls.services['mode'] = cls.zone.networktype #populate second zone id for iso copy cmd = listZones.listZonesCmd() zones = cls.api_client.listZones(cmd) diff --git a/test/integration/smoke/test_volumes.py b/test/integration/smoke/test_volumes.py index ecac8c903c1..4bf8203e74c 100644 --- a/test/integration/smoke/test_volumes.py +++ b/test/integration/smoke/test_volumes.py @@ -287,6 +287,7 @@ class TestVolumes(cloudstackTestCase): # Get Zone, Domain and templates cls.domain = get_domain(cls.api_client, cls.services) cls.zone = get_zone(cls.api_client, cls.services) + cls.services['mode'] = cls.zone.networktype cls.disk_offering = DiskOffering.create( cls.api_client, cls.services["disk_offering"] From 8be304434e808660f17c5753abbf455a49ed7602 Mon Sep 17 00:00:00 2001 From: Talluri Date: Wed, 8 May 2013 02:41:02 +0530 Subject: [PATCH 57/66] CLOUDSTACK-2361: fix storage xenmotion test script Signed-off-by: Prasanna Santhanam --- .../component/test_storage_motion.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/test/integration/component/test_storage_motion.py b/test/integration/component/test_storage_motion.py index 086ec77b48d..c05d79e6861 100644 --- a/test/integration/component/test_storage_motion.py +++ b/test/integration/component/test_storage_motion.py @@ -98,16 +98,16 @@ class TestStorageMotion(cloudstackTestCase): # Get Zone, Domain and templates domain = get_domain(cls.api_client, cls.services) - zone = get_zone(cls.api_client, cls.services) + cls.zone = get_zone(cls.api_client, cls.services) cls.services['mode'] = cls.zone.networktype template = get_template( cls.api_client, - zone.id, + cls.zone.id, cls.services["ostype"] ) # Set Zones and disk offerings - cls.services["small"]["zoneid"] = zone.id + cls.services["small"]["zoneid"] = cls.zone.id cls.services["small"]["template"] = template.id # Create VMs, NAT Rules etc @@ -258,6 +258,17 @@ class TestStorageMotion(cloudstackTestCase): self.apiclient, id=volume.id ) + self.assertEqual( + isinstance(pools, list), + True, + "Check list storage pools response for valid list" + ) + self.assertNotEqual( + pools, + None, + "Check if pools exists in ListStoragePools" + ) + pool = pools[0] self.debug("Migrating Volume-ID: %s to Pool: %s" % ( volume.id, From 731cc439a363fd3b17b1ed5eeca51f92f9e993cc Mon Sep 17 00:00:00 2001 From: Talluri Date: Wed, 8 May 2013 14:12:46 +0530 Subject: [PATCH 58/66] CLOUDSTACK-2362: correct list append method fix userdata integration test --- test/integration/smoke/test_deploy_vm_with_userdata.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/integration/smoke/test_deploy_vm_with_userdata.py b/test/integration/smoke/test_deploy_vm_with_userdata.py index fd9e320addc..8ca9bd05a2d 100644 --- a/test/integration/smoke/test_deploy_vm_with_userdata.py +++ b/test/integration/smoke/test_deploy_vm_with_userdata.py @@ -111,6 +111,7 @@ class TestDeployVmWithUserData(cloudstackTestCase): vm = vms[0] self.assert_(vm.id == str(deployVmResponse.id), "Vm deployed is different from the test") self.assert_(vm.state == "Running", "VM is not in Running state") + self.cleanup.append(deployVmResponse) @attr(tags=["simulator", "devcloud", "basic", "advanced"]) def test_deployvm_userdata(self): @@ -134,6 +135,7 @@ class TestDeployVmWithUserData(cloudstackTestCase): vm = vms[0] self.assert_(vm.id == str(deployVmResponse.id), "Vm deployed is different from the test") self.assert_(vm.state == "Running", "VM is not in Running state") + self.cleanup.append(deployVmResponse) @classmethod def tearDownClass(cls): From 1fe50a8d6778e37fd0784919538fdc7afccfb4c8 Mon Sep 17 00:00:00 2001 From: Talluri Date: Wed, 8 May 2013 04:43:31 +0530 Subject: [PATCH 59/66] CLOUDSTACK-2363: fixing the scripts to conform with lib changes Signed-off-by: Prasanna Santhanam --- .../component/test_project_configs.py | 104 +++++++++--------- .../component/test_project_limits.py | 10 +- test/integration/component/test_projects.py | 50 ++++----- test/integration/smoke/test_network.py | 12 +- test/integration/smoke/test_templates.py | 8 +- 5 files changed, 92 insertions(+), 92 deletions(-) diff --git a/test/integration/component/test_project_configs.py b/test/integration/component/test_project_configs.py index fa2ee0adb2b..33409ac56eb 100644 --- a/test/integration/component/test_project_configs.py +++ b/test/integration/component/test_project_configs.py @@ -242,8 +242,8 @@ class TestUserProjectCreation(cloudstackTestCase): project = Project.create( self.apiclient, self.services["project"], - account=self.user.account.name, - domainid=self.user.account.domainid + account=self.user.name, + domainid=self.user.domainid ) # Cleanup created project at end of test self.cleanup.append(project) @@ -409,11 +409,11 @@ class TestProjectCreationNegative(cloudstackTestCase): project = Project.create( self.apiclient, self.services["project"], - account=self.user.account.name, - domainid=self.user.account.domainid + account=self.user.name, + domainid=self.user.domainid ) self.debug("Project creation with domain user: %s failed" % - self.user.account.name) + self.user.name) return @@ -531,21 +531,21 @@ class TestProjectInviteRequired(cloudstackTestCase): "Check project name from list response" ) self.debug("Adding %s user to project: %s" % ( - self.user.account.name, + self.user.name, project.name )) # Add user to the project project.addAccount( self.apiclient, - self.user.account.name, - self.user.account.email + self.user.name, + self.user.email ) # listProjectAccount to verify the user is added to project or not accounts_reponse = Project.listAccounts( self.apiclient, projectid=project.id, - account=self.user.account.name, + account=self.user.name, ) self.debug(accounts_reponse) self.assertEqual( @@ -684,22 +684,22 @@ class TestProjectInviteRequiredTrue(cloudstackTestCase): "Check project name from list response" ) self.debug("Adding %s user to project: %s" % ( - self.user.account.name, + self.user.name, project.name )) # Add user to the project project.addAccount( self.apiclient, - self.user.account.name, - self.user.account.email + self.user.name, + self.user.email ) # listProjectAccount to verify the user is added to project or not accounts_reponse = ProjectInvitation.list( self.apiclient, state='Pending', - account=self.user.account.name, - domainid=self.user.account.domainid + account=self.user.name, + domainid=self.user.domainid ) self.assertEqual( isinstance(accounts_reponse, list), @@ -853,22 +853,22 @@ class TestProjectInviteTimeout(cloudstackTestCase): "Check project name from list response" ) self.debug("Adding %s user to project: %s" % ( - self.user.account.name, + self.user.name, project.name )) # Add user to the project project.addAccount( self.apiclient, - self.user.account.name, - self.user.account.email + self.user.name, + self.user.email ) # listProjectAccount to verify the user is added to project or not accounts_reponse = ProjectInvitation.list( self.apiclient, state='Pending', - account=self.user.account.name, - domainid=self.user.account.domainid + account=self.user.name, + domainid=self.user.domainid ) self.assertEqual( isinstance(accounts_reponse, list), @@ -894,18 +894,18 @@ class TestProjectInviteTimeout(cloudstackTestCase): self.apiclient, projectid=project.id, accept=True, - account=self.user.account.name + account=self.user.name ) self.debug( "Accepting project invitation for project: %s user: %s" % ( project.name, - self.user.account.name + self.user.name )) # listProjectAccount to verify the user is added to project or not accounts_reponse = Project.listAccounts( self.apiclient, projectid=project.id, - account=self.user.account.name, + account=self.user.name, ) self.assertEqual( @@ -979,22 +979,22 @@ class TestProjectInviteTimeout(cloudstackTestCase): "Check project name from list response" ) self.debug("Adding %s user to project: %s" % ( - self.user.account.name, + self.user.name, project.name )) # Add user to the project project.addAccount( self.apiclient, - self.user.account.name, - self.user.account.email + self.user.name, + self.user.email ) # listProjectAccount to verify the user is added to project or not accounts_reponse = ProjectInvitation.list( self.apiclient, state='Pending', - account=self.user.account.name, - domainid=self.user.account.domainid + account=self.user.name, + domainid=self.user.domainid ) self.assertEqual( isinstance(accounts_reponse, list), @@ -1025,18 +1025,18 @@ class TestProjectInviteTimeout(cloudstackTestCase): self.apiclient, projectid=project.id, accept=True, - account=self.user.account.name + account=self.user.name ) self.debug( "Accepting invitation after expiry project: %s user: %s" % ( project.name, - self.user.account.name + self.user.name )) # listProjectAccount to verify the user is added to project or not accounts_reponse = ProjectInvitation.list( self.apiclient, - account=self.user.account.name, - domainid=self.user.account.domainid + account=self.user.name, + domainid=self.user.domainid ) self.assertEqual( @@ -1110,22 +1110,22 @@ class TestProjectInviteTimeout(cloudstackTestCase): "Check project name from list response" ) self.debug("Adding %s user to project: %s" % ( - self.user.account.name, + self.user.name, project.name )) # Add user to the project project.addAccount( self.apiclient, - self.user.account.name, - self.user.account.email + self.user.name, + self.user.email ) # listProjectAccount to verify the user is added to project or not accounts_reponse = ProjectInvitation.list( self.apiclient, state='Pending', - account=self.user.account.name, - domainid=self.user.account.domainid + account=self.user.name, + domainid=self.user.domainid ) self.assertEqual( isinstance(accounts_reponse, list), @@ -1151,22 +1151,22 @@ class TestProjectInviteTimeout(cloudstackTestCase): time.sleep(int(self.config.value) * 2) self.debug("Adding %s user again to project: %s" % ( - self.user.account.name, + self.user.name, project.name )) # Add user to the project project.addAccount( self.apiclient, - self.user.account.name, - self.user.account.email + self.user.name, + self.user.email ) # listProjectAccount to verify the user is added to project or not accounts_reponse = ProjectInvitation.list( self.apiclient, state='Pending', - account=self.user.account.name, - domainid=self.user.account.domainid + account=self.user.name, + domainid=self.user.domainid ) self.assertEqual( isinstance(accounts_reponse, list), @@ -1239,22 +1239,22 @@ class TestProjectInviteTimeout(cloudstackTestCase): "Check project name from list response" ) self.debug("Adding %s user to project: %s" % ( - self.user.account.name, + self.user.name, project.name )) # Add user to the project project.addAccount( self.apiclient, - self.user.account.name, - self.user.account.email + self.user.name, + self.user.email ) # listProjectAccount to verify the user is added to project or not accounts_reponse = ProjectInvitation.list( self.apiclient, state='Pending', - account=self.user.account.name, - domainid=self.user.account.domainid + account=self.user.name, + domainid=self.user.domainid ) self.assertEqual( isinstance(accounts_reponse, list), @@ -1279,18 +1279,18 @@ class TestProjectInviteTimeout(cloudstackTestCase): self.apiclient, projectid=project.id, accept=False, - account=self.user.account.name + account=self.user.name ) self.debug( "Declining invitation for project: %s user: %s" % ( project.name, - self.user.account.name + self.user.name )) # listProjectAccount to verify the user is added to project or not accounts_reponse = Project.listAccounts( self.apiclient, projectid=project.id, - account=self.user.account.name, + account=self.user.name, ) self.assertEqual( accounts_reponse, @@ -1367,19 +1367,19 @@ class TestProjectInviteTimeout(cloudstackTestCase): "Check project name from list response" ) self.debug("Adding user with email: %s to project: %s" % ( - self.user.account.email, + self.user.email, project.name )) # Add user to the project project.addAccount( self.apiclient, - email=self.user.account.user[0].email + email=self.user.user[0].email ) # Fetch the latest mail sent to user mail_content = fetch_latest_mail( self.services["mail_account"], - from_mail=self.user.account.user[0].email + from_mail=self.user.user[0].email ) return diff --git a/test/integration/component/test_project_limits.py b/test/integration/component/test_project_limits.py index 4a8b9d48227..c5d2d6deac3 100644 --- a/test/integration/component/test_project_limits.py +++ b/test/integration/component/test_project_limits.py @@ -429,14 +429,14 @@ class TestProjectLimits(cloudstackTestCase): ) self.debug("Adding %s user to project: %s" % ( - self.user.account.name, + self.user.name, project.name )) # Add user to the project project.addAccount( self.apiclient, - self.user.account.name, + self.user.name, ) # Get the resource limits for domain @@ -459,14 +459,14 @@ class TestProjectLimits(cloudstackTestCase): #with self.assertRaises(Exception): self.debug( "Attempting to update resource limit by user: %s" % ( - self.user.account.name + self.user.name )) # Update project resource limits to 3 update_resource_limit( self.apiclient, resource.resourcetype, - account=self.user.account.name, - domainid=self.user.account.domainid, + account=self.user.name, + domainid=self.user.domainid, max=3, projectid=project.id ) diff --git a/test/integration/component/test_projects.py b/test/integration/component/test_projects.py index 9fa60750afe..ccfc8ef4086 100644 --- a/test/integration/component/test_projects.py +++ b/test/integration/component/test_projects.py @@ -248,15 +248,15 @@ class TestMultipleProjectCreation(cloudstackTestCase): # Add user to the project project_1.addAccount( self.apiclient, - self.user.account.name, - self.user.account.email + self.user.name, + self.user.email ) # listProjectAccount to verify the user is added to project or not accounts_reponse = Project.listAccounts( self.apiclient, projectid=project_1.id, - account=self.user.account.name, + account=self.user.name, ) self.debug(accounts_reponse) self.assertEqual( @@ -280,15 +280,15 @@ class TestMultipleProjectCreation(cloudstackTestCase): # Add user to the project project_2.addAccount( self.apiclient, - self.user.account.name, - self.user.account.email + self.user.name, + self.user.email ) # listProjectAccount to verify the user is added to project or not accounts_reponse = Project.listAccounts( self.apiclient, projectid=project_2.id, - account=self.user.account.name, + account=self.user.name, ) self.debug(accounts_reponse) self.assertEqual( @@ -432,15 +432,15 @@ class TestCrossDomainAccountAdd(cloudstackTestCase): ) self.debug("Adding user: %s from domain: %s to project: %s" % ( - self.user.account.name, - self.user.account.domainid, + self.user.name, + self.user.domainid, project.id )) with self.assertRaises(Exception): # Add user to the project from different domain project.addAccount( self.apiclient, - self.user.account.name + self.user.name ) self.debug("User add to project failed!") return @@ -938,7 +938,7 @@ class TestProjectOwners(cloudstackTestCase): ) self.cleanup.append(self.user) self.debug("Created account with ID: %s" % - self.user.account.name) + self.user.name) list_projects_reponse = Project.list( self.apiclient, @@ -1033,20 +1033,20 @@ class TestProjectOwners(cloudstackTestCase): ) self.debug("Adding %s user to project: %s" % ( - self.user.account.name, + self.user.name, project.name )) # Add user to the project project.addAccount( self.apiclient, - self.user.account.name, + self.user.name, ) # listProjectAccount to verify the user is added to project or not accounts_reponse = Project.listAccounts( self.apiclient, projectid=project.id, - account=self.user.account.name, + account=self.user.name, ) self.assertEqual( isinstance(accounts_reponse, list), @@ -1068,19 +1068,19 @@ class TestProjectOwners(cloudstackTestCase): ) self.debug("Updating project with new Admin: %s" % - self.user.account.name) + self.user.name) # Update the project with new admin project.update( self.apiclient, - account=self.user.account.name + account=self.user.name ) # listProjectAccount to verify the user is new admin of the project accounts_reponse = Project.listAccounts( self.apiclient, projectid=project.id, - account=self.user.account.name, + account=self.user.name, ) self.debug(accounts_reponse) self.assertEqual( @@ -1248,20 +1248,20 @@ class TestProjectResources(cloudstackTestCase): "Check project name from list response" ) self.debug("Adding %s user to project: %s" % ( - self.user.account.name, + self.user.name, project.name )) # Add user to the project project.addAccount( self.apiclient, - self.user.account.name, + self.user.name, ) # listProjectAccount to verify the user is added to project or not accounts_reponse = Project.listAccounts( self.apiclient, projectid=project.id, - account=self.user.account.name, + account=self.user.name, ) self.assertEqual( isinstance(accounts_reponse, list), @@ -1370,20 +1370,20 @@ class TestProjectResources(cloudstackTestCase): ) self.cleanup.append(self.user) self.debug("Adding %s user to project: %s" % ( - self.user.account.name, + self.user.name, project.name )) # Add user to the project project.addAccount( self.apiclient, - self.user.account.name + self.user.name ) # listProjectAccount to verify the user is added to project or not accounts_reponse = Project.listAccounts( self.apiclient, projectid=project.id, - account=self.user.account.name, + account=self.user.name, ) self.assertEqual( isinstance(accounts_reponse, list), @@ -1543,20 +1543,20 @@ class TestProjectSuspendActivate(cloudstackTestCase): # account deletion. self.debug("Adding %s user to project: %s" % ( - self.user.account.name, + self.user.name, self.project.name )) # Add user to the project self.project.addAccount( self.apiclient, - self.user.account.name, + self.user.name, ) # listProjectAccount to verify the user is added to project or not accounts_reponse = Project.listAccounts( self.apiclient, projectid=self.project.id, - account=self.user.account.name, + account=self.user.name, ) self.assertEqual( isinstance(accounts_reponse, list), diff --git a/test/integration/smoke/test_network.py b/test/integration/smoke/test_network.py index 322e8c25c8e..4a7bb44da2c 100644 --- a/test/integration/smoke/test_network.py +++ b/test/integration/smoke/test_network.py @@ -151,8 +151,8 @@ class TestPublicIP(cloudstackTestCase): cls.user_network = Network.create( cls.api_client, cls.services["network"], - cls.user.account.name, - cls.user.account.domainid + cls.user.name, + cls.user.domainid ) # Create Source NAT IP addresses @@ -164,9 +164,9 @@ class TestPublicIP(cloudstackTestCase): ) user_src_nat_ip = PublicIPAddress.create( cls.api_client, - cls.user.account.name, + cls.user.name, cls.zone.id, - cls.user.account.domainid + cls.user.domainid ) cls._cleanup = [ cls.account_network, @@ -248,9 +248,9 @@ class TestPublicIP(cloudstackTestCase): ip_address = PublicIPAddress.create( self.apiclient, - self.user.account.name, + self.user.name, self.zone.id, - self.user.account.domainid + self.user.domainid ) #listPublicIpAddresses should return newly created public IP diff --git a/test/integration/smoke/test_templates.py b/test/integration/smoke/test_templates.py index b2ad4ca5634..382f56f8980 100644 --- a/test/integration/smoke/test_templates.py +++ b/test/integration/smoke/test_templates.py @@ -752,8 +752,8 @@ class TestTemplates(cloudstackTestCase): list_template_response = list_templates( self.apiclient, templatefilter='featured', - account=self.user.account.name, - domainid=self.user.account.domainid + account=self.user.name, + domainid=self.user.domainid ) self.assertEqual( isinstance(list_template_response, list), @@ -784,8 +784,8 @@ class TestTemplates(cloudstackTestCase): list_template_response = list_templates( self.apiclient, templatefilter='featured', - account=self.user.account.name, - domainid=self.user.account.domainid + account=self.user.name, + domainid=self.user.domainid ) self.assertEqual( isinstance(list_template_response, list), From b8358e109e737c454a351942c0f3d66f674febd7 Mon Sep 17 00:00:00 2001 From: Srikanteswararao Talluri Date: Wed, 8 May 2013 12:23:15 +0530 Subject: [PATCH 60/66] CLOUDSTACK-2377: change memory size to 128 mb for the tiny service offering in the integration tests Signed-off-by: Prasanna Santhanam --- test/integration/component/test_accounts.py | 2 +- test/integration/component/test_allocation_states.py | 2 +- test/integration/component/test_blocker_bugs.py | 2 +- test/integration/component/test_egress_rules.py | 2 +- test/integration/component/test_eip_elb.py | 2 +- test/integration/component/test_network_offering.py | 2 +- test/integration/component/test_project_configs.py | 2 +- test/integration/component/test_project_limits.py | 2 +- test/integration/component/test_project_resources.py | 2 +- test/integration/component/test_project_usage.py | 2 +- test/integration/component/test_projects.py | 2 +- test/integration/component/test_resource_limits.py | 2 +- test/integration/component/test_routers.py | 2 +- test/integration/component/test_security_groups.py | 2 +- test/integration/component/test_templates.py | 2 +- test/integration/component/test_usage.py | 2 +- test/integration/component/test_volumes.py | 2 +- test/integration/smoke/test_affinity_groups.py | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/test/integration/component/test_accounts.py b/test/integration/component/test_accounts.py index fb38e627582..9cbefe55fdb 100644 --- a/test/integration/component/test_accounts.py +++ b/test/integration/component/test_accounts.py @@ -60,7 +60,7 @@ class Services: "cpunumber": 1, "cpuspeed": 100, # in MHz - "memory": 64, + "memory": 128, # In MBs }, "virtual_machine": { diff --git a/test/integration/component/test_allocation_states.py b/test/integration/component/test_allocation_states.py index fe4c35f3b9f..5ce0b21124b 100644 --- a/test/integration/component/test_allocation_states.py +++ b/test/integration/component/test_allocation_states.py @@ -49,7 +49,7 @@ class Services: "displaytext": "Tiny Instance", "cpunumber": 1, "cpuspeed": 100, # in MHz - "memory": 64, # In MBs + "memory": 128, # In MBs }, "disk_offering": { "displaytext": "Small", diff --git a/test/integration/component/test_blocker_bugs.py b/test/integration/component/test_blocker_bugs.py index a6ea25a846a..d099bf1a448 100644 --- a/test/integration/component/test_blocker_bugs.py +++ b/test/integration/component/test_blocker_bugs.py @@ -51,7 +51,7 @@ class Services: "displaytext": "Tiny Instance", "cpunumber": 1, "cpuspeed": 100, # in MHz - "memory": 64, # In MBs + "memory": 128, # In MBs }, "disk_offering": { "displaytext": "Small", diff --git a/test/integration/component/test_egress_rules.py b/test/integration/component/test_egress_rules.py index 4af6eee94f4..872ca2c7b5d 100644 --- a/test/integration/component/test_egress_rules.py +++ b/test/integration/component/test_egress_rules.py @@ -69,7 +69,7 @@ class Services: "displaytext": "Tiny Instance", "cpunumber": 1, "cpuspeed": 100, # in MHz - "memory": 64, # In MBs + "memory": 128, # In MBs }, "security_group": { "name": 'SSH', diff --git a/test/integration/component/test_eip_elb.py b/test/integration/component/test_eip_elb.py index cb41859acd3..b01371b7643 100644 --- a/test/integration/component/test_eip_elb.py +++ b/test/integration/component/test_eip_elb.py @@ -49,7 +49,7 @@ class Services: "displaytext": "Tiny Instance", "cpunumber": 1, "cpuspeed": 100, # in MHz - "memory": 64, # In MBs + "memory": 128, # In MBs }, "lbrule": { "name": "SSH", diff --git a/test/integration/component/test_network_offering.py b/test/integration/component/test_network_offering.py index 00566a0d400..e33c3765642 100644 --- a/test/integration/component/test_network_offering.py +++ b/test/integration/component/test_network_offering.py @@ -49,7 +49,7 @@ class Services: "displaytext": "Tiny Instance", "cpunumber": 1, "cpuspeed": 100, # in MHz - "memory": 64, # In MBs + "memory": 128, # In MBs }, "network_offering": { "name": 'Network offering-VR services', diff --git a/test/integration/component/test_project_configs.py b/test/integration/component/test_project_configs.py index 33409ac56eb..1eef123b2ee 100644 --- a/test/integration/component/test_project_configs.py +++ b/test/integration/component/test_project_configs.py @@ -70,7 +70,7 @@ class Services: "displaytext": "Tiny Instance", "cpunumber": 1, "cpuspeed": 100, # in MHz - "memory": 64, # In MBs + "memory": 128, # In MBs }, "virtual_machine": { "displayname": "Test VM", diff --git a/test/integration/component/test_project_limits.py b/test/integration/component/test_project_limits.py index c5d2d6deac3..17ddfc67da5 100644 --- a/test/integration/component/test_project_limits.py +++ b/test/integration/component/test_project_limits.py @@ -63,7 +63,7 @@ class Services: "displaytext": "Tiny Instance", "cpunumber": 1, "cpuspeed": 100, # in MHz - "memory": 64, # In MBs + "memory": 128, # In MBs }, "disk_offering": { "displaytext": "Tiny Disk Offering", diff --git a/test/integration/component/test_project_resources.py b/test/integration/component/test_project_resources.py index e79254ce6ac..84141889f3f 100644 --- a/test/integration/component/test_project_resources.py +++ b/test/integration/component/test_project_resources.py @@ -64,7 +64,7 @@ class Services: "displaytext": "Tiny Instance", "cpunumber": 1, "cpuspeed": 100, # in MHz - "memory": 64, # In MBs + "memory": 128, # In MBs }, "disk_offering": { "displaytext": "Tiny Disk Offering", diff --git a/test/integration/component/test_project_usage.py b/test/integration/component/test_project_usage.py index 44ef2f9a0a9..ab789e1c13d 100644 --- a/test/integration/component/test_project_usage.py +++ b/test/integration/component/test_project_usage.py @@ -52,7 +52,7 @@ class Services: "displaytext": "Tiny Instance", "cpunumber": 1, "cpuspeed": 100, # in MHz - "memory": 64, # In MBs + "memory": 128, # In MBs }, "disk_offering": { "displaytext": "Small", diff --git a/test/integration/component/test_projects.py b/test/integration/component/test_projects.py index ccfc8ef4086..f013e99a0dd 100644 --- a/test/integration/component/test_projects.py +++ b/test/integration/component/test_projects.py @@ -78,7 +78,7 @@ class Services: "displaytext": "Tiny Instance", "cpunumber": 1, "cpuspeed": 100, # in MHz - "memory": 64, # In MBs + "memory": 128, # In MBs }, "virtual_machine": { "displayname": "Test VM", diff --git a/test/integration/component/test_resource_limits.py b/test/integration/component/test_resource_limits.py index 418080ab052..1d876b6195f 100644 --- a/test/integration/component/test_resource_limits.py +++ b/test/integration/component/test_resource_limits.py @@ -51,7 +51,7 @@ class Services: "cpunumber": 1, "cpuspeed": 100, # in MHz - "memory": 64, + "memory": 128, # In MBs }, "disk_offering": { diff --git a/test/integration/component/test_routers.py b/test/integration/component/test_routers.py index 96eb9aae403..bc33d754260 100644 --- a/test/integration/component/test_routers.py +++ b/test/integration/component/test_routers.py @@ -41,7 +41,7 @@ class Services: "displaytext": "Tiny Instance", "cpunumber": 1, "cpuspeed": 100, # in MHz - "memory": 64, # In MBs + "memory": 128, # In MBs }, "virtual_machine": { diff --git a/test/integration/component/test_security_groups.py b/test/integration/component/test_security_groups.py index fe2561aa084..54b5c67fa4d 100644 --- a/test/integration/component/test_security_groups.py +++ b/test/integration/component/test_security_groups.py @@ -74,7 +74,7 @@ class Services: "displaytext": "Tiny Instance", "cpunumber": 1, "cpuspeed": 100, # in MHz - "memory": 64, # In MBs + "memory": 128, # In MBs }, "security_group": { "name": 'SSH', diff --git a/test/integration/component/test_templates.py b/test/integration/component/test_templates.py index 3867fb44d19..1a60123b820 100644 --- a/test/integration/component/test_templates.py +++ b/test/integration/component/test_templates.py @@ -51,7 +51,7 @@ class Services: "displaytext": "Tiny Instance", "cpunumber": 1, "cpuspeed": 100, # in MHz - "memory": 64, # In MBs + "memory": 128, # In MBs }, "disk_offering": { "displaytext": "Small", diff --git a/test/integration/component/test_usage.py b/test/integration/component/test_usage.py index dbd0be97b72..a3779e4dc2f 100644 --- a/test/integration/component/test_usage.py +++ b/test/integration/component/test_usage.py @@ -48,7 +48,7 @@ class Services: "displaytext": "Tiny Instance", "cpunumber": 1, "cpuspeed": 100, # in MHz - "memory": 64, # In MBs + "memory": 128, # In MBs }, "disk_offering": { "displaytext": "Small", diff --git a/test/integration/component/test_volumes.py b/test/integration/component/test_volumes.py index f7eb9f92600..34a067930de 100644 --- a/test/integration/component/test_volumes.py +++ b/test/integration/component/test_volumes.py @@ -52,7 +52,7 @@ class Services: "displaytext": "Tiny Instance", "cpunumber": 1, "cpuspeed": 100, # in MHz - "memory": 64, # In MBs + "memory": 128, # In MBs }, "disk_offering": { "displaytext": "Small", diff --git a/test/integration/smoke/test_affinity_groups.py b/test/integration/smoke/test_affinity_groups.py index 6ccd478bf2d..e0e1a17273b 100644 --- a/test/integration/smoke/test_affinity_groups.py +++ b/test/integration/smoke/test_affinity_groups.py @@ -48,7 +48,7 @@ class Services: "cpunumber": 1, "cpuspeed": 100, # in MHz - "memory": 64, + "memory": 128, # In MBs }, "ostype": 'CentOS 5.3 (64-bit)', From 53e496517ed51bab2c81084a02f49b0408b19a37 Mon Sep 17 00:00:00 2001 From: sanjeevneelarapu Date: Mon, 6 May 2013 20:38:54 +0530 Subject: [PATCH 61/66] CLOUDSTACK-702: Tests for Multiple IP Ranges-R4 Add ip range overlapped with two ip ranges in the exiting cidr Signed-off-by: sanjeevneelarapu Signed-off-by: Prasanna Santhanam --- .../component/test_multiple_ip_ranges.py | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/test/integration/component/test_multiple_ip_ranges.py b/test/integration/component/test_multiple_ip_ranges.py index 29942bd3af2..7e9eeb1028d 100644 --- a/test/integration/component/test_multiple_ip_ranges.py +++ b/test/integration/component/test_multiple_ip_ranges.py @@ -368,3 +368,61 @@ class TestMultipleIpRanges(cloudstackTestCase): #Test will reach here there is a bug in overlap ip range checking self.fail("CS should not accept overlapped ip ranges in guest traffic, but it allowed") return + + @attr(tags=["advanced_sg", "sg"]) + def test_06_add_ip_range_overlapped_with_two_ranges(self): + """Test adding overlapped ip range in existing cidr + + 1.Add ip range in new cidr e.g:10.147.40.2-10.147.40.10 + 2.Add another ip range in the same cidr e.g:10.147.40.20-10.147.40.30 + 2.Add ip range overlapped with both the ip ranges e.g.10.147.40.10-20 + """ + #call increment_cidr function to get exiting cidr from the setup and increment it + ip2 = self.increment_cidr() + test_nw = ip2.network + ip = IPAddress(test_nw) + #Add IP range in the new CIDR + test_gateway = ip.__add__(1) + test_startIp = ip.__add__(2) + test_endIp = ip.__add__(10) + test_startIp2 = ip.__add__(20) + test_endIp2 = ip.__add__(30) + test_startIp3 = ip.__add__(10) + test_endIp3 = ip.__add__(20) + #Populating services with new IP range + self.services["vlan_ip_range"]["startip"] = test_startIp + self.services["vlan_ip_range"]["endip"] = test_endIp + self.services["vlan_ip_range"]["gateway"] = test_gateway + self.services["vlan_ip_range"]["netmask"] = self.netmask + self.services["vlan_ip_range"]["zoneid"] = self.zone.id + self.services["vlan_ip_range"]["podid"] = self.pod.id + #create new vlan ip range + new_vlan = PublicIpRange.create(self.apiclient, self.services["vlan_ip_range"]) + self.debug("Created new vlan range with startip:%s and endip:%s" %(test_startIp,test_endIp)) + self.cleanup.append(new_vlan) + new_vlan_res = new_vlan.list(self.apiclient,id=new_vlan.vlan.id) + #Compare list output with configured values + self.verify_vlan_range(new_vlan_res,self.services["vlan_ip_range"]) + #Add 2nd IP range in the same CIDR + self.services["vlan_ip_range"]["startip"] = test_startIp2 + self.services["vlan_ip_range"]["endip"] = test_endIp2 + new_vlan = PublicIpRange.create(self.apiclient, self.services["vlan_ip_range"]) + self.debug("Created new vlan range with startip:%s and endip:%s" %(test_startIp2,test_endIp2)) + self.cleanup.append(new_vlan) + new_vlan_res = new_vlan.list(self.apiclient,id=new_vlan.vlan.id) + #Compare list output with configured values + self.verify_vlan_range(new_vlan_res,self.services["vlan_ip_range"]) + #Add ip range which will overlap with two existing ip ranges in the same CIDR + #Populating services with new IP range + self.services["vlan_ip_range"]["startip"] = test_startIp3 + self.services["vlan_ip_range"]["endip"] = test_endIp3 + #Try to create ip range overlapped with exiting ip range + try: + PublicIpRange.create(self.apiclient, self.services["vlan_ip_range"]) + except cloudstackAPIException as cs: + self.debug(cs.errorMsg) + self.assertTrue(cs.errorMsg.find("already has IPs that overlap with the new range")>0, msg="Fail:CS allowed adding overlapped ip ranges in guest cidr") + return + #Test will reach here there is a bug in overlap ip range checking + self.fail("CS should not accept overlapped ip ranges in guest traffic, but it allowed") + return From 76e8afa24fdbdf7d3132c5c5b90320f19bf7ddcb Mon Sep 17 00:00:00 2001 From: Pranav Saxena Date: Wed, 8 May 2013 17:05:36 +0530 Subject: [PATCH 62/66] CLOUDSTACK-2171:Unable to Create a VM In the VMware Setup with the latest Master --- ui/scripts/system.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ui/scripts/system.js b/ui/scripts/system.js index dc09ea86926..2746e0d01b2 100644 --- a/ui/scripts/system.js +++ b/ui/scripts/system.js @@ -1018,12 +1018,7 @@ dataType: "json", success: function(json) { var jobId = json.updatephysicalnetworkresponse.jobid; - - var trafficType = getTrafficType(selectedPhysicalNetworkObj, 'Guest'); - - updateTrafficLabels(trafficType, args.data, function() { args.response.success({ _custom: { jobId: jobId }}); - }); }, error:function(json){ From 305f3cb8a503df84875fe7e066ca60fe186da22e Mon Sep 17 00:00:00 2001 From: Pranav Saxena Date: Wed, 8 May 2013 17:07:46 +0530 Subject: [PATCH 63/66] CLOUDSTACK-2387:Addition/Deletion of a VLAN Range from UI calls updateTrafficType API which makes all networklabels as undefined which finally results in failure to deploy VMs --- ui/scripts/system.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/ui/scripts/system.js b/ui/scripts/system.js index 2746e0d01b2..34ba64c917d 100644 --- a/ui/scripts/system.js +++ b/ui/scripts/system.js @@ -1066,10 +1066,7 @@ dataType: "json", success: function(json) { var jobId = json.updatephysicalnetworkresponse.jobid; - var trafficType = getTrafficType(selectedPhysicalNetworkObj, 'Guest'); - updateTrafficLabels(trafficType, args.data, function() { args.response.success({ _custom: { jobId: jobId }}); - }); }, error:function(json){ From 44f3f5eca529b5f9bfe08a984fed8ce23160b9c5 Mon Sep 17 00:00:00 2001 From: Koushik Das Date: Wed, 8 May 2013 17:52:02 +0530 Subject: [PATCH 64/66] CLOUDSTACK-2145 : Failed to create guest nexus port profile while deploying the First VM on Nexus VMWARE Cluster Additional stuff needs to be configured in guest port profile when Vnmc is present to provide firewall services. The xml command used to configure port profile had issues with special characters in the input value for 'org' parameter. --- utils/src/com/cloud/utils/cisco/n1kv/vsm/VsmCommand.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/utils/src/com/cloud/utils/cisco/n1kv/vsm/VsmCommand.java b/utils/src/com/cloud/utils/cisco/n1kv/vsm/VsmCommand.java index fdab390557d..d86b7100658 100644 --- a/utils/src/com/cloud/utils/cisco/n1kv/vsm/VsmCommand.java +++ b/utils/src/com/cloud/utils/cisco/n1kv/vsm/VsmCommand.java @@ -546,10 +546,15 @@ public class VsmCommand { vmware.appendChild(portgroup); portProf.appendChild(vmware); - // org root/%vdc% + // org %vdc% // vservice node profile + Element vdcValue = doc.createElement(s_paramvalue); + vdcValue.setAttribute("isKey", "true"); + vdcValue.setTextContent(vdc); + Element org = doc.createElement("org"); - org.appendChild(doc.createElement(vdc)); + org.appendChild(doc.createElement("orgname")) + .appendChild(vdcValue); portProf.appendChild(org); String asaNodeName = "ASA_" + vlanid; From 99d0936314571e645f62e40bf4d227232be89632 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Wed, 8 May 2013 17:44:46 +0100 Subject: [PATCH 65/66] CLOUDSTACK-2318: update volumes.path to fix stop/start vm error after upgrade from 2.2.14 to 3.0.0 Signed-off-by: Chip Childers --- setup/db/db/schema-2214to30.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/setup/db/db/schema-2214to30.sql b/setup/db/db/schema-2214to30.sql index 60eceea447d..e288b0fd4f9 100755 --- a/setup/db/db/schema-2214to30.sql +++ b/setup/db/db/schema-2214to30.sql @@ -664,6 +664,7 @@ ALTER TABLE `cloud`.`dc_storage_network_ip_range` ADD COLUMN `gateway` varchar(1 ALTER TABLE `cloud`.`volumes` ADD COLUMN `last_pool_id` bigint unsigned; UPDATE `cloud`.`volumes` SET `last_pool_id` = `pool_id`; +UPDATE `cloud`.`volumes` SET `path` = SUBSTRING_INDEX(`path`, '/', -1); ALTER TABLE `cloud`.`user_ip_address` ADD COLUMN `is_system` int(1) unsigned NOT NULL default '0'; ALTER TABLE `cloud`.`volumes` ADD COLUMN `update_count` bigint unsigned NOT NULL DEFAULT 0; From 738d35a61d12aa4ff11114aef89f546a077e8629 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Wed, 8 May 2013 11:40:37 -0700 Subject: [PATCH 66/66] CLOUDSTACK-1907: Debian Squeeze 6.0 (64-bit) is not experimental any more --- .../xen/discoverer/XcpServerDiscoverer.java | 7 +- .../hypervisor/xen/resource/CitrixHelper.java | 87 +++++++++++++++++++ .../xen/resource/XcpServerResource.java | 11 ++- 3 files changed, 100 insertions(+), 5 deletions(-) diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java index 89bc1cf5708..562a7feb96f 100755 --- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java +++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java @@ -427,8 +427,11 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L prodVersion = prodVersion.trim(); } - if(prodBrand.equals("XCP") && (prodVersion.equals("1.0.0") || prodVersion.equals("1.1.0") || prodVersion.equals("5.6.100") || prodVersion.startsWith("1.4") || prodVersion.startsWith("1.6"))) - return new XcpServerResource(); + if(prodBrand.equals("XCP") && (prodVersion.equals("1.0.0") || prodVersion.equals("1.1.0") || prodVersion.equals("5.6.100") || prodVersion.startsWith("1.4"))) { + return new XcpServerResource("1.1"); + } else if (prodBrand.equals("XCP") && prodVersion.startsWith("1.6")) { + return new XcpServerResource("1.6"); + } if(prodBrand.equals("XenServer") && prodVersion.equals("5.6.0")) return new XenServer56Resource(); diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixHelper.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixHelper.java index 5bcec13acb5..34b8f2981e2 100644 --- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixHelper.java +++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixHelper.java @@ -28,6 +28,7 @@ import org.apache.log4j.Logger; public class CitrixHelper { private static final Logger s_logger = Logger.getLogger(CitrixHelper.class); private static final HashMap _xcp100GuestOsMap = new HashMap(70); + private static final HashMap _xcp160GuestOsMap = new HashMap(70); private static final HashMap _xenServerGuestOsMap = new HashMap(70); private static final HashMap _xenServer56FP1GuestOsMap = new HashMap(70); private static final HashMap _xenServer56FP2GuestOsMap = new HashMap(70); @@ -114,6 +115,83 @@ public class CitrixHelper { _xcp100GuestOsMap.put("Other PV (64-bit)", "CentOS 5 (64-bit)"); } + static { + _xcp160GuestOsMap.put("CentOS 4.5 (32-bit)", "CentOS 4.5 (32-bit)"); + _xcp160GuestOsMap.put("CentOS 4.6 (32-bit)", "CentOS 4.6 (32-bit)"); + _xcp160GuestOsMap.put("CentOS 4.7 (32-bit)", "CentOS 4.7 (32-bit)"); + _xcp160GuestOsMap.put("CentOS 4.8 (32-bit)", "CentOS 4.8 (32-bit)"); + _xcp160GuestOsMap.put("CentOS 5.0 (32-bit)", "CentOS 5 (32-bit)"); + _xcp160GuestOsMap.put("CentOS 5.0 (64-bit)", "CentOS 5 (64-bit)"); + _xcp160GuestOsMap.put("CentOS 5.1 (32-bit)", "CentOS 5 (32-bit)"); + _xcp160GuestOsMap.put("CentOS 5.1 (64-bit)", "CentOS 5 (64-bit)"); + _xcp160GuestOsMap.put("CentOS 5.2 (32-bit)", "CentOS 5 (32-bit)"); + _xcp160GuestOsMap.put("CentOS 5.2 (64-bit)", "CentOS 5 (64-bit)"); + _xcp160GuestOsMap.put("CentOS 5.3 (32-bit)", "CentOS 5 (32-bit)"); + _xcp160GuestOsMap.put("CentOS 5.3 (64-bit)", "CentOS 5 (64-bit)"); + _xcp160GuestOsMap.put("CentOS 5.4 (32-bit)", "CentOS 5 (32-bit)"); + _xcp160GuestOsMap.put("CentOS 5.4 (64-bit)", "CentOS 5 (64-bit)"); + _xcp160GuestOsMap.put("CentOS 5.5 (32-bit)", "CentOS 5 (32-bit)"); + _xcp160GuestOsMap.put("CentOS 5.5 (64-bit)", "CentOS 5 (64-bit)"); + _xcp160GuestOsMap.put("Debian GNU/Linux 5.0 (32-bit)", "Debian Lenny 5.0 (32-bit)"); + _xcp160GuestOsMap.put("Debian GNU/Linux 6(32-bit)", "Debian Squeeze 6.0 (32-bit)"); + _xcp160GuestOsMap.put("Debian GNU/Linux 6(64-bit)", "Debian Squeeze 6.0 (64-bit)"); + _xcp160GuestOsMap.put("Oracle Enterprise Linux 5.0 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)"); + _xcp160GuestOsMap.put("Oracle Enterprise Linux 5.0 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)"); + _xcp160GuestOsMap.put("Oracle Enterprise Linux 5.1 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)"); + _xcp160GuestOsMap.put("Oracle Enterprise Linux 5.1 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)"); + _xcp160GuestOsMap.put("Oracle Enterprise Linux 5.2 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)"); + _xcp160GuestOsMap.put("Oracle Enterprise Linux 5.2 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)"); + _xcp160GuestOsMap.put("Oracle Enterprise Linux 5.3 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)"); + _xcp160GuestOsMap.put("Oracle Enterprise Linux 5.3 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)"); + _xcp160GuestOsMap.put("Oracle Enterprise Linux 5.4 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)"); + _xcp160GuestOsMap.put("Oracle Enterprise Linux 5.4 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)"); + _xcp160GuestOsMap.put("Oracle Enterprise Linux 5.5 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)"); + _xcp160GuestOsMap.put("Oracle Enterprise Linux 5.5 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)"); + _xcp160GuestOsMap.put("Red Hat Enterprise Linux 4.5 (32-bit)", "Red Hat Enterprise Linux 4.5 (32-bit)"); + _xcp160GuestOsMap.put("Red Hat Enterprise Linux 4.6 (32-bit)", "Red Hat Enterprise Linux 4.6 (32-bit)"); + _xcp160GuestOsMap.put("Red Hat Enterprise Linux 4.7 (32-bit)", "Red Hat Enterprise Linux 4.7 (32-bit)"); + _xcp160GuestOsMap.put("Red Hat Enterprise Linux 4.8 (32-bit)", "Red Hat Enterprise Linux 4.8 (32-bit)"); + _xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.0 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)"); + _xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.0 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)"); + _xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.1 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)"); + _xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.1 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)"); + _xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.2 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)"); + _xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.2 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)"); + _xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.3 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)"); + _xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.3 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)"); + _xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.4 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)"); + _xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.4 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)"); + _xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.5 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)"); + _xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.5 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)"); + _xcp160GuestOsMap.put("Red Hat Enterprise Linux 6.0 (32-bit)", "Red Hat Enterprise Linux 6 (32-bit)"); + _xcp160GuestOsMap.put("Red Hat Enterprise Linux 6.0 (64-bit)", "Red Hat Enterprise Linux 6 (64-bit)"); + _xcp160GuestOsMap.put("SUSE Linux Enterprise Server 9 SP4 (32-bit)", "SUSE Linux Enterprise Server 9 SP4"); + _xcp160GuestOsMap.put("SUSE Linux Enterprise Server 10 SP1 (32-bit)", "SUSE Linux Enterprise Server 10 SP1"); + _xcp160GuestOsMap.put("SUSE Linux Enterprise Server 10 SP1 (64-bit)", "SUSE Linux Enterprise Server 10 SP1 x64"); + _xcp160GuestOsMap.put("SUSE Linux Enterprise Server 10 SP2 (32-bit)", "SUSE Linux Enterprise Server 10 SP2"); + _xcp160GuestOsMap.put("SUSE Linux Enterprise Server 10 SP2 (64-bit)", "SUSE Linux Enterprise Server 10 SP2 x64"); + _xcp160GuestOsMap.put("SUSE Linux Enterprise Server 10 SP3 (64-bit)", "Other install media"); + _xcp160GuestOsMap.put("SUSE Linux Enterprise Server 11 (32-bit)", "SUSE Linux Enterprise Server 11"); + _xcp160GuestOsMap.put("SUSE Linux Enterprise Server 11 (64-bit)", "SUSE Linux Enterprise Server 11 x64"); + _xcp160GuestOsMap.put("SUSE Linux Enterprise Server 11 SP1 (32-bit)", "SUSE Linux Enterprise Server 11 SP1 (32-bit)"); + _xcp160GuestOsMap.put("SUSE Linux Enterprise Server 11 SP1 (64-bit)", "SUSE Linux Enterprise Server 11 SP1 (64-bit)"); + _xcp160GuestOsMap.put("Windows 7 (32-bit)", "Windows 7 (32-bit)"); + _xcp160GuestOsMap.put("Windows 7 (64-bit)", "Windows 7 (64-bit)"); + _xcp160GuestOsMap.put("Windows Server 2003 (32-bit)", "Windows Server 2003 (32-bit)"); + _xcp160GuestOsMap.put("Windows Server 2003 (64-bit)", "Windows Server 2003 (64-bit)"); + _xcp160GuestOsMap.put("Windows Server 2008 (32-bit)", "Windows Server 2008 (32-bit)"); + _xcp160GuestOsMap.put("Windows Server 2008 (64-bit)", "Windows Server 2008 (64-bit)"); + _xcp160GuestOsMap.put("Windows Server 2008 R2 (64-bit)", "Windows Server 2008 R2 (64-bit)"); + _xcp160GuestOsMap.put("Windows XP SP3 (32-bit)", "Windows XP SP3 (32-bit)"); + _xcp160GuestOsMap.put("Windows Vista (32-bit)", "Windows Vista (32-bit)"); + _xcp160GuestOsMap.put("Ubuntu 10.04 (32-bit)", "Ubuntu Lucid Lynx 10.04 (32-bit) (experimental)"); + _xcp160GuestOsMap.put("Ubuntu 10.04 (64-bit)", "Ubuntu Lucid Lynx 10.04 (64-bit) (experimental)"); + _xcp160GuestOsMap.put("Other Linux (32-bit)", "Other install media"); + _xcp160GuestOsMap.put("Other Linux (64-bit)", "Other install media"); + _xcp160GuestOsMap.put("Other PV (32-bit)", "CentOS 5 (32-bit)"); + _xcp160GuestOsMap.put("Other PV (64-bit)", "CentOS 5 (64-bit)"); + } + static { _xenServerGuestOsMap.put("CentOS 4.5 (32-bit)", "CentOS 4.5 (32-bit)"); @@ -694,6 +772,15 @@ public class CitrixHelper { return guestOS; } + public static String getXcp160GuestOsType(String stdType) { + String guestOS = _xcp160GuestOsMap.get(stdType); + if (guestOS == null) { + s_logger.debug("Can't find the guest os: " + stdType + " mapping into XCP's guestOS type, start it as HVM guest"); + guestOS = "Other install media"; + } + return guestOS; + } + public static String getXenServerGuestOsType(String stdType, boolean bootFromCD) { String guestOS = _xenServerGuestOsMap.get(stdType); diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XcpServerResource.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XcpServerResource.java index 7a958708e76..6baf6a09e3f 100644 --- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XcpServerResource.java +++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XcpServerResource.java @@ -39,9 +39,10 @@ import com.xensource.xenapi.Types.XenAPIException; @Local(value=ServerResource.class) public class XcpServerResource extends CitrixResourceBase { private final static Logger s_logger = Logger.getLogger(XcpServerResource.class); - - public XcpServerResource() { + private String version; + public XcpServerResource(String version) { super(); + this.version = version; } @Override @@ -55,7 +56,11 @@ public class XcpServerResource extends CitrixResourceBase { @Override protected String getGuestOsType(String stdType, boolean bootFromCD) { - return CitrixHelper.getXcpGuestOsType(stdType); + if (version.equalsIgnoreCase("1.6")) { + return CitrixHelper.getXcp160GuestOsType(stdType); + } else { + return CitrixHelper.getXcpGuestOsType(stdType); + } } @Override