Search in sources :

Example 1 with DiagnosticManager

use of com.blackducksoftware.integration.hub.detect.workflow.diagnostic.DiagnosticManager in project hub-detect by blackducksoftware.

the class Application method run.

@Override
public void run(final ApplicationArguments applicationArguments) throws Exception {
    final long startTime = System.currentTimeMillis();
    // Events, Status and Exit Codes are required even if boot fails.
    EventSystem eventSystem = new EventSystem();
    DetectStatusManager statusManager = new DetectStatusManager(eventSystem);
    ExitCodeUtility exitCodeUtility = new ExitCodeUtility();
    ExitCodeManager exitCodeManager = new ExitCodeManager(eventSystem, exitCodeUtility);
    ReportManager reportManager = ReportManager.createDefault(eventSystem);
    // Before boot even begins, we create a new Spring context for Detect to work within.
    logger.info("Preparing detect.");
    DetectRun detectRun = DetectRun.createDefault();
    DetectContext detectContext = new DetectContext(detectRun);
    BootResult bootResult = null;
    Optional<RunResult> runResult = Optional.empty();
    try {
        logger.info("Detect boot begin.");
        BootManager bootManager = new BootManager(new BootFactory());
        bootResult = bootManager.boot(detectRun, applicationArguments.getSourceArgs(), environment, eventSystem, detectContext);
        logger.info("Detect boot completed.");
    } catch (final Exception e) {
        logger.error("Detect boot failed.");
        exitCodeManager.requestExitCode(e);
    }
    if (bootResult != null && bootResult.bootType == BootResult.BootType.CONTINUE) {
        logger.info("Detect will attempt to run.");
        RunManager runManager = new RunManager(detectContext);
        try {
            logger.info("Detect run begin: " + detectRun.getRunId());
            runResult = Optional.ofNullable(runManager.run());
            logger.info("Detect run completed.");
        } catch (final Exception e) {
            if (e.getMessage() != null) {
                logger.error("Detect run failed: " + e.getMessage());
            } else {
                logger.error("Detect run failed: " + e.getClass().getSimpleName());
            }
            logger.debug("An exception was thrown during the detect run.", e);
            exitCodeManager.requestExitCode(e);
        }
        try {
            logger.info("Detect will attempt to shutdown.");
            DiagnosticManager diagnosticManager = detectContext.getBean(DiagnosticManager.class);
            DirectoryManager directoryManager = detectContext.getBean(DirectoryManager.class);
            DetectConfiguration detectConfiguration = detectContext.getBean(DetectConfiguration.class);
            ConnectivityManager connectivityManager = detectContext.getBean(ConnectivityManager.class);
            ShutdownManager shutdownManager = new ShutdownManager(connectivityManager, statusManager, exitCodeManager, directoryManager, detectConfiguration, reportManager, diagnosticManager);
            logger.info("Detect shutdown begin.");
            shutdownManager.shutdown(runResult);
            logger.info("Detect shutdown completed.");
        } catch (final Exception e) {
            logger.error("Detect shutdown failed.");
            exitCodeManager.requestExitCode(e);
        }
    } else {
        logger.debug("Detect will NOT attempt to run.");
    }
    logger.info("All detect actions completed.");
    // Determine how detect should actually exit
    boolean printOutput = true;
    boolean shouldForceSuccess = false;
    if (bootResult != null && bootResult.detectConfiguration != null) {
        printOutput = !bootResult.detectConfiguration.getBooleanProperty(DetectProperty.DETECT_SUPPRESS_RESULTS_OUTPUT, PropertyAuthority.None);
        shouldForceSuccess = bootResult.detectConfiguration.getBooleanProperty(DetectProperty.DETECT_FORCE_SUCCESS, PropertyAuthority.None);
    }
    // Generally, when requesting a failure status, an exit code is also requested, but if it is not, we default to an unknown error.
    if (statusManager.hasAnyFailure()) {
        eventSystem.publishEvent(Event.ExitCode, new ExitCodeRequest(ExitCodeType.FAILURE_UNKNOWN_ERROR, "A failure status was requested by one or more of Detect's tools."));
    }
    // Find the final (as requested) exit code
    ExitCodeType finalExitCode = exitCodeManager.getWinningExitCode();
    // Print detect's status
    if (printOutput) {
        reportManager.printDetectorIssues();
        statusManager.logDetectResults(new Slf4jIntLogger(logger), finalExitCode);
    }
    // Print duration of run
    final long endTime = System.currentTimeMillis();
    logger.info(String.format("Detect duration: %s", DurationFormatUtils.formatPeriod(startTime, endTime, "HH'h' mm'm' ss's' SSS'ms'")));
    // Exit with formal exit code
    if (finalExitCode != ExitCodeType.SUCCESS && shouldForceSuccess) {
        logger.warn(String.format("Forcing success: Exiting with exit code 0. Ignored exit code was %s.", finalExitCode.getExitCode()));
        System.exit(0);
    } else if (finalExitCode != ExitCodeType.SUCCESS) {
        logger.error(String.format("Exiting with code %s - %s", finalExitCode.getExitCode(), finalExitCode.toString()));
    }
    System.exit(finalExitCode.getExitCode());
}
Also used : DetectContext(com.blackducksoftware.integration.hub.detect.lifecycle.DetectContext) ConnectivityManager(com.blackducksoftware.integration.hub.detect.workflow.ConnectivityManager) ExitCodeRequest(com.blackducksoftware.integration.hub.detect.lifecycle.shutdown.ExitCodeRequest) DirectoryManager(com.blackducksoftware.integration.hub.detect.workflow.file.DirectoryManager) ShutdownManager(com.blackducksoftware.integration.hub.detect.lifecycle.shutdown.ShutdownManager) BootResult(com.blackducksoftware.integration.hub.detect.lifecycle.boot.BootResult) RunManager(com.blackducksoftware.integration.hub.detect.lifecycle.run.RunManager) ReportManager(com.blackducksoftware.integration.hub.detect.workflow.report.ReportManager) BlackDuckApiException(com.synopsys.integration.blackduck.exception.BlackDuckApiException) ExitCodeType(com.blackducksoftware.integration.hub.detect.exitcode.ExitCodeType) DetectRun(com.blackducksoftware.integration.hub.detect.workflow.DetectRun) DetectConfiguration(com.blackducksoftware.integration.hub.detect.configuration.DetectConfiguration) Slf4jIntLogger(com.synopsys.integration.log.Slf4jIntLogger) DiagnosticManager(com.blackducksoftware.integration.hub.detect.workflow.diagnostic.DiagnosticManager) ExitCodeUtility(com.blackducksoftware.integration.hub.detect.lifecycle.shutdown.ExitCodeUtility) EventSystem(com.blackducksoftware.integration.hub.detect.workflow.event.EventSystem) RunResult(com.blackducksoftware.integration.hub.detect.lifecycle.run.RunResult) BootFactory(com.blackducksoftware.integration.hub.detect.lifecycle.boot.BootFactory) DetectStatusManager(com.blackducksoftware.integration.hub.detect.workflow.status.DetectStatusManager) ExitCodeManager(com.blackducksoftware.integration.hub.detect.lifecycle.shutdown.ExitCodeManager) BootManager(com.blackducksoftware.integration.hub.detect.lifecycle.boot.BootManager)

Example 2 with DiagnosticManager

use of com.blackducksoftware.integration.hub.detect.workflow.diagnostic.DiagnosticManager in project hub-detect by blackducksoftware.

the class BootManager method boot.

public BootResult boot(DetectRun detectRun, final String[] sourceArgs, ConfigurableEnvironment environment, EventSystem eventSystem, DetectContext detectContext) throws DetectUserFriendlyException, IntegrationException {
    Gson gson = bootFactory.createGson();
    ObjectMapper objectMapper = bootFactory.createObjectMapper();
    DocumentBuilder xml = bootFactory.createXmlDocumentBuilder();
    Configuration configuration = bootFactory.createConfiguration();
    DetectInfo detectInfo = DetectInfoUtility.createDefaultDetectInfo();
    SpringPropertySource springPropertySource = new SpringPropertySource(environment);
    DetectPropertySource propertySource = new DetectPropertySource(springPropertySource);
    DetectPropertyMap propertyMap = new DetectPropertyMap();
    DetectConfiguration detectConfiguration = new DetectConfiguration(propertySource, propertyMap);
    DetectOptionManager detectOptionManager = new DetectOptionManager(detectConfiguration, detectInfo);
    final List<DetectOption> options = detectOptionManager.getDetectOptions();
    DetectArgumentState detectArgumentState = parseDetectArgumentState(sourceArgs);
    if (detectArgumentState.isHelp() || detectArgumentState.isDeprecatedHelp() || detectArgumentState.isVerboseHelp()) {
        printAppropriateHelp(options, detectArgumentState);
        return BootResult.exit(detectConfiguration);
    }
    if (detectArgumentState.isHelpHtmlDocument()) {
        printHelpHtmlDocument(options, detectInfo, configuration);
        return BootResult.exit(detectConfiguration);
    }
    if (detectArgumentState.isHelpJsonDocument()) {
        printHelpJsonDocument(options, detectInfo, configuration, gson);
        return BootResult.exit(detectConfiguration);
    }
    printDetectInfo(detectInfo);
    if (detectArgumentState.isInteractive()) {
        startInteractiveMode(detectOptionManager, detectConfiguration, gson, objectMapper);
    }
    processDetectConfiguration(detectInfo, detectRun, detectConfiguration, options);
    detectOptionManager.postConfigurationProcessedInit();
    logger.info("Configuration processed completely.");
    printConfiguration(detectConfiguration.getBooleanProperty(DetectProperty.DETECT_SUPPRESS_CONFIGURATION_OUTPUT, PropertyAuthority.None), options);
    logger.info("Initializing detect.");
    DetectConfigurationFactory factory = new DetectConfigurationFactory(detectConfiguration);
    DirectoryManager directoryManager = new DirectoryManager(factory.createDirectoryOptions(), detectRun);
    DiagnosticManager diagnosticManager = createDiagnostics(detectOptionManager.getDetectOptions(), detectRun, detectInfo, detectArgumentState, eventSystem, directoryManager);
    checkForInvalidOptions(detectOptionManager);
    if (detectOptionManager.checkForAnyFailureProperties()) {
        eventSystem.publishEvent(Event.ExitCode, new ExitCodeRequest(ExitCodeType.FAILURE_CONFIGURATION));
        return BootResult.exit(detectConfiguration);
    }
    ConnectivityManager connectivityManager;
    boolean offline = detectConfiguration.getBooleanProperty(DetectProperty.BLACKDUCK_OFFLINE_MODE, PropertyAuthority.None);
    if (offline) {
        logger.info("Detect is in offline mode.");
        connectivityManager = ConnectivityManager.offline();
    } else {
        logger.info("Detect is in online mode.");
        // check my connectivity
        ConnectivityChecker connectivityChecker = new ConnectivityChecker();
        ConnectivityResult connectivityResult = connectivityChecker.determineConnectivity(detectConfiguration, detectOptionManager, detectInfo, gson, objectMapper, eventSystem);
        if (connectivityResult.isSuccessfullyConnected()) {
            logger.info("Detect is capable of communicating with server.");
            connectivityManager = ConnectivityManager.online(connectivityResult.getBlackDuckServicesFactory(), connectivityResult.getPhoneHomeManager(), connectivityResult.getBlackDuckServerConfig());
        } else {
            logger.info("Detect is NOT capable of communicating with server.");
            logger.info("Please double check the Detect documentation: https://synopsys.atlassian.net/wiki/spaces/INTDOCS/pages/622633/Hub+Detect");
            if (detectConfiguration.getBooleanProperty(DetectProperty.DETECT_DISABLE_WITHOUT_BLACKDUCK, PropertyAuthority.None)) {
                logger.info(connectivityResult.getFailureReason());
                logger.info(String.format("%s is set to 'true' so Detect will simply exit.", DetectProperty.DETECT_DISABLE_WITHOUT_BLACKDUCK.getPropertyName()));
                return BootResult.exit(detectConfiguration);
            } else {
                throw new DetectUserFriendlyException("Could not communicate with Black Duck: " + connectivityResult.getFailureReason(), ExitCodeType.FAILURE_HUB_CONNECTIVITY);
            }
        }
    }
    if (detectConfiguration.getBooleanProperty(DetectProperty.DETECT_TEST_CONNECTION, PropertyAuthority.None)) {
        logger.info(String.format("%s is set to 'true' so Detect will not run.", DetectProperty.DETECT_TEST_CONNECTION.getPropertyName()));
        return BootResult.exit(detectConfiguration);
    }
    // TODO: Only need this if in diagnostic or online (for phone home):
    BomToolProfiler profiler = new BomToolProfiler(eventSystem);
    // lock the configuration, boot has completed.
    logger.debug("Configuration is now complete. No changes should occur to configuration.");
    detectConfiguration.lock();
    // Finished, populate the detect context
    detectContext.registerBean(detectRun);
    detectContext.registerBean(eventSystem);
    detectContext.registerBean(profiler);
    detectContext.registerBean(detectConfiguration);
    detectContext.registerBean(detectInfo);
    detectContext.registerBean(directoryManager);
    detectContext.registerBean(diagnosticManager);
    detectContext.registerBean(connectivityManager);
    detectContext.registerBean(gson);
    detectContext.registerBean(objectMapper);
    detectContext.registerBean(xml);
    detectContext.registerBean(configuration);
    detectContext.registerConfiguration(RunBeanConfiguration.class);
    detectContext.registerConfiguration(DetectorBeanConfiguration.class);
    // can only refresh once, this locks and triggers refresh.
    detectContext.lock();
    BootResult result = new BootResult();
    result.bootType = BootResult.BootType.CONTINUE;
    result.detectConfiguration = detectConfiguration;
    return result;
}
Also used : RunBeanConfiguration(com.blackducksoftware.integration.hub.detect.RunBeanConfiguration) DetectorBeanConfiguration(com.blackducksoftware.integration.hub.detect.DetectorBeanConfiguration) DetectConfiguration(com.blackducksoftware.integration.hub.detect.configuration.DetectConfiguration) Configuration(freemarker.template.Configuration) DetectInfo(com.blackducksoftware.integration.hub.detect.DetectInfo) ConnectivityManager(com.blackducksoftware.integration.hub.detect.workflow.ConnectivityManager) SpringPropertySource(com.blackducksoftware.integration.hub.detect.property.SpringPropertySource) ExitCodeRequest(com.blackducksoftware.integration.hub.detect.lifecycle.shutdown.ExitCodeRequest) DirectoryManager(com.blackducksoftware.integration.hub.detect.workflow.file.DirectoryManager) Gson(com.google.gson.Gson) BomToolProfiler(com.blackducksoftware.integration.hub.detect.workflow.profiling.BomToolProfiler) DetectOptionManager(com.blackducksoftware.integration.hub.detect.help.DetectOptionManager) DetectOption(com.blackducksoftware.integration.hub.detect.help.DetectOption) DetectConfiguration(com.blackducksoftware.integration.hub.detect.configuration.DetectConfiguration) DetectPropertyMap(com.blackducksoftware.integration.hub.detect.configuration.DetectPropertyMap) DetectUserFriendlyException(com.blackducksoftware.integration.hub.detect.exception.DetectUserFriendlyException) DetectArgumentState(com.blackducksoftware.integration.hub.detect.help.DetectArgumentState) DocumentBuilder(javax.xml.parsers.DocumentBuilder) DetectConfigurationFactory(com.blackducksoftware.integration.hub.detect.configuration.DetectConfigurationFactory) DiagnosticManager(com.blackducksoftware.integration.hub.detect.workflow.diagnostic.DiagnosticManager) DetectPropertySource(com.blackducksoftware.integration.hub.detect.configuration.DetectPropertySource) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper)

Aggregations

DetectConfiguration (com.blackducksoftware.integration.hub.detect.configuration.DetectConfiguration)2 ExitCodeRequest (com.blackducksoftware.integration.hub.detect.lifecycle.shutdown.ExitCodeRequest)2 ConnectivityManager (com.blackducksoftware.integration.hub.detect.workflow.ConnectivityManager)2 DiagnosticManager (com.blackducksoftware.integration.hub.detect.workflow.diagnostic.DiagnosticManager)2 DirectoryManager (com.blackducksoftware.integration.hub.detect.workflow.file.DirectoryManager)2 DetectInfo (com.blackducksoftware.integration.hub.detect.DetectInfo)1 DetectorBeanConfiguration (com.blackducksoftware.integration.hub.detect.DetectorBeanConfiguration)1 RunBeanConfiguration (com.blackducksoftware.integration.hub.detect.RunBeanConfiguration)1 DetectConfigurationFactory (com.blackducksoftware.integration.hub.detect.configuration.DetectConfigurationFactory)1 DetectPropertyMap (com.blackducksoftware.integration.hub.detect.configuration.DetectPropertyMap)1 DetectPropertySource (com.blackducksoftware.integration.hub.detect.configuration.DetectPropertySource)1 DetectUserFriendlyException (com.blackducksoftware.integration.hub.detect.exception.DetectUserFriendlyException)1 ExitCodeType (com.blackducksoftware.integration.hub.detect.exitcode.ExitCodeType)1 DetectArgumentState (com.blackducksoftware.integration.hub.detect.help.DetectArgumentState)1 DetectOption (com.blackducksoftware.integration.hub.detect.help.DetectOption)1 DetectOptionManager (com.blackducksoftware.integration.hub.detect.help.DetectOptionManager)1 DetectContext (com.blackducksoftware.integration.hub.detect.lifecycle.DetectContext)1 BootFactory (com.blackducksoftware.integration.hub.detect.lifecycle.boot.BootFactory)1 BootManager (com.blackducksoftware.integration.hub.detect.lifecycle.boot.BootManager)1 BootResult (com.blackducksoftware.integration.hub.detect.lifecycle.boot.BootResult)1