').multiEdit({
+ context: context,
+ noSelect: true,
+ noHeaderActionsColumn: true,
+ fields: {
+ 'cidrlist': { edit: true, label: 'label.cidr' },
+ 'protocol': {
+ label: 'label.protocol',
+ select: function(args) {
+ args.$select.change(function() {
+ var $inputs = args.$form.find('th, td');
+ var $icmpFields = $inputs.filter(function() {
+ var name = $(this).attr('rel');
- return name != 'icmptype' &&
- name != 'icmpcode' &&
- name != 'protocol' &&
- name != 'add-rule' &&
- name != 'cidr' &&
- name != 'accountname' &&
- name != 'securitygroup';
+ return $.inArray(name, [
+ 'icmptype',
+ 'icmpcode'
+ ]) > -1;
+ });
+ var $otherFields = $inputs.filter(function() {
+ var name = $(this).attr('rel');
+
+ return name != 'cidrlist' &&
+ name != 'icmptype' &&
+ name != 'icmpcode' &&
+ name != 'protocol' &&
+ name != 'add-rule';
+ });
+
+ if ($(this).val() == 'icmp') {
+ $icmpFields.show();
+ $otherFields.hide();
+ } else {
+ $icmpFields.hide();
+ $otherFields.show();
+ }
});
- if ($(this).val() == 'icmp') {
- $icmpFields.show();
- $otherFields.hide();
- } else {
- $icmpFields.hide();
- $otherFields.show();
+ args.response.success({
+ data: [
+ { name: 'tcp', description: 'TCP' },
+ { name: 'udp', description: 'UDP' },
+ { name: 'icmp', description: 'ICMP' }
+ ]
+ });
+ }
+ },
+ 'startport': { edit: true, label: 'label.start.port' },
+ 'endport': { edit: true, label: 'label.end.port' },
+ 'icmptype': { edit: true, label: 'ICMP.type', isHidden: true },
+ 'icmpcode': { edit: true, label: 'ICMP.code', isHidden: true },
+ 'add-rule': {
+ label: 'label.add',
+ addButton: true
+ }
+ },
+ add: {
+ label: 'label.add',
+ action: function(args) {
+ var data = {
+ protocol: args.data.protocol,
+ cidrlist: args.data.cidrlist,
+ trafficType: 'Egress'
+ };
+
+ if (args.data.icmptype && args.data.icmpcode) { // ICMP
+ $.extend(data, {
+ icmptype: args.data.icmptype,
+ icmpcode: args.data.icmpcode
+ });
+ } else { // TCP/UDP
+ $.extend(data, {
+ startport: args.data.startport,
+ endport: args.data.endport
+ });
+ }
+
+ // Get Source NAT IP
+ var sourceNATIP;
+
+ $.ajax({
+ url: createURL('listPublicIpAddresses'),
+ data: {
+ listAll: true,
+ associatednetworkid: args.context.networks[0].id
+ },
+ async: false,
+ success: function(json) {
+ var ipAddresses = json.listpublicipaddressesresponse.publicipaddress;
+
+ sourceNATIP = $.grep(ipAddresses, function(ipAddress) {
+ return ipAddress.issourcenat;
+ })[0];
}
});
- args.response.success({
- data: [
- { name: 'tcp', description: 'TCP' },
- { name: 'udp', description: 'UDP' },
- { name: 'icmp', description: 'ICMP' }
- ]
+ data.ipaddressid = sourceNATIP.id;
+
+ $.ajax({
+ url: createURL('createFirewallRule'),
+ data: data,
+ dataType: 'json',
+ async: true,
+ success: function(json) {
+ var jobId = json.createfirewallruleresponse.jobid;
+
+ args.response.success({
+ _custom: {
+ jobId: jobId
+ },
+ notification: {
+ label: 'label.add.egress.rule',
+ poll: pollAsyncJobResult
+ }
+ });
+ },
+ error: function(json) {
+ args.response.error(parseXMLHttpResponse(json));
+ }
});
}
},
- 'startport': { edit: true, label: 'label.start.port' },
- 'endport': { edit: true, label: 'label.end.port' },
- 'icmptype': { edit: true, label: 'ICMP.type', isHidden: true },
- 'icmpcode': { edit: true, label: 'ICMP.code', isHidden: true },
- 'cidr': { edit: true, label: 'label.cidr', isHidden: true },
- 'accountname': {
- edit: true,
- label: 'label.account.and.security.group',
- isHidden: true,
- range: ['accountname', 'securitygroup']
+ actions: {
+ destroy: {
+ label: 'label.remove.rule',
+ action: function(args) {
+ $.ajax({
+ url: createURL('deleteFirewallRule'),
+ data: {
+ id: args.context.multiRule[0].id
+ },
+ dataType: 'json',
+ async: true,
+ success: function(data) {
+ var jobID = data.deletefirewallruleresponse.jobid;
+
+ args.response.success({
+ _custom: {
+ jobId: jobID
+ },
+ notification: {
+ label: 'label.remove.egress.rule',
+ poll: pollAsyncJobResult
+ }
+ });
+ },
+ error: function(json) {
+ args.response.error(parseXMLHttpResponse(json));
+ }
+ });
+ }
+ }
},
- 'add-rule': {
- label: 'label.add',
- addButton: true
- }
- },
- add: {
- label: 'label.add',
- action: function(args) {
- var data = {
- securitygroupid: args.context.securityGroups[0].id,
- protocol: args.data.protocol,
- domainid: args.context.securityGroups[0].domainid,
- account: args.context.securityGroups[0].account
- };
-
- // TCP / ICMP
- if (args.data.icmptype && args.data.icmpcode) { // ICMP
- $.extend(data, {
- icmptype: args.data.icmptype,
- icmpcode: args.data.icmpcode
- });
- } else { // TCP
- $.extend(data, {
- startport: args.data.startport,
- endport: args.data.endport
- });
- }
-
- // CIDR / account
- if (args.data.cidr) {
- data.cidrlist = args.data.cidr;
- } else {
- data['usersecuritygrouplist[0].account'] = args.data.accountname;
- data['usersecuritygrouplist[0].group'] = args.data.securitygroup;
- }
-
+ ignoreEmptyFields: true,
+ dataProvider: function(args) {
$.ajax({
- url: createURL('authorizeSecurityGroupEgress'),
- data: data,
+ url: createURL('listFirewallRules'),
+ data: {
+ listAll: true,
+ networkid: args.context.networks[0].id,
+ trafficType: 'Egress'
+ },
dataType: 'json',
async: true,
- success: function(data) {
- var jobId = data.authorizesecuritygroupegressresponse.jobid;
-
+ success: function(json) {
+ var response = json.listfirewallrulesresponse.firewallrule;
+
args.response.success({
- _custom: {
- jobId: jobId
- },
- notification: {
- label: 'label.add.egress.rule',
- poll: pollAsyncJobResult
- }
+ data: response
});
}
});
}
- },
- actions: {
- destroy: {
- label: 'label.remove.rule',
- action: function(args) {
- $.ajax({
- url: createURL('revokeSecurityGroupEgress'),
- data: {
- domainid: args.context.securityGroups[0].domainid,
- account: args.context.securityGroups[0].account,
- id: args.context.multiRule[0].id
- },
- dataType: 'json',
- async: true,
- success: function(data) {
- var jobID = data.revokesecuritygroupegress.jobid;
-
- args.response.success({
- _custom: {
- jobId: jobID
- },
- notification: {
- label: 'label.remove.egress.rule',
- poll: pollAsyncJobResult
- }
- });
- }
- });
- }
- }
- },
- ignoreEmptyFields: true,
- dataProvider: function(args) {
- $.ajax({
- url: createURL('listSecurityGroups'),
- data: {
- id: args.context.securityGroups[0].id
- },
- dataType: 'json',
- async: true,
- success: function(data) {
- args.response.success({
- data: $.map(
- data.listsecuritygroupsresponse.securitygroup[0].egressrule ?
- data.listsecuritygroupsresponse.securitygroup[0].egressrule : [],
- ingressEgressDataMap
- )
- });
- }
- });
- }
- })
+ });
+ }
}
},
@@ -4030,52 +4048,51 @@
});
}
},
-
- router: {
- title: 'VPC Router Details',
- fields:[
- {
- name: {label:'label.name'}
- },
- {
- id:{ label:'label.id'},
- zonename: { label: 'label.zone'},
- dns1: {label: 'label.dns'},
- gateway: {label:'label.gateway'},
- publicip: {label: 'label.public.ip'},
- guestipaddress:{ label: 'label.guest.ip'},
- linklocalip: {label: 'label.linklocal.ip'},
- state: { label:'label.state'},
- serviceofferingname: {label:'label.service.offering'},
- isredundantrouter:{
- label: 'label.redundant.router',
- converter: function(booleanValue) {
- if (booleanValue == true) {
- return "
Yes";
- }
- return "No";
- }
- },
- account: {label:'label.account'},
- domain: {label: 'label.domain'}
+ router: {
+ title: 'VPC Router Details',
+ fields:[
+ {
+ name: {label:'label.name'}
+ },
+ {
+ id:{ label:'label.id'},
+ zonename: { label: 'label.zone'},
+ dns1: {label: 'label.dns'},
+ gateway: {label:'label.gateway'},
+ publicip: {label: 'label.public.ip'},
+ guestipaddress:{ label: 'label.guest.ip'},
+ linklocalip: {label: 'label.linklocal.ip'},
+ state: { label:'label.state'},
+ serviceofferingname: {label:'label.service.offering'},
+ isredundantrouter:{
+ label: 'label.redundant.router',
+ converter: function(booleanValue) {
+ if (booleanValue == true) {
+ return "
Yes";
}
- ],
- dataProvider: function(args) {
- $.ajax ({
- url:createURL("listRouters&listAll=true&vpcid=" +args.context.vpc[0].id),
- dataType: "json",
- async: true,
- success:function(json) {
- var item = json.listroutersresponse.router[0];
- args.response.success ({
- data:item
- })
- }
-
- });
- }
-
+ return "No";
+ }
+ },
+ account: {label:'label.account'},
+ domain: {label: 'label.domain'}
+ }
+ ],
+ dataProvider: function(args) {
+ $.ajax({
+ url: createURL("listRouters&listAll=true&vpcid=" +args.context.vpc[0].id),
+ dataType: "json",
+ async: true,
+ success: function(json) {
+ var item = json.listroutersresponse.router[0];
+
+ args.response.success({
+ actionFilter: cloudStack.sections.system.routerActionFilter,
+ data:item
+ });
}
+ });
+ }
+ }
}
}
}
diff --git a/ui/scripts/projects.js b/ui/scripts/projects.js
index 34c57c6aae7..8310ecf0e4c 100644
--- a/ui/scripts/projects.js
+++ b/ui/scripts/projects.js
@@ -569,13 +569,18 @@
// Project listing data provider
dataProvider: function(args) {
var user = args.context.users[0];
+ var data = {
+ accountId: user.userid,
+ listAll: true
+ };
+
+ if (args.projectName) {
+ data.keyword = args.projectName;
+ }
$.ajax({
url: createURL('listProjects', { ignoreProject: true }),
- data: {
- accountId: user.userid,
- listAll: true
- },
+ data: data,
dataType: 'json',
async: true,
success: function(data) {
diff --git a/ui/scripts/sharedFunctions.js b/ui/scripts/sharedFunctions.js
index 5e187ed1b82..b6b3ef817f6 100644
--- a/ui/scripts/sharedFunctions.js
+++ b/ui/scripts/sharedFunctions.js
@@ -37,8 +37,8 @@ var ERROR_INTERNET_CANNOT_CONNECT = 12029;
var ERROR_VMOPS_ACCOUNT_ERROR = 531;
// Default password is MD5 hashed. Set the following variable to false to disable this.
-var md5Hashed = true;
-var md5HashedLogin = true;
+var md5Hashed = false;
+var md5HashedLogin = false;
//page size for API call (e.g."listXXXXXXX&pagesize=N" )
var pageSize = 20;
@@ -454,6 +454,29 @@ function listViewDataProvider(args, data) {
});
}
+//used by infrastruct page and network page
+var addExtraPropertiesToGuestNetworkObject = function(jsonObj) {
+ jsonObj.networkdomaintext = jsonObj.networkdomain;
+ jsonObj.networkofferingidText = jsonObj.networkofferingid;
+
+ if(jsonObj.acltype == "Domain") {
+ if(jsonObj.domainid == rootAccountId)
+ jsonObj.scope = "All";
+ else
+ jsonObj.scope = "Domain (" + jsonObj.domain + ")";
+ }
+ else if (jsonObj.acltype == "Account"){
+ if(jsonObj.project != null)
+ jsonObj.scope = "Account (" + jsonObj.domain + ", " + jsonObj.project + ")";
+ else
+ jsonObj.scope = "Account (" + jsonObj.domain + ", " + jsonObj.account + ")";
+ }
+
+ if(jsonObj.vlan == null && jsonObj.broadcasturi != null) {
+ jsonObj.vlan = jsonObj.broadcasturi.replace("vlan://", "");
+ }
+}
+
//find service object in network object
function ipFindNetworkServiceByName(pName, networkObj) {
if(networkObj == null)
diff --git a/ui/scripts/system.js b/ui/scripts/system.js
index 4eadf097b36..5a84bf8027b 100644
--- a/ui/scripts/system.js
+++ b/ui/scripts/system.js
@@ -194,6 +194,10 @@
podCount: function(data) {
$.ajax({
url: createURL('listPods'),
+ data: {
+ page: 1,
+ pagesize: 1 //specifying pagesize as 1 because we don't need any embedded objects to be returned here. The only thing we need from API response is "count" property.
+ },
success: function(json) {
dataFns.clusterCount($.extend(data, {
podCount: json.listpodsresponse.count ?
@@ -206,11 +210,24 @@
clusterCount: function(data) {
$.ajax({
url: createURL('listClusters'),
- success: function(json) {
- dataFns.hostCount($.extend(data, {
+ data: {
+ page: 1,
+ pagesize: 1 //specifying pagesize as 1 because we don't need any embedded objects to be returned here. The only thing we need from API response is "count" property.
+ },
+ success: function(json) {
+ dataFns.hostCount($.extend(data, {
clusterCount: json.listclustersresponse.count ?
json.listclustersresponse.count : 0
}));
+
+ //comment the 4 lines above and uncomment the following 4 lines if listHosts API still responds slowly.
+
+ /*
+ dataFns.primaryStorageCount($.extend(data, {
+ clusterCount: json.listclustersresponse.count ?
+ json.listclustersresponse.count : 0
+ }));
+ */
}
});
},
@@ -219,7 +236,9 @@
$.ajax({
url: createURL('listHosts'),
data: {
- type: 'routing'
+ type: 'routing',
+ page: 1,
+ pagesize: 1 //specifying pagesize as 1 because we don't need any embedded objects to be returned here. The only thing we need from API response is "count" property.
},
success: function(json) {
dataFns.primaryStorageCount($.extend(data, {
@@ -233,11 +252,24 @@
primaryStorageCount: function(data) {
$.ajax({
url: createURL('listStoragePools'),
- success: function(json) {
- dataFns.secondaryStorageCount($.extend(data, {
+ data: {
+ page: 1,
+ pagesize: 1 //specifying pagesize as 1 because we don't need any embedded objects to be returned here. The only thing we need from API response is "count" property.
+ },
+ success: function(json) {
+ dataFns.secondaryStorageCount($.extend(data, {
primaryStorageCount: json.liststoragepoolsresponse.count ?
json.liststoragepoolsresponse.count : 0
}));
+
+ //comment the 4 lines above and uncomment the following 4 lines if listHosts API still responds slowly.
+
+ /*
+ dataFns.systemVmCount($.extend(data, {
+ primaryStorageCount: json.liststoragepoolsresponse.count ?
+ json.liststoragepoolsresponse.count : 0
+ }));
+ */
}
});
},
@@ -246,7 +278,9 @@
$.ajax({
url: createURL('listHosts'),
data: {
- type: 'SecondaryStorage'
+ type: 'SecondaryStorage',
+ page: 1,
+ pagesize: 1 //specifying pagesize as 1 because we don't need any embedded objects to be returned here. The only thing we need from API response is "count" property.
},
success: function(json) {
dataFns.systemVmCount($.extend(data, {
@@ -260,6 +294,10 @@
systemVmCount: function(data) {
$.ajax({
url: createURL('listSystemVms'),
+ data: {
+ page: 1,
+ pagesize: 1 //specifying pagesize as 1 because we don't need any embedded objects to be returned here. The only thing we need from API response is "count" property.
+ },
success: function(json) {
dataFns.virtualRouterCount($.extend(data, {
systemVmCount: json.listsystemvmsresponse.count ?
@@ -273,14 +311,18 @@
$.ajax({
url: createURL('listRouters'),
data: {
- projectid: -1
+ projectid: -1,
+ page: 1,
+ pagesize: 1 //specifying pagesize as 1 because we don't need any embedded objects to be returned here. The only thing we need from API response is "count" property.
},
success: function(json) {
var total1 = json.listroutersresponse.count ? json.listroutersresponse.count : 0;
$.ajax({
url: createURL('listRouters'),
data: {
- listAll: true
+ listAll: true,
+ page: 1,
+ pagesize: 1 //specifying pagesize as 1 because we don't need any embedded objects to be returned here. The only thing we need from API response is "count" property.
},
success: function(json) {
var total2 = json.listroutersresponse.count ? json.listroutersresponse.count : 0;
@@ -336,13 +378,10 @@
data: data
});
};
-
- // re: CS-16413 -- Disable API calls
- return args.response.success({
- data: {}
- });
-
- dataFns.zoneCount({});
+
+ //dataFns.zoneCount({});
+ dataFns.podCount({}); //uncomment the line above and remove this line after "count" in listZones API is fixed.
+
}
},
@@ -10314,7 +10353,7 @@
return allowedActions;
}
- var routerActionfilter = function(args) {
+ var routerActionfilter = cloudStack.sections.system.routerActionFilter = function(args) {
var jsonObj = args.context.item;
var allowedActions = [];
@@ -10391,28 +10430,6 @@
}
}
- var addExtraPropertiesToGuestNetworkObject = function(jsonObj) {
- jsonObj.networkdomaintext = jsonObj.networkdomain;
- jsonObj.networkofferingidText = jsonObj.networkofferingid;
-
- if(jsonObj.acltype == "Domain") {
- if(jsonObj.domainid == rootAccountId)
- jsonObj.scope = "All";
- else
- jsonObj.scope = "Domain (" + jsonObj.domain + ")";
- }
- else if (jsonObj.acltype == "Account"){
- if(jsonObj.project != null)
- jsonObj.scope = "Account (" + jsonObj.domain + ", " + jsonObj.project + ")";
- else
- jsonObj.scope = "Account (" + jsonObj.domain + ", " + jsonObj.account + ")";
- }
-
- if(jsonObj.vlan == null && jsonObj.broadcasturi != null) {
- jsonObj.vlan = jsonObj.broadcasturi.replace("vlan://", "");
- }
- }
-
var addExtraPropertiesToRouterInstanceObject = function(jsonObj) {
if(jsonObj.isredundantrouter == true)
jsonObj["redundantRouterState"] = jsonObj.redundantstate;
diff --git a/ui/scripts/templates.js b/ui/scripts/templates.js
index f6c209a4a30..c865d740671 100644
--- a/ui/scripts/templates.js
+++ b/ui/scripts/templates.js
@@ -1428,7 +1428,7 @@
// "Delete Template"
//if (((isUser() && jsonObj.ispublic == true && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account)))
- if (((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account))) //if neither root-admin, nor item owner
+ if (((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account) && !(jsonObj.domainid == g_domainid && jsonObj.projectid == cloudStack.context.projects[0].id))) //if neither root-admin, nor the same account, nor the same project
|| (jsonObj.isready == false && jsonObj.status != null && jsonObj.status.indexOf("Downloaded") != -1)
|| (jsonObj.account == "system")) {
//do nothing
@@ -1487,7 +1487,7 @@
// "Delete ISO"
//if (((isUser() && jsonObj.ispublic == true && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account)))
- if (((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account))) //if neither root-admin, nor item owner
+ if (((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account) && !(jsonObj.domainid == g_domainid && jsonObj.projectid == cloudStack.context.projects[0].id))) //if neither root-admin, nor the same account, nor the same project
|| (jsonObj.isready == false && jsonObj.status != null && jsonObj.status.indexOf("Downloaded") != -1)
|| (jsonObj.account == "system")
) {
diff --git a/ui/scripts/ui-custom/instanceWizard.js b/ui/scripts/ui-custom/instanceWizard.js
index 6a9a0570d2d..a591d178e16 100644
--- a/ui/scripts/ui-custom/instanceWizard.js
+++ b/ui/scripts/ui-custom/instanceWizard.js
@@ -137,8 +137,8 @@
)
.append(
$('
').addClass('select-desc')
- .append($('
').addClass('name').html(this[fields.name]))
- .append($('
').addClass('desc').html(this[fields.desc]))
+ .append($('
').addClass('name').html(_s(this[fields.name])))
+ .append($('
').addClass('desc').html(_s(this[fields.desc])))
)
.data('json-obj', this);
@@ -876,6 +876,12 @@
}
});
+ $wizard.find('div.data-disk-offering div.custom-size input[type=text]').bind('change',function() {
+ var old = $wizard.find('div.data-disk-offering div.custom-size input[type=text]').val();
+ $wizard.find('div.data-disk-offering span.custom-disk-size').html(_s(old));
+ });
+
+
return $wizard.dialog({
title: _l('label.vm.add'),
width: 800,
diff --git a/ui/scripts/ui-custom/projects.js b/ui/scripts/ui-custom/projects.js
index 221d834d29f..117c4337726 100644
--- a/ui/scripts/ui-custom/projects.js
+++ b/ui/scripts/ui-custom/projects.js
@@ -543,8 +543,9 @@
var $cancel = $('
').addClass('button cancel').html(_l('label.cancel'));
// Get project data
- var loadData = function(complete) {
+ var loadData = function(complete, options) {
cloudStack.projects.dataProvider({
+ projectName: options ? options.projectName : null,
context: cloudStack.context,
response: {
success: function(args) {
@@ -585,7 +586,9 @@
// Search form
$searchForm.submit(function() {
$list.find('li').remove();
- loadData();
+ loadData(null, {
+ projectName: $(this).find('input[type=text]').val()
+ });
return false;
});
diff --git a/ui/scripts/ui/widgets/cloudBrowser.js b/ui/scripts/ui/widgets/cloudBrowser.js
index 47fbd0a08b5..9a56bb353e9 100644
--- a/ui/scripts/ui/widgets/cloudBrowser.js
+++ b/ui/scripts/ui/widgets/cloudBrowser.js
@@ -349,6 +349,11 @@
'cloudBrowser',
{
'breadcrumb': function($target, $browser, data) {
+
+ if ($ ('#browser').hasClass('panel-highlight')) {
+ return false;
+ }
+
$browser.cloudBrowser('selectPanel', { panel: data.panel });
}
}
diff --git a/ui/scripts/vpc.js b/ui/scripts/vpc.js
index a79006eab3f..e805282aba0 100644
--- a/ui/scripts/vpc.js
+++ b/ui/scripts/vpc.js
@@ -251,8 +251,27 @@
routerDetailView: function() {
return {
title: 'VPC router details',
+ updateContext: function(args) {
+ var router;
+
+ $.ajax({
+ url: createURL("listRouters&listAll=true&vpcid=" +args.context.vpc[0].id),
+ dataType: "json",
+ async: false,
+ success: function(json) {
+ router = json.listroutersresponse.router[0];
+ }
+ });
+
+ return {
+ routers: [router]
+ };
+ },
+ actions: cloudStack.sections.system.subsections.virtualRouters
+ .listView.detailView.actions,
tabs: {
- routerDetails: cloudStack.sections.network.sections.vpc.listView.detailView.tabs.router
+ routerDetails: cloudStack.sections.network.sections.vpc
+ .listView.detailView.tabs.router
}
};
},
@@ -1595,7 +1614,8 @@
}
});
- var hiddenTabs = [];
+ var hiddenTabs = ['ipAddresses']; // Disable IP address tab; it is redundant with 'view all' button
+
if(networkOfferingHavingELB == false)
hiddenTabs.push("addloadBalancer");
return hiddenTabs;
diff --git a/utils/pom.xml b/utils/pom.xml
index 47e20eda59c..2e4e74f5411 100644
--- a/utils/pom.xml
+++ b/utils/pom.xml
@@ -161,6 +161,7 @@
com/cloud/utils/testcase/*TestCase*
+ com/cloud/utils/db/*Test*