Search in sources :

Example 1 with EdgeConnectorForKVSUnrecoverableException

use of com.aws.iot.edgeconnectorforkvs.model.exceptions.EdgeConnectorForKVSUnrecoverableException in project aws-iot-greengrass-edge-connector-for-kinesis-video-stream by awslabs.

the class EdgeConnectorForKVSService method main.

public static void main(String[] args) throws InterruptedException {
    log.info("---------- EdgeConnectorForKVS Starting ----------");
    boolean retry = true;
    boolean isInitialSetup = true;
    List<String> restartNeededConfigurationList = new ArrayList<>();
    do {
        hubSiteWiseAssetId = args[Constants.ARG_INDEX_SITE_WISE_ASSET_ID_FOR_HUB];
        log.info("EdgeConnectorForKVS Hub Asset Id: " + hubSiteWiseAssetId);
        final EdgeConnectorForKVSService edgeConnectorForKVSService = new EdgeConnectorForKVSService();
        try {
            // set up shared configurations first
            if (isInitialSetup) {
                edgeConnectorForKVSService.setUpSharedEdgeConnectorForKVSService();
                restartNeededConfigurationList.addAll(edgeConnectorForKVSConfigurationList.stream().map(EdgeConnectorForKVSConfiguration::getKinesisVideoStreamName).collect(Collectors.toList()));
                isInitialSetup = false;
            }
            if (restartNeededConfigurationList == null || restartNeededConfigurationList.isEmpty()) {
                throw new EdgeConnectorForKVSUnrecoverableException("Unable to initialize component");
            }
            // initialize or re-init camera level configurations
            edgeConnectorForKVSConfigurationList.forEach(configuration -> {
                if (restartNeededConfigurationList.contains(configuration.kinesisVideoStreamName)) {
                    edgeConnectorForKVSService.setUpCameraLevelEdgeConnectorForKVSService(configuration);
                }
            });
            // clear this configuration list after each restart or initial setup
            restartNeededConfigurationList.clear();
            // block main thread and regularly check camera level health status
            while (true) {
                for (EdgeConnectorForKVSConfiguration configuration : edgeConnectorForKVSConfigurationList) {
                    if (configuration.getFatalStatus().get()) {
                        log.info("fatal status found for " + configuration.getKinesisVideoStreamName());
                        restartNeededConfigurationList.add(configuration.kinesisVideoStreamName);
                    }
                }
                if (!restartNeededConfigurationList.isEmpty()) {
                    // fatal status was set, throw an exception to trigger restart
                    throw new EdgeConnectorForKVSException("Fatal error reported");
                }
                Thread.sleep(WAIT_TIME_BEFORE_POLLING_IN_MILLISECS);
            }
        } catch (final EdgeConnectorForKVSException ex) {
            log.error("Start kicking off camera level restart: " + "Failed {}: {}", ex.getClass().getName(), ex.getMessage());
        } catch (final EdgeConnectorForKVSUnrecoverableException ex) {
            log.error("Unrecoverable exception caught, please re-deploy or restart the Component." + "ERROR: Failed {}: {}", ex.getClass().getName(), ex.getMessage());
            retry = false;
        } catch (final Exception ex) {
            log.error("Uncaught exception found, please re-deploy or restart the Component." + "ERROR: Failed {}: {}", ex.getClass().getName(), ex.getMessage());
            retry = false;
        }
        // clear fatalStatus and clean up failed cameras
        clearFatalStatus();
        edgeConnectorForKVSConfigurationList.forEach(configuration -> {
            if (restartNeededConfigurationList.contains(configuration.kinesisVideoStreamName)) {
                edgeConnectorForKVSService.cleanUpEdgeConnectorForKVSService(configuration);
            }
        });
        if (retry) {
            // If the fatalStatus is true after camera level restart, re-initializing the component
            boolean isFatalStatusSet = edgeConnectorForKVSConfigurationList.stream().anyMatch(configuration -> configuration.getFatalStatus().get());
            if (isFatalStatusSet) {
                log.info("---------- Component Re-initializing ----------");
                edgeConnectorForKVSService.cleanUpEdgeConnectorForKVSService(null);
                restartNeededConfigurationList.clear();
                clearFatalStatus();
                isInitialSetup = true;
            } else {
                log.info("---------- Camera Re-starting ----------");
            // wait for a bit before restarting
            }
            Thread.sleep(WAIT_TIME_BEFORE_RESTART_IN_MILLISECS);
        }
    } while (retry);
}
Also used : EdgeConnectorForKVSException(com.aws.iot.edgeconnectorforkvs.model.exceptions.EdgeConnectorForKVSException) EdgeConnectorForKVSUnrecoverableException(com.aws.iot.edgeconnectorforkvs.model.exceptions.EdgeConnectorForKVSUnrecoverableException) ArrayList(java.util.ArrayList) EdgeConnectorForKVSConfiguration(com.aws.iot.edgeconnectorforkvs.model.EdgeConnectorForKVSConfiguration) TimeoutException(java.util.concurrent.TimeoutException) EdgeConnectorForKVSException(com.aws.iot.edgeconnectorforkvs.model.exceptions.EdgeConnectorForKVSException) EdgeConnectorForKVSUnrecoverableException(com.aws.iot.edgeconnectorforkvs.model.exceptions.EdgeConnectorForKVSUnrecoverableException) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException)

Example 2 with EdgeConnectorForKVSUnrecoverableException

use of com.aws.iot.edgeconnectorforkvs.model.exceptions.EdgeConnectorForKVSUnrecoverableException in project aws-iot-greengrass-edge-connector-for-kinesis-video-stream by awslabs.

the class SiteWiseManager method initEdgeConnectorForKVSServiceConfiguration.

/**
 * Init EdgeConnectorForKVS Service configuration.
 * This method will call SiteWise service, query the asset property value to init the EdgeConnectorForKVS config.
 * @param hubDeviceSiteWiseAssetId The SiteWise asset Id for EdgeConnectorForKVS hub device.
 * @throws EdgeConnectorForKVSUnrecoverableException when there are issues querying SiteWise service
 * @return List of EdgeConnectorForKVSConfiguration
 */
public List<EdgeConnectorForKVSConfiguration> initEdgeConnectorForKVSServiceConfiguration(String hubDeviceSiteWiseAssetId) {
    try {
        verifyConfiguration(hubDeviceSiteWiseAssetId);
        List<String> cameraSiteWiseAssetIdList = siteWiseClient.listAssociatedAssets(hubDeviceSiteWiseAssetId);
        if (cameraSiteWiseAssetIdList.size() > 0) {
            return cameraSiteWiseAssetIdList.stream().map(cameraSiteWiseAssetId -> {
                try {
                    return buildEdgeConnectorForKVSConfiguration(cameraSiteWiseAssetId);
                } catch (Exception e) {
                    throw new EdgeConnectorForKVSException(e);
                }
            }).collect(Collectors.toList());
        } else {
            final String warnMessage = String.format("Could not find any camera asset under the given hub assetId." + " Please check the provided hub device SiteWise assetId: %s", hubDeviceSiteWiseAssetId);
            log.warn(warnMessage);
            return new ArrayList<>();
        }
    } catch (Exception e) {
        final String errorMessage = String.format("Failed to init EdgeConnectorForKVS component. " + "Please check the provided hub device SiteWise assetId: %s", hubDeviceSiteWiseAssetId);
        log.error(errorMessage, e);
        throw new EdgeConnectorForKVSUnrecoverableException(errorMessage, e);
    }
}
Also used : EdgeConnectorForKVSUnrecoverableException(com.aws.iot.edgeconnectorforkvs.model.exceptions.EdgeConnectorForKVSUnrecoverableException) DescribeAssetResponse(software.amazon.awssdk.services.iotsitewise.model.DescribeAssetResponse) EdgeConnectorForKVSException(com.aws.iot.edgeconnectorforkvs.model.exceptions.EdgeConnectorForKVSException) Field(java.lang.reflect.Field) Collectors(java.util.stream.Collectors) GetAssetPropertyValueResponse(software.amazon.awssdk.services.iotsitewise.model.GetAssetPropertyValueResponse) ArrayList(java.util.ArrayList) AssetProperty(software.amazon.awssdk.services.iotsitewise.model.AssetProperty) Slf4j(lombok.extern.slf4j.Slf4j) List(java.util.List) Builder(lombok.Builder) Constants(com.aws.iot.edgeconnectorforkvs.util.Constants) EdgeConnectorForKVSConfiguration(com.aws.iot.edgeconnectorforkvs.model.EdgeConnectorForKVSConfiguration) AllArgsConstructor(lombok.AllArgsConstructor) PropertyNotificationState(software.amazon.awssdk.services.iotsitewise.model.PropertyNotificationState) EdgeConnectorForKVSException(com.aws.iot.edgeconnectorforkvs.model.exceptions.EdgeConnectorForKVSException) EdgeConnectorForKVSUnrecoverableException(com.aws.iot.edgeconnectorforkvs.model.exceptions.EdgeConnectorForKVSUnrecoverableException) ArrayList(java.util.ArrayList) EdgeConnectorForKVSUnrecoverableException(com.aws.iot.edgeconnectorforkvs.model.exceptions.EdgeConnectorForKVSUnrecoverableException) EdgeConnectorForKVSException(com.aws.iot.edgeconnectorforkvs.model.exceptions.EdgeConnectorForKVSException)

Aggregations

EdgeConnectorForKVSConfiguration (com.aws.iot.edgeconnectorforkvs.model.EdgeConnectorForKVSConfiguration)2 EdgeConnectorForKVSException (com.aws.iot.edgeconnectorforkvs.model.exceptions.EdgeConnectorForKVSException)2 EdgeConnectorForKVSUnrecoverableException (com.aws.iot.edgeconnectorforkvs.model.exceptions.EdgeConnectorForKVSUnrecoverableException)2 ArrayList (java.util.ArrayList)2 Constants (com.aws.iot.edgeconnectorforkvs.util.Constants)1 IOException (java.io.IOException)1 Field (java.lang.reflect.Field)1 List (java.util.List)1 ExecutionException (java.util.concurrent.ExecutionException)1 TimeoutException (java.util.concurrent.TimeoutException)1 Collectors (java.util.stream.Collectors)1 AllArgsConstructor (lombok.AllArgsConstructor)1 Builder (lombok.Builder)1 Slf4j (lombok.extern.slf4j.Slf4j)1 AssetProperty (software.amazon.awssdk.services.iotsitewise.model.AssetProperty)1 DescribeAssetResponse (software.amazon.awssdk.services.iotsitewise.model.DescribeAssetResponse)1 GetAssetPropertyValueResponse (software.amazon.awssdk.services.iotsitewise.model.GetAssetPropertyValueResponse)1 PropertyNotificationState (software.amazon.awssdk.services.iotsitewise.model.PropertyNotificationState)1