You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ah...@apache.org on 2013/06/10 02:53:50 UTC
[01/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Updated Branches:
refs/heads/vmsync 186e62a86 -> aaa16af21
fix for incorrect secondary dns
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/5fa1ad51
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/5fa1ad51
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/5fa1ad51
Branch: refs/heads/vmsync
Commit: 5fa1ad518f374bd736c121937f08ac699354a1dd
Parents: 404c7e0
Author: Shane Witbeck <sh...@digitalsanctum.com>
Authored: Wed Jun 5 12:36:16 2013 -0400
Committer: David Nalley <da...@gnsa.us>
Committed: Wed Jun 5 17:21:44 2013 -0400
----------------------------------------------------------------------
tools/appliance/definitions/systemvmtemplate/postinstall.sh | 2 +-
.../appliance/definitions/systemvmtemplate64/postinstall.sh | 2 +-
tools/devcloud-kvm/devcloud-kvm.cfg | 2 +-
tools/devcloud/devcloud.cfg | 2 +-
tools/devcloud/devcloud_internal-mgt.cfg | 2 +-
tools/devcloud/quickcloud.cfg | 2 +-
tools/marvin/marvin/configGenerator.py | 8 ++++----
tools/marvin/marvin/jsonHelper.py | 4 ++--
8 files changed, 12 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5fa1ad51/tools/appliance/definitions/systemvmtemplate/postinstall.sh
----------------------------------------------------------------------
diff --git a/tools/appliance/definitions/systemvmtemplate/postinstall.sh b/tools/appliance/definitions/systemvmtemplate/postinstall.sh
index 7c06796..e052cf9 100644
--- a/tools/appliance/definitions/systemvmtemplate/postinstall.sh
+++ b/tools/appliance/definitions/systemvmtemplate/postinstall.sh
@@ -113,7 +113,7 @@ fix_nameserver() {
# Replace /etc/resolv.conf also
cat > /etc/resolv.conf << EOF
nameserver 8.8.8.8
-nameserver 4.4.4.4
+nameserver 8.8.4.4
EOF
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5fa1ad51/tools/appliance/definitions/systemvmtemplate64/postinstall.sh
----------------------------------------------------------------------
diff --git a/tools/appliance/definitions/systemvmtemplate64/postinstall.sh b/tools/appliance/definitions/systemvmtemplate64/postinstall.sh
index 35a4e4a..786d38d 100644
--- a/tools/appliance/definitions/systemvmtemplate64/postinstall.sh
+++ b/tools/appliance/definitions/systemvmtemplate64/postinstall.sh
@@ -112,7 +112,7 @@ fix_nameserver() {
# Replace /etc/resolv.conf also
cat > /etc/resolv.conf << EOF
nameserver 8.8.8.8
-nameserver 4.4.4.4
+nameserver 8.8.4.4
EOF
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5fa1ad51/tools/devcloud-kvm/devcloud-kvm.cfg
----------------------------------------------------------------------
diff --git a/tools/devcloud-kvm/devcloud-kvm.cfg b/tools/devcloud-kvm/devcloud-kvm.cfg
index b3f048a..9f310e3 100644
--- a/tools/devcloud-kvm/devcloud-kvm.cfg
+++ b/tools/devcloud-kvm/devcloud-kvm.cfg
@@ -46,7 +46,7 @@
]
}
],
- "dns2": "4.4.4.4",
+ "dns2": "8.8.4.4",
"dns1": "8.8.8.8",
"securitygroupenabled": "true",
"localstorageenabled": "true",
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5fa1ad51/tools/devcloud/devcloud.cfg
----------------------------------------------------------------------
diff --git a/tools/devcloud/devcloud.cfg b/tools/devcloud/devcloud.cfg
index e6ab71b..f665e82 100644
--- a/tools/devcloud/devcloud.cfg
+++ b/tools/devcloud/devcloud.cfg
@@ -45,7 +45,7 @@
]
}
],
- "dns2": "4.4.4.4",
+ "dns2": "8.8.4.4",
"dns1": "8.8.8.8",
"securitygroupenabled": "true",
"localstorageenabled": "true",
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5fa1ad51/tools/devcloud/devcloud_internal-mgt.cfg
----------------------------------------------------------------------
diff --git a/tools/devcloud/devcloud_internal-mgt.cfg b/tools/devcloud/devcloud_internal-mgt.cfg
index fe3dd1b..beae345 100644
--- a/tools/devcloud/devcloud_internal-mgt.cfg
+++ b/tools/devcloud/devcloud_internal-mgt.cfg
@@ -44,7 +44,7 @@
]
}
],
- "dns2": "4.4.4.4",
+ "dns2": "8.8.4.4",
"dns1": "8.8.8.8",
"securitygroupenabled": "true",
"localstorageenabled": "true",
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5fa1ad51/tools/devcloud/quickcloud.cfg
----------------------------------------------------------------------
diff --git a/tools/devcloud/quickcloud.cfg b/tools/devcloud/quickcloud.cfg
index a2613d2..77bc114 100644
--- a/tools/devcloud/quickcloud.cfg
+++ b/tools/devcloud/quickcloud.cfg
@@ -49,7 +49,7 @@
]
}
],
- "dns2": "4.4.4.4",
+ "dns2": "8.8.4.4",
"dns1": "8.8.8.8",
"securitygroupenabled": "true",
"localstorageenabled": "true",
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5fa1ad51/tools/marvin/marvin/configGenerator.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/configGenerator.py b/tools/marvin/marvin/configGenerator.py
index c970ada..bd83efb 100644
--- a/tools/marvin/marvin/configGenerator.py
+++ b/tools/marvin/marvin/configGenerator.py
@@ -269,7 +269,7 @@ def describe_setup_in_basic_mode():
for l in range(1):
z = zone()
z.dns1 = "8.8.8.8"
- z.dns2 = "4.4.4.4"
+ z.dns2 = "8.8.4.4"
z.internaldns1 = "192.168.110.254"
z.internaldns2 = "192.168.110.253"
z.name = "test"+str(l)
@@ -390,7 +390,7 @@ def describe_setup_in_eip_mode():
for l in range(1):
z = zone()
z.dns1 = "8.8.8.8"
- z.dns2 = "4.4.4.4"
+ z.dns2 = "8.8.4.4"
z.internaldns1 = "192.168.110.254"
z.internaldns2 = "192.168.110.253"
z.name = "test"+str(l)
@@ -519,7 +519,7 @@ def describe_setup_in_advanced_mode():
for l in range(1):
z = zone()
z.dns1 = "8.8.8.8"
- z.dns2 = "4.4.4.4"
+ z.dns2 = "8.8.4.4"
z.internaldns1 = "192.168.110.254"
z.internaldns2 = "192.168.110.253"
z.name = "test"+str(l)
@@ -645,7 +645,7 @@ def describe_setup_in_advancedsg_mode():
for l in range(1):
z = zone()
z.dns1 = "8.8.8.8"
- z.dns2 = "4.4.4.4"
+ z.dns2 = "8.8.4.4"
z.internaldns1 = "192.168.110.254"
z.internaldns2 = "192.168.110.253"
z.name = "test"+str(l)
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5fa1ad51/tools/marvin/marvin/jsonHelper.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/jsonHelper.py b/tools/marvin/marvin/jsonHelper.py
index 37363bc..79a6369 100644
--- a/tools/marvin/marvin/jsonHelper.py
+++ b/tools/marvin/marvin/jsonHelper.py
@@ -142,7 +142,7 @@ if __name__ == "__main__":
nsp = getResultObj(result)
print nsp[0].id
- result = '{ "listzonesresponse" : { "count":1 ,"zone" : [ {"id":1,"name":"test0","dns1":"8.8.8.8","dns2":"4.4.4.4","internaldns1":"192.168.110.254","internaldns2":"192.168.110.253","networktype":"Basic","securitygroupsenabled":true,"allocationstate":"Enabled","zonetoken":"5e818a11-6b00-3429-9a07-e27511d3169a","dhcpprovider":"DhcpServer"} ] } }'
+ result = '{ "listzonesresponse" : { "count":1 ,"zone" : [ {"id":1,"name":"test0","dns1":"8.8.8.8","dns2":"8.8.4.4","internaldns1":"192.168.110.254","internaldns2":"192.168.110.253","networktype":"Basic","securitygroupsenabled":true,"allocationstate":"Enabled","zonetoken":"5e818a11-6b00-3429-9a07-e27511d3169a","dhcpprovider":"DhcpServer"} ] } }'
zones = getResultObj(result)
print zones[0].id
res = authorizeSecurityGroupIngress.authorizeSecurityGroupIngressResponse()
@@ -165,7 +165,7 @@ if __name__ == "__main__":
asynJob = getResultObj(result)
print asynJob
- result = '{ "createzoneresponse" : { "zone" : {"id":1,"name":"test0","dns1":"8.8.8.8","dns2":"4.4.4.4","internaldns1":"192.168.110.254","internaldns2":"192.168.110.253","networktype":"Basic","securitygroupsenabled":true,"allocationstate":"Enabled","zonetoken":"3442f287-e932-3111-960b-514d1f9c4610","dhcpprovider":"DhcpServer"} } }'
+ result = '{ "createzoneresponse" : { "zone" : {"id":1,"name":"test0","dns1":"8.8.8.8","dns2":"8.8.4.4","internaldns1":"192.168.110.254","internaldns2":"192.168.110.253","networktype":"Basic","securitygroupsenabled":true,"allocationstate":"Enabled","zonetoken":"3442f287-e932-3111-960b-514d1f9c4610","dhcpprovider":"DhcpServer"} } }'
res = createZone.createZoneResponse()
zone = getResultObj(result, res)
print zone.id
[21/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
CLOUDSTACK-747: Internal LB detailView - Assigned VMs tab - add source port, instance port to listView.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/62025632
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/62025632
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/62025632
Branch: refs/heads/vmsync
Commit: 62025632f904b3f46f5d35b499235701be6f48cf
Parents: bdb5997
Author: Jessica Wang <je...@apache.org>
Authored: Thu Jun 6 10:55:12 2013 -0700
Committer: Jessica Wang <je...@apache.org>
Committed: Thu Jun 6 10:55:12 2013 -0700
----------------------------------------------------------------------
ui/scripts/vpc.js | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/62025632/ui/scripts/vpc.js
----------------------------------------------------------------------
diff --git a/ui/scripts/vpc.js b/ui/scripts/vpc.js
index f0b449f..082cc25 100644
--- a/ui/scripts/vpc.js
+++ b/ui/scripts/vpc.js
@@ -359,6 +359,8 @@
fields: {
name: { label: 'label.name' },
sourceipaddress: { label: 'Source IP Address' },
+ sourceport: { label: 'Source Port' },
+ instanceport: { label: 'Instance Port' },
algorithm: { label: 'label.algorithm' }
},
dataProvider: function(args) {
@@ -369,8 +371,15 @@
},
success: function(json) {
var items = json.listloadbalancerssresponse.loadbalancer;
- args.response.success({ data: items });
-
+ if(items != null) {
+ for(var i = 0; i < items.length; i++) {
+ var item = items[i];
+ //there is only one element in loadbalancerrul array property.
+ item.sourceport = item.loadbalancerrule[0].sourceport;
+ item.instanceport = item.loadbalancerrule[0].instanceport;
+ }
+ }
+ args.response.success({ data: items });
}
});
},
[36/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
CLOUDSTACK-869:Netscaler support as an external LB provider:front end
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/bcc5baa1
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/bcc5baa1
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/bcc5baa1
Branch: refs/heads/vmsync
Commit: bcc5baa1636037baa8c5ffbd3bbf70df8af4d024
Parents: e17a0c2
Author: Pranav Saxena <pr...@citrix.com>
Authored: Fri Jun 7 16:23:44 2013 +0530
Committer: Pranav Saxena <pr...@citrix.com>
Committed: Fri Jun 7 16:23:44 2013 +0530
----------------------------------------------------------------------
ui/scripts/network.js | 14 ++++++++++++++
1 file changed, 14 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/bcc5baa1/ui/scripts/network.js
----------------------------------------------------------------------
diff --git a/ui/scripts/network.js b/ui/scripts/network.js
index 050b75c..a3e239b 100755
--- a/ui/scripts/network.js
+++ b/ui/scripts/network.js
@@ -4531,7 +4531,21 @@
networkdomain: {
docID: 'helpVPCDomain',
label: 'label.DNS.domain.for.guest.networks'
+ },
+
+ loadbalancer:{ //Support for Netscaler as an external device for load balancing
+ label:'Load Balancer',
+ select:function(args){
+
+ var items = [];
+ items.push({id:'vpcvirtualrouter' , description:'VPC Virtual Router'});
+ items.push({id:'netscaler' , description:'NetScaler'});
+
+ args.response.success({data:items});
}
+
+ }
+
}
},
action: function(args) {
[30/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
Changing URL to vcenter while adding a VmwareDC
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/c2ac4090
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/c2ac4090
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/c2ac4090
Branch: refs/heads/vmsync
Commit: c2ac4090d947dae21fdab31573b0a369de1fd2a2
Parents: e7d5cca
Author: Pranav Saxena <pr...@citrix.com>
Authored: Fri Jun 7 12:22:43 2013 +0530
Committer: Pranav Saxena <pr...@citrix.com>
Committed: Fri Jun 7 12:22:43 2013 +0530
----------------------------------------------------------------------
ui/scripts/zoneWizard.js | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c2ac4090/ui/scripts/zoneWizard.js
----------------------------------------------------------------------
diff --git a/ui/scripts/zoneWizard.js b/ui/scripts/zoneWizard.js
index 6631cba..5870a7b 100755
--- a/ui/scripts/zoneWizard.js
+++ b/ui/scripts/zoneWizard.js
@@ -3366,10 +3366,11 @@
zoneId: args.data.returnedZone.id,
username: args.data.cluster.vCenterUsername,
password: args.data.cluster.vCenterPassword,
- name: args.data.cluster.vCenterDatacenter
+ name: args.data.cluster.vCenterDatacenter,
+ vcenter: args.data.cluster.vCenterHost
};
$.ajax({
- url: createURL('addVmwareDc&url=' + todb(url)),
+ url: createURL('addVmwareDc'),
data: vmwareData,
success: function(json) {
var item = json.addvmwaredcresponse.vmwaredc;
[24/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
Allow account to have multiple networks with customer defined cidrs as we already let it happen when the cidr is taken from the physical network config
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/f4a1a2ff
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/f4a1a2ff
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/f4a1a2ff
Branch: refs/heads/vmsync
Commit: f4a1a2ff380478fcd23319f0fd2678c50b971e36
Parents: 9a175f9
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Thu Jun 6 11:52:15 2013 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Thu Jun 6 11:52:15 2013 -0700
----------------------------------------------------------------------
.../src/com/cloud/network/NetworkManagerImpl.java | 17 -----------------
1 file changed, 17 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f4a1a2ff/server/src/com/cloud/network/NetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java
index b92ef4b..cae4e8a 100755
--- a/server/src/com/cloud/network/NetworkManagerImpl.java
+++ b/server/src/com/cloud/network/NetworkManagerImpl.java
@@ -1490,23 +1490,6 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
return configs;
}
}
- } else if (predefined != null && predefined.getCidr() != null && predefined.getBroadcastUri() == null && vpcId == null) {
- // don't allow to have 2 networks with the same cidr in the same zone for the account
- List<NetworkVO> configs = _networksDao.listBy(owner.getId(), plan.getDataCenterId(), predefined.getCidr(), true);
- if (configs.size() > 0) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Found existing network configuration for offering " + offering + ": " + configs.get(0));
- }
-
- if (errorIfAlreadySetup) {
- InvalidParameterValueException ex = new InvalidParameterValueException("Found existing network configuration (with specified id) for offering (with specified id)");
- ex.addProxyObject(offering.getUuid(), "offeringId");
- ex.addProxyObject(configs.get(0).getUuid(), "networkConfigId");
- throw ex;
- } else {
- return configs;
- }
- }
}
List<NetworkVO> networks = new ArrayList<NetworkVO>();
[08/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
Adding rule number field to ACL rule to make it AWS compatible
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/4c397da8
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/4c397da8
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/4c397da8
Branch: refs/heads/vmsync
Commit: 4c397da8f64d57ebad0a95442629b01e8edf2522
Parents: d2e6bf5
Author: Pranav Saxena <pr...@citrix.com>
Authored: Thu Jun 6 14:07:12 2013 +0530
Committer: Pranav Saxena <pr...@citrix.com>
Committed: Thu Jun 6 14:07:12 2013 +0530
----------------------------------------------------------------------
ui/scripts/vpc.js | 7 +++++++
1 file changed, 7 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4c397da8/ui/scripts/vpc.js
----------------------------------------------------------------------
diff --git a/ui/scripts/vpc.js b/ui/scripts/vpc.js
index e666ab9..164f2bb 100644
--- a/ui/scripts/vpc.js
+++ b/ui/scripts/vpc.js
@@ -57,6 +57,13 @@
}
},
fields: {
+
+ 'rulenumber':{
+ label:'Rule Number',
+ edit:true
+
+ },
+
'cidrlist': { edit: true, label: 'label.cidr' },
action: {
label: 'Action',
[45/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
Remove vm from cleanup list
VM will be cleaned up when the account is cleaned up
Signed-off-by: Prasanna Santhanam <ts...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/c30d9be3
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/c30d9be3
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/c30d9be3
Branch: refs/heads/vmsync
Commit: c30d9be3cea30339cfff40c1002906634291b373
Parents: cb80ae2
Author: Prasanna Santhanam <ts...@apache.org>
Authored: Sat Jun 8 13:27:08 2013 +0530
Committer: Prasanna Santhanam <ts...@apache.org>
Committed: Sat Jun 8 13:27:08 2013 +0530
----------------------------------------------------------------------
test/integration/smoke/test_routers.py | 1 -
1 file changed, 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c30d9be3/test/integration/smoke/test_routers.py
----------------------------------------------------------------------
diff --git a/test/integration/smoke/test_routers.py b/test/integration/smoke/test_routers.py
index f6ca279..d89acf9 100644
--- a/test/integration/smoke/test_routers.py
+++ b/test/integration/smoke/test_routers.py
@@ -107,7 +107,6 @@ class TestRouterServices(cloudstackTestCase):
serviceofferingid=cls.service_offering.id
)
cls.cleanup = [
- cls.vm_1,
cls.account,
cls.service_offering
]
[32/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/cloudstack
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/4f07679d
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/4f07679d
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/4f07679d
Branch: refs/heads/vmsync
Commit: 4f07679d4966a0e2de97fb0e3a42fb695436e330
Parents: 1bdb626 c2ac409
Author: Sebastien Goasguen <ru...@gmail.com>
Authored: Fri Jun 7 02:59:48 2013 -0400
Committer: Sebastien Goasguen <ru...@gmail.com>
Committed: Fri Jun 7 02:59:48 2013 -0400
----------------------------------------------------------------------
.../debian/config/etc/iptables/iptables-router | 1 +
.../ExternalFirewallDeviceManagerImpl.java | 2 +-
.../ExternalLoadBalancerDeviceManagerImpl.java | 4 +-
.../src/com/cloud/network/NetworkManager.java | 2 +-
.../com/cloud/network/NetworkManagerImpl.java | 20 +--------
.../src/com/cloud/network/NetworkModelImpl.java | 17 +++++---
.../com/cloud/network/NetworkServiceImpl.java | 1 +
.../cloud/network/guru/DirectNetworkGuru.java | 5 +--
.../network/guru/DirectPodBasedNetworkGuru.java | 2 +-
.../VirtualNetworkApplianceManagerImpl.java | 46 +++++++++++---------
.../VpcVirtualNetworkApplianceManagerImpl.java | 6 +--
.../network/vpc/NetworkACLManagerImpl.java | 3 ++
.../network/vpc/NetworkACLServiceImpl.java | 40 +++++++++--------
.../cloud/network/MockNetworkManagerImpl.java | 9 +---
.../com/cloud/vpc/MockNetworkManagerImpl.java | 2 +-
test/integration/smoke/test_volumes.py | 5 +++
ui/scripts/system.js | 16 +++----
ui/scripts/vpc.js | 45 +++++++++++++------
ui/scripts/zoneWizard.js | 5 ++-
19 files changed, 122 insertions(+), 109 deletions(-)
----------------------------------------------------------------------
[44/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
Debian repository (backports) now has latest haproxy, re-introduce into systemvm
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/cb80ae24
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/cb80ae24
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/cb80ae24
Branch: refs/heads/vmsync
Commit: cb80ae2440aec8586cb34834cc3939d93a12beea
Parents: 8c9f681
Author: Chiradeep Vittal <ch...@apache.org>
Authored: Fri Jun 7 17:28:53 2013 -0700
Committer: Chiradeep Vittal <ch...@apache.org>
Committed: Fri Jun 7 17:29:14 2013 -0700
----------------------------------------------------------------------
.../definitions/systemvmtemplate/postinstall.sh | 13 +++++++++----
.../definitions/systemvmtemplate64/postinstall.sh | 15 +++++++++++----
2 files changed, 20 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/cb80ae24/tools/appliance/definitions/systemvmtemplate/postinstall.sh
----------------------------------------------------------------------
diff --git a/tools/appliance/definitions/systemvmtemplate/postinstall.sh b/tools/appliance/definitions/systemvmtemplate/postinstall.sh
index e052cf9..203cf54 100644
--- a/tools/appliance/definitions/systemvmtemplate/postinstall.sh
+++ b/tools/appliance/definitions/systemvmtemplate/postinstall.sh
@@ -21,6 +21,12 @@ ROOTPW=password
HOSTNAME=systemvm
CLOUDSTACK_RELEASE=4.2.0
+add_backports () {
+ sed -i '/backports/d' /etc/apt/sources.list
+ echo 'deb http://http.us.debian.org/debian wheezy-backports main' >> /etc/apt/sources.list
+ apt-get update
+}
+
install_packages() {
DEBIAN_FRONTEND=noninteractive
DEBIAN_PRIORITY=critical
@@ -81,10 +87,7 @@ install_packages() {
# rm -fr /opt/vmware-tools-distrib
# apt-get -q -y --force-yes purge build-essential
- # haproxy. Wheezy doesn't have haproxy, install from backports
- #apt-get --no-install-recommends -q -y --force-yes install haproxy
- wget http://ftp.us.debian.org/debian/pool/main/h/haproxy/haproxy_1.4.8-1_i386.deb
- dpkg -i haproxy_1.4.8-1_i386.deb
+ apt-get --no-install-recommends -q -y --force-yes install haproxy
}
setup_accounts() {
@@ -223,6 +226,8 @@ do_signature() {
begin=$(date +%s)
+echo "*************ADDING BACKPORTS********************"
+add_backports
echo "*************INSTALLING PACKAGES********************"
install_packages
echo "*************DONE INSTALLING PACKAGES********************"
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/cb80ae24/tools/appliance/definitions/systemvmtemplate64/postinstall.sh
----------------------------------------------------------------------
diff --git a/tools/appliance/definitions/systemvmtemplate64/postinstall.sh b/tools/appliance/definitions/systemvmtemplate64/postinstall.sh
index 786d38d..cbcd282 100644
--- a/tools/appliance/definitions/systemvmtemplate64/postinstall.sh
+++ b/tools/appliance/definitions/systemvmtemplate64/postinstall.sh
@@ -21,6 +21,13 @@ ROOTPW=password
HOSTNAME=systemvm
CLOUDSTACK_RELEASE=4.2.0
+add_backports () {
+ sed -i '/backports/d' /etc/apt/sources.list
+ echo 'deb http://http.us.debian.org/debian wheezy-backports main' >> /etc/apt/sources.list
+ apt-get update
+}
+
+
install_packages() {
DEBIAN_FRONTEND=noninteractive
DEBIAN_PRIORITY=critical
@@ -80,10 +87,8 @@ install_packages() {
# rm -fr /opt/vmware-tools-distrib
# apt-get -q -y --force-yes purge build-essential
- # haproxy. Wheezy doesn't have haproxy temporarily, install from backports
- #apt-get --no-install-recommends -q -y --force-yes install haproxy
- wget http://ftp.us.debian.org/debian/pool/main/h/haproxy/haproxy_1.4.8-1_amd64.deb
- dpkg -i haproxy_1.4.8-1_amd64.deb
+ apt-get --no-install-recommends -q -y --force-yes install haproxy
+
}
setup_accounts() {
@@ -222,6 +227,8 @@ do_signature() {
begin=$(date +%s)
+echo "*************ADDING BACKPORTS********************"
+add_backports
echo "*************INSTALLING PACKAGES********************"
install_packages
echo "*************DONE INSTALLING PACKAGES********************"
[49/50] [abbrv] Merged from master
Posted by ah...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/plugins/affinity-group-processors/explicit-dedication/src/org/apache/cloudstack/affinity/ExplicitDedicationProcessor.java
----------------------------------------------------------------------
diff --cc plugins/affinity-group-processors/explicit-dedication/src/org/apache/cloudstack/affinity/ExplicitDedicationProcessor.java
index 0000000,a0eb56c..2169359
mode 000000,100644..100644
--- a/plugins/affinity-group-processors/explicit-dedication/src/org/apache/cloudstack/affinity/ExplicitDedicationProcessor.java
+++ b/plugins/affinity-group-processors/explicit-dedication/src/org/apache/cloudstack/affinity/ExplicitDedicationProcessor.java
@@@ -1,0 -1,383 +1,384 @@@
+ // 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.util.ArrayList;
+ import java.util.List;
+ import java.util.Set;
+
+ import javax.ejb.Local;
+ import javax.inject.Inject;
+
++import org.apache.log4j.Logger;
++
+ import org.apache.cloudstack.affinity.dao.AffinityGroupDao;
+ import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
-import org.apache.log4j.Logger;
+
+ import com.cloud.dc.ClusterVO;
+ import com.cloud.dc.DataCenter;
+ import com.cloud.dc.DataCenterVO;
+ import com.cloud.dc.DedicatedResourceVO;
+ import com.cloud.dc.HostPodVO;
+ import com.cloud.dc.dao.ClusterDao;
+ import com.cloud.dc.dao.DataCenterDao;
+ import com.cloud.dc.dao.DedicatedResourceDao;
+ import com.cloud.dc.dao.HostPodDao;
+ import com.cloud.deploy.DeploymentPlan;
+ import com.cloud.deploy.DeploymentPlanner.ExcludeList;
+ import com.cloud.domain.DomainVO;
+ import com.cloud.domain.dao.DomainDao;
+ import com.cloud.exception.AffinityConflictException;
+ import com.cloud.host.HostVO;
+ import com.cloud.host.dao.HostDao;
+ import com.cloud.utils.exception.CloudRuntimeException;
+ import com.cloud.vm.VirtualMachine;
+ import com.cloud.vm.VirtualMachineProfile;
+ import com.cloud.vm.dao.UserVmDao;
+ import com.cloud.vm.dao.VMInstanceDao;
+
+ @Local(value = AffinityGroupProcessor.class)
+ public class ExplicitDedicationProcessor extends AffinityProcessorBase implements AffinityGroupProcessor {
+
+ private static final Logger s_logger = Logger.getLogger(ExplicitDedicationProcessor.class);
+ @Inject
+ protected UserVmDao _vmDao;
+ @Inject
+ protected VMInstanceDao _vmInstanceDao;
+ @Inject
+ protected DataCenterDao _dcDao;
+ @Inject
+ protected DedicatedResourceDao _dedicatedDao;
+ @Inject
+ protected HostPodDao _podDao;
+ @Inject
+ protected ClusterDao _clusterDao;
+ @Inject
+ protected HostDao _hostDao;
+ @Inject
+ protected DomainDao _domainDao;
+ @Inject
+ protected AffinityGroupDao _affinityGroupDao;
+ @Inject
+ protected AffinityGroupVMMapDao _affinityGroupVMMapDao;
+
+ /**
+ * This method will process the affinity group of type 'Explicit Dedication' for a deployment of a VM that demands dedicated resources.
+ * For ExplicitDedicationProcessor we need to add dedicated resources into the IncludeList based on the level we have dedicated resources available.
+ * For eg. if admin dedicates a pod to a domain, then all the user in that domain can use the resources of that pod.
+ * We need to take care of the situation when dedicated resources further have resources dedicated to sub-domain/account.
+ * This IncludeList is then used to update the avoid list for a given data center.
+ */
+ @Override
- public void process(VirtualMachineProfile<? extends VirtualMachine> vmProfile, DeploymentPlan plan,
++ public void process(VirtualMachineProfile vmProfile, DeploymentPlan plan,
+ ExcludeList avoid) throws AffinityConflictException {
+ VirtualMachine vm = vmProfile.getVirtualMachine();
+ List<AffinityGroupVMMapVO> vmGroupMappings = _affinityGroupVMMapDao.findByVmIdType(vm.getId(), getType());
+ DataCenter dc = _dcDao.findById(vm.getDataCenterId());
+ long domainId = vm.getDomainId();
+ long accountId = vm.getAccountId();
+
+ for (AffinityGroupVMMapVO vmGroupMapping : vmGroupMappings) {
+ if (vmGroupMapping != null) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Processing affinity group of type 'ExplicitDedication' for VM Id: " + vm.getId());
+ }
+
+ List<DedicatedResourceVO> dr = _dedicatedDao.listByAccountId(accountId);
+ List<DedicatedResourceVO> drOfDomain = searchInDomainResources(domainId);
+ List<DedicatedResourceVO> drOfParentDomain = searchInParentDomainResources(domainId);
+ List<DedicatedResourceVO> resourceList = new ArrayList<DedicatedResourceVO>();
+ resourceList.addAll(dr);
+ resourceList.addAll(drOfDomain);
+ resourceList.addAll(drOfParentDomain);
+ boolean canUse = false;
+
+ if (plan.getHostId() != null) {
+ HostVO host = _hostDao.findById(plan.getHostId());
+ ClusterVO clusterofHost = _clusterDao.findById(host.getClusterId());
+ HostPodVO podOfHost = _podDao.findById(host.getPodId());
+ DataCenterVO zoneOfHost = _dcDao.findById(host.getDataCenterId());
+ if (resourceList != null && resourceList.size() != 0) {
+ for(DedicatedResourceVO resource : resourceList){
+ if ((resource.getHostId() != null && resource.getHostId() == plan.getHostId()) ||
+ (resource.getClusterId() != null && resource.getClusterId() == clusterofHost.getId()) ||
+ (resource.getPodId() != null && resource.getPodId() == podOfHost.getId()) ||
+ (resource.getDataCenterId() != null && resource.getDataCenterId() == zoneOfHost.getId())){
+ canUse = true;
+ }
+ }
+ }
+ if (!canUse) {
+ throw new CloudRuntimeException("Cannot use this host " + host.getName() + " for explicit dedication");
+ }
+ } else if (plan.getClusterId() != null) {
+ ClusterVO cluster = _clusterDao.findById(plan.getClusterId());
+ HostPodVO podOfCluster = _podDao.findById(cluster.getPodId());
+ DataCenterVO zoneOfCluster = _dcDao.findById(cluster.getDataCenterId());
+ List<HostVO> hostToUse = new ArrayList<HostVO>();
+ // check whether this cluster or its pod is dedicated
+ if (resourceList != null && resourceList.size() != 0) {
+ for(DedicatedResourceVO resource : resourceList){
+ if ((resource.getClusterId() != null && resource.getClusterId() == cluster.getId()) ||
+ (resource.getPodId() != null && resource.getPodId() == podOfCluster.getId()) ||
+ (resource.getDataCenterId() != null && resource.getDataCenterId() == zoneOfCluster.getId())){
+ canUse = true;
+ }
+
+ // check for all dedicated host; if it belongs to this cluster
+ if (!canUse){
+ if (resource.getHostId() != null) {
+ HostVO dHost = _hostDao.findById(resource.getHostId());
+ if (dHost.getClusterId() == cluster.getId()) {
+ hostToUse.add(dHost);
+ }
+ }
+ }
+
+ }
+ }
+
+ if (hostToUse.isEmpty() && !canUse) {
+ throw new CloudRuntimeException("Cannot use this cluster " + cluster.getName() + " for explicit dedication");
+ }
+
+ if (hostToUse != null && hostToUse.size() != 0) {
+ // add other non-dedicated hosts to avoid list
+ List<HostVO> hostList = _hostDao.findByClusterId(cluster.getId());
+ for (HostVO host : hostList){
+ if (!hostToUse.contains(host)) {
+ avoid.addHost(host.getId());
+ }
+ }
+ }
+
+ } else if (plan.getPodId() != null) {
+ HostPodVO pod = _podDao.findById(plan.getPodId());
+ DataCenterVO zoneOfPod = _dcDao.findById(pod.getDataCenterId());
+ List<ClusterVO> clustersToUse = new ArrayList<ClusterVO>();
+ List<HostVO> hostsToUse = new ArrayList<HostVO>();
+ // check whether this cluster or its pod is dedicated
+ if (resourceList != null && resourceList.size() != 0) {
+ for(DedicatedResourceVO resource : resourceList){
+ if ((resource.getPodId() != null && resource.getPodId() == pod.getId()) ||
+ (resource.getDataCenterId() != null && resource.getDataCenterId() == zoneOfPod.getId())){
+ canUse = true;
+ }
+
+ // check for all dedicated cluster/host; if it belongs to this pod
+ if (!canUse){
+ if (resource.getClusterId() != null) {
+ ClusterVO dCluster = _clusterDao.findById(resource.getClusterId());
+ if (dCluster.getPodId() == pod.getId()) {
+ clustersToUse.add(dCluster);
+ }
+ }
+ if (resource.getHostId() != null) {
+ HostVO dHost = _hostDao.findById(resource.getHostId());
+ if (dHost.getPodId() == pod.getId()) {
+ hostsToUse.add(dHost);
+ }
+ }
+ }
+
+ }
+ }
+
+ if (hostsToUse.isEmpty() && clustersToUse.isEmpty() && !canUse) {
+ throw new CloudRuntimeException("Cannot use this pod " + pod.getName() + " for explicit dedication");
+ }
+
+ if (clustersToUse != null && clustersToUse.size() != 0) {
+ // add other non-dedicated clusters to avoid list
+ List<ClusterVO> clusterList = _clusterDao.listByPodId(pod.getId());
+ for (ClusterVO cluster : clusterList){
+ if (!clustersToUse.contains(cluster)) {
+ avoid.addCluster(cluster.getId());
+ }
+ }
+ }
+
+ if (hostsToUse != null && hostsToUse.size() != 0) {
+ // add other non-dedicated hosts to avoid list
+ List<HostVO> hostList = _hostDao.findByPodId(pod.getId());
+ for (HostVO host : hostList){
+ if (!hostsToUse.contains(host)) {
+ avoid.addHost(host.getId());
+ }
+ }
+ }
+
+ } else {
+ //check all resources under this zone
+ if (dr != null && dr.size() != 0) {
+ avoid = updateAvoidList(dr, avoid, dc);
+ } else if(drOfDomain != null && drOfDomain.size() != 0){
+ avoid = updateAvoidList(drOfDomain, avoid, dc);
+ } else if(drOfParentDomain != null && drOfParentDomain.size() != 0){
+ avoid = updateAvoidList(drOfParentDomain, avoid, dc);
+ } else {
+ avoid.addDataCenter(dc.getId());
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("No dedicated resources available for this domain or account");
+ }
+ }
+
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("ExplicitDedicationProcessor returns Avoid List as: Deploy avoids pods: " + avoid.getPodsToAvoid() + ", clusters: "
+ + avoid.getClustersToAvoid() + ", hosts: " + avoid.getHostsToAvoid());
+ }
+ }
+ }
+ }
+ }
+
+ private ExcludeList updateAvoidList(List<DedicatedResourceVO> dedicatedResources, ExcludeList avoidList, DataCenter dc) {
+ ExcludeList includeList = new ExcludeList();
+ for (DedicatedResourceVO dr : dedicatedResources) {
+ if (dr.getHostId() != null){
+ includeList.addHost(dr.getHostId());
+ HostVO dedicatedHost = _hostDao.findById(dr.getHostId());
+ includeList.addCluster(dedicatedHost.getClusterId());
+ includeList.addPod(dedicatedHost.getPodId());
+ }
+
+ if (dr.getClusterId() != null) {
+ includeList.addCluster(dr.getClusterId());
+ //add all hosts inside this in includeList
+ List<HostVO> hostList = _hostDao.findByClusterId(dr.getClusterId());
+ for (HostVO host : hostList) {
+ DedicatedResourceVO dHost = _dedicatedDao.findByHostId(host.getId());
+ if (dHost != null) {
+ avoidList.addHost(host.getId());
+ } else {
+ includeList.addHost(host.getId());
+ }
+ }
+ ClusterVO dedicatedCluster = _clusterDao.findById(dr.getClusterId());
+ includeList.addPod(dedicatedCluster.getPodId());
+ }
+
+ if (dr.getPodId() != null) {
+ includeList.addPod(dr.getPodId());
+ //add all cluster under this pod in includeList
+ List<ClusterVO> clusterList = _clusterDao.listByPodId(dr.getPodId());
+ for (ClusterVO cluster : clusterList) {
+ if (_dedicatedDao.findByClusterId(cluster.getId()) != null) {
+ avoidList.addCluster(cluster.getId());
+ } else {
+ includeList.addCluster(cluster.getId());
+ }
+ }
+ //add all hosts inside this pod in includeList
+ List<HostVO> hostList = _hostDao.findByPodId(dr.getPodId());
+ for (HostVO host : hostList) {
+ if (_dedicatedDao.findByHostId(host.getId()) != null) {
+ avoidList.addHost(host.getId());
+ } else {
+ includeList.addHost(host.getId());
+ }
+ }
+ }
+
+ if (dr.getDataCenterId() != null) {
+ includeList.addDataCenter(dr.getDataCenterId());
+ //add all Pod under this data center in includeList
+ List<HostPodVO> podList = _podDao.listByDataCenterId(dr.getDataCenterId());
+ for (HostPodVO pod : podList) {
+ if (_dedicatedDao.findByPodId(pod.getId()) != null) {
+ avoidList.addPod(pod.getId());
+ } else {
+ includeList.addPod(pod.getId());
+ }
+ }
+ List<ClusterVO> clusterList = _clusterDao.listClustersByDcId(dr.getDataCenterId());
+ for (ClusterVO cluster : clusterList) {
+ if (_dedicatedDao.findByClusterId(cluster.getId()) != null) {
+ avoidList.addCluster(cluster.getId());
+ } else {
+ includeList.addCluster(cluster.getId());
+ }
+ }
+ //add all hosts inside this in includeList
+ List<HostVO> hostList = _hostDao.listByDataCenterId(dr.getDataCenterId());
+ for (HostVO host : hostList) {
+ if (_dedicatedDao.findByHostId(host.getId()) != null) {
+ avoidList.addHost(host.getId());
+ } else {
+ includeList.addHost(host.getId());
+ }
+ }
+ }
+ }
+ //Update avoid list using includeList.
+ //add resources in avoid list which are not in include list.
+
+ List<HostPodVO> pods = _podDao.listByDataCenterId(dc.getId());
+ List<ClusterVO> clusters = _clusterDao.listClustersByDcId(dc.getId());
+ List<HostVO> hosts = _hostDao.listByDataCenterId(dc.getId());
+ Set<Long> podsInIncludeList = includeList.getPodsToAvoid();
+ Set<Long> clustersInIncludeList = includeList.getClustersToAvoid();
+ Set<Long> hostsInIncludeList = includeList.getHostsToAvoid();
+
+ for (HostPodVO pod : pods){
+ if (podsInIncludeList != null && !podsInIncludeList.contains(pod.getId())) {
+ avoidList.addPod(pod.getId());
+ }
+ }
+
+ for (ClusterVO cluster : clusters) {
+ if (clustersInIncludeList != null && !clustersInIncludeList.contains(cluster.getId())) {
+ avoidList.addCluster(cluster.getId());
+ }
+ }
+
+ for (HostVO host : hosts) {
+ if (hostsInIncludeList != null && !hostsInIncludeList.contains(host.getId())) {
+ avoidList.addHost(host.getId());
+ }
+ }
+ return avoidList;
+ }
+
+ private List<DedicatedResourceVO> searchInParentDomainResources(long domainId) {
+ List<Long> domainIds = getDomainParentIds(domainId);
+ List<DedicatedResourceVO> dr = new ArrayList<DedicatedResourceVO>();
+ for (Long id : domainIds) {
+ List<DedicatedResourceVO> resource = _dedicatedDao.listByDomainId(id);
+ if(resource != null) {
+ dr.addAll(resource);
+ }
+ }
+ return dr;
+ }
+
+ private List<DedicatedResourceVO> searchInDomainResources(long domainId) {
+ List<DedicatedResourceVO> dr = _dedicatedDao.listByDomainId(domainId);
+ return dr;
+ }
+
+ private List<Long> getDomainParentIds(long domainId) {
+ DomainVO domainRecord = _domainDao.findById(domainId);
+ List<Long> domainIds = new ArrayList<Long>();
+ domainIds.add(domainRecord.getId());
+ while (domainRecord.getParent() != null ){
+ domainRecord = _domainDao.findById(domainRecord.getParent());
+ domainIds.add(domainRecord.getId());
+ }
+ return domainIds;
+ }
+
+ }
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/plugins/dedicated-resources/src/org/apache/cloudstack/dedicated/DedicatedResourceManagerImpl.java
----------------------------------------------------------------------
diff --cc plugins/dedicated-resources/src/org/apache/cloudstack/dedicated/DedicatedResourceManagerImpl.java
index 0000000,c321b22..682a6aa
mode 000000,100755..100755
--- a/plugins/dedicated-resources/src/org/apache/cloudstack/dedicated/DedicatedResourceManagerImpl.java
+++ b/plugins/dedicated-resources/src/org/apache/cloudstack/dedicated/DedicatedResourceManagerImpl.java
@@@ -1,0 -1,815 +1,815 @@@
+ // 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.dedicated;
+
+ import java.util.ArrayList;
+ import java.util.List;
+ import java.util.Map;
+
+ import javax.ejb.Local;
+ import javax.inject.Inject;
+ import javax.naming.ConfigurationException;
+
-import com.cloud.utils.component.AdapterBase;
++import org.apache.log4j.Logger;
++import org.springframework.stereotype.Component;
++
+ import org.apache.cloudstack.api.commands.DedicateClusterCmd;
+ import org.apache.cloudstack.api.commands.DedicateHostCmd;
+ import org.apache.cloudstack.api.commands.DedicatePodCmd;
+ import org.apache.cloudstack.api.commands.DedicateZoneCmd;
+ import org.apache.cloudstack.api.commands.ListDedicatedClustersCmd;
+ import org.apache.cloudstack.api.commands.ListDedicatedHostsCmd;
+ import org.apache.cloudstack.api.commands.ListDedicatedPodsCmd;
+ import org.apache.cloudstack.api.commands.ListDedicatedZonesCmd;
+ import org.apache.cloudstack.api.commands.ReleaseDedicatedClusterCmd;
+ import org.apache.cloudstack.api.commands.ReleaseDedicatedHostCmd;
+ import org.apache.cloudstack.api.commands.ReleaseDedicatedPodCmd;
+ import org.apache.cloudstack.api.commands.ReleaseDedicatedZoneCmd;
+ import org.apache.cloudstack.api.response.DedicateClusterResponse;
+ import org.apache.cloudstack.api.response.DedicateHostResponse;
+ import org.apache.cloudstack.api.response.DedicatePodResponse;
+ import org.apache.cloudstack.api.response.DedicateZoneResponse;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
++import org.apache.cloudstack.context.CallContext;
+
+ import com.cloud.configuration.Config;
+ import com.cloud.configuration.dao.ConfigurationDao;
+ import com.cloud.dc.ClusterVO;
+ import com.cloud.dc.DataCenterVO;
+ import com.cloud.dc.DedicatedResourceVO;
+ import com.cloud.dc.DedicatedResources;
+ import com.cloud.dc.HostPodVO;
+ import com.cloud.dc.dao.ClusterDao;
+ import com.cloud.dc.dao.DataCenterDao;
+ import com.cloud.dc.dao.DedicatedResourceDao;
+ import com.cloud.dc.dao.HostPodDao;
+ import com.cloud.domain.DomainVO;
+ import com.cloud.domain.dao.DomainDao;
+ import com.cloud.event.ActionEvent;
+ import com.cloud.event.EventTypes;
+ import com.cloud.exception.InvalidParameterValueException;
+ import com.cloud.host.Host;
+ import com.cloud.host.HostVO;
+ import com.cloud.host.dao.HostDao;
+ import com.cloud.user.Account;
+ import com.cloud.user.AccountManager;
+ import com.cloud.user.AccountVO;
-import com.cloud.user.UserContext;
+ import com.cloud.user.dao.AccountDao;
+ import com.cloud.utils.DateUtil;
+ import com.cloud.utils.NumbersUtil;
+ import com.cloud.utils.Pair;
+ import com.cloud.utils.db.DB;
+ import com.cloud.utils.db.Transaction;
+ import com.cloud.utils.exception.CloudRuntimeException;
+ import com.cloud.vm.UserVmVO;
+ import com.cloud.vm.dao.UserVmDao;
+
+ @Component
+ @Local({DedicatedService.class })
+ public class DedicatedResourceManagerImpl implements DedicatedService {
+ private static final Logger s_logger = Logger.getLogger(DedicatedResourceManagerImpl.class);
+
+ @Inject AccountDao _accountDao;
+ @Inject DomainDao _domainDao;
+ @Inject HostPodDao _podDao;
+ @Inject ClusterDao _clusterDao;
+ @Inject HostDao _hostDao;
+ @Inject DedicatedResourceDao _dedicatedDao;
+ @Inject DataCenterDao _zoneDao;
+ @Inject AccountManager _accountMgr;
+ @Inject UserVmDao _userVmDao;
+ @Inject ConfigurationDao _configDao;
+
+ private int capacityReleaseInterval;
+
+ public boolean configure(final String name, final Map<String, Object> params) throws ConfigurationException {
+ capacityReleaseInterval = NumbersUtil.parseInt(_configDao.getValue(Config.CapacitySkipcountingHours.key()), 3600);
+ return true;
+ }
+
+ @Override
+ @DB
+ @ActionEvent(eventType = EventTypes.EVENT_DEDICATE_RESOURCE, eventDescription = "dedicating a Zone")
+ public List<DedicatedResourceVO> dedicateZone(Long zoneId, Long domainId, String accountName) {
+ Long accountId = null;
+ List<HostVO> hosts = null;
+ if(accountName != null){
- Account caller = UserContext.current().getCaller();
++ Account caller = CallContext.current().getCallingAccount();
+ Account owner = _accountMgr.finalizeOwner(caller, accountName, domainId, null);
+ accountId = owner.getId();
+ }
+ List<Long> childDomainIds = getDomainChildIds(domainId);
+ childDomainIds.add(domainId);
+ checkAccountAndDomain(accountId, domainId);
+ DataCenterVO dc = _zoneDao.findById(zoneId);
+ if (dc == null) {
+ throw new InvalidParameterValueException("Unable to find zone by id " + zoneId);
+ } else {
+ DedicatedResourceVO dedicatedZone = _dedicatedDao.findByZoneId(zoneId);
+ //check if zone is dedicated
+ if(dedicatedZone != null) {
+ s_logger.error("Zone " + dc.getName() + " is already dedicated");
+ throw new CloudRuntimeException("Zone " + dc.getName() + " is already dedicated");
+ }
+
+ //check if any resource under this zone is dedicated to different account or sub-domain
+ List<HostPodVO> pods = _podDao.listByDataCenterId(dc.getId());
+ List<DedicatedResourceVO> podsToRelease = new ArrayList<DedicatedResourceVO>();
+ List<DedicatedResourceVO> clustersToRelease = new ArrayList<DedicatedResourceVO>();
+ List<DedicatedResourceVO> hostsToRelease = new ArrayList<DedicatedResourceVO>();
+ for (HostPodVO pod : pods) {
+ DedicatedResourceVO dPod = _dedicatedDao.findByPodId(pod.getId());
+ if (dPod != null) {
+ if(!(childDomainIds.contains(dPod.getDomainId()))) {
+ throw new CloudRuntimeException("Pod " + pod.getName() + " under this Zone " + dc.getName() + " is dedicated to different account/domain");
+ }
+ if (accountId != null) {
+ if (dPod.getAccountId() == accountId) {
+ podsToRelease.add(dPod);
+ } else {
+ s_logger.error("Pod " + pod.getName() + " under this Zone " + dc.getName() + " is dedicated to different account/domain");
+ throw new CloudRuntimeException("Pod " + pod.getName() + " under this Zone " + dc.getName() + " is dedicated to different account/domain");
+ }
+ } else {
+ if (dPod.getAccountId() == null && dPod.getDomainId() == domainId) {
+ podsToRelease.add(dPod);
+ }
+ }
+ }
+ }
+
+ for (DedicatedResourceVO dr : podsToRelease) {
+ releaseDedicatedResource(null, dr.getPodId(), null, null);
+ }
+
+ List<ClusterVO> clusters = _clusterDao.listClustersByDcId(dc.getId());
+ for (ClusterVO cluster : clusters) {
+ DedicatedResourceVO dCluster = _dedicatedDao.findByClusterId(cluster.getId());
+ if (dCluster != null) {
+ if(!(childDomainIds.contains(dCluster.getDomainId()))) {
+ throw new CloudRuntimeException("Cluster " + cluster.getName() + " under this Zone " + dc.getName() + " is dedicated to different account/domain");
+ }
+ if (accountId != null) {
+ if (dCluster.getAccountId() == accountId) {
+ clustersToRelease.add(dCluster);
+ } else {
+ s_logger.error("Cluster " + cluster.getName() + " under this Zone " + dc.getName() + " is dedicated to different account/domain");
+ throw new CloudRuntimeException("Cluster " + cluster.getName() + " under this Zone " + dc.getName() + " is dedicated to different account/domain");
+ }
+ } else {
+ if (dCluster.getAccountId() == null && dCluster.getDomainId() == domainId) {
+ clustersToRelease.add(dCluster);
+ }
+ }
+ }
+ }
+
+ for (DedicatedResourceVO dr : clustersToRelease) {
+ releaseDedicatedResource(null, null, dr.getClusterId(), null);
+ }
+
+ hosts = _hostDao.listByDataCenterId(dc.getId());
+ for (HostVO host : hosts) {
+ DedicatedResourceVO dHost = _dedicatedDao.findByHostId(host.getId());
+ if (dHost != null) {
+ if(!(childDomainIds.contains(dHost.getDomainId()))) {
+ throw new CloudRuntimeException("Host " + host.getName() + " under this Zone " + dc.getName() + " is dedicated to different account/domain");
+ }
+ if (accountId != null) {
+ if (dHost.getAccountId() == accountId) {
+ hostsToRelease.add(dHost);
+ } else {
+ s_logger.error("Host " + host.getName() + " under this Zone " + dc.getName() + " is dedicated to different account/domain");
+ throw new CloudRuntimeException("Host " + host.getName() + " under this Zone " + dc.getName() + " is dedicated to different account/domain");
+ }
+ } else {
+ if (dHost.getAccountId() == null && dHost.getDomainId() == domainId) {
+ hostsToRelease.add(dHost);
+ }
+ }
+ }
+ }
+
+ for (DedicatedResourceVO dr : hostsToRelease) {
+ releaseDedicatedResource(null, null, null, dr.getHostId());
+ }
+ }
+
+ checkHostsSuitabilityForExplicitDedication(accountId, childDomainIds, hosts);
+
+ Transaction txn = Transaction.currentTxn();
+ txn.start();
+ DedicatedResourceVO dedicatedResource = new DedicatedResourceVO(zoneId, null, null, null, null, null);
+ try {
+ dedicatedResource.setDomainId(domainId);
+ if (accountId != null) {
+ dedicatedResource.setAccountId(accountId);
+ }
+ dedicatedResource = _dedicatedDao.persist(dedicatedResource);
+ } catch (Exception e) {
+ s_logger.error("Unable to dedicate zone due to " + e.getMessage(), e);
+ throw new CloudRuntimeException("Failed to dedicate zone. Please contact Cloud Support.");
+ }
+ txn.commit();
+
+ List<DedicatedResourceVO> result = new ArrayList<DedicatedResourceVO>();
+ result.add(dedicatedResource);
+ return result;
+ }
+
+ @Override
+ @DB
+ @ActionEvent(eventType = EventTypes.EVENT_DEDICATE_RESOURCE, eventDescription = "dedicating a Pod")
+ public List<DedicatedResourceVO> dedicatePod(Long podId, Long domainId, String accountName) {
+ Long accountId = null;
+ if(accountName != null){
- Account caller = UserContext.current().getCaller();
++ Account caller = CallContext.current().getCallingAccount();
+ Account owner = _accountMgr.finalizeOwner(caller, accountName, domainId, null);
+ accountId = owner.getId();
+ }
+ List<Long> childDomainIds = getDomainChildIds(domainId);
+ childDomainIds.add(domainId);
+ checkAccountAndDomain(accountId, domainId);
+ HostPodVO pod = _podDao.findById(podId);
+ List<HostVO> hosts = null;
+ if (pod == null) {
+ throw new InvalidParameterValueException("Unable to find pod by id " + podId);
+ } else {
+ DedicatedResourceVO dedicatedPod = _dedicatedDao.findByPodId(podId);
+ DedicatedResourceVO dedicatedZoneOfPod = _dedicatedDao.findByZoneId(pod.getDataCenterId());
+ //check if pod is dedicated
+ if(dedicatedPod != null ) {
+ s_logger.error("Pod " + pod.getName() + " is already dedicated");
+ throw new CloudRuntimeException("Pod " + pod.getName() + " is already dedicated");
+ }
+
+ if (dedicatedZoneOfPod != null) {
+ boolean domainIdInChildreanList = getDomainChildIds(dedicatedZoneOfPod.getDomainId()).contains(domainId);
+ //can dedicate a pod to an account/domain if zone is dedicated to parent-domain
+ if (dedicatedZoneOfPod.getAccountId() != null || (accountId == null && !domainIdInChildreanList)
+ || (accountId != null && !(dedicatedZoneOfPod.getDomainId() == domainId || domainIdInChildreanList))) {
+ DataCenterVO zone = _zoneDao.findById(pod.getDataCenterId());
+ s_logger.error("Cannot dedicate Pod. Its zone is already dedicated");
+ throw new CloudRuntimeException("Pod's Zone " + zone.getName() + " is already dedicated");
+ }
+ }
+
+ //check if any resource under this pod is dedicated to different account or sub-domain
+ List<ClusterVO> clusters = _clusterDao.listByPodId(pod.getId());
+ List<DedicatedResourceVO> clustersToRelease = new ArrayList<DedicatedResourceVO>();
+ List<DedicatedResourceVO> hostsToRelease = new ArrayList<DedicatedResourceVO>();
+ for (ClusterVO cluster : clusters) {
+ DedicatedResourceVO dCluster = _dedicatedDao.findByClusterId(cluster.getId());
+ if (dCluster != null) {
+ if(!(childDomainIds.contains(dCluster.getDomainId()))) {
+ throw new CloudRuntimeException("Cluster " + cluster.getName() + " under this Pod " + pod.getName() + " is dedicated to different account/domain");
+ }
+ /*if all dedicated resources belongs to same account and domain then we should release dedication
+ and make new entry for this Pod*/
+ if (accountId != null) {
+ if (dCluster.getAccountId() == accountId) {
+ clustersToRelease.add(dCluster);
+ } else {
+ s_logger.error("Cluster " + cluster.getName() + " under this Pod " + pod.getName() + " is dedicated to different account/domain");
+ throw new CloudRuntimeException("Cluster " + cluster.getName() + " under this Pod " + pod.getName() + " is dedicated to different account/domain");
+ }
+ } else {
+ if (dCluster.getAccountId() == null && dCluster.getDomainId() == domainId) {
+ clustersToRelease.add(dCluster);
+ }
+ }
+ }
+ }
+
+ for (DedicatedResourceVO dr : clustersToRelease) {
+ releaseDedicatedResource(null, null, dr.getClusterId(), null);
+ }
+
+ hosts = _hostDao.findByPodId(pod.getId());
+ for (HostVO host : hosts) {
+ DedicatedResourceVO dHost = _dedicatedDao.findByHostId(host.getId());
+ if (dHost != null) {
+ if(!(getDomainChildIds(domainId).contains(dHost.getDomainId()))) {
+ throw new CloudRuntimeException("Host " + host.getName() + " under this Pod " + pod.getName() + " is dedicated to different account/domain");
+ }
+ if (accountId != null) {
+ if (dHost.getAccountId() == accountId) {
+ hostsToRelease.add(dHost);
+ } else {
+ s_logger.error("Host " + host.getName() + " under this Pod " + pod.getName() + " is dedicated to different account/domain");
+ throw new CloudRuntimeException("Host " + host.getName() + " under this Pod " + pod.getName() + " is dedicated to different account/domain");
+ }
+ } else {
+ if (dHost.getAccountId() == null && dHost.getDomainId() == domainId) {
+ hostsToRelease.add(dHost);
+ }
+ }
+ }
+ }
+
+ for (DedicatedResourceVO dr : hostsToRelease) {
+ releaseDedicatedResource(null, null, null, dr.getHostId());
+ }
+ }
+
+ checkHostsSuitabilityForExplicitDedication(accountId, childDomainIds, hosts);
+
+ Transaction txn = Transaction.currentTxn();
+ txn.start();
+ DedicatedResourceVO dedicatedResource = new DedicatedResourceVO(null, podId, null, null, null, null);
+ try {
+ dedicatedResource.setDomainId(domainId);
+ if (accountId != null) {
+ dedicatedResource.setAccountId(accountId);
+ }
+ dedicatedResource = _dedicatedDao.persist(dedicatedResource);
+ } catch (Exception e) {
+ s_logger.error("Unable to dedicate pod due to " + e.getMessage(), e);
+ throw new CloudRuntimeException("Failed to dedicate pod. Please contact Cloud Support.");
+ }
+ txn.commit();
+
+ List<DedicatedResourceVO> result = new ArrayList<DedicatedResourceVO>();
+ result.add(dedicatedResource);
+ return result;
+ }
+
+ @Override
+ @DB
+ @ActionEvent(eventType = EventTypes.EVENT_DEDICATE_RESOURCE, eventDescription = "dedicating a Cluster")
+ public List<DedicatedResourceVO> dedicateCluster(Long clusterId, Long domainId, String accountName) {
+ Long accountId = null;
+ List<HostVO> hosts = null;
+ if(accountName != null){
- Account caller = UserContext.current().getCaller();
++ Account caller = CallContext.current().getCallingAccount();
+ Account owner = _accountMgr.finalizeOwner(caller, accountName, domainId, null);
+ accountId = owner.getId();
+ }
+ List<Long> childDomainIds = getDomainChildIds(domainId);
+ childDomainIds.add(domainId);
+ checkAccountAndDomain(accountId, domainId);
+ ClusterVO cluster = _clusterDao.findById(clusterId);
+ if (cluster == null) {
+ throw new InvalidParameterValueException("Unable to find cluster by id " + clusterId);
+ } else {
+ DedicatedResourceVO dedicatedCluster = _dedicatedDao.findByClusterId(clusterId);
+ DedicatedResourceVO dedicatedPodOfCluster = _dedicatedDao.findByPodId(cluster.getPodId());
+ DedicatedResourceVO dedicatedZoneOfCluster = _dedicatedDao.findByZoneId(cluster.getDataCenterId());
+
+ //check if cluster is dedicated
+ if(dedicatedCluster != null) {
+ s_logger.error("Cluster " + cluster.getName() + " is already dedicated");
+ throw new CloudRuntimeException("Cluster "+ cluster.getName() + " is already dedicated");
+ }
+
+ if (dedicatedPodOfCluster != null) {
+ boolean domainIdInChildreanList = getDomainChildIds(dedicatedPodOfCluster.getDomainId()).contains(domainId);
+ //can dedicate a cluster to an account/domain if pod is dedicated to parent-domain
+ if (dedicatedPodOfCluster.getAccountId() != null || (accountId == null && !domainIdInChildreanList)
+ || (accountId != null && !(dedicatedPodOfCluster.getDomainId() == domainId || domainIdInChildreanList))) {
+ s_logger.error("Cannot dedicate Cluster. Its Pod is already dedicated");
+ HostPodVO pod = _podDao.findById(cluster.getPodId());
+ throw new CloudRuntimeException("Cluster's Pod " + pod.getName() + " is already dedicated");
+ }
+ }
+
+ if (dedicatedZoneOfCluster != null) {
+ boolean domainIdInChildreanList = getDomainChildIds(dedicatedZoneOfCluster.getDomainId()).contains(domainId);
+ //can dedicate a cluster to an account/domain if zone is dedicated to parent-domain
+ if (dedicatedZoneOfCluster.getAccountId() != null || (accountId == null && !domainIdInChildreanList)
+ || (accountId != null && !(dedicatedZoneOfCluster.getDomainId() == domainId || domainIdInChildreanList))) {
+ s_logger.error("Cannot dedicate Cluster. Its zone is already dedicated");
+ DataCenterVO zone = _zoneDao.findById(cluster.getDataCenterId());
+ throw new CloudRuntimeException("Cluster's Zone "+ zone.getName() + " is already dedicated");
+ }
+ }
+
+ //check if any resource under this cluster is dedicated to different account or sub-domain
+ hosts = _hostDao.findByClusterId(cluster.getId());
+ List<DedicatedResourceVO> hostsToRelease = new ArrayList<DedicatedResourceVO>();
+ for (HostVO host : hosts) {
+ DedicatedResourceVO dHost = _dedicatedDao.findByHostId(host.getId());
+ if (dHost != null) {
+ if(!(childDomainIds.contains(dHost.getDomainId()))) {
+ throw new CloudRuntimeException("Host " + host.getName() + " under this Cluster " + cluster.getName() + " is dedicated to different account/domain");
+ }
+ /*if all dedicated resources belongs to same account and domain then we should release dedication
+ and make new entry for this cluster */
+ if (accountId != null) {
+ if (dHost.getAccountId() == accountId) {
+ hostsToRelease.add(dHost);
+ } else {
+ s_logger.error("Cannot dedicate Cluster " + cluster.getName() + " to account" + accountName);
+ throw new CloudRuntimeException("Cannot dedicate Cluster " + cluster.getName() + " to account" + accountName);
+ }
+ } else {
+ if (dHost.getAccountId() == null && dHost.getDomainId() == domainId) {
+ hostsToRelease.add(dHost);
+ }
+ }
+ }
+ }
+
+ for (DedicatedResourceVO dr : hostsToRelease) {
+ releaseDedicatedResource(null, null, null, dr.getHostId());
+ }
+ }
+
+ checkHostsSuitabilityForExplicitDedication(accountId, childDomainIds, hosts);
+
+ Transaction txn = Transaction.currentTxn();
+ txn.start();
+ DedicatedResourceVO dedicatedResource = new DedicatedResourceVO(null, null, clusterId, null, null, null);
+ try {
+ dedicatedResource.setDomainId(domainId);
+ if (accountId != null) {
+ dedicatedResource.setAccountId(accountId);
+ }
+ dedicatedResource = _dedicatedDao.persist(dedicatedResource);
+ } catch (Exception e) {
+ s_logger.error("Unable to dedicate host due to " + e.getMessage(), e);
+ throw new CloudRuntimeException("Failed to dedicate cluster. Please contact Cloud Support.");
+ }
+ txn.commit();
+
+ List<DedicatedResourceVO> result = new ArrayList<DedicatedResourceVO>();
+ result.add(dedicatedResource);
+ return result;
+ }
+
+ @Override
+ @DB
+ @ActionEvent(eventType = EventTypes.EVENT_DEDICATE_RESOURCE, eventDescription = "dedicating a Host")
+ public List<DedicatedResourceVO> dedicateHost(Long hostId, Long domainId, String accountName) {
+ Long accountId = null;
+ if(accountName != null){
- Account caller = UserContext.current().getCaller();
++ Account caller = CallContext.current().getCallingAccount();
+ Account owner = _accountMgr.finalizeOwner(caller, accountName, domainId, null);
+ accountId = owner.getId();
+ }
+ checkAccountAndDomain(accountId, domainId);
+ HostVO host = _hostDao.findById(hostId);
+ if (host == null) {
+ throw new InvalidParameterValueException("Unable to find host by id " + hostId);
+ } else {
+ //check if host is of routing type
+ if (host.getType() != Host.Type.Routing) {
+ throw new CloudRuntimeException("Invalid host type for host " + host.getName());
+ }
+
+ DedicatedResourceVO dedicatedHost = _dedicatedDao.findByHostId(hostId);
+ DedicatedResourceVO dedicatedClusterOfHost = _dedicatedDao.findByClusterId(host.getClusterId());
+ DedicatedResourceVO dedicatedPodOfHost = _dedicatedDao.findByPodId(host.getPodId());
+ DedicatedResourceVO dedicatedZoneOfHost = _dedicatedDao.findByZoneId(host.getDataCenterId());
+
+ if(dedicatedHost != null) {
+ s_logger.error("Host "+ host.getName() + " is already dedicated");
+ throw new CloudRuntimeException("Host "+ host.getName() + " is already dedicated");
+ }
+
+ if (dedicatedClusterOfHost != null) {
+ boolean domainIdInChildreanList = getDomainChildIds(dedicatedClusterOfHost.getDomainId()).contains(domainId);
+ //can dedicate a host to an account/domain if cluster is dedicated to parent-domain
+ if (dedicatedClusterOfHost.getAccountId() != null || (accountId == null && !domainIdInChildreanList)
+ || (accountId != null && !(dedicatedClusterOfHost.getDomainId() == domainId || domainIdInChildreanList))) {
+ ClusterVO cluster = _clusterDao.findById(host.getClusterId());
+ s_logger.error("Host's Cluster " + cluster.getName() + " is already dedicated");
+ throw new CloudRuntimeException("Host's Cluster " + cluster.getName() + " is already dedicated");
+ }
+ }
+
+ if (dedicatedPodOfHost != null){
+ boolean domainIdInChildreanList = getDomainChildIds(dedicatedPodOfHost.getDomainId()).contains(domainId);
+ //can dedicate a host to an account/domain if pod is dedicated to parent-domain
+ if (dedicatedPodOfHost.getAccountId() != null || (accountId == null && !domainIdInChildreanList)
+ || (accountId != null && !(dedicatedPodOfHost.getDomainId() == domainId || domainIdInChildreanList))) {
+ HostPodVO pod = _podDao.findById(host.getPodId());
+ s_logger.error("Host's Pod " + pod.getName() + " is already dedicated");
+ throw new CloudRuntimeException("Host's Pod " + pod.getName() + " is already dedicated");
+ }
+ }
+
+ if (dedicatedZoneOfHost != null) {
+ boolean domainIdInChildreanList = getDomainChildIds(dedicatedZoneOfHost.getDomainId()).contains(domainId);
+ //can dedicate a host to an account/domain if zone is dedicated to parent-domain
+ if (dedicatedZoneOfHost.getAccountId() != null || (accountId == null && !domainIdInChildreanList)
+ || (accountId != null && !(dedicatedZoneOfHost.getDomainId() == domainId || domainIdInChildreanList))) {
+ DataCenterVO zone = _zoneDao.findById(host.getDataCenterId());
+ s_logger.error("Host's Data Center " + zone.getName() + " is already dedicated");
+ throw new CloudRuntimeException("Host's Data Center " + zone.getName() + " is already dedicated");
+ }
+ }
+ }
+
+ List<Long> childDomainIds = getDomainChildIds(domainId);
+ childDomainIds.add(domainId);
+ checkHostSuitabilityForExplicitDedication(accountId, childDomainIds, hostId);
+
+ Transaction txn = Transaction.currentTxn();
+ txn.start();
+ DedicatedResourceVO dedicatedResource = new DedicatedResourceVO(null, null, null, hostId, null, null);
+ try {
+ dedicatedResource.setDomainId(domainId);
+ if (accountId != null) {
+ dedicatedResource.setAccountId(accountId);
+ }
+ dedicatedResource = _dedicatedDao.persist(dedicatedResource);
+ } catch (Exception e) {
+ s_logger.error("Unable to dedicate host due to " + e.getMessage(), e);
+ throw new CloudRuntimeException("Failed to dedicate host. Please contact Cloud Support.");
+ }
+ txn.commit();
+
+ List<DedicatedResourceVO> result = new ArrayList<DedicatedResourceVO>();
+ result.add(dedicatedResource);
+ return result;
+ }
+
+ private List<UserVmVO> getVmsOnHost(long hostId) {
+ List<UserVmVO> vms = _userVmDao.listUpByHostId(hostId);
+ List<UserVmVO> vmsByLastHostId = _userVmDao.listByLastHostId(hostId);
+ if (vmsByLastHostId.size() > 0) {
+ // check if any VMs are within skip.counting.hours, if yes we have to consider the host.
+ for (UserVmVO stoppedVM : vmsByLastHostId) {
+ long secondsSinceLastUpdate = (DateUtil.currentGMTTime().getTime() - stoppedVM.getUpdateTime()
+ .getTime()) / 1000;
+ if (secondsSinceLastUpdate < capacityReleaseInterval) {
+ vms.add(stoppedVM);
+ }
+ }
+ }
+
+ return vms;
+ }
+
+ private boolean checkHostSuitabilityForExplicitDedication(Long accountId, List<Long> domainIds, long hostId) {
+ boolean suitable = true;
+ List<UserVmVO> allVmsOnHost = getVmsOnHost(hostId);
+ if (accountId != null) {
+ for (UserVmVO vm : allVmsOnHost) {
+ if (vm.getAccountId() != accountId) {
+ s_logger.info("Host " + vm.getHostId() + " found to be unsuitable for explicit dedication as it is " +
+ "running instances of another account");
+ throw new CloudRuntimeException("Host " + hostId + " found to be unsuitable for explicit dedication as it is " +
+ "running instances of another account");
+ }
+ }
+ } else {
+ for (UserVmVO vm : allVmsOnHost) {
+ if (!domainIds.contains(vm.getDomainId())) {
+ s_logger.info("Host " + vm.getHostId() + " found to be unsuitable for explicit dedication as it is " +
+ "running instances of another domain");
+ throw new CloudRuntimeException("Host " + hostId + " found to be unsuitable for explicit dedication as it is " +
+ "running instances of another domain");
+ }
+ }
+ }
+ return suitable;
+ }
+
+ private boolean checkHostsSuitabilityForExplicitDedication(Long accountId, List<Long> domainIds, List<HostVO> hosts) {
+ boolean suitable = true;
+ for (HostVO host : hosts){
+ checkHostSuitabilityForExplicitDedication(accountId, domainIds, host.getId());
+ }
+ return suitable;
+ }
+
+ private void checkAccountAndDomain(Long accountId, Long domainId) {
+ DomainVO domain = _domainDao.findById(domainId);
+ if (domain == null) {
+ throw new InvalidParameterValueException("Unable to find the domain by id " + domainId + ", please specify valid domainId");
+ }
+ //check if account belongs to the domain id
+ if (accountId != null) {
+ AccountVO account = _accountDao.findById(accountId);
+ if (account == null || domainId != account.getDomainId()){
+ throw new InvalidParameterValueException("Please specify the domain id of the account: " + account.getAccountName());
+ }
+ }
+ }
+
+ private List<Long> getDomainChildIds(long domainId) {
+ DomainVO domainRecord = _domainDao.findById(domainId);
+ List<Long> domainIds = new ArrayList<Long>();
+ domainIds.add(domainRecord.getId());
+ // find all domain Ids till leaf
+ List<DomainVO> allChildDomains = _domainDao.findAllChildren(domainRecord.getPath(), domainRecord.getId());
+ for (DomainVO domain : allChildDomains) {
+ domainIds.add(domain.getId());
+ }
+ return domainIds;
+ }
+
+ @Override
+ public DedicateZoneResponse createDedicateZoneResponse(DedicatedResources resource) {
+ DedicateZoneResponse dedicateZoneResponse = new DedicateZoneResponse();
+ DataCenterVO dc = _zoneDao.findById(resource.getDataCenterId());
+ DomainVO domain = _domainDao.findById(resource.getDomainId());
+ AccountVO account = _accountDao.findById(resource.getAccountId());
+ dedicateZoneResponse.setId(resource.getUuid());
+ dedicateZoneResponse.setZoneId(dc.getUuid());
+ dedicateZoneResponse.setZoneName(dc.getName());
+ dedicateZoneResponse.setDomainId(domain.getUuid());
+ if (account != null) {
+ dedicateZoneResponse.setAccountId(account.getUuid());
+ }
+ dedicateZoneResponse.setObjectName("dedicatedzone");
+ return dedicateZoneResponse;
+ }
+
+ @Override
+ public DedicatePodResponse createDedicatePodResponse(DedicatedResources resource) {
+ DedicatePodResponse dedicatePodResponse = new DedicatePodResponse();
+ HostPodVO pod = _podDao.findById(resource.getPodId());
+ DomainVO domain = _domainDao.findById(resource.getDomainId());
+ AccountVO account = _accountDao.findById(resource.getAccountId());
+ dedicatePodResponse.setId(resource.getUuid());
+ dedicatePodResponse.setPodId(pod.getUuid());
+ dedicatePodResponse.setPodName(pod.getName());
+ dedicatePodResponse.setDomainId(domain.getUuid());
+ if (account != null) {
+ dedicatePodResponse.setAccountId(account.getUuid());
+ }
+ dedicatePodResponse.setObjectName("dedicatedpod");
+ return dedicatePodResponse;
+ }
+
+ @Override
+ public DedicateClusterResponse createDedicateClusterResponse(DedicatedResources resource) {
+ DedicateClusterResponse dedicateClusterResponse = new DedicateClusterResponse();
+ ClusterVO cluster = _clusterDao.findById(resource.getClusterId());
+ DomainVO domain = _domainDao.findById(resource.getDomainId());
+ AccountVO account = _accountDao.findById(resource.getAccountId());
+ dedicateClusterResponse.setId(resource.getUuid());
+ dedicateClusterResponse.setClusterId(cluster.getUuid());
+ dedicateClusterResponse.setClusterName(cluster.getName());
+ dedicateClusterResponse.setDomainId(domain.getUuid());
+ if (account != null) {
+ dedicateClusterResponse.setAccountId(account.getUuid());
+ }
+ dedicateClusterResponse.setObjectName("dedicatedcluster");
+ return dedicateClusterResponse;
+ }
+
+ @Override
+ public DedicateHostResponse createDedicateHostResponse(DedicatedResources resource) {
+ DedicateHostResponse dedicateHostResponse = new DedicateHostResponse();
+ HostVO host = _hostDao.findById(resource.getHostId());
+ DomainVO domain = _domainDao.findById(resource.getDomainId());
+ AccountVO account = _accountDao.findById(resource.getAccountId());
+ dedicateHostResponse.setId(resource.getUuid());
+ dedicateHostResponse.setHostId(host.getUuid());
+ dedicateHostResponse.setHostName(host.getName());
+ dedicateHostResponse.setDomainId(domain.getUuid());
+ if (account != null) {
+ dedicateHostResponse.setAccountId(account.getUuid());
+ }
+ dedicateHostResponse.setObjectName("dedicatedhost");
+ return dedicateHostResponse;
+ }
+
+ @Override
+ public List<Class<?>> getCommands() {
+ List<Class<?>> cmdList = new ArrayList<Class<?>>();
+ cmdList.add(DedicateZoneCmd.class);
+ cmdList.add(DedicatePodCmd.class);
+ cmdList.add(DedicateClusterCmd.class);
+ cmdList.add(DedicateHostCmd.class);
+ cmdList.add(ListDedicatedZonesCmd.class);
+ cmdList.add(ListDedicatedPodsCmd.class);
+ cmdList.add(ListDedicatedClustersCmd.class);
+ cmdList.add(ListDedicatedHostsCmd.class);
+ cmdList.add(ReleaseDedicatedClusterCmd.class);
+ cmdList.add(ReleaseDedicatedHostCmd.class);
+ cmdList.add(ReleaseDedicatedPodCmd.class);
+ cmdList.add(ReleaseDedicatedZoneCmd.class);
+ return cmdList;
+ }
+
+ @Override
+ public Pair<List<? extends DedicatedResourceVO>, Integer> listDedicatedZones(ListDedicatedZonesCmd cmd) {
+ Long zoneId = cmd.getZoneId();
+ Long domainId = cmd.getDomainId();
+ String accountName = cmd.getAccountName();
+ Long accountId = null;
+ if (accountName != null) {
+ if (domainId != null) {
+ Account account = _accountDao.findActiveAccount(accountName, domainId);
+ if (account != null) {
+ accountId = account.getId();
+ }
+ } else {
+ throw new InvalidParameterValueException("Please specify the domain id of the account: " + accountName);
+ }
+ }
+ Pair<List<DedicatedResourceVO>, Integer> result = _dedicatedDao.searchDedicatedZones(zoneId, domainId, accountId);
+ return new Pair<List<? extends DedicatedResourceVO>, Integer>(result.first(), result.second());
+ }
+
+ @Override
+ public Pair<List<? extends DedicatedResourceVO>, Integer> listDedicatedPods(ListDedicatedPodsCmd cmd) {
+ Long podId = cmd.getPodId();
+ Long domainId = cmd.getDomainId();
+ String accountName = cmd.getAccountName();
+ Long accountId = null;
+ if (accountName != null) {
+ if (domainId != null) {
+ Account account = _accountDao.findActiveAccount(accountName, domainId);
+ if (account != null) {
+ accountId = account.getId();
+ }
+ } else {
+ throw new InvalidParameterValueException("Please specify the domain id of the account: " + accountName);
+ }
+ }
+ Pair<List<DedicatedResourceVO>, Integer> result = _dedicatedDao.searchDedicatedPods(podId, domainId, accountId);
+ return new Pair<List<? extends DedicatedResourceVO>, Integer>(result.first(), result.second());
+ }
+
+ @Override
+ public Pair<List<? extends DedicatedResourceVO>, Integer> listDedicatedClusters(ListDedicatedClustersCmd cmd) {
+ Long clusterId = cmd.getClusterId();
+ Long domainId = cmd.getDomainId();
+ String accountName = cmd.getAccountName();
+ Long accountId = null;
+ if (accountName != null) {
+ if (domainId != null) {
+ Account account = _accountDao.findActiveAccount(accountName, domainId);
+ if (account != null) {
+ accountId = account.getId();
+ }
+ } else {
+ throw new InvalidParameterValueException("Please specify the domain id of the account: " + accountName);
+ }
+ }
+ Pair<List<DedicatedResourceVO>, Integer> result = _dedicatedDao.searchDedicatedClusters(clusterId, domainId, accountId);
+ return new Pair<List<? extends DedicatedResourceVO>, Integer>(result.first(), result.second());
+ }
+
+ @Override
+ public Pair<List<? extends DedicatedResourceVO>, Integer> listDedicatedHosts(ListDedicatedHostsCmd cmd) {
+ Long hostId = cmd.getHostId();
+ Long domainId = cmd.getDomainId();
+ String accountName = cmd.getAccountName();
+ Long accountId = null;
+ if (accountName != null) {
+ if (domainId != null) {
+ Account account = _accountDao.findActiveAccount(accountName, domainId);
+ if (account != null) {
+ accountId = account.getId();
+ }
+ } else {
+ throw new InvalidParameterValueException("Please specify the domain id of the account: " + accountName);
+ }
+ }
+
+ Pair<List<DedicatedResourceVO>, Integer> result = _dedicatedDao.searchDedicatedHosts(hostId, domainId, accountId);
+ return new Pair<List<? extends DedicatedResourceVO>, Integer>(result.first(), result.second());
+ }
+
+ @Override
+ @DB
+ @ActionEvent(eventType = EventTypes.EVENT_DEDICATE_RESOURCE_RELEASE, eventDescription = "Releasing dedicated resource")
+ public boolean releaseDedicatedResource(Long zoneId, Long podId, Long clusterId, Long hostId) throws InvalidParameterValueException{
+ DedicatedResourceVO resource = null;
+ Long resourceId = null;
+ if (zoneId != null) {
+ resource = _dedicatedDao.findByZoneId(zoneId);
+ }
+ if (podId != null) {
+ resource = _dedicatedDao.findByPodId(podId);
+ }
+ if (clusterId != null) {
+ resource = _dedicatedDao.findByClusterId(clusterId);
+ }
+ if (hostId != null ) {
+ resource = _dedicatedDao.findByHostId(hostId);
+ }
+ if (resource == null){
+ throw new InvalidParameterValueException("No Dedicated Resource available to release");
+ } else {
+ Transaction txn = Transaction.currentTxn();
+ txn.start();
+ resourceId = resource.getId();
+ if (!_dedicatedDao.remove(resourceId)) {
+ throw new CloudRuntimeException("Failed to delete Resource " + resourceId);
+ }
+ txn.commit();
+ }
+ return true;
+ }
+ }
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/plugins/dedicated-resources/test/org/apache/cloudstack/dedicated/manager/DedicatedApiUnitTest.java
----------------------------------------------------------------------
diff --cc plugins/dedicated-resources/test/org/apache/cloudstack/dedicated/manager/DedicatedApiUnitTest.java
index 0000000,58aae23..485856e
mode 000000,100644..100644
--- a/plugins/dedicated-resources/test/org/apache/cloudstack/dedicated/manager/DedicatedApiUnitTest.java
+++ b/plugins/dedicated-resources/test/org/apache/cloudstack/dedicated/manager/DedicatedApiUnitTest.java
@@@ -1,0 -1,317 +1,318 @@@
+ // 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.dedicated.manager;
+
+ import static org.mockito.Matchers.anyLong;
+ import static org.mockito.Matchers.anyObject;
+ import static org.mockito.Matchers.anyString;
+ import static org.mockito.Mockito.when;
+
+ import java.io.IOException;
+
+ import javax.inject.Inject;
+ import javax.naming.ConfigurationException;
+
+ import junit.framework.Assert;
+
-import org.apache.cloudstack.dedicated.DedicatedResourceManagerImpl;
-import org.apache.cloudstack.test.utils.SpringUtils;
+ import org.apache.log4j.Logger;
+ 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 org.apache.cloudstack.context.CallContext;
++import org.apache.cloudstack.dedicated.DedicatedResourceManagerImpl;
++import org.apache.cloudstack.test.utils.SpringUtils;
++
+ import com.cloud.configuration.dao.ConfigurationDao;
+ import com.cloud.dc.DedicatedResourceVO;
+ import com.cloud.dc.dao.ClusterDao;
+ import com.cloud.dc.dao.DataCenterDao;
+ import com.cloud.dc.dao.DedicatedResourceDao;
+ import com.cloud.dc.dao.HostPodDao;
+ import com.cloud.domain.DomainVO;
+ import com.cloud.domain.dao.DomainDao;
+ import com.cloud.exception.InvalidParameterValueException;
+ import com.cloud.host.dao.HostDao;
+ import com.cloud.user.Account;
+ import com.cloud.user.AccountManager;
+ import com.cloud.user.AccountVO;
-import com.cloud.user.UserContext;
+ import com.cloud.user.dao.AccountDao;
+ import com.cloud.utils.component.ComponentContext;
+ import com.cloud.utils.exception.CloudRuntimeException;
+ import com.cloud.vm.dao.UserVmDao;
+
+ @RunWith(SpringJUnit4ClassRunner.class)
+ @ContextConfiguration(loader = AnnotationConfigContextLoader.class)
+ public class DedicatedApiUnitTest {
+ public static final Logger s_logger = Logger.getLogger(DedicatedApiUnitTest.class);
+ @Inject
+ DedicatedResourceManagerImpl _dedicatedService = new DedicatedResourceManagerImpl();
+
+ @Inject
+ AccountManager _acctMgr;
+
+ @Inject
+ AccountDao _accountDao;
+
+ @Inject
+ DomainDao _domainDao;
+
+ @Inject
+ UserVmDao _vmDao;
+
+ @Inject
+ DedicatedResourceDao _dedicatedDao;
+
+ @Inject
+ DataCenterDao _dcDao;
+
+ @Inject
+ HostPodDao _podDao;
+
+ @Inject
+ ClusterDao _clusterDao;
+
+ @Inject
+ HostDao _hostDao;
+
+ @Inject
+ ConfigurationDao _configDao;
+
+ private static long domainId = 5L;
+ private static long accountId = 5L;
+ private static String accountName = "admin";
+
+ @BeforeClass
+ public static void setUp() throws ConfigurationException {
+
+ }
+
+ @Before
+ public void testSetUp() {
+ ComponentContext.initComponentsLifeCycle();
+ AccountVO account = new AccountVO(accountName, domainId, "networkDomain", Account.ACCOUNT_TYPE_NORMAL, "uuid");
+ DomainVO domain = new DomainVO("rootDomain", 5L, 5L, "networkDomain");
+
- UserContext.registerContext(1, account, null, true);
++ CallContext.register(1, account, null, true);
+ when(_acctMgr.finalizeOwner((Account) anyObject(), anyString(), anyLong(), anyLong())).thenReturn(account);
+ when(_accountDao.findByIdIncludingRemoved(0L)).thenReturn(account);
+ when(_accountDao.findById(anyLong())).thenReturn(account);
+ when(_domainDao.findById(domainId)).thenReturn(domain);
+ }
+
+ @Test(expected = InvalidParameterValueException.class)
+ public void InvalidDomainIDForAccountTest() {
+ _dedicatedService.dedicateZone(10L, domainId, accountName);
+ }
+
+ @Test(expected = InvalidParameterValueException.class)
+ public void dedicateResourceInvalidAccountIDTest() {
+ _dedicatedService.dedicateZone(10L, domainId, accountName);
+ }
+
+ @Test
+ public void releaseDedicatedZoneInvalidIdTest() {
+ when(_dedicatedDao.findByZoneId(10L)).thenReturn(null);
+ try {
+ _dedicatedService.releaseDedicatedResource(10L, null, null, null);
+ } catch (InvalidParameterValueException e) {
+ Assert.assertTrue(e.getMessage().contains(
+ "No Dedicated Resource available to release"));
+ }
+ }
+
+ /* @Test
+ public void runDedicateZoneTest() {
+ DataCenterVO dc = new DataCenterVO(10L, "TestZone", "Dedicated",
+ "8.8.8.8", null, "10.0.0.1", null, "10.0.0.1/24", null, null,
+ NetworkType.Basic, null, null);
+ when(_dcDao.findById(10L)).thenReturn(dc);
+ try {
+ List<DedicatedResourceVO> result = _dedicatedService.dedicateZone(10L, domainId, accountName);
+ Assert.assertNotNull(result);
+ } catch (Exception e) {
+ s_logger.info("exception in testing dedication of zone "
+ + e.toString());
+ }
+ }
+
+ @Test
+ public void runDedicatePodTest() {
+ HostPodVO pod = new HostPodVO("TestPod", 20L, "10.0.0.1", "10.0.0.0",
+ 22, null);
+ when(_podDao.findById(10L)).thenReturn(pod);
+ try {
+ List<DedicatedResourceVO> result = _dedicatedService.dedicatePod(10L, domainId, accountName);
+ Assert.assertNotNull(result);
+ } catch (Exception e) {
+ s_logger.info("exception in testing dedication of pod "
+ + e.toString());
+ }
+ }
+
+ @Test
+ public void runDedicateClusterTest() {
+ ClusterVO cluster = new ClusterVO(10L, 10L, "TestCluster");
+ when(_clusterDao.findById(10L)).thenReturn(cluster);
+ try {
+ List<DedicatedResourceVO> result = _dedicatedService.dedicateCluster(10L, domainId, accountName);
+ Assert.assertNotNull(result);
+ } catch (Exception e) {
+ s_logger.info("exception in testing dedication of cluster "
+ + e.toString());
+ }
+ }
+
+ @Test
+ public void runDedicateHostTest() {
+ HostVO host = new HostVO(10L, "Host-1", Host.Type.Routing, null,
+ "10.0.0.0", null, null, null, null, null, null, null, null,
+ Status.Up, null, null, null, 10L, 10L, 30L, 10233, null, null,
+ null, 0, null);
+ when(_hostDao.findById(10L)).thenReturn(host);
+ try {
+ List<DedicatedResourceVO> result = _dedicatedService.dedicateHost(10L, domainId, accountName);
+ Assert.assertNotNull(result);
+ } catch (Exception e) {
+ s_logger.info("exception in testing dedication of host "
+ + e.toString());
+ }
+ }
+ */
+
+ @Test(expected = CloudRuntimeException.class)
+ public void dedicateZoneExistTest() {
+ DedicatedResourceVO dr = new DedicatedResourceVO(10L, null, null, null, domainId, accountId);
+ when(_dedicatedDao.findByZoneId(10L)).thenReturn(dr);
+ _dedicatedService.dedicateZone(10L, domainId, accountName);
+ }
+
+ @Test(expected = CloudRuntimeException.class)
+ public void dedicatePodExistTest() {
+ DedicatedResourceVO dr = new DedicatedResourceVO(null, 10L, null, null, domainId, accountId);
+ when(_dedicatedDao.findByPodId(10L)).thenReturn(dr);
+ _dedicatedService.dedicatePod(10L, domainId, accountName);
+ }
+
+ @Test(expected = CloudRuntimeException.class)
+ public void dedicateClusterExistTest() {
+ DedicatedResourceVO dr = new DedicatedResourceVO(null, null, 10L, null, domainId, accountId);
+ when(_dedicatedDao.findByClusterId(10L)).thenReturn(dr);
+ _dedicatedService.dedicateCluster(10L, domainId, accountName);
+ }
+
+ @Test(expected = CloudRuntimeException.class)
+ public void dedicateHostExistTest() {
+ DedicatedResourceVO dr = new DedicatedResourceVO(null, null, null, 10L, domainId, accountId);
+ when(_dedicatedDao.findByHostId(10L)).thenReturn(dr);
+ _dedicatedService.dedicateHost(10L, domainId, accountName);
+ }
+
+ @Test(expected = InvalidParameterValueException.class)
+ public void releaseDedicatedPodInvalidIdTest() {
+ when(_dedicatedDao.findByPodId(10L)).thenReturn(null);
+ _dedicatedService.releaseDedicatedResource(null, 10L, null, null);
+ }
+
+ @Test(expected = InvalidParameterValueException.class)
+ public void releaseDedicatedClusterInvalidIdTest() {
+ when(_dedicatedDao.findByClusterId(10L)).thenReturn(null);
+ _dedicatedService.releaseDedicatedResource(null, null, 10L, null);
+ }
+
+ @Test(expected = InvalidParameterValueException.class)
+ public void releaseDedicatedHostInvalidIdTest() {
+ when(_dedicatedDao.findByHostId(10L)).thenReturn(null);
+ _dedicatedService.releaseDedicatedResource(null, null, null, 10L);
+ }
+
+ @Configuration
+ @ComponentScan(basePackageClasses = {DedicatedResourceManagerImpl.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 DomainDao domainDao() {
+ return Mockito.mock(DomainDao.class);
+ }
+
+ @Bean
+ public DedicatedResourceDao dedicatedDao() {
+ return Mockito.mock(DedicatedResourceDao.class);
+ }
+
+ @Bean
+ public HostDao hostDao() {
+ return Mockito.mock(HostDao.class);
+ }
+
+ @Bean
+ public AccountManager acctManager() {
+ return Mockito.mock(AccountManager.class);
+ }
+
+ @Bean
+ public UserVmDao userVmDao() {
+ return Mockito.mock(UserVmDao.class);
+ }
+ @Bean
+ public DataCenterDao dataCenterDao() {
+ return Mockito.mock(DataCenterDao.class);
+ }
+ @Bean
+ public HostPodDao hostPodDao() {
+ return Mockito.mock(HostPodDao.class);
+ }
+
+ @Bean
+ public ClusterDao clusterDao() {
+ return Mockito.mock(ClusterDao.class);
+ }
+
+ @Bean
+ public ConfigurationDao configDao() {
+ return Mockito.mock(ConfigurationDao.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);
+ }
+ }
+ }
+ }
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/plugins/deployment-planners/implicit-dedication/src/com/cloud/deploy/ImplicitDedicationPlanner.java
----------------------------------------------------------------------
diff --cc plugins/deployment-planners/implicit-dedication/src/com/cloud/deploy/ImplicitDedicationPlanner.java
index d64f1ab,be016cb..fce3955
--- a/plugins/deployment-planners/implicit-dedication/src/com/cloud/deploy/ImplicitDedicationPlanner.java
+++ b/plugins/deployment-planners/implicit-dedication/src/com/cloud/deploy/ImplicitDedicationPlanner.java
@@@ -29,12 -29,8 +29,6 @@@ import javax.naming.ConfigurationExcept
import org.apache.log4j.Logger;
import com.cloud.configuration.Config;
- import com.cloud.deploy.DeploymentClusterPlanner;
- import com.cloud.deploy.DeploymentPlan;
- import com.cloud.deploy.DeploymentPlanner;
- import com.cloud.deploy.DeploymentPlanner.ExcludeList;
--import com.cloud.deploy.DeploymentPlanner.PlannerResourceUsage;
- import com.cloud.deploy.FirstFitPlanner;
-import com.cloud.deploy.dao.PlannerHostReservationDao;
import com.cloud.exception.InsufficientServerCapacityException;
import com.cloud.host.HostVO;
import com.cloud.resource.ResourceManager;
@@@ -44,7 -40,9 +38,7 @@@ import com.cloud.service.dao.ServiceOff
import com.cloud.user.Account;
import com.cloud.utils.DateUtil;
import com.cloud.utils.NumbersUtil;
--import com.cloud.vm.UserVmVO;
+ import com.cloud.vm.VMInstanceVO;
-import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile;
@Local(value=DeploymentPlanner.class)
@@@ -210,7 -213,7 +209,7 @@@ public class ImplicitDedicationPlanner
plannerName = _globalDeploymentPlanner;
}
-- if (plannerName != null && this.getName().equals(plannerName)) {
++ if (plannerName != null && getName().equals(plannerName)) {
implicitPlannerUsed = true;
}
}
@@@ -248,7 -251,84 +247,84 @@@
}
@Override
- public PlannerResourceUsage getResourceUsage() {
- public PlannerResourceUsage getResourceUsage(VirtualMachineProfile<? extends VirtualMachine> vmProfile,
++ public PlannerResourceUsage getResourceUsage(VirtualMachineProfile vmProfile,
+ DeploymentPlan plan, ExcludeList avoid) throws InsufficientServerCapacityException {
+ // Check if strict or preferred mode should be used.
+ boolean preferred = isServiceOfferingUsingPlannerInPreferredMode(vmProfile.getServiceOfferingId());
+
+ // If service offering in strict mode return resource usage as Dedicated
+ if (!preferred) {
+ return PlannerResourceUsage.Dedicated;
+ }
+ else {
+ // service offering is in implicit mode.
+ // find is it possible to deploy in dedicated mode,
+ // if its possible return dedicated else return shared.
+ List<Long> clusterList = super.orderClusters(vmProfile, plan, avoid);
+ Set<Long> hostsToAvoid = avoid.getHostsToAvoid();
+ Account account = vmProfile.getOwner();
+
+ // Get the list of all the hosts in the given clusters
+ List<Long> allHosts = new ArrayList<Long>();
+ for (Long cluster : clusterList) {
+ List<HostVO> hostsInCluster = resourceMgr.listAllHostsInCluster(cluster);
+ for (HostVO hostVO : hostsInCluster) {
+
+ allHosts.add(hostVO.getId());
+ }
+ }
+
+ // Go over all the hosts in the cluster and get a list of
+ // 1. All empty hosts, not running any vms.
+ // 2. Hosts running vms for this account and created by a service
+ // offering which uses an
+ // implicit dedication planner.
+ // 3. Hosts running vms created by implicit planner and in strict
+ // mode of other accounts.
+ // 4. Hosts running vms from other account or from this account but
+ // created by a service offering which uses
+ // any planner besides implicit.
+ Set<Long> emptyHosts = new HashSet<Long>();
+ Set<Long> hostRunningVmsOfAccount = new HashSet<Long>();
+ Set<Long> hostRunningStrictImplicitVmsOfOtherAccounts = new HashSet<Long>();
+ Set<Long> allOtherHosts = new HashSet<Long>();
+ for (Long host : allHosts) {
+ List<VMInstanceVO> vms = getVmsOnHost(host);
+ // emptyHost should contain only Hosts which are not having any VM's (user/system) on it.
+ if (vms == null || vms.isEmpty()) {
+ emptyHosts.add(host);
+ } else if (checkHostSuitabilityForImplicitDedication(account.getAccountId(), vms)) {
+ hostRunningVmsOfAccount.add(host);
+ } else if (checkIfAllVmsCreatedInStrictMode(account.getAccountId(), vms)) {
+ hostRunningStrictImplicitVmsOfOtherAccounts.add(host);
+ } else {
+ allOtherHosts.add(host);
+ }
+ }
+
+ // Hosts running vms of other accounts created by ab implicit
+ // planner in strict mode should always be avoided.
+ avoid.addHostList(hostRunningStrictImplicitVmsOfOtherAccounts);
+
+ if (!hostRunningVmsOfAccount.isEmpty()
+ && (hostsToAvoid == null || !hostsToAvoid.containsAll(hostRunningVmsOfAccount))) {
+ // Check if any of hosts that are running implicit dedicated vms are available (not in avoid list).
+ // If so, we'll try and use these hosts. We can deploy in Dedicated mode
+ return PlannerResourceUsage.Dedicated;
+ } else if (!emptyHosts.isEmpty() && (hostsToAvoid == null || !hostsToAvoid.containsAll(emptyHosts))) {
+ // If there aren't implicit resources try on empty hosts, As empty hosts are available we can deploy in Dedicated mode.
+ // Empty hosts can contain hosts which are not having user vms but system vms are running.
+ // But the host where system vms are running is marked as shared and still be part of empty Hosts.
+ // The scenario will fail where actual Empty hosts and uservms not running host.
+ return PlannerResourceUsage.Dedicated;
+ } else if (!preferred) {
- return PlannerResourceUsage.Dedicated;
+ return PlannerResourceUsage.Dedicated;
+ } else {
+ if (!allOtherHosts.isEmpty() && (hostsToAvoid == null || !hostsToAvoid.containsAll(allOtherHosts))) {
+ return PlannerResourceUsage.Shared;
+ }
+ }
+ return PlannerResourceUsage.Shared;
+ }
}
-}
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/plugins/deployment-planners/implicit-dedication/test/org/apache/cloudstack/implicitplanner/ImplicitPlannerTest.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
----------------------------------------------------------------------
diff --cc plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
index f30505d,bab53bc..d8da341
--- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
@@@ -57,8 -57,13 +57,9 @@@ import javax.ejb.Local
import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
-import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat;
-import org.apache.cloudstack.utils.qemu.QemuImg;
-import org.apache.cloudstack.utils.qemu.QemuImgFile;
-import org.apache.cloudstack.utils.qemu.QemuImgException;
import org.libvirt.Connect;
import org.libvirt.Domain;
+ import org.libvirt.DomainBlockStats;
import org.libvirt.DomainInfo;
import org.libvirt.DomainInterfaceStats;
import org.libvirt.DomainSnapshot;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/plugins/hypervisors/simulator/src/com/cloud/agent/manager/MockVmManagerImpl.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/element/InternalLoadBalancerElement.java
----------------------------------------------------------------------
diff --cc plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/element/InternalLoadBalancerElement.java
index 339ec9f,14b616c..17fc568
--- a/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/element/InternalLoadBalancerElement.java
+++ b/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/element/InternalLoadBalancerElement.java
@@@ -397,20 -396,13 +396,13 @@@ public class InternalLoadBalancerElemen
Set<Ip> vmsToDestroy = new HashSet<Ip>();
for (Ip sourceIp : groupedRules.keySet()) {
+ //2) Check if there are non revoked rules for the source ip address
List<LoadBalancingRule> rulesToCheck = groupedRules.get(sourceIp);
- int revoke = 0;
- for (LoadBalancingRule ruleToCheck : rulesToCheck) {
- if (ruleToCheck.getState() == FirewallRule.State.Revoke){
- revoke++;
- }
- }
-
- if (revoke == rulesToCheck.size()) {
- s_logger.debug("Have to destroy internal lb vm for source ip " + sourceIp);
+ if (_appLbDao.countBySourceIpAndNotRevoked(sourceIp, rulesToCheck.get(0).getNetworkId()) == 0) {
+ s_logger.debug("Have to destroy internal lb vm for source ip " + sourceIp + " as it has 0 rules in non-Revoke state");
vmsToDestroy.add(sourceIp);
- }
- }
+ }
+ }
return vmsToDestroy;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/pom.xml
----------------------------------------------------------------------
[23/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
CLOUDSTACK-747: Internal LB detailView - Assigned VMs tab - Assign VMs action - listView will be freshed in widget level after action is done. Therefore, remove refresh from application level.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/9a175f93
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/9a175f93
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/9a175f93
Branch: refs/heads/vmsync
Commit: 9a175f9306dacf998bd8417a238230d4f904b3c8
Parents: 36ed93f
Author: Jessica Wang <je...@apache.org>
Authored: Thu Jun 6 11:49:50 2013 -0700
Committer: Jessica Wang <je...@apache.org>
Committed: Thu Jun 6 11:49:50 2013 -0700
----------------------------------------------------------------------
ui/scripts/vpc.js | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9a175f93/ui/scripts/vpc.js
----------------------------------------------------------------------
diff --git a/ui/scripts/vpc.js b/ui/scripts/vpc.js
index 082cc25..a087baa 100644
--- a/ui/scripts/vpc.js
+++ b/ui/scripts/vpc.js
@@ -710,11 +710,7 @@
var jid = data.assigntoloadbalancerruleresponse.jobid;
args.response.success({
_custom: {
- jobId: jid,
- getUpdatedItem: function(json) {
- $('.list-view').listView('refresh');
- //return json.queryasyncjobresultresponse.jobresult.volume;
- }
+ jobId: jid
}
});
}
[11/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
CLOUDSTACK-2805 [VMware] addVmwareDc fails with NPE when non-existent DC name is passed to the API
Made vcenter as required parameter to addVmwareDc API.
Removed stale parameter url from addVmwareDc API.
Improved Exception handling, logging remote exception details.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/58b57ca5
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/58b57ca5
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/58b57ca5
Branch: refs/heads/vmsync
Commit: 58b57ca5dbe514c94469a28d2ebaf0474550ecec
Parents: 89fa121
Author: Sateesh Chodapuneedi <sa...@apache.org>
Authored: Thu Jun 6 15:33:10 2013 +0530
Committer: Sateesh Chodapuneedi <sa...@apache.org>
Committed: Thu Jun 6 15:33:10 2013 +0530
----------------------------------------------------------------------
.../org/apache/cloudstack/api/ApiConstants.java | 1 +
.../vmware/dao/VmwareDatacenterDaoImpl.java | 4 +-
.../vmware/manager/VmwareManagerImpl.java | 102 ++++++-------------
.../api/command/admin/zone/AddVmwareDcCmd.java | 8 +-
.../vmware/VmwareDatacenterApiUnitTest.java | 4 +-
5 files changed, 42 insertions(+), 77 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/58b57ca5/api/src/org/apache/cloudstack/api/ApiConstants.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/ApiConstants.java b/api/src/org/apache/cloudstack/api/ApiConstants.java
index a0cd0f5..ab1402c 100755
--- a/api/src/org/apache/cloudstack/api/ApiConstants.java
+++ b/api/src/org/apache/cloudstack/api/ApiConstants.java
@@ -405,6 +405,7 @@ public class ApiConstants {
public static final String VSM_CONFIG_MODE = "vsmconfigmode";
public static final String VSM_CONFIG_STATE = "vsmconfigstate";
public static final String VSM_DEVICE_STATE = "vsmdevicestate";
+ public static final String VCENTER = "vcenter";
public static final String ADD_VSM_FLAG = "addvsmflag";
public static final String END_POINT = "endpoint";
public static final String REGION_ID = "regionid";
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/58b57ca5/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/dao/VmwareDatacenterDaoImpl.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/dao/VmwareDatacenterDaoImpl.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/dao/VmwareDatacenterDaoImpl.java
index 8324e93..9f5796a 100644
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/dao/VmwareDatacenterDaoImpl.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/dao/VmwareDatacenterDaoImpl.java
@@ -75,7 +75,7 @@ public class VmwareDatacenterDaoImpl extends GenericDaoBase<VmwareDatacenterVO,
@Override
public List<VmwareDatacenterVO> getVmwareDatacenterByNameAndVcenter(String name, String vCenterHost) {
- SearchCriteria<VmwareDatacenterVO> sc = guidSearch.create();
+ SearchCriteria<VmwareDatacenterVO> sc = nameVcSearch.create();
sc.setParameters("name", name);
sc.setParameters("vCenterHost", vCenterHost);
return search(sc, null);
@@ -83,7 +83,7 @@ public class VmwareDatacenterDaoImpl extends GenericDaoBase<VmwareDatacenterVO,
@Override
public List<VmwareDatacenterVO> listVmwareDatacenterByName(String name) {
- SearchCriteria<VmwareDatacenterVO> sc = guidSearch.create();
+ SearchCriteria<VmwareDatacenterVO> sc = nameSearch.create();
sc.setParameters("name", name);
return search(sc, null);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/58b57ca5/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
index 664651e..a604392 100755
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
@@ -21,7 +21,7 @@ import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
-import java.net.URLDecoder;
+import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -38,8 +38,6 @@ import javax.naming.ConfigurationException;
import org.apache.cloudstack.api.command.admin.zone.AddVmwareDcCmd;
import org.apache.cloudstack.api.command.admin.zone.RemoveVmwareDcCmd;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreRole;
import org.apache.log4j.Logger;
import com.cloud.agent.AgentManager;
@@ -50,8 +48,6 @@ import com.cloud.agent.api.Answer;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.StartupCommand;
import com.cloud.agent.api.StartupRoutingCommand;
-import com.cloud.agent.api.storage.MigrateVolumeAnswer;
-import com.cloud.agent.api.to.VolumeTO;
import com.cloud.cluster.ClusterManager;
import com.cloud.configuration.Config;
import com.cloud.configuration.dao.ConfigurationDao;
@@ -80,7 +76,6 @@ import com.cloud.hypervisor.vmware.dao.LegacyZoneDao;
import com.cloud.hypervisor.vmware.dao.VmwareDatacenterDao;
import com.cloud.hypervisor.vmware.dao.VmwareDatacenterZoneMapDao;
import com.cloud.hypervisor.vmware.mo.CustomFieldConstants;
-import com.cloud.hypervisor.vmware.mo.CustomFieldsManagerMO;
import com.cloud.hypervisor.vmware.mo.DatacenterMO;
import com.cloud.hypervisor.vmware.mo.DiskControllerType;
import com.cloud.hypervisor.vmware.mo.HostFirewallSystemMO;
@@ -89,7 +84,6 @@ import com.cloud.hypervisor.vmware.mo.HypervisorHostHelper;
import com.cloud.hypervisor.vmware.mo.TaskMO;
import com.cloud.hypervisor.vmware.mo.VirtualEthernetCardType;
import com.cloud.hypervisor.vmware.mo.VmwareHostType;
-import com.cloud.utils.ssh.SshHelper;
import com.cloud.hypervisor.vmware.resource.VmwareContextFactory;
import com.cloud.hypervisor.vmware.util.VmwareClient;
import com.cloud.hypervisor.vmware.util.VmwareContext;
@@ -103,15 +97,10 @@ import com.cloud.serializer.GsonHelper;
import com.cloud.server.ConfigurationServer;
import com.cloud.storage.JavaStorageLayer;
import com.cloud.storage.StorageLayer;
-import com.cloud.storage.StoragePool;
-import com.cloud.storage.VolumeVO;
-import com.cloud.storage.dao.VolumeDao;
import com.cloud.storage.secondary.SecondaryStorageVmManager;
import com.cloud.utils.FileUtil;
import com.cloud.utils.NumbersUtil;
import com.cloud.utils.Pair;
-import com.cloud.utils.UriUtils;
-import com.cloud.utils.component.Manager;
import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.concurrency.NamedThreadFactory;
import com.cloud.utils.db.DB;
@@ -121,8 +110,6 @@ import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.script.Script;
import com.cloud.utils.ssh.SshHelper;
import com.cloud.vm.DomainRouterVO;
-import com.cloud.vm.VMInstanceVO;
-import com.cloud.vm.dao.VMInstanceDao;
import com.google.gson.Gson;
import com.vmware.vim25.AboutInfo;
import com.vmware.vim25.HostConnectSpec;
@@ -530,7 +517,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
_configServer.updateKeyPairs();
s_logger.info("Copy System VM patch ISO file to secondary storage. source ISO: " + srcIso.getAbsolutePath() +
- ", destination: " + destIso.getAbsolutePath());
+ ", destination: " + destIso.getAbsolutePath());
try {
FileUtil.copyfile(srcIso, destIso);
} catch(IOException e) {
@@ -579,7 +566,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
assert(isoFile != null);
if(!isoFile.exists()) {
- s_logger.error("Unable to locate systemvm.iso in your setup at " + isoFile.toString());
+ s_logger.error("Unable to locate systemvm.iso in your setup at " + isoFile.toString());
}
return isoFile;
}
@@ -596,7 +583,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
}
assert(keyFile != null);
if(!keyFile.exists()) {
- s_logger.error("Unable to locate id_rsa.cloud in your setup at " + keyFile.toString());
+ s_logger.error("Unable to locate id_rsa.cloud in your setup at " + keyFile.toString());
}
return keyFile;
}
@@ -914,9 +901,9 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
public VmwareDatacenterVO addVmwareDatacenter(AddVmwareDcCmd cmd) throws ResourceInUseException {
VmwareDatacenterVO vmwareDc = null;
Long zoneId = cmd.getZoneId();
- String url = cmd.getUrl();
String userName = cmd.getUsername();
String password = cmd.getPassword();
+ String vCenterHost = cmd.getVcenter();
String vmwareDcName = cmd.getName();
// Zone validation
@@ -928,25 +915,26 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
throw new CloudRuntimeException("Zone " + zoneId + " is already associated with a VMware datacenter.");
}
- // Validate url and get uri
- URI uri = getUri(url);
-
- // Validate username and password and DC name
+ // Validate username, password, VMware DC name and vCenter
if (userName == null) {
- throw new InvalidParameterValueException("Invalid parameter username.");
+ throw new InvalidParameterValueException("Missing or invalid parameter username.");
}
if (password == null) {
- throw new InvalidParameterValueException("Invalid parameter password.");
+ throw new InvalidParameterValueException("Missing or invalid parameter username.");
}
if (vmwareDcName == null) {
- throw new InvalidParameterValueException("Invalid parameter name. Please provide valid VMware datacenter name.");
+ throw new InvalidParameterValueException("Missing or invalid parameter name. Please provide valid VMware datacenter name.");
+ }
+
+ if (vCenterHost == null) {
+ throw new InvalidParameterValueException("Missing or invalid parameter name. " +
+ "Please provide valid VMware vCenter server's IP address or fully qualified domain name.");
}
// Check if DC is already part of zone
// In that case vmware_data_center table should have the DC
- String vCenterHost = uri.getHost();
vmwareDc = _vmwareDcDao.getVmwareDatacenterByGuid(vmwareDcName + "@" + vCenterHost);
if (vmwareDc != null) {
throw new ResourceInUseException("This DC is already part of other CloudStack zone(s). Cannot add this DC to more zones.");
@@ -963,14 +951,13 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
context = VmwareContextFactory.create(vCenterHost, userName, password);
// Check if DC exists on vCenter
- try {
- dcMo = new DatacenterMO(context, vmwareDcName);
- } catch(Throwable t) {
- String msg = "Unable to find DC " + vmwareDcName + " in vCenter " + vCenterHost;
+ dcMo = new DatacenterMO(context, vmwareDcName);
+ dcMor = dcMo.getMor();
+ if (dcMor == null) {
+ String msg = "Unable to find VMware DC " + vmwareDcName + " in vCenter " + vCenterHost + ". ";
s_logger.error(msg);
- throw new DiscoveryException(msg);
+ throw new InvalidParameterValueException(msg);
}
- assert (dcMo != null);
// Check if DC is already associated with another cloudstack deployment
// Get custom field property cloud.zone over this DC
@@ -1020,9 +1007,13 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
}
dcMo.setCustomFieldValue(CustomFieldConstants.CLOUD_ZONE, "true");
- } catch (Exception e) {
- String msg = "VMware DC discovery failed due to : " + VmwareHelper.getExceptionMessage(e);
- s_logger.error(msg);
+ } catch (Throwable e) {
+ String msg = "Failed to add VMware DC to zone ";
+ if (e instanceof RemoteException) {
+ msg = "Encountered remote exception at vCenter. " + VmwareHelper.getExceptionMessage(e);
+ } else {
+ msg += "due to : " + e.getMessage();
+ }
throw new CloudRuntimeException(msg);
} finally {
if (context != null)
@@ -1032,6 +1023,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
return vmwareDc;
}
+
@Override
public boolean removeVmwareDatacenter(RemoveVmwareDcCmd cmd) throws ResourceInUseException {
Long zoneId = cmd.getZoneId();
@@ -1070,8 +1062,8 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
_vmwareDcZoneMapDao.remove(vmwareDcZoneMap.getId());
txn.commit();
} catch (Exception e) {
- s_logger.info("Caught exception when trying to delete VMware datacenter record.." + e.getMessage());
- throw new CloudRuntimeException("Failed to delete VMware datacenter ");
+ s_logger.info("Caught exception when trying to delete VMware datacenter record." + e.getMessage());
+ throw new CloudRuntimeException("Failed to delete VMware datacenter.");
}
// Construct context
@@ -1083,7 +1075,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
try {
dcMo = new DatacenterMO(context, vmwareDcName);
} catch(Throwable t) {
- String msg = "able to find DC " + vmwareDcName + " in vCenter " + vCenterHost;
+ String msg = "Unable to find DC " + vmwareDcName + " in vCenter " + vCenterHost;
s_logger.error(msg);
throw new DiscoveryException(msg);
}
@@ -1095,7 +1087,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
s_logger.info("Sucessfully reset custom field property cloud.zone over DC " + vmwareDcName);
} catch (Exception e) {
String msg = "Unable to reset custom field property cloud.zone over DC " + vmwareDcName
- + " due to : " + VmwareHelper.getExceptionMessage(e);
+ + " due to : " + VmwareHelper.getExceptionMessage(e);
s_logger.error(msg);
throw new CloudRuntimeException(msg);
} finally {
@@ -1111,7 +1103,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
DataCenterVO zone = _dcDao.findById(zoneId);
if (zone == null) {
InvalidParameterValueException ex = new InvalidParameterValueException(
- "Can't find zone by the id specified");
+ "Can't find zone by the id specified.");
throw ex;
}
@@ -1122,38 +1114,10 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
for (ClusterVO cluster : clusters) {
if (cluster.getHypervisorType().equals(HypervisorType.VMware)) {
throw new ResourceInUseException("Zone has one or more clusters."
- + " Can't " + errStr + " which already has clusters.");
- }
- }
- }
- }
-
- private URI getUri(String url) throws InvalidParameterValueException {
- if (url == null) {
- throw new InvalidParameterValueException("Invalid url.");
- }
-
- URI uri = null;
- try {
- uri = new URI(UriUtils.encodeURIComponent(url));
- if (uri.getScheme() == null) {
- throw new InvalidParameterValueException(
- "uri.scheme is null " + url
- + ", add http:// as a prefix");
- } else if (uri.getScheme().equalsIgnoreCase("http")) {
- if (uri.getHost() == null
- || uri.getHost().equalsIgnoreCase("")
- || uri.getPath() == null
- || uri.getPath().equalsIgnoreCase("")) {
- throw new InvalidParameterValueException(
- "Your host and/or path is wrong. Make sure it's of the format http://hostname/path");
+ + " Can't " + errStr + " which already has clusters.");
}
}
- } catch (URISyntaxException e) {
- throw new InvalidParameterValueException(url
- + " is not a valid uri");
}
- return uri;
}
@Override
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/58b57ca5/plugins/hypervisors/vmware/src/org/apache/cloudstack/api/command/admin/zone/AddVmwareDcCmd.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/org/apache/cloudstack/api/command/admin/zone/AddVmwareDcCmd.java b/plugins/hypervisors/vmware/src/org/apache/cloudstack/api/command/admin/zone/AddVmwareDcCmd.java
index fde96c8..317452b 100644
--- a/plugins/hypervisors/vmware/src/org/apache/cloudstack/api/command/admin/zone/AddVmwareDcCmd.java
+++ b/plugins/hypervisors/vmware/src/org/apache/cloudstack/api/command/admin/zone/AddVmwareDcCmd.java
@@ -48,8 +48,8 @@ public class AddVmwareDcCmd extends BaseCmd {
@Parameter(name=ApiConstants.NAME, type=CommandType.STRING, required=true, description="Name of VMware datacenter to be added to specified zone.")
private String name;
- @Parameter(name=ApiConstants.URL, type=CommandType.STRING, required=false, description="The URL of vCenter.")
- private String url;
+ @Parameter(name=ApiConstants.VCENTER, type=CommandType.STRING, required=true, description="The name/ip of vCenter. Make sure it is IP address or full qualified domain name for host running vCenter server.")
+ private String vCenter;
@Parameter(name=ApiConstants.USERNAME, type=CommandType.STRING, required=false, description="The Username required to connect to resource.")
private String username;
@@ -64,8 +64,8 @@ public class AddVmwareDcCmd extends BaseCmd {
return name;
}
- public String getUrl() {
- return url;
+ public String getVcenter() {
+ return vCenter;
}
public String getUsername() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/58b57ca5/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java b/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java
index 688b93c..de08c93 100644
--- a/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java
+++ b/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java
@@ -214,7 +214,7 @@ public class VmwareDatacenterApiUnitTest {
Mockito.when(_vmwareDcZoneMapDao.findByZoneId(1L)).thenReturn(null);
Mockito.when(_vmwareDcZoneMapDao.expunge(1L)).thenReturn(true);
Mockito.when(addCmd.getZoneId()).thenReturn(1L);
- Mockito.when(addCmd.getUrl()).thenReturn(url);
+ Mockito.when(addCmd.getVcenter()).thenReturn(vCenterHost);
Mockito.when(addCmd.getUsername()).thenReturn(user);
Mockito.when(addCmd.getPassword()).thenReturn(password);
Mockito.when(addCmd.getName()).thenReturn(vmwareDcName);
@@ -265,7 +265,7 @@ public class VmwareDatacenterApiUnitTest {
//@Test(expected = InvalidParameterValueException.class)
public void testAddVmwareDcWithNullUrl() throws ResourceInUseException, IllegalArgumentException, DiscoveryException, Exception {
- Mockito.when(addCmd.getUrl()).thenReturn(null);
+ Mockito.when(addCmd.getVcenter()).thenReturn(null);
_vmwareDatacenterService.addVmwareDatacenter(addCmd);
}
[09/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
CLOUDSTACK-2867 Cannot add multiple vmware zones in vCenter
Checking guid in database, if association of DC to zone exists already.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/3ec7f8b9
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/3ec7f8b9
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/3ec7f8b9
Branch: refs/heads/vmsync
Commit: 3ec7f8b99ebe9c02a6b6ed69efdb72dfb9543b3b
Parents: 1696e8c
Author: Sateesh Chodapuneedi <sa...@apache.org>
Authored: Thu Jun 6 14:33:05 2013 +0530
Committer: Sateesh Chodapuneedi <sa...@apache.org>
Committed: Thu Jun 6 14:33:05 2013 +0530
----------------------------------------------------------------------
.../com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3ec7f8b9/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
index 78b7582..664651e 100755
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
@@ -947,8 +947,8 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
// Check if DC is already part of zone
// In that case vmware_data_center table should have the DC
String vCenterHost = uri.getHost();
- List<VmwareDatacenterVO> vmwareDcs = _vmwareDcDao.getVmwareDatacenterByNameAndVcenter(vmwareDcName, vCenterHost);
- if (vmwareDcs != null && vmwareDcs.size() != 0) {
+ vmwareDc = _vmwareDcDao.getVmwareDatacenterByGuid(vmwareDcName + "@" + vCenterHost);
+ if (vmwareDc != null) {
throw new ResourceInUseException("This DC is already part of other CloudStack zone(s). Cannot add this DC to more zones.");
}
[20/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
CLOUDSTACK-747: Internal LB detailView - Assigned VMs tab - Assign VMs action - fix a bug that select VM view failed to show VMs.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/bdb5997c
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/bdb5997c
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/bdb5997c
Branch: refs/heads/vmsync
Commit: bdb5997cfc0b5e258e117a7c6c5de18d9dfce1f3
Parents: 62e125c
Author: Jessica Wang <je...@apache.org>
Authored: Thu Jun 6 10:45:29 2013 -0700
Committer: Jessica Wang <je...@apache.org>
Committed: Thu Jun 6 10:45:29 2013 -0700
----------------------------------------------------------------------
ui/scripts/vpc.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/bdb5997c/ui/scripts/vpc.js
----------------------------------------------------------------------
diff --git a/ui/scripts/vpc.js b/ui/scripts/vpc.js
index 580e004..f0b449f 100644
--- a/ui/scripts/vpc.js
+++ b/ui/scripts/vpc.js
@@ -667,7 +667,7 @@
var items = [];
if(instances != null) {
for(var i = 0; i < instances.length; i++) {
- if(instances[i]._isSelected = true)
+ if(instances[i]._isSelected == true)
continue;
else
items.push(instances[i]);
[48/50] [abbrv] Merged from master
Posted by ah...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/api/ApiDBUtils.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/api/ApiResponseHelper.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/api/ApiResponseHelper.java
index 7d7493a,bcc1605..65214f6
--- a/server/src/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/com/cloud/api/ApiResponseHelper.java
@@@ -3448,114 -3323,125 +3316,125 @@@ public class ApiResponseHelper implemen
}
- @Override
- public UsageRecordResponse createUsageResponse(Usage usageRecord) {
- UsageRecordResponse usageRecResponse = new UsageRecordResponse();
-
- Account account = ApiDBUtils.findAccountByIdIncludingRemoved(usageRecord.getAccountId());
- if (account.getType() == Account.ACCOUNT_TYPE_PROJECT) {
- //find the project
- Project project = ApiDBUtils.findProjectByProjectAccountIdIncludingRemoved(account.getId());
- usageRecResponse.setProjectId(project.getUuid());
- usageRecResponse.setProjectName(project.getName());
- } else {
- usageRecResponse.setAccountId(account.getUuid());
- usageRecResponse.setAccountName(account.getAccountName());
- }
-
- Domain domain = ApiDBUtils.findDomainById(usageRecord.getDomainId());
- if (domain != null) {
- usageRecResponse.setDomainId(domain.getUuid());
- }
-
- if (usageRecord.getZoneId() != null) {
- DataCenter zone = ApiDBUtils.findZoneById(usageRecord.getZoneId());
- if (zone != null) {
- usageRecResponse.setZoneId(zone.getUuid());
- }
- }
- usageRecResponse.setDescription(usageRecord.getDescription());
- usageRecResponse.setUsage(usageRecord.getUsageDisplay());
- usageRecResponse.setUsageType(usageRecord.getUsageType());
- if (usageRecord.getVmInstanceId() != null) {
- VMInstanceVO vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getVmInstanceId());
- usageRecResponse.setVirtualMachineId(vm.getUuid());
- }
- usageRecResponse.setVmName(usageRecord.getVmName());
- if (usageRecord.getTemplateId() != null) {
- VMTemplateVO template = ApiDBUtils.findTemplateById(usageRecord.getTemplateId());
- if (template != null) {
- usageRecResponse.setTemplateId(template.getUuid());
- }
- }
-
- if(usageRecord.getUsageType() == UsageTypes.RUNNING_VM || usageRecord.getUsageType() == UsageTypes.ALLOCATED_VM){
- ServiceOfferingVO svcOffering = _entityMgr.findByIdIncludingRemoved(ServiceOfferingVO.class, usageRecord.getOfferingId().toString());
- //Service Offering Id
- usageRecResponse.setOfferingId(svcOffering.getUuid());
- //VM Instance ID
- VMInstanceVO vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getUsageId().toString());
- usageRecResponse.setUsageId(vm.getUuid());
- //Hypervisor Type
- usageRecResponse.setType(usageRecord.getType());
-
- } else if(usageRecord.getUsageType() == UsageTypes.IP_ADDRESS){
- //isSourceNAT
- usageRecResponse.setSourceNat((usageRecord.getType().equals("SourceNat"))?true:false);
- //isSystem
- usageRecResponse.setSystem((usageRecord.getSize() == 1)?true:false);
- //IP Address ID
- IPAddressVO ip = _entityMgr.findByIdIncludingRemoved(IPAddressVO.class, usageRecord.getUsageId().toString());
- usageRecResponse.setUsageId(ip.getUuid());
-
- } else if(usageRecord.getUsageType() == UsageTypes.NETWORK_BYTES_SENT || usageRecord.getUsageType() == UsageTypes.NETWORK_BYTES_RECEIVED){
- //Device Type
- usageRecResponse.setType(usageRecord.getType());
- if(usageRecord.getType().equals("DomainRouter")){
- //Domain Router Id
- VMInstanceVO vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getUsageId().toString());
- usageRecResponse.setUsageId(vm.getUuid());
- } else {
- //External Device Host Id
- HostVO host = _entityMgr.findByIdIncludingRemoved(HostVO.class, usageRecord.getUsageId().toString());
- usageRecResponse.setUsageId(host.getUuid());
- }
- //Network ID
- NetworkVO network = _entityMgr.findByIdIncludingRemoved(NetworkVO.class, usageRecord.getNetworkId().toString());
- usageRecResponse.setNetworkId(network.getUuid());
+ @Override
+ public UsageRecordResponse createUsageResponse(Usage usageRecord) {
+ UsageRecordResponse usageRecResponse = new UsageRecordResponse();
+
+ Account account = ApiDBUtils.findAccountByIdIncludingRemoved(usageRecord.getAccountId());
+ if (account.getType() == Account.ACCOUNT_TYPE_PROJECT) {
+ //find the project
+ Project project = ApiDBUtils.findProjectByProjectAccountIdIncludingRemoved(account.getId());
+ usageRecResponse.setProjectId(project.getUuid());
+ usageRecResponse.setProjectName(project.getName());
+ } else {
+ usageRecResponse.setAccountId(account.getUuid());
+ usageRecResponse.setAccountName(account.getAccountName());
+ }
+
+ Domain domain = ApiDBUtils.findDomainById(usageRecord.getDomainId());
+ if (domain != null) {
+ usageRecResponse.setDomainId(domain.getUuid());
+ }
+
+ if (usageRecord.getZoneId() != null) {
+ DataCenter zone = ApiDBUtils.findZoneById(usageRecord.getZoneId());
+ if (zone != null) {
+ usageRecResponse.setZoneId(zone.getUuid());
+ }
+ }
+ usageRecResponse.setDescription(usageRecord.getDescription());
+ usageRecResponse.setUsage(usageRecord.getUsageDisplay());
+ usageRecResponse.setUsageType(usageRecord.getUsageType());
+ if (usageRecord.getVmInstanceId() != null) {
+ VMInstanceVO vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getVmInstanceId());
+ usageRecResponse.setVirtualMachineId(vm.getUuid());
+ }
+ usageRecResponse.setVmName(usageRecord.getVmName());
+ if (usageRecord.getTemplateId() != null) {
+ VMTemplateVO template = ApiDBUtils.findTemplateById(usageRecord.getTemplateId());
+ if (template != null) {
+ usageRecResponse.setTemplateId(template.getUuid());
+ }
+ }
+
+ if(usageRecord.getUsageType() == UsageTypes.RUNNING_VM || usageRecord.getUsageType() == UsageTypes.ALLOCATED_VM){
+ ServiceOfferingVO svcOffering = _entityMgr.findByIdIncludingRemoved(ServiceOfferingVO.class, usageRecord.getOfferingId().toString());
+ //Service Offering Id
+ usageRecResponse.setOfferingId(svcOffering.getUuid());
+ //VM Instance ID
+ VMInstanceVO vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getUsageId().toString());
+ usageRecResponse.setUsageId(vm.getUuid());
+ //Hypervisor Type
+ usageRecResponse.setType(usageRecord.getType());
+
+ } else if(usageRecord.getUsageType() == UsageTypes.IP_ADDRESS){
+ //isSourceNAT
+ usageRecResponse.setSourceNat((usageRecord.getType().equals("SourceNat"))?true:false);
+ //isSystem
+ usageRecResponse.setSystem((usageRecord.getSize() == 1)?true:false);
+ //IP Address ID
+ IPAddressVO ip = _entityMgr.findByIdIncludingRemoved(IPAddressVO.class, usageRecord.getUsageId().toString());
+ usageRecResponse.setUsageId(ip.getUuid());
+
+ } else if(usageRecord.getUsageType() == UsageTypes.NETWORK_BYTES_SENT || usageRecord.getUsageType() == UsageTypes.NETWORK_BYTES_RECEIVED){
+ //Device Type
+ usageRecResponse.setType(usageRecord.getType());
+ if(usageRecord.getType().equals("DomainRouter")){
+ //Domain Router Id
+ VMInstanceVO vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getUsageId().toString());
+ usageRecResponse.setUsageId(vm.getUuid());
+ } else {
+ //External Device Host Id
+ HostVO host = _entityMgr.findByIdIncludingRemoved(HostVO.class, usageRecord.getUsageId().toString());
+ usageRecResponse.setUsageId(host.getUuid());
+ }
+ //Network ID
+ NetworkVO network = _entityMgr.findByIdIncludingRemoved(NetworkVO.class, usageRecord.getNetworkId().toString());
+ usageRecResponse.setNetworkId(network.getUuid());
+ } else if(usageRecord.getUsageType() == UsageTypes.VM_DISK_IO_READ || usageRecord.getUsageType() == UsageTypes.VM_DISK_IO_WRITE ||
+ usageRecord.getUsageType() == UsageTypes.VM_DISK_BYTES_READ || usageRecord.getUsageType() == UsageTypes.VM_DISK_BYTES_WRITE){
+ //Device Type
+ usageRecResponse.setType(usageRecord.getType());
+ //VM Instance Id
+ VMInstanceVO vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getUsageId().toString());
+ usageRecResponse.setUsageId(vm.getUuid());
+ //Volume ID
+ VolumeVO volume = _entityMgr.findByIdIncludingRemoved(VolumeVO.class, usageRecord.getUsageId().toString());
+ usageRecResponse.setUsageId(volume.getUuid());
+
- } else if(usageRecord.getUsageType() == UsageTypes.VOLUME){
- //Volume ID
- VolumeVO volume = _entityMgr.findByIdIncludingRemoved(VolumeVO.class, usageRecord.getUsageId().toString());
- usageRecResponse.setUsageId(volume.getUuid());
- //Volume Size
- usageRecResponse.setSize(usageRecord.getSize());
- //Disk Offering Id
- if(usageRecord.getOfferingId() != null){
- DiskOfferingVO diskOff = _entityMgr.findByIdIncludingRemoved(DiskOfferingVO.class, usageRecord.getOfferingId().toString());
- usageRecResponse.setOfferingId(diskOff.getUuid());
- }
-
- } else if(usageRecord.getUsageType() == UsageTypes.TEMPLATE || usageRecord.getUsageType() == UsageTypes.ISO){
- //Template/ISO ID
- VMTemplateVO tmpl = _entityMgr.findByIdIncludingRemoved(VMTemplateVO.class, usageRecord.getUsageId().toString());
- usageRecResponse.setUsageId(tmpl.getUuid());
- //Template/ISO Size
- usageRecResponse.setSize(usageRecord.getSize());
-
- } else if(usageRecord.getUsageType() == UsageTypes.SNAPSHOT){
- //Snapshot ID
- SnapshotVO snap = _entityMgr.findByIdIncludingRemoved(SnapshotVO.class, usageRecord.getUsageId().toString());
- usageRecResponse.setUsageId(snap.getUuid());
- //Snapshot Size
- usageRecResponse.setSize(usageRecord.getSize());
-
- } else if(usageRecord.getUsageType() == UsageTypes.LOAD_BALANCER_POLICY){
- //Load Balancer Policy ID
+ } else if(usageRecord.getUsageType() == UsageTypes.VOLUME){
+ //Volume ID
+ VolumeVO volume = _entityMgr.findByIdIncludingRemoved(VolumeVO.class, usageRecord.getUsageId().toString());
+ usageRecResponse.setUsageId(volume.getUuid());
+ //Volume Size
+ usageRecResponse.setSize(usageRecord.getSize());
+ //Disk Offering Id
+ if(usageRecord.getOfferingId() != null){
+ DiskOfferingVO diskOff = _entityMgr.findByIdIncludingRemoved(DiskOfferingVO.class, usageRecord.getOfferingId().toString());
+ usageRecResponse.setOfferingId(diskOff.getUuid());
+ }
+
+ } else if(usageRecord.getUsageType() == UsageTypes.TEMPLATE || usageRecord.getUsageType() == UsageTypes.ISO){
+ //Template/ISO ID
+ VMTemplateVO tmpl = _entityMgr.findByIdIncludingRemoved(VMTemplateVO.class, usageRecord.getUsageId().toString());
+ usageRecResponse.setUsageId(tmpl.getUuid());
+ //Template/ISO Size
+ usageRecResponse.setSize(usageRecord.getSize());
+
+ } else if(usageRecord.getUsageType() == UsageTypes.SNAPSHOT){
+ //Snapshot ID
+ SnapshotVO snap = _entityMgr.findByIdIncludingRemoved(SnapshotVO.class, usageRecord.getUsageId().toString());
+ usageRecResponse.setUsageId(snap.getUuid());
+ //Snapshot Size
+ usageRecResponse.setSize(usageRecord.getSize());
+
+ } else if(usageRecord.getUsageType() == UsageTypes.LOAD_BALANCER_POLICY){
+ //Load Balancer Policy ID
LoadBalancerVO lb = _entityMgr.findByIdIncludingRemoved(LoadBalancerVO.class, usageRecord.getUsageId().toString());
usageRecResponse.setUsageId(lb.getUuid());
- } else if(usageRecord.getUsageType() == UsageTypes.PORT_FORWARDING_RULE){
- //Port Forwarding Rule ID
+ } else if(usageRecord.getUsageType() == UsageTypes.PORT_FORWARDING_RULE){
+ //Port Forwarding Rule ID
PortForwardingRuleVO pf = _entityMgr.findByIdIncludingRemoved(PortForwardingRuleVO.class, usageRecord.getUsageId().toString());
usageRecResponse.setUsageId(pf.getUuid());
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/api/ApiServer.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/api/query/QueryManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/api/query/QueryManagerImpl.java
index 1caddb7,beda75e..6280cbf
--- a/server/src/com/cloud/api/query/QueryManagerImpl.java
+++ b/server/src/com/cloud/api/query/QueryManagerImpl.java
@@@ -2383,12 -2413,12 +2413,12 @@@ public class QueryManagerImpl extends M
public Pair<List<AffinityGroupJoinVO>, Integer> listAffinityGroupsInternal(Long affinityGroupId,
- String affinityGroupName, String affinityGroupType, Long vmId, Long startIndex, Long pageSize) {
+ String affinityGroupName, String affinityGroupType, Long vmId, String accountName, Long domainId,
+ boolean isRecursive, boolean listAll, Long startIndex, Long pageSize) {
- Account caller = UserContext.current().getCaller();
+ Account caller = CallContext.current().getCallingAccount();
Long accountId = caller.getAccountId();
- Long domainId = caller.getDomainId();
if (vmId != null) {
UserVmVO userVM = _userVmDao.findById(vmId);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/api/query/ViewResponseHelper.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/api/query/ViewResponseHelper.java
index 1124e69,a61da69..3daa1c1
--- a/server/src/com/cloud/api/query/ViewResponseHelper.java
+++ b/server/src/com/cloud/api/query/ViewResponseHelper.java
@@@ -16,11 -16,28 +16,13 @@@
// under the License.
package com.cloud.api.query;
-import com.cloud.api.ApiDBUtils;
-import com.cloud.api.query.vo.AccountJoinVO;
-import com.cloud.api.query.vo.AffinityGroupJoinVO;
-import com.cloud.api.query.vo.AsyncJobJoinVO;
-import com.cloud.api.query.vo.DataCenterJoinVO;
-import com.cloud.api.query.vo.DiskOfferingJoinVO;
-import com.cloud.api.query.vo.DomainRouterJoinVO;
-import com.cloud.api.query.vo.EventJoinVO;
-import com.cloud.api.query.vo.HostJoinVO;
-import com.cloud.api.query.vo.InstanceGroupJoinVO;
-import com.cloud.api.query.vo.ProjectAccountJoinVO;
-import com.cloud.api.query.vo.ProjectInvitationJoinVO;
-import com.cloud.api.query.vo.ProjectJoinVO;
-import com.cloud.api.query.vo.ResourceTagJoinVO;
-import com.cloud.api.query.vo.SecurityGroupJoinVO;
-import com.cloud.api.query.vo.ServiceOfferingJoinVO;
-import com.cloud.api.query.vo.StoragePoolJoinVO;
-import com.cloud.api.query.vo.UserAccountJoinVO;
-import com.cloud.api.query.vo.UserVmJoinVO;
-import com.cloud.api.query.vo.VolumeJoinVO;
-import com.cloud.user.Account;
-import com.cloud.user.UserContext;
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.Hashtable;
+import java.util.List;
+
++import org.apache.log4j.Logger;
++
import org.apache.cloudstack.affinity.AffinityGroupResponse;
import org.apache.cloudstack.api.ApiConstants.HostDetails;
import org.apache.cloudstack.api.ApiConstants.VMDetails;
@@@ -44,31 -60,12 +45,29 @@@ import org.apache.cloudstack.api.respon
import org.apache.cloudstack.api.response.UserVmResponse;
import org.apache.cloudstack.api.response.VolumeResponse;
import org.apache.cloudstack.api.response.ZoneResponse;
-import org.apache.log4j.Logger;
+import org.apache.cloudstack.context.CallContext;
- import org.apache.log4j.Logger;
-
-import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.Hashtable;
-import java.util.List;
+import com.cloud.api.ApiDBUtils;
+import com.cloud.api.query.vo.AccountJoinVO;
+import com.cloud.api.query.vo.AffinityGroupJoinVO;
+import com.cloud.api.query.vo.AsyncJobJoinVO;
+import com.cloud.api.query.vo.DataCenterJoinVO;
+import com.cloud.api.query.vo.DiskOfferingJoinVO;
+import com.cloud.api.query.vo.DomainRouterJoinVO;
+import com.cloud.api.query.vo.EventJoinVO;
+import com.cloud.api.query.vo.HostJoinVO;
+import com.cloud.api.query.vo.InstanceGroupJoinVO;
+import com.cloud.api.query.vo.ProjectAccountJoinVO;
+import com.cloud.api.query.vo.ProjectInvitationJoinVO;
+import com.cloud.api.query.vo.ProjectJoinVO;
+import com.cloud.api.query.vo.ResourceTagJoinVO;
+import com.cloud.api.query.vo.SecurityGroupJoinVO;
+import com.cloud.api.query.vo.ServiceOfferingJoinVO;
+import com.cloud.api.query.vo.StoragePoolJoinVO;
+import com.cloud.api.query.vo.UserAccountJoinVO;
+import com.cloud.api.query.vo.UserVmJoinVO;
+import com.cloud.api.query.vo.VolumeJoinVO;
+import com.cloud.user.Account;
/**
* Helper class to generate response from DB view VO objects.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
index e21f537,421e53f..67ffa18
--- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
+++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
@@@ -558,8 -558,7 +558,11 @@@ public class ConsoleProxyManagerImpl ex
}
if (proxy.getState() == VirtualMachine.State.Stopped) {
- return _itMgr.start(proxy, null, systemUser, systemAcct);
+ _itMgr.start(proxy.getUuid(), null, systemUser, systemAcct);
- return _consoleProxyDao.findById(proxyVmId);
++ proxy = _consoleProxyDao.findById(proxyVmId);
++ if (proxy.getState() == State.Running) {
++ return null;
++ }
}
// For VMs that are in Stopping, Starting, Migrating state, let client to wait by returning null
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
index fa326d8,eb895e5..4dd257e
--- a/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
+++ b/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
@@@ -29,9 -29,9 +29,10 @@@ import javax.ejb.Local
import javax.inject.Inject;
import javax.naming.ConfigurationException;
-import org.apache.cloudstack.affinity.AffinityGroupProcessor;
-import org.apache.cloudstack.affinity.AffinityGroupVMMapVO;
+import org.apache.log4j.Logger;
+import org.apache.cloudstack.affinity.AffinityGroupProcessor;
++import org.apache.cloudstack.affinity.AffinityGroupVMMapVO;
import org.apache.cloudstack.affinity.dao.AffinityGroupDao;
import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
@@@ -60,9 -54,12 +61,12 @@@ import com.cloud.dc.ClusterDetailsVO
import com.cloud.dc.ClusterVO;
import com.cloud.dc.DataCenter;
import com.cloud.dc.DataCenterVO;
-import com.cloud.dc.DedicatedResourceVO;
-import com.cloud.dc.HostPodVO;
++import com.cloud.dc.DedicatedResourceVO;
++import com.cloud.dc.HostPodVO;
import com.cloud.dc.Pod;
import com.cloud.dc.dao.ClusterDao;
import com.cloud.dc.dao.DataCenterDao;
-import com.cloud.dc.dao.DedicatedResourceDao;
++import com.cloud.dc.dao.DedicatedResourceDao;
import com.cloud.dc.dao.HostPodDao;
import com.cloud.deploy.DeploymentPlanner.ExcludeList;
import com.cloud.deploy.DeploymentPlanner.PlannerResourceUsage;
@@@ -98,6 -95,7 +102,7 @@@ import com.cloud.utils.component.Manage
import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.Transaction;
-import com.cloud.utils.exception.CloudRuntimeException;
++import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.DiskProfile;
import com.cloud.vm.ReservationContext;
import com.cloud.vm.VMInstanceVO;
@@@ -428,6 -437,60 +435,60 @@@ public class DeploymentPlanningManagerI
return dest;
}
- private void checkForNonDedicatedResources(VirtualMachineProfile<? extends VirtualMachine> vmProfile, DataCenter dc, ExcludeList avoids) {
++ private void checkForNonDedicatedResources(VirtualMachineProfile vmProfile, DataCenter dc, ExcludeList avoids) {
+ boolean isExplicit = false;
+ VirtualMachine vm = vmProfile.getVirtualMachine();
+ // check affinity group of type Explicit dedication exists
+ List<AffinityGroupVMMapVO> vmGroupMappings = _affinityGroupVMMapDao.findByVmIdType(vm.getId(), "ExplicitDedication");
+
+ if (vmGroupMappings != null && !vmGroupMappings.isEmpty()){
+ isExplicit = true;
+ }
+
+ if (!isExplicit && vm.getType() == VirtualMachine.Type.User) {
+ //add explicitly dedicated resources in avoidList
+ DedicatedResourceVO dedicatedZone = _dedicatedDao.findByZoneId(dc.getId());
+ if (dedicatedZone != null) {
+ long accountDomainId = vmProfile.getOwner().getDomainId();
+ if (dedicatedZone.getDomainId() != null && !dedicatedZone.getDomainId().equals(accountDomainId)) {
+ throw new CloudRuntimeException("Failed to deploy VM. Zone " + dc.getName() + " is dedicated.");
+ }
+ }
+
+ List<HostPodVO> podsInDc = _podDao.listByDataCenterId(dc.getId());
+ for (HostPodVO pod : podsInDc) {
+ DedicatedResourceVO dedicatedPod = _dedicatedDao.findByPodId(pod.getId());
+ if (dedicatedPod != null) {
+ avoids.addPod(dedicatedPod.getPodId());
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Cannot use this dedicated pod " + pod.getName() + ".");
+ }
+ }
+ }
+
+ List<ClusterVO> clusterInDc = _clusterDao.listClustersByDcId(dc.getId());
+ for (ClusterVO cluster : clusterInDc) {
+ DedicatedResourceVO dedicatedCluster = _dedicatedDao.findByClusterId(cluster.getId());
+ if (dedicatedCluster != null) {
+ avoids.addCluster(dedicatedCluster.getClusterId());
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Cannot use this dedicated Cluster " + cluster.getName() + ".");
+ }
+ }
+ }
+ List<HostVO> hostInDc = _hostDao.listByDataCenterId(dc.getId());
+ for (HostVO host : hostInDc) {
+ DedicatedResourceVO dedicatedHost = _dedicatedDao.findByHostId(host.getId());
+ if (dedicatedHost != null) {
+ avoids.addHost(dedicatedHost.getHostId());
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Cannot use this dedicated host " + host.getName() + ".");
+ }
+ }
+ }
+ }
+ }
+
private void resetAvoidSet(ExcludeList avoidSet, ExcludeList removeSet) {
if (avoidSet.getDataCentersToAvoid() != null && removeSet.getDataCentersToAvoid() != null) {
avoidSet.getDataCentersToAvoid().removeAll(removeSet.getDataCentersToAvoid());
@@@ -446,14 -509,14 +507,15 @@@
}
}
- private PlannerResourceUsage getPlannerUsage(DeploymentPlanner planner) {
- private PlannerResourceUsage getPlannerUsage(DeploymentPlanner planner, VirtualMachineProfile<? extends VirtualMachine> vmProfile, DeploymentPlan plan, ExcludeList avoids) throws InsufficientServerCapacityException {
++ private PlannerResourceUsage getPlannerUsage(DeploymentPlanner planner, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoids)
++ throws InsufficientServerCapacityException {
if (planner != null && planner instanceof DeploymentClusterPlanner) {
- return ((DeploymentClusterPlanner) planner).getResourceUsage();
+ return ((DeploymentClusterPlanner) planner).getResourceUsage(vmProfile, plan, avoids);
} else {
return DeploymentPlanner.PlannerResourceUsage.Shared;
- }
+ }
- }
+ }
@DB
private boolean checkIfHostFitsPlannerUsage(long hostId, PlannerResourceUsage resourceUsageRequired) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/deploy/FirstFitPlanner.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/deploy/FirstFitPlanner.java
index bc5cedb,7124de2..15da8ba
--- a/server/src/com/cloud/deploy/FirstFitPlanner.java
+++ b/server/src/com/cloud/deploy/FirstFitPlanner.java
@@@ -494,10 -514,11 +494,11 @@@ public class FirstFitPlanner extends Pl
ExcludeList avoid) throws InsufficientServerCapacityException {
// TODO Auto-generated method stub
return null;
- }
+ }
@Override
- public PlannerResourceUsage getResourceUsage() {
- public PlannerResourceUsage getResourceUsage(VirtualMachineProfile<? extends VirtualMachine> vmProfile,
++ public PlannerResourceUsage getResourceUsage(VirtualMachineProfile vmProfile,
+ DeploymentPlan plan, ExcludeList avoid) throws InsufficientServerCapacityException {
return PlannerResourceUsage.Shared;
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/network/NetworkManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/NetworkManagerImpl.java
index 4ce8c6d,d6a6450..0cbe99c
--- a/server/src/com/cloud/network/NetworkManagerImpl.java
+++ b/server/src/com/cloud/network/NetworkManagerImpl.java
@@@ -4312,41 -4297,42 +4297,42 @@@ public class NetworkManagerImpl extend
private boolean removeVmSecondaryIpsOfNic(long nicId) {
- Transaction txn = Transaction.currentTxn();
- txn.start();
- List <NicSecondaryIpVO> ipList = _nicSecondaryIpDao.listByNicId(nicId);
- if (ipList != null) {
- for (NicSecondaryIpVO ip: ipList) {
- _nicSecondaryIpDao.remove(ip.getId());
+ Transaction txn = Transaction.currentTxn();
+ txn.start();
+ List <NicSecondaryIpVO> ipList = _nicSecondaryIpDao.listByNicId(nicId);
+ if (ipList != null) {
+ for (NicSecondaryIpVO ip: ipList) {
+ _nicSecondaryIpDao.remove(ip.getId());
+ }
+ s_logger.debug("Revoving nic secondary ip entry ...");
}
- s_logger.debug("Revoving nic secondary ip entry ...");
- }
- txn.commit();
- return true;
- }
+ txn.commit();
+ return true;
+ }
- @Override
- public String allocatePublicIpForGuestNic(Long networkId, DataCenter dc, Pod pod,Account owner,
- String requestedIp) throws InsufficientAddressCapacityException {
- PublicIp ip = assignPublicIpAddress(dc.getId(), null, owner, VlanType.DirectAttached, networkId, requestedIp, false);
- if (ip == null) {
- s_logger.debug("There is no free public ip address");
- return null;
+ @Override
+ public String allocatePublicIpForGuestNic(Long networkId, DataCenter dc, Pod pod,Account owner,
+ String requestedIp) throws InsufficientAddressCapacityException {
+ PublicIp ip = assignPublicIpAddress(dc.getId(), null, owner, VlanType.DirectAttached, networkId, requestedIp, false);
+ if (ip == null) {
+ s_logger.debug("There is no free public ip address");
+ return null;
+ }
+ Ip ipAddr = ip.getAddress();
+ return ipAddr.addr();
}
- Ip ipAddr = ip.getAddress();
- return ipAddr.addr();
- }
-
+
- @Override
+ @Override
- public NicVO savePlaceholderNic(Network network, String ip4Address, Type vmType) {
+ public NicVO savePlaceholderNic(Network network, String ip4Address, String ip6Address, Type vmType) {
- NicVO nic = new NicVO(null, null, network.getId(), null);
- nic.setIp4Address(ip4Address);
+ NicVO nic = new NicVO(null, null, network.getId(), null);
+ nic.setIp4Address(ip4Address);
+ nic.setIp6Address(ip6Address);
- nic.setReservationStrategy(ReservationStrategy.PlaceHolder);
- nic.setState(Nic.State.Reserved);
- nic.setVmType(vmType);
- return _nicDao.persist(nic);
- }
+ nic.setReservationStrategy(ReservationStrategy.PlaceHolder);
+ nic.setState(Nic.State.Reserved);
+ nic.setVmType(vmType);
+ return _nicDao.persist(nic);
+ }
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/network/NetworkServiceImpl.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/firewall/FirewallManagerImpl.java
index d34e1a8,f7275b0..85f6b71
--- a/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
+++ b/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
@@@ -160,8 -159,9 +160,9 @@@ public class FirewallManagerImpl extend
rule.getIcmpType(), null, rule.getType(), rule.getNetworkId(), rule.getTrafficType());
}
+ @Override
public FirewallRule createIngressFirewallRule(FirewallRule rule) throws NetworkRuleConflictException {
- Account caller = UserContext.current().getCaller();
+ Account caller = CallContext.current().getCallingAccount();
Long sourceIpAddressId = rule.getSourceIpAddressId();
return createFirewallRule(sourceIpAddressId, caller, rule.getXid(), rule.getSourcePortStart(),
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/network/guru/DirectNetworkGuru.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
index df1687b,db4786a..742a3c1
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@@ -196,7 -168,7 +196,6 @@@ import com.cloud.resource.ResourceManag
import com.cloud.server.ConfigurationServer;
import com.cloud.service.ServiceOfferingVO;
import com.cloud.service.dao.ServiceOfferingDao;
--import com.cloud.storage.GuestOSVO;
import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.Volume.Type;
import com.cloud.storage.VolumeVO;
@@@ -1444,12 -1436,10 +1443,10 @@@ public class VirtualNetworkApplianceMan
guestNetwork.getState() == Network.State.Implementing : "Network is not yet fully implemented: "
+ guestNetwork;
assert guestNetwork.getTrafficType() == TrafficType.Guest;
-
+
// 1) Get deployment plan and find out the list of routers
- boolean isPodBased = (dest.getDataCenter().getNetworkType() == NetworkType.Basic ||
- _networkModel.areServicesSupportedInNetwork(guestNetwork.getId(), Service.SecurityGroup))
- && guestNetwork.getTrafficType() == TrafficType.Guest;
+ boolean isPodBased = (dest.getDataCenter().getNetworkType() == NetworkType.Basic);
-
+
// dest has pod=null, for Basic Zone findOrDeployVRs for all Pods
List<DeployDestination> destinations = new ArrayList<DeployDestination>();
@@@ -1749,33 -1740,37 +1746,37 @@@
s_logger.debug("Adding nic for Virtual Router in Guest network " + guestNetwork);
String defaultNetworkStartIp = null, defaultNetworkStartIpv6 = null;
if (!setupPublicNetwork) {
- if (guestNetwork.getCidr() != null) {
- Nic placeholder = _networkModel.getPlaceholderNicForRouter(guestNetwork, plan.getPodId());
+ Nic placeholder = _networkModel.getPlaceholderNicForRouter(guestNetwork, plan.getPodId());
- if (placeholder != null) {
- s_logger.debug("Requesting ip address " + placeholder.getIp4Address() + " stored in placeholder nic for the network " + guestNetwork);
+ if (guestNetwork.getCidr() != null) {
+ if (placeholder != null && placeholder.getIp4Address() != null) {
+ s_logger.debug("Requesting ipv4 address " + placeholder.getIp4Address() + " stored in placeholder nic for the network " + guestNetwork);
- defaultNetworkStartIp = placeholder.getIp4Address();
- } else {
- String startIp = _networkModel.getStartIpAddress(guestNetwork.getId());
- if (startIp != null && _ipAddressDao.findByIpAndSourceNetworkId(guestNetwork.getId(), startIp).getAllocatedTime() == null) {
- defaultNetworkStartIp = startIp;
+ defaultNetworkStartIp = placeholder.getIp4Address();
+ } else {
+ String startIp = _networkModel.getStartIpAddress(guestNetwork.getId());
+ if (startIp != null && _ipAddressDao.findByIpAndSourceNetworkId(guestNetwork.getId(), startIp).getAllocatedTime() == null) {
+ defaultNetworkStartIp = startIp;
- } else if (s_logger.isDebugEnabled()) {
- s_logger.debug("First ip " + startIp + " in network id=" + guestNetwork.getId() +
+ } else if (s_logger.isDebugEnabled()){
+ s_logger.debug("First ipv4 " + startIp + " in network id=" + guestNetwork.getId() +
- " is already allocated, can't use it for domain router; will get random ip address from the range");
- }
- }
- }
+ " is already allocated, can't use it for domain router; will get random ip address from the range");
+ }
+ }
+ }
- //FIXME - get ipv6 stored in the placeholder
- if (guestNetwork.getIp6Cidr() != null) {
+ if (guestNetwork.getIp6Cidr() != null) {
+ if (placeholder != null && placeholder.getIp6Address() != null) {
+ s_logger.debug("Requesting ipv6 address " + placeholder.getIp6Address() + " stored in placeholder nic for the network " + guestNetwork);
+ defaultNetworkStartIpv6 = placeholder.getIp6Address();
+ } else {
- String startIpv6 = _networkModel.getStartIpv6Address(guestNetwork.getId());
- if (startIpv6 != null && _ipv6Dao.findByNetworkIdAndIp(guestNetwork.getId(), startIpv6) == null) {
- defaultNetworkStartIpv6 = startIpv6;
- } else if (s_logger.isDebugEnabled()){
- s_logger.debug("First ipv6 " + startIpv6 + " in network id=" + guestNetwork.getId() +
- " is already allocated, can't use it for domain router; will get random ipv6 address from the range");
- }
- }
- }
+ String startIpv6 = _networkModel.getStartIpv6Address(guestNetwork.getId());
+ if (startIpv6 != null && _ipv6Dao.findByNetworkIdAndIp(guestNetwork.getId(), startIpv6) == null) {
+ defaultNetworkStartIpv6 = startIpv6;
+ } else if (s_logger.isDebugEnabled()) {
+ s_logger.debug("First ipv6 " + startIpv6 + " in network id=" + guestNetwork.getId() +
+ " is already allocated, can't use it for domain router; will get random ipv6 address from the range");
+ }
+ }
+ }
+ }
NicProfile gatewayNic = new NicProfile(defaultNetworkStartIp, defaultNetworkStartIpv6);
if (setupPublicNetwork) {
@@@ -2487,7 -2488,10 +2488,10 @@@
for (NicIpAliasVO aliasVO : aliasVOs) {
activeIpAliasTOs.add(new IpAliasTO(aliasVO.getIp4Address(), aliasVO.getNetmask(), aliasVO.getAliasCount().toString()));
}
+ if (revokedIpAliasTOs.size() != 0 || activeIpAliasTOs.size() != 0){
- createDeleteIpAliasCommand(router, revokedIpAliasTOs, activeIpAliasTOs, guestNetworkId, cmds);
+ createDeleteIpAliasCommand(router, revokedIpAliasTOs, activeIpAliasTOs, guestNetworkId, cmds);
+ configDnsMasq(router, _networkDao.findById(guestNetworkId), cmds);
+ }
}
}
@@@ -2789,7 -2800,13 +2793,13 @@@
for (VlanVO vlan : vlanList) {
vlanDbIdList.add(vlan.getId());
}
+ if (dc.getNetworkType() == NetworkType.Basic) {
- routerPublicIP = _networkMgr.assignPublicIpAddressFromVlans(router.getDataCenterId(), vm.getPodIdToDeployIn(), caller, Vlan.VlanType.DirectAttached, vlanDbIdList, nic.getNetworkId(), null, false);
+ routerPublicIP = _networkMgr.assignPublicIpAddressFromVlans(router.getDataCenterId(), vm.getPodIdToDeployIn(), caller, Vlan.VlanType.DirectAttached, vlanDbIdList, nic.getNetworkId(), null, false);
+ }
+ else {
+ routerPublicIP = _networkMgr.assignPublicIpAddressFromVlans(router.getDataCenterId(), null, caller, Vlan.VlanType.DirectAttached, vlanDbIdList, nic.getNetworkId(), null, false);
+ }
+
routerAliasIp = routerPublicIP.getAddress().addr();
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
index 1d1ae4d,7115499..c4742f7
--- a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
@@@ -874,9 -949,9 +874,9 @@@ public class VpcVirtualNetworkAppliance
if (router.getVpcId() != null) {
if (_networkModel.isProviderSupportServiceInNetwork(guestNetworkId, Service.NetworkACL, Provider.VPCVirtualRouter)) {
List<NetworkACLItemVO> networkACLs = _networkACLMgr.listNetworkACLItems(guestNetworkId);
+ if ((networkACLs != null) && !networkACLs.isEmpty()) {
- s_logger.debug("Found " + networkACLs.size() + " network ACLs to apply as a part of VPC VR " + router
- + " start for guest network id=" + guestNetworkId);
+ s_logger.debug("Found " + networkACLs.size() + " network ACLs to apply as a part of VPC VR " + router
+ + " start for guest network id=" + guestNetworkId);
- if (!networkACLs.isEmpty()) {
createNetworkACLsCommands(networkACLs, router, cmds, guestNetworkId, false);
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/network/rules/RulesManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/rules/RulesManagerImpl.java
index d3280ad,41bf2b3..05df39f
--- a/server/src/com/cloud/network/rules/RulesManagerImpl.java
+++ b/server/src/com/cloud/network/rules/RulesManagerImpl.java
@@@ -24,11 -24,8 +24,10 @@@ import java.util.Set
import javax.ejb.Local;
import javax.inject.Inject;
- import javax.naming.ConfigurationException;
import org.apache.cloudstack.api.command.user.firewall.ListPortForwardingRulesCmd;
+import org.apache.cloudstack.context.CallContext;
+
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/network/vpc/NetworkACLManagerImpl.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/network/vpc/NetworkACLServiceImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/vpc/NetworkACLServiceImpl.java
index a89b414,4ad22d9..5489366
--- a/server/src/com/cloud/network/vpc/NetworkACLServiceImpl.java
+++ b/server/src/com/cloud/network/vpc/NetworkACLServiceImpl.java
@@@ -304,29 -303,31 +304,31 @@@ public class NetworkACLServiceImpl exte
}
//Validate Protocol
+ if(protocol != null){
- //Check if protocol is a number
- if(StringUtils.isNumeric(protocol)){
- int protoNumber = Integer.parseInt(protocol);
- if(protoNumber < 0 || protoNumber > 255){
- throw new InvalidParameterValueException("Invalid protocol number: " + protoNumber);
- }
- } else {
- //Protocol is not number
- //Check for valid protocol strings
- String supportedProtocols = "tcp,udp,icmp,all";
- if(!supportedProtocols.contains(protocol.toLowerCase())){
- throw new InvalidParameterValueException("Invalid protocol: " + protocol);
- }
+ //Check if protocol is a number
+ if(StringUtils.isNumeric(protocol)){
+ int protoNumber = Integer.parseInt(protocol);
+ if(protoNumber < 0 || protoNumber > 255){
+ throw new InvalidParameterValueException("Invalid protocol number: " + protoNumber);
}
-
- // icmp code and icmp type can't be passed in for any other protocol rather than icmp
- if (!protocol.equalsIgnoreCase(NetUtils.ICMP_PROTO) && (icmpCode != null || icmpType != null)) {
- throw new InvalidParameterValueException("Can specify icmpCode and icmpType for ICMP protocol only");
+ } else {
+ //Protocol is not number
+ //Check for valid protocol strings
+ String supportedProtocols = "tcp,udp,icmp,all";
+ if(!supportedProtocols.contains(protocol.toLowerCase())){
+ throw new InvalidParameterValueException("Invalid protocol: " + protocol);
}
+ }
- if (protocol.equalsIgnoreCase(NetUtils.ICMP_PROTO) && (portStart != null || portEnd != null)) {
- throw new InvalidParameterValueException("Can't specify start/end port when protocol is ICMP");
- }
+ // icmp code and icmp type can't be passed in for any other protocol rather than icmp
+ if (!protocol.equalsIgnoreCase(NetUtils.ICMP_PROTO) && (icmpCode != null || icmpType != null)) {
+ throw new InvalidParameterValueException("Can specify icmpCode and icmpType for ICMP protocol only");
+ }
+
+ if (protocol.equalsIgnoreCase(NetUtils.ICMP_PROTO) && (portStart != null || portEnd != null)) {
+ throw new InvalidParameterValueException("Can't specify start/end port when protocol is ICMP");
+ }
+ }
//validate icmp code and type
if (icmpType != null) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/network/vpc/VpcManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/vpc/VpcManagerImpl.java
index 869054d,b41003a..7a2520b
--- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
@@@ -16,29 -16,6 +16,29 @@@
// under the License.
package com.cloud.network.vpc;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+
++import org.apache.log4j.Logger;
++import org.springframework.stereotype.Component;
++
+import org.apache.cloudstack.acl.ControlledEntity.ACLType;
+import org.apache.cloudstack.api.command.user.vpc.ListPrivateGatewaysCmd;
+import org.apache.cloudstack.api.command.user.vpc.ListStaticRoutesCmd;
+import org.apache.cloudstack.context.CallContext;
+
- import org.apache.log4j.Logger;
- import org.springframework.stereotype.Component;
-
import com.cloud.configuration.Config;
import com.cloud.configuration.ConfigurationManager;
import com.cloud.configuration.Resource.ResourceType;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/resource/ResourceManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/resource/ResourceManagerImpl.java
index afc2609,c6e8d7d..4da572e
--- a/server/src/com/cloud/resource/ResourceManagerImpl.java
+++ b/server/src/com/cloud/resource/ResourceManagerImpl.java
@@@ -79,8 -77,8 +79,10 @@@ import com.cloud.configuration.dao.Conf
import com.cloud.dc.ClusterDetailsDao;
import com.cloud.dc.ClusterDetailsVO;
import com.cloud.dc.ClusterVO;
++import com.cloud.dc.DataCenter.NetworkType;
import com.cloud.dc.DataCenterIpAddressVO;
import com.cloud.dc.DataCenterVO;
++import com.cloud.dc.DedicatedResourceVO;
import com.cloud.dc.HostPodVO;
import com.cloud.dc.PodCluster;
import com.cloud.dc.dao.ClusterDao;
@@@ -163,7 -163,7 +166,6 @@@ import com.cloud.vm.VMInstanceVO
import com.cloud.vm.VirtualMachine.State;
import com.cloud.vm.VirtualMachineManager;
import com.cloud.vm.dao.VMInstanceDao;
--import com.cloud.dc.DataCenter.NetworkType;
@Component
@Local({ ResourceManager.class, ResourceService.class })
@@@ -220,9 -220,9 +222,11 @@@ public class ResourceManagerImpl extend
@Inject
protected StorageService _storageSvr;
@Inject
+ protected AttacheHandler _attacheHandler; // FIXME: Get rid of me!
+ @Inject
PlannerHostReservationDao _plannerHostReserveDao;
+ @Inject
+ protected DedicatedResourceDao _dedicatedDao;
protected List<? extends Discoverer> _discoverers;
public List<? extends Discoverer> getDiscoverers() {
@@@ -1104,11 -1109,16 +1113,16 @@@
&& Boolean.parseBoolean(_configDao
.getValue(Config.VmwareUseNexusVSwitch
.toString()))) {
- _clusterVSMMapDao.removeByClusterId(cmd.getId());
- }
+ _clusterVSMMapDao.removeByClusterId(cmd.getId());
+ }
+ // remove from dedicated resources
+ DedicatedResourceVO dr = _dedicatedDao.findByClusterId(cluster.getId());
+ if (dr != null) {
+ _dedicatedDao.remove(dr.getId());
+ }
- }
+ }
- txn.commit();
+ txn.commit();
return true;
} catch (CloudRuntimeException e) {
throw e;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/server/ManagementServerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/server/ManagementServerImpl.java
index ffa2779,96c72e4..a365f7a
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@@ -43,19 -44,18 +44,11 @@@ import javax.crypto.spec.SecretKeySpec
import javax.inject.Inject;
import javax.naming.ConfigurationException;
-import com.cloud.exception.*;
-import com.cloud.vm.*;
-import org.apache.cloudstack.acl.ControlledEntity;
-import org.apache.cloudstack.acl.SecurityChecker.AccessType;
-import org.apache.cloudstack.api.ApiConstants;
-
-import com.cloud.event.ActionEventUtils;
-import org.apache.cloudstack.api.BaseUpdateTemplateOrIsoCmd;
-import org.apache.cloudstack.api.command.admin.region.*;
-import org.apache.cloudstack.api.response.ExtractResponse;
import org.apache.commons.codec.binary.Base64;
import org.apache.log4j.Logger;
+
+import org.apache.cloudstack.acl.ControlledEntity;
+import org.apache.cloudstack.acl.SecurityChecker.AccessType;
- import org.apache.cloudstack.api.ApiConstants;
-
- import com.cloud.event.ActionEventUtils;
- import org.apache.cloudstack.api.BaseUpdateTemplateOrIsoCmd;
- import org.apache.cloudstack.api.command.admin.region.*;
- import org.apache.cloudstack.api.response.ExtractResponse;
- import org.apache.commons.codec.binary.Base64;
- import org.apache.log4j.Logger;
import org.apache.cloudstack.affinity.AffinityGroupProcessor;
import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
import org.apache.cloudstack.api.ApiConstants;
@@@ -134,6 -133,6 +127,12 @@@ import org.apache.cloudstack.api.comman
import org.apache.cloudstack.api.command.admin.pod.DeletePodCmd;
import org.apache.cloudstack.api.command.admin.pod.ListPodsByCmd;
import org.apache.cloudstack.api.command.admin.pod.UpdatePodCmd;
++import org.apache.cloudstack.api.command.admin.region.AddRegionCmd;
++import org.apache.cloudstack.api.command.admin.region.CreatePortableIpRangeCmd;
++import org.apache.cloudstack.api.command.admin.region.DeletePortableIpRangeCmd;
++import org.apache.cloudstack.api.command.admin.region.ListPortableIpRangesCmd;
++import org.apache.cloudstack.api.command.admin.region.RemoveRegionCmd;
++import org.apache.cloudstack.api.command.admin.region.UpdateRegionCmd;
import org.apache.cloudstack.api.command.admin.resource.ArchiveAlertsCmd;
import org.apache.cloudstack.api.command.admin.resource.DeleteAlertsCmd;
import org.apache.cloudstack.api.command.admin.resource.ListAlertsCmd;
@@@ -421,13 -403,12 +420,14 @@@ import org.apache.cloudstack.api.comman
import org.apache.cloudstack.api.command.user.vpn.UpdateVpnCustomerGatewayCmd;
import org.apache.cloudstack.api.command.user.zone.ListZonesByCmd;
import org.apache.cloudstack.api.response.ExtractResponse;
++import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
+import org.apache.cloudstack.framework.jobs.AsyncJob;
+import org.apache.cloudstack.framework.jobs.AsyncJobConstants;
+import org.apache.cloudstack.framework.jobs.AsyncJobManager;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
-import org.apache.commons.codec.binary.Base64;
-import org.apache.log4j.Logger;
import com.cloud.agent.AgentManager;
import com.cloud.agent.api.GetVncPortAnswer;
@@@ -602,79 -569,78 +602,6 @@@ import com.cloud.vm.dao.VMInstanceDao
import edu.emory.mathcs.backport.java.util.Arrays;
import edu.emory.mathcs.backport.java.util.Collections;
--import org.apache.cloudstack.acl.ControlledEntity;
--import org.apache.cloudstack.api.command.admin.autoscale.CreateCounterCmd;
--import org.apache.cloudstack.api.command.admin.autoscale.DeleteCounterCmd;
--import org.apache.cloudstack.api.command.admin.cluster.AddClusterCmd;
--import org.apache.cloudstack.api.command.admin.cluster.DeleteClusterCmd;
--import org.apache.cloudstack.api.command.admin.cluster.ListClustersCmd;
--import org.apache.cloudstack.api.command.admin.cluster.UpdateClusterCmd;
--import org.apache.cloudstack.api.command.admin.config.ListCfgsByCmd;
--import org.apache.cloudstack.api.command.admin.config.ListHypervisorCapabilitiesCmd;
--import org.apache.cloudstack.api.command.admin.config.UpdateCfgCmd;
--import org.apache.cloudstack.api.command.admin.config.UpdateHypervisorCapabilitiesCmd;
--import org.apache.cloudstack.api.command.admin.ldap.LDAPConfigCmd;
--import org.apache.cloudstack.api.command.admin.ldap.LDAPRemoveCmd;
--import org.apache.cloudstack.api.command.admin.pod.CreatePodCmd;
--import org.apache.cloudstack.api.command.admin.pod.DeletePodCmd;
--import org.apache.cloudstack.api.command.admin.pod.ListPodsByCmd;
--import org.apache.cloudstack.api.command.admin.pod.UpdatePodCmd;
--import org.apache.cloudstack.api.command.admin.swift.AddSwiftCmd;
--import org.apache.cloudstack.api.command.admin.swift.ListSwiftsCmd;
--import org.apache.cloudstack.api.command.admin.template.PrepareTemplateCmd;
--import org.apache.cloudstack.api.command.admin.vlan.CreateVlanIpRangeCmd;
--import org.apache.cloudstack.api.command.admin.vlan.DeleteVlanIpRangeCmd;
--import org.apache.cloudstack.api.command.admin.vlan.ListVlanIpRangesCmd;
--import org.apache.cloudstack.api.command.admin.vm.AssignVMCmd;
--import org.apache.cloudstack.api.command.admin.vm.MigrateVMCmd;
--import org.apache.cloudstack.api.command.admin.vm.MigrateVirtualMachineWithVolumeCmd;
--import org.apache.cloudstack.api.command.admin.vm.RecoverVMCmd;
--import org.apache.cloudstack.api.command.admin.zone.CreateZoneCmd;
--import org.apache.cloudstack.api.command.admin.zone.DeleteZoneCmd;
--import org.apache.cloudstack.api.command.admin.zone.MarkDefaultZoneForAccountCmd;
--import org.apache.cloudstack.api.command.admin.zone.UpdateZoneCmd;
--import org.apache.cloudstack.api.command.user.account.AddAccountToProjectCmd;
--import org.apache.cloudstack.api.command.user.account.DeleteAccountFromProjectCmd;
--import org.apache.cloudstack.api.command.user.account.ListAccountsCmd;
--import org.apache.cloudstack.api.command.user.account.ListProjectAccountsCmd;
--import org.apache.cloudstack.api.command.user.address.AssociateIPAddrCmd;
--import org.apache.cloudstack.api.command.user.address.DisassociateIPAddrCmd;
--import org.apache.cloudstack.api.command.user.address.ListPublicIpAddressesCmd;
--import org.apache.cloudstack.api.command.user.config.ListCapabilitiesCmd;
--import org.apache.cloudstack.api.command.user.event.ArchiveEventsCmd;
--import org.apache.cloudstack.api.command.user.event.DeleteEventsCmd;
--import org.apache.cloudstack.api.command.user.event.ListEventTypesCmd;
--import org.apache.cloudstack.api.command.user.event.ListEventsCmd;
--import org.apache.cloudstack.api.command.user.guest.ListGuestOsCategoriesCmd;
--import org.apache.cloudstack.api.command.user.guest.ListGuestOsCmd;
--import org.apache.cloudstack.api.command.user.job.ListAsyncJobsCmd;
--import org.apache.cloudstack.api.command.user.job.QueryAsyncJobResultCmd;
--import org.apache.cloudstack.api.command.user.offering.ListDiskOfferingsCmd;
--import org.apache.cloudstack.api.command.user.offering.ListServiceOfferingsCmd;
--import org.apache.cloudstack.api.command.user.region.ListRegionsCmd;
--import org.apache.cloudstack.api.command.user.region.ha.gslb.*;
--import org.apache.cloudstack.api.command.user.ssh.CreateSSHKeyPairCmd;
--import org.apache.cloudstack.api.command.user.ssh.DeleteSSHKeyPairCmd;
--import org.apache.cloudstack.api.command.user.ssh.ListSSHKeyPairsCmd;
--import org.apache.cloudstack.api.command.user.ssh.RegisterSSHKeyPairCmd;
--import org.apache.cloudstack.api.command.user.tag.CreateTagsCmd;
--import org.apache.cloudstack.api.command.user.tag.DeleteTagsCmd;
--import org.apache.cloudstack.api.command.user.tag.ListTagsCmd;
--import org.apache.cloudstack.api.command.user.vmgroup.CreateVMGroupCmd;
--import org.apache.cloudstack.api.command.user.vmgroup.DeleteVMGroupCmd;
--import org.apache.cloudstack.api.command.user.vmgroup.ListVMGroupsCmd;
--import org.apache.cloudstack.api.command.user.vmgroup.UpdateVMGroupCmd;
--import org.apache.cloudstack.api.command.user.vmsnapshot.CreateVMSnapshotCmd;
--import org.apache.cloudstack.api.command.user.vmsnapshot.DeleteVMSnapshotCmd;
--import org.apache.cloudstack.api.command.user.vmsnapshot.ListVMSnapshotCmd;
--import org.apache.cloudstack.api.command.user.zone.ListZonesByCmd;
--import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
--import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
--import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
--import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
--import org.apache.cloudstack.api.command.admin.config.ListDeploymentPlannersCmd;
- import org.apache.cloudstack.context.CallContext;
--
public class ManagementServerImpl extends ManagerBase implements ManagementServer {
public static final Logger s_logger = Logger.getLogger(ManagementServerImpl.class.getName());
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/storage/StorageManagerImpl.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/storage/VolumeManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/storage/VolumeManagerImpl.java
index 3284eb3,43f3681..b75f461
--- a/server/src/com/cloud/storage/VolumeManagerImpl.java
+++ b/server/src/com/cloud/storage/VolumeManagerImpl.java
@@@ -147,8 -128,11 +147,10 @@@ import com.cloud.template.TemplateManag
import com.cloud.user.Account;
import com.cloud.user.AccountManager;
import com.cloud.user.ResourceLimitService;
+ import com.cloud.user.VmDiskStatisticsVO;
-import com.cloud.user.UserContext;
import com.cloud.user.dao.AccountDao;
import com.cloud.user.dao.UserDao;
+ import com.cloud.user.dao.VmDiskStatisticsDao;
import com.cloud.uservm.UserVm;
import com.cloud.utils.EnumUtils;
import com.cloud.utils.NumbersUtil;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/user/AccountManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/user/AccountManagerImpl.java
index 2033a78,6b4bf0e..b623dd2
--- a/server/src/com/cloud/user/AccountManagerImpl.java
+++ b/server/src/com/cloud/user/AccountManagerImpl.java
@@@ -49,10 -46,11 +49,10 @@@ import org.apache.cloudstack.api.comman
import org.apache.cloudstack.api.command.admin.user.DeleteUserCmd;
import org.apache.cloudstack.api.command.admin.user.RegisterCmd;
import org.apache.cloudstack.api.command.admin.user.UpdateUserCmd;
+import org.apache.cloudstack.context.CallContext;
+ import org.apache.cloudstack.region.gslb.GlobalLoadBalancerRuleDao;
-import org.apache.commons.codec.binary.Base64;
-import org.apache.log4j.Logger;
import com.cloud.api.ApiDBUtils;
- import com.cloud.api.query.dao.UserAccountJoinDao;
import com.cloud.api.query.vo.ControlledViewEntity;
import com.cloud.configuration.Config;
import com.cloud.configuration.ConfigurationManager;
@@@ -102,8 -104,8 +104,7 @@@ import com.cloud.projects.ProjectManage
import com.cloud.projects.ProjectVO;
import com.cloud.projects.dao.ProjectAccountDao;
import com.cloud.projects.dao.ProjectDao;
-import com.cloud.region.ha.GlobalLoadBalancingRulesService;
import com.cloud.server.auth.UserAuthenticator;
- import com.cloud.storage.StorageManager;
import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.Volume;
import com.cloud.storage.VolumeManager;
@@@ -1587,22 -1623,14 +1616,14 @@@ public class AccountManagerImpl extend
}
@Override
- public Account getActiveAccountById(Long accountId) {
- if (accountId == null) {
- throw new InvalidParameterValueException("AccountId is required by account search");
- } else {
+ public Account getActiveAccountById(long accountId) {
- return _accountDao.findById(accountId);
- }
+ return _accountDao.findById(accountId);
+ }
- }
@Override
- public Account getAccount(Long accountId) {
- if (accountId == null) {
- throw new InvalidParameterValueException("AccountId is required by account search");
- } else {
+ public Account getAccount(long accountId) {
- return _accountDao.findByIdIncludingRemoved(accountId);
- }
+ return _accountDao.findByIdIncludingRemoved(accountId);
+ }
- }
@Override
public RoleType getRoleType(Account account) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/user/DomainManagerImpl.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/vm/UserVmManager.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/vm/UserVmManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/vm/UserVmManagerImpl.java
index 7798dd8,b919f12..6b840a9
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@@ -58,20 -56,28 +58,23 @@@ import org.apache.cloudstack.api.comman
import org.apache.cloudstack.api.command.user.vm.UpgradeVMCmd;
import org.apache.cloudstack.api.command.user.vmgroup.CreateVMGroupCmd;
import org.apache.cloudstack.api.command.user.vmgroup.DeleteVMGroupCmd;
+import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.engine.cloud.entity.api.VirtualMachineEntity;
import org.apache.cloudstack.engine.service.api.OrchestrationService;
+import org.apache.cloudstack.framework.jobs.AsyncJobManager;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
-import org.apache.commons.codec.binary.Base64;
-import org.apache.log4j.Logger;
import com.cloud.agent.AgentManager;
-import com.cloud.agent.AgentManager.OnError;
import com.cloud.agent.api.Answer;
+ import com.cloud.agent.api.GetVmDiskStatsAnswer;
+ import com.cloud.agent.api.GetVmDiskStatsCommand;
import com.cloud.agent.api.GetVmStatsAnswer;
import com.cloud.agent.api.GetVmStatsCommand;
import com.cloud.agent.api.PvlanSetupCommand;
import com.cloud.agent.api.StartAnswer;
import com.cloud.agent.api.StopAnswer;
-import com.cloud.agent.api.UnPlugNicAnswer;
-import com.cloud.agent.api.UnPlugNicCommand;
+ import com.cloud.agent.api.VmDiskStatsEntry;
import com.cloud.agent.api.VmStatsEntry;
import com.cloud.agent.api.to.NicTO;
import com.cloud.agent.api.to.VirtualMachineTO;
@@@ -206,7 -214,9 +211,8 @@@ import com.cloud.user.ResourceLimitServ
import com.cloud.user.SSHKeyPair;
import com.cloud.user.SSHKeyPairVO;
import com.cloud.user.User;
-import com.cloud.user.UserContext;
import com.cloud.user.UserVO;
+ import com.cloud.user.VmDiskStatisticsVO;
import com.cloud.user.dao.AccountDao;
import com.cloud.user.dao.SSHKeyPairDao;
import com.cloud.user.dao.UserDao;
@@@ -732,12 -754,12 +749,13 @@@ public class UserVmManagerImpl extends
return null;
}
- try {
+ if (vm.getState() == State.Running && vm.getHostId() != null) {
+ collectVmDiskStatistics(vm);
- return _itMgr.reboot(vm, null, caller, owner);
+ _itMgr.reboot(vm.getUuid(), caller, owner);
+ return _vmDao.findById(vmId);
- } catch (CloudRuntimeException e) {
- // FIXME: Not even sure if this should be here but got to conform to how it worked before.
- s_logger.warn("Unable to reboot virtual machine " + vm);
+ } else {
+ s_logger.error("Vm id=" + vmId
+ + " is not in Running state, failed to reboot");
return null;
}
}
@@@ -1089,13 -1112,48 +1108,48 @@@
}
}
-
+
@Override
+ public HashMap<Long, List<VmDiskStatsEntry>> getVmDiskStatistics(long hostId, String hostName, List<Long> vmIds) throws CloudRuntimeException {
+ HashMap<Long, List<VmDiskStatsEntry>> vmDiskStatsById = new HashMap<Long, List<VmDiskStatsEntry>>();
+
+ if (vmIds.isEmpty()) {
+ return vmDiskStatsById;
+ }
+
+ List<String> vmNames = new ArrayList<String>();
+
+ for (Long vmId : vmIds) {
+ UserVmVO vm = _vmDao.findById(vmId);
+ vmNames.add(vm.getInstanceName());
+ }
+
+ Answer answer = _agentMgr.easySend(hostId, new GetVmDiskStatsCommand(vmNames, _hostDao.findById(hostId).getGuid(), hostName));
+ if (answer == null || !answer.getResult()) {
+ s_logger.warn("Unable to obtain VM disk statistics.");
+ return null;
+ } else {
+ HashMap<String, List<VmDiskStatsEntry>> vmDiskStatsByName = ((GetVmDiskStatsAnswer)answer).getVmDiskStatsMap();
+
+ if (vmDiskStatsByName == null) {
+ s_logger.warn("Unable to obtain VM disk statistics.");
+ return null;
+ }
+
+ for (String vmName : vmDiskStatsByName.keySet()) {
+ vmDiskStatsById.put(vmIds.get(vmNames.indexOf(vmName)), vmDiskStatsByName.get(vmName));
+ }
+ }
+
+ return vmDiskStatsById;
+ }
+
+ @Override
public boolean upgradeVirtualMachine(Long vmId, Long newServiceOfferingId) throws ResourceUnavailableException, ConcurrentOperationException, ManagementServerException, VirtualMachineMigrationException{
- Account caller = UserContext.current().getCaller();
+ Account caller = CallContext.current().getCallingAccount();
// Verify input parameters
- VMInstanceVO vmInstance = _vmInstanceDao.findById(vmId);
+ VirtualMachine vmInstance = _vmInstanceDao.findById(vmId);
if(vmInstance.getHypervisorType() != HypervisorType.XenServer && vmInstance.getHypervisorType() != HypervisorType.VMware){
throw new InvalidParameterValueException("This operation not permitted for this hypervisor of the vm");
}
@@@ -3314,6 -3416,122 +3404,122 @@@
ex.addProxyObject(vm.getUuid(), "vmId");
throw ex;
}
+
+ }
+
+ @Override
+ public void collectVmDiskStatistics (UserVmVO userVm) {
+ // Collect vm disk statistics from host before stopping Vm
+ long hostId = userVm.getHostId();
+ List<String> vmNames = new ArrayList<String>();
+ vmNames.add(userVm.getInstanceName());
+ HostVO host = _hostDao.findById(hostId);
+
+ GetVmDiskStatsAnswer diskStatsAnswer = null;
+ try {
+ diskStatsAnswer = (GetVmDiskStatsAnswer) _agentMgr.easySend(hostId, new GetVmDiskStatsCommand(vmNames, host.getGuid(), host.getName()));
+ } catch (Exception e) {
+ s_logger.warn("Error while collecting disk stats for vm: " + userVm.getHostName() + " from host: " + host.getName(), e);
+ return;
+ }
+ if (diskStatsAnswer != null) {
+ if (!diskStatsAnswer.getResult()) {
+ s_logger.warn("Error while collecting disk stats vm: " + userVm.getHostName() + " from host: " + host.getName() + "; details: " + diskStatsAnswer.getDetails());
+ return;
+ }
+ Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+ try {
+ txn.start();
+ HashMap<String, List<VmDiskStatsEntry>> vmDiskStatsByName = diskStatsAnswer.getVmDiskStatsMap();
+ List<VmDiskStatsEntry> vmDiskStats = vmDiskStatsByName.get(userVm.getInstanceName());
+
+ if (vmDiskStats == null)
+ return;
+
+ for (VmDiskStatsEntry vmDiskStat:vmDiskStats) {
+ SearchCriteria<VolumeVO> sc_volume = _volsDao.createSearchCriteria();
+ sc_volume.addAnd("path", SearchCriteria.Op.EQ, vmDiskStat.getPath());
+ VolumeVO volume = _volsDao.search(sc_volume, null).get(0);
+ VmDiskStatisticsVO previousVmDiskStats = _vmDiskStatsDao.findBy(userVm.getAccountId(), userVm.getDataCenterId(), userVm.getId(), volume.getId());
+ VmDiskStatisticsVO vmDiskStat_lock = _vmDiskStatsDao.lock(userVm.getAccountId(), userVm.getDataCenterId(), userVm.getId(), volume.getId());
+
+ if ((vmDiskStat.getIORead() == 0) && (vmDiskStat.getIOWrite() == 0) && (vmDiskStat.getBytesRead() == 0) && (vmDiskStat.getBytesWrite() == 0)) {
+ s_logger.debug("Read/Write of IO and Bytes are both 0. Not updating vm_disk_statistics");
+ continue;
+ }
+
+ if (vmDiskStat_lock == null) {
+ s_logger.warn("unable to find vm disk stats from host for account: " + userVm.getAccountId() + " with vmId: " + userVm.getId()+ " and volumeId:" + volume.getId());
+ continue;
+ }
+
+ if (previousVmDiskStats != null
+ && ((previousVmDiskStats.getCurrentIORead() != vmDiskStat_lock.getCurrentIORead())
+ || ((previousVmDiskStats.getCurrentIOWrite() != vmDiskStat_lock.getCurrentIOWrite())
+ || (previousVmDiskStats.getCurrentBytesRead() != vmDiskStat_lock.getCurrentBytesRead())
+ || (previousVmDiskStats.getCurrentBytesWrite() != vmDiskStat_lock.getCurrentBytesWrite())))) {
+ s_logger.debug("vm disk stats changed from the time GetVmDiskStatsCommand was sent. " +
- "Ignoring current answer. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
++ "Ignoring current answer. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
+ " IO Read: " + vmDiskStat.getIORead() + " IO Write: " + vmDiskStat.getIOWrite() +
+ " Bytes Read: " + vmDiskStat.getBytesRead() + " Bytes Write: " + vmDiskStat.getBytesWrite());
+ continue;
+ }
+
+ if (vmDiskStat_lock.getCurrentIORead() > vmDiskStat.getIORead()) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Read # of IO that's less than the last one. " +
+ "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
+ " Reported: " + vmDiskStat.getIORead() + " Stored: " + vmDiskStat_lock.getCurrentIORead());
+ }
+ vmDiskStat_lock.setNetIORead(vmDiskStat_lock.getNetIORead() + vmDiskStat_lock.getCurrentIORead());
+ }
+ vmDiskStat_lock.setCurrentIORead(vmDiskStat.getIORead());
+ if (vmDiskStat_lock.getCurrentIOWrite() > vmDiskStat.getIOWrite()) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Write # of IO that's less than the last one. " +
+ "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
+ " Reported: " + vmDiskStat.getIOWrite() + " Stored: " + vmDiskStat_lock.getCurrentIOWrite());
+ }
+ vmDiskStat_lock.setNetIOWrite(vmDiskStat_lock.getNetIOWrite() + vmDiskStat_lock.getCurrentIOWrite());
+ }
+ vmDiskStat_lock.setCurrentIOWrite(vmDiskStat.getIOWrite());
+ if (vmDiskStat_lock.getCurrentBytesRead() > vmDiskStat.getBytesRead()) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Read # of Bytes that's less than the last one. " +
+ "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
+ " Reported: " + vmDiskStat.getBytesRead() + " Stored: " + vmDiskStat_lock.getCurrentBytesRead());
+ }
+ vmDiskStat_lock.setNetBytesRead(vmDiskStat_lock.getNetBytesRead() + vmDiskStat_lock.getCurrentBytesRead());
+ }
+ vmDiskStat_lock.setCurrentBytesRead(vmDiskStat.getBytesRead());
+ if (vmDiskStat_lock.getCurrentBytesWrite() > vmDiskStat.getBytesWrite()) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Write # of Bytes that's less than the last one. " +
+ "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
+ " Reported: " + vmDiskStat.getBytesWrite() + " Stored: " + vmDiskStat_lock.getCurrentBytesWrite());
+ }
+ vmDiskStat_lock.setNetBytesWrite(vmDiskStat_lock.getNetBytesWrite() + vmDiskStat_lock.getCurrentBytesWrite());
+ }
+ vmDiskStat_lock.setCurrentBytesWrite(vmDiskStat.getBytesWrite());
+
+ if (! _dailyOrHourly) {
- //update agg bytes
++ //update agg bytes
+ vmDiskStat_lock.setAggIORead(vmDiskStat_lock.getNetIORead() + vmDiskStat_lock.getCurrentIORead());
+ vmDiskStat_lock.setAggIOWrite(vmDiskStat_lock.getNetIOWrite() + vmDiskStat_lock.getCurrentIOWrite());
+ vmDiskStat_lock.setAggBytesRead(vmDiskStat_lock.getNetBytesRead() + vmDiskStat_lock.getCurrentBytesRead());
+ vmDiskStat_lock.setAggBytesWrite(vmDiskStat_lock.getNetBytesWrite() + vmDiskStat_lock.getCurrentBytesWrite());
+ }
+
+ _vmDiskStatsDao.update(vmDiskStat_lock.getId(), vmDiskStat_lock);
+ }
+ txn.commit();
+ } catch (Exception e) {
+ txn.rollback();
+ s_logger.warn("Unable to update vm disk statistics for vm: " + userVm.getId() + " from host: " + hostId, e);
+ } finally {
+ txn.close();
+ }
+ }
}
@@@ -3686,9 -3919,23 +3907,22 @@@
+ " already has max Running VMs(count includes system VMs), cannot migrate to this host");
}
+ collectVmDiskStatistics(vm);
- VMInstanceVO migratedVm = _itMgr.migrate(vm, srcHostId, dest);
- return migratedVm;
+ return _itMgr.migrate(vm.getUuid(), srcHostId, dest);
}
+ private boolean checkIfHostIsDedicated(HostVO host) {
+ long hostId = host.getId();
+ DedicatedResourceVO dedicatedHost = _dedicatedDao.findByHostId(hostId);
+ DedicatedResourceVO dedicatedClusterOfHost = _dedicatedDao.findByClusterId(host.getClusterId());
+ DedicatedResourceVO dedicatedPodOfHost = _dedicatedDao.findByPodId(host.getPodId());
+ if(dedicatedHost != null || dedicatedClusterOfHost != null || dedicatedPodOfHost != null) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
@Override
@ActionEvent(eventType = EventTypes.EVENT_VM_MIGRATE, eventDescription = "migrating VM", async = true)
public VirtualMachine migrateVirtualMachineWithVolume(Long vmId, Host destinationHost,
@@@ -4397,15 -4650,68 +4631,9 @@@
}
@Override
- public boolean plugNic(Network network, NicTO nic, VirtualMachineTO vm,
- ReservationContext context, DeployDestination dest)
- throws ConcurrentOperationException, ResourceUnavailableException,
- InsufficientCapacityException {
- UserVmVO vmVO = _vmDao.findById(vm.getId());
- if (vmVO.getState() == State.Running) {
- try {
- PlugNicCommand plugNicCmd = new PlugNicCommand(nic,vm.getName(), vm.getType());
- Commands cmds = new Commands(OnError.Stop);
- cmds.addCommand("plugnic",plugNicCmd);
- _agentMgr.send(dest.getHost().getId(),cmds);
- PlugNicAnswer plugNicAnswer = cmds.getAnswer(PlugNicAnswer.class);
- if (!(plugNicAnswer != null && plugNicAnswer.getResult())) {
- s_logger.warn("Unable to plug nic for " + vmVO + " due to: " + " due to: " + plugNicAnswer.getDetails());
- return false;
- }
- } catch (OperationTimedoutException e) {
- throw new AgentUnavailableException("Unable to plug nic for " + vmVO + " in network " + network, dest.getHost().getId(), e);
- }
- } else if (vmVO.getState() == State.Stopped || vmVO.getState() == State.Stopping) {
- s_logger.warn(vmVO + " is Stopped, not sending PlugNicCommand. Currently " + vmVO.getState());
- } else {
- s_logger.warn("Unable to plug nic, " + vmVO + " is not in the right state " + vmVO.getState());
- throw new ResourceUnavailableException("Unable to plug nic on the backend," +
- vmVO + " is not in the right state", DataCenter.class, vmVO.getDataCenterId());
- }
- return true;
- }
-
- @Override
- public boolean unplugNic(Network network, NicTO nic, VirtualMachineTO vm,
- ReservationContext context, DeployDestination dest) throws ConcurrentOperationException, ResourceUnavailableException {
- UserVmVO vmVO = _vmDao.findById(vm.getId());
- if (vmVO.getState() == State.Running) {
- try {
- UnPlugNicCommand unplugNicCmd = new UnPlugNicCommand(nic,vm.getName());
- Commands cmds = new Commands(OnError.Stop);
- cmds.addCommand("unplugnic",unplugNicCmd);
- _agentMgr.send(dest.getHost().getId(),cmds);
- UnPlugNicAnswer unplugNicAnswer = cmds.getAnswer(UnPlugNicAnswer.class);
- if (!(unplugNicAnswer != null && unplugNicAnswer.getResult())) {
- s_logger.warn("Unable to unplug nic for " + vmVO + " due to: " + unplugNicAnswer.getDetails());
- return false;
- }
- } catch (OperationTimedoutException e) {
- throw new AgentUnavailableException("Unable to unplug nic for " + vmVO + " in network " + network, dest.getHost().getId(), e);
- }
- } else if (vmVO.getState() == State.Stopped || vmVO.getState() == State.Stopping) {
- s_logger.warn(vmVO + " is Stopped, not sending UnPlugNicCommand. Currently " + vmVO.getState());
- } else {
- s_logger.warn("Unable to unplug nic, " + vmVO + " is not in the right state " + vmVO.getState());
- throw new ResourceUnavailableException("Unable to unplug nic on the backend," +
- vmVO + " is not in the right state", DataCenter.class, vmVO.getDataCenterId());
- }
- return true;
- }
-
- @Override
- public void prepareStop(VirtualMachineProfile<UserVmVO> profile) {
+ public void prepareStop(VirtualMachineProfile profile) {
+ UserVmVO vm = _vmDao.findById(profile.getId());
+ if (vm.getState() == State.Running)
+ collectVmDiskStatistics(vm);
}
-
- // @Override
- // public void vmWorkStart(VmWork work) {
- // }
- //
- // @Override
- // public void vmWorkStop(VmWork work) {
- // }
--
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/vm/VirtualMachineManagerImpl.java
index 1774e1b,568fe55..56f066a
--- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@@ -3234,13 -2836,13 +3234,13 @@@ public class VirtualMachineManagerImpl
long isDefault = (nic.isDefaultNic()) ? 1 : 0;
// insert nic's Id into DB as resource_name
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_OFFERING_ASSIGN, vmVO.getAccountId(),
- vmVO.getDataCenterId(), vmVO.getId(), Long.toString(nic.getId()), nic.getNetworkId(),
+ vmVO.getDataCenterId(), vmVO.getId(), Long.toString(nic.getId()), network.getNetworkOfferingId(),
null, isDefault, VirtualMachine.class.getName(), vmVO.getUuid());
- return nic;
- } else {
- s_logger.warn("Failed to plug nic to the vm " + vm + " in network " + network);
- return null;
- }
+ return nic;
+ } else {
+ s_logger.warn("Failed to plug nic to the vm " + vm + " in network " + network);
+ return null;
+ }
}finally{
if(!result){
_networkMgr.removeNic(vmProfile, _nicsDao.findById(nic.getId()));
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java
----------------------------------------------------------------------
diff --cc server/src/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java
index b6bd71d,5211279..47413cf
--- a/server/src/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java
+++ b/server/src/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java
@@@ -126,10 -125,9 +126,9 @@@ public class AffinityGroupServiceImpl e
@DB
@Override
@ActionEvent(eventType = EventTypes.EVENT_AFFINITY_GROUP_DELETE, eventDescription = "Deleting affinity group")
- public boolean deleteAffinityGroup(Long affinityGroupId, String account, Long domainId, String affinityGroupName)
- throws ResourceInUseException {
+ public boolean deleteAffinityGroup(Long affinityGroupId, String account, Long domainId, String affinityGroupName) {
- Account caller = UserContext.current().getCaller();
+ Account caller = CallContext.current().getCallingAccount();
Account owner = _accountMgr.finalizeOwner(caller, account, domainId, null);
AffinityGroupVO group = null;
[13/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
Passing number in the create ACL API
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/9889ead3
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/9889ead3
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/9889ead3
Branch: refs/heads/vmsync
Commit: 9889ead3704b441dd93321755160b9d60ebf66e0
Parents: 96a92a2
Author: Pranav Saxena <pr...@citrix.com>
Authored: Thu Jun 6 16:17:03 2013 +0530
Committer: Pranav Saxena <pr...@citrix.com>
Committed: Thu Jun 6 16:17:03 2013 +0530
----------------------------------------------------------------------
ui/scripts/vpc.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9889ead3/ui/scripts/vpc.js
----------------------------------------------------------------------
diff --git a/ui/scripts/vpc.js b/ui/scripts/vpc.js
index 36e3aa0..580e004 100644
--- a/ui/scripts/vpc.js
+++ b/ui/scripts/vpc.js
@@ -58,7 +58,7 @@
},
fields: {
- 'rulenumber':{
+ 'number':{
label:'Rule Number',
edit:true
[27/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
CLOUDSTACK-1771: Fix ipv6 address for router
Now it won't change(as ipv4 address) after router is destroyed.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/4a14ea8a
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/4a14ea8a
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/4a14ea8a
Branch: refs/heads/vmsync
Commit: 4a14ea8a4d0d8a729928b05f137ea6721acf02ea
Parents: 5541785
Author: Sheng Yang <sh...@citrix.com>
Authored: Thu Jun 6 18:03:20 2013 -0700
Committer: Sheng Yang <sh...@citrix.com>
Committed: Thu Jun 6 18:04:35 2013 -0700
----------------------------------------------------------------------
.../ExternalFirewallDeviceManagerImpl.java | 2 +-
.../ExternalLoadBalancerDeviceManagerImpl.java | 4 +-
.../src/com/cloud/network/NetworkManager.java | 2 +-
.../com/cloud/network/NetworkManagerImpl.java | 3 +-
.../src/com/cloud/network/NetworkModelImpl.java | 17 +++++---
.../cloud/network/guru/DirectNetworkGuru.java | 5 +--
.../network/guru/DirectPodBasedNetworkGuru.java | 2 +-
.../VirtualNetworkApplianceManagerImpl.java | 46 +++++++++++---------
.../cloud/network/MockNetworkManagerImpl.java | 9 +---
.../com/cloud/vpc/MockNetworkManagerImpl.java | 2 +-
10 files changed, 48 insertions(+), 44 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4a14ea8a/server/src/com/cloud/network/ExternalFirewallDeviceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/ExternalFirewallDeviceManagerImpl.java b/server/src/com/cloud/network/ExternalFirewallDeviceManagerImpl.java
index 9d24e47..9b190aa 100644
--- a/server/src/com/cloud/network/ExternalFirewallDeviceManagerImpl.java
+++ b/server/src/com/cloud/network/ExternalFirewallDeviceManagerImpl.java
@@ -485,7 +485,7 @@ public abstract class ExternalFirewallDeviceManagerImpl extends AdapterBase impl
if (add && (!reservedIpAddressesForGuestNetwork.contains(network.getGateway()))) {
// Insert a new NIC for this guest network to reserve the gateway address
- _networkMgr.savePlaceholderNic(network, network.getGateway(), null);
+ _networkMgr.savePlaceholderNic(network, network.getGateway(), null, null);
}
// Delete any mappings used for inline external load balancers in this network
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4a14ea8a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
index 4b110e9..829ad3f 100644
--- a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
+++ b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
@@ -774,7 +774,7 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
// If a NIC doesn't exist for the load balancing IP address, create one
loadBalancingIpNic = _nicDao.findByIp4AddressAndNetworkId(loadBalancingIpAddress, network.getId());
if (loadBalancingIpNic == null) {
- loadBalancingIpNic = _networkMgr.savePlaceholderNic(network, loadBalancingIpAddress, null);
+ loadBalancingIpNic = _networkMgr.savePlaceholderNic(network, loadBalancingIpAddress, null, null);
}
// Save a mapping between the source IP address and the load balancing IP address NIC
@@ -1019,7 +1019,7 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
if (add) {
// Insert a new NIC for this guest network to reserve the self IP
- _networkMgr.savePlaceholderNic(guestConfig, selfIp, null);
+ _networkMgr.savePlaceholderNic(guestConfig, selfIp, null, null);
} else {
// release the self-ip obtained from guest network
Nic selfipNic = getPlaceholderNic(guestConfig);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4a14ea8a/server/src/com/cloud/network/NetworkManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java
index 8627251..bc43daa 100755
--- a/server/src/com/cloud/network/NetworkManager.java
+++ b/server/src/com/cloud/network/NetworkManager.java
@@ -381,7 +381,7 @@ public interface NetworkManager {
String allocatePublicIpForGuestNic(Long networkId, DataCenter dc, Pod pod, Account caller, String requestedIp) throws InsufficientAddressCapacityException;
- NicVO savePlaceholderNic(Network network, String ip4Address, Type vmType);
+ NicVO savePlaceholderNic(Network network, String ip4Address, String ip6Address, Type vmType);
DhcpServiceProvider getDhcpServiceProvider(Network network);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4a14ea8a/server/src/com/cloud/network/NetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java
index cae4e8a..d6a6450 100755
--- a/server/src/com/cloud/network/NetworkManagerImpl.java
+++ b/server/src/com/cloud/network/NetworkManagerImpl.java
@@ -4325,9 +4325,10 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
@Override
- public NicVO savePlaceholderNic(Network network, String ip4Address, Type vmType) {
+ public NicVO savePlaceholderNic(Network network, String ip4Address, String ip6Address, Type vmType) {
NicVO nic = new NicVO(null, null, network.getId(), null);
nic.setIp4Address(ip4Address);
+ nic.setIp6Address(ip6Address);
nic.setReservationStrategy(ReservationStrategy.PlaceHolder);
nic.setState(Nic.State.Reserved);
nic.setVmType(vmType);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4a14ea8a/server/src/com/cloud/network/NetworkModelImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkModelImpl.java b/server/src/com/cloud/network/NetworkModelImpl.java
index 6b63ead..21917f7 100755
--- a/server/src/com/cloud/network/NetworkModelImpl.java
+++ b/server/src/com/cloud/network/NetworkModelImpl.java
@@ -2065,17 +2065,24 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel {
public NicVO getPlaceholderNicForRouter(Network network, Long podId) {
List<NicVO> nics = _nicDao.listPlaceholderNicsByNetworkIdAndVmType(network.getId(), VirtualMachine.Type.DomainRouter);
for (NicVO nic : nics) {
- if (nic.getReserver() == null && nic.getIp4Address() != null) {
+ if (nic.getReserver() == null && (nic.getIp4Address() != null || nic.getIp6Address() != null)) {
if (podId == null) {
return nic;
} else {
//return nic only when its ip address belong to the pod range (for the Basic zone case)
List<? extends Vlan> vlans = _vlanDao.listVlansForPod(podId);
for (Vlan vlan : vlans) {
- IpAddress ip = _ipAddressDao.findByIpAndNetworkId(network.getId(), nic.getIp4Address());
- if (ip != null && ip.getVlanId() == vlan.getId()) {
- return nic;
- }
+ if (nic.getIp4Address() != null) {
+ IpAddress ip = _ipAddressDao.findByIpAndNetworkId(network.getId(), nic.getIp4Address());
+ if (ip != null && ip.getVlanId() == vlan.getId()) {
+ return nic;
+ }
+ } else {
+ UserIpv6AddressVO ipv6 = _ipv6Dao.findByNetworkIdAndIp(network.getId(), nic.getIp6Address());
+ if (ipv6 != null && ipv6.getVlanId() == vlan.getId()) {
+ return nic;
+ }
+ }
}
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4a14ea8a/server/src/com/cloud/network/guru/DirectNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/DirectNetworkGuru.java b/server/src/com/cloud/network/guru/DirectNetworkGuru.java
index 84008c0..b4577ac 100755
--- a/server/src/com/cloud/network/guru/DirectNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/DirectNetworkGuru.java
@@ -221,7 +221,6 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru {
throws InsufficientVirtualNetworkCapcityException,
InsufficientAddressCapacityException {
- //FIXME - save ipv6 informaiton in the placeholder nic
Transaction txn = Transaction.currentTxn();
txn.start();
_networkMgr.allocateDirectIp(nic, dc, vm, network, requestedIp4Addr, requestedIp6Addr);
@@ -229,8 +228,8 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru {
if (vm.getType() == VirtualMachine.Type.DomainRouter) {
Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, null);
if (placeholderNic == null) {
- s_logger.debug("Saving placeholder nic with ip4 address " + nic.getIp4Address() + " and ipv6 address " + requestedIp6Addr + " for the network " + network);
- _networkMgr.savePlaceholderNic(network, nic.getIp4Address(), VirtualMachine.Type.DomainRouter);
+ s_logger.debug("Saving placeholder nic with ip4 address " + nic.getIp4Address() + " and ipv6 address " + nic.getIp6Address() + " for the network " + network);
+ _networkMgr.savePlaceholderNic(network, nic.getIp4Address(), nic.getIp6Address(), VirtualMachine.Type.DomainRouter);
}
}
txn.commit();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4a14ea8a/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java b/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java
index cf27986..f21e352 100755
--- a/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java
@@ -203,7 +203,7 @@ public class DirectPodBasedNetworkGuru extends DirectNetworkGuru {
Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, pod.getId());
if (placeholderNic == null) {
s_logger.debug("Saving placeholder nic with ip4 address " + nic.getIp4Address() + " for the network " + network);
- _networkMgr.savePlaceholderNic(network, nic.getIp4Address(), VirtualMachine.Type.DomainRouter);
+ _networkMgr.savePlaceholderNic(network, nic.getIp4Address(), null, VirtualMachine.Type.DomainRouter);
}
}
txn.commit();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4a14ea8a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
index e0ff157..db4786a 100755
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -1740,30 +1740,34 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
s_logger.debug("Adding nic for Virtual Router in Guest network " + guestNetwork);
String defaultNetworkStartIp = null, defaultNetworkStartIpv6 = null;
if (!setupPublicNetwork) {
+ Nic placeholder = _networkModel.getPlaceholderNicForRouter(guestNetwork, plan.getPodId());
if (guestNetwork.getCidr() != null) {
- Nic placeholder = _networkModel.getPlaceholderNicForRouter(guestNetwork, plan.getPodId());
- if (placeholder != null) {
- s_logger.debug("Requesting ip address " + placeholder.getIp4Address() + " stored in placeholder nic for the network " + guestNetwork);
- defaultNetworkStartIp = placeholder.getIp4Address();
- } else {
- String startIp = _networkModel.getStartIpAddress(guestNetwork.getId());
- if (startIp != null && _ipAddressDao.findByIpAndSourceNetworkId(guestNetwork.getId(), startIp).getAllocatedTime() == null) {
- defaultNetworkStartIp = startIp;
- } else if (s_logger.isDebugEnabled()){
- s_logger.debug("First ip " + startIp + " in network id=" + guestNetwork.getId() +
- " is already allocated, can't use it for domain router; will get random ip address from the range");
- }
- }
+ if (placeholder != null && placeholder.getIp4Address() != null) {
+ s_logger.debug("Requesting ipv4 address " + placeholder.getIp4Address() + " stored in placeholder nic for the network " + guestNetwork);
+ defaultNetworkStartIp = placeholder.getIp4Address();
+ } else {
+ String startIp = _networkModel.getStartIpAddress(guestNetwork.getId());
+ if (startIp != null && _ipAddressDao.findByIpAndSourceNetworkId(guestNetwork.getId(), startIp).getAllocatedTime() == null) {
+ defaultNetworkStartIp = startIp;
+ } else if (s_logger.isDebugEnabled()){
+ s_logger.debug("First ipv4 " + startIp + " in network id=" + guestNetwork.getId() +
+ " is already allocated, can't use it for domain router; will get random ip address from the range");
+ }
+ }
}
-
- //FIXME - get ipv6 stored in the placeholder
+
if (guestNetwork.getIp6Cidr() != null) {
- String startIpv6 = _networkModel.getStartIpv6Address(guestNetwork.getId());
- if (startIpv6 != null && _ipv6Dao.findByNetworkIdAndIp(guestNetwork.getId(), startIpv6) == null) {
- defaultNetworkStartIpv6 = startIpv6;
- } else if (s_logger.isDebugEnabled()){
- s_logger.debug("First ipv6 " + startIpv6 + " in network id=" + guestNetwork.getId() +
- " is already allocated, can't use it for domain router; will get random ipv6 address from the range");
+ if (placeholder != null && placeholder.getIp6Address() != null) {
+ s_logger.debug("Requesting ipv6 address " + placeholder.getIp6Address() + " stored in placeholder nic for the network " + guestNetwork);
+ defaultNetworkStartIpv6 = placeholder.getIp6Address();
+ } else {
+ String startIpv6 = _networkModel.getStartIpv6Address(guestNetwork.getId());
+ if (startIpv6 != null && _ipv6Dao.findByNetworkIdAndIp(guestNetwork.getId(), startIpv6) == null) {
+ defaultNetworkStartIpv6 = startIpv6;
+ } else if (s_logger.isDebugEnabled()){
+ s_logger.debug("First ipv6 " + startIpv6 + " in network id=" + guestNetwork.getId() +
+ " is already allocated, can't use it for domain router; will get random ipv6 address from the range");
+ }
}
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4a14ea8a/server/test/com/cloud/network/MockNetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/network/MockNetworkManagerImpl.java b/server/test/com/cloud/network/MockNetworkManagerImpl.java
index 7ab322b..077395f 100755
--- a/server/test/com/cloud/network/MockNetworkManagerImpl.java
+++ b/server/test/com/cloud/network/MockNetworkManagerImpl.java
@@ -66,15 +66,8 @@ import com.cloud.user.Account;
import com.cloud.user.User;
import com.cloud.utils.Pair;
import com.cloud.utils.component.ManagerBase;
-import com.cloud.vm.Nic;
-import com.cloud.vm.NicProfile;
-import com.cloud.vm.NicVO;
-import com.cloud.vm.ReservationContext;
-import com.cloud.vm.VMInstanceVO;
-import com.cloud.vm.VirtualMachine;
import com.cloud.vm.*;
import com.cloud.vm.VirtualMachine.Type;
-import com.cloud.vm.VirtualMachineProfile;
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;
@@ -924,7 +917,7 @@ public class MockNetworkManagerImpl extends ManagerBase implements NetworkManage
@Override
- public NicVO savePlaceholderNic(Network network, String ip4Address, Type vmType) {
+ public NicVO savePlaceholderNic(Network network, String ip4Address, String ip6Address, Type vmType) {
// TODO Auto-generated method stub
return null;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4a14ea8a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
index d46be7c..b609022 100644
--- a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
+++ b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
@@ -1393,7 +1393,7 @@ public class MockNetworkManagerImpl extends ManagerBase implements NetworkManage
@Override
- public NicVO savePlaceholderNic(Network network, String ip4Address, Type vmType) {
+ public NicVO savePlaceholderNic(Network network, String ip4Address, String ip6Address, Type vmType) {
// TODO Auto-generated method stub
return null;
}
[34/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
Log the actual NAT ip attempting to SSH into
VM IP is the guest IP and it's the NAT ip that is used for ssh.
Signed-off-by: Prasanna Santhanam <ts...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/302741d3
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/302741d3
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/302741d3
Branch: refs/heads/vmsync
Commit: 302741d309f335c1f8c3a36286bec513fd9ed2f4
Parents: 1c9cd9d
Author: Prasanna Santhanam <ts...@apache.org>
Authored: Fri Jun 7 15:02:55 2013 +0530
Committer: Prasanna Santhanam <ts...@apache.org>
Committed: Fri Jun 7 15:02:55 2013 +0530
----------------------------------------------------------------------
test/integration/smoke/test_network.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/302741d3/test/integration/smoke/test_network.py
----------------------------------------------------------------------
diff --git a/test/integration/smoke/test_network.py b/test/integration/smoke/test_network.py
index eb33c63..a65748d 100644
--- a/test/integration/smoke/test_network.py
+++ b/test/integration/smoke/test_network.py
@@ -1209,7 +1209,7 @@ class TestRebootRouter(cloudstackTestCase):
except Exception as e:
self.fail(
"SSH Access failed for %s: %s" % \
- (self.vm_1.ipaddress, e))
+ (self.nat_rule.ipaddress.ipaddress, e))
return
def tearDown(self):
[14/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
CLOUDSTACK-2873: Passing account name for explicit dedication
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/c0850d4d
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/c0850d4d
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/c0850d4d
Branch: refs/heads/vmsync
Commit: c0850d4d82dd291cf0aa24318e7dd40cc4532eec
Parents: 9889ead
Author: Pranav Saxena <pr...@citrix.com>
Authored: Thu Jun 6 17:14:57 2013 +0530
Committer: Pranav Saxena <pr...@citrix.com>
Committed: Thu Jun 6 17:14:57 2013 +0530
----------------------------------------------------------------------
ui/scripts/system.js | 14 +++++++-------
ui/scripts/zoneWizard.js | 2 +-
2 files changed, 8 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c0850d4d/ui/scripts/system.js
----------------------------------------------------------------------
diff --git a/ui/scripts/system.js b/ui/scripts/system.js
index bb197c4..c5019d7 100644
--- a/ui/scripts/system.js
+++ b/ui/scripts/system.js
@@ -5588,7 +5588,7 @@
//EXPLICIT DEDICATION
var array2 = [];
if(args.data.accountId != "")
- array2.push("&accountId=" +todb(args.data.accountId));
+ array2.push("&account=" +todb(args.data.accountId));
$.ajax({
url: createURL("dedicateZone&zoneId=" + args.context.physicalResources[0].id + "&domainId=" +args.data.domainId + array2.join("") ),
@@ -8823,7 +8823,7 @@
if(args.$form.find('.form-item[rel=isDedicated]').find('input[type=checkbox]').is(':Checked')== true){
var array2 = [];
if(args.data.accountId != "")
- array2.push("&accountId=" +todb(args.data.accountId));
+ array2.push("&account=" +todb(args.data.accountId));
if(podId != null){
$.ajax({
@@ -9008,7 +9008,7 @@
//EXPLICIT DEDICATION
var array2 = [];
if(args.data.accountId != "")
- array2.push("&accountId=" +todb(args.data.accountId));
+ array2.push("&account=" +todb(args.data.accountId));
$.ajax({
url: createURL("dedicatePod&podId=" + args.context.pods[0].id + "&domainId=" +args.data.domainId + array2.join("")),
@@ -9768,7 +9768,7 @@
if(args.$form.find('.form-item[rel=isDedicated]').find('input[type=checkbox]').is(':Checked')== true){
var array2 = [];
if(args.data.accountId != "")
- array2.push("&accountId=" +todb(args.data.accountId));
+ array2.push("&account=" +todb(args.data.accountId));
}
if(clusterId != null){
@@ -9989,7 +9989,7 @@
var array2 = [];
if(args.data.accountId != "")
- array2.push("&accountId=" +todb(args.data.accountId));
+ array2.push("&account=" +todb(args.data.accountId));
$.ajax({
url: createURL("dedicateCluster&clusterId=" + args.context.clusters[0].id + "&domainId=" +args.data.domainId + array2.join("") ),
@@ -10870,7 +10870,7 @@
if(args.$form.find('.form-item[rel=isDedicated]').find('input[type=checkbox]').is(':Checked')== true){
var array2 = [];
if(args.data.accountId != "")
- array2.push("&accountId=" +todb(args.data.accountId));
+ array2.push("&account=" +todb(args.data.accountId));
}
if(hostId != null){
@@ -11006,7 +11006,7 @@
//EXPLICIT DEDICATION
var array2 = [];
if(args.data.accountId != "")
- array2.push("&accountId=" +todb(args.data.accountId));
+ array2.push("&account=" +todb(args.data.accountId));
$.ajax({
url: createURL("dedicateHost&hostId=" + args.context.hosts[0].id + "&domainId=" +args.data.domainId + array2.join("") ),
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c0850d4d/ui/scripts/zoneWizard.js
----------------------------------------------------------------------
diff --git a/ui/scripts/zoneWizard.js b/ui/scripts/zoneWizard.js
index 07558e3..6631cba 100755
--- a/ui/scripts/zoneWizard.js
+++ b/ui/scripts/zoneWizard.js
@@ -1628,7 +1628,7 @@
if(args.data.zone.domain != null)
array2.push("&domainid=" + args.data.zone.domain);
if(args.data.zone.accountId != "")
- array2.push("&accountId=" +todb(args.data.zone.accountId));
+ array2.push("&account=" +todb(args.data.zone.accountId));
if(dedicatedZoneId != null){
$.ajax({
[33/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
CLOUDSTACK-2884: str object interpreted as index
Casting to an int for almostEqual comparison
Signed-off-by: Prasanna Santhanam <ts...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/1c9cd9d3
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/1c9cd9d3
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/1c9cd9d3
Branch: refs/heads/vmsync
Commit: 1c9cd9d36077331a7b25d19e18ae73918e5662f6
Parents: 4f07679
Author: Prasanna Santhanam <ts...@apache.org>
Authored: Fri Jun 7 14:49:00 2013 +0530
Committer: Prasanna Santhanam <ts...@apache.org>
Committed: Fri Jun 7 14:49:00 2013 +0530
----------------------------------------------------------------------
test/integration/smoke/test_service_offerings.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1c9cd9d3/test/integration/smoke/test_service_offerings.py
----------------------------------------------------------------------
diff --git a/test/integration/smoke/test_service_offerings.py b/test/integration/smoke/test_service_offerings.py
index a56e34d..0213c04 100644
--- a/test/integration/smoke/test_service_offerings.py
+++ b/test/integration/smoke/test_service_offerings.py
@@ -92,7 +92,7 @@ class Services:
"displaytext": "Small Instance",
"cpunumber": 1,
"cpuspeed": 100,
- "memory": 256,
+ "memory": 128,
},
"medium":
{
@@ -433,7 +433,7 @@ class TestServiceOfferings(cloudstackTestCase):
)
self.assertAlmostEqual(
int(total_mem) / 1024, # In MBs
- self.small_offering.memory,
+ int(self.small_offering.memory),
"Check Memory(kb) for small offering"
)
return
[29/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
Fix DB warnings - txn: Commit called when it is not a transaction: -NetworkServiceImpl.dedicateGuestVlanRange:3050
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/e7d5ccaa
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/e7d5ccaa
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/e7d5ccaa
Branch: refs/heads/vmsync
Commit: e7d5ccaada697607260ab5ee8e8ff3b436973f88
Parents: 6208a51
Author: Likitha Shetty <li...@citrix.com>
Authored: Fri Jun 7 12:11:15 2013 +0530
Committer: Likitha Shetty <li...@citrix.com>
Committed: Fri Jun 7 12:12:18 2013 +0530
----------------------------------------------------------------------
server/src/com/cloud/network/NetworkServiceImpl.java | 1 +
1 file changed, 1 insertion(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e7d5ccaa/server/src/com/cloud/network/NetworkServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java b/server/src/com/cloud/network/NetworkServiceImpl.java
index 2bf9f40..29a36b9 100755
--- a/server/src/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/com/cloud/network/NetworkServiceImpl.java
@@ -3044,6 +3044,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
_accountGuestVlanMapDao.update(guestVlanMapId, accountGuestVlanMapVO);
} else {
Transaction txn = Transaction.currentTxn();
+ txn.start();
accountGuestVlanMapVO = new AccountGuestVlanMapVO(vlanOwner.getAccountId(), physicalNetworkId);
accountGuestVlanMapVO.setGuestVlanRange(startVlan + "-" + endVlan);
_accountGuestVlanMapDao.persist(accountGuestVlanMapVO);
[28/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
CLOUDSTACK-2889: Resize volume unsupported on vmware
Skip the tests if the VM deploys on a VmWare host since we do not
support resizing volumes on vmware (yet)
Signed-off-by: Prasanna Santhanam <ts...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/6208a512
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/6208a512
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/6208a512
Branch: refs/heads/vmsync
Commit: 6208a51283bfdb401f76f042296c16304ee8f4e4
Parents: 4a14ea8
Author: Prasanna Santhanam <ts...@apache.org>
Authored: Fri Jun 7 11:29:56 2013 +0530
Committer: Prasanna Santhanam <ts...@apache.org>
Committed: Fri Jun 7 11:31:10 2013 +0530
----------------------------------------------------------------------
test/integration/smoke/test_volumes.py | 5 +++++
1 file changed, 5 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6208a512/test/integration/smoke/test_volumes.py
----------------------------------------------------------------------
diff --git a/test/integration/smoke/test_volumes.py b/test/integration/smoke/test_volumes.py
index d9c808a..7039c6f 100644
--- a/test/integration/smoke/test_volumes.py
+++ b/test/integration/smoke/test_volumes.py
@@ -591,6 +591,8 @@ class TestVolumes(cloudstackTestCase):
if hosts[0].hypervisor == "XenServer":
self.virtual_machine.stop(self.apiClient)
+ elif hosts[0].hypervisor.lower() == "vmware":
+ self.skipTest("Resize Volume is unsupported on VmWare")
self.apiClient.resizeVolume(cmd)
count = 0
@@ -638,6 +640,9 @@ class TestVolumes(cloudstackTestCase):
if hosts[0].hypervisor == "XenServer":
self.virtual_machine.stop(self.apiClient)
+ elif hosts[0].hypervisor.lower() == "vmware":
+ self.skipTest("Resize Volume is unsupported on VmWare")
+
self.debug("Resize Volume ID: %s" % self.volume.id)
cmd = resizeVolume.resizeVolumeCmd()
[12/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
Code structure problem while filter out lbschemes
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/96a92a23
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/96a92a23
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/96a92a23
Branch: refs/heads/vmsync
Commit: 96a92a23ec0dc1121af2fce83173d0ede9d4cac1
Parents: 58b57ca
Author: Pranav Saxena <pr...@citrix.com>
Authored: Thu Jun 6 16:15:14 2013 +0530
Committer: Pranav Saxena <pr...@citrix.com>
Committed: Thu Jun 6 16:15:14 2013 +0530
----------------------------------------------------------------------
ui/scripts/vpc.js | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/96a92a23/ui/scripts/vpc.js
----------------------------------------------------------------------
diff --git a/ui/scripts/vpc.js b/ui/scripts/vpc.js
index 164f2bb..36e3aa0 100644
--- a/ui/scripts/vpc.js
+++ b/ui/scripts/vpc.js
@@ -3595,7 +3595,20 @@
).length ? tier._highlighted = true : tier._highlighted = false;
// Get LB capabilities
- var lbSchemes = $.grep(
+
+ var lbSchemes = $.grep(
+ tier.service,
+ function(service) {
+ return service.name == 'Lb';
+ }
+ ).length? $.grep($.grep(
+ tier.service,
+ function(service) {
+ return service.name == 'Lb';
+ }
+ )[0].capability,function(capability){ return capability.name == 'LbSchemes';}) : [] ;
+
+ /* var lbSchemes = $.grep(
$.grep(
tier.service,
function(service) {
@@ -3605,7 +3618,7 @@
function(capability) {
return capability.name == 'LbSchemes';
}
- );
+ );*/
var hasLbScheme = function(schemeVal) {
return $.grep(
[22/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
CLOUDSTACK-2880: UI - zone detail - add VMware DC action - replace URL field with vcenter field and make vcenter required.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/36ed93f8
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/36ed93f8
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/36ed93f8
Branch: refs/heads/vmsync
Commit: 36ed93f8abd21e585e73d2070faca48b3cf52cfb
Parents: 6202563
Author: Jessica Wang <je...@apache.org>
Authored: Thu Jun 6 11:39:05 2013 -0700
Committer: Jessica Wang <je...@apache.org>
Committed: Thu Jun 6 11:39:05 2013 -0700
----------------------------------------------------------------------
ui/scripts/system.js | 16 ++++++----------
1 file changed, 6 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/36ed93f8/ui/scripts/system.js
----------------------------------------------------------------------
diff --git a/ui/scripts/system.js b/ui/scripts/system.js
index c1eef69..e3d7b41 100644
--- a/ui/scripts/system.js
+++ b/ui/scripts/system.js
@@ -5388,9 +5388,9 @@
label: 'label.name',
validation: { required: true }
},
- url: {
- label: 'label.url',
- validation: { required: false }
+ vcenter: {
+ label: 'vcenter',
+ validation: { required: true }
},
username: {
label: 'label.username',
@@ -5406,14 +5406,10 @@
action: function(args) {
var data = {
zoneid: args.context.physicalResources[0].id,
- name: args.data.name
- };
+ name: args.data.name,
+ vcenter: args.data.vcenter
+ };
- if(args.data.url != null && args.data.url.length > 0) {
- $.extend(data, {
- url: args.data.url
- })
- }
if(args.data.username != null && args.data.username.length > 0) {
$.extend(data, {
username: args.data.username
[47/50] [abbrv] Merged from master
Posted by ah...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImpl.java
----------------------------------------------------------------------
diff --cc server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImpl.java
index 102d8a5,483c19a..8747ee1
--- a/server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImpl.java
+++ b/server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImpl.java
@@@ -17,6 -17,6 +17,27 @@@
package org.apache.cloudstack.region.gslb;
++import java.util.ArrayList;
++import java.util.HashMap;
++import java.util.List;
++import java.util.Map;
++
++import javax.ejb.Local;
++import javax.inject.Inject;
++
++import org.apache.log4j.Logger;
++
++import org.apache.cloudstack.acl.SecurityChecker;
++import org.apache.cloudstack.api.command.user.region.ha.gslb.AssignToGlobalLoadBalancerRuleCmd;
++import org.apache.cloudstack.api.command.user.region.ha.gslb.CreateGlobalLoadBalancerRuleCmd;
++import org.apache.cloudstack.api.command.user.region.ha.gslb.DeleteGlobalLoadBalancerRuleCmd;
++import org.apache.cloudstack.api.command.user.region.ha.gslb.ListGlobalLoadBalancerRuleCmd;
++import org.apache.cloudstack.api.command.user.region.ha.gslb.RemoveFromGlobalLoadBalancerRuleCmd;
++import org.apache.cloudstack.api.command.user.region.ha.gslb.UpdateGlobalLoadBalancerRuleCmd;
++import org.apache.cloudstack.context.CallContext;
++import org.apache.cloudstack.region.Region;
++import org.apache.cloudstack.region.dao.RegionDao;
++
import com.cloud.agent.AgentManager;
import com.cloud.agent.api.routing.GlobalLoadBalancerConfigCommand;
import com.cloud.agent.api.routing.SiteLoadBalancerConfig;
@@@ -27,7 -27,7 +48,11 @@@ import com.cloud.event.EventTypes
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
--import com.cloud.network.dao.*;
++import com.cloud.network.dao.IPAddressDao;
++import com.cloud.network.dao.IPAddressVO;
++import com.cloud.network.dao.LoadBalancerDao;
++import com.cloud.network.dao.LoadBalancerVO;
++import com.cloud.network.dao.NetworkDao;
import com.cloud.network.rules.LoadBalancer;
import com.cloud.network.rules.RulesManager;
import com.cloud.region.ha.GlobalLoadBalancerRule;
@@@ -39,19 -40,18 +64,6 @@@ import com.cloud.utils.db.DB
import com.cloud.utils.db.Transaction;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.NetUtils;
--import org.apache.cloudstack.acl.SecurityChecker;
--import org.apache.cloudstack.api.command.user.region.ha.gslb.*;
- import org.apache.cloudstack.context.CallContext;
--import org.apache.cloudstack.region.Region;
--import org.apache.cloudstack.region.dao.RegionDao;
--import org.apache.log4j.Logger;
--
--import javax.ejb.Local;
--import javax.inject.Inject;
--import java.util.ArrayList;
--import java.util.HashMap;
--import java.util.List;
--import java.util.Map;
@Local(value = {GlobalLoadBalancingRulesService.class})
public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingRulesService {
@@@ -81,7 -81,7 +93,7 @@@
protected GslbServiceProvider _gslbProvider=null;
public void setGslbServiceProvider(GslbServiceProvider provider) {
-- this._gslbProvider = provider;
++ _gslbProvider = provider;
}
@Override
@@@ -378,11 -400,25 +412,26 @@@
"Delete global load balancer rule")
public boolean deleteGlobalLoadBalancerRule(DeleteGlobalLoadBalancerRuleCmd deleteGslbCmd) {
- UserContext ctx = UserContext.current();
- Account caller = ctx.getCaller();
+ CallContext ctx = CallContext.current();
+ Account caller = ctx.getCallingAccount();
+
long gslbRuleId = deleteGslbCmd.getGlobalLoadBalancerId();
+
+ try {
+ revokeGslbRule(gslbRuleId, caller);
+ } catch (Exception e) {
+ s_logger.warn("Failed to delete GSLB rule due to" + e.getMessage());
+ return false;
+ }
+
+ return true;
+ }
+
+ @DB
+ private void revokeGslbRule(long gslbRuleId, Account caller) {
+
GlobalLoadBalancerRuleVO gslbRule = _gslbRuleDao.findById(gslbRuleId);
+
if (gslbRule == null) {
throw new InvalidParameterValueException("Invalid global load balancer rule id: " + gslbRuleId);
}
@@@ -487,6 -528,10 +541,10 @@@
@Override
public List<GlobalLoadBalancerRule> listGlobalLoadBalancerRule(ListGlobalLoadBalancerRuleCmd listGslbCmd) {
+
- UserContext ctx = UserContext.current();
- Account caller = ctx.getCaller();
++ CallContext ctx = CallContext.current();
++ Account caller = ctx.getCallingAccount();
+
Integer regionId = listGslbCmd.getRegionId();
Long ruleId = listGslbCmd.getId();
List<GlobalLoadBalancerRule> response = new ArrayList<GlobalLoadBalancerRule>();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/test/com/cloud/network/MockNetworkManagerImpl.java
----------------------------------------------------------------------
diff --cc server/test/com/cloud/network/MockNetworkManagerImpl.java
index 996be88,077395f..fbf86dc
--- a/server/test/com/cloud/network/MockNetworkManagerImpl.java
+++ b/server/test/com/cloud/network/MockNetworkManagerImpl.java
@@@ -23,11 -23,7 +23,9 @@@ import java.util.Set
import javax.ejb.Local;
import javax.naming.ConfigurationException;
- import org.springframework.stereotype.Component;
-
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;
@@@ -68,16 -66,22 +66,15 @@@ import com.cloud.user.Account
import com.cloud.user.User;
import com.cloud.utils.Pair;
import com.cloud.utils.component.ManagerBase;
-import com.cloud.vm.*;
+import com.cloud.vm.Nic;
+import com.cloud.vm.NicProfile;
+import com.cloud.vm.NicSecondaryIp;
+import com.cloud.vm.NicVO;
+import com.cloud.vm.ReservationContext;
+import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachine.Type;
-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.*;
-import org.apache.cloudstack.api.command.user.vm.ListNicsCmd;
-import org.springframework.stereotype.Component;
-
-import javax.ejb.Local;
-import javax.naming.ConfigurationException;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import com.cloud.vm.VirtualMachineProfile;
--@Component
@Local(value = { NetworkManager.class, NetworkService.class })
public class MockNetworkManagerImpl extends ManagerBase implements NetworkManager, NetworkService {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/test/com/cloud/vm/MockUserVmManagerImpl.java
----------------------------------------------------------------------
diff --cc server/test/com/cloud/vm/MockUserVmManagerImpl.java
index 8b964e9,40c49d4..3025d10
--- a/server/test/com/cloud/vm/MockUserVmManagerImpl.java
+++ b/server/test/com/cloud/vm/MockUserVmManagerImpl.java
@@@ -43,10 -44,17 +43,11 @@@ import org.apache.cloudstack.api.comman
import org.apache.cloudstack.api.command.user.vm.UpgradeVMCmd;
import org.apache.cloudstack.api.command.user.vmgroup.CreateVMGroupCmd;
import org.apache.cloudstack.api.command.user.vmgroup.DeleteVMGroupCmd;
-import org.springframework.stereotype.Component;
-import com.cloud.agent.api.StopAnswer;
+ import com.cloud.agent.api.VmDiskStatsEntry;
import com.cloud.agent.api.VmStatsEntry;
-import com.cloud.agent.api.to.NicTO;
-import com.cloud.agent.api.to.VirtualMachineTO;
-import com.cloud.agent.manager.Commands;
import com.cloud.api.query.vo.UserVmJoinVO;
import com.cloud.dc.DataCenter;
-import com.cloud.deploy.DeployDestination;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.InvalidParameterValueException;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/test/com/cloud/vpc/NetworkACLManagerTest.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/test/org/apache/cloudstack/affinity/AffinityApiUnitTest.java
----------------------------------------------------------------------
diff --cc server/test/org/apache/cloudstack/affinity/AffinityApiUnitTest.java
index 8de6da5,5816b28..1627219
--- a/server/test/org/apache/cloudstack/affinity/AffinityApiUnitTest.java
+++ b/server/test/org/apache/cloudstack/affinity/AffinityApiUnitTest.java
@@@ -62,8 -63,11 +64,10 @@@ 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;
import com.cloud.utils.component.ComponentContext;
+ import com.cloud.utils.db.SearchBuilder;
+ import com.cloud.utils.db.SearchCriteria;
import com.cloud.vm.UserVmVO;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.dao.UserVmDao;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/server/test/org/apache/cloudstack/networkoffering/ChildTestConfiguration.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/setup/db/db/schema-410to420.sql
----------------------------------------------------------------------
diff --cc setup/db/db/schema-410to420.sql
index 0cf7356,bcfbcc9..9ae4717
--- a/setup/db/db/schema-410to420.sql
+++ b/setup/db/db/schema-410to420.sql
@@@ -1787,9 -1771,86 +1840,86 @@@ INSERT IGNORE INTO `cloud`.`configurati
UPDATE `cloud`.`snapshots` set swift_id=null where swift_id=0;
+ DROP TABLE IF EXISTS `cloud`.`vm_disk_statistics`;
+ CREATE TABLE `cloud`.`vm_disk_statistics` (
+ `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+ `data_center_id` bigint(20) unsigned NOT NULL,
+ `account_id` bigint(20) unsigned NOT NULL,
+ `vm_id` bigint(20) unsigned NOT NULL,
+ `volume_id` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `net_io_read` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `net_io_write` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `current_io_read` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `current_io_write` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `agg_io_read` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `agg_io_write` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `net_bytes_read` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `net_bytes_write` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `current_bytes_read` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `current_bytes_write` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `agg_bytes_read` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `agg_bytes_write` bigint(20) unsigned NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id`),
+ UNIQUE KEY `account_id` (`account_id`,`data_center_id`,`vm_id`,`volume_id`),
+ KEY `i_vm_disk_statistics__account_id` (`account_id`),
+ KEY `i_vm_disk_statistics__account_id_data_center_id` (`account_id`,`data_center_id`),
+ CONSTRAINT `fk_vm_disk_statistics__account_id` FOREIGN KEY (`account_id`) REFERENCES `account` (`id`) ON DELETE CASCADE
+ ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
+
+ insert into `cloud`.`vm_disk_statistics`(data_center_id,account_id,vm_id,volume_id)
+ select volumes.data_center_id, volumes.account_id, vm_instance.id, volumes.id from volumes,vm_instance where vm_instance.vm_type="User" and vm_instance.state<>"Expunging" and volumes.instance_id=vm_instance.id order by vm_instance.id;
+
+ DROP TABLE IF EXISTS `cloud_usage`.`vm_disk_statistics`;
+ CREATE TABLE `cloud_usage`.`vm_disk_statistics` (
+ `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+ `data_center_id` bigint(20) unsigned NOT NULL,
+ `account_id` bigint(20) unsigned NOT NULL,
+ `vm_id` bigint(20) unsigned NOT NULL,
+ `volume_id` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `net_io_read` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `net_io_write` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `current_io_read` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `current_io_write` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `agg_io_read` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `agg_io_write` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `net_bytes_read` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `net_bytes_write` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `current_bytes_read` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `current_bytes_write` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `agg_bytes_read` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `agg_bytes_write` bigint(20) unsigned NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `id` (`id`),
+ UNIQUE KEY `account_id` (`account_id`,`data_center_id`,`vm_id`,`volume_id`)
+ ) ENGINE=InnoDB CHARSET=utf8;
+
+ insert into `cloud_usage`.`vm_disk_statistics` select * from `cloud`.`vm_disk_statistics`;
+
+ DROP TABLE IF EXISTS `cloud_usage`.`usage_vm_disk`;
+ CREATE TABLE `cloud_usage`.`usage_vm_disk` (
+ `account_id` bigint(20) unsigned NOT NULL,
+ `zone_id` bigint(20) unsigned NOT NULL,
+ `vm_id` bigint(20) unsigned NOT NULL,
+ `volume_id` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `io_read` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `io_write` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `agg_io_read` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `agg_io_write` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `bytes_read` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `bytes_write` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `agg_bytes_read` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `agg_bytes_write` bigint(20) unsigned NOT NULL DEFAULT '0',
+ `event_time_millis` bigint(20) unsigned NOT NULL DEFAULT '0',
+ PRIMARY KEY (`account_id`,`zone_id`,`vm_id`,`volume_id`,`event_time_millis`)
+ ) ENGINE=InnoDB CHARSET=utf8;
+
+ INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'vm.disk.stats.interval', 0, 'Interval (in seconds) to report vm disk statistics.');
+
-- Re-enable foreign key checking, at the end of the upgrade path
-SET foreign_key_checks = 1;
+SET foreign_key_checks = 1;
+
UPDATE `cloud`.`snapshot_policy` set uuid=id WHERE uuid is NULL;
#update shared sg enabled network with not null name in Advance Security Group enabled network
UPDATE `cloud`.`networks` set name='Shared SG enabled network', display_text='Shared SG enabled network' WHERE name IS null AND traffic_type='Guest' AND data_center_id IN (select id from data_center where networktype='Advanced' and is_security_group_enabled=1) AND acl_type='Domain';
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/tools/devcloud/devcloud.cfg
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/vmware-base/src/com/cloud/hypervisor/vmware/mo/DatacenterMO.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostDatastoreBrowserMO.java
----------------------------------------------------------------------
diff --cc vmware-base/src/com/cloud/hypervisor/vmware/mo/HostDatastoreBrowserMO.java
index a9d2205,209aeed..209e68c
--- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostDatastoreBrowserMO.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostDatastoreBrowserMO.java
@@@ -76,9 -78,10 +78,10 @@@ public class HostDatastoreBrowserMO ext
return searchDatastore(datastorePath, spec);
}
- public HostDatastoreBrowserSearchResults searchDatastoreSubFolders(String datastorePath, HostDatastoreBrowserSearchSpec searchSpec) throws Exception {
+ @SuppressWarnings("unchecked")
+ public ArrayList<HostDatastoreBrowserSearchResults> searchDatastoreSubFolders(String datastorePath, HostDatastoreBrowserSearchSpec searchSpec) throws Exception {
if(s_logger.isTraceEnabled())
- s_logger.trace("vCenter API trace - searchDatastoreSubFolders(). target mor: " + _mor.getValue() + ", file datastore path: " + datastorePath);
+ s_logger.trace("vCenter API trace - searchDatastoreSubFolders(). target mor: " + _mor.getPresetParams() + ", file datastore path: " + datastorePath);
try {
ManagedObjectReference morTask = _context.getService().searchDatastoreSubFoldersTask(_mor, datastorePath, searchSpec);
@@@ -99,12 -102,11 +102,11 @@@
return null;
}
- public HostDatastoreBrowserSearchResults searchDatastoreSubFolders(String datastorePath, String folderName, boolean caseInsensitive) throws Exception {
+ public ArrayList<HostDatastoreBrowserSearchResults> searchDatastoreSubFolders(String datastorePath, String fileName, boolean caseInsensitive) throws Exception {
- HostDatastoreBrowserSearchSpec spec = new HostDatastoreBrowserSearchSpec();
- spec.setSearchCaseInsensitive(caseInsensitive);
+ HostDatastoreBrowserSearchSpec spec = new HostDatastoreBrowserSearchSpec();
+ spec.setSearchCaseInsensitive(caseInsensitive);
- spec.getMatchPattern().add(folderName);
+ spec.getMatchPattern().add(fileName);
- return searchDatastore(datastorePath, spec);
+ return searchDatastoreSubFolders(datastorePath, spec);
- }
+ }
}
-
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
----------------------------------------------------------------------
[04/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
CLOUDSTACK-747: UI - Internal LB detailView - Assigned VMs tab - Assign VMs action - exclude assigned VMs from custom listView dialog.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/42a549e4
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/42a549e4
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/42a549e4
Branch: refs/heads/vmsync
Commit: 42a549e42020b533b07810557ae4c05238e1304c
Parents: 21a6271
Author: Jessica Wang <je...@apache.org>
Authored: Wed Jun 5 17:00:33 2013 -0700
Committer: Jessica Wang <je...@apache.org>
Committed: Wed Jun 5 17:00:33 2013 -0700
----------------------------------------------------------------------
ui/scripts/vpc.js | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/42a549e4/ui/scripts/vpc.js
----------------------------------------------------------------------
diff --git a/ui/scripts/vpc.js b/ui/scripts/vpc.js
index 03a85d8..2252387 100644
--- a/ui/scripts/vpc.js
+++ b/ui/scripts/vpc.js
@@ -654,8 +654,19 @@
).length ? true : false;
});
+ //remove assigned VMs (i.e. instance._isSelected == true)
+ var items = [];
+ if(instances != null) {
+ for(var i = 0; i < instances.length; i++) {
+ if(instances[i]._isSelected = true)
+ continue;
+ else
+ items.push(instances[i]);
+ }
+ }
+
args.response.success({
- data: instances
+ data: items
});
}
});
[16/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
CLOUDSTACK-2874: fix the upgrade for the deployment with F5/SRX
combination prior to 3.0 release
Fix does following:
- add F5 network service provider into a physical network if there if F5
deployed in the zone
- add instance of F5 network service provider
- add SRX network service provider into a physical network if there if
SRX deployed in the zone
- add instance of SRX network service provider
- upgrade all the guest networks to network offering '"Isolated with
external providers"
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/c0d89434
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/c0d89434
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/c0d89434
Branch: refs/heads/vmsync
Commit: c0d894346a57e61626f332a9ef25efa9b5e77646
Parents: d98289b
Author: Murali Reddy <mu...@gmail.com>
Authored: Thu Jun 6 17:47:31 2013 +0530
Committer: Murali Reddy <mu...@gmail.com>
Committed: Thu Jun 6 17:49:47 2013 +0530
----------------------------------------------------------------------
.../com/cloud/upgrade/dao/Upgrade410to420.java | 360 +++++++++++++++++++
1 file changed, 360 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c0d89434/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java
index 955ea56..d8f90ad 100644
--- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java
+++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java
@@ -79,6 +79,7 @@ public class Upgrade410to420 implements DbUpgrade {
updateNetworkACLs(conn);
addHostDetailsIndex(conn);
updateNetworksForPrivateGateways(conn);
+ correctExternalNetworkDevicesSetup(conn);
removeFirewallServiceFromSharedNetworkOfferingWithSGService(conn);
fix22xKVMSnapshots(conn);
addIndexForAlert(conn);
@@ -1224,4 +1225,363 @@ public class Upgrade410to420 implements DbUpgrade {
}
}
}
+
+ // Corrects upgrade for deployment with F5 and SRX devices (pre 3.0) to network offering &
+ // network service provider paradigm
+ private void correctExternalNetworkDevicesSetup(Connection conn) {
+ PreparedStatement zoneSearchStmt = null, pNetworkStmt = null, f5DevicesStmt = null, srxDevicesStmt = null;
+ ResultSet zoneResults = null, pNetworksResults = null, f5DevicesResult = null, srxDevicesResult = null;
+
+ try {
+ zoneSearchStmt = conn.prepareStatement("SELECT id, networktype FROM `cloud`.`data_center`");
+ zoneResults = zoneSearchStmt.executeQuery();
+ while (zoneResults.next()) {
+ long zoneId = zoneResults.getLong(1);
+ String networkType = zoneResults.getString(2);
+
+ if (!com.cloud.dc.DataCenter.NetworkType.Advanced.toString().equalsIgnoreCase(networkType)) {
+ continue;
+ }
+
+ pNetworkStmt = conn.prepareStatement("SELECT id FROM `cloud`.`physical_network` where data_center_id=?");
+ pNetworkStmt.setLong(1, zoneId);
+ pNetworksResults = pNetworkStmt.executeQuery();
+ while (pNetworksResults.next()) {
+ long physicalNetworkId = pNetworksResults.getLong(1);
+ PreparedStatement fetchF5NspStmt = conn.prepareStatement("SELECT id from `cloud`.`physical_network_service_providers` where physical_network_id=" + physicalNetworkId
+ + " and provider_name = 'F5BigIp'");
+ ResultSet rsF5NSP = fetchF5NspStmt.executeQuery();
+ boolean hasF5Nsp = rsF5NSP.next();
+ fetchF5NspStmt.close();
+
+ // if there is no 'F5BigIP' physical network service provider added into physical network then
+ // add 'F5BigIP' as network service provider and add the entry in 'external_load_balancer_devices'
+ if (!hasF5Nsp) {
+ f5DevicesStmt = conn.prepareStatement("SELECT id FROM host WHERE data_center_id=? AND type = 'ExternalLoadBalancer' AND removed IS NULL");
+ f5DevicesStmt.setLong(1, zoneId);
+ f5DevicesResult = f5DevicesStmt.executeQuery();
+ // add F5BigIP provider and provider instance to physical network if there are any external load
+ // balancers added in the zone
+ while (f5DevicesResult.next()) {
+ long f5HostId = f5DevicesResult.getLong(1);;
+ addF5ServiceProvider(conn, physicalNetworkId, zoneId);
+ addF5LoadBalancer(conn, f5HostId, physicalNetworkId);
+ }
+ }
+
+ PreparedStatement fetchSRXNspStmt = conn.prepareStatement("SELECT id from `cloud`.`physical_network_service_providers` where physical_network_id=" + physicalNetworkId
+ + " and provider_name = 'JuniperSRX'");
+ ResultSet rsSRXNSP = fetchSRXNspStmt.executeQuery();
+ boolean hasSrxNsp = rsSRXNSP.next();
+ fetchSRXNspStmt.close();
+
+ // if there is no 'JuniperSRX' physical network service provider added into physical network then
+ // add 'JuniperSRX' as network service provider and add the entry in 'external_firewall_devices'
+ if (!hasSrxNsp) {
+ srxDevicesStmt = conn.prepareStatement("SELECT id FROM host WHERE data_center_id=? AND type = 'ExternalFirewall' AND removed IS NULL");
+ srxDevicesStmt.setLong(1, zoneId);
+ srxDevicesResult = srxDevicesStmt.executeQuery();
+ // add JuniperSRX provider and provider instance to physical network if there are any external
+ // firewall instances added in to the zone
+ while (srxDevicesResult.next()) {
+ long srxHostId = srxDevicesResult.getLong(1);
+ // add SRX provider and provider instance to physical network
+ addSrxServiceProvider(conn, physicalNetworkId, zoneId);
+ addSrxFirewall(conn, srxHostId, physicalNetworkId);
+ }
+ }
+ }
+ }
+
+ // not the network service provider has been provisioned in to physical network, mark all guest network
+ // to be using network offering 'Isolated with external providers'
+ fixZoneUsingExternalDevices(conn);
+
+ if (zoneResults != null) {
+ try {
+ zoneResults.close();
+ } catch (SQLException e) {
+ }
+ }
+
+ if (zoneSearchStmt != null) {
+ try {
+ zoneSearchStmt.close();
+ } catch (SQLException e) {
+ }
+ }
+ } catch (SQLException e) {
+ throw new CloudRuntimeException("Exception while adding PhysicalNetworks", e);
+ } finally {
+
+ }
+ }
+
+ private void addF5LoadBalancer(Connection conn, long hostId, long physicalNetworkId){
+ PreparedStatement pstmtUpdate = null;
+ try{
+ s_logger.debug("Adding F5 Big IP load balancer with host id " + hostId + " in to physical network" + physicalNetworkId);
+ String insertF5 = "INSERT INTO `cloud`.`external_load_balancer_devices` (physical_network_id, host_id, provider_name, " +
+ "device_name, capacity, is_dedicated, device_state, allocation_state, is_inline, is_managed, uuid) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
+ pstmtUpdate = conn.prepareStatement(insertF5);
+ pstmtUpdate.setLong(1, physicalNetworkId);
+ pstmtUpdate.setLong(2, hostId);
+ pstmtUpdate.setString(3, "F5BigIp");
+ pstmtUpdate.setString(4, "F5BigIpLoadBalancer");
+ pstmtUpdate.setLong(5, 0);
+ pstmtUpdate.setBoolean(6, false);
+ pstmtUpdate.setString(7, "Enabled");
+ pstmtUpdate.setString(8, "Shared");
+ pstmtUpdate.setBoolean(9, false);
+ pstmtUpdate.setBoolean(10, false);
+ pstmtUpdate.setString(11, UUID.randomUUID().toString());
+ pstmtUpdate.executeUpdate();
+ }catch (SQLException e) {
+ throw new CloudRuntimeException("Exception while adding F5 load balancer device" , e);
+ } finally {
+ if (pstmtUpdate != null) {
+ try {
+ pstmtUpdate.close();
+ } catch (SQLException e) {
+ }
+ }
+ }
+ }
+
+ private void addSrxFirewall(Connection conn, long hostId, long physicalNetworkId){
+ PreparedStatement pstmtUpdate = null;
+ try{
+ s_logger.debug("Adding SRX firewall device with host id " + hostId + " in to physical network" + physicalNetworkId);
+ String insertSrx = "INSERT INTO `cloud`.`external_firewall_devices` (physical_network_id, host_id, provider_name, " +
+ "device_name, capacity, is_dedicated, device_state, allocation_state, uuid) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?)";
+ pstmtUpdate = conn.prepareStatement(insertSrx);
+ pstmtUpdate.setLong(1, physicalNetworkId);
+ pstmtUpdate.setLong(2, hostId);
+ pstmtUpdate.setString(3, "JuniperSRX");
+ pstmtUpdate.setString(4, "JuniperSRXFirewall");
+ pstmtUpdate.setLong(5, 0);
+ pstmtUpdate.setBoolean(6, false);
+ pstmtUpdate.setString(7, "Enabled");
+ pstmtUpdate.setString(8, "Shared");
+ pstmtUpdate.setString(9, UUID.randomUUID().toString());
+ pstmtUpdate.executeUpdate();
+ }catch (SQLException e) {
+ throw new CloudRuntimeException("Exception while adding SRX firewall device ", e);
+ } finally {
+ if (pstmtUpdate != null) {
+ try {
+ pstmtUpdate.close();
+ } catch (SQLException e) {
+ }
+ }
+ }
+ }
+
+ private void addF5ServiceProvider(Connection conn, long physicalNetworkId, long zoneId){
+ PreparedStatement pstmtUpdate = null;
+ try{
+ // add physical network service provider - F5BigIp
+ s_logger.debug("Adding PhysicalNetworkServiceProvider F5BigIp" + " in to physical network" + physicalNetworkId);
+ String insertPNSP = "INSERT INTO `cloud`.`physical_network_service_providers` (`uuid`, `physical_network_id` , `provider_name`, `state` ," +
+ "`destination_physical_network_id`, `vpn_service_provided`, `dhcp_service_provided`, `dns_service_provided`, `gateway_service_provided`," +
+ "`firewall_service_provided`, `source_nat_service_provided`, `load_balance_service_provided`, `static_nat_service_provided`," +
+ "`port_forwarding_service_provided`, `user_data_service_provided`, `security_group_service_provided`) VALUES (?,?,?,?,0,0,0,0,0,0,0,1,0,0,0,0)";
+
+ pstmtUpdate = conn.prepareStatement(insertPNSP);
+ pstmtUpdate.setString(1, UUID.randomUUID().toString());
+ pstmtUpdate.setLong(2, physicalNetworkId);
+ pstmtUpdate.setString(3, "F5BigIp");
+ pstmtUpdate.setString(4, "Enabled");
+ pstmtUpdate.executeUpdate();
+ }catch (SQLException e) {
+ throw new CloudRuntimeException("Exception while adding PhysicalNetworkServiceProvider F5BigIp", e);
+ } finally {
+ if (pstmtUpdate != null) {
+ try {
+ pstmtUpdate.close();
+ } catch (SQLException e) {
+ }
+ }
+ }
+ }
+
+ private void addSrxServiceProvider(Connection conn, long physicalNetworkId, long zoneId){
+ PreparedStatement pstmtUpdate = null;
+ try{
+ // add physical network service provider - JuniperSRX
+ s_logger.debug("Adding PhysicalNetworkServiceProvider JuniperSRX");
+ String insertPNSP = "INSERT INTO `cloud`.`physical_network_service_providers` (`uuid`, `physical_network_id` , `provider_name`, `state` ," +
+ "`destination_physical_network_id`, `vpn_service_provided`, `dhcp_service_provided`, `dns_service_provided`, `gateway_service_provided`," +
+ "`firewall_service_provided`, `source_nat_service_provided`, `load_balance_service_provided`, `static_nat_service_provided`," +
+ "`port_forwarding_service_provided`, `user_data_service_provided`, `security_group_service_provided`) VALUES (?,?,?,?,0,0,0,0,1,1,1,0,1,1,0,0)";
+
+ pstmtUpdate = conn.prepareStatement(insertPNSP);
+ pstmtUpdate.setString(1, UUID.randomUUID().toString());
+ pstmtUpdate.setLong(2, physicalNetworkId);
+ pstmtUpdate.setString(3, "JuniperSRX");
+ pstmtUpdate.setString(4, "Enabled");
+ pstmtUpdate.executeUpdate();
+ }catch (SQLException e) {
+ throw new CloudRuntimeException("Exception while adding PhysicalNetworkServiceProvider JuniperSRX" , e);
+ } finally {
+ if (pstmtUpdate != null) {
+ try {
+ pstmtUpdate.close();
+ } catch (SQLException e) {
+ }
+ }
+ }
+ }
+
+ // This method does two things
+ //
+ // 1) ensure that networks using external load balancer/firewall in deployments prior to release 3.0
+ // has entry in network_external_lb_device_map and network_external_firewall_device_map
+ //
+ // 2) Some keys of host details for F5 and SRX devices were stored in Camel Case in 2.x releases. From 3.0
+ // they are made in lowercase. On upgrade change the host details name to lower case
+ private void fixZoneUsingExternalDevices(Connection conn) {
+ //Get zones to upgrade
+ List<Long> zoneIds = new ArrayList<Long>();
+ PreparedStatement pstmt = null;
+ PreparedStatement pstmtUpdate = null;
+ ResultSet rs = null;
+ long networkOfferingId, networkId;
+ long f5DeviceId, f5HostId;
+ long srxDevivceId, srxHostId;
+
+ try {
+ pstmt = conn.prepareStatement("select id from `cloud`.`data_center` where lb_provider='F5BigIp' or firewall_provider='JuniperSRX' or gateway_provider='JuniperSRX'");
+ rs = pstmt.executeQuery();
+ while (rs.next()) {
+ zoneIds.add(rs.getLong(1));
+ }
+ } catch (SQLException e) {
+ throw new CloudRuntimeException("Unable to create network to LB & firewall device mapping for networks that use them", e);
+ }
+
+ if (zoneIds.size() == 0) {
+ return; // no zones using F5 and SRX devices so return
+ }
+
+ // find the default network offering created for external devices during upgrade from 2.2.14
+ try {
+ pstmt = conn.prepareStatement("select id from `cloud`.`network_offerings` where unique_name='Isolated with external providers' ");
+ rs = pstmt.executeQuery();
+ if (rs.first()) {
+ networkOfferingId = rs.getLong(1);
+ } else {
+ throw new CloudRuntimeException("Cannot upgrade as there is no 'Isolated with external providers' network offering crearted .");
+ }
+ } catch (SQLException e) {
+ throw new CloudRuntimeException("Unable to create network to LB & firewalla device mapping for networks that use them", e);
+ }
+
+ for (Long zoneId : zoneIds) {
+ try {
+ // find the F5 device id in the zone
+ pstmt = conn.prepareStatement("SELECT id FROM host WHERE data_center_id=? AND type = 'ExternalLoadBalancer' AND removed IS NULL");
+ pstmt.setLong(1, zoneId);
+ rs = pstmt.executeQuery();
+ if (rs.first()) {
+ f5HostId = rs.getLong(1);
+ } else {
+ throw new CloudRuntimeException("Cannot upgrade as there is no F5 load balancer device found in data center " + zoneId);
+ }
+ pstmt = conn.prepareStatement("SELECT id FROM external_load_balancer_devices WHERE host_id=?");
+ pstmt.setLong(1, f5HostId);
+ rs = pstmt.executeQuery();
+ if (rs.first()) {
+ f5DeviceId = rs.getLong(1);
+ } else {
+ throw new CloudRuntimeException("Cannot upgrade as there is no F5 load balancer device with host ID " + f5HostId + " found in external_load_balancer_device");
+ }
+
+ // find the SRX device id in the zone
+ pstmt = conn.prepareStatement("SELECT id FROM host WHERE data_center_id=? AND type = 'ExternalFirewall' AND removed IS NULL");
+ pstmt.setLong(1, zoneId);
+ rs = pstmt.executeQuery();
+ if (rs.first()) {
+ srxHostId = rs.getLong(1);
+ } else {
+ throw new CloudRuntimeException("Cannot upgrade as there is no SRX firewall device found in data center " + zoneId);
+ }
+ pstmt = conn.prepareStatement("SELECT id FROM external_firewall_devices WHERE host_id=?");
+ pstmt.setLong(1, srxHostId);
+ rs = pstmt.executeQuery();
+ if (rs.first()) {
+ srxDevivceId = rs.getLong(1);
+ } else {
+ throw new CloudRuntimeException("Cannot upgrade as there is no SRX firewall device found with host ID " + srxHostId + " found in external_firewall_devices");
+ }
+
+ // check if network any uses F5 or SRX devices in the zone
+ pstmt = conn.prepareStatement("select id from `cloud`.`networks` where guest_type='Virtual' and data_center_id=? and network_offering_id=? and removed IS NULL");
+ pstmt.setLong(1, zoneId);
+ pstmt.setLong(2, networkOfferingId);
+ rs = pstmt.executeQuery();
+ while (rs.next()) {
+ // get the network Id
+ networkId = rs.getLong(1);
+
+ // add mapping for the network in network_external_lb_device_map
+ String insertLbMapping = "INSERT INTO `cloud`.`network_external_lb_device_map` (uuid, network_id, external_load_balancer_device_id, created) VALUES ( ?, ?, ?, now())";
+ pstmtUpdate = conn.prepareStatement(insertLbMapping);
+ pstmtUpdate.setString(1, UUID.randomUUID().toString());
+ pstmtUpdate.setLong(2, networkId);
+ pstmtUpdate.setLong(3, f5DeviceId);
+ pstmtUpdate.executeUpdate();
+ s_logger.debug("Successfully added entry in network_external_lb_device_map for network " + networkId + " and F5 device ID " + f5DeviceId);
+
+ // add mapping for the network in network_external_firewall_device_map
+ String insertFwMapping = "INSERT INTO `cloud`.`network_external_firewall_device_map` (uuid, network_id, external_firewall_device_id, created) VALUES ( ?, ?, ?, now())";
+ pstmtUpdate = conn.prepareStatement(insertFwMapping);
+ pstmtUpdate.setString(1, UUID.randomUUID().toString());
+ pstmtUpdate.setLong(2, networkId);
+ pstmtUpdate.setLong(3, srxDevivceId);
+ pstmtUpdate.executeUpdate();
+ s_logger.debug("Successfully added entry in network_external_firewall_device_map for network " + networkId + " and SRX device ID " + srxDevivceId);
+ }
+
+ // update host details for F5 and SRX devices
+ s_logger.debug("Updating the host details for F5 and SRX devices");
+ pstmt = conn.prepareStatement("SELECT host_id, name FROM `cloud`.`host_details` WHERE host_id=? OR host_id=?");
+ pstmt.setLong(1, f5HostId);
+ pstmt.setLong(2, srxHostId);
+ rs = pstmt.executeQuery();
+ while (rs.next()) {
+ long hostId = rs.getLong(1);
+ String camlCaseName = rs.getString(2);
+ if (!(camlCaseName.equalsIgnoreCase("numRetries") ||
+ camlCaseName.equalsIgnoreCase("publicZone") ||
+ camlCaseName.equalsIgnoreCase("privateZone") ||
+ camlCaseName.equalsIgnoreCase("publicInterface") ||
+ camlCaseName.equalsIgnoreCase("privateInterface") ||
+ camlCaseName.equalsIgnoreCase("usageInterface") )) {
+ continue;
+ }
+ String lowerCaseName = camlCaseName.toLowerCase();
+ pstmt = conn.prepareStatement("update `cloud`.`host_details` set name=? where host_id=? AND name=?");
+ pstmt.setString(1, lowerCaseName);
+ pstmt.setLong(2, hostId);
+ pstmt.setString(3, camlCaseName);
+ pstmt.executeUpdate();
+ }
+ s_logger.debug("Successfully updated host details for F5 and SRX devices");
+ } catch (SQLException e) {
+ throw new CloudRuntimeException("Unable create a mapping for the networks in network_external_lb_device_map and network_external_firewall_device_map", e);
+ } finally {
+ try {
+ if (rs != null) {
+ rs.close();
+ }
+ if (pstmt != null) {
+ pstmt.close();
+ }
+ } catch (SQLException e) {
+ }
+ }
+ s_logger.info("Successfully upgraded network using F5 and SRX devices to have a entry in the network_external_lb_device_map and network_external_firewall_device_map");
+ }
+ }
}
[41/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
CLOUDSTACK-2286: Volume created from snapshot state is in allocated state instead of Ready state which is letting Primary storage not to increment the resources.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/da5c4619
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/da5c4619
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/da5c4619
Branch: refs/heads/vmsync
Commit: da5c4619c394eaedec55c277bc5e71de379d6600
Parents: e218a6d
Author: Sanjay Tripathi <sa...@citrix.com>
Authored: Fri Jun 7 17:08:31 2013 +0530
Committer: Devdeep Singh <de...@gmail.com>
Committed: Fri Jun 7 17:17:54 2013 +0530
----------------------------------------------------------------------
.../storage/volume/VolumeServiceImpl.java | 79 ++++++++++----------
1 file changed, 40 insertions(+), 39 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/da5c4619/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
index 7fdf6bb..54dcbd2 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
@@ -428,51 +428,52 @@ public class VolumeServiceImpl implements VolumeService {
public AsyncCallFuture<VolumeApiResult> createVolumeFromSnapshot(
VolumeInfo volume, DataStore store, SnapshotInfo snapshot) {
AsyncCallFuture<VolumeApiResult> future = new AsyncCallFuture<VolumeApiResult>();
-
+
try {
- DataObject volumeOnStore = store.create(volume);
- volume.processEvent(Event.CreateOnlyRequested);
- CreateVolumeFromBaseImageContext<VolumeApiResult> context = new CreateVolumeFromBaseImageContext<VolumeApiResult>(null,
- (VolumeObject)volume, store, volumeOnStore, future);
- AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> caller = AsyncCallbackDispatcher.create(this);
- caller.setCallback(caller.getTarget().createVolumeFromSnapshotCallback(null, null))
- .setContext(context);
- this.motionSrv.copyAsync(snapshot, volumeOnStore, caller);
+ DataObject volumeOnStore = store.create(volume);
+ volume = this.volFactory.getVolume(volume.getId(), store);
+ volume.processEvent(Event.CreateOnlyRequested);
+ CreateVolumeFromBaseImageContext<VolumeApiResult> context = new CreateVolumeFromBaseImageContext<VolumeApiResult>(null,
+ (VolumeObject)volume, store, volumeOnStore, future);
+ AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> caller = AsyncCallbackDispatcher.create(this);
+ caller.setCallback(caller.getTarget().createVolumeFromSnapshotCallback(null, null))
+ .setContext(context);
+ this.motionSrv.copyAsync(snapshot, volumeOnStore, caller);
} catch (Exception e) {
- s_logger.debug("create volume from snapshot failed", e);
- VolumeApiResult result = new VolumeApiResult(volume);
- result.setResult(e.toString());
- future.complete(result);
+ s_logger.debug("create volume from snapshot failed", e);
+ VolumeApiResult result = new VolumeApiResult(volume);
+ result.setResult(e.toString());
+ future.complete(result);
}
-
+
return future;
}
-
- protected Void createVolumeFromSnapshotCallback(AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> callback,
- CreateVolumeFromBaseImageContext<VolumeApiResult> context) {
- CopyCommandResult result = callback.getResult();
- VolumeInfo volume = context.vo;
- VolumeApiResult apiResult = new VolumeApiResult(volume);
- Event event = null;
- if (result.isFailed()) {
- apiResult.setResult(result.getResult());
- event = Event.OperationFailed;
- } else {
- event = Event.OperationSuccessed;
- }
-
- try {
- volume.processEvent(event);
- } catch (Exception e) {
- s_logger.debug("create volume from snapshot failed", e);
- apiResult.setResult(e.toString());
- }
-
- AsyncCallFuture<VolumeApiResult> future = context.future;
- future.complete(apiResult);
- return null;
+
+ protected Void createVolumeFromSnapshotCallback(AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> callback,
+ CreateVolumeFromBaseImageContext<VolumeApiResult> context) {
+ CopyCommandResult result = callback.getResult();
+ VolumeInfo volume = context.vo;
+ VolumeApiResult apiResult = new VolumeApiResult(volume);
+ Event event = null;
+ if (result.isFailed()) {
+ apiResult.setResult(result.getResult());
+ event = Event.OperationFailed;
+ } else {
+ event = Event.OperationSuccessed;
+ }
+
+ try {
+ volume.processEvent(event);
+ } catch (Exception e) {
+ s_logger.debug("create volume from snapshot failed", e);
+ apiResult.setResult(e.toString());
+ }
+
+ AsyncCallFuture<VolumeApiResult> future = context.future;
+ future.complete(apiResult);
+ return null;
}
-
+
protected VolumeVO duplicateVolumeOnAnotherStorage(Volume volume, StoragePool pool) {
Long lastPoolId = volume.getPoolId();
VolumeVO newVol = new VolumeVO(volume);
[03/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
VPC UI, internal LB: Fix assignedVMs actions
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/21a62719
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/21a62719
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/21a62719
Branch: refs/heads/vmsync
Commit: 21a62719140acea4d2ab02cd610bc00a38bdd6eb
Parents: 88a62ab
Author: Brian Federle <br...@citrix.com>
Authored: Wed Jun 5 16:20:21 2013 -0700
Committer: Brian Federle <br...@citrix.com>
Committed: Wed Jun 5 16:20:21 2013 -0700
----------------------------------------------------------------------
ui/scripts/vpc.js | 79 ++++++++++++++++++++++++++++++++------------------
1 file changed, 50 insertions(+), 29 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/21a62719/ui/scripts/vpc.js
----------------------------------------------------------------------
diff --git a/ui/scripts/vpc.js b/ui/scripts/vpc.js
index 18fb5c1..03a85d8 100644
--- a/ui/scripts/vpc.js
+++ b/ui/scripts/vpc.js
@@ -605,7 +605,6 @@
assignedVms: {
title: 'Assigned VMs',
- multiple: true,
listView: {
id: 'assignedVms',
fields: {
@@ -625,11 +624,12 @@
});
},
actions: {
- add: {
+ add: {
label: 'Assign VMs',
- messages: {
+ messages: {
notification: function(args) { return 'Assign VMs'; }
},
+ needsRefresh: true,
listView: $.extend(true, {}, cloudStack.sections.instances.listView, {
type: 'checkbox',
filters: false,
@@ -688,36 +688,57 @@
notification: {
poll: pollAsyncJobResult
}
- },
-
- remove: {
- label: 'remove VM from load balancer',
- addRow: 'false',
- messages: {
- confirm: function(args) {
- return 'Please confirm you want to remove VM from load balancer';
+ }
+ },
+ detailView: {
+ actions: {
+ remove: {
+ label: 'remove VM from load balancer',
+ addRow: 'false',
+ messages: {
+ confirm: function(args) {
+ return 'Please confirm you want to remove VM from load balancer';
+ },
+ notification: function(args) {
+ return 'remove VM from load balancer';
+ }
+ },
+ action: function(args) {
+ $.ajax({
+ url: createURL('removeFromLoadBalancerRule'),
+ data: {
+ id: args.context.internalLoadBalancers[0].id,
+ virtualmachineids: args.context.assignedVms[0].id
+ },
+ success: function(json) {
+ var jid = json.removefromloadbalancerruleresponse.jobid;
+ args.response.success({
+ _custom: { jobId: jid }
+ });
+ }
+ });
},
- notification: function(args) {
- return 'remove VM from load balancer';
+ notificaton: {
+ poll: pollAsyncJobResult
}
- },
- action: function(args) {
- $.ajax({
- url: createURL('removeFromLoadBalancerRule'),
- data: {
- id: args.context.internalLoadBalancers[0].id,
- virtualmachineids: args.context.assignedVms[0].id
+ }
+ },
+ tabs: {
+ details: {
+ title: 'label.details',
+ fields: [
+ {
+ name: { label: 'label.name' }
},
- success: function(json) {
- var jid = json.removefromloadbalancerruleresponse.jobid;
- args.response.success({
- _custom: { jobId: jid }
- });
+ {
+ ipaddress: { label: 'label.ip.address' }
}
- });
- },
- notificaton: {
- poll: pollAsyncJobResult
+ ],
+ dataProvider: function(args) {
+ setTimeout(function() {
+ args.response.success({ data: args.context.assignedVms[0] });
+ });
+ }
}
}
}
[15/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
making detail view vlan range uneditable
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/d98289ba
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/d98289ba
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/d98289ba
Branch: refs/heads/vmsync
Commit: d98289baca7fbc8a793adadfa386e6ab234952f7
Parents: c0850d4
Author: Pranav Saxena <pr...@citrix.com>
Authored: Thu Jun 6 17:21:47 2013 +0530
Committer: Pranav Saxena <pr...@citrix.com>
Committed: Thu Jun 6 17:21:47 2013 +0530
----------------------------------------------------------------------
ui/scripts/system.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d98289ba/ui/scripts/system.js
----------------------------------------------------------------------
diff --git a/ui/scripts/system.js b/ui/scripts/system.js
index c5019d7..c1eef69 100644
--- a/ui/scripts/system.js
+++ b/ui/scripts/system.js
@@ -1110,8 +1110,8 @@
{ //updatePhysicalNetwork API
state: { label: 'label.state' },
vlan: {
- label: 'VLAN Range(s)',
- isEditable: true
+ label: 'VLAN Range(s)'
+ // isEditable: true
},
/* endVlan: {
label: 'label.end.vlan',
[46/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
CLOUDSTACK-2912 - adding cd command to rpm build instructions
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/91edeb49
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/91edeb49
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/91edeb49
Branch: refs/heads/vmsync
Commit: 91edeb49dde411d0e0ec2ea0975c4e254b5bab91
Parents: c30d9be
Author: Ron Wheeler <rw...@artifact-software.com>
Authored: Sun Jun 9 19:31:02 2013 -0400
Committer: David Nalley <da...@gnsa.us>
Committed: Sun Jun 9 19:33:44 2013 -0400
----------------------------------------------------------------------
docs/en-US/build-rpm.xml | 1 +
1 file changed, 1 insertion(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/91edeb49/docs/en-US/build-rpm.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/build-rpm.xml b/docs/en-US/build-rpm.xml
index 7caf924..100a06f 100644
--- a/docs/en-US/build-rpm.xml
+++ b/docs/en-US/build-rpm.xml
@@ -48,6 +48,7 @@ under the License.
<section id="generating-rpms">
<title>Generating RPMS</title>
<para>Now that we have the prerequisites and source, you will cd to the <filename>packaging/centos63/</filename> directory.</para>
+ <programlisting><prompt>$</prompt> cd packaging/centos63</programlisting>
<para>Generating RPMs is done using the <filename>package.sh</filename> script:
<programlisting><prompt>$</prompt>./package.sh</programlisting>
</para>
[07/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
VM objects are required for deletion/remove from LB
Application Loadbalancer remove and delete will get the id/uuid from the
vm object.
Signed-off-by: Prasanna Santhanam <ts...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/c05c1052
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/c05c1052
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/c05c1052
Branch: refs/heads/vmsync
Commit: c05c1052f516178d75b667cbc1c060c85265692d
Parents: bdada27
Author: Prasanna Santhanam <ts...@apache.org>
Authored: Thu Jun 6 09:36:55 2013 +0530
Committer: Prasanna Santhanam <ts...@apache.org>
Committed: Thu Jun 6 09:37:42 2013 +0530
----------------------------------------------------------------------
test/integration/smoke/test_internal_lb.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c05c1052/test/integration/smoke/test_internal_lb.py
----------------------------------------------------------------------
diff --git a/test/integration/smoke/test_internal_lb.py b/test/integration/smoke/test_internal_lb.py
index 0de2d4c..0535d6a 100644
--- a/test/integration/smoke/test_internal_lb.py
+++ b/test/integration/smoke/test_internal_lb.py
@@ -170,10 +170,10 @@ class TestInternalLb(cloudstackTestCase):
networkid=ntwk.id)
#5) Assign the VM to the Internal Load Balancer
- applb.assign(self.apiclient, vms=[vm.id])
+ applb.assign(self.apiclient, vms=[vm])
#6) Remove the vm from the Interanl Load Balancer
- applb.remove(self.apiclient, vms=[vm.id])
+ applb.remove(self.apiclient, vms=[vm])
#7) Delete the Load Balancer
applb.delete(self.apiclient)
[17/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
[GSoC]: Added Ian Duffy's proposal to guide
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/cc7e9eed
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/cc7e9eed
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/cc7e9eed
Branch: refs/heads/vmsync
Commit: cc7e9eed7e1340729109983f79200557df22296b
Parents: c0d8943
Author: Sebastien Goasguen <ru...@gmail.com>
Authored: Thu Jun 6 09:29:57 2013 -0400
Committer: Sebastien Goasguen <ru...@gmail.com>
Committed: Thu Jun 6 09:29:57 2013 -0400
----------------------------------------------------------------------
docs/en-US/CloudStack_GSoC_Guide.xml | 1 +
docs/en-US/gsoc-imduffy15.xml | 395 ++++++++++++++++++++++++++++++
2 files changed, 396 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/cc7e9eed/docs/en-US/CloudStack_GSoC_Guide.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/CloudStack_GSoC_Guide.xml b/docs/en-US/CloudStack_GSoC_Guide.xml
index 91c2967..b7ba61f 100644
--- a/docs/en-US/CloudStack_GSoC_Guide.xml
+++ b/docs/en-US/CloudStack_GSoC_Guide.xml
@@ -47,6 +47,7 @@
<xi:include href="Author_Group.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
</bookinfo>
<xi:include href="gsoc-tuna.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="gsoc-imduffy15.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
</book>
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/cc7e9eed/docs/en-US/gsoc-imduffy15.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/gsoc-imduffy15.xml b/docs/en-US/gsoc-imduffy15.xml
new file mode 100644
index 0000000..652152f
--- /dev/null
+++ b/docs/en-US/gsoc-imduffy15.xml
@@ -0,0 +1,395 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % BOOK_ENTITIES SYSTEM "CloudStack_GSoC_Guide.ent">
+%BOOK_ENTITIES;
+]>
+
+<!-- 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.
+-->
+
+<chapter id="gsoc-imduffy15">
+ <title>Ians's 2013 GSoC Proposal</title>
+ <para>This chapter describes Ians 2013 Google Summer of Code project within the &PRODUCT; ASF project. It is a copy paste of the submitted proposal.</para>
+ <section id="ldap-user-provisioning">
+ <title>LDAP user provisioning</title>
+ <para>
+ "Need to automate the way the LDAP users are provisioned into cloud stack. This will mean better
+ integration with a LDAP server, ability to import users and a way to define how the LDAP user
+ maps to the cloudstack users."
+ </para>
+ </section>
+ <section id="abstract">
+ <title>Abstract</title>
+ <para>
+ The aim of this project is to provide an more effective mechanism to provision users from LDAP
+ into cloudstack. Currently cloudstack enables LDAP authentication. In this authentication users
+ must be first setup in cloudstack. Once the user is setup in cloudstack they can authenticate
+ using their LDAP username and password. This project will improve Cloudstack LDAP integration
+ by enabling users be setup automatically using their LDAP credential
+ </para>
+ </section>
+ <section id="deliverables">
+ <title>Deliverables</title>
+ <itemizedlist>
+ <listitem>
+ <para>Service that retrieves a list of LDAP users from a configured group</para>
+ </listitem>
+ <listitem>
+ <para>Extension of the cloudstack UI "Add User" screen to offer user list from LDAP</para>
+ </listitem>
+ <listitem>
+ <para>Add service for saving new user it details from LDAP</para>
+ </listitem>
+ <listitem>
+ <para>BDD unit and acceptance automated testing</para>
+ </listitem>
+ <listitem>
+ <para>Document change details</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+ <section id="quantifiable-results">
+ <title>Quantifiable Results</title>
+ <informaltable>
+ <tgroup cols="2">
+ <tbody>
+ <row>
+ <entry>Given</entry>
+ <entry>An administrator wants to add new user to cloudstack and LDAP is setup in cloudstack</entry>
+ </row>
+ <row>
+ <entry>When</entry>
+ <entry>The administrator opens the "Add User" screen</entry>
+ </row>
+ <row>
+ <entry>Then</entry>
+ <entry>A table of users appears for the current list of users (not already created on cloudstack) from the LDAP group displaying their usernames, given name and email address. The timezone dropdown will still be available beside each user</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para/>
+ <informaltable>
+ <tgroup cols="2">
+ <tbody>
+ <row>
+ <entry>Given</entry>
+ <entry>An administrator wants to add new user to cloudstack and LDAP is not setup in cloudstack</entry>
+ </row>
+ <row>
+ <entry>When</entry>
+ <entry>The administrator opens the "Add User" screen</entry>
+ </row>
+ <row>
+ <entry>Then</entry>
+ <entry>The current add user screen and functionality is provided</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para/>
+ <informaltable>
+ <tgroup cols="2">
+ <tbody>
+ <row>
+ <entry>Given</entry>
+ <entry>An administrator wants to add new user to cloudstack and LDAP is setup in cloudstack</entry>
+ </row>
+ <row>
+ <entry>When</entry>
+ <entry>The administrator opens the "Add User" screen and mandatory information is missing</entry>
+ </row>
+ <row>
+ <entry>Then</entry>
+ <entry>These fields will be editable to enable you to populate the name or email address</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para/>
+ <informaltable>
+ <tgroup cols="2">
+ <tbody>
+ <row>
+ <entry>Given</entry>
+ <entry>An administrator wants to add new user to cloudstack, LDAP is setup and the user being created is in the LDAP query group</entry>
+ </row>
+ <row>
+ <entry>When</entry>
+ <entry>The administrator opens the "Add User" screen</entry>
+ </row>
+ <row>
+ <entry>Then</entry>
+ <entry>There is a list of LDAP users displayed but the user is present in the list</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para/>
+ <informaltable>
+ <tgroup cols="2">
+ <tbody>
+ <row>
+ <entry>Given</entry>
+ <entry>An administrator wants to add a new user to cloudstack, LDAP is setup and the user is not in the query group</entry>
+ </row>
+ <row>
+ <entry>When</entry>
+ <entry>The administrator opens the "Add User" screen</entry>
+ </row>
+ <row>
+ <entry>Then</entry>
+ <entry>There is a list of LDAP users displayed but the user is not in the list</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para/>
+ <informaltable>
+ <tgroup cols="2">
+ <tbody>
+ <row>
+ <entry>Given</entry>
+ <entry>An administrator wants to add a group of new users to cloudstack</entry>
+ </row>
+ <row>
+ <entry>When</entry>
+ <entry>The administrator opens the "Add User" screen, selects the users and hits save</entry>
+ </row>
+ <row>
+ <entry>Then</entry>
+ <entry>The list of new users are saved to the database</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para/>
+ <informaltable>
+ <tgroup cols="2">
+ <tbody>
+ <row>
+ <entry>Given</entry>
+ <entry>An administrator has created a new LDAP user on cloudstack</entry>
+ </row>
+ <row>
+ <entry>When</entry>
+ <entry>The user authenticates against cloudstack with the right credentials</entry>
+ </row>
+ <row>
+ <entry>Then</entry>
+ <entry>They are authorised in cloudstack</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para/>
+ <informaltable>
+ <tgroup cols="2">
+ <tbody>
+ <row>
+ <entry>Given</entry>
+ <entry>A user wants to edit an LDAP user</entry>
+ </row>
+ <row>
+ <entry>When</entry>
+ <entry>They open the "Edit User" screen</entry>
+ </row>
+ <row>
+ <entry>Then</entry>
+ <entry>The password fields are disabled and cannot be changed</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ <para/>
+ </section>
+ <section id="the-design-document">
+ <title>The Design Document</title>
+ <para>
+ <emphasis role="bold">
+ LDAP user list service
+ </emphasis>
+ </para>
+ <para>
+ <emphasis role="bold">name:</emphasis> ldapUserList
+ </para>
+ <para>
+ <emphasis role="bold">responseObject:</emphasis> LDAPUserResponse {username,email,name}
+ </para>
+ <para>
+ <emphasis role="bold">parameter:</emphasis> listType:enum {NEW, EXISTING,ALL} (Default to ALL if no option provided)
+ </para>
+ <para>
+ Create a new API service call for retreiving the list of users from LDAP. This will call a new
+ ConfigurationService which will retrieve the list of users using the configured search base and the query
+ filter. The list may be filtered in the ConfigurationService based on listType parameter
+ </para>
+ <para>
+ <emphasis role="bold">
+ LDAP Available Service
+ </emphasis>
+ </para>
+ <para>
+ <emphasis role="bold">name:</emphasis> ldapAvailable
+ </para>
+ <para>
+ <emphasis role="bold">responseObject</emphasis> LDAPAvailableResponse {available:boolean}
+ </para>
+ <para>
+ Create a new API service call veriying LDAP is setup correctly verifying the following configuration elements are all set:
+ <itemizedlist>
+ <listitem>
+ <para>ldap.hostname</para>
+ </listitem>
+ <listitem>
+ <para>ldap.port</para>
+ </listitem>
+ <listitem>
+ <para>ldap.usessl</para>
+ </listitem>
+ <listitem>
+ <para>ldap.queryfilter</para>
+ </listitem>
+ <listitem>
+ <para>ldap.searchbase</para>
+ </listitem>
+ <listitem>
+ <para>ldap.dn</para>
+ </listitem>
+ <listitem>
+ <para>ldap.password</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ <emphasis role="bold">
+ LDAP Save Users Service
+ </emphasis>
+ </para>
+ <para>
+ <emphasis role="bold">name:</emphasis> ldapSaveUsers
+ </para>
+ <para>
+ <emphasis role="bold">responseObject:</emphasis> LDAPSaveUsersRssponse {list<![CDATA[<UserResponse>]]>}
+ </para>
+ <para>
+ <emphasis role="bold">parameter:</emphasis> list of users
+ </para>
+ <para>
+ Saves the list of objects instead. Following the functionality in CreateUserCmd it will
+ <itemizedlist>
+ <listitem>
+ <para>Create the user via the account service</para>
+ </listitem>
+ <listitem>
+ <para>Handle the response</para>
+ </listitem>
+ </itemizedlist>
+ It will be decided whether a transation should remain over whole save or only over individual users. A list of UserResponse will be returned.
+ </para>
+ <para>
+ <emphasis role="bold">
+ Extension of cloudstack UI "Add User" screen
+ </emphasis>
+ </para>
+ <para>
+ Extend account.js enable the adding of a list of users with editable fields where required. The new "add user" screen for LDAP setup will:
+ <itemizedlist>
+ <listitem>
+ <para>Make an ajax call to the ldapAvailable, ldapuserList and ldapSaveUsers services</para>
+ </listitem>
+ <listitem>
+ <para>Validate on username, email, firstname and lastname</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ <emphasis role="bold">
+ Extension of cloudstack UI "Edit User" screen
+ </emphasis>
+ </para>
+ <para>
+ Extend account.js to disable the password fields on the edit user screen if LDAP available, specifically:
+ <itemizedlist>
+ <listitem>
+ <para>Make an ajax call to the ldapAvailable, ldapuserList and ldapSaveUsers services</para>
+ </listitem>
+ <listitem>
+ <para>Validate on username, email, firstname and lastname. Additional server validation will nsure the password has not changed</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </section>
+ <section id="approach">
+ <title>Approach</title>
+ <para>
+ To get started a development cloudstack environment will be created with DevCloud used to verify changes. Once the schedule is agreed with the mentor the deliverables will be broken into small user stories with expected delivery dates set. The development cycle will focus on BDD, enforcing all unit and acceptance tests are written first.
+ </para>
+ <para>
+ A build pipe line for continious delivery environment around cloudstack will be implemented, the following stages will be adopted:
+ </para>
+ <informaltable>
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Stage</entry>
+ <entry>Action</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Commit</entry>
+ <entry>Run unit tests</entry>
+ </row>
+ <row>
+ <entry>Sonar</entry>
+ <entry>Runs code quality metrics</entry>
+ </row>
+ <row>
+ <entry>Acceptance</entry>
+ <entry>Deploys the devcloud and runs all acceptance tests</entry>
+ </row>
+ <row>
+ <entry>Deployment</entry>
+ <entry>Deploy a new management server using Chef</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </section>
+ <section id="about-me">
+ <title>About me</title>
+ <para>
+ I am a Computer Science Student at Dublin City University in Ireland. I have interests in virtualization,
+automation, information systems, networking and web development
+ </para>
+ <para>
+ I was involved with a project in a K-12(educational) environment of moving their server systems over
+to a virtualized environment on ESXi. I have good knowledge of programming in Java, PHP and
+Scripting langages. During the configuration of an automation system for OS deployment I experienced
+some exposure to scripting in powershell, batch, vbs and bash and configuration of PXE images based
+of WinPE and Debian.
+Additionally I am also a mentor in an opensource teaching movement called CoderDojo, we teach kids
+from the age of 8 everything from web page, HTML 5 game and raspberry pi development. It's really
+cool.
+ </para>
+ <para>
+ I’m excited at the opportunity and learning experience that cloudstack are offering with this project.
+ </para>
+ </section>
+</chapter>
[02/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
List view widget: Support 'listView' selection for actions
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/88a62ab8
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/88a62ab8
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/88a62ab8
Branch: refs/heads/vmsync
Commit: 88a62ab890346c3fe5fe0963dcda92cca1560d47
Parents: 5fa1ad5
Author: Brian Federle <br...@citrix.com>
Authored: Wed Jun 5 16:20:05 2013 -0700
Committer: Brian Federle <br...@citrix.com>
Committed: Wed Jun 5 16:20:05 2013 -0700
----------------------------------------------------------------------
ui/scripts/ui/widgets/listView.js | 27 ++++++++++++++++++++++++++-
1 file changed, 26 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/88a62ab8/ui/scripts/ui/widgets/listView.js
----------------------------------------------------------------------
diff --git a/ui/scripts/ui/widgets/listView.js b/ui/scripts/ui/widgets/listView.js
index d68f91f..ba4d288 100644
--- a/ui/scripts/ui/widgets/listView.js
+++ b/ui/scripts/ui/widgets/listView.js
@@ -25,6 +25,7 @@
var messages = args.action ? args.action.messages : {};
var preAction = args.action ? args.action.preAction : {};
var action = args.action ? args.action.action : {};
+ var needsRefresh = args.action.needsRefresh;
var section;
var data = {
id: $instanceRow.data('list-view-item-id'),
@@ -142,6 +143,12 @@
$item: $instanceRow
});
} else {
+ if (needsRefresh) {
+ var $loading = $('<div>').addClass('loading-overlay');
+
+ $listView.prepend($loading);
+ }
+
var actionArgs = {
data: data,
ref: options.ref,
@@ -206,6 +213,15 @@
$instanceRow.data('json-obj'),
actionFilter);
}
+
+ if (needsRefresh) {
+ if ($listView.closest('.detail-view').size()) {
+ $('.detail-view:last .button.refresh').click();
+ } else {
+ $loading.remove();
+ $listView.listView('refresh');
+ }
+ }
}
if (additional && additional.complete)
@@ -293,7 +309,8 @@
if (!args.action.action.externalLink &&
!args.action.createForm &&
args.action.addRow != 'true' &&
- !action.custom && !action.uiCustom) {
+ !action.custom && !action.uiCustom &&
+ !args.action.listView) {
cloudStack.dialog.confirm({
message: messages.confirm(messageArgs),
action: function() {
@@ -306,6 +323,14 @@
});
} else if (action.custom || action.uiCustom) {
performAction();
+ } else if (args.action.listView) {
+ cloudStack.dialog.listView({
+ context: context,
+ listView: args.action.listView,
+ after: function(args) {
+ performAction(null, { context: args.context });
+ }
+ });
} else {
var addRow = args.action.addRow == "false" ? false : true;
var isHeader = args.action.isHeader;
[10/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/cloudstack
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/89fa121a
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/89fa121a
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/89fa121a
Branch: refs/heads/vmsync
Commit: 89fa121a0cfb2bca978d4c72a91c1ba33326af68
Parents: 3ec7f8b 4c397da
Author: Sateesh Chodapuneedi <sa...@apache.org>
Authored: Thu Jun 6 14:34:50 2013 +0530
Committer: Sateesh Chodapuneedi <sa...@apache.org>
Committed: Thu Jun 6 14:34:50 2013 +0530
----------------------------------------------------------------------
docs/en-US/CloudStack_GSoC_Guide.ent | 22 ++
docs/en-US/CloudStack_GSoC_Guide.xml | 52 +++++
docs/en-US/gsoc-tuna.xml | 28 +++
docs/en-US/multiple-ip-range.xml | 3 +-
docs/en-US/pvlan.xml | 57 +++++
docs/publican-gsoc-2013.cfg | 27 +++
.../schema/src/com/cloud/vm/dao/UserVmDao.java | 3 +-
.../src/com/cloud/vm/dao/UserVmDaoImpl.java | 3 +-
.../lb/LoadBalancingRulesManagerImpl.java | 5 +-
server/src/com/cloud/vm/UserVmManagerImpl.java | 2 +-
test/integration/smoke/test_internal_lb.py | 4 +-
test/integration/smoke/test_iso.py | 2 +-
test/integration/smoke/test_network_acl.py | 224 ++++++++++++-------
.../integration/smoke/test_service_offerings.py | 9 +
test/integration/smoke/test_templates.py | 2 +-
.../definitions/systemvmtemplate/postinstall.sh | 2 +-
.../systemvmtemplate64/postinstall.sh | 2 +-
tools/devcloud-kvm/devcloud-kvm.cfg | 2 +-
tools/devcloud/devcloud.cfg | 2 +-
tools/devcloud/devcloud_internal-mgt.cfg | 2 +-
tools/devcloud/quickcloud.cfg | 2 +-
tools/marvin/marvin/configGenerator.py | 8 +-
tools/marvin/marvin/integration/lib/base.py | 96 +++++++-
tools/marvin/marvin/jsonHelper.py | 4 +-
ui/modules/vpc/vpc.css | 11 +
ui/modules/vpc/vpc.js | 8 +
ui/scripts/ui/widgets/listView.js | 27 ++-
ui/scripts/vpc.js | 209 +++++++++++++++--
28 files changed, 680 insertions(+), 138 deletions(-)
----------------------------------------------------------------------
[06/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
CLOUDSTACK-747: Internal LB detailView - Assigned VMs tab - Assign VMs action - trigger a refresh for the listView after action is finished.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/bdada274
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/bdada274
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/bdada274
Branch: refs/heads/vmsync
Commit: bdada2741667185e9a84fd7d3ddddd2c307935c9
Parents: 5a64377
Author: Jessica Wang <je...@apache.org>
Authored: Wed Jun 5 17:20:17 2013 -0700
Committer: Jessica Wang <je...@apache.org>
Committed: Wed Jun 5 17:20:17 2013 -0700
----------------------------------------------------------------------
ui/scripts/vpc.js | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/bdada274/ui/scripts/vpc.js
----------------------------------------------------------------------
diff --git a/ui/scripts/vpc.js b/ui/scripts/vpc.js
index af77545..e666ab9 100644
--- a/ui/scripts/vpc.js
+++ b/ui/scripts/vpc.js
@@ -693,7 +693,13 @@
success: function(data) {
var jid = data.assigntoloadbalancerruleresponse.jobid;
args.response.success({
- _custom: { jobId: jid }
+ _custom: {
+ jobId: jid,
+ getUpdatedItem: function(json) {
+ $('.list-view').listView('refresh');
+ //return json.queryasyncjobresultresponse.jobresult.volume;
+ }
+ }
});
}
});
[43/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
CLOUDSTACK-2350: Anti-Affinity - As admin user, when tryinto update the affinity group for a Vm that is deployed by a regular user , he is presented with admin's affinity groups.
Changes:
- listAffinityGroups API takes in accountname and domainId parameter
- For admin, listall=true should return all affinity groups of all users
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/8c9f681f
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/8c9f681f
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/8c9f681f
Branch: refs/heads/vmsync
Commit: 8c9f681f9eba377d1eee279329090fbbdc46c5ab
Parents: ce17f85
Author: Prachi Damle <pr...@cloud.com>
Authored: Fri Jun 7 15:27:39 2013 -0700
Committer: Prachi Damle <pr...@cloud.com>
Committed: Fri Jun 7 15:28:28 2013 -0700
----------------------------------------------------------------------
.../affinitygroup/ListAffinityGroupsCmd.java | 7 +++--
.../apache/cloudstack/query/QueryService.java | 3 +-
.../com/cloud/api/query/QueryManagerImpl.java | 33 +++++++++++---------
.../src/com/cloud/user/AccountManagerImpl.java | 4 +++
4 files changed, 29 insertions(+), 18 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8c9f681f/api/src/org/apache/cloudstack/api/command/user/affinitygroup/ListAffinityGroupsCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/affinitygroup/ListAffinityGroupsCmd.java b/api/src/org/apache/cloudstack/api/command/user/affinitygroup/ListAffinityGroupsCmd.java
index 9310fb9..d966a4c 100644
--- a/api/src/org/apache/cloudstack/api/command/user/affinitygroup/ListAffinityGroupsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/affinitygroup/ListAffinityGroupsCmd.java
@@ -19,7 +19,7 @@ package org.apache.cloudstack.api.command.user.affinitygroup;
import org.apache.cloudstack.affinity.AffinityGroupResponse;
import org.apache.cloudstack.api.APICommand;
import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.BaseListCmd;
+import org.apache.cloudstack.api.BaseListAccountResourcesCmd;
import org.apache.cloudstack.api.Parameter;
import org.apache.cloudstack.api.response.ListResponse;
import org.apache.cloudstack.api.response.UserVmResponse;
@@ -28,7 +28,7 @@ import org.apache.log4j.Logger;
import com.cloud.async.AsyncJob;
@APICommand(name = "listAffinityGroups", description = "Lists affinity groups", responseObject = AffinityGroupResponse.class)
-public class ListAffinityGroupsCmd extends BaseListCmd {
+public class ListAffinityGroupsCmd extends BaseListAccountResourcesCmd {
public static final Logger s_logger = Logger.getLogger(ListAffinityGroupsCmd.class.getName());
private static final String s_name = "listaffinitygroupsresponse";
@@ -77,7 +77,8 @@ public class ListAffinityGroupsCmd extends BaseListCmd {
public void execute(){
ListResponse<AffinityGroupResponse> response = _queryService.listAffinityGroups(id, affinityGroupName,
- affinityGroupType, virtualMachineId, this.getStartIndex(), this.getPageSizeVal());
+ affinityGroupType, virtualMachineId, this.getAccountName(), this.getDomainId(), this.isRecursive(),
+ this.listAll(), this.getStartIndex(), this.getPageSizeVal());
response.setResponseName(getCommandName());
this.setResponseObject(response);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8c9f681f/api/src/org/apache/cloudstack/query/QueryService.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/query/QueryService.java b/api/src/org/apache/cloudstack/query/QueryService.java
index 2dfd97c..73e393b 100644
--- a/api/src/org/apache/cloudstack/query/QueryService.java
+++ b/api/src/org/apache/cloudstack/query/QueryService.java
@@ -86,7 +86,8 @@ public interface QueryService {
public ListResponse<ZoneResponse> listDataCenters(ListZonesByCmd cmd);
public ListResponse<AffinityGroupResponse> listAffinityGroups(Long affinityGroupId, String affinityGroupName,
- String affinityGroupType, Long vmId, Long startIndex, Long pageSize);
+ String affinityGroupType, Long vmId, String accountName, Long domainId, boolean isRecursive,
+ boolean listAll, Long startIndex, Long pageSize);
public List<ResourceDetailResponse> listResource(ListResourceDetailsCmd cmd);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8c9f681f/server/src/com/cloud/api/query/QueryManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/QueryManagerImpl.java b/server/src/com/cloud/api/query/QueryManagerImpl.java
index 28aecfc..beda75e 100644
--- a/server/src/com/cloud/api/query/QueryManagerImpl.java
+++ b/server/src/com/cloud/api/query/QueryManagerImpl.java
@@ -2401,9 +2401,10 @@ public class QueryManagerImpl extends ManagerBase implements QueryService {
@Override
public ListResponse<AffinityGroupResponse> listAffinityGroups(Long affinityGroupId, String affinityGroupName,
- String affinityGroupType, Long vmId, Long startIndex, Long pageSize) {
+ String affinityGroupType, Long vmId, String accountName, Long domainId, boolean isRecursive,
+ boolean listAll, Long startIndex, Long pageSize) {
Pair<List<AffinityGroupJoinVO>, Integer> result = listAffinityGroupsInternal(affinityGroupId,
- affinityGroupName, affinityGroupType, vmId, startIndex, pageSize);
+ affinityGroupName, affinityGroupType, vmId, accountName, domainId, isRecursive, listAll, startIndex, pageSize);
ListResponse<AffinityGroupResponse> response = new ListResponse<AffinityGroupResponse>();
List<AffinityGroupResponse> agResponses = ViewResponseHelper.createAffinityGroupResponses(result.first());
response.setResponses(agResponses, result.second());
@@ -2412,12 +2413,12 @@ public class QueryManagerImpl extends ManagerBase implements QueryService {
public Pair<List<AffinityGroupJoinVO>, Integer> listAffinityGroupsInternal(Long affinityGroupId,
- String affinityGroupName, String affinityGroupType, Long vmId, Long startIndex, Long pageSize) {
+ String affinityGroupName, String affinityGroupType, Long vmId, String accountName, Long domainId,
+ boolean isRecursive, boolean listAll, Long startIndex, Long pageSize) {
Account caller = UserContext.current().getCaller();
Long accountId = caller.getAccountId();
- Long domainId = caller.getDomainId();
if (vmId != null) {
UserVmVO userVM = _userVmDao.findById(vmId);
@@ -2429,20 +2430,25 @@ public class QueryManagerImpl extends ManagerBase implements QueryService {
return listAffinityGroupsByVM(vmId.longValue(), startIndex, pageSize);
}
+ List<Long> permittedAccounts = new ArrayList<Long>();
+ Ternary<Long, Boolean, ListProjectResourcesCriteria> domainIdRecursiveListProject = new Ternary<Long, Boolean, ListProjectResourcesCriteria>(
+ domainId, isRecursive, null);
+ _accountMgr.buildACLSearchParameters(caller, affinityGroupId, accountName, null, permittedAccounts,
+ domainIdRecursiveListProject, listAll, true);
+ domainId = domainIdRecursiveListProject.first();
+ isRecursive = domainIdRecursiveListProject.second();
+ ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third();
+
Filter searchFilter = new Filter(AffinityGroupJoinVO.class, "id", true, startIndex, pageSize);
SearchBuilder<AffinityGroupJoinVO> groupSearch = _affinityGroupJoinDao.createSearchBuilder();
+ _accountMgr.buildACLViewSearchBuilder(groupSearch, domainId, isRecursive, permittedAccounts,
+ listProjectResourcesCriteria);
+
groupSearch.select(null, Func.DISTINCT, groupSearch.entity().getId()); // select
// distinct
SearchCriteria<AffinityGroupJoinVO> sc = groupSearch.create();
-
- if (accountId != null) {
- sc.addAnd("accountId", SearchCriteria.Op.EQ, accountId);
- }
-
- if (domainId != null) {
- sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId);
- }
+ _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);
if (affinityGroupId != null) {
sc.addAnd("id", SearchCriteria.Op.EQ, affinityGroupId);
@@ -2457,8 +2463,7 @@ public class QueryManagerImpl extends ManagerBase implements QueryService {
}
- Pair<List<AffinityGroupJoinVO>, Integer> uniqueGroupsPair = _affinityGroupJoinDao.searchAndCount(sc,
- searchFilter);
+ Pair<List<AffinityGroupJoinVO>, Integer> uniqueGroupsPair = _affinityGroupJoinDao.searchAndCount(sc, searchFilter);
// search group details by ids
Integer count = uniqueGroupsPair.second();
if (count.intValue() == 0) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8c9f681f/server/src/com/cloud/user/AccountManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/user/AccountManagerImpl.java b/server/src/com/cloud/user/AccountManagerImpl.java
index 0d89639..6b4bf0e 100755
--- a/server/src/com/cloud/user/AccountManagerImpl.java
+++ b/server/src/com/cloud/user/AccountManagerImpl.java
@@ -2208,6 +2208,10 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
domainIdRecursiveListProject.second(true);
}
}
+ } else if (domainId != null) {
+ if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL) {
+ permittedAccounts.add(caller.getId());
+ }
}
}
[18/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
check for null protocol while validating ACL item
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/aa2fb311
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/aa2fb311
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/aa2fb311
Branch: refs/heads/vmsync
Commit: aa2fb311124599113ee73e00b583683976be615f
Parents: cc7e9ee
Author: Kishan Kavala <ki...@cloud.com>
Authored: Wed Jun 5 16:40:24 2013 +0530
Committer: Kishan Kavala <ki...@cloud.com>
Committed: Thu Jun 6 19:02:44 2013 +0530
----------------------------------------------------------------------
.../network/vpc/NetworkACLServiceImpl.java | 40 ++++++++++----------
1 file changed, 21 insertions(+), 19 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aa2fb311/server/src/com/cloud/network/vpc/NetworkACLServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/NetworkACLServiceImpl.java b/server/src/com/cloud/network/vpc/NetworkACLServiceImpl.java
index d6e86e2..4ad22d9 100644
--- a/server/src/com/cloud/network/vpc/NetworkACLServiceImpl.java
+++ b/server/src/com/cloud/network/vpc/NetworkACLServiceImpl.java
@@ -303,28 +303,30 @@ public class NetworkACLServiceImpl extends ManagerBase implements NetworkACLServ
}
//Validate Protocol
- //Check if protocol is a number
- if(StringUtils.isNumeric(protocol)){
- int protoNumber = Integer.parseInt(protocol);
- if(protoNumber < 0 || protoNumber > 255){
- throw new InvalidParameterValueException("Invalid protocol number: " + protoNumber);
- }
- } else {
- //Protocol is not number
- //Check for valid protocol strings
- String supportedProtocols = "tcp,udp,icmp,all";
- if(!supportedProtocols.contains(protocol.toLowerCase())){
- throw new InvalidParameterValueException("Invalid protocol: " + protocol);
+ if(protocol != null){
+ //Check if protocol is a number
+ if(StringUtils.isNumeric(protocol)){
+ int protoNumber = Integer.parseInt(protocol);
+ if(protoNumber < 0 || protoNumber > 255){
+ throw new InvalidParameterValueException("Invalid protocol number: " + protoNumber);
+ }
+ } else {
+ //Protocol is not number
+ //Check for valid protocol strings
+ String supportedProtocols = "tcp,udp,icmp,all";
+ if(!supportedProtocols.contains(protocol.toLowerCase())){
+ throw new InvalidParameterValueException("Invalid protocol: " + protocol);
+ }
}
- }
- // icmp code and icmp type can't be passed in for any other protocol rather than icmp
- if (!protocol.equalsIgnoreCase(NetUtils.ICMP_PROTO) && (icmpCode != null || icmpType != null)) {
- throw new InvalidParameterValueException("Can specify icmpCode and icmpType for ICMP protocol only");
- }
+ // icmp code and icmp type can't be passed in for any other protocol rather than icmp
+ if (!protocol.equalsIgnoreCase(NetUtils.ICMP_PROTO) && (icmpCode != null || icmpType != null)) {
+ throw new InvalidParameterValueException("Can specify icmpCode and icmpType for ICMP protocol only");
+ }
- if (protocol.equalsIgnoreCase(NetUtils.ICMP_PROTO) && (portStart != null || portEnd != null)) {
- throw new InvalidParameterValueException("Can't specify start/end port when protocol is ICMP");
+ if (protocol.equalsIgnoreCase(NetUtils.ICMP_PROTO) && (portStart != null || portEnd != null)) {
+ throw new InvalidParameterValueException("Can't specify start/end port when protocol is ICMP");
+ }
}
//validate icmp code and type
[26/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
CLOUDSTACK-747: Internal LB detailView - Assigned VMs tab - Assign VMs action - Select VM view - refresh assignedVMs data by API call when popping up Select VM view.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/55417858
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/55417858
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/55417858
Branch: refs/heads/vmsync
Commit: 554178582709e51ef934fa2684b281e83f3a3ed5
Parents: f61d61d
Author: Jessica Wang <je...@apache.org>
Authored: Thu Jun 6 16:04:31 2013 -0700
Committer: Jessica Wang <je...@apache.org>
Committed: Thu Jun 6 16:07:49 2013 -0700
----------------------------------------------------------------------
ui/scripts/vpc.js | 24 ++++++++++++++++++------
1 file changed, 18 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/55417858/ui/scripts/vpc.js
----------------------------------------------------------------------
diff --git a/ui/scripts/vpc.js b/ui/scripts/vpc.js
index a087baa..399699d 100644
--- a/ui/scripts/vpc.js
+++ b/ui/scripts/vpc.js
@@ -651,7 +651,21 @@
listView: $.extend(true, {}, cloudStack.sections.instances.listView, {
type: 'checkbox',
filters: false,
- dataProvider: function(args) {
+ dataProvider: function(args) {
+ var assignedInstances;
+ $.ajax({
+ url: createURL('listLoadBalancers'),
+ data: {
+ id: args.context.internalLoadBalancers[0].id
+ },
+ async: false,
+ success: function(json) {
+ assignedInstances = json.listloadbalancerssresponse.loadbalancer[0].loadbalancerinstance;
+ if(assignedInstances == null)
+ assignedInstances = [];
+ }
+ });
+
$.ajax({
url: createURL('listVirtualMachines'),
data: {
@@ -663,11 +677,9 @@
// Pre-select existing instances in LB rule
$(instances).map(function(index, instance) {
- instance._isSelected = $.grep(
- args.context.internalLoadBalancers[0].loadbalancerinstance,
-
- function(lbInstance) {
- return lbInstance.id == instance.id;
+ instance._isSelected = $.grep(assignedInstances,
+ function(assignedInstance) {
+ return assignedInstance.id == instance.id;
}
).length ? true : false;
});
[40/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/cloudstack
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/e218a6dc
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/e218a6dc
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/e218a6dc
Branch: refs/heads/vmsync
Commit: e218a6dcfd8ce514ff04df0631ea5fa6ac31cf8b
Parents: 5dc7387 195e823
Author: Sateesh Chodapuneedi <sa...@apache.org>
Authored: Fri Jun 7 17:08:23 2013 +0530
Committer: Sateesh Chodapuneedi <sa...@apache.org>
Committed: Fri Jun 7 17:08:23 2013 +0530
----------------------------------------------------------------------
test/integration/smoke/test_vm_life_cycle.py | 9 +++++++++
1 file changed, 9 insertions(+)
----------------------------------------------------------------------
[39/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
CLOUDSTACK-2882: Fix the diskdevice based on hypervisor
KVM > /dev/vda
Xen > /dev/xvdd
Signed-off-by: Prasanna Santhanam <ts...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/195e823b
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/195e823b
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/195e823b
Branch: refs/heads/vmsync
Commit: 195e823b10c5519f90aefa74a0cb104f0ff57b07
Parents: 5233e32
Author: Prasanna Santhanam <ts...@apache.org>
Authored: Fri Jun 7 16:23:06 2013 +0530
Committer: Prasanna Santhanam <ts...@apache.org>
Committed: Fri Jun 7 17:08:19 2013 +0530
----------------------------------------------------------------------
test/integration/smoke/test_vm_life_cycle.py | 9 +++++++++
1 file changed, 9 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/195e823b/test/integration/smoke/test_vm_life_cycle.py
----------------------------------------------------------------------
diff --git a/test/integration/smoke/test_vm_life_cycle.py b/test/integration/smoke/test_vm_life_cycle.py
index 8c78149..afe9b8a 100644
--- a/test/integration/smoke/test_vm_life_cycle.py
+++ b/test/integration/smoke/test_vm_life_cycle.py
@@ -730,6 +730,15 @@ class TestVMLifeCycle(cloudstackTestCase):
cmd.virtualmachineid = self.virtual_machine.id
self.apiclient.attachIso(cmd)
+ #determine device type from hypervisor
+ hosts = Host.list(self.apiclient, id=self.virtual_machine.hostid)
+ self.assertTrue(isinstance(hosts, list))
+ self.assertTrue(len(hosts) > 0)
+ self.debug("Found %s host" % hosts[0].hypervisor)
+
+ if hosts[0].hypervisor.lower() == "kvm":
+ self.services["diskdevice"] = "/dev/vda"
+
try:
ssh_client = self.virtual_machine.get_ssh_client()
except Exception as e:
[25/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
CLOUDSTACK-2875: allow port 8080 on virtual router so that vm can get password from virtual router
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/f61d61db
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/f61d61db
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/f61d61db
Branch: refs/heads/vmsync
Commit: f61d61db9490eb28d2feedbef0d329479a66aede
Parents: f4a1a2f
Author: Wei Zhou <w....@leaseweb.com>
Authored: Thu Jun 6 23:05:12 2013 +0200
Committer: Wei Zhou <w....@leaseweb.com>
Committed: Thu Jun 6 23:05:12 2013 +0200
----------------------------------------------------------------------
patches/systemvm/debian/config/etc/iptables/iptables-router | 1 +
1 file changed, 1 insertion(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f61d61db/patches/systemvm/debian/config/etc/iptables/iptables-router
----------------------------------------------------------------------
diff --git a/patches/systemvm/debian/config/etc/iptables/iptables-router b/patches/systemvm/debian/config/etc/iptables/iptables-router
index 3f5bc5f..b214e40 100644
--- a/patches/systemvm/debian/config/etc/iptables/iptables-router
+++ b/patches/systemvm/debian/config/etc/iptables/iptables-router
@@ -37,6 +37,7 @@ COMMIT
-A INPUT -i eth0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i eth1 -p tcp -m state --state NEW --dport 3922 -j ACCEPT
-A INPUT -i eth0 -p tcp -m state --state NEW --dport 80 -j ACCEPT
+-A INPUT -i eth0 -p tcp -m state --state NEW --dport 8080 -j ACCEPT
-A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth2 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o eth0 -m state --state NEW -j ACCEPT
[42/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
CLOUDSTACK-2811: Default add primary storage dialog to scope=cluster
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/ce17f856
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/ce17f856
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/ce17f856
Branch: refs/heads/vmsync
Commit: ce17f856eacce32e09b43dd955d5e2da2a678766
Parents: da5c461
Author: Brian Federle <br...@citrix.com>
Authored: Fri Jun 7 11:05:01 2013 -0700
Committer: Brian Federle <br...@citrix.com>
Committed: Fri Jun 7 11:05:01 2013 -0700
----------------------------------------------------------------------
ui/scripts/system.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ce17f856/ui/scripts/system.js
----------------------------------------------------------------------
diff --git a/ui/scripts/system.js b/ui/scripts/system.js
index e3d7b41..f853ed5 100644
--- a/ui/scripts/system.js
+++ b/ui/scripts/system.js
@@ -11425,8 +11425,8 @@
label: 'label.scope',
select: function(args) {
var scope = [
- { id: 'zone', description: _l('label.zone.wide') },
- { id: 'cluster', description: _l('label.cluster') }
+ { id: 'cluster', description: _l('label.cluster') },
+ { id: 'zone', description: _l('label.zone.wide') }
// { id: 'host', description: _l('label.host') }
];
[05/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
CLOUDSTACK-747: UI - Internal LB detailView - remove AssignVM action in Details Tab (which has been replaced with the one in Assigned VMs tab).
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/5a643774
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/5a643774
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/5a643774
Branch: refs/heads/vmsync
Commit: 5a6437749ee15a927f612fb5f860dc3201d64c60
Parents: 42a549e
Author: Jessica Wang <je...@apache.org>
Authored: Wed Jun 5 17:07:23 2013 -0700
Committer: Jessica Wang <je...@apache.org>
Committed: Wed Jun 5 17:07:23 2013 -0700
----------------------------------------------------------------------
ui/scripts/vpc.js | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5a643774/ui/scripts/vpc.js
----------------------------------------------------------------------
diff --git a/ui/scripts/vpc.js b/ui/scripts/vpc.js
index 2252387..af77545 100644
--- a/ui/scripts/vpc.js
+++ b/ui/scripts/vpc.js
@@ -445,6 +445,7 @@
isMaximized: true,
name: 'Internal LB details',
actions: {
+ /*
assignVm: {
label: 'Assign VMs to Internal LB',
messages: {
@@ -508,7 +509,8 @@
notification: {
poll: pollAsyncJobResult
}
- },
+ },
+ */
remove: {
label: 'Delete Internal LB',
messages: {
[31/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
my gsoc proposal document
Signed-off-by: Sebastien Goasguen <ru...@gmail.com>
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/1bdb6266
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/1bdb6266
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/1bdb6266
Branch: refs/heads/vmsync
Commit: 1bdb6266c6b263684db229accd4f0a4a330f203a
Parents: cc7e9ee
Author: tuna <ng...@gmail.com>
Authored: Thu Jun 6 23:46:18 2013 +0700
Committer: Sebastien Goasguen <ru...@gmail.com>
Committed: Fri Jun 7 02:59:17 2013 -0400
----------------------------------------------------------------------
docs/en-US/gsoc-tuna.xml | 203 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 203 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1bdb6266/docs/en-US/gsoc-tuna.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/gsoc-tuna.xml b/docs/en-US/gsoc-tuna.xml
index 68032a8..0988734 100644
--- a/docs/en-US/gsoc-tuna.xml
+++ b/docs/en-US/gsoc-tuna.xml
@@ -25,4 +25,207 @@
<chapter id="gsoc-tuna">
<title>Nguyen's 2013 GSoC Proposal</title>
<para>This chapter describes Nguyen 2013 Google Summer of Code project within the &PRODUCT; ASF project. It is a copy paste of the submitted proposal.</para>
+ <section id="add-xen-xcp-support-for-gre-sdn-controller">
+ <title>Add Xen/XCP support for GRE SDN controller</title>
+ <para>
+ "This project aims to enhance the current native SDN controller in supporting Xen/XCP and integrate successfully the open source SDN controller (FloodLight) driving Open vSwitch through its interfaces."
+ </para>
+ </section>
+ <section id="Abstract">
+ <title>Abstract</title>
+ <para>
+ SDN, standing for Software-Defined Networking, is an approach to building data network equipments and softwares. It were invented by ONRC, Stanford University. SDN basically decouples the control from physical networking boxes and given to a software application called a controller. SDN has three parts: controller, protocols and switch; In which, OpenFlow is an open standard to deploy innovative protocols. Nowaday, more and more datacenters use SDN instead of traditional physical networking boxes. For example, Google announced that they completely built its own switches and SDN confrollers for use in its internal backbone network.
+ </para>
+ <para>
+ OpenvSwitch, an open source software switch, is widely used as a virtual switch in virtualized server environments. It can currently run on any Linux-based virtualization platform, such as: KVM, Xen (XenServer, XCP, Xen hypervisor), VirtualBox... It also has been ported to a number of different operating systems and hardware platforms: Linux, FreeBSD, Windows and even non-POSIX embedded systems. In cloud computing IaaS, using OpenvSwitch instead of Linux bridge on compute nodes becomes an inevitable trend because of its powerful features and the ability of OpenFlow integration as well.
+ </para>
+ <para>
+ In CloudStack, we already have a native SDN controller. With KVM hypervisor, developers can easily install OpenvSwitch module; whereas, Xen even has a build-in one. The combination of SDN controller and OpenvSwitch gives us many advanced things. For example, creating GRE tunnels as an isolation method instead of VLAN is a good try. In this project, we are planning to support GRE tunnels in Xen/XCP hypervisor with the native SDN controller. When it's done, substituting open-sources SDN controllers (floodlight, beacon, pox, nox) for the current one is an amazing next step.
+ </para>
+ </section>
+ <section id="design-desription">
+ <title>Design description</title>
+ <para>
+ CloudStack currently has a native SDN Controller that is used to build meshes of GRE tunnels between Xen hosts. There consists of 4 parts: OVS tunnel manager, OVS Dao/VO, Command/Answer and Ovs tunnel plugin. The details are as follow:
+ </para>
+ <para>
+ <emphasis role="bold">OVS tunnel manager:</emphasis> Consist of OvsElement and OvsTunnelManager.
+ </para>
+ <para>
+ OvsElement is used for controlling Ovs tunnel lifecycle (prepare, release)
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>prepare(network, nic, vm, dest): create tunnel for vm on network to dest</para>
+ </listitem>
+ <listitem>
+ <para>release(network, nic, vm): destroy tunnel for vm on network</para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ OvsTunnelManager drives bridge configuration and tunnel creation via calling respective commands to Agent.
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>destroyTunnel(vm, network): call OvsDestroyTunnelCommand to destroy tunnel for vm on network</para>
+ </listitem>
+ <listitem>
+ <para>createTunnel(vm, network, dest): call OvsCreateTunnelCommand to create tunnel for vm on network to dest</para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ <emphasis role="bold">OVS tunnel plugin:</emphasis> These are ovstunnel and ovs-vif-flows.py script, writen as XAPI plugin. The OVS tunnel manager will call them via XML-RPC.
+ </para>
+ <para>
+ Ovstunnel plugin calls corresponding vsctl commands for setting up the OVS bridge, creating GRE tunnels or destroying them.
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>setup_ovs_bridge()</para>
+ </listitem>
+ <listitem>
+ <para>destroy_ovs_bridge()</para>
+ </listitem>
+ <listitem>
+ <para>create_tunnel()</para>
+ </listitem>
+ <listitem>
+ <para>destroy_tunnel()</para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ Ovs-vif-flow.py clears or applies rule for VIFs every time it is plugged or unplugged from a OVS bridge.
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>clear_flow()</para>
+ </listitem>
+ <listitem>
+ <para>apply_flow()</para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ <emphasis role="bold">OVS command/answer:</emphasis> It is designed under the format of requests and answers between Manager and Plugin. These commands will correspondence exactly the mentioned manipulations.
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>OvsSetupBridgeCommand</para>
+ </listitem>
+ <listitem>
+ <para>OvsSetupBridgeAnswer</para>
+ </listitem>
+ <listitem>
+ <para>OvsDestroyBridgeCommand</para>
+ </listitem>
+ <listitem>
+ <para>OvsDestroyBridgeAnswer</para>
+ </listitem>
+ <listitem>
+ <para>OvsCreateTunnelCommand</para>
+ </listitem>
+ <listitem>
+ <para>OvsCreateTunnelAnswer</para>
+ </listitem>
+ <listitem>
+ <para>OvsDestroyTunnelCommand</para>
+ </listitem>
+ <listitem>
+ <para>OvsDestroyTunnelAnswer</para>
+ </listitem>
+ <listitem>
+ <para>OvsFetchInterfaceCommand</para>
+ </listitem>
+ <listitem>
+ <para>OvsFetchInterfaceAnswer</para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ <emphasis role="bold">OVS Dao/VO</emphasis>
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>OvsTunnelInterfaceDao</para>
+ </listitem>
+ <listitem>
+ <para>OvsTunnelInterfaceVO</para>
+ </listitem>
+ <listitem>
+ <para>OvsTunnelNetworkDao</para>
+ </listitem>
+ <listitem>
+ <para>OvsTunnelNetworkVO</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+ <section id="integrate-floodLight-as-sdn-controller">
+ <title>Integrate FloodLight as SDN controller</title>
+ <para>
+ I think that we maybe deploy FloodLight Server as a new SystemVM. This VM acts like current SystemVMs. One Floodlight SystemVM per Zone, so it can manage for virtual switches under this zone.
+ </para>
+ </section>
+ <section id="Deliverables">
+ <title>Deliverables</title>
+ <para>
+ GRE has been used as isolation method in CloudStack when deploy with Xen/XCP hosts.
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>User set sdn.ovs.controller parameter in Global Setting to true. He deploys Advance Networking and chooses GRE as isolation method</para>
+ </listitem>
+ <listitem>
+ <para>Make use of Floodlight instead of native SDN controller.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+ <section id="About-me">
+ <title>About me</title>
+ <para>
+ My name is Nguyen Anh Tu, a young and enthusiastic researcher in Cloud Computing Center - Viettel Research and Development Institute, Vietnam. Since last year, we has built Cloud Platform based on CloudStack, starting with version 3.0.2. As the results, some advanced modules were successfully developed, consists of:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>Encrypt Data Volume for VMs.</para>
+ </listitem>
+ <listitem>
+ <para>Dynamic Allocate Memory for VMs by changing policy on Squeeze Daemon.</para>
+ </listitem>
+ <listitem>
+ <para>AutoScale without using NetScale.</para>
+ </listitem>
+ <listitem>
+ <para>Deploy a new SystemVM type for Intrustion Detection System.</para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ Given the working experience and recent researches, I have obtained remarkably the understanding of specific knowledges to carry on this project, details as follow:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>Java source code on CloudStack: Design Pattern, Spring framework.</para>
+ </listitem>
+ <listitem>
+ <para>Bash, Python programming.</para>
+ </listitem>
+ <listitem>
+ <para>XAPI plugin.</para>
+ </listitem>
+ <listitem>
+ <para>XML-RPC.</para>
+ </listitem>
+ <listitem>
+ <para>OpenVSwitch on Xen.</para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ Other knowledges:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>XAPI RRD, XenStore.</para>
+ </listitem>
+ <listitem>
+ <para>Ocaml Programming (XAPI functions).</para>
+ </listitem>
+ </itemizedlist>
+ </section>
</chapter>
[50/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
Merged from master
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/aaa16af2
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/aaa16af2
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/aaa16af2
Branch: refs/heads/vmsync
Commit: aaa16af21193c1bd9435056df11311ca8acdfae9
Parents: 186e62a 91edeb4
Author: Alex Huang <al...@gmail.com>
Authored: Sun Jun 9 17:53:27 2013 -0700
Committer: Alex Huang <al...@gmail.com>
Committed: Sun Jun 9 17:53:27 2013 -0700
----------------------------------------------------------------------
.../tomcatconf/components-simulator.xml.in | 54 -
api/src/com/cloud/agent/api/to/DnsmasqTO.java | 13 +-
api/src/com/cloud/dc/DedicatedResources.java | 33 +
.../cloud/deploy/DeploymentClusterPlanner.java | 3 +-
api/src/com/cloud/event/EventTypes.java | 4 +
.../ha/GlobalLoadBalancingRulesService.java | 3 +
api/src/com/cloud/user/AccountService.java | 8 +-
api/src/com/cloud/vm/VmDiskStats.java | 30 +
api/src/com/cloud/vm/VmStats.java | 8 +
.../affinity/AffinityGroupService.java | 5 +-
.../org/apache/cloudstack/api/ApiConstants.java | 4 +
.../cloudstack/api/ResponseGenerator.java | 22 +-
...ConfigureInternalLoadBalancerElementCmd.java | 5 +-
.../admin/storage/CreateStoragePoolCmd.java | 10 +-
.../FindStoragePoolsForMigrationCmd.java | 10 +-
.../command/admin/vpc/UpdateVPCOfferingCmd.java | 2 +-
.../affinitygroup/DeleteAffinityGroupCmd.java | 6 -
.../affinitygroup/ListAffinityGroupsCmd.java | 7 +-
.../gslb/DeleteGlobalLoadBalancerRuleCmd.java | 12 +-
.../api/command/user/vpc/RestartVPCCmd.java | 2 +-
.../api/command/user/vpc/UpdateVPCCmd.java | 4 +-
.../HypervisorCapabilitiesResponse.java | 32 +
.../api/response/NetworkResponse.java | 12 +
.../StoragePoolForMigrationResponse.java | 249 ----
.../api/response/StoragePoolResponse.java | 21 +-
.../cloudstack/api/response/UserVmResponse.java | 28 +
.../apache/cloudstack/query/QueryService.java | 3 +-
.../org/apache/cloudstack/usage/UsageTypes.java | 8 +
.../classes/resources/messages.properties | 7 +
client/pom.xml | 10 +
client/tomcatconf/applicationContext.xml.in | 12 +-
client/tomcatconf/commands.properties.in | 25 +-
client/tomcatconf/componentContext.xml.in | 32 +-
client/tomcatconf/nonossComponentContext.xml.in | 14 +
.../tomcatconf/simulatorComponentContext.xml.in | 6 +
.../cloud/agent/api/GetVmDiskStatsAnswer.java | 47 +
.../cloud/agent/api/GetVmDiskStatsCommand.java | 54 +
.../agent/api/MigrateWithStorageCommand.java | 12 +
.../com/cloud/agent/api/UnPlugNicCommand.java | 2 +-
.../com/cloud/agent/api/VmDiskStatsEntry.java | 90 ++
core/src/com/cloud/agent/api/VmStatsEntry.java | 48 +
.../virtualnetwork/VirtualRoutingResource.java | 2 +-
.../com/cloud/network/DnsMasqConfigurator.java | 30 +-
developer/pom.xml | 2 +-
docs/en-US/CloudStack_GSoC_Guide.ent | 22 +
docs/en-US/CloudStack_GSoC_Guide.xml | 54 +
docs/en-US/acquire-new-ip-for-vpc.xml | 33 +-
docs/en-US/add-gateway-vpc.xml | 57 +-
docs/en-US/add-loadbalancer-rule-vpc.xml | 359 ++++--
docs/en-US/add-portforward-rule-vpc.xml | 36 +-
docs/en-US/add-tier.xml | 5 +-
docs/en-US/add-vm-to-tier.xml | 14 +-
docs/en-US/build-rpm.xml | 1 +
docs/en-US/configure-acl.xml | 102 +-
docs/en-US/enable-disable-static-nat-vpc.xml | 35 +-
docs/en-US/gsoc-dharmesh.xml | 149 +++
docs/en-US/gsoc-imduffy15.xml | 395 ++++++
docs/en-US/gsoc-tuna.xml | 231 ++++
docs/en-US/guest-ip-ranges.xml | 2 +-
docs/en-US/images/add-new-gateway-vpc.png | Bin 23184 -> 21912 bytes
docs/en-US/images/add-vm-vpc.png | Bin 0 -> 8596 bytes
docs/en-US/images/del-tier.png | Bin 0 -> 815 bytes
docs/en-US/images/mesos-integration-arch.jpg | 0
docs/en-US/images/vpc-lb.png | Bin 0 -> 181811 bytes
docs/en-US/ip-vlan-tenant.xml | 205 ++++
docs/en-US/multiple-ip-range.xml | 42 +
docs/en-US/networks.xml | 1 +
docs/en-US/pvlan.xml | 57 +
docs/en-US/release-ip-for-vpc.xml | 31 +-
docs/en-US/remove-tier.xml | 22 +-
docs/en-US/remove-vpc.xml | 5 +-
docs/en-US/vpc.xml | 4 +-
docs/publican-gsoc-2013.cfg | 27 +
.../api/storage/DataStoreLifeCycle.java | 5 +-
.../datastore/db/PrimaryDataStoreDao.java | 3 +
.../datastore/db/PrimaryDataStoreDaoImpl.java | 11 +
.../storage/datastore/db/StoragePoolVO.java | 13 +
.../src/com/cloud/network/NetworkManager.java | 2 +-
.../src/com/cloud/storage/VolumeManager.java | 4 +
.../orchestration/CloudOrchestrator.java | 1 -
.../src/com/cloud/alert/dao/AlertDaoImpl.java | 2 +-
.../schema/src/com/cloud/dc/dao/ClusterDao.java | 1 +
.../src/com/cloud/dc/dao/ClusterDaoImpl.java | 14 +-
.../src/com/cloud/domain/dao/DomainDaoImpl.java | 2 +-
.../schema/src/com/cloud/host/dao/HostDao.java | 6 +
.../src/com/cloud/host/dao/HostDaoImpl.java | 37 +-
.../upgrade/PremiumDatabaseUpgradeChecker.java | 4 -
.../com/cloud/upgrade/dao/Upgrade410to420.java | 745 +++++++++++-
.../src/com/cloud/usage/UsageVmDiskVO.java | 180 +++
.../src/com/cloud/usage/dao/UsageDao.java | 4 +
.../src/com/cloud/usage/dao/UsageDaoImpl.java | 105 ++
.../src/com/cloud/usage/dao/UsageVmDiskDao.java | 29 +
.../com/cloud/usage/dao/UsageVmDiskDaoImpl.java | 139 +++
.../src/com/cloud/user/VmDiskStatisticsVO.java | 216 ++++
.../com/cloud/user/dao/VmDiskStatisticsDao.java | 35 +
.../cloud/user/dao/VmDiskStatisticsDaoImpl.java | 134 +++
.../schema/src/com/cloud/vm/dao/UserVmDao.java | 3 +-
.../src/com/cloud/vm/dao/UserVmDaoImpl.java | 3 +-
.../schema/src/com/cloud/vm/dao/UserVmData.java | 36 +
.../lb/dao/ApplicationLoadBalancerRuleDao.java | 1 +
.../dao/ApplicationLoadBalancerRuleDaoImpl.java | 22 +-
.../region/gslb/GlobalLoadBalancerDaoImpl.java | 12 +
.../region/gslb/GlobalLoadBalancerRuleDao.java | 3 +
.../DefaultImageDataStoreLifeCycle.java | 3 +-
.../allocator/ZoneWideStoragePoolAllocator.java | 6 +-
.../datastore/PrimaryDataStoreHelper.java | 44 +-
.../DefaultPrimaryDataStoreLifeCycleImpl.java | 2 +-
.../storage/volume/VolumeServiceImpl.java | 1 +
packaging/centos63/cloud-management.rc | 10 +-
packaging/centos63/cloud.spec | 11 +-
.../debian/config/etc/init.d/cloud-early-config | 28 +-
.../debian/config/etc/iptables/iptables-router | 1 +
.../debian/config/opt/cloud/bin/vpc_func.sh | 2 +-
.../debian/config/root/deleteIpAlias.sh | 2 +-
.../explicit-dedication/pom.xml | 33 +
.../affinity/ExplicitDedicationProcessor.java | 384 ++++++
plugins/dedicated-resources/pom.xml | 29 +
.../api/commands/DedicateClusterCmd.java | 115 ++
.../api/commands/DedicateHostCmd.java | 118 ++
.../cloudstack/api/commands/DedicatePodCmd.java | 120 ++
.../api/commands/DedicateZoneCmd.java | 120 ++
.../api/commands/ListDedicatedClustersCmd.java | 105 ++
.../api/commands/ListDedicatedHostsCmd.java | 105 ++
.../api/commands/ListDedicatedPodsCmd.java | 105 ++
.../api/commands/ListDedicatedZonesCmd.java | 105 ++
.../commands/ReleaseDedicatedClusterCmd.java | 91 ++
.../api/commands/ReleaseDedicatedHostCmd.java | 91 ++
.../api/commands/ReleaseDedicatedPodCmd.java | 91 ++
.../api/commands/ReleaseDedicatedZoneCmd.java | 91 ++
.../api/response/DedicateClusterResponse.java | 79 ++
.../api/response/DedicateHostResponse.java | 79 ++
.../api/response/DedicatePodResponse.java | 82 ++
.../api/response/DedicateZoneResponse.java | 83 ++
.../dedicated/DedicatedResourceManagerImpl.java | 815 +++++++++++++
.../cloudstack/dedicated/DedicatedService.java | 63 +
.../dedicated/manager/DedicatedApiUnitTest.java | 318 +++++
.../test/resource/dedicatedContext.xml | 45 +
.../cloud/deploy/ImplicitDedicationPlanner.java | 118 +-
.../implicitplanner/ImplicitPlannerTest.java | 16 +-
.../kvm/resource/LibvirtComputingResource.java | 116 +-
.../resources/components-simulator.xml | 66 -
.../cloud/agent/manager/MockAgentManager.java | 15 +-
.../cloud/agent/manager/MockNetworkManager.java | 91 ++
.../agent/manager/MockNetworkManagerImpl.java | 236 ++++
.../com/cloud/agent/manager/MockVmManager.java | 72 +-
.../cloud/agent/manager/MockVmManagerImpl.java | 142 ++-
.../agent/manager/SimulatorManagerImpl.java | 93 +-
.../SimulatorComponentLibrary.java | 40 -
plugins/hypervisors/vmware/pom.xml | 6 +
.../com/cloud/hypervisor/vmware/LegacyZone.java | 28 +
.../cloud/hypervisor/vmware/LegacyZoneVO.java | 81 ++
.../hypervisor/vmware/VmwareDatacenter.java | 36 +
.../vmware/VmwareDatacenterService.java | 32 +
.../hypervisor/vmware/VmwareDatacenterVO.java | 160 +++
.../vmware/VmwareDatacenterZoneMap.java | 30 +
.../vmware/VmwareDatacenterZoneMapVO.java | 78 ++
.../vmware/VmwareServerDiscoverer.java | 80 +-
.../hypervisor/vmware/dao/LegacyZoneDao.java | 37 +
.../vmware/dao/LegacyZoneDaoImpl.java | 66 +
.../vmware/dao/VmwareDatacenterDao.java | 65 +
.../vmware/dao/VmwareDatacenterDaoImpl.java | 104 ++
.../vmware/dao/VmwareDatacenterZoneMapDao.java | 35 +
.../dao/VmwareDatacenterZoneMapDaoImpl.java | 61 +
.../vmware/manager/VmwareManager.java | 3 +
.../vmware/manager/VmwareManagerImpl.java | 272 ++++-
.../manager/VmwareStorageManagerImpl.java | 14 +-
.../vmware/resource/VmwareResource.java | 316 ++++-
.../api/command/admin/zone/AddVmwareDcCmd.java | 123 ++
.../command/admin/zone/RemoveVmwareDcCmd.java | 99 ++
.../api/response/VmwareDatacenterResponse.java | 51 +
.../motion/VmwareStorageMotionStrategy.java | 212 ++++
.../vmware/VmwareDatacenterApiUnitTest.java | 426 +++++++
.../motion/VmwareStorageMotionStrategyTest.java | 271 +++++
.../xen/resource/CitrixResourceBase.java | 127 +-
.../network/cisco/CiscoVnmcConnectionImpl.java | 2 +-
.../cloud/network/element/CiscoVnmcElement.java | 2 +-
.../network/resource/CiscoVnmcResource.java | 2 +-
.../element/InternalLoadBalancerElement.java | 14 +-
.../ElementChildTestConfiguration.java | 2 +-
.../LbChildTestConfiguration.java | 2 +-
.../network/resource/NetscalerResource.java | 38 +
plugins/pom.xml | 4 +-
...CloudStackPrimaryDataStoreLifeCycleImpl.java | 24 +-
scripts/vm/hypervisor/xenserver/vmops | 1 +
scripts/vm/network/ovs-pvlan-vm.sh | 3 +-
server/pom.xml | 5 +
server/src/com/cloud/api/ApiDBUtils.java | 5 +-
server/src/com/cloud/api/ApiResponseHelper.java | 179 +--
server/src/com/cloud/api/ApiServer.java | 13 +-
.../com/cloud/api/query/QueryManagerImpl.java | 66 +-
.../com/cloud/api/query/ViewResponseHelper.java | 15 +-
.../cloud/api/query/dao/StoragePoolJoinDao.java | 12 +-
.../api/query/dao/StoragePoolJoinDaoImpl.java | 13 +-
.../cloud/api/query/dao/UserVmJoinDaoImpl.java | 12 +
.../cloud/api/query/vo/StoragePoolJoinVO.java | 29 +-
server/src/com/cloud/configuration/Config.java | 1 +
.../configuration/ConfigurationManagerImpl.java | 24 +-
.../consoleproxy/ConsoleProxyManagerImpl.java | 5 +-
.../src/com/cloud/dc/DedicatedResourceVO.java | 136 +++
.../com/cloud/dc/dao/DedicatedResourceDao.java | 49 +
.../cloud/dc/dao/DedicatedResourceDaoImpl.java | 304 +++++
.../deploy/DeploymentPlanningManagerImpl.java | 78 +-
.../src/com/cloud/deploy/FirstFitPlanner.java | 3 +-
.../ExternalFirewallDeviceManagerImpl.java | 2 +-
.../ExternalLoadBalancerDeviceManagerImpl.java | 35 +-
.../com/cloud/network/NetworkManagerImpl.java | 26 +-
.../src/com/cloud/network/NetworkModelImpl.java | 19 +-
.../com/cloud/network/NetworkServiceImpl.java | 23 +-
.../network/firewall/FirewallManagerImpl.java | 1 +
.../cloud/network/guru/DirectNetworkGuru.java | 5 +-
.../network/guru/DirectPodBasedNetworkGuru.java | 2 +-
.../lb/LoadBalancingRulesManagerImpl.java | 10 +-
.../VirtualNetworkApplianceManagerImpl.java | 65 +-
.../VpcVirtualNetworkApplianceManagerImpl.java | 2 +-
.../com/cloud/network/rules/RulesManager.java | 27 -
.../cloud/network/rules/RulesManagerImpl.java | 91 +-
.../network/vpc/NetworkACLManagerImpl.java | 27 +
.../network/vpc/NetworkACLServiceImpl.java | 4 +-
.../src/com/cloud/network/vpc/VpcManager.java | 2 +-
.../com/cloud/network/vpc/VpcManagerImpl.java | 19 +-
.../com/cloud/resource/ResourceManagerImpl.java | 16 +-
.../cloud/server/ConfigurationServerImpl.java | 21 +-
.../src/com/cloud/server/ManagementServer.java | 34 -
.../com/cloud/server/ManagementServerImpl.java | 134 +--
server/src/com/cloud/server/StatsCollector.java | 254 +++-
.../com/cloud/storage/StorageManagerImpl.java | 21 +-
.../com/cloud/storage/VolumeManagerImpl.java | 29 +
.../storage/download/DownloadMonitorImpl.java | 2 +-
.../storage/listener/StoragePoolMonitor.java | 5 +-
server/src/com/cloud/user/AccountManager.java | 16 +-
.../src/com/cloud/user/AccountManagerImpl.java | 146 +--
.../src/com/cloud/user/DomainManagerImpl.java | 26 +
server/src/com/cloud/vm/UserVmManager.java | 5 +
server/src/com/cloud/vm/UserVmManagerImpl.java | 264 +++-
.../com/cloud/vm/VirtualMachineManagerImpl.java | 2 +-
.../affinity/AffinityGroupServiceImpl.java | 13 +-
.../GlobalLoadBalancingRulesServiceImpl.java | 129 +-
.../cloud/network/MockNetworkManagerImpl.java | 5 +-
.../com/cloud/network/MockRulesManagerImpl.java | 63 -
.../server/ConfigurationServerImplTest.java | 61 +
.../com/cloud/user/MockAccountManagerImpl.java | 54 +-
.../vm/DeploymentPlanningManagerImplTest.java | 9 +
.../com/cloud/vm/MockUserVmManagerImpl.java | 12 +
.../com/cloud/vpc/MockNetworkManagerImpl.java | 2 +-
.../test/com/cloud/vpc/MockVpcManagerImpl.java | 2 +-
.../com/cloud/vpc/NetworkACLManagerTest.java | 8 +
server/test/com/cloud/vpc/VpcApiUnitTest.java | 10 +-
.../affinity/AffinityApiUnitTest.java | 27 +-
.../networkoffering/ChildTestConfiguration.java | 9 +-
setup/db/create-schema.sql | 1 -
setup/db/db/schema-40to410.sql | 2 -
setup/db/db/schema-410to420.sql | 130 ++
test/integration/component/test_assign_vm.py | 458 +++++++
.../component/test_explicit_dedication.py | 231 ++++
test/integration/smoke/test_internal_lb.py | 351 +++---
test/integration/smoke/test_iso.py | 2 +-
test/integration/smoke/test_network.py | 2 +-
test/integration/smoke/test_network_acl.py | 224 ++--
test/integration/smoke/test_routers.py | 1 -
.../integration/smoke/test_service_offerings.py | 13 +-
test/integration/smoke/test_templates.py | 2 +-
test/integration/smoke/test_vm_life_cycle.py | 9 +
test/integration/smoke/test_volumes.py | 5 +
tools/apidoc/gen_toc.py | 5 +-
.../definitions/systemvmtemplate/postinstall.sh | 18 +-
.../systemvmtemplate64/postinstall.sh | 19 +-
tools/devcloud-kvm/devcloud-kvm.cfg | 2 +-
tools/devcloud/devcloud.cfg | 2 +-
tools/devcloud/devcloud_internal-mgt.cfg | 2 +-
tools/devcloud/quickcloud.cfg | 2 +-
tools/marvin/marvin/configGenerator.py | 8 +-
tools/marvin/marvin/integration/lib/base.py | 207 +++-
tools/marvin/marvin/jsonHelper.py | 4 +-
ui/css/cloudstack3.css | 71 +-
ui/dictionary.jsp | 7 +
ui/modules/vpc/vpc.css | 93 +-
ui/modules/vpc/vpc.js | 114 +-
ui/scripts/configuration.js | 195 ++-
ui/scripts/docs.js | 14 +-
ui/scripts/instances.js | 15 +-
ui/scripts/network.js | 135 ++-
ui/scripts/projects.js | 3 +
ui/scripts/storage.js | 2 +-
ui/scripts/system.js | 1124 ++++++++++++++++--
ui/scripts/templates.js | 4 +-
ui/scripts/ui-custom/ipRules.js | 4 +-
ui/scripts/ui-custom/projects.js | 25 +
ui/scripts/ui/dialog.js | 2 +
ui/scripts/ui/widgets/detailView.js | 7 +-
ui/scripts/ui/widgets/listView.js | 27 +-
ui/scripts/vpc.js | 474 +++++++-
ui/scripts/zoneWizard.js | 161 ++-
usage/src/com/cloud/usage/UsageManagerImpl.java | 157 ++-
.../cloud/usage/parser/VmDiskUsageParser.java | 208 ++++
.../test/com/cloud/usage/UsageManagerTest.java | 3 +
.../usage/UsageManagerTestConfiguration.java | 2 +
utils/src/com/cloud/utils/net/NetUtils.java | 28 +
.../test/com/cloud/utils/net/NetUtilsTest.java | 19 +
.../vmware/mo/CustomFieldConstants.java | 1 +
.../hypervisor/vmware/mo/DatacenterMO.java | 5 +
.../cloud/hypervisor/vmware/mo/DatastoreMO.java | 44 +-
.../vmware/mo/HostDatastoreBrowserMO.java | 14 +-
.../vmware/mo/HypervisorHostHelper.java | 1 +
.../vmware/mo/VirtualDiskManagerMO.java | 4 +
.../hypervisor/vmware/mo/VirtualMachineMO.java | 26 +
305 files changed, 16757 insertions(+), 2561 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/api/src/com/cloud/deploy/DeploymentClusterPlanner.java
----------------------------------------------------------------------
diff --cc api/src/com/cloud/deploy/DeploymentClusterPlanner.java
index b12b93e,8b15ea5..ca73267
--- a/api/src/com/cloud/deploy/DeploymentClusterPlanner.java
+++ b/api/src/com/cloud/deploy/DeploymentClusterPlanner.java
@@@ -36,9 -38,10 +36,10 @@@ public interface DeploymentClusterPlann
* avoid these data centers, pods, clusters, or hosts.
* @return DeployDestination for that virtual machine.
*/
- List<Long> orderClusters(VirtualMachineProfile<? extends VirtualMachine> vm, DeploymentPlan plan, ExcludeList avoid)
+ List<Long> orderClusters(VirtualMachineProfile vm, DeploymentPlan plan, ExcludeList avoid)
throws InsufficientServerCapacityException;
- PlannerResourceUsage getResourceUsage();
- PlannerResourceUsage getResourceUsage(VirtualMachineProfile<? extends VirtualMachine> vmProfile,
++ PlannerResourceUsage getResourceUsage(VirtualMachineProfile vmProfile,
+ DeploymentPlan plan, ExcludeList avoid) throws InsufficientServerCapacityException;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/api/src/com/cloud/region/ha/GlobalLoadBalancingRulesService.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/api/src/org/apache/cloudstack/api/ResponseGenerator.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/ResponseGenerator.java
index ba01a79,096bf26..4a0eb02
--- a/api/src/org/apache/cloudstack/api/ResponseGenerator.java
+++ b/api/src/org/apache/cloudstack/api/ResponseGenerator.java
@@@ -16,20 -16,83 +16,13 @@@
// under the License.
package org.apache.cloudstack.api;
-import com.cloud.async.AsyncJob;
-import com.cloud.capacity.Capacity;
-import com.cloud.configuration.Configuration;
-import com.cloud.configuration.ResourceCount;
-import com.cloud.configuration.ResourceLimit;
-import com.cloud.dc.DataCenter;
-import com.cloud.dc.Pod;
-import com.cloud.dc.StorageNetworkIpRange;
-import com.cloud.dc.Vlan;
-import com.cloud.domain.Domain;
-import com.cloud.event.Event;
-import com.cloud.host.Host;
-import com.cloud.hypervisor.HypervisorCapabilities;
-import com.cloud.network.GuestVlan;
-import com.cloud.network.IpAddress;
-import com.cloud.network.Network;
-import com.cloud.network.Network.Service;
-import com.cloud.network.Networks.IsolationType;
-import com.cloud.network.PhysicalNetwork;
-import com.cloud.network.PhysicalNetworkServiceProvider;
-import com.cloud.network.PhysicalNetworkTrafficType;
-import com.cloud.network.RemoteAccessVpn;
-import com.cloud.network.Site2SiteCustomerGateway;
-import com.cloud.network.Site2SiteVpnConnection;
-import com.cloud.network.Site2SiteVpnGateway;
-import com.cloud.network.VirtualRouterProvider;
-import com.cloud.network.VpnUser;
-import com.cloud.network.as.AutoScalePolicy;
-import com.cloud.network.as.AutoScaleVmGroup;
-import com.cloud.network.as.AutoScaleVmProfile;
-import com.cloud.network.as.Condition;
-import com.cloud.network.as.Counter;
-import com.cloud.network.router.VirtualRouter;
-import com.cloud.network.rules.FirewallRule;
-import com.cloud.network.rules.HealthCheckPolicy;
-import com.cloud.network.rules.LoadBalancer;
-import com.cloud.network.rules.PortForwardingRule;
-import com.cloud.network.rules.StaticNatRule;
-import com.cloud.network.rules.StickinessPolicy;
-import com.cloud.network.security.SecurityGroup;
-import com.cloud.network.security.SecurityRule;
-import com.cloud.network.vpc.NetworkACL;
-import com.cloud.network.vpc.NetworkACLItem;
-import com.cloud.network.vpc.PrivateGateway;
-import com.cloud.network.vpc.StaticRoute;
-import com.cloud.network.vpc.Vpc;
-import com.cloud.network.vpc.VpcOffering;
-import com.cloud.offering.DiskOffering;
-import com.cloud.offering.NetworkOffering;
-import com.cloud.offering.ServiceOffering;
-import com.cloud.org.Cluster;
-import com.cloud.projects.Project;
-import com.cloud.projects.ProjectAccount;
-import com.cloud.projects.ProjectInvitation;
-import com.cloud.region.ha.GlobalLoadBalancerRule;
-import com.cloud.server.ResourceTag;
-import com.cloud.storage.GuestOS;
-import com.cloud.storage.S3;
-import com.cloud.storage.Snapshot;
-import com.cloud.storage.StoragePool;
-import com.cloud.storage.Swift;
-import com.cloud.storage.Volume;
-import com.cloud.storage.snapshot.SnapshotPolicy;
-import com.cloud.storage.snapshot.SnapshotSchedule;
-import com.cloud.template.VirtualMachineTemplate;
-import com.cloud.user.Account;
-import com.cloud.user.User;
-import com.cloud.user.UserAccount;
-import com.cloud.uservm.UserVm;
-import com.cloud.utils.net.Ip;
-import com.cloud.vm.InstanceGroup;
-import com.cloud.vm.Nic;
-import com.cloud.vm.NicSecondaryIp;
-import com.cloud.vm.VirtualMachine;
-import com.cloud.vm.snapshot.VMSnapshot;
+import java.text.DecimalFormat;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Map;
+
- import com.cloud.vm.NicSecondaryIp;
import org.apache.cloudstack.affinity.AffinityGroup;
import org.apache.cloudstack.affinity.AffinityGroupResponse;
- import com.cloud.network.vpc.NetworkACL;
- import com.cloud.network.vpc.NetworkACLItem;
- import com.cloud.network.vpc.PrivateGateway;
- import com.cloud.network.vpc.StaticRoute;
- import com.cloud.network.vpc.Vpc;
- import com.cloud.network.vpc.VpcOffering;
import org.apache.cloudstack.api.ApiConstants.HostDetails;
import org.apache.cloudstack.api.ApiConstants.VMDetails;
import org.apache.cloudstack.api.command.user.job.QueryAsyncJobResultCmd;
@@@ -115,81 -181,16 +110,86 @@@ import org.apache.cloudstack.api.respon
import org.apache.cloudstack.api.response.VpcResponse;
import org.apache.cloudstack.api.response.VpnUsersResponse;
import org.apache.cloudstack.api.response.ZoneResponse;
- import org.apache.cloudstack.api.response.*;
import org.apache.cloudstack.network.lb.ApplicationLoadBalancerRule;
- import org.apache.cloudstack.region.Region;
import org.apache.cloudstack.region.PortableIp;
import org.apache.cloudstack.region.PortableIpRange;
+ import org.apache.cloudstack.region.Region;
import org.apache.cloudstack.usage.Usage;
-import java.text.DecimalFormat;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.Map;
+import com.cloud.capacity.Capacity;
+import com.cloud.configuration.Configuration;
+import com.cloud.configuration.ResourceCount;
+import com.cloud.configuration.ResourceLimit;
+import com.cloud.dc.DataCenter;
+import com.cloud.dc.Pod;
+import com.cloud.dc.StorageNetworkIpRange;
+import com.cloud.dc.Vlan;
+import com.cloud.domain.Domain;
+import com.cloud.event.Event;
+import com.cloud.host.Host;
+import com.cloud.hypervisor.HypervisorCapabilities;
+import com.cloud.network.GuestVlan;
+import com.cloud.network.IpAddress;
+import com.cloud.network.Network;
+import com.cloud.network.Network.Service;
+import com.cloud.network.Networks.IsolationType;
+import com.cloud.network.PhysicalNetwork;
+import com.cloud.network.PhysicalNetworkServiceProvider;
+import com.cloud.network.PhysicalNetworkTrafficType;
+import com.cloud.network.RemoteAccessVpn;
+import com.cloud.network.Site2SiteCustomerGateway;
+import com.cloud.network.Site2SiteVpnConnection;
+import com.cloud.network.Site2SiteVpnGateway;
+import com.cloud.network.VirtualRouterProvider;
+import com.cloud.network.VpnUser;
+import com.cloud.network.as.AutoScalePolicy;
+import com.cloud.network.as.AutoScaleVmGroup;
+import com.cloud.network.as.AutoScaleVmProfile;
+import com.cloud.network.as.Condition;
+import com.cloud.network.as.Counter;
+import com.cloud.network.router.VirtualRouter;
+import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.rules.HealthCheckPolicy;
+import com.cloud.network.rules.LoadBalancer;
+import com.cloud.network.rules.PortForwardingRule;
+import com.cloud.network.rules.StaticNatRule;
+import com.cloud.network.rules.StickinessPolicy;
+import com.cloud.network.security.SecurityGroup;
+import com.cloud.network.security.SecurityRule;
++import com.cloud.network.vpc.NetworkACL;
++import com.cloud.network.vpc.NetworkACLItem;
++import com.cloud.network.vpc.PrivateGateway;
++import com.cloud.network.vpc.StaticRoute;
++import com.cloud.network.vpc.Vpc;
++import com.cloud.network.vpc.VpcOffering;
+import com.cloud.offering.DiskOffering;
+import com.cloud.offering.NetworkOffering;
+import com.cloud.offering.ServiceOffering;
+import com.cloud.org.Cluster;
+import com.cloud.projects.Project;
+import com.cloud.projects.ProjectAccount;
+import com.cloud.projects.ProjectInvitation;
+import com.cloud.region.ha.GlobalLoadBalancerRule;
+import com.cloud.server.ResourceTag;
+import com.cloud.storage.GuestOS;
+import com.cloud.storage.S3;
+import com.cloud.storage.Snapshot;
+import com.cloud.storage.StoragePool;
+import com.cloud.storage.Swift;
+import com.cloud.storage.Volume;
+import com.cloud.storage.snapshot.SnapshotPolicy;
+import com.cloud.storage.snapshot.SnapshotSchedule;
+import com.cloud.template.VirtualMachineTemplate;
+import com.cloud.user.Account;
+import com.cloud.user.User;
+import com.cloud.user.UserAccount;
+import com.cloud.uservm.UserVm;
+import com.cloud.utils.net.Ip;
+import com.cloud.vm.InstanceGroup;
+import com.cloud.vm.Nic;
+import com.cloud.vm.NicSecondaryIp;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.snapshot.VMSnapshot;
public interface ResponseGenerator {
UserResponse createUserResponse(UserAccount user);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/api/src/org/apache/cloudstack/api/command/admin/internallb/ConfigureInternalLoadBalancerElementCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/internallb/ConfigureInternalLoadBalancerElementCmd.java
index 3feecc6,86f3006..3d09bda
--- a/api/src/org/apache/cloudstack/api/command/admin/internallb/ConfigureInternalLoadBalancerElementCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/internallb/ConfigureInternalLoadBalancerElementCmd.java
@@@ -99,15 -96,12 +99,12 @@@ public class ConfigureInternalLoadBalan
@Override
public void execute() throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{
- s_logger.debug("hello alena");
- UserContext.current().setEventDetails("Internal load balancer element: " + id);
+ CallContext.current().setEventDetails("Internal load balancer element: " + id);
- s_logger.debug("hello alena");
VirtualRouterProvider result = _service.get(0).configureInternalLoadBalancerElement(getId(), getEnabled());
if (result != null){
InternalLoadBalancerElementResponse routerResponse = _responseGenerator.createInternalLbElementResponse(result);
routerResponse.setResponseName(getCommandName());
-- this.setResponseObject(routerResponse);
++ setResponseObject(routerResponse);
} else {
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to configure the internal load balancer element");
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/api/src/org/apache/cloudstack/api/command/admin/storage/CreateStoragePoolCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/storage/CreateStoragePoolCmd.java
index 136f136,74eb2b9..2b18329
--- a/api/src/org/apache/cloudstack/api/command/admin/storage/CreateStoragePoolCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/storage/CreateStoragePoolCmd.java
@@@ -116,14 -119,14 +120,14 @@@ public class CreateStoragePoolCmd exten
public String getStorageProviderName() {
return this.storageProviderName;
}
-
+
public String getScope() {
- return this.scope;
+ return this.scope;
}
- /////////////////////////////////////////////////////
- /////////////// API Implementation///////////////////
- /////////////////////////////////////////////////////
+ public String getHypervisor() {
+ return hypervisor;
+ }
@Override
public String getCommandName() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/api/src/org/apache/cloudstack/api/command/admin/storage/FindStoragePoolsForMigrationCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/storage/FindStoragePoolsForMigrationCmd.java
index e8c7447,ed6ca04..7d9be61
--- a/api/src/org/apache/cloudstack/api/command/admin/storage/FindStoragePoolsForMigrationCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/storage/FindStoragePoolsForMigrationCmd.java
@@@ -27,14 -24,15 +27,14 @@@ import org.apache.cloudstack.api.ApiCon
import org.apache.cloudstack.api.BaseListCmd;
import org.apache.cloudstack.api.Parameter;
import org.apache.cloudstack.api.response.ListResponse;
- import org.apache.cloudstack.api.response.StoragePoolForMigrationResponse;
+ import org.apache.cloudstack.api.response.StoragePoolResponse;
import org.apache.cloudstack.api.response.VolumeResponse;
-import org.apache.log4j.Logger;
-import java.util.ArrayList;
-import java.util.List;
+import com.cloud.storage.StoragePool;
+import com.cloud.utils.Pair;
@APICommand(name = "findStoragePoolsForMigration", description="Lists storage pools available for migration of a volume.",
- responseObject=StoragePoolForMigrationResponse.class)
+ responseObject=StoragePoolResponse.class)
public class FindStoragePoolsForMigrationCmd extends BaseListCmd {
public static final Logger s_logger = Logger.getLogger(FindStoragePoolsForMigrationCmd.class.getName());
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/api/src/org/apache/cloudstack/api/command/admin/vpc/UpdateVPCOfferingCmd.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/api/src/org/apache/cloudstack/api/command/user/affinitygroup/DeleteAffinityGroupCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/affinitygroup/DeleteAffinityGroupCmd.java
index 54e6cf9,f80e176..ebd0fae
--- a/api/src/org/apache/cloudstack/api/command/user/affinitygroup/DeleteAffinityGroupCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/affinitygroup/DeleteAffinityGroupCmd.java
@@@ -28,12 -25,13 +28,11 @@@ import org.apache.cloudstack.api.Parame
import org.apache.cloudstack.api.ServerApiException;
import org.apache.cloudstack.api.response.DomainResponse;
import org.apache.cloudstack.api.response.SuccessResponse;
-import org.apache.log4j.Logger;
+import org.apache.cloudstack.context.CallContext;
-import com.cloud.async.AsyncJob;
import com.cloud.event.EventTypes;
import com.cloud.exception.InvalidParameterValueException;
- import com.cloud.exception.ResourceInUseException;
import com.cloud.user.Account;
-import com.cloud.user.UserContext;
@APICommand(name = "deleteAffinityGroup", description = "Deletes affinity group", responseObject = SuccessResponse.class)
public class DeleteAffinityGroupCmd extends BaseAsyncCmd {
@@@ -124,18 -122,13 +123,13 @@@
@Override
public void execute(){
- try{
- boolean result = _affinityGroupService.deleteAffinityGroup(id, accountName, domainId, name);
- if (result) {
- SuccessResponse response = new SuccessResponse(getCommandName());
- this.setResponseObject(response);
- } else {
- throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete affinity group");
- }
+ boolean result = _affinityGroupService.deleteAffinityGroup(id, accountName, domainId, name);
+ if (result) {
+ SuccessResponse response = new SuccessResponse(getCommandName());
+ setResponseObject(response);
+ } else {
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete affinity group");
+ }
- } catch (ResourceInUseException ex) {
- s_logger.warn("Exception: ", ex);
- throw new ServerApiException(ApiErrorCode.RESOURCE_IN_USE_ERROR, ex.getMessage());
- }
}
@Override
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/api/src/org/apache/cloudstack/api/command/user/affinitygroup/ListAffinityGroupsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/affinitygroup/ListAffinityGroupsCmd.java
index f92c53e,d966a4c..ca06160
--- a/api/src/org/apache/cloudstack/api/command/user/affinitygroup/ListAffinityGroupsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/affinitygroup/ListAffinityGroupsCmd.java
@@@ -16,19 -16,19 +16,19 @@@
// under the License.
package org.apache.cloudstack.api.command.user.affinitygroup;
+import org.apache.log4j.Logger;
+
import org.apache.cloudstack.affinity.AffinityGroupResponse;
import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiCommandJobType;
import org.apache.cloudstack.api.ApiConstants;
- import org.apache.cloudstack.api.BaseListCmd;
+ import org.apache.cloudstack.api.BaseListAccountResourcesCmd;
import org.apache.cloudstack.api.Parameter;
import org.apache.cloudstack.api.response.ListResponse;
import org.apache.cloudstack.api.response.UserVmResponse;
-import org.apache.log4j.Logger;
-
-import com.cloud.async.AsyncJob;
@APICommand(name = "listAffinityGroups", description = "Lists affinity groups", responseObject = AffinityGroupResponse.class)
- public class ListAffinityGroupsCmd extends BaseListCmd {
+ public class ListAffinityGroupsCmd extends BaseListAccountResourcesCmd {
public static final Logger s_logger = Logger.getLogger(ListAffinityGroupsCmd.class.getName());
private static final String s_name = "listaffinitygroupsresponse";
@@@ -77,9 -77,10 +77,10 @@@
public void execute(){
ListResponse<AffinityGroupResponse> response = _queryService.listAffinityGroups(id, affinityGroupName,
- affinityGroupType, virtualMachineId, getStartIndex(), getPageSizeVal());
- affinityGroupType, virtualMachineId, this.getAccountName(), this.getDomainId(), this.isRecursive(),
- this.listAll(), this.getStartIndex(), this.getPageSizeVal());
++ affinityGroupType, virtualMachineId, getAccountName(), getDomainId(), isRecursive(),
++ listAll(), getStartIndex(), getPageSizeVal());
response.setResponseName(getCommandName());
- this.setResponseObject(response);
+ setResponseObject(response);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/api/src/org/apache/cloudstack/api/command/user/region/ha/gslb/DeleteGlobalLoadBalancerRuleCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/region/ha/gslb/DeleteGlobalLoadBalancerRuleCmd.java
index 17d3111,77ec4e7..80f8007
--- a/api/src/org/apache/cloudstack/api/command/user/region/ha/gslb/DeleteGlobalLoadBalancerRuleCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/region/ha/gslb/DeleteGlobalLoadBalancerRuleCmd.java
@@@ -17,19 -17,7 +17,21 @@@
package org.apache.cloudstack.api.command.user.region.ha.gslb;
-import com.cloud.async.AsyncJob;
+import javax.inject.Inject;
+
+import org.apache.log4j.Logger;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiCommandJobType;
+import org.apache.cloudstack.api.ApiConstants;
++import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseAsyncCmd;
+import org.apache.cloudstack.api.Parameter;
++import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.GlobalLoadBalancerResponse;
+import org.apache.cloudstack.api.response.SuccessResponse;
+import org.apache.cloudstack.context.CallContext;
+
import com.cloud.event.EventTypes;
import com.cloud.region.ha.GlobalLoadBalancerRule;
import com.cloud.region.ha.GlobalLoadBalancingRulesService;
@@@ -92,8 -87,14 +94,14 @@@ public class DeleteGlobalLoadBalancerRu
@Override
public void execute(){
- _gslbService.deleteGlobalLoadBalancerRule(this);
- UserContext.current().setEventDetails("Deleting global Load balancer rule Id: " + getGlobalLoadBalancerId());
+ CallContext.current().setEventDetails("Deleting global Load balancer Id: " + getGlobalLoadBalancerId());
+ boolean result = _gslbService.deleteGlobalLoadBalancerRule(this);
+ if (result) {
+ SuccessResponse response = new SuccessResponse(getCommandName());
- this.setResponseObject(response);
++ setResponseObject(response);
+ } else {
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete Global Load Balancer rule.");
+ }
}
@Override
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/api/src/org/apache/cloudstack/api/command/user/vpc/RestartVPCCmd.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/api/src/org/apache/cloudstack/api/command/user/vpc/UpdateVPCCmd.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/api/src/org/apache/cloudstack/api/response/HypervisorCapabilitiesResponse.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/api/src/org/apache/cloudstack/api/response/NetworkResponse.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/api/src/org/apache/cloudstack/api/response/StoragePoolResponse.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/response/StoragePoolResponse.java
index af6f901,965407d..57257a7
--- a/api/src/org/apache/cloudstack/api/response/StoragePoolResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/StoragePoolResponse.java
@@@ -101,9 -106,17 +108,17 @@@ public class StoragePoolResponse extend
this.scope = scope;
}
+ public String getHypervisor() {
+ return hypervisor;
+ }
+
+ public void setHypervisor(String hypervisor) {
+ this.hypervisor = hypervisor;
+ }
+
@Override
public String getObjectId() {
-- return this.getId();
++ return getId();
}
public String getId() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/api/src/org/apache/cloudstack/api/response/UserVmResponse.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/response/UserVmResponse.java
index 9901b5f,1f9eb1a..ed7b7df
--- a/api/src/org/apache/cloudstack/api/response/UserVmResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/UserVmResponse.java
@@@ -300,7 -312,23 +312,23 @@@ public class UserVmResponse extends Bas
public void setIsoDisplayText(String isoDisplayText) {
this.isoDisplayText = isoDisplayText;
}
-
+
+ public void setDiskKbsRead(Long diskKbsRead) {
+ this.diskKbsRead = diskKbsRead;
+ }
+
+ public void setDiskKbsWrite(Long diskKbsWrite) {
+ this.diskKbsWrite = diskKbsWrite;
+ }
+
+ public void setDiskIORead(Long diskIORead) {
+ this.diskIORead = diskIORead;
+ }
+
+ public void setDiskIOWrite(Long diskIOWrite) {
+ this.diskIOWrite = diskIOWrite;
+ }
+
public void setServiceOfferingId(String serviceOfferingId) {
this.serviceOfferingId = serviceOfferingId;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/client/tomcatconf/applicationContext.xml.in
----------------------------------------------------------------------
diff --cc client/tomcatconf/applicationContext.xml.in
index 80f380b,049e483..982cc0f
--- a/client/tomcatconf/applicationContext.xml.in
+++ b/client/tomcatconf/applicationContext.xml.in
@@@ -156,9 -156,17 +156,17 @@@
<entry key="cache.size" value="100" />
<entry key="cache.time.to.live" value="600" />
</map>
- </property>
+ </property>
</bean>
+ <bean id="dedicatedResourceDaoImpl" class="com.cloud.dc.dao.DedicatedResourceDaoImpl">
+ <property name="configParams">
+ <map>
+ <entry key="cache.size" value="30" />
+ <entry key="cache.time.to.live" value="3600" />
+ </map>
+ </property>
+ </bean>
-
+
<!--
DAOs with default configuration
-->
@@@ -667,8 -681,9 +677,7 @@@
<bean id="ipv6AddressManagerImpl" class="com.cloud.network.Ipv6AddressManagerImpl" />
<bean id="apiRateLimitServiceImpl" class="org.apache.cloudstack.ratelimit.ApiRateLimitServiceImpl"/>
-
<bean id="alertManagerImpl" class="com.cloud.alert.AlertManagerImpl" />
- <bean id="asyncJobExecutorContextImpl" class="com.cloud.async.AsyncJobExecutorContextImpl" />
- <bean id="asyncJobManagerImpl" class="com.cloud.async.AsyncJobManagerImpl" />
<bean id="autoScaleManagerImpl" class="com.cloud.network.as.AutoScaleManagerImpl" />
<bean id="capacityManagerImpl" class="com.cloud.capacity.CapacityManagerImpl" />
<bean id="clusterFenceManagerImpl" class="com.cloud.cluster.ClusterFenceManagerImpl" />
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/engine/components-api/src/com/cloud/network/NetworkManager.java
----------------------------------------------------------------------
diff --cc engine/components-api/src/com/cloud/network/NetworkManager.java
index 06db2e6,0000000..0054c9a
mode 100755,000000..100755
--- a/engine/components-api/src/com/cloud/network/NetworkManager.java
+++ b/engine/components-api/src/com/cloud/network/NetworkManager.java
@@@ -1,388 -1,0 +1,388 @@@
+// 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.List;
+import java.util.Map;
+
+import org.apache.cloudstack.acl.ControlledEntity.ACLType;
+
+import com.cloud.dc.DataCenter;
+import com.cloud.dc.Pod;
+import com.cloud.dc.Vlan.VlanType;
+import com.cloud.deploy.DataCenterDeployment;
+import com.cloud.deploy.DeployDestination;
+import com.cloud.deploy.DeploymentPlan;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientAddressCapacityException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.Network.Provider;
+import com.cloud.network.Network.Service;
+import com.cloud.network.addr.PublicIp;
+import com.cloud.network.dao.IPAddressVO;
+import com.cloud.network.dao.NetworkVO;
+import com.cloud.network.element.DhcpServiceProvider;
+import com.cloud.network.element.LoadBalancingServiceProvider;
+import com.cloud.network.element.StaticNatServiceProvider;
+import com.cloud.network.element.UserDataServiceProvider;
+import com.cloud.network.guru.NetworkGuru;
+import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
+import com.cloud.network.rules.StaticNat;
+import com.cloud.offering.NetworkOffering;
+import com.cloud.offerings.NetworkOfferingVO;
+import com.cloud.user.Account;
+import com.cloud.user.User;
+import com.cloud.utils.Pair;
+import com.cloud.vm.Nic;
+import com.cloud.vm.NicProfile;
+import com.cloud.vm.NicVO;
+import com.cloud.vm.ReservationContext;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.VirtualMachine.Type;
+import com.cloud.vm.VirtualMachineProfile;
+
+/**
+ * NetworkManager manages the network for the different end users.
+ *
+ */
+public interface NetworkManager {
+ /**
+ * Assigns a new public ip address.
+ *
+ * @param dcId
+ * @param podId
+ * TODO
+ * @param owner
+ * @param type
+ * @param networkId
+ * @param requestedIp
+ * TODO
+ * @param allocatedBy
+ * TODO
+ * @return
+ * @throws InsufficientAddressCapacityException
+ */
+
+ PublicIp assignPublicIpAddress(long dcId, Long podId, Account owner, VlanType type, Long networkId, String requestedIp,
+ boolean isSystem) throws InsufficientAddressCapacityException;
+
+
+ /**
+ * Do all of the work of releasing public ip addresses. Note that if this method fails, there can be side effects.
+ *
+ * @param userId
+ * @param caller
+ * TODO
+ * @param IpAddress
+ * @return true if it did; false if it didn't
+ */
+ public boolean disassociatePublicIpAddress(long id, long userId, Account caller);
+
+ List<NetworkVO> setupNetwork(Account owner, NetworkOffering offering, DeploymentPlan plan, String name, String displayText, boolean isDefault)
+ throws ConcurrentOperationException;
+
+ List<NetworkVO> setupNetwork(Account owner, NetworkOffering offering, Network predefined, DeploymentPlan plan, String name, String displayText, boolean errorIfAlreadySetup, Long domainId,
+ ACLType aclType, Boolean subdomainAccess, Long vpcId, Boolean isDisplayNetworkEnabled) throws ConcurrentOperationException;
+
+ void allocate(VirtualMachineProfile vm, List<Pair<NetworkVO, NicProfile>> networks) throws InsufficientCapacityException, ConcurrentOperationException;
+
+ void prepare(VirtualMachineProfile profile, DeployDestination dest, ReservationContext context) throws InsufficientCapacityException, ConcurrentOperationException,
+ ResourceUnavailableException;
+
+ void release(VirtualMachineProfile vmProfile, boolean forced) throws
+ ConcurrentOperationException, ResourceUnavailableException;
+
+ void cleanupNics(VirtualMachineProfile vm);
+
+ void expungeNics(VirtualMachineProfile vm);
+
+ List<NicProfile> getNicProfiles(VirtualMachine vm);
+
+ boolean applyRules(List<? extends FirewallRule> rules, FirewallRule.Purpose purpose, NetworkRuleApplier applier, boolean continueOnError) throws ResourceUnavailableException;
+
+ Pair<NetworkGuru, NetworkVO> implementNetwork(long networkId, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException,
+ InsufficientCapacityException;
+
+ /**
+ * prepares vm nic change for migration
+ *
+ * This method will be called in migration transaction before the vm migration.
+ * @param vm
+ * @param dest
+ */
+ void prepareNicForMigration(VirtualMachineProfile vm, DeployDestination dest);
+
+ /**
+ * commit vm nic change for migration
+ *
+ * This method will be called in migration transaction after the successful
+ * vm migration.
+ * @param src
+ * @param dst
+ */
+ void commitNicForMigration(VirtualMachineProfile src, VirtualMachineProfile dst);
+
+ /**
+ * rollback vm nic change for migration
+ *
+ * This method will be called in migaration transaction after vm migration
+ * failure.
+ * @param src
+ * @param dst
+ */
+ void rollbackNicForMigration(VirtualMachineProfile src, VirtualMachineProfile dst);
+
+ boolean shutdownNetwork(long networkId, ReservationContext context, boolean cleanupElements);
+
+ boolean destroyNetwork(long networkId, ReservationContext context);
+
+ Network createGuestNetwork(long networkOfferingId, String name, String displayText, String gateway, String cidr,
+ String vlanId, String networkDomain, Account owner, Long domainId, PhysicalNetwork physicalNetwork,
+ long zoneId, ACLType aclType, Boolean subdomainAccess, Long vpcId, String ip6Gateway, String ip6Cidr,
+ Boolean displayNetworkEnabled, String isolatedPvlan)
+ throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException;
+
+ /**
+ * @throws ResourceAllocationException TODO
+ * @throws InsufficientCapacityException
+ * Associates an ip address list to an account. The list of ip addresses are all addresses associated
+ * with the
+ * given vlan id.
+ * @param userId
+ * @param accountId
+ * @param zoneId
+ * @param vlanId
+ * @throws InsufficientAddressCapacityException
+ * @throws
+ */
+ boolean associateIpAddressListToAccount(long userId, long accountId, long zoneId, Long vlanId, Network guestNetwork) throws InsufficientCapacityException, ConcurrentOperationException,
+ ResourceUnavailableException, ResourceAllocationException;
+
+ UserDataServiceProvider getPasswordResetProvider(Network network);
+
+ UserDataServiceProvider getSSHKeyResetProvider(Network network);
+
+ boolean applyIpAssociations(Network network, boolean continueOnError) throws ResourceUnavailableException;
+
+ boolean applyIpAssociations(Network network, boolean rulesRevoked, boolean continueOnError, List<? extends PublicIpAddress> publicIps) throws ResourceUnavailableException;
+
+ boolean startNetwork(long networkId, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException;
+
+ IPAddressVO markIpAsUnavailable(long addrId);
+
+ public String acquireGuestIpAddress(Network network, String requestedIp);
+
+ boolean applyStaticNats(List<? extends StaticNat> staticNats, boolean continueOnError) throws ResourceUnavailableException;
+
+ boolean reallocate(VirtualMachineProfile vm,
+ DataCenterDeployment dest) throws InsufficientCapacityException, ConcurrentOperationException;
+
+ IpAddress assignSystemIp(long networkId, Account owner,
+ boolean forElasticLb, boolean forElasticIp)
+ throws InsufficientAddressCapacityException;
+
+ boolean handleSystemIpRelease(IpAddress ip);
+
+ void allocateDirectIp(NicProfile nic, DataCenter dc,
+ VirtualMachineProfile vm,
+ Network network, String requestedIpv4, String requestedIpv6)
+ throws InsufficientVirtualNetworkCapcityException,
+ InsufficientAddressCapacityException;
+
+ /**
+ * @param owner
+ * @param guestNetwork
+ * @return
+ * @throws ConcurrentOperationException
+ * @throws InsufficientAddressCapacityException
+ */
+ PublicIp assignSourceNatIpAddressToGuestNetwork(Account owner, Network guestNetwork) throws InsufficientAddressCapacityException, ConcurrentOperationException;
+
+
+ /**
+ * @param requested
+ * @param network
+ * @param isDefaultNic
+ * @param deviceId
+ * @param vm
+ * @return
+ * @throws InsufficientVirtualNetworkCapcityException
+ * @throws InsufficientAddressCapacityException
+ * @throws ConcurrentOperationException
+ */
+ Pair<NicProfile,Integer> allocateNic(NicProfile requested, Network network, Boolean isDefaultNic, int deviceId,
+ VirtualMachineProfile vm) throws InsufficientVirtualNetworkCapcityException,
+ InsufficientAddressCapacityException, ConcurrentOperationException;
+
+
+ /**
+ * @param vmProfile
+ * @param dest
+ * @param context
+ * @param nicId
+ * @param network
+ * @return
+ * @throws InsufficientVirtualNetworkCapcityException
+ * @throws InsufficientAddressCapacityException
+ * @throws ConcurrentOperationException
+ * @throws InsufficientCapacityException
+ * @throws ResourceUnavailableException
+ */
+ NicProfile prepareNic(VirtualMachineProfile vmProfile, DeployDestination dest,
+ ReservationContext context, long nicId, NetworkVO network) throws InsufficientVirtualNetworkCapcityException,
+ InsufficientAddressCapacityException, ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException;
+
+
+ /**
+ * @param vm
+ * @param nic TODO
+ */
+ void removeNic(VirtualMachineProfile vm, Nic nic);
+
+
+ /**
+ * @param ipAddrId
+ * @param networkId
+ * @param releaseOnFailure TODO
+ */
+ IPAddressVO associateIPToGuestNetwork(long ipAddrId, long networkId, boolean releaseOnFailure) throws ResourceAllocationException, ResourceUnavailableException,
+ InsufficientAddressCapacityException, ConcurrentOperationException;
+
+ IpAddress allocatePortableIp(Account ipOwner, Account caller, long dcId, Long networkId, Long vpcID)
+ throws ConcurrentOperationException, ResourceAllocationException, InsufficientAddressCapacityException;
+
+ boolean releasePortableIpAddress(long addrId);
+
+ IPAddressVO associatePortableIPToGuestNetwork(long ipAddrId, long networkId, boolean releaseOnFailure) throws ResourceAllocationException, ResourceUnavailableException,
+ InsufficientAddressCapacityException, ConcurrentOperationException;
+
+ IPAddressVO disassociatePortableIPToGuestNetwork(long ipAddrId, long networkId) throws ResourceAllocationException, ResourceUnavailableException,
+ InsufficientAddressCapacityException, ConcurrentOperationException;
+
+ boolean isPortableIpTransferableFromNetwork(long ipAddrId, long networkId);
+
+ void transferPortableIP(long ipAddrId, long currentNetworkId, long newNetworkId) throws ResourceAllocationException, ResourceUnavailableException,
+ InsufficientAddressCapacityException, ConcurrentOperationException;;
+
+ /**
+ * @param network
+ * @param provider
+ * @return
+ */
+ boolean setupDns(Network network, Provider provider);
+
+
+ /**
+ * @param vmProfile
+ * @param nic TODO
+ * @throws ConcurrentOperationException
+ * @throws ResourceUnavailableException
+ */
+ void releaseNic(VirtualMachineProfile vmProfile, Nic nic)
+ throws ConcurrentOperationException, ResourceUnavailableException;
+
+
+ /**
+ * @param network
+ * @param requested
+ * @param context
+ * @param vmProfile
+ * @param prepare TODO
+ * @return
+ * @throws InsufficientVirtualNetworkCapcityException
+ * @throws InsufficientAddressCapacityException
+ * @throws ConcurrentOperationException
+ * @throws InsufficientCapacityException
+ * @throws ResourceUnavailableException
+ */
+ NicProfile createNicForVm(Network network, NicProfile requested, ReservationContext context, VirtualMachineProfile vmProfile, boolean prepare) throws InsufficientVirtualNetworkCapcityException,
+ InsufficientAddressCapacityException, ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException;
+
+
+ /**
+ * @param addr
+ */
+ void markPublicIpAsAllocated(IPAddressVO addr);
+
+
+ /**
+ * @param owner
+ * @param guestNtwkId
+ * @param vpcId
+ * @param dcId
+ * @param isSourceNat
+ * @return
+ * @throws ConcurrentOperationException
+ * @throws InsufficientAddressCapacityException
+ */
+ PublicIp assignDedicateIpAddress(Account owner, Long guestNtwkId, Long vpcId, long dcId, boolean isSourceNat) throws ConcurrentOperationException, InsufficientAddressCapacityException;
+
+ NetworkProfile convertNetworkToNetworkProfile(long networkId);
+
+ /**
+ * @return
+ */
+ int getNetworkLockTimeout();
+
+
+ boolean restartNetwork(Long networkId, Account callerAccount,
+ User callerUser, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException;
+
+
+ boolean shutdownNetworkElementsAndResources(ReservationContext context,
+ boolean b, NetworkVO network);
+
+
+ void implementNetworkElementsAndResources(DeployDestination dest,
+ ReservationContext context, NetworkVO network,
+ NetworkOfferingVO findById) throws ConcurrentOperationException, InsufficientAddressCapacityException, ResourceUnavailableException, InsufficientCapacityException;
+
+
+ IpAddress allocateIp(Account ipOwner, boolean isSystem, Account caller, long callerId,
+ DataCenter zone) throws ConcurrentOperationException, ResourceAllocationException, InsufficientAddressCapacityException;
+
+ Map<String, String> finalizeServicesAndProvidersForNetwork(NetworkOffering offering,
+ Long physicalNetworkId);
+
+ List<Provider> getProvidersForServiceInNetwork(Network network, Service service);
+
+ StaticNatServiceProvider getStaticNatProviderForNetwork(Network network);
+
+ boolean isNetworkInlineMode(Network network);
+
+ int getRuleCountForIp(Long addressId, FirewallRule.Purpose purpose, FirewallRule.State state);
+
+ LoadBalancingServiceProvider getLoadBalancingProviderForNetwork(Network network, Scheme lbScheme);
+
+ boolean isSecondaryIpSetForNic(long nicId);
+
+ public String allocateGuestIP(Account ipOwner, boolean isSystem, long zoneId, Long networkId, String requestedIp) throws InsufficientAddressCapacityException;
+
+ List<? extends Nic> listVmNics(Long vmId, Long nicId);
+
+ String allocatePublicIpForGuestNic(Long networkId, DataCenter dc, Pod pod, Account caller, String requestedIp) throws InsufficientAddressCapacityException;
+
- NicVO savePlaceholderNic(Network network, String ip4Address, Type vmType);
++ NicVO savePlaceholderNic(Network network, String ip4Address, String ip6Address, Type vmType);
+
+ DhcpServiceProvider getDhcpServiceProvider(Network network);
+
+ PublicIp assignPublicIpAddressFromVlans(long dcId, Long podId, Account owner, VlanType type, List<Long> vlanDbIds, Long networkId, String requestedIp, boolean isSystem) throws InsufficientAddressCapacityException;
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/engine/components-api/src/com/cloud/storage/VolumeManager.java
----------------------------------------------------------------------
diff --cc engine/components-api/src/com/cloud/storage/VolumeManager.java
index 9821966,0000000..c2e5bdc
mode 100644,000000..100644
--- a/engine/components-api/src/com/cloud/storage/VolumeManager.java
+++ b/engine/components-api/src/com/cloud/storage/VolumeManager.java
@@@ -1,115 -1,0 +1,119 @@@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.cloud.storage;
+
+import java.util.Map;
+
+import org.apache.cloudstack.api.command.user.volume.AttachVolumeCmd;
+import org.apache.cloudstack.api.command.user.volume.CreateVolumeCmd;
+import org.apache.cloudstack.api.command.user.volume.DetachVolumeCmd;
+import org.apache.cloudstack.api.command.user.volume.MigrateVolumeCmd;
+import org.apache.cloudstack.api.command.user.volume.ResizeVolumeCmd;
+import org.apache.cloudstack.api.command.user.volume.UploadVolumeCmd;
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+
+import com.cloud.agent.api.to.VirtualMachineTO;
+import com.cloud.deploy.DeployDestination;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientStorageCapacityException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.StorageUnavailableException;
+import com.cloud.host.Host;
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.storage.Volume.Type;
+import com.cloud.user.Account;
+import com.cloud.vm.DiskProfile;
+import com.cloud.vm.VMInstanceVO;
+import com.cloud.vm.VirtualMachineProfile;
+
+public interface VolumeManager extends VolumeApiService {
+
+ VolumeInfo moveVolume(VolumeInfo volume, long destPoolDcId, Long destPoolPodId,
+ Long destPoolClusterId, HypervisorType dataDiskHyperType)
+ throws ConcurrentOperationException;
+
+ @Override
+ VolumeVO uploadVolume(UploadVolumeCmd cmd)
+ throws ResourceAllocationException;
+
+ VolumeVO allocateDuplicateVolume(VolumeVO oldVol, Long templateId);
+
+ boolean volumeOnSharedStoragePool(VolumeVO volume);
+
+ boolean volumeInactive(Volume volume);
+
+ String getVmNameOnVolume(Volume volume);
+
+ @Override
+ VolumeVO allocVolume(CreateVolumeCmd cmd)
+ throws ResourceAllocationException;
+
+ @Override
+ VolumeVO createVolume(CreateVolumeCmd cmd);
+
+ @Override
+ VolumeVO resizeVolume(ResizeVolumeCmd cmd)
+ throws ResourceAllocationException;
+
+ @Override
+ boolean deleteVolume(long volumeId, Account caller)
+ throws ConcurrentOperationException;
+
+ void destroyVolume(VolumeVO volume);
+
+ DiskProfile allocateRawVolume(Type type, String name, DiskOfferingVO offering, Long size, VMInstanceVO vm, Account owner);
+ @Override
+ Volume attachVolumeToVM(AttachVolumeCmd command);
+
+ @Override
+ Volume detachVolumeFromVM(DetachVolumeCmd cmmd);
+
+ void release(VirtualMachineProfile profile);
+
+ void cleanupVolumes(long vmId) throws ConcurrentOperationException;
+
+ @Override
+ Volume migrateVolume(MigrateVolumeCmd cmd);
+
+ <T extends VMInstanceVO> void migrateVolumes(T vm, VirtualMachineTO vmTo, Host srcHost, Host destHost,
+ Map<VolumeVO, StoragePoolVO> volumeToPool);
+
+ boolean storageMigration(
+ VirtualMachineProfile vm,
+ StoragePool destPool);
+
+ void prepareForMigration(
+ VirtualMachineProfile vm,
+ DeployDestination dest);
+
+ void prepare(VirtualMachineProfile vm,
+ DeployDestination dest) throws StorageUnavailableException,
+ InsufficientStorageCapacityException, ConcurrentOperationException;
+
+ boolean canVmRestartOnAnotherServer(long vmId);
+
+ DiskProfile allocateTemplatedVolume(Type type, String name,
+ DiskOfferingVO offering, VMTemplateVO template, VMInstanceVO vm,
+ Account owner);
++
++ String getVmNameFromVolumeId(long volumeId);
++
++ String getStoragePoolOfVolume(long volumeId);
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/engine/orchestration/src/org/apache/cloudstack/platform/orchestration/CloudOrchestrator.java
----------------------------------------------------------------------
diff --cc engine/orchestration/src/org/apache/cloudstack/platform/orchestration/CloudOrchestrator.java
index f81d5ef,ca299ea..d343df3
--- a/engine/orchestration/src/org/apache/cloudstack/platform/orchestration/CloudOrchestrator.java
+++ b/engine/orchestration/src/org/apache/cloudstack/platform/orchestration/CloudOrchestrator.java
@@@ -90,10 -89,9 +90,9 @@@ public class CloudOrchestrator implemen
public CloudOrchestrator() {
}
-
+
public VirtualMachineEntity createFromScratch(String uuid, String iso, String os, String hypervisor, String hostName, int cpu, int speed, long memory, List<String> networks, List<String> computeTags,
Map<String, String> details, String owner) {
- // TODO Auto-generated method stub
return null;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/engine/storage/src/org/apache/cloudstack/storage/allocator/ZoneWideStoragePoolAllocator.java
----------------------------------------------------------------------
diff --cc engine/storage/src/org/apache/cloudstack/storage/allocator/ZoneWideStoragePoolAllocator.java
index ad1c22c,d8d4132..9da3475
--- a/engine/storage/src/org/apache/cloudstack/storage/allocator/ZoneWideStoragePoolAllocator.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/allocator/ZoneWideStoragePoolAllocator.java
@@@ -49,24 -49,26 +49,26 @@@ public class ZoneWideStoragePoolAllocat
List<Volume> requestVolumes = new ArrayList<Volume>();
requestVolumes.add(volume);
return storageMgr.storagePoolHasEnoughSpace(requestVolumes, pool);
- }
-
- @Override
- protected List<StoragePool> select(DiskProfile dskCh,
- VirtualMachineProfile<? extends VirtualMachine> vmProfile,
- DeploymentPlan plan, ExcludeList avoid, int returnUpTo) {
- s_logger.debug("ZoneWideStoragePoolAllocator to find storage pool");
- List<StoragePool> suitablePools = new ArrayList<StoragePool>();
- HypervisorType hypervisor = dskCh.getHypervisorType();
- if (hypervisor != null) {
+ }
+
+ @Override
+ protected List<StoragePool> select(DiskProfile dskCh,
+ VirtualMachineProfile vmProfile,
+ DeploymentPlan plan, ExcludeList avoid, int returnUpTo) {
+ s_logger.debug("ZoneWideStoragePoolAllocator to find storage pool");
+ List<StoragePool> suitablePools = new ArrayList<StoragePool>();
+ HypervisorType hypervisor = dskCh.getHypervisorType();
+ if (hypervisor != null) {
- if (hypervisor != HypervisorType.KVM) {
- s_logger.debug("Only kvm supports zone wide storage");
+ if (hypervisor != HypervisorType.KVM && hypervisor != HypervisorType.VMware) {
+ s_logger.debug("Only kvm, VMware hypervisors are enabled to support zone wide storage");
- return suitablePools;
- }
- }
-
- List<StoragePoolVO> storagePools = _storagePoolDao.findZoneWideStoragePoolsByTags(plan.getDataCenterId(), dskCh.getTags());
+ return suitablePools;
+ }
+ }
+
+ List<StoragePoolVO> storagePools = _storagePoolDao.findZoneWideStoragePoolsByTags(plan.getDataCenterId(), dskCh.getTags());
+ List<StoragePoolVO> storagePoolsByHypervisor = _storagePoolDao.findZoneWideStoragePoolsByHypervisor(plan.getDataCenterId(), dskCh.getHypervisorType());
+ storagePools.retainAll(storagePoolsByHypervisor);
-
+
// add remaining pools in zone, that did not match tags, to avoid set
List<StoragePoolVO> allPools = _storagePoolDao.findZoneWideStoragePoolsByTags(plan.getDataCenterId(), null);
allPools.removeAll(storagePools);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aaa16af2/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
----------------------------------------------------------------------
diff --cc engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
index b9c39c7,54dcbd2..56a6651
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
@@@ -425,51 -428,52 +425,52 @@@ public class VolumeServiceImpl implemen
public AsyncCallFuture<VolumeApiResult> createVolumeFromSnapshot(
VolumeInfo volume, DataStore store, SnapshotInfo snapshot) {
AsyncCallFuture<VolumeApiResult> future = new AsyncCallFuture<VolumeApiResult>();
-
+
try {
- DataObject volumeOnStore = store.create(volume);
+ DataObject volumeOnStore = store.create(volume);
+ volume = this.volFactory.getVolume(volume.getId(), store);
- volume.processEvent(Event.CreateOnlyRequested);
- CreateVolumeFromBaseImageContext<VolumeApiResult> context = new CreateVolumeFromBaseImageContext<VolumeApiResult>(null,
- (VolumeObject)volume, store, volumeOnStore, future);
- AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> caller = AsyncCallbackDispatcher.create(this);
- caller.setCallback(caller.getTarget().createVolumeFromSnapshotCallback(null, null))
- .setContext(context);
- this.motionSrv.copyAsync(snapshot, volumeOnStore, caller);
+ volume.processEvent(Event.CreateOnlyRequested);
+ CreateVolumeFromBaseImageContext<VolumeApiResult> context = new CreateVolumeFromBaseImageContext<VolumeApiResult>(null,
+ (VolumeObject)volume, store, volumeOnStore, future);
+ AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> caller = AsyncCallbackDispatcher.create(this);
+ caller.setCallback(caller.getTarget().createVolumeFromSnapshotCallback(null, null))
+ .setContext(context);
+ motionSrv.copyAsync(snapshot, volumeOnStore, caller);
} catch (Exception e) {
- s_logger.debug("create volume from snapshot failed", e);
- VolumeApiResult result = new VolumeApiResult(volume);
- result.setResult(e.toString());
- future.complete(result);
+ s_logger.debug("create volume from snapshot failed", e);
+ VolumeApiResult result = new VolumeApiResult(volume);
+ result.setResult(e.toString());
+ future.complete(result);
}
-
+
return future;
}
-
+
protected Void createVolumeFromSnapshotCallback(AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> callback,
- CreateVolumeFromBaseImageContext<VolumeApiResult> context) {
- CopyCommandResult result = callback.getResult();
- VolumeInfo volume = context.vo;
- VolumeApiResult apiResult = new VolumeApiResult(volume);
- Event event = null;
- if (result.isFailed()) {
- apiResult.setResult(result.getResult());
- event = Event.OperationFailed;
- } else {
- event = Event.OperationSuccessed;
- }
-
- try {
- volume.processEvent(event);
- } catch (Exception e) {
- s_logger.debug("create volume from snapshot failed", e);
- apiResult.setResult(e.toString());
- }
-
- AsyncCallFuture<VolumeApiResult> future = context.future;
- future.complete(apiResult);
- return null;
+ CreateVolumeFromBaseImageContext<VolumeApiResult> context) {
+ CopyCommandResult result = callback.getResult();
+ VolumeInfo volume = context.vo;
+ VolumeApiResult apiResult = new VolumeApiResult(volume);
+ Event event = null;
+ if (result.isFailed()) {
+ apiResult.setResult(result.getResult());
+ event = Event.OperationFailed;
+ } else {
+ event = Event.OperationSuccessed;
+ }
+
+ try {
+ volume.processEvent(event);
+ } catch (Exception e) {
+ s_logger.debug("create volume from snapshot failed", e);
+ apiResult.setResult(e.toString());
+ }
+
+ AsyncCallFuture<VolumeApiResult> future = context.future;
+ future.complete(apiResult);
+ return null;
}
-
+
protected VolumeVO duplicateVolumeOnAnotherStorage(Volume volume, StoragePool pool) {
Long lastPoolId = volume.getPoolId();
VolumeVO newVol = new VolumeVO(volume);
[37/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
CLOUDSTACK-869:Netscaler support as an external LB provider
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/5233e321
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/5233e321
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/5233e321
Branch: refs/heads/vmsync
Commit: 5233e3216b11e69c7c7e051f0a6c3d0c6bf98803
Parents: bcc5baa
Author: Pranav Saxena <pr...@citrix.com>
Authored: Fri Jun 7 16:53:32 2013 +0530
Committer: Pranav Saxena <pr...@citrix.com>
Committed: Fri Jun 7 16:53:32 2013 +0530
----------------------------------------------------------------------
ui/scripts/network.js | 25 +++++++++++++++++--------
1 file changed, 17 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5233e321/ui/scripts/network.js
----------------------------------------------------------------------
diff --git a/ui/scripts/network.js b/ui/scripts/network.js
index a3e239b..9e60cbc 100755
--- a/ui/scripts/network.js
+++ b/ui/scripts/network.js
@@ -4536,20 +4536,29 @@
loadbalancer:{ //Support for Netscaler as an external device for load balancing
label:'Load Balancer',
select:function(args){
+ $.ajax({
+ url:createURL('listVPCOfferings&listall=true'),
+ dataType:'json',
+ success:function(json){
+ var items=[];
+ var vpcObj = json.listvpcofferingsresponse.vpcoffering;
+ $(vpcObj).each(function(){
+ items.push({id:this.id , description:this.name});
+ });
+ args.response.success({data:items});
- var items = [];
- items.push({id:'vpcvirtualrouter' , description:'VPC Virtual Router'});
- items.push({id:'netscaler' , description:'NetScaler'});
+ }
- args.response.success({data:items});
- }
+ });
+
+ }
}
}
},
action: function(args) {
- var defaultvpcofferingid;
+ /* var defaultvpcofferingid;
$.ajax({
url: createURL("listVPCOfferings"),
dataType: "json",
@@ -4560,14 +4569,14 @@
success: function(json) {
defaultvpcofferingid = json.listvpcofferingsresponse.vpcoffering[0].id;
}
- });
+ });*/
var dataObj = {
name: args.data.name,
displaytext: args.data.displaytext,
zoneid: args.data.zoneid,
cidr: args.data.cidr,
- vpcofferingid: defaultvpcofferingid
+ vpcofferingid: args.data.loadbalancer // Support for external load balancer
};
if(args.data.networkdomain != null && args.data.networkdomain.length > 0)
[35/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
[GSoC]: Proposal from Dharmesh Kakadia
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/e17a0c23
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/e17a0c23
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/e17a0c23
Branch: refs/heads/vmsync
Commit: e17a0c23b8d4d7cbbcbf4a95cf545b0d8ae59aaa
Parents: 302741d
Author: Sebastien Goasguen <ru...@gmail.com>
Authored: Fri Jun 7 06:03:42 2013 -0400
Committer: Sebastien Goasguen <ru...@gmail.com>
Committed: Fri Jun 7 06:03:42 2013 -0400
----------------------------------------------------------------------
docs/en-US/CloudStack_GSoC_Guide.xml | 1 +
docs/en-US/gsoc-dharmesh.xml | 149 ++++++++++++++++++++++
docs/en-US/images/mesos-integration-arch.jpg | 0
3 files changed, 150 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e17a0c23/docs/en-US/CloudStack_GSoC_Guide.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/CloudStack_GSoC_Guide.xml b/docs/en-US/CloudStack_GSoC_Guide.xml
index b7ba61f..243a0ca 100644
--- a/docs/en-US/CloudStack_GSoC_Guide.xml
+++ b/docs/en-US/CloudStack_GSoC_Guide.xml
@@ -48,6 +48,7 @@
</bookinfo>
<xi:include href="gsoc-tuna.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
<xi:include href="gsoc-imduffy15.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
+ <xi:include href="gsoc-dharmesh.xml" xmlns:xi="http://www.w3.org/2001/XInclude" />
</book>
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e17a0c23/docs/en-US/gsoc-dharmesh.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/gsoc-dharmesh.xml b/docs/en-US/gsoc-dharmesh.xml
new file mode 100644
index 0000000..5e2bf73
--- /dev/null
+++ b/docs/en-US/gsoc-dharmesh.xml
@@ -0,0 +1,149 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % BOOK_ENTITIES SYSTEM "CloudStack_GSoC_Guide.ent">
+%BOOK_ENTITIES;
+]>
+
+<!-- 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.
+-->
+
+<chapter id="gsoc-dharmesh">
+ <title>Dharmesh's 2013 GSoC Proposal</title>
+ <para>This chapter describes Dharmrsh's 2013 Google Summer of Code project within the &PRODUCT; ASF project. It is a copy paste of the submitted proposal.</para>
+ <section id="abstract-dharmesh">
+ <title>Abstract</title>
+ <para>
+ The project aims to bring <ulink url="http://aws.amazon.com/cloudformation/"><citetitle>cloudformation</citetitle></ulink> like service to cloudstack. One of the prime use-case is cluster computing frameworks on cloudstack. A cloudformation service will give users and administrators of cloudstack ability to manage and control a set of resources easily. The cloudformation will allow booting and configuring a set of VMs and form a cluster. Simple example would be LAMP stack. More complex clusters such as mesos or hadoop cluster requires a little more advanced configuration. There is already some work done by Chiradeep Vittal at this front [5]. In this project, I will implement server side cloudformation service for cloudstack and demonstrate how to run mesos cluster using it.
+ </para>
+ </section>
+
+ <section id="mesos">
+ <title>Mesos</title>
+ <para>
+ <ulink url="http://incubator.apache.org/mesos/"><citetitle>Mesos</citetitle></ulink> is a resource management platform for clusters. It aims to increase resource utilization of clusters by sharing cluster resources among multiple processing frameworks(like MapReduce, MPI, Graph Processing) or multiple instances of same framework. It provides efficient resource isolation through use of containers. Uses zookeeper for state maintenance and fault tolerance.
+ </para>
+ </section>
+
+ <section id="mesos-use">
+ <title>What can run on mesos ?</title>
+
+ <para><emphasis role="bold">Spark:</emphasis> A cluster computing framework based on the Resilient Distributed Datasets (RDDs) abstraction. RDD is more generalized than MapReduce and can support iterative and interactive computation while retaining fault tolerance, scalability, data locality etc.</para>
+
+ <para><emphasis role="bold">Hadoop:</emphasis>: Hadoop is fault tolerant and scalable distributed computing framework based on MapReduce abstraction.</para>
+
+ <para><emphasis role="bold">Begel:</emphasis>: A graph processing framework based on pregel.</para>
+
+ <para>and other frameworks like MPI, Hypertable.</para>
+ </section>
+
+ <section id="mesos-deploy">
+ <title>How to deploy mesos ?</title>
+
+ <para>Mesos provides cluster installation <ulink url="https://github.com/apache/mesos/blob/trunk/docs/Deploy-Scripts.textile"><citetitle>scripts</citetitle></ulink> for cluster deployment. There are also scripts available to deploy a cluster on <ulink url="https://github.com/apache/mesos/blob/trunk/docs/EC2-Scripts.textile"><citetitle>Amazon EC2</citetitle></ulink>. It would be interesting to see if this scripts can be leveraged in anyway.</para>
+ </section>
+
+ <section id="deliverables-dharmesh">
+ <title>Deliverables</title>
+ <orderedlist>
+ <listitem>
+ <para>Deploy CloudStack and understand instance configuration/contextualization</para>
+ </listitem>
+ <listitem>
+ <para>Test and deploy Mesos on a set of CloudStack based VM, manually. Design/propose an automation framework</para>
+ </listitem>
+ <listitem>
+ <para>Test stackmate and engage chiradeep (report bugs, make suggestion, make pull request)</para>
+ </listitem>
+ <listitem>
+ <para>Create cloudformation template to provision a Mesos Cluster</para>
+ </listitem>
+ <listitem>
+ <para>Compare with Apache Whirr or other cluster provisioning tools for server side implementation of cloudformation service.</para>
+ </listitem>
+ </orderedlist>
+ </section>
+
+ <section id="arch-and-tools">
+ <title>Architecture and Tools</title>
+
+ <para>The high level architecture is as follows:</para>
+
+ <para>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="images/mesos-integration-arch.jpg"/>
+ </imageobject>
+ </mediaobject>
+ </para>
+
+
+ <para>It includes following components:</para>
+
+ <orderedlist>
+ <listitem>
+ <para>CloudFormation Query API server:</para>
+ <para>This acts as a point of contact to and exposes CloudFormation functionality as Query API. This can be accessed directly or through existing tools from Amazon AWS for their cloudformation service. It will be easy to start as a module which resides outside cloudstack at first and I plan to use dropwizard [3] to start with. Later may be the API server can be merged with cloudstack core. I plan to use mysql for storing details of clusters.</para>
+ </listitem>
+
+ <listitem>
+ <para>Provisioning:</para>
+
+ <para>Provisioning module is responsible for handling the booting process of the VMs through cloudstack. This uses the cloudstack APIs for launching VMs. I plan to use preconfigured templates/images with required dependencies installed, which will make cluster creation process much faster even for large clusters. Error handling is very important part of this module. For example, what you do if few VMs fail to boot in cluster ?</para>
+ </listitem>
+
+ <listitem>
+ <para>Configuration:</para>
+
+ <para>This module deals with configuring the VMs to form a cluster. This can be done via manual scripts/code or via configuration management tools like chef/ironfan/knife. Potentially workflow automation tools like rundeck [4] also can be used. Also Apache whirr and Provisionr are options. I plan to explore this tools and select suitable ones.</para>
+ </listitem>
+
+ </orderedlist>
+ </section>
+
+ <section id="api">
+ <title>API</title>
+
+ <para>Query <ulink url="http://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_Operations.html"><citetitle>API</citetitle></ulink> will be based on Amazon AWS cloudformation service. This will allow leveraging existing <ulink url="http://aws.amazon.com/developertools/AWS-CloudFormation"><citetitle>tools</citetitle></ulink> for AWS.</para>
+ </section>
+
+ <section id="timeline">
+ <title>Timeline</title>
+ <para>1-1.5 week : project design. Architecture, tools selection, API design</para>
+ <para>1-1.5 week : getting familiar with cloudstack and stackmate codebase and architecture details</para>
+ <para>1-1.5 week : getting familiar with mesos internals</para>
+ <para>1-1.5 week : setting up the dev environment and create mesos templates</para>
+ <para>2-3 week : build provisioning and configuration module</para>
+ <para>Midterm evaluation: provisioning module, configuration module</para>
+ <para>2-3 week : develope cloudformation server side implementation</para>
+ <para>2-3 week : test and integrate</para>
+ </section>
+
+ <section id="future-work">
+ <title>Future Work</title>
+ <orderedlist>
+ <listitem>
+ <para><emphasis role="bold">Auto Scaling:</emphasis></para>
+ <para>Automatically adding or removing VMs from mesos cluster based on various conditions like utilization going above/below a static threshold. There can be more sophisticated strategies based on prediction or fine grained metric collection with tight integration with mesos framework.</para>
+ </listitem>
+ <listitem>
+ <para><emphasis role="bold">Cluster Simulator:</emphasis></para>
+ <para>Integrating with existing simulator to simulate mesos clusters. This can be useful in various scenarios, for example while developing a new scheduling algorithm, testing autoscaling etc.</para>
+ </listitem>
+ </orderedlist>
+ </section>
+</chapter>
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e17a0c23/docs/en-US/images/mesos-integration-arch.jpg
----------------------------------------------------------------------
diff --git a/docs/en-US/images/mesos-integration-arch.jpg b/docs/en-US/images/mesos-integration-arch.jpg
new file mode 100644
index 0000000..e69de29
[19/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
check for null ACL before creating ACL commands
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/62e125c0
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/62e125c0
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/62e125c0
Branch: refs/heads/vmsync
Commit: 62e125c081cd46858fb835290e35e037922a941a
Parents: aa2fb31
Author: Kishan Kavala <ki...@cloud.com>
Authored: Thu Jun 6 18:53:19 2013 +0530
Committer: Kishan Kavala <ki...@cloud.com>
Committed: Thu Jun 6 19:02:44 2013 +0530
----------------------------------------------------------------------
.../network/router/VpcVirtualNetworkApplianceManagerImpl.java | 6 +++---
server/src/com/cloud/network/vpc/NetworkACLManagerImpl.java | 3 +++
2 files changed, 6 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/62e125c0/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
index 9992b7c..7115499 100644
--- a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
@@ -949,9 +949,9 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
if (router.getVpcId() != null) {
if (_networkModel.isProviderSupportServiceInNetwork(guestNetworkId, Service.NetworkACL, Provider.VPCVirtualRouter)) {
List<NetworkACLItemVO> networkACLs = _networkACLMgr.listNetworkACLItems(guestNetworkId);
- s_logger.debug("Found " + networkACLs.size() + " network ACLs to apply as a part of VPC VR " + router
- + " start for guest network id=" + guestNetworkId);
- if (!networkACLs.isEmpty()) {
+ if ((networkACLs != null) && !networkACLs.isEmpty()) {
+ s_logger.debug("Found " + networkACLs.size() + " network ACLs to apply as a part of VPC VR " + router
+ + " start for guest network id=" + guestNetworkId);
createNetworkACLsCommands(networkACLs, router, cmds, guestNetworkId, false);
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/62e125c0/server/src/com/cloud/network/vpc/NetworkACLManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/NetworkACLManagerImpl.java b/server/src/com/cloud/network/vpc/NetworkACLManagerImpl.java
index 171b8b9..bf6b859 100644
--- a/server/src/com/cloud/network/vpc/NetworkACLManagerImpl.java
+++ b/server/src/com/cloud/network/vpc/NetworkACLManagerImpl.java
@@ -294,6 +294,9 @@ public class NetworkACLManagerImpl extends ManagerBase implements NetworkACLMana
@Override
public List<NetworkACLItemVO> listNetworkACLItems(long guestNtwkId) {
Network network = _networkMgr.getNetwork(guestNtwkId);
+ if(network.getNetworkACLId() == null){
+ return null;
+ }
return _networkACLItemDao.listByACL(network.getNetworkACLId());
}
[38/50] [abbrv] git commit: updated refs/heads/vmsync to aaa16af
Posted by ah...@apache.org.
CLOUDSTACK-1647: IP Reservation should not happen if the guest-vm cidr and network cidr is not same but their start ip and end ip are same.
Signed-off-by: Sateesh Chodapuneedi <sa...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/5dc7387d
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/5dc7387d
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/5dc7387d
Branch: refs/heads/vmsync
Commit: 5dc7387d3b6b1abd841abc92e3c76a3894213d82
Parents: 5233e32
Author: Saksham Srivastava <sa...@citrix.com>
Authored: Wed Jun 5 16:28:05 2013 +0530
Committer: Sateesh Chodapuneedi <sa...@apache.org>
Committed: Fri Jun 7 16:54:40 2013 +0530
----------------------------------------------------------------------
.../com/cloud/network/NetworkServiceImpl.java | 15 +++++++++++
utils/src/com/cloud/utils/net/NetUtils.java | 28 ++++++++++++++++++++
.../test/com/cloud/utils/net/NetUtilsTest.java | 19 +++++++++++++
3 files changed, 62 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5dc7387d/server/src/com/cloud/network/NetworkServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java b/server/src/com/cloud/network/NetworkServiceImpl.java
index 29a36b9..c2af8e8 100755
--- a/server/src/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/com/cloud/network/NetworkServiceImpl.java
@@ -2116,6 +2116,21 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
}
}
+ // In some scenarios even though guesVmCidr and network CIDR do not appear similar but
+ // the IP ranges exactly matches, in these special cases make sure no Reservation gets applied
+ if (network.getNetworkCidr() == null) {
+ if (NetUtils.isSameIpRange(guestVmCidr, network.getCidr()) && !guestVmCidr.equals(network.getCidr())) {
+ throw new InvalidParameterValueException("The Start IP and End IP of guestvmcidr: "+ guestVmCidr + " and CIDR: " + network.getCidr() + " are same, " +
+ "even though both the cidrs appear to be different. As a precaution no IP Reservation will be applied.");
+ }
+ } else {
+ if(NetUtils.isSameIpRange(guestVmCidr, network.getNetworkCidr()) && !guestVmCidr.equals(network.getNetworkCidr())) {
+ throw new InvalidParameterValueException("The Start IP and End IP of guestvmcidr: "+ guestVmCidr + " and Network CIDR: " + network.getNetworkCidr() + " are same, " +
+ "even though both the cidrs appear to be different. As a precaution IP Reservation will not be affected. If you want to reset IP Reservation, " +
+ "specify guestVmCidr to be: " + network.getNetworkCidr());
+ }
+ }
+
// When reservation is applied for the first time, network_cidr will be null
// Populate it with the actual network cidr
if (network.getNetworkCidr() == null) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5dc7387d/utils/src/com/cloud/utils/net/NetUtils.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/net/NetUtils.java b/utils/src/com/cloud/utils/net/NetUtils.java
index 8c094c8..12ac3e6 100755
--- a/utils/src/com/cloud/utils/net/NetUtils.java
+++ b/utils/src/com/cloud/utils/net/NetUtils.java
@@ -1023,6 +1023,34 @@ public class NetUtils {
return NetUtils.getIpRangeStartIpFromCidr(splitResult[0], size);
}
+ // Check if 2 CIDRs have exactly same IP Range
+ public static boolean isSameIpRange (String cidrA, String cidrB) {
+
+ if(!NetUtils.isValidCIDR(cidrA)) {
+ s_logger.info("Invalid value of cidr " + cidrA);
+ return false;
+ }
+ if (!NetUtils.isValidCIDR(cidrB)) {
+ s_logger.info("Invalid value of cidr " + cidrB);
+ return false;
+ }
+ String[] cidrPairFirst = cidrA.split("\\/");
+ String[] cidrPairSecond = cidrB.split("\\/");
+
+ Long networkSizeFirst = Long.valueOf(cidrPairFirst[1]);
+ Long networkSizeSecond = Long.valueOf(cidrPairSecond[1]);
+ String ipRangeFirst [] = NetUtils.getIpRangeFromCidr(cidrPairFirst[0], networkSizeFirst);
+ String ipRangeSecond [] = NetUtils.getIpRangeFromCidr(cidrPairFirst[0], networkSizeSecond);
+
+ long startIpFirst = NetUtils.ip2Long(ipRangeFirst[0]);
+ long endIpFirst = NetUtils.ip2Long(ipRangeFirst[1]);
+ long startIpSecond = NetUtils.ip2Long(ipRangeSecond[0]);
+ long endIpSecond = NetUtils.ip2Long(ipRangeSecond[1]);
+ if(startIpFirst == startIpSecond && endIpFirst == endIpSecond) {
+ return true;
+ }
+ return false;
+ }
public static boolean validateGuestCidr(String cidr) {
// RFC 1918 - The Internet Assigned Numbers Authority (IANA) has reserved the
// following three blocks of the IP address space for private internets:
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5dc7387d/utils/test/com/cloud/utils/net/NetUtilsTest.java
----------------------------------------------------------------------
diff --git a/utils/test/com/cloud/utils/net/NetUtilsTest.java b/utils/test/com/cloud/utils/net/NetUtilsTest.java
index 16d3402..9952d3c 100644
--- a/utils/test/com/cloud/utils/net/NetUtilsTest.java
+++ b/utils/test/com/cloud/utils/net/NetUtilsTest.java
@@ -136,4 +136,23 @@ public class NetUtilsTest extends TestCase {
assertTrue(NetUtils.getPrimaryPvlanFromUri(uri).equals("123"));
assertTrue(NetUtils.getIsolatedPvlanFromUri(uri).equals("456"));
}
+
+ public void testIsSameIpRange() {
+ //Test to check IP Range of 2 CIDRs
+ String cidrFirst = "10.0.144.0/20";
+ String cidrSecond = "10.0.151.0/20";
+ String cidrThird = "10.0.144.0/21";
+ assertTrue(NetUtils.isValidCIDR(cidrFirst));
+ assertTrue(NetUtils.isValidCIDR(cidrSecond));
+ assertTrue(NetUtils.isValidCIDR(cidrThird));
+
+ //Check for exactly same CIDRs
+ assertTrue(NetUtils.isSameIpRange(cidrFirst, cidrFirst));
+ //Check for 2 different CIDRs, but same IP Range
+ assertTrue(NetUtils.isSameIpRange(cidrFirst, cidrSecond));
+ //Check for 2 different CIDRs and different IP Range
+ assertFalse(NetUtils.isSameIpRange(cidrFirst, cidrThird));
+ //Check for Incorrect format of CIDR
+ assertFalse(NetUtils.isSameIpRange(cidrFirst, "10.3.6.5/50"));
+ }
}