Skip to content

Commit 3acf518

Browse files
committed
enhancement: add instance info as Libvirt metadata
1 parent 8f2735a commit 3acf518

File tree

6 files changed

+547
-39
lines changed

6 files changed

+547
-39
lines changed
Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
// Licensed to the Apache Software Foundation (ASF) under one
2+
// or more contributor license agreements. See the NOTICE file
3+
// distributed with this work for additional information
4+
// regarding copyright ownership. The ASF licenses this file
5+
// to you under the Apache License, Version 2.0 (the
6+
// "License"); you may not use this file except in compliance
7+
// with the License. You may obtain a copy of the License at
8+
//
9+
// http://www.apache.org/licenses/LICENSE-2.0
10+
//
11+
// Unless required by applicable law or agreed to in writing,
12+
// software distributed under the License is distributed on an
13+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
// KIND, either express or implied. See the License for the
15+
// specific language governing permissions and limitations
16+
// under the License.
17+
package com.cloud.agent.api.to;
18+
19+
import java.util.ArrayList;
20+
import java.util.HashMap;
21+
import java.util.List;
22+
import java.util.Map;
23+
24+
public class VirtualMachineMetadataTO {
25+
// VM details
26+
private final String name;
27+
private final String internalName;
28+
private final String displayName;
29+
private final String instanceUuid;
30+
private final Integer cpuCores;
31+
private final Integer memory;
32+
private final Long created;
33+
private final Long started;
34+
35+
// Owner details
36+
private final String ownerDomainUuid;
37+
private final String ownerDomainName;
38+
private final String ownerAccountUuid;
39+
private final String ownerAccountName;
40+
private final String ownerProjectUuid;
41+
private final String ownerProjectName;
42+
43+
// Host and service offering
44+
private final String serviceOfferingName;
45+
private final List<String> serviceOfferingHostTags;
46+
47+
// zone, pod, and cluster details
48+
private final String zoneName;
49+
private final String zoneUuid;
50+
private final String podName;
51+
private final String podUuid;
52+
private final String clusterName;
53+
private final String clusterUuid;
54+
55+
// resource tags
56+
private final Map<String, String> resourceTags;
57+
58+
public VirtualMachineMetadataTO(
59+
String name, String internalName, String displayName, String instanceUuid, Integer cpuCores, Integer memory, Long created, Long started,
60+
String ownerDomainUuid, String ownerDomainName, String ownerAccountUuid, String ownerAccountName, String ownerProjectUuid, String ownerProjectName,
61+
String serviceOfferingName, List<String> serviceOfferingHostTags,
62+
String zoneName, String zoneUuid, String podName, String podUuid, String clusterName, String clusterUuid, Map<String, String> resourceTags) {
63+
/*
64+
* Something failed in the metadata shall not be a fatal error, the VM can still be started
65+
* Thus, the unknown fields just get an explicit "unknown" value so it can be fixed in case
66+
* there are bugs on some execution paths.
67+
* */
68+
69+
this.name = (name != null) ? name : "unknown";
70+
this.internalName = (internalName != null) ? internalName : "unknown";
71+
this.displayName = (displayName != null) ? displayName : "unknown";
72+
this.instanceUuid = (instanceUuid != null) ? instanceUuid : "unknown";
73+
this.cpuCores = (cpuCores != null) ? cpuCores : -1;
74+
this.memory = (memory != null) ? memory : -1;
75+
this.created = (created != null) ? created : 0;
76+
this.started = (started != null) ? started : 0;
77+
this.ownerDomainUuid = (ownerDomainUuid != null) ? ownerDomainUuid : "unknown";
78+
this.ownerDomainName = (ownerDomainName != null) ? ownerDomainName : "unknown";
79+
this.ownerAccountUuid = (ownerAccountUuid != null) ? ownerAccountUuid : "unknown";
80+
this.ownerAccountName = (ownerAccountName != null) ? ownerAccountName : "unknown";
81+
this.ownerProjectUuid = (ownerProjectUuid != null) ? ownerProjectUuid : "unknown";
82+
this.ownerProjectName = (ownerProjectName != null) ? ownerProjectName : "unknown";
83+
this.serviceOfferingName = (serviceOfferingName != null) ? serviceOfferingName : "unknown";
84+
this.serviceOfferingHostTags = (serviceOfferingHostTags != null) ? serviceOfferingHostTags : new ArrayList<>();
85+
this.zoneName = (zoneName != null) ? zoneName : "unknown";
86+
this.zoneUuid = (zoneUuid != null) ? zoneUuid : "unknown";
87+
this.podName = (podName != null) ? podName : "unknown";
88+
this.podUuid = (podUuid != null) ? podUuid : "unknown";
89+
this.clusterName = (clusterName != null) ? clusterName : "unknown";
90+
this.clusterUuid = (clusterUuid != null) ? clusterUuid : "unknown";
91+
92+
this.resourceTags = (resourceTags != null) ? resourceTags : new HashMap<>();
93+
}
94+
95+
public String getName() {
96+
return name;
97+
}
98+
99+
public String getInternalName() {
100+
return internalName;
101+
}
102+
103+
public String getDisplayName() {
104+
return displayName;
105+
}
106+
107+
public String getInstanceUuid() {
108+
return instanceUuid;
109+
}
110+
111+
public Integer getCpuCores() {
112+
return cpuCores;
113+
}
114+
115+
public Integer getMemory() {
116+
return memory;
117+
}
118+
119+
public Long getCreated() { return created; }
120+
121+
public Long getStarted() {
122+
return started;
123+
}
124+
125+
public String getOwnerDomainUuid() {
126+
return ownerDomainUuid;
127+
}
128+
129+
public String getOwnerDomainName() {
130+
return ownerDomainName;
131+
}
132+
133+
public String getOwnerAccountUuid() {
134+
return ownerAccountUuid;
135+
}
136+
137+
public String getOwnerAccountName() {
138+
return ownerAccountName;
139+
}
140+
141+
public String getOwnerProjectUuid() {
142+
return ownerProjectUuid;
143+
}
144+
145+
public String getOwnerProjectName() {
146+
return ownerProjectName;
147+
}
148+
149+
public String getserviceOfferingName() {
150+
return serviceOfferingName;
151+
}
152+
153+
public List<String> getserviceOfferingHostTags() {
154+
return serviceOfferingHostTags;
155+
}
156+
157+
public String getZoneName() {
158+
return zoneName;
159+
}
160+
161+
public String getZoneUuid() {
162+
return zoneUuid;
163+
}
164+
165+
public String getPodName() {
166+
return podName;
167+
}
168+
169+
public String getPodUuid() {
170+
return podUuid;
171+
}
172+
173+
public String getClusterName() {
174+
return clusterName;
175+
}
176+
177+
public String getClusterUuid() {
178+
return clusterUuid;
179+
}
180+
181+
public Map<String, String> getResourceTags() { return resourceTags; }
182+
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ public class VirtualMachineTO {
8686
DeployAsIsInfoTO deployAsIsInfo;
8787
String metadataManufacturer;
8888
String metadataProductName;
89+
VirtualMachineMetadataTO metadata;
8990

9091
public VirtualMachineTO(long id, String instanceName, VirtualMachine.Type type, int cpus, Integer speed, long minRam, long maxRam, BootloaderType bootloader,
9192
String os, boolean enableHA, boolean limitCpuUse, String vncPassword) {
@@ -447,6 +448,14 @@ public void setMetadataProductName(String metadataProductName) {
447448
this.metadataProductName = metadataProductName;
448449
}
449450

451+
public VirtualMachineMetadataTO getMetadata() {
452+
return metadata;
453+
}
454+
455+
public void setMetadata(VirtualMachineMetadataTO metadata) {
456+
this.metadata = metadata;
457+
}
458+
450459
@Override
451460
public String toString() {
452461
return String.format("VM {id: \"%s\", name: \"%s\", uuid: \"%s\", type: \"%s\"}", id, name, uuid, type);

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import javax.xml.parsers.DocumentBuilder;
5252
import javax.xml.parsers.ParserConfigurationException;
5353

54+
import com.cloud.agent.api.to.VirtualMachineMetadataTO;
5455
import org.apache.cloudstack.api.ApiConstants.IoDriverPolicy;
5556
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
5657
import org.apache.cloudstack.storage.command.browser.ListDataStoreObjectsCommand;
@@ -171,6 +172,7 @@
171172
import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.WatchDogDef;
172173
import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.WatchDogDef.WatchDogAction;
173174
import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.WatchDogDef.WatchDogModel;
175+
import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.MetadataDef;
174176
import com.cloud.hypervisor.kvm.resource.rolling.maintenance.RollingMaintenanceAgentExecutor;
175177
import com.cloud.hypervisor.kvm.resource.rolling.maintenance.RollingMaintenanceExecutor;
176178
import com.cloud.hypervisor.kvm.resource.rolling.maintenance.RollingMaintenanceServiceExecutor;
@@ -2628,9 +2630,19 @@ private void configureVM(VirtualMachineTO vmTO, LibvirtVMDef vm, Map<String, Str
26282630
vm.addComp(createClockDef(vmTO));
26292631
vm.addComp(createDevicesDef(vmTO, guest, vcpus, isUefiEnabled));
26302632

2633+
MetadataDef metaDef;
2634+
if ((metaDef = createMetadataDef(vmTO)) != null) {
2635+
vm.addComp(metaDef);
2636+
}
2637+
26312638
addExtraConfigsToVM(vmTO, vm, extraConfig);
26322639
}
26332640

2641+
protected MetadataDef createMetadataDef(VirtualMachineTO vmTO) {
2642+
VirtualMachineMetadataTO metadata = vmTO.getMetadata();
2643+
return (metadata != null) ? new MetadataDef(metadata) : null;
2644+
}
2645+
26342646
/**
26352647
* Adds extra configuration to User VM Domain XML before starting.
26362648
*/

0 commit comments

Comments
 (0)