http://git-wip-us.apache.org/repos/asf/cloudstack/blob/98af4240/server/src/com/cloud/vm/VirtualMachineProfileImpl.java ---------------------------------------------------------------------- diff --cc server/src/com/cloud/vm/VirtualMachineProfileImpl.java index c4e8822,e777d5e..033daf3 --- a/server/src/com/cloud/vm/VirtualMachineProfileImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineProfileImpl.java @@@ -16,14 -16,7 +16,14 @@@ // under the License. package com.cloud.vm; -import com.cloud.agent.api.to.VolumeTO; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +import com.cloud.agent.api.to.DiskTO; - import com.cloud.agent.api.to.VolumeTO; ++ import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.offering.ServiceOffering; import com.cloud.service.ServiceOfferingVO; @@@ -40,7 -38,7 +40,7 @@@ import com.cloud.user.dao.AccountDao * */ public class VirtualMachineProfileImpl<T extends VMInstanceVO> implements VirtualMachineProfile<T> { -- ++ T _vm; ServiceOfferingVO _offering; VMTemplateVO _template; @@@ -55,7 -53,7 +55,7 @@@ Float memoryOvercommitRatio = 1.0f; VirtualMachine.Type _type; -- ++ public VirtualMachineProfileImpl(T vm, VMTemplateVO template, ServiceOfferingVO offering, Account owner, Map<Param, Object> params) { _vm = vm; _template = template; @@@ -68,25 -66,25 +68,25 @@@ if (vm != null) _type = vm.getType(); } -- ++ public VirtualMachineProfileImpl(T vm) { this(vm, null, null, null, null); } -- ++ public VirtualMachineProfileImpl(VirtualMachine.Type type) { _type = type; } -- ++ @Override public String toString() { return _vm.toString(); } -- ++ @Override public T getVirtualMachine() { return _vm; } -- ++ @Override public ServiceOffering getServiceOffering() { if (_offering == null) { @@@ -94,17 -92,17 +94,17 @@@ } return _offering; } -- ++ @Override public void setParameter(Param name, Object value) { _params.put(name, value); } -- -- @Override ++ ++ @Override public void setBootLoaderType(BootloaderType bootLoader) { this._bootloader = bootLoader; } -- ++ @Override public VirtualMachineTemplate getTemplate() { if (_template == null && _vm != null) { @@@ -112,7 -110,7 +112,7 @@@ } return _template; } -- ++ @Override public HypervisorType getHypervisorType() { return _vm.getHypervisorType(); @@@ -132,7 -130,7 +132,7 @@@ public long getId() { return _vm.getId(); } -- ++ @Override public String getUuid() { return _vm.getUuid(); @@@ -141,48 -139,48 +141,48 @@@ public void setNics(List<NicProfile> nics) { _nics = nics; } -- - public void setDisks(List<VolumeTO> disks) { ++ + public void setDisks(List<DiskTO> disks) { _disks = disks; } -- ++ @Override public List<NicProfile> getNics() { return _nics; } -- ++ @Override - public List<VolumeTO> getDisks() { + public List<DiskTO> getDisks() { return _disks; } -- ++ @Override public void addNic(int index, NicProfile nic) { _nics.add(index, nic); } -- ++ @Override - public void addDisk(int index, VolumeTO disk) { + public void addDisk(int index, DiskTO disk) { _disks.add(index, disk); } -- ++ @Override public StringBuilder getBootArgsBuilder() { return _bootArgs; } -- ++ @Override public void addBootArgs(String... args) { for (String arg : args) { _bootArgs.append(arg).append(" "); } } -- ++ @Override public VirtualMachine.Type getType() { return _type; } -- ++ @Override public Account getOwner() { if (_owner == null) { @@@ -190,12 -188,12 +190,12 @@@ } return _owner; } -- ++ @Override public String getBootArgs() { return _bootArgs.toString(); } -- ++ static ServiceOfferingDao s_offeringDao; static VMTemplateDao s_templateDao; static AccountDao s_accountDao; @@@ -219,12 -217,12 +219,12 @@@ public Object getParameter(Param name) { return _params.get(name); } -- ++ @Override public String getHostName() { return _vm.getHostName(); } -- ++ @Override public String getInstanceName() { return _vm.getInstanceName(); @@@ -234,28 -232,29 +234,29 @@@ public BootloaderType getBootLoaderType() { return this._bootloader; } -- ++ @Override public Map<Param, Object> getParameters() { return _params; } - public void setServiceOffering(ServiceOfferingVO offering) { - _offering = offering; - } + public void setServiceOffering(ServiceOfferingVO offering) { + _offering = offering; + } - public void setcpuOvercommitRatio(Float cpuOvercommitRatio){ - this.cpuOvercommitRatio= cpuOvercommitRatio; + public void setCpuOvercommitRatio(Float cpuOvercommitRatio) { + this.cpuOvercommitRatio = cpuOvercommitRatio; } - public void setramOvercommitRatio(Float memoryOvercommitRatio){ - this.memoryOvercommitRatio= memoryOvercommitRatio; + public void setMemoryOvercommitRatio(Float memoryOvercommitRatio) { + this.memoryOvercommitRatio = memoryOvercommitRatio; } + @Override - public Float getCpuOvercommitRatio(){ + public Float getCpuOvercommitRatio() { - return this.cpuOvercommitRatio; + return this.cpuOvercommitRatio; } @Override
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/98af4240/server/test/org/apache/cloudstack/networkoffering/ChildTestConfiguration.java ---------------------------------------------------------------------- diff --cc server/test/org/apache/cloudstack/networkoffering/ChildTestConfiguration.java index f5cf442,f862a2a..df15ceb --- a/server/test/org/apache/cloudstack/networkoffering/ChildTestConfiguration.java +++ b/server/test/org/apache/cloudstack/networkoffering/ChildTestConfiguration.java @@@ -19,6 -19,12 +19,12 @@@ package org.apache.cloudstack.networkof import java.io.IOException; ++ + import org.apache.cloudstack.acl.SecurityChecker; + import org.apache.cloudstack.region.PortableIpDaoImpl; + import org.apache.cloudstack.region.dao.RegionDaoImpl; -import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; + import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDaoImpl; + import org.apache.cloudstack.test.utils.SpringUtils; import org.mockito.Mockito; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@@ -29,11 -35,6 +35,7 @@@ import org.springframework.core.type.cl import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.core.type.filter.TypeFilter; - import org.apache.cloudstack.acl.SecurityChecker; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; - import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDaoImpl; - import org.apache.cloudstack.test.utils.SpringUtils; - import com.cloud.agent.AgentManager; import com.cloud.alert.AlertManager; import com.cloud.api.query.dao.UserAccountJoinDaoImpl; @@@ -350,11 -357,7 +358,11 @@@ public class ChildTestConfiguration return Mockito.mock(AccountDetailsDao.class); } - + @Bean + public DataStoreManager dataStoreManager() { + return Mockito.mock(DataStoreManager.class); + } - ++ public static class Library implements TypeFilter { @Override http://git-wip-us.apache.org/repos/asf/cloudstack/blob/98af4240/setup/db/db/schema-410to420.sql ---------------------------------------------------------------------- diff --cc setup/db/db/schema-410to420.sql index 5ddf3b6,885eff4..fd2ac56 --- a/setup/db/db/schema-410to420.sql +++ b/setup/db/db/schema-410to420.sql @@@ -526,7 -393,16 +526,16 @@@ CREATE TABLE `cloud`.`vm_snapshots` ALTER TABLE `cloud`.`hypervisor_capabilities` ADD COLUMN `vm_snapshot_enabled` tinyint(1) DEFAULT 0 NOT NULL COMMENT 'Whether VM snapshot is supported by hypervisor'; UPDATE `cloud`.`hypervisor_capabilities` SET `vm_snapshot_enabled`=1 WHERE `hypervisor_type` in ('VMware', 'XenServer'); + CREATE TABLE `cloud`.`service_offering_details` ( + `id` bigint unsigned NOT NULL auto_increment, + `service_offering_id` bigint unsigned NOT NULL COMMENT 'service offering id', + `name` varchar(255) NOT NULL, + `value` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + CONSTRAINT `fk_service_offering_details__service_offering_id` FOREIGN KEY (`service_offering_id`) REFERENCES `service_offering`(`id`) ON DELETE CASCADE, + CONSTRAINT UNIQUE KEY `uk_service_offering_id_name` (`service_offering_id`, `name`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; - + DROP VIEW IF EXISTS `cloud`.`user_vm_view`; CREATE VIEW `cloud`.`user_vm_view` AS select http://git-wip-us.apache.org/repos/asf/cloudstack/blob/98af4240/test/integration/smoke/test_volumes.py ---------------------------------------------------------------------- diff --cc test/integration/smoke/test_volumes.py index f29410d,89b013a..60fbb80 --- a/test/integration/smoke/test_volumes.py +++ b/test/integration/smoke/test_volumes.py @@@ -347,8 -344,9 +345,9 @@@ class TestVolumes(cloudstackTestCase) cls.custom_resized_disk_offering, cls.service_offering, cls.disk_offering, + cls.volume, cls.account - ] + ] @classmethod def tearDownClass(cls): http://git-wip-us.apache.org/repos/asf/cloudstack/blob/98af4240/tools/apidoc/gen_toc.py ---------------------------------------------------------------------- diff --cc tools/apidoc/gen_toc.py index c01bf47,793f720..5d7e3be --- a/tools/apidoc/gen_toc.py +++ b/tools/apidoc/gen_toc.py @@@ -141,12 -141,9 +141,13 @@@ known_categories = 'removeIpFromNic': 'Nic', 'listNics':'Nic', 'AffinityGroup': 'Affinity Group', + 'addImageStore': 'Image Store', + 'listImageStore': 'Image Store', + 'deleteImageStore': 'Image Store', + 'createCacheStore': 'Image Store', 'InternalLoadBalancer': 'Internal LB', 'DeploymentPlanners': 'Configuration', + 'PortableIp': 'Portable IP' } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/98af4240/ui/scripts/system.js ---------------------------------------------------------------------- diff --cc ui/scripts/system.js index 76f797c,2e23fc4..c62229c --- a/ui/scripts/system.js +++ b/ui/scripts/system.js @@@ -2708,7 -2708,363 +2708,363 @@@ } } }, - + + InternalLbVm: { + id: 'InternalLbVm', + label: 'InternalLbVm', + isMaximized: true, + type: 'detailView', + fields: { + name: { label: 'label.name' }, + ipaddress: { label: 'label.ip.address' }, + state: { label: 'label.status', indicator: { 'Enabled': 'on' } } + }, + tabs: { + network: { + title: 'label.network', + fields: [ + { + name: { label: 'label.name' } + }, + { + id: { label: 'label.id' }, + state: { label: 'label.state' }, + physicalnetworkid: { label: 'label.physical.network.ID' }, + destinationphysicalnetworkid: { label: 'label.destination.physical.network.id' }, + supportedServices: { label: 'label.supported.services' } + } + ], + dataProvider: function(args) { + refreshNspData("InternalLbVm"); + args.response.success({ + actionFilter: virtualRouterProviderActionFilter, + data: $.extend(nspMap["InternalLbVm"], { + supportedServices: nspMap["InternalLbVm"].servicelist.join(', ') + }) + }); + } + }, + + instances: { + title: 'label.instances', + listView: { + label: 'label.virtual.appliances', + id: 'internallbinstances', + fields: { + name: { label: 'label.name' }, + zonename: { label: 'label.zone' }, + routerType: { + label: 'label.type' + }, + state: { + converter: function(str) { + // For localization + return str; + }, + label: 'label.status', + indicator: { + 'Running': 'on', + 'Stopped': 'off', + 'Error': 'off' + } + } + }, + dataProvider: function(args) { + var array1 = []; + if(args.filterBy != null) { + if(args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) { + switch(args.filterBy.search.by) { + case "name": + if(args.filterBy.search.value.length > 0) + array1.push("&keyword=" + args.filterBy.search.value); + break; + } + } + } + + var routers = []; + $.ajax({ + url: createURL("listInternalLoadBalancerVMs&zoneid=" + selectedZoneObj.id + "&listAll=true&page=" + args.page + "&pagesize=" + pageSize + array1.join("")), + success: function(json) { + var items = json.listinternallbvmssresponse.internalloadbalancervm ? + json.listinternallbvmssresponse.internalloadbalancervm : []; + + $(items).map(function(index, item) { + routers.push(item); + }); + + // Get project routers + $.ajax({ + url: createURL("listInternalLoadBalancerVMs&zoneid=" + selectedZoneObj.id + "&listAll=true&page=" + args.page + "&pagesize=" + pageSize + array1.join("") + "&projectid=-1"), + success: function(json) { + var items = json.listinternallbvmssresponse.internalloadbalancervm ? + json.listinternallbvmssresponse.internalloadbalancervm : []; + + $(items).map(function(index, item) { + routers.push(item); + }); + args.response.success({ + actionFilter: internallbinstanceActionfilter, + data: $(routers).map(mapRouterType) + }); + } + }); + } + }); + }, + detailView: { + name: 'Virtual applicance details', + actions: { + start: { + label: 'Start LB VM', + messages: { + confirm: function(args) { + return 'Please confirm you want to start LB VM'; + }, + notification: function(args) { + return 'Start LB VM'; + } + }, + action: function(args) { + $.ajax({ + url: createURL('startInternalLoadBalancerVM&id=' + args.context.internallbinstances[0].id), + dataType: 'json', + async: true, + success: function(json) { + var jid = json.startinternallbvmresponse.jobid; + args.response.success({ + _custom: { + jobId: jid, + getUpdatedItem: function(json) { + return json.queryasyncjobresultresponse.jobresult.internalloadbalancervm; + }, + getActionFilter: function() { + return internallbinstanceActionfilter; + } + } + }); + } + }); + }, + notification: { + poll: pollAsyncJobResult + } + }, + + stop: { + label: 'Stop LB VM', + createForm: { + title: 'Please confirm you want to stop LB VM', + desc: 'Stop LB VM', + fields: { + forced: { + label: 'force.stop', + isBoolean: true, + isChecked: false + } + } + }, + messages: { + notification: function(args) { + return 'Stop LB VM'; + } + }, + action: function(args) { + var array1 = []; + array1.push("&forced=" + (args.data.forced == "on")); + $.ajax({ + url: createURL('stopInternalLoadBalancerVM&id=' + args.context.internallbinstances[0].id + array1.join("")), + dataType: 'json', + async: true, + success: function(json) { + var jid = json.stopinternallbvmresponse.jobid; + args.response.success({ + _custom: { + jobId: jid, + getUpdatedItem: function(json) { + return json.queryasyncjobresultresponse.jobresult.internalloadbalancervm; + }, + getActionFilter: function() { + return internallbinstanceActionfilter; + } + } + }); + } + }); + }, + notification: { + poll: pollAsyncJobResult + } + } + }, + tabs: { + details: { + title: 'label.details', + preFilter: function(args) { + var hiddenFields = []; + if (!args.context.internallbinstances[0].project) { + hiddenFields.push('project'); + hiddenFields.push('projectid'); + } + if(selectedZoneObj.networktype == 'Basic') { + hiddenFields.push('publicip'); //In Basic zone, guest IP is public IP. So, publicip is not returned by listRouters API. Only guestipaddress is returned by listRouters API. + } + return hiddenFields; + }, + fields: [ + { + name: { label: 'label.name' }, + project: { label: 'label.project' } + }, + { + id: { label: 'label.id' }, + projectid: { label: 'label.project.id' }, + state: { label: 'label.state' }, + guestnetworkid: { label: 'label.network.id' }, + publicip: { label: 'label.public.ip' }, + guestipaddress: { label: 'label.guest.ip' }, + linklocalip: { label: 'label.linklocal.ip' }, + hostname: { label: 'label.host' }, + serviceofferingname: { label: 'label.compute.offering' }, + networkdomain: { label: 'label.network.domain' }, + domain: { label: 'label.domain' }, + account: { label: 'label.account' }, + created: { label: 'label.created', converter: cloudStack.converters.toLocalDate }, + isredundantrouter: { + label: 'label.redundant.router', + converter: cloudStack.converters.toBooleanText + }, + redundantRouterState: { label: 'label.redundant.state' } + } + ], + dataProvider: function(args) { + $.ajax({ + url: createURL("listInternalLoadBalancerVMs&id=" + args.context.internallbinstances[0].id), + dataType: 'json', + async: true, + success: function(json) { + var jsonObj = json.listinternallbvmssresponse.internalloadbalancervm[0]; + addExtraPropertiesToRouterInstanceObject(jsonObj); + args.response.success({ + actionFilter: internallbinstanceActionfilter, + data: jsonObj + }); + } + }); + } + }, + nics: { + title: 'label.nics', + multiple: true, + fields: [ + { + name: { label: 'label.name', header: true }, + type: { label: 'label.type' }, + traffictype: { label: 'label.traffic.type' }, + networkname: { label: 'label.network.name' }, + netmask: { label: 'label.netmask' }, + ipaddress: { label: 'label.ip.address' }, + id: { label: 'label.id' }, + networkid: { label: 'label.network.id' }, + isolationuri: { label: 'label.isolation.uri' }, + broadcasturi: { label: 'label.broadcast.uri' } + } + ], + dataProvider: function(args) { + $.ajax({ + url: createURL("listInternalLoadBalancerVMs&id=" + args.context.internallbinstances[0].id), + dataType: 'json', + async: true, + success: function(json) { + var jsonObj = json.listinternallbvmssresponse.internalloadbalancervm[0].nic; + + args.response.success({ + actionFilter: internallbinstanceActionfilter, + data: $.map(jsonObj, function(nic, index) { + var name = 'NIC ' + (index + 1); + if (nic.isdefault) { + name += ' (' + _l('label.default') + ')'; + } + return $.extend(nic, { + name: name + }); + }) + }); + } + }); + } + } + } + } + } + } + }, + actions: { + enable: { + label: 'label.enable.provider', + action: function(args) { + $.ajax({ + url: createURL("updateNetworkServiceProvider&id=" + nspMap["InternalLbVm"].id + "&state=Enabled"), + dataType: "json", + success: function(json) { + var jid = json.updatenetworkserviceproviderresponse.jobid; + args.response.success( + {_custom: + { + jobId: jid, + getUpdatedItem: function(json) { + $(window).trigger('cloudStack.fullRefresh'); + } + } + } + ); + } + }); + }, + messages: { + confirm: function(args) { + return 'message.confirm.enable.provider'; + }, + notification: function() { + return 'label.enable.provider'; + } + }, + notification: { poll: pollAsyncJobResult } + }, + disable: { + label: 'label.disable.provider', + action: function(args) { + $.ajax({ + url: createURL("updateNetworkServiceProvider&id=" + nspMap["InternalLbVm"].id + "&state=Disabled"), + dataType: "json", + success: function(json) { + var jid = json.updatenetworkserviceproviderresponse.jobid; + args.response.success( + {_custom: + { + jobId: jid, + getUpdatedItem: function(json) { + $(window).trigger('cloudStack.fullRefresh'); + } + } + } + ); + } + }); + }, + messages: { + confirm: function(args) { + return 'message.confirm.disable.provider'; + }, + notification: function() { + return 'label.disable.provider'; + } + }, + notification: { poll: pollAsyncJobResult } + } + } + }, + vpcVirtualRouter: { id: 'vpcVirtualRouterProviders', label: 'VPC Virtual Router', @@@ -12355,7 -12376,20 +12711,20 @@@ } return allowedActions; } - + + var internallbinstanceActionfilter = function(args) { + var jsonObj = args.context.item; + var allowedActions = []; + + if (jsonObj.state == 'Running') { + allowedActions.push("stop"); + } + else if (jsonObj.state == 'Stopped') { + allowedActions.push("start"); + } + return allowedActions; + } + var systemvmActionfilter = function(args) { var jsonObj = args.context.item; var allowedActions = []; @@@ -12513,7 -12550,16 +12885,16 @@@ state: nspMap.midoNet? nspMap.midoNet.state : 'Disabled' } ); + + nspHardcodingArray.push( + { + id: 'InternalLbVm', + name: 'InternalLbVm', + state: nspMap.InternalLbVm ? nspMap.InternalLbVm.state : 'Disabled' + } + ); + - nspHardcodingArray.push( + nspHardcodingArray.push( { id: 'vpcVirtualRouter', name: 'VPC Virtual Router', http://git-wip-us.apache.org/repos/asf/cloudstack/blob/98af4240/ui/scripts/zoneWizard.js ----------------------------------------------------------------------
