protected void registerProvider(ApplicationProvider provider) { if (providers.containsKey(provider.getApplicationDesc().getType())) { throw new RuntimeException("Duplicated APPLICATION_TYPE: " + provider.getApplicationDesc().getType() + ", was already registered by provider: " + providers.get(provider.getApplicationDesc().getType())); } providers.put(provider.getApplicationDesc().getType(), provider); LOG.info("Initialized application provider: {}", provider); }
@Override public String toString() { return String.format("Application[appId=%s,siteId=%s,UUID=%s]", appId, descriptor.getType(), this.getUuid()); }
@Override public void start(Class<? extends ApplicationProvider> appProviderClass, Map<String, Object> appConfig) { try { ApplicationProvider applicationProvider = appProviderClass.newInstance(); start(applicationProvider.getApplicationDesc().getType(), appConfig); } catch (InstantiationException | IllegalAccessException e) { throw new IllegalStateException(e.getMessage(), e); } } }
@Override public ApplicationEntity getBySiteIdAndAppType(String siteId, String appType) { Optional<ApplicationEntity> optional = applicationEntityMap.values().stream() .filter((app) -> siteId.equals(app.getSite().getSiteId()) && appType.equals(app.getDescriptor().getType())).findAny(); if (optional.isPresent()) { return optional.get(); } else { return null; } }
@Override public StaticApplication getApplication() { return new StaticApplication(this.getApplicationDesc().getType()); }
private Collection<String> loadSites(String appType) { Set<String> sites = new HashSet<>(); Collection<ApplicationEntity> apps = applicationEntityService.findAll(); for (ApplicationEntity app : apps) { if (app.getDescriptor().getType().equalsIgnoreCase(appType) && app.getStatus().equals(ApplicationEntity.Status.RUNNING)) { sites.add(app.getSite().getSiteId()); } } LOG.info("Detected {} sites where MR_HISTORY_JOB_APP is Running: {}", sites.size(), sites); return sites; }
private void initializeProvider(ApplicationProviderConfig providerConfig) throws ClassNotFoundException, IllegalAccessException, InstantiationException { LOG.info("Loading application provider {} from {}", providerConfig.getClassName(), providerConfig.getJarPath()); String providerClassName = providerConfig.getClassName(); if (providerClassName == null) { throw new RuntimeException("provider.classname is null: " + providerConfig); } if (providerConfig.getJarPath() == null) { throw new RuntimeException("provider.jarpath is null: " + providerConfig); } Class<?> providerClass = Class.forName(providerClassName); if (!ApplicationProvider.class.isAssignableFrom(providerClass)) { throw new RuntimeException("providerClassName is not implementation of " + ApplicationProvider.class.getCanonicalName()); } ApplicationProvider provider = (ApplicationProvider) providerClass.newInstance(); Preconditions.checkNotNull(provider.getApplicationDesc(), "appDesc is null"); Preconditions.checkNotNull(provider.getApplicationDesc().getType(), "type is null"); registerProvider(provider); }
@Override public void ensureDefault() { super.ensureDefault(); Preconditions.checkNotNull(this.getSite(), "site is null"); Preconditions.checkNotNull(this.getSite().getSiteId(), "siteId is null"); Preconditions.checkNotNull(this.getDescriptor(), "descriptor is null"); Preconditions.checkNotNull(this.getDescriptor().getType(), "descriptor type is null"); if (this.appId == null) { this.appId = String.format("%s_%s", this.getDescriptor().getType(), this.getSite().getSiteId()).toUpperCase(); } if (this.status == null) { this.status = Status.INITIALIZED; } }
@Override public String toString() { return String.format( "%s[name=%s, type=%s, version=%s, viewPath=%s, appClass=%s, configuration= %s properties]", getClass().getSimpleName(), applicationDesc.getName(), applicationDesc.getType(), applicationDesc.getVersion(), applicationDesc.getViewPath(), applicationDesc.getAppClass(), applicationDesc.getConfiguration() == null ? 0 : applicationDesc.getConfiguration().size() ); }
@Override public ApplicationEntity create(ApplicationEntity entity) { entity.ensureDefault(); if (getBySiteIdAndAppType(entity.getSite().getSiteId(), entity.getDescriptor().getType()) != null) { throw new IllegalArgumentException("Duplicated appId: " + entity.getAppId()); } List<ApplicationEntity> entities = new ArrayList<>(1); entities.add(entity); try { queryService.insert(insertSql, entities, new ApplicationEntityToRelation()); } catch (SQLException e) { LOGGER.error("Error to insert ApplicationEntity: {}", entity, e); } return entity; } }
@Override public ApplicationEntity create(ApplicationEntity entity) { entity.ensureDefault(); if (getBySiteIdAndAppType(entity.getSite().getSiteId(), entity.getDescriptor().getType()) != null) { throw new IllegalArgumentException("Duplicated appId: " + entity.getAppId()); } applicationEntityMap.put(entity.getUuid(), entity); return entity; }
@Override public void register(ApplicationEntity appEntity) { if (environment == null) { LOG.warn("Environment is null, can not register"); return; } ApplicationProvider<?> appProvider = applicationProviderService.getApplicationProviderByType(appEntity.getDescriptor().getType()); Optional<HealthCheck> applicationHealthCheck = appProvider.getManagedHealthCheck( ConfigFactory.parseMap(appEntity.getContext()) .withFallback(config) .withFallback(ConfigFactory.parseMap(appEntity.getConfiguration())) ); if (!applicationHealthCheck.isPresent()) { LOG.warn("Application {} does not implement HealthCheck", appEntity.getAppId()); return; } this.environment.healthChecks().register(appEntity.getAppId(), applicationHealthCheck.get()); currentInjector.injectMembers(applicationHealthCheck.get()); synchronized (lock) { if (!appHealthChecks.containsKey(appEntity.getAppId())) { appHealthChecks.put(appEntity.getAppId(), applicationHealthCheck); LOG.info("Successfully register health check for {}", appEntity.getAppId()); } } }
private void loadProviderFromClassLoader(ClassLoader jarFileClassLoader, Function<ApplicationProvider, String> jarFileSupplier) { ServiceLoader<ApplicationProvider> serviceLoader = ServiceLoader.load(ApplicationProvider.class); try { for (ApplicationProvider applicationProvider : serviceLoader) { ApplicationProviderConfig providerConfig = new ApplicationProviderConfig(); providerConfig.setClassName(applicationProvider.getClass().getCanonicalName()); providerConfig.setJarPath(jarFileSupplier.apply(applicationProvider)); applicationProvider.getApplicationDesc().setExecutable(applicationProvider.getApplication().isExecutable()); registerProvider(applicationProvider); LOG.warn("Loaded {}:{} ({}) from {}", applicationProvider.getApplicationDesc().getType(), applicationProvider.getApplicationDesc().getVersion(), applicationProvider.getApplicationDesc().getName(), providerConfig.getJarPath() ); } } catch (Throwable ex) { LOG.error("Failed to register application provider", ex); throw new IllegalStateException(ex); } } }
@Override public ApplicationEntity.Status getStatus(ApplicationOperations.CheckStatusOperation operation) { try { ApplicationEntity applicationEntity = applicationEntityService.getByUUIDOrAppId(operation.getUuid(), operation.getAppId()); Application application = applicationProviderService.getApplicationProviderByType(applicationEntity.getDescriptor().getType()).getApplication(); Preconditions.checkArgument(application.isExecutable(), "Application is not executable"); ApplicationAction applicationAction = new ApplicationAction(application, applicationEntity, config, alertMetadataService); return applicationAction.getStatus(); } catch (IllegalArgumentException e) { LOGGER.error("application id not exist", e); throw e; } } }
@Override public String toString() { return String.format("ApplicationDesc [type=%s, name=%s, version=%s, appClass=%s, viewPath=%s, jarpath=%s, providerClass=%s, configuration= %s properties, description=%s", getType(), getName(), getVersion(), getAppClass(), getViewPath(), getJarPath(), getProviderClass(), getConfiguration() == null ? 0 : getConfiguration().size(), getDescription()); }
private void validateDependingApplicationInstalled(ApplicationEntity applicationEntity) { if (applicationEntity.getDescriptor().getDependencies() != null) { for (ApplicationDependency dependency : applicationEntity.getDescriptor().getDependencies()) { if (dependency.isRequired() && applicationEntityService.getBySiteIdAndAppType(applicationEntity.getSite().getSiteId(), dependency.getType()) == null) { throw new IllegalStateException("Required dependency " + dependency.toString() + " of " + applicationEntity.getDescriptor().getType() + " was not installed"); } } } }
@Override public ApplicationEntity start(ApplicationOperations.StartOperation operation) throws ApplicationWrongStatusException { ApplicationEntity appEntity = applicationEntityService.getByUUIDOrAppId(operation.getUuid(), operation.getAppId()); ApplicationProvider<?> appProvider = applicationProviderService.getApplicationProviderByType(appEntity.getDescriptor().getType()); Application application = appProvider.getApplication(); Preconditions.checkArgument(application.isExecutable(), "Application is not executable");
@Override public ApplicationEntity stop(ApplicationOperations.StopOperation operation) throws ApplicationWrongStatusException { ApplicationEntity applicationEntity = applicationEntityService.getByUUIDOrAppId(operation.getUuid(), operation.getAppId()); ApplicationProvider<?> appProvider = applicationProviderService.getApplicationProviderByType(applicationEntity.getDescriptor().getType()); Application application = appProvider.getApplication(); Preconditions.checkArgument(application.isExecutable(), "Application is not executable");
@Override public ApplicationEntity uninstall(ApplicationOperations.UninstallOperation operation) throws ApplicationWrongStatusException { ApplicationEntity appEntity = applicationEntityService.getByUUIDOrAppId(operation.getUuid(), operation.getAppId()); ApplicationProvider<?> appProvider = applicationProviderService.getApplicationProviderByType(appEntity.getDescriptor().getType()); ApplicationAction appAction = new ApplicationAction(appProvider.getApplication(), appEntity, config, alertMetadataService); ApplicationEntity.Status currentStatus = appEntity.getStatus(); try { if (currentStatus == ApplicationEntity.Status.INITIALIZED || currentStatus == ApplicationEntity.Status.STOPPED) { // AfterUninstall Callback appAction.doUninstall(); appProvider.getApplicationListener().ifPresent((listener) -> { currentInjector.injectMembers(listener); listener.init(appEntity); listener.afterUninstall(); }); applicationHealthCheckService.unregister(appEntity); return applicationEntityService.delete(appEntity); } else { throw new ApplicationWrongStatusException("App: " + appEntity.getAppId() + " status is " + currentStatus + ", uninstall operation is not allowed"); } } catch (Throwable throwable) { LOGGER.error(throwable.getMessage(), throwable); throw throwable; } }
private void fillApplicationDesc(List<ApplicationEntity> entities) { for (ApplicationEntity entity : entities) { entity.setDescriptor(applicationProviderService.getApplicationDescByType(entity.getDescriptor().getType())); if (entity.getDescriptor().getStreams() == null) { continue; } List<StreamDesc> streamDescToInstall = entity.getDescriptor().getStreams().stream().map((streamDefinition -> { StreamDefinition copied = streamDefinition.copy(); copied.setSiteId(entity.getSite().getSiteId()); copied.setStreamId(StreamIdConversions.formatSiteStreamId(entity.getSite().getSiteId(), copied.getStreamId())); Config effectiveConfig = ConfigFactory.parseMap(new HashMap<>(entity.getConfiguration())) .withFallback(config).withFallback(ConfigFactory.parseMap(entity.getContext())); ExecutionRuntime runtime = ExecutionRuntimeManager.getInstance().getRuntime( applicationProviderService.getApplicationProviderByType(entity.getDescriptor().getType()).getApplication().getEnvironmentType(), config); StreamSinkConfig streamSinkConfig = runtime.environment() .stream().getSinkConfig(StreamIdConversions.parseStreamTypeId(copied.getSiteId(), copied.getStreamId()), effectiveConfig); StreamDesc streamDesc = new StreamDesc(); streamDesc.setSchema(copied); streamDesc.setSinkConfig(streamSinkConfig); streamDesc.setStreamId(copied.getStreamId()); streamDesc.getSchema().setDataSource(entity.getAppId()); return streamDesc; })).collect(Collectors.toList()); entity.setStreams(streamDescToInstall); } }