Skip to content

Commit c6abed1

Browse files
committed
Following changes are part of this commit:
1. Remove usage of in-memory eventBus for VM lifecycle events 2. Publish event for VM, NIC and DNS record delete events into messageBus 3. Introducer subscribers for above topics
1 parent 5682a5a commit c6abed1

File tree

10 files changed

+204
-94
lines changed

10 files changed

+204
-94
lines changed

api/src/main/java/com/cloud/vm/Nic.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@
3333
* Nic represents one nic on the VM.
3434
*/
3535
public interface Nic extends Identity, InternalIdentity {
36+
37+
interface Topics {
38+
String NIC_LIFECYCLE = "nic.lifecycle";
39+
}
40+
3641
enum Event {
3742
ReservationRequested, ReleaseRequested, CancelRequested, OperationCompleted, OperationFailed,
3843
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1370,6 +1370,10 @@ public class ApiConstants {
13701370
public static final String CONTENT_TYPE = "Content-Type";
13711371
public static final String NATIVE_ZONE = "Native";
13721372
public static final String NIC_DNS_RECORD = "nicdnsrecord";
1373+
public static final String TIME_STAMP = "timestamp";
1374+
public static final String INSTANCE_ID = "instanceId";
1375+
public static final String OLD_STATE = "oldState";
1376+
public static final String NEW_STATE = "newState";
13731377

13741378

13751379
public static final String PARAMETER_DESCRIPTION_ACTIVATION_RULE = "Quota tariff's activation rule. It can receive a JS script that results in either " +

api/src/main/java/org/apache/cloudstack/dns/DnsProvider.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@
2525

2626
public interface DnsProvider extends Adapter {
2727

28+
interface Topics {
29+
String DNS_RECORD_DELETE = "dns.record.delete";
30+
}
31+
2832
DnsProviderType getProviderType();
2933

3034
// Validates connectivity to the server

engine/api/src/main/java/com/cloud/vm/VirtualMachineManager.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ public interface VirtualMachineManager extends Manager {
112112

113113
interface Topics {
114114
String VM_POWER_STATE = "vm.powerstate";
115+
String VM_LIFECYCLE = "vm.lifecycle";
115116
}
116117

117118
/**

plugins/event-bus/inmemory/src/main/resources/META-INF/cloudstack/inmemory/module.properties

Lines changed: 0 additions & 18 deletions
This file was deleted.

plugins/event-bus/inmemory/src/main/resources/META-INF/cloudstack/inmemory/spring-event-inmemory-context.xml

Lines changed: 0 additions & 34 deletions
This file was deleted.

server/src/main/java/com/cloud/vm/UserVmManagerImpl.java

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,12 @@
1616
// under the License.
1717
package com.cloud.vm;
1818

19+
import static com.cloud.event.EventTypes.EVENT_NIC_CREATE;
20+
import static com.cloud.event.EventTypes.EVENT_NIC_DELETE;
1921
import static com.cloud.hypervisor.Hypervisor.HypervisorType.Functionality;
2022
import static com.cloud.storage.Volume.IOPS_LIMIT;
2123
import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
24+
import static com.cloud.vm.VirtualMachineManager.Topics.VM_LIFECYCLE;
2225
import static org.apache.cloudstack.api.ApiConstants.MAX_IOPS;
2326
import static org.apache.cloudstack.api.ApiConstants.MIN_IOPS;
2427

@@ -1435,7 +1438,7 @@ protected ResizeVolumeCmd prepareResizeVolumeCmd(VolumeVO rootVolume, DiskOfferi
14351438
}
14361439

14371440
@Override
1438-
@ActionEvent(eventType = EventTypes.EVENT_NIC_CREATE, eventDescription = "Creating NIC", async = true)
1441+
@ActionEvent(eventType = EVENT_NIC_CREATE, eventDescription = "Creating NIC", async = true)
14391442
public UserVm addNicToVirtualMachine(AddNicToVMCmd cmd) throws InvalidParameterValueException, PermissionDeniedException, CloudRuntimeException {
14401443
Long vmId = cmd.getVmId();
14411444
Long networkId = cmd.getNetworkId();
@@ -1537,9 +1540,41 @@ public UserVm addNicToVirtualMachine(AddNicToVMCmd cmd) throws InvalidParameterV
15371540
}
15381541
CallContext.current().putContextParameter(Nic.class, guestNic.getUuid());
15391542
logger.debug(String.format("Successful addition of %s from %s through %s", network, vmInstance, guestNic));
1543+
publishNicEventMessageBus(vmInstance.getId(), vmInstance.getAccountId(), guestNic.getId(), EVENT_NIC_CREATE);
15401544
return _vmDao.findById(vmInstance.getId());
15411545
}
15421546

1547+
private void publishVmLifecycleMessageBus(UserVm instance, @Nullable VirtualMachine.State oldState, VirtualMachine.State newState) {
1548+
try {
1549+
Map<String, Object> event = new HashMap<>();
1550+
event.put(ApiConstants.EVENT_ID, UUID.randomUUID().toString());
1551+
event.put(ApiConstants.INSTANCE_ID, instance.getId());
1552+
event.put(ApiConstants.ACCOUNT_ID, instance.getAccountId());
1553+
event.put(ApiConstants.OLD_STATE, oldState != null ? oldState : State.Unknown);
1554+
event.put(ApiConstants.NEW_STATE, newState);
1555+
event.put(ApiConstants.TIME_STAMP, System.currentTimeMillis());
1556+
messageBus.publish(_name, VM_LIFECYCLE, PublishScope.GLOBAL, event);
1557+
} catch (Exception ex) {
1558+
logger.warn("Failed to publish lifecycle event for Instance: {}", instance.getUuid(), ex);
1559+
}
1560+
}
1561+
1562+
private void publishNicEventMessageBus(Long instanceId, Long accountId, Long nicId, String eventType) {
1563+
try {
1564+
Map<String, Object> event = new HashMap<>();
1565+
event.put(ApiConstants.EVENT_ID, UUID.randomUUID().toString());
1566+
event.put(ApiConstants.INSTANCE_ID, instanceId);
1567+
event.put(ApiConstants.ACCOUNT_ID, accountId);
1568+
event.put(ApiConstants.NIC_ID, nicId);
1569+
event.put(ApiConstants.EVENT_TYPE, eventType); // NIC_CREATE or NIC_DELETE
1570+
event.put(ApiConstants.TIME_STAMP, System.currentTimeMillis());
1571+
1572+
messageBus.publish(_name, Nic.Topics.NIC_LIFECYCLE, PublishScope.GLOBAL, event);
1573+
} catch (Exception ex) {
1574+
logger.error("Failed to publish lifecycle event for NIC with ID: {}", nicId, ex);
1575+
}
1576+
}
1577+
15431578
/**
15441579
* Set NIC as default if VM has no default NIC
15451580
* @param vmInstance VM instance to be checked
@@ -1654,6 +1689,7 @@ public UserVm removeNicFromVirtualMachine(RemoveNicFromVMCmd cmd) throws Invalid
16541689
}
16551690

16561691
logger.debug("Successful removal of " + network + " from " + vmInstance);
1692+
publishNicEventMessageBus(vmInstance.getId(), vmInstance.getAccountId(), nic.getId(), EVENT_NIC_DELETE);
16571693
return _vmDao.findById(vmInstance.getId());
16581694
}
16591695

@@ -3384,8 +3420,10 @@ public UserVm startVirtualMachine(StartVMCmd cmd) throws ExecutionException, Con
33843420
if (cmd.getConsiderLastHost() != null) {
33853421
additonalParams.put(VirtualMachineProfile.Param.ConsiderLastHost, cmd.getConsiderLastHost().toString());
33863422
}
3387-
3388-
return startVirtualMachine(cmd.getId(), cmd.getPodId(), cmd.getClusterId(), cmd.getHostId(), additonalParams, cmd.getDeploymentPlanner()).first();
3423+
UserVmVO vm = _vmDao.findById(cmd.getId());
3424+
UserVm userVm = startVirtualMachine(cmd.getId(), cmd.getPodId(), cmd.getClusterId(), cmd.getHostId(), additonalParams, cmd.getDeploymentPlanner()).first();
3425+
publishVmLifecycleMessageBus(userVm, vm.getState(), VirtualMachine.State.Running);
3426+
return userVm;
33893427
}
33903428

33913429
@Override
@@ -3570,7 +3608,7 @@ public UserVm destroyVm(DestroyVMCmd cmd) throws ResourceUnavailableException, C
35703608
logger.warn("Tried to destroy ROOT volume for VM [{}], but couldn't retrieve it.", vm);
35713609
}
35723610
}
3573-
3611+
publishVmLifecycleMessageBus(destroyedVm, vm.getState(), VirtualMachine.State.Destroyed);
35743612
return destroyedVm;
35753613
}
35763614

@@ -5272,7 +5310,9 @@ public UserVm startVirtualMachine(DeployVMCmd cmd) throws ResourceUnavailableExc
52725310
additionalParams.put(VirtualMachineProfile.Param.VmPassword, cmd.getPassword());
52735311
}
52745312

5275-
return startVirtualMachine(vmId, podId, clusterId, hostId, diskOfferingMap, additionalParams, cmd.getDeploymentPlanner());
5313+
UserVm userVm = startVirtualMachine(vmId, podId, clusterId, hostId, diskOfferingMap, additionalParams, cmd.getDeploymentPlanner());
5314+
publishVmLifecycleMessageBus(userVm, null, VirtualMachine.State.Running);
5315+
return userVm;
52765316
}
52775317

52785318
private UserVm startVirtualMachine(long vmId, Long podId, Long clusterId, Long hostId, Map<Long, DiskOffering> diskOfferingMap
@@ -5631,6 +5671,7 @@ public UserVm stopVirtualMachine(long vmId, boolean forced) throws ConcurrentOpe
56315671
status = vmEntity.stop(Long.toString(userId));
56325672
}
56335673
if (status) {
5674+
publishVmLifecycleMessageBus(vm, vm.getState(), VirtualMachine.State.Stopped);
56345675
return _vmDao.findById(vmId);
56355676
} else {
56365677
return null;

0 commit comments

Comments
 (0)