mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	Problem: Custom compute offering does not allow setting min and max values for CPU and VRAM for custom VMs. Root Cause: Custom compute offerings cannot be created with a given range of CPU number and memory instead it allows only fixed values. Solution: createServiceOffering API has been modified to allow setting a defined range for CPU number and memory. Also, UI form for compute offering creation is provided with a new field named 'compute offering type’ with values - Fixed, Custom Constrained, Custom Constrained. It will allow the creation of compute offerings either with a fixed CPU speed and memory for fixed compute offering, or with a range of CPU number and memory for custom constrained compute offering or without predefined CPU number, CPU speed and memory for custom unconstrained compute offering. To allow the user to set CPU number, CPU speed and memory during VM deployment, UI form for VM deployment has been modified to provide controls to change these values. These controls are depicted in screenshots below for custom constrained and custom unconstrained compute offering types. Sample API calls using cmk to create a constrained service offering and deploying a VM using it, create serviceoffering name=Constrained displaytext=Constrained customized=true mincpunumber=2 maxcpunumber=4 cpuspeed=400 minmemory=256 maxmemory=1024 deploy virtualmachine displayname=ConstrainedVM serviceofferingid=60f3e500-6559-40b2-9a61-2192891c2bd6 templateid=8e0f4a3e-601b-11e9-9df4-a0afbd4a2d60 zoneid=9612a0c6-ed28-4fae-9a48-6eb207af29e3 details[0].cpuNumber=3 details[0].memory=800 Signed-off-by: Abhishek Kumar <abhishek.kumar@shapeblue.com>
		
			
				
	
	
		
			339 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			339 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| // 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.service;
 | |
| 
 | |
| import java.util.Map;
 | |
| 
 | |
| import javax.persistence.Column;
 | |
| import javax.persistence.DiscriminatorValue;
 | |
| import javax.persistence.Entity;
 | |
| import javax.persistence.PrimaryKeyJoinColumn;
 | |
| import javax.persistence.Table;
 | |
| import javax.persistence.Transient;
 | |
| 
 | |
| import com.cloud.offering.ServiceOffering;
 | |
| import com.cloud.storage.DiskOfferingVO;
 | |
| import com.cloud.storage.Storage.ProvisioningType;
 | |
| import com.cloud.vm.VirtualMachine;
 | |
| 
 | |
| @Entity
 | |
| @Table(name = "service_offering")
 | |
| @DiscriminatorValue(value = "Service")
 | |
| @PrimaryKeyJoinColumn(name = "id")
 | |
| public class ServiceOfferingVO extends DiskOfferingVO implements ServiceOffering {
 | |
|     @Column(name = "cpu")
 | |
|     private Integer cpu;
 | |
| 
 | |
|     @Column(name = "speed")
 | |
|     private Integer speed;
 | |
| 
 | |
|     @Column(name = "ram_size")
 | |
|     private Integer ramSize;
 | |
| 
 | |
|     @Column(name = "nw_rate")
 | |
|     private Integer rateMbps;
 | |
| 
 | |
|     @Column(name = "mc_rate")
 | |
|     private Integer multicastRateMbps;
 | |
| 
 | |
|     @Column(name = "ha_enabled")
 | |
|     private boolean offerHA;
 | |
| 
 | |
|     @Column(name = "limit_cpu_use")
 | |
|     private boolean limitCpuUse;
 | |
| 
 | |
|     @Column(name = "is_volatile")
 | |
|     private boolean volatileVm;
 | |
| 
 | |
|     @Column(name = "host_tag")
 | |
|     private String hostTag;
 | |
| 
 | |
|     @Column(name = "default_use")
 | |
|     private boolean defaultUse;
 | |
| 
 | |
|     @Column(name = "vm_type")
 | |
|     private String vmType;
 | |
| 
 | |
|     @Column(name = "sort_key")
 | |
|     int sortKey;
 | |
| 
 | |
|     @Column(name = "deployment_planner")
 | |
|     private String deploymentPlanner = null;
 | |
| 
 | |
|     // This is a delayed load value.  If the value is null,
 | |
|     // then this field has not been loaded yet.
 | |
|     // Call service offering dao to load it.
 | |
|     @Transient
 | |
|     Map<String, String> details;
 | |
| 
 | |
|     // This flag is required to tell if the offering is dynamic once the cpu, memory and speed are set.
 | |
|     // In some cases cpu, memory and speed are set to non-null values even if the offering is dynamic.
 | |
|     @Transient
 | |
|     boolean isDynamic;
 | |
| 
 | |
|     protected ServiceOfferingVO() {
 | |
|         super();
 | |
|     }
 | |
| 
 | |
|     public ServiceOfferingVO(String name, Integer cpu, Integer ramSize, Integer speed, Integer rateMbps, Integer multicastRateMbps, boolean offerHA, String displayText,
 | |
|             ProvisioningType provisioningType, boolean useLocalStorage, boolean recreatable, String tags, boolean systemUse, VirtualMachine.Type vmType, boolean defaultUse) {
 | |
|         super(name, displayText, provisioningType, false, tags, recreatable, useLocalStorage, systemUse, true);
 | |
|         this.cpu = cpu;
 | |
|         this.ramSize = ramSize;
 | |
|         this.speed = speed;
 | |
|         this.rateMbps = rateMbps;
 | |
|         this.multicastRateMbps = multicastRateMbps;
 | |
|         this.offerHA = offerHA;
 | |
|         limitCpuUse = false;
 | |
|         volatileVm = false;
 | |
|         this.defaultUse = defaultUse;
 | |
|         this.vmType = vmType == null ? null : vmType.toString().toLowerCase();
 | |
|     }
 | |
| 
 | |
|     public ServiceOfferingVO(String name, Integer cpu, Integer ramSize, Integer speed, Integer rateMbps, Integer multicastRateMbps, boolean offerHA, boolean limitCpuUse,
 | |
|             boolean volatileVm, String displayText, ProvisioningType provisioningType, boolean useLocalStorage, boolean recreatable, String tags, boolean systemUse, VirtualMachine.Type vmType, Long domainId) {
 | |
|         super(name, displayText, provisioningType, false, tags, recreatable, useLocalStorage, systemUse, true, domainId);
 | |
|         this.cpu = cpu;
 | |
|         this.ramSize = ramSize;
 | |
|         this.speed = speed;
 | |
|         this.rateMbps = rateMbps;
 | |
|         this.multicastRateMbps = multicastRateMbps;
 | |
|         this.offerHA = offerHA;
 | |
|         this.limitCpuUse = limitCpuUse;
 | |
|         this.volatileVm = volatileVm;
 | |
|         this.vmType = vmType == null ? null : vmType.toString().toLowerCase();
 | |
|     }
 | |
| 
 | |
|     public ServiceOfferingVO(String name, Integer cpu, Integer ramSize, Integer speed, Integer rateMbps, Integer multicastRateMbps, boolean offerHA,
 | |
|             boolean limitResourceUse, boolean volatileVm, String displayText, ProvisioningType provisioningType, boolean useLocalStorage, boolean recreatable, String tags, boolean systemUse,
 | |
|             VirtualMachine.Type vmType, Long domainId, String hostTag) {
 | |
|         this(name,
 | |
|             cpu,
 | |
|             ramSize,
 | |
|             speed,
 | |
|             rateMbps,
 | |
|             multicastRateMbps,
 | |
|             offerHA,
 | |
|             limitResourceUse,
 | |
|             volatileVm,
 | |
|             displayText,
 | |
|             provisioningType,
 | |
|             useLocalStorage,
 | |
|             recreatable,
 | |
|             tags,
 | |
|             systemUse,
 | |
|             vmType,
 | |
|             domainId);
 | |
|         this.hostTag = hostTag;
 | |
|     }
 | |
| 
 | |
|     public ServiceOfferingVO(String name, Integer cpu, Integer ramSize, Integer speed, Integer rateMbps, Integer multicastRateMbps, boolean offerHA,
 | |
|             boolean limitResourceUse, boolean volatileVm, String displayText, ProvisioningType provisioningType, boolean useLocalStorage, boolean recreatable, String tags, boolean systemUse,
 | |
|             VirtualMachine.Type vmType, Long domainId, String hostTag, String deploymentPlanner) {
 | |
|         this(name,
 | |
|             cpu,
 | |
|             ramSize,
 | |
|             speed,
 | |
|             rateMbps,
 | |
|             multicastRateMbps,
 | |
|             offerHA,
 | |
|             limitResourceUse,
 | |
|             volatileVm,
 | |
|             displayText,
 | |
|             provisioningType,
 | |
|             useLocalStorage,
 | |
|             recreatable,
 | |
|             tags,
 | |
|             systemUse,
 | |
|             vmType,
 | |
|             domainId,
 | |
|             hostTag);
 | |
|         this.deploymentPlanner = deploymentPlanner;
 | |
|     }
 | |
| 
 | |
|     public ServiceOfferingVO(ServiceOfferingVO offering) {
 | |
|         super(offering.getId(),
 | |
|             offering.getName(),
 | |
|             offering.getDisplayText(),
 | |
|             offering.getProvisioningType(),
 | |
|             false,
 | |
|             offering.getTags(),
 | |
|             offering.isRecreatable(),
 | |
|             offering.isUseLocalStorage(),
 | |
|             offering.isSystemUse(),
 | |
|             true,
 | |
|             offering.isCustomizedIops()== null ? false:offering.isCustomizedIops(),
 | |
|             offering.getDomainId(),
 | |
|             offering.getMinIops(),
 | |
|             offering.getMaxIops());
 | |
|         cpu = offering.getCpu();
 | |
|         ramSize = offering.getRamSize();
 | |
|         speed = offering.getSpeed();
 | |
|         rateMbps = offering.getRateMbps();
 | |
|         multicastRateMbps = offering.getMulticastRateMbps();
 | |
|         offerHA = offering.isOfferHA();
 | |
|         limitCpuUse = offering.getLimitCpuUse();
 | |
|         volatileVm = offering.isVolatileVm();
 | |
|         hostTag = offering.getHostTag();
 | |
|         vmType = offering.getSystemVmType();
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public boolean isOfferHA() {
 | |
|         return offerHA;
 | |
|     }
 | |
| 
 | |
|     public void setOfferHA(boolean offerHA) {
 | |
|         this.offerHA = offerHA;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public boolean getLimitCpuUse() {
 | |
|         return limitCpuUse;
 | |
|     }
 | |
| 
 | |
|     public void setLimitResourceUse(boolean limitCpuUse) {
 | |
|         this.limitCpuUse = limitCpuUse;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public boolean getDefaultUse() {
 | |
|         return defaultUse;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     @Transient
 | |
|     public String[] getTagsArray() {
 | |
|         String tags = getTags();
 | |
|         if (tags == null || tags.length() == 0) {
 | |
|             return new String[0];
 | |
|         }
 | |
| 
 | |
|         return tags.split(",");
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public Integer getCpu() {
 | |
|         return cpu;
 | |
|     }
 | |
| 
 | |
|     public void setCpu(int cpu) {
 | |
|         this.cpu = cpu;
 | |
|     }
 | |
| 
 | |
|     public void setSpeed(int speed) {
 | |
|         this.speed = speed;
 | |
|     }
 | |
| 
 | |
|     public void setRamSize(int ramSize) {
 | |
|         this.ramSize = ramSize;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public Integer getSpeed() {
 | |
|         return speed;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public Integer getRamSize() {
 | |
|         return ramSize;
 | |
|     }
 | |
| 
 | |
|     public void setRateMbps(Integer rateMbps) {
 | |
|         this.rateMbps = rateMbps;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public Integer getRateMbps() {
 | |
|         return rateMbps;
 | |
|     }
 | |
| 
 | |
|     public void setMulticastRateMbps(Integer multicastRateMbps) {
 | |
|         this.multicastRateMbps = multicastRateMbps;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public Integer getMulticastRateMbps() {
 | |
|         return multicastRateMbps;
 | |
|     }
 | |
| 
 | |
|     public void setHostTag(String hostTag) {
 | |
|         this.hostTag = hostTag;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public String getHostTag() {
 | |
|         return hostTag;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public String getSystemVmType() {
 | |
|         return vmType;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public void setSortKey(int key) {
 | |
|         sortKey = key;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public int getSortKey() {
 | |
|         return sortKey;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public boolean isVolatileVm() {
 | |
|         return volatileVm;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public String getDeploymentPlanner() {
 | |
|         return deploymentPlanner;
 | |
|     }
 | |
| 
 | |
|     public Map<String, String> getDetails() {
 | |
|         return details;
 | |
|     }
 | |
| 
 | |
|     public String getDetail(String name) {
 | |
|         return details != null ? details.get(name) : null ;
 | |
|     }
 | |
| 
 | |
|     public void setDetail(String name, String value) {
 | |
|         assert (details != null) : "Did you forget to load the details?";
 | |
| 
 | |
|         details.put(name, value);
 | |
|     }
 | |
| 
 | |
|     public void setDetails(Map<String, String> details) {
 | |
|         this.details = details;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public boolean isDynamic() {
 | |
|         return cpu == null || speed == null || ramSize == null || isDynamic;
 | |
|     }
 | |
| 
 | |
|     public void setDynamicFlag(boolean isdynamic) {
 | |
|         isDynamic = isdynamic;
 | |
|     }
 | |
| 
 | |
|     public boolean isCustomCpuSpeedSupported() {
 | |
|         return isCustomized() && getDetail("minCPU") != null;
 | |
|     }
 | |
| }
 |