Skip to content

Commit 0a1f69a

Browse files
committed
GPU support for KVM
1 parent 0bd35a5 commit 0a1f69a

115 files changed

Lines changed: 8603 additions & 354 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

api/src/main/java/com/cloud/agent/api/VgpuTypesInfo.java

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,22 @@
1515
// specific language governing permissions and limitations
1616
// under the License.
1717
package com.cloud.agent.api;
18+
19+
import org.apache.cloudstack.gpu.GpuDevice;
20+
1821
public class VgpuTypesInfo {
1922

23+
private boolean passthroughEnabled = true;
24+
private GpuDevice.DeviceType deviceType;
25+
private String parentBusAddress;
26+
private String busAddress;
27+
private String deviceId;
28+
private String deviceName;
29+
private String vendorId;
30+
private String vendorName;
2031
private String modelName;
2132
private String groupName;
33+
private String vmName;
2234
private Long maxHeads;
2335
private Long videoRam;
2436
private Long maxResolutionX;
@@ -71,6 +83,89 @@ public void setMaxVmCapacity(Long maxCapacity) {
7183
this.maxCapacity = maxCapacity;
7284
}
7385

86+
public boolean isPassthroughEnabled() {
87+
return passthroughEnabled;
88+
}
89+
90+
public void setPassthroughEnabled(boolean passthroughEnabled) {
91+
this.passthroughEnabled = passthroughEnabled;
92+
}
93+
94+
public GpuDevice.DeviceType getDeviceType() {
95+
return deviceType;
96+
}
97+
98+
public void setDeviceType(GpuDevice.DeviceType deviceType) {
99+
this.deviceType = deviceType;
100+
}
101+
102+
public String getParentBusAddress() {
103+
return parentBusAddress;
104+
}
105+
106+
public void setParentBusAddress(String parentBusAddress) {
107+
this.parentBusAddress = parentBusAddress;
108+
}
109+
110+
public String getBusAddress() {
111+
return busAddress;
112+
}
113+
114+
public void setBusAddress(String busAddress) {
115+
this.busAddress = busAddress;
116+
}
117+
118+
public String getDeviceId() {
119+
return deviceId;
120+
}
121+
122+
public void setDeviceId(String deviceId) {
123+
this.deviceId = deviceId;
124+
}
125+
126+
public String getDeviceName() {
127+
return deviceName;
128+
}
129+
130+
public void setDeviceName(String deviceName) {
131+
this.deviceName = deviceName;
132+
}
133+
134+
public String getVendorId() {
135+
return vendorId;
136+
}
137+
138+
public void setVendorId(String vendorId) {
139+
this.vendorId = vendorId;
140+
}
141+
142+
public String getVendorName() {
143+
return vendorName;
144+
}
145+
146+
public void setVendorName(String vendorName) {
147+
this.vendorName = vendorName;
148+
}
149+
150+
public String getVmName() {
151+
return vmName;
152+
}
153+
154+
public void setVmName(String vmName) {
155+
this.vmName = vmName;
156+
}
157+
158+
public VgpuTypesInfo(GpuDevice.DeviceType deviceType, String groupName, String modelName, String busAddress, String vendorId, String vendorName, String deviceId, String deviceName) {
159+
this.deviceType = deviceType;
160+
this.groupName = groupName;
161+
this.modelName = modelName;
162+
this.busAddress = busAddress;
163+
this.deviceId = deviceId;
164+
this.deviceName = deviceName;
165+
this.vendorId = vendorId;
166+
this.vendorName = vendorName;
167+
}
168+
74169
public VgpuTypesInfo(String groupName, String modelName, Long videoRam, Long maxHeads, Long maxResolutionX, Long maxResolutionY, Long maxVgpuPerGpu,
75170
Long remainingCapacity, Long maxCapacity) {
76171
this.groupName = groupName;

api/src/main/java/com/cloud/agent/api/to/GPUDeviceTO.java

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,33 @@
1616
// under the License.
1717
package com.cloud.agent.api.to;
1818

19+
import java.util.ArrayList;
1920
import java.util.HashMap;
21+
import java.util.List;
2022

2123
import com.cloud.agent.api.VgpuTypesInfo;
2224

2325
public class GPUDeviceTO {
2426

2527
private String gpuGroup;
2628
private String vgpuType;
29+
private int gpuCount;
2730
private HashMap<String, HashMap<String, VgpuTypesInfo>> groupDetails = new HashMap<String, HashMap<String, VgpuTypesInfo>>();
31+
private List<VgpuTypesInfo> gpuDevices = new ArrayList<>();
2832

29-
public GPUDeviceTO( String gpuGroup, String vgpuType, HashMap<String, HashMap<String, VgpuTypesInfo>> groupDetails) {
33+
public GPUDeviceTO(String gpuGroup, String vgpuType, int gpuCount,
34+
HashMap<String, HashMap<String, VgpuTypesInfo>> groupDetails,
35+
List<VgpuTypesInfo> gpuDevices) {
36+
this.gpuGroup = gpuGroup;
37+
this.vgpuType = vgpuType;
38+
this.groupDetails = groupDetails;
39+
this.gpuCount = gpuCount;
40+
this.gpuDevices = gpuDevices;
41+
42+
}
43+
44+
public GPUDeviceTO(String gpuGroup, String vgpuType,
45+
HashMap<String, HashMap<String, VgpuTypesInfo>> groupDetails) {
3046
this.gpuGroup = gpuGroup;
3147
this.vgpuType = vgpuType;
3248
this.groupDetails = groupDetails;
@@ -48,6 +64,14 @@ public void setVgpuType(String vgpuType) {
4864
this.vgpuType = vgpuType;
4965
}
5066

67+
public int getGpuCount() {
68+
return gpuCount;
69+
}
70+
71+
public void setGpuCount(int gpuCount) {
72+
this.gpuCount = gpuCount;
73+
}
74+
5175
public HashMap<String, HashMap<String, VgpuTypesInfo>> getGroupDetails() {
5276
return groupDetails;
5377
}
@@ -56,4 +80,11 @@ public void setGroupDetails(HashMap<String, HashMap<String, VgpuTypesInfo>> grou
5680
this.groupDetails = groupDetails;
5781
}
5882

83+
public List<VgpuTypesInfo> getGpuDevices() {
84+
return gpuDevices;
85+
}
86+
87+
public void setGpuDevices(List<VgpuTypesInfo> gpuDevices) {
88+
this.gpuDevices = gpuDevices;
89+
}
5990
}

api/src/main/java/com/cloud/event/EventTypes.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929
import org.apache.cloudstack.api.response.ZoneResponse;
3030
import org.apache.cloudstack.config.Configuration;
3131
import org.apache.cloudstack.datacenter.DataCenterIpv4GuestSubnet;
32+
import org.apache.cloudstack.gpu.GpuCard;
33+
import org.apache.cloudstack.gpu.GpuOffering;
34+
import org.apache.cloudstack.gpu.VgpuProfile;
3235
import org.apache.cloudstack.ha.HAConfig;
3336
import org.apache.cloudstack.network.BgpPeer;
3437
import org.apache.cloudstack.network.Ipv4GuestSubnetNetworkMap;
@@ -376,6 +379,21 @@ public class EventTypes {
376379
public static final String EVENT_DISK_OFFERING_EDIT = "DISK.OFFERING.EDIT";
377380
public static final String EVENT_DISK_OFFERING_DELETE = "DISK.OFFERING.DELETE";
378381

382+
// GPU Offerings
383+
public static final String EVENT_GPU_OFFERING_CREATE = "GPU.OFFERING.CREATE";
384+
public static final String EVENT_GPU_OFFERING_EDIT = "GPU.OFFERING.EDIT";
385+
public static final String EVENT_GPU_OFFERING_DELETE = "GPU.OFFERING.DELETE";
386+
387+
// GPU Cards
388+
public static final String EVENT_GPU_CARD_CREATE = "GPU.CARD.CREATE";
389+
public static final String EVENT_GPU_CARD_EDIT = "GPU.CARD.EDIT";
390+
public static final String EVENT_GPU_CARD_DELETE = "GPU.CARD.DELETE";
391+
392+
// vGPU Profile
393+
public static final String EVENT_VGPU_PROFILE_CREATE = "VGPU.PROFILE.CREATE";
394+
public static final String EVENT_VGPU_PROFILE_EDIT = "VGPU.PROFILE.EDIT";
395+
public static final String EVENT_VGPU_PROFILE_DELETE = "VGPU.PROFILE.DELETE";
396+
379397
// Network offerings
380398
public static final String EVENT_NETWORK_OFFERING_CREATE = "NETWORK.OFFERING.CREATE";
381399
public static final String EVENT_NETWORK_OFFERING_ASSIGN = "NETWORK.OFFERING.ASSIGN";
@@ -1000,6 +1018,21 @@ public class EventTypes {
10001018
entityEventDetails.put(EVENT_DISK_OFFERING_EDIT, DiskOffering.class);
10011019
entityEventDetails.put(EVENT_DISK_OFFERING_DELETE, DiskOffering.class);
10021020

1021+
// GPU Offerings
1022+
entityEventDetails.put(EVENT_GPU_OFFERING_CREATE, GpuOffering.class);
1023+
entityEventDetails.put(EVENT_GPU_OFFERING_EDIT, GpuOffering.class);
1024+
entityEventDetails.put(EVENT_GPU_OFFERING_DELETE, GpuOffering.class);
1025+
1026+
// GPU Cards
1027+
entityEventDetails.put(EVENT_GPU_CARD_CREATE, GpuCard.class);
1028+
entityEventDetails.put(EVENT_GPU_CARD_EDIT, GpuCard.class);
1029+
entityEventDetails.put(EVENT_GPU_CARD_DELETE, GpuCard.class);
1030+
1031+
// vGPU Profiles
1032+
entityEventDetails.put(EVENT_VGPU_PROFILE_CREATE, VgpuProfile.class);
1033+
entityEventDetails.put(EVENT_VGPU_PROFILE_EDIT, VgpuProfile.class);
1034+
entityEventDetails.put(EVENT_VGPU_PROFILE_DELETE, VgpuProfile.class);
1035+
10031036
// Network offerings
10041037
entityEventDetails.put(EVENT_NETWORK_OFFERING_CREATE, NetworkOffering.class);
10051038
entityEventDetails.put(EVENT_NETWORK_OFFERING_ASSIGN, NetworkOffering.class);

api/src/main/java/com/cloud/offering/ServiceOffering.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ public interface ServiceOffering extends InfrastructureEntity, InternalIdentity,
3636

3737
static final String PURGE_DB_ENTITIES_KEY = "purge.db.entities";
3838

39+
Integer getGpuCount();
40+
3941
enum State {
4042
Inactive, Active,
4143
}
@@ -142,4 +144,6 @@ enum StorageType {
142144
Boolean getDiskOfferingStrictness();
143145

144146
void setDiskOfferingStrictness(boolean diskOfferingStrictness);
147+
148+
Long getGpuOfferingId();
145149
}

api/src/main/java/org/apache/cloudstack/annotation/AnnotationService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ enum EntityType {
4242
VM_SNAPSHOT(true), INSTANCE_GROUP(true), SSH_KEYPAIR(true), USER_DATA(true),
4343
NETWORK(true), VPC(true), PUBLIC_IP_ADDRESS(true), VPN_CUSTOMER_GATEWAY(true),
4444
TEMPLATE(true), ISO(true), KUBERNETES_CLUSTER(true),
45-
SERVICE_OFFERING(false), DISK_OFFERING(false), NETWORK_OFFERING(false),
45+
SERVICE_OFFERING(false), DISK_OFFERING(false), NETWORK_OFFERING(false), GPU_OFFERING(false),
4646
ZONE(false), POD(false), CLUSTER(false), HOST(false), DOMAIN(false),
4747
PRIMARY_STORAGE(false), SECONDARY_STORAGE(false), VR(false), SYSTEM_VM(false),
4848
AUTOSCALE_VM_GROUP(true), MANAGEMENT_SERVER(false), OBJECT_STORAGE(false);
@@ -83,6 +83,7 @@ static public List<EntityType> getNotAllowedTypesForNonAdmins(RoleType roleType)
8383
list.add(EntityType.DOMAIN);
8484
list.add(EntityType.SERVICE_OFFERING);
8585
list.add(EntityType.DISK_OFFERING);
86+
list.add(EntityType.GPU_OFFERING);
8687
}
8788
return list;
8889
}

api/src/main/java/org/apache/cloudstack/api/ApiCommandResourceType.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ public enum ApiCommandResourceType {
7070
Project(com.cloud.projects.Project.class),
7171
Domain(com.cloud.domain.Domain.class),
7272
DiskOffering(com.cloud.offering.DiskOffering.class),
73+
GpuOffering(org.apache.cloudstack.gpu.GpuOffering.class),
7374
ServiceOffering(com.cloud.offering.ServiceOffering.class),
7475
NetworkOffering(com.cloud.offering.NetworkOffering.class),
7576
VpcOffering(com.cloud.network.vpc.VpcOffering.class),

api/src/main/java/org/apache/cloudstack/api/ApiConstants.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ public class ApiConstants {
6868
public static final String BOOTABLE = "bootable";
6969
public static final String BIND_DN = "binddn";
7070
public static final String BIND_PASSWORD = "bindpass";
71+
public static final String BUS_ADDRESS = "busaddress";
7172
public static final String BYTES_READ_RATE = "bytesreadrate";
7273
public static final String BYTES_READ_RATE_MAX = "bytesreadratemax";
7374
public static final String BYTES_READ_RATE_MAX_LENGTH = "bytesreadratemaxlength";
@@ -157,6 +158,7 @@ public class ApiConstants {
157158
public static final String DESTINATION_ZONE_ID = "destzoneid";
158159
public static final String DETAILS = "details";
159160
public static final String DEVICE_ID = "deviceid";
161+
public static final String DEVICE_NAME = "devicename";
160162
public static final String DIRECT_DOWNLOAD = "directdownload";
161163
public static final String DISK = "disk";
162164
public static final String DISK_OFFERING_ID = "diskofferingid";
@@ -384,6 +386,11 @@ public class ApiConstants {
384386
public static final String OS_TYPE_ID = "ostypeid";
385387
public static final String OS_DISPLAY_NAME = "osdisplayname";
386388
public static final String OS_NAME_FOR_HYPERVISOR = "osnameforhypervisor";
389+
public static final String GPU_CARD_ID = "gpucardid";
390+
public static final String GPU_CARD_NAME = "gpucardname";
391+
public static final String GPU_COUNT = "gpucount";
392+
public static final String GPU_OFFERING_ID = "gpuofferingid";
393+
public static final String GPU_OFFERING_NAME = "gpuofferingname";
387394
public static final String GUEST_OS_LIST = "guestoslist";
388395
public static final String GUEST_OS_COUNT = "guestoscount";
389396
public static final String OS_MAPPING_CHECK_ENABLED = "osmappingcheckenabled";
@@ -558,6 +565,11 @@ public class ApiConstants {
558565
public static final String USE_VIRTUAL_ROUTER_IP_RESOLVER = "userouteripresolver";
559566
public static final String UPDATE_IN_SEQUENCE = "updateinsequence";
560567
public static final String VALUE = "value";
568+
public static final String VENDOR_ID = "vendorid";
569+
public static final String VENDOR_NAME = "vendorname";
570+
public static final String VGPU_PROFILE_ID = "vgpuprofileid";
571+
public static final String VGPU_PROFILE_NAME = "vgpuprofilename";
572+
public static final String VGPU_PROFILE_IDS = "vgpuprofileids";
561573
public static final String VIRTUAL_MACHINE_ID = "virtualmachineid";
562574
public static final String VIRTUAL_MACHINE_IDS = "virtualmachineids";
563575
public static final String VIRTUAL_MACHINE_NAME = "virtualmachinename";
@@ -566,6 +578,7 @@ public class ApiConstants {
566578
public static final String VIRTUAL_MACHINE_TYPE = "virtualmachinetype";
567579
public static final String VIRTUAL_MACHINE_STATE = "vmstate";
568580
public static final String VIRTUAL_MACHINES = "virtualmachines";
581+
public static final String VRAM_SIZE = "vramsize";
569582
public static final String USAGE_ID = "usageid";
570583
public static final String USAGE_TYPE = "usagetype";
571584
public static final String INCLUDE_TAGS = "includetags";
@@ -1300,7 +1313,7 @@ public enum HostDetails {
13001313
}
13011314

13021315
public enum VMDetails {
1303-
all, group, nics, stats, secgrp, tmpl, servoff, diskoff, backoff, iso, volume, min, affgrp, vnfnics;
1316+
all, group, nics, stats, secgrp, tmpl, servoff, diskoff, gpuoff, backoff, iso, volume, min, affgrp, vnfnics;
13041317
}
13051318

13061319
public enum DomainDetails {

0 commit comments

Comments
 (0)