Skip to content

Commit

Permalink
Logging improvements (#33)
Browse files Browse the repository at this point in the history
* RD: Added device-view.html for viewing and editing device details. Fixed and improved devices.html. Modified DeviceManagementController so that the '/monitor/device' endpoint returns the devices of the current user, and also plain users can retrieve info for the devices they own.

* RD: Moved 'metrics' section side-by-side to 'device info' section in device-view.html, for better viewing

* RD: changed mongo db name to 'resource_discovery' in application.yml

* RD: Minor GUI improvements

* RD: Added DeviceMonitorService to watch the status updates from EMS. Added DeviceStatusUpdate class used in DeviceMonitorService, and added field statusUpdate in Device class. Restructured and improved ResourceDiscoveryProperties.

* RD: Created AbstractMonitorService (to factor out common topic monitoring code). Renamed DeviceMonitorService to DeviceStatusMonitorService and made it subclass of AbstractMonitorService. Changed DeviceStatusUpdate class to ignore unknown properties during deserialization.

* RD: Added banner

* RD: Added DeviceMetricsMonitorService and DeviceMetrics classes. Updated Device class to store device metrics received from EMS

* RD: Updated application.yml

* RD: Added device metrics display in device-view.html. Added (EMS) device status in devices.html

* RD: Updated device-view.html to display device metrics

* RD: Modified Device in monitoring subsystem to not have its credentials serialized (and returned to browser). Also updated the affected code

* RD: Added check for a request's device IP address being in use (in another request or a registered device)

* RD: various minor code improvements

* RD: Added better error reporting in request-edit.html

* RD: Various small GUI improvements and a fix

* RD: Fixed registration Device in order toString() not to print credentials. Fixed RegistrationRequest in order to have its 'messages' and 'history' fields copied by BeanUtils. Fixed 2 bugs in RegistrationRequestProcessor and added a few more logs.

* RD: Minor change in device-view.html to move 'count-' metrics to the end of the device metrics list

* RD: Changed monitoring Device to not serialize credentials

* RD: Code cleanup in RegistrationRequestProcessor

* RD: Improved GUI (added page shortcuts at top-right)

* RD: Implementing re-onboarding, off-boarding, and request-for-info (device status and metrics) [WIP]

* RD: Added DeviceLifeCycleRequestService and DeviceLifeCycleResponseService classes for handling reinstall and uninstall actions (via EMS broker). Moved LC request event sending from DeviceManagementService to DeviceLifeCycleRequestService. Updated ResourceDiscoveryProperties with settings for DeviceLifeCycleRequest/ResponseService's.

* RD: Added device archiving and unarchiving in GUI

* RD: Implemented DeviceProcessor to periodically archive off-boarded devices. Added configurable immediate archiving of Success registration requests, and off-boarded devices, and added relevant settings in ResourceDiscoveryProperties  and in GUI.

* RD: Changed devices.html to always display 'Archive' button to Admin users

* RD: Added archived-device-view.html, renamed archived-view.html to archived-request-view.html. Updated archived.html

* RD: Fixed DeviceManagementController to allow plain users (device owners) to access their device info (and archived devices), and control re-installing and off-boarding. Added device colouring based on their status.

* RD: Extended DeviceProcessor to check for suspect and failed devices. Added SUSPECT and FAILED statues in DeviceStatus (and in devices.html and archived.html for colouring). Added relevant settings in ResourceDiscoveryProperties. Fixed a few naming errors.

* RD: Added shortcuts (top-right corner) to all detail pages

* RD: Minor change in index.html (grayed out settings image)

* RD: Improved AbstractMonitorService (reuse of single connection, better logs). Updated affected code.

* RD: Minor code (mostly logging) and GUI improvements

* RD: Added 'UnknownDeviceRegistrationService' class to monitor for unknown devices (based on IP address and reference in messages received from EMS), and registering them to RD. Added NODE_DETAILS in REQUEST_TYPE enum for messages sent to/received from EMS about acquiring detailed node info (including credentials). Added 'deviceInfoRequestsTopic' and 'deviceInfoReportsTopic' settings in ResourceDiscoveryProperties.

* RD: Added prompting admin to provide device credentials when un-archiving a previously archived request or device.

* RD: Moved REQUEST_TYPE enum to 'common' package and updated code

* RD: Changed authentication to use BCrypt-encrypted passwords

* RD: Moved message broker communication code to BrokerUtil class, and updated using classes accordingly. Implemented EncryptionUtil for encrypting and decrypting broker messages [TO BE TESTED]. Few minor code improvements.

* RD: Minor code tidy up

* RD: Added support for SSL connections to ActiveMQ broker in BrokerUtil. Added the needed settings in ResourceDiscoveryProperties and application.yml

* RD: Fixed issue where UnknownDeviceRegistrationService registers a device before RegistrationRequestProcessor does

* RD: Modified pom.xml to build an image named 'eu.nebulous.resource-discovery' and tagged with current project version

* RD: Added 'DeviceLocation' class and 'location' field in both 'Device' classes. Also updated all 4 details pages to include Location (name, lat, lon). Fixed the Restore button of the modal dialog in archived.html to display 'Restore Request' or 'Restore Device' depending on the restore type.

* RD: Added StatusController to report current application status (currently returns 'OK')

* RD: Fixed a few minor issues:
* Fixed 'spring.web.resources.static-locations'
* Changed Docker image name to 'resource-discovery'
* Set BPE_LANG value to C.UTF-8 in order to render banner correctly

* RD: Changes in pom.xml and application.yml:
* Changed groupId in pom.xml to 'eu.nebulous.resource-management', and artifactId to 'resource-discovery'
* Corrected service name and description
* Set 'imageName' property to derive from artifactId
* Fixed application.yml to use '@project.version@' placeholder for app version

* RD: Renamed 'management' module to 'resource-discovery'

* RD:
* Commented out Buildpacks related settings in pom.xml
* Added Dockerfile, run.sh (entrypoint script) and .dockerignore

* RD: Modified base images in Dockerfile

* RD: Modified Dockerfile in order to both compile the app and build the Docker image

* RD: Improved Dockerfile

* RD: Improved Dockerfile

* RD: Upgraded SB version to SB 3.2.1 and JRE to version 21. Updated dependency to their latest versions. Modified model classes to avoid Lombok SuperBuilder warnings.

* RD: Fixed Dockerfile

* Initial changes to support registration and deregistration of edge devices to SAL

Introduction of Broker publisher and subscriber utilities
Introduction of new device registration service

I94a6fdb4612de192c24511445f1236cdce94b000

* EMS: Added K8sNetdataCollector [WIP]

* RD: Added 'port' in forms and models

* RD: Added two TODOs

* RD: Deactivated UnknownDeviceRegistrationService

* Initial changes to support registration and deregistration of edge devices to SAL

Introduction of Broker publisher and subscriber utilities
Introduction of new device registration service

I94a6fdb4612de192c24511445f1236cdce94b000

* Improvement in the initialization of SALRegistrationService
I94a6fdb4612de192c24511445f1236cdce94b000

* Improvement in the initialization of SALRegistrationService
I94a6fdb4612de192c24511445f1236cdce94b000

* Increased logging to debug setting of processorProperties I94a6fdb4612de192c24511445f1236cdce94b000

* Modified logging to debug the setting of processorProperties I94a6fdb4612de192c24511445f1236cdce94b000

* Correction of syntactic error I94a6fdb4612de192c24511445f1236cdce94b000

* Addition of needed configuration properties I94a6fdb4612de192c24511445f1236cdce94b000

* Testing of alternative initialization of SAL registration service I94a6fdb4612de192c24511445f1236cdce94b000

* Testing of alternative initialization of SAL registration service I94a6fdb4612de192c24511445f1236cdce94b000

* Updates on the topic and the payload format used to communicate with SAL for the registration of a device
I94a6fdb4612de192c24511445f1236cdce94b000

* Allow setting and using a custom broker port
I94a6fdb4612de192c24511445f1236cdce94b000

* Pass a default port to the configuration of the Resource discovery server
I94a6fdb4612de192c24511445f1236cdce94b000

* Log debugging information related to the port of the NebulOuS broker
I94a6fdb4612de192c24511445f1236cdce94b000

* Publishing of the appropriate message to the broker
I94a6fdb4612de192c24511445f1236cdce94b000

* RD: Removed truststore settings from application.yml. Upgraded to SB 3.2.4 and fixed pom.xml

* RD: Fixed banner.txt

* RD: Modified application.yml

* RD: Added temp. debug messages

* RD: Added temp. debug messages 2

* Revert "RD: Added temp. debug messages 2"

This reverts commit 738f604.

* Revert "RD: Added temp. debug messages"

This reverts commit 31b103c.

* RD: Modified SALRegistrationService to run SAL registration in dedicated worker thread, and interrupt registration if it takes too long. Added related settings and assigned defaults.

* RD: Added temp. log messages

* Revert "RD: Added temp. log messages"

This reverts commit 2dae658.

* RD: Updated DeviceMetricsMonitorService to match metric events to device using first the IP address and the client Id (stored in Device.StatusUpdate)

* Improvements on edge device data propagation
I94a6fdb4612de192c24511445f1236cdce94b000

* Integration of changes performed in commit e3bd385 but accidentally overriden
I94a6fdb4612de192c24511445f1236cdce94b000

* RD: Updated Dockerfile

* RD: Updated run.sh and added wait_for_mongodb.sh

* RD: Improved wait_for_mongodb.sh script

* Various Improvements
Addition of the port attribute in the registration of an edge device
Modification of the edge device registration to allow for more dynamic registration json field population
I94a6fdb4612de192c24511445f1236cdce94b000

* Attempt to fix a problem when publishing to the broker to register information to SAL or notify the SLO Violation detector
I94a6fdb4612de192c24511445f1236cdce94b000

* Miscellaneous improvements

Updated the registration of architecture/jar files for each edge device registered

Preliminary work to support 'Compromised state'

* RD: Added API Key authentication

* RD: Upgraded SB to 3.2.10, and Lombok, commons-lang3 dependencies to their latest versions. Improved Dockerfile.

* RD: Code improvements (esp. wrt @PreAuthorize annotations)

* RD: Made SALRegistrationService service conditionally enabled (by 'discovery.sal-registration.enabled' property). Its uses were updated accordingly.

* RD: Updated RegistrationRequestService (and its uses) to take authenticated user into consideration during checks of requests and devices sent from GUI. Also added checks for the device data provided.

* RD: Added 'Device.ref' field and added its initialization. Ref field will be populated with a unique device reference following the Nebulous naming convention (including app id).

* RD: Updated GUI pages to include the new 'ref' field. A few more improvements were introduced.

* Use device reference instead of name to register to SAL

* Improvements in device registration and component communication with the broker

* Small improvements in device registration

* Small improvement in getting device registration details

* Small improvement in getting device registration details

* RD: Fix in SALRegistrationService class

* RD: Fixed fontawesome cdn url

* Initial deregistration support

* RD: Made device on-boarding authorization configurable (MANUAL, ALWAYS_AUTHORIZE, and ALWAYS_REJECT)

* RD: Updated RegistrationRequestProcessor to include Device Ref in onboarding request to EMS

* Improvements in the handling of AMQP connections

* Addition of provider field, miscellaneous improvements

- Addition of provider field in device registration
- Small improvements the Synchronous Broker publisher

* Minor logging improvements

* Deregistration process improvement

* Stopping the device lost publisher

* Refactoring to use the original Connector class instead of ExtendedConnector

* Minor logging improvement

* Only try to stop the connector if it has been previously initialized

* Miscellaneous improvements

Implementation of edge device/byon hourly cost (price) field
Only try to stop the connector if it has been previously initialized

* Password improvements

Removal of plaintext passwords and replacement with environmental variable values

* Debugging message commit

* Work on Deregistration support

* Added more logging statements to debug device registration (work by ipatini)

---------

Co-authored-by: ipatini <ipatini@mail.ntua.gr>
Co-authored-by: Andreas Tsagkaropoulos <atsagkaropoulos@mail.ntua.gr>
  • Loading branch information
3 people authored Nov 21, 2024
1 parent f884122 commit 4f09320
Show file tree
Hide file tree
Showing 8 changed files with 30 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,8 @@ public class ResourceDiscoveryProperties {
private boolean salRegistrationEnabled = true;
private long salRegistrationTimeout = 60*1000;
private String registration_topic_name = "eu.nebulouscloud.exn.sal.node.create";

private String deregistration_topic_prefix = "eu.nebulouscloud.exn.sal.node.delete";

// Failed devices detection
private boolean automaticFailedDetection = true;
private long suspectDeviceThreshold = 5; // in minutes
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ private static void register_devices(String request_body_file, String sessionID,

public static String get_device_deregistration_json(Device device){
JSONObject root_json_object = new JSONObject();
root_json_object.put("name",device.getRef());
//root_json_object.put("name",device.getRef());
return root_json_object.toJSONString();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ public Device getDeviceByIpAddress(@PathVariable String ipAddress) {

@PutMapping(value = "/device", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public Device createDevice(@RequestBody Device device) {
log.warn("DeviceManagementController: createDevice: device: {}", device);

salRegistrationService.ifPresent(salRegistrationService -> salRegistrationService.register(device));
return deviceService.save(device);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,9 @@
@NoArgsConstructor
@Document(collection = "device")
public class Device {
private String id;
private String ref;
private String id; //This is the internal id of the device in the Resource Discovery component
private String sal_id; //This identifier is used by SAL, and is used for deregistration
private String ref; //This identifier is used by the Cloud Fog Service Broker, to ascertain which devices are available for which applications
private Double price;
private String os;
private String name;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ private void processDeviceDetailsResponses() {
log.info("UnknownDeviceRegistrationService: Registered device: {}", newDevice);

if (salRegistrationService.isPresent()) {
log.info("Registering the device {} to SAL...", newDevice);
log.info("Registering the device to SAL: {}", newDevice);
salRegistrationService.get().register(newDevice);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,7 @@ private void processResponse(@NonNull Map<String, Object> response) {
long timestamp = Long.parseLong(response.getOrDefault("timestamp", "-1").toString().trim());

RegistrationRequest registrationRequest = registrationRequestService.getById(requestId).orElse(null);
log.warn("RegistrationRequestProcessor: processResponse: request: {}", registrationRequest);
if (registrationRequest!=null) {
RegistrationRequestStatus currStatus = registrationRequest.getStatus();
RegistrationRequestStatus newStatus = switch (currStatus) {
Expand Down Expand Up @@ -288,6 +289,7 @@ private void processResponse(@NonNull Map<String, Object> response) {

boolean doArchive = false;
Object obj = response.get("nodeInfo");
log.warn("RegistrationRequestProcessor: processResponse: nodeInfo: {} {}", obj==null?null:obj.getClass().getTypeName(), obj);
if (obj instanceof Map devInfo) {
// Update request info
registrationRequest.setLastUpdateDate(Instant.ofEpochMilli(timestamp));
Expand All @@ -297,12 +299,14 @@ private void processResponse(@NonNull Map<String, Object> response) {
boolean allowAllKeys = processorProperties.getAllowedDeviceInfoKeys().contains("*");
final Map<String,String> processedDevInfo = new LinkedHashMap<>();
devInfo.forEach((key, value) -> {
log.warn("RegistrationRequestProcessor: processResponse: Dev-info pair: {} = {}", key, value);
if (key!=null && value!=null) {
String k = key.toString().trim();
String v = value.toString().trim();
if (StringUtils.isNotBlank(k) && StringUtils.isNotBlank(v)) {
if (allowAllKeys || processorProperties.getAllowedDeviceInfoKeys().contains(k.toUpperCase())) {
processedDevInfo.put(k, v);
log.warn("RegistrationRequestProcessor: processResponse: Dev-info pair ADDED: {} = {}", key, value);
} else {
log.debug("processResponse: Not allowed device info key for request: id={}, key={}", requestId, k);
}
Expand Down Expand Up @@ -364,6 +368,8 @@ private RegistrationRequestStatus getNextStatus(RegistrationRequestStatus currSt
}

private void copyDeviceToMonitoring(RegistrationRequest registrationRequest) {
log.warn("RegistrationRequestProcessor: copyDeviceToMonitoring: BEGIN: request: {}", registrationRequest);
log.warn("RegistrationRequestProcessor: copyDeviceToMonitoring: request-DEVICE: {}", registrationRequest.getDevice());
Device device = objectMapper.convertValue(registrationRequest.getDevice(), Device.class);
// override values
device.setId(null);
Expand All @@ -379,6 +385,7 @@ private void copyDeviceToMonitoring(RegistrationRequest registrationRequest) {
device.setRequestId(registrationRequest.getId());
device.setNodeReference(registrationRequest.getNodeReference());
deviceManagementService.save(device);
log.warn("RegistrationRequestProcessor: copyDeviceToMonitoring: COPIED-DEVICE: {}", device);
if (processorProperties.isSalRegistrationEnabled())
salRegistrationService.ifPresent(salRegistrationService -> salRegistrationService.queueForRegistration(device));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ public void deregister(Device device) {
if (processorProperties.isDeregistration_emulated()){
return;
}
SynchronousBrokerPublisher deregister_device_publisher = new SynchronousBrokerPublisher(get_deregistration_topic_name(application_name), processorProperties.getNebulous_broker_ip_address(), processorProperties.getNebulous_broker_port(), processorProperties.getNebulous_broker_username(), processorProperties.getNebulous_broker_password(), "");
SynchronousBrokerPublisher deregister_device_publisher = new SynchronousBrokerPublisher(get_deregistration_topic_name(device.getSal_id()), processorProperties.getNebulous_broker_ip_address(), processorProperties.getNebulous_broker_port(), processorProperties.getNebulous_broker_username(), processorProperties.getNebulous_broker_password(), "");
int sending_attempt = 1;
while (deregister_device_publisher.is_publisher_null()) {
if (sending_attempt <= 2) {
Expand All @@ -81,7 +81,7 @@ public void deregister(Device device) {
//TODO handle the response here
if (deregister_device_message_string!=null && !deregister_device_message_string.isEmpty()) {
Map response = deregister_device_publisher.publish_for_response(deregister_device_message_string, Collections.singleton(application_name));
log.info("The response received while trying to deregister device " + device.getRef() + " is " + response.toString());
log.warn("The response received while trying to deregister device " + device.getRef() + " is " + response.toString());
}else{
log.warn("Deregistration was to be initiated with an empty deregistration payload");
}
Expand All @@ -100,9 +100,8 @@ public void deregister(Device device) {

}

private String get_deregistration_topic_name(String application_name) {
return processorProperties.getRegistration_topic_name();
//return ("eu.nebulouscloud.exn.sal.edge." + application_name);
private String get_deregistration_topic_name(String sal_id) {
return processorProperties.getDeregistration_topic_prefix()+"."+sal_id;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.json.simple.JSONObject;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.core.task.TaskExecutor;
Expand Down Expand Up @@ -37,20 +38,21 @@ public void queueForRegistration(@NonNull Device device) {
queue.add(device);
}

public void register(Device device) {

public String register(Device device) {
log.warn("SALRegistrationService: register: BEGIN: device: {}", device);

String application_name = device.getRef().split("\\|")[1];
if (application_name.equals("all_applications")){
application_name="";
}
String public_ip = System.getenv("NEBULOUS_IP");
if (public_ip==null || public_ip.isEmpty()){
log.warn("Using default IP address ("+processorProperties.getNebulous_server_ip_address()+") to fetch Proactive client jar files from, as the environmental variable was not set or found");
public_ip = processorProperties.getNebulous_server_ip_address();
log.warn("Using default IP address ({}) to fetch Proactive client jar files from, as the environmental variable was not set or found", public_ip);
}

Map<String,String> device_info = device.getDeviceInfo();
log.warn("SALRegistrationService: register: DEVICE-INFO: {}", device_info);
/* Information available from the EMS, based on https://gitlab.com/nebulous-project/ems-main/-/blob/master/ems-core/bin/detect.sh?ref_type=heads
echo CPU_SOCKETS=$TMP_NUM_CPUS
echo CPU_CORES=$TMP_NUM_CORES
Expand Down Expand Up @@ -145,6 +147,10 @@ public void register(Device device) {
//TODO handle the response here
Map response = register_device_publisher.publish_for_response(register_device_message_string, Collections.singleton(application_name));
log.warn("The response received while trying to register device " + device_name + " is "+response.toString());
JSONObject response_json = new JSONObject(response);
JSONObject response_json_body = (JSONObject) response_json.get("body");
String device_id = (String) response_json_body.get("id");
return device_id;
//}

/* This is some realtime information, could be retrieved with a different call to the EMS.
Expand Down Expand Up @@ -197,7 +203,8 @@ public void processQueue() {
device = queue.take();
log.warn("SALRegistrationService: processQueue(): Will register device: {}", device);
lastRegistrationStartTimestamp = System.currentTimeMillis();
register(device);
String device_sal_id = register(device);
device.setSal_id(device_sal_id);
lastRegistrationStartTimestamp = -1L;
device.setRegisteredToSAL(true);
deviceManagementService.update(device);
Expand Down

0 comments on commit 4f09320

Please sign in to comment.