@Override public void accept(PreparedStatement statement, ApplicationEntity entity) throws SQLException { int parameterIndex = 1; if (entity.getSite() != null && StringUtils.isNotBlank(entity.getSite().getSiteId())) { statement.setString(parameterIndex, entity.getSite().getSiteId()); parameterIndex++; if (entity.getDescriptor() != null && StringUtils.isNotBlank(entity.getDescriptor().getType())) { statement.setString(parameterIndex, entity.getDescriptor().getType()); parameterIndex++; if (entity.getMode() != null && StringUtils.isNotBlank(entity.getMode().name())) { statement.setString(parameterIndex, entity.getMode().name()); parameterIndex++; if (StringUtils.isNotBlank(entity.getJarPath())) { statement.setString(parameterIndex, entity.getJarPath()); parameterIndex++; if (entity.getStatus() != null && StringUtils.isNotBlank(entity.getStatus().name())) { statement.setString(parameterIndex, entity.getStatus().name()); parameterIndex++; if (entity.getConfiguration() != null && !entity.getConfiguration().isEmpty()) { statement.setString(parameterIndex, JSONObject.toJSONString(entity.getConfiguration())); parameterIndex++; if (entity.getContext() != null && !entity.getContext().isEmpty()) { statement.setString(parameterIndex, JSONObject.toJSONString(entity.getContext())); parameterIndex++;
/** * Update mutable fields from another ApplicationEntity. */ public void updateMutable(ApplicationEntity entityToUpdate) { this.ensureDefault(); this.setJarPath(entityToUpdate.getJarPath()); this.setMode(entityToUpdate.getMode()); this.setConfiguration(entityToUpdate.getConfiguration()); }
@Override public ApplicationEntity update(ApplicationEntity entity) { Preconditions.checkNotNull(entity.getUuid(), "UUID"); ApplicationEntity origin = getByUUID(entity.getUuid()); origin.updateMutable(entity); return origin; } }
ApplicationDesc appDesc = applicationProviderService.getApplicationDescByType(operation.getAppType()); Preconditions.checkNotNull("Application with TYPE: " + operation.getAppType() + " is not found"); ApplicationEntity applicationEntity = new ApplicationEntity(); applicationEntity.setDescriptor(appDesc); applicationEntity.setSite(siteEntity); applicationEntity.setMode(operation.getMode()); applicationEntity.setJarPath(operation.getJarPath() == null ? appDesc.getJarPath() : operation.getJarPath()); applicationEntity.ensureDefault(); applicationEntity.setConfiguration(appConfig); applicationEntity.getContext().put("siteId", siteEntity.getSiteId()); applicationEntity.getContext().put("appId", applicationEntity.getAppId()); ApplicationProvider<?> applicationProvider = applicationProviderService.getApplicationProviderByType(applicationEntity.getDescriptor().getType());
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); } }
@Override public ApplicationEntity apply(ResultSet resultSet) throws SQLException { ApplicationDesc applicationDesc = new ApplicationDesc(); String appType = resultSet.getString(4); applicationDesc.setType(appType); SiteEntity siteEntity = new SiteEntity(); siteEntity.setUuid(resultSet.getString(12)); siteEntity.setSiteId(resultSet.getString(13)); siteEntity.setSiteName(resultSet.getString(14)); siteEntity.setDescription(resultSet.getString(15)); siteEntity.setCreatedTime(resultSet.getLong(16)); siteEntity.setModifiedTime(resultSet.getLong(17)); ApplicationEntity resultEntity = new ApplicationEntity(); resultEntity.setUuid(resultSet.getString(1)); resultEntity.setAppId(resultSet.getString(2)); resultEntity.setSite(siteEntity); resultEntity.setDescriptor(applicationDesc); resultEntity.setMode(ApplicationEntity.Mode.valueOf(resultSet.getString(5))); resultEntity.setJarPath(resultSet.getString(6)); resultEntity.setStatus(ApplicationEntity.Status.valueOf(resultSet.getString(7))); resultEntity.setConfiguration(parse(resultSet.getString(8))); resultEntity.setContext(parse(resultSet.getString(9))); resultEntity.setCreatedTime(resultSet.getLong(10)); resultEntity.setModifiedTime(resultSet.getLong(11)); return resultEntity; }
@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; }
private Map<String, Object> getAppConfig(String site, String appType){ ApplicationEntity entity = entityService.getBySiteIdAndAppType(site, appType); return entity.getConfiguration(); } }
@POST @Path("/{appUuid}") @Produces(MediaType.APPLICATION_JSON) public RESTResponse<ApplicationEntity> updateApplicationEntity(@PathParam("appUuid") String appUuid, ApplicationOperations.UpdateOperation updateOperation) { return RESTResponse.async(() -> { ApplicationEntity applicationEntity = new ApplicationEntity(); applicationEntity.setStatus(entityService.getByUUID(appUuid).getStatus()); applicationEntity.setUuid(appUuid); applicationEntity.setJarPath(updateOperation.getJarPath()); applicationEntity.setMode(updateOperation.getMode()); applicationEntity.setConfiguration(updateOperation.getConfiguration()); return entityService.update(applicationEntity); }).get(); }
@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()); } } }
@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"); ApplicationEntity.Status currentStatus = appEntity.getStatus(); try { if (currentStatus == ApplicationEntity.Status.INITIALIZED || currentStatus == ApplicationEntity.Status.STOPPED) { appEntity.setStatus(ApplicationEntity.Status.STARTING); return applicationEntityService.create(appEntity); } else { throw new ApplicationWrongStatusException("App: " + appEntity.getAppId() + " status is " + currentStatus + " start operation is not allowed"); throw e; } catch (Exception e) { LOGGER.error("Failed to start app " + appEntity.getAppId(), e); throw e; } catch (Throwable throwable) {
this.metadata = metadata; this.runtime = ExecutionRuntimeManager.getInstance().getRuntime(application.getEnvironmentType(), serverConfig); Map<String, Object> executionConfig = new HashMap<>(metadata.getConfiguration()); if (executionConfig == null) { executionConfig = Collections.emptyMap(); executionConfig.put("jarPath", metadata.getJarPath()); executionConfig.put("mode", metadata.getMode().name()); executionConfig.put(MetricConfigs.METRIC_PREFIX_CONF, APP_METRIC_PREFIX); this.effectiveConfig = ConfigFactory.parseMap(executionConfig) .withFallback(serverConfig) .withFallback(ConfigFactory.parseMap(metadata.getContext())) .withFallback(serverConfig.getConfig(AlertConstants.COORDINATOR)); } else { this.effectiveConfig = ConfigFactory.parseMap(executionConfig) .withFallback(serverConfig) .withFallback(ConfigFactory.parseMap(metadata.getContext()));
public ApplicationExecutionConfig(ApplicationEntity metadata) { this.siteId = metadata.getSite().getSiteId(); this.mode = metadata.getMode().name(); this.appId = metadata.getAppId(); this.jarPath = metadata.getJarPath(); }
private void processStreams() { if (metadata.getDescriptor().getStreams() == null) { return; List<StreamDesc> streamDescToInstall = metadata.getDescriptor().getStreams().stream().map((streamDefinition -> { StreamDefinition copied = streamDefinition.copy(); copied.setSiteId(metadata.getSite().getSiteId()); copied.setStreamId(StreamIdConversions.formatSiteStreamId(metadata.getSite().getSiteId(), copied.getStreamId())); StreamSinkConfig streamSinkConfig = this.runtime.environment() .stream().getSinkConfig(StreamIdConversions.parseStreamTypeId(copied.getSiteId(), copied.getStreamId()), this.effectiveConfig); metadata.setStreams(streamDescToInstall); sd.setStreamSource(metadata.getAppId()); alertMetadataService.createStream(streamDesc.getSchema());
private Topology createTopologyMeta(ApplicationEntity applicationEntity) { return UnitTopologyRunner.buildTopologyMetadata(applicationEntity.getAppId(),ConfigFactory.parseMap(applicationEntity.getConfiguration())); } }
@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 void updateApplicationEntityStatus(ApplicationEntity applicationEntity) { String appUuid = applicationEntity.getUuid(); ApplicationEntity.Status preStatus = applicationEntity.getStatus(); try { ApplicationEntity.Status currentStatus = applicationManagementService.getStatus(new ApplicationOperations.CheckStatusOperation(appUuid)); LOG.info("Application {} status changed from {} to {}", applicationEntity.getAppId(), preStatus, currentStatus); applicationEntity.setStatus(currentStatus); applicationEntityService.update(applicationEntity); } catch (RuntimeException e) {
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; }
@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; } }