[ https://issues.apache.org/jira/browse/KNOX-3084?focusedWorklogId=975119&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-975119 ]
ASF GitHub Bot logged work on KNOX-3084: ---------------------------------------- Author: ASF GitHub Bot Created on: 18/Jul/25 13:14 Start Date: 18/Jul/25 13:14 Worklog Time Spent: 10m Work Description: bonampak commented on code in PR #1059: URL: https://github.com/apache/knox/pull/1059#discussion_r2216021018 ########## gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscovery.java: ########## @@ -255,81 +257,115 @@ private boolean shouldRetryServiceDiscovery(ApiException e) { return false; } - private ClouderaManagerCluster discoverCluster(DiscoveryApiClient client, String clusterName, Collection<String> includedServices) + private ClouderaManagerCluster discoverCluster(GatewayConfig gatewayConfig, DiscoveryApiClient client, + String clusterName, Collection<String> includedServices) throws ApiException { ServicesResourceApi servicesResourceApi = new ServicesResourceApi(client); RolesResourceApi rolesResourceApi = new RolesResourceApi(client); + ServiceRoleCollector roleCollector = + ServiceRoleCollectorBuilder.newBuilder() + .gatewayConfig(gatewayConfig) + .rolesResourceApi(rolesResourceApi) + .build(); log.discoveringCluster(clusterName); + List<ApiService> serviceList = getServiceList(client.getConfig(), servicesResourceApi); + if (serviceList == null) { + return null; + } + + // if Legacy Cloudera Manager API Clients Compatibility is turned off, some HDFS settings are in CORE_SETTINGS + ApiServiceConfig coreSettingsConfig = coreSettingsConfig(client, servicesResourceApi, serviceList); + Set<ServiceModel> serviceModels = new HashSet<>(); + for (ApiService service : serviceList) { + serviceModels.addAll( + discoverService(client, clusterName, includedServices, service, servicesResourceApi, roleCollector, coreSettingsConfig)); + } - List<ApiService> serviceList = getClusterServices(client.getConfig(), servicesResourceApi); + ClouderaManagerCluster cluster = new ClouderaManagerCluster(clusterName); + cluster.addServiceModels(serviceModels); + log.discoveredCluster(clusterName); + return cluster; + } - if (serviceList != null) { - /* - Since Cloudera Manager does not have a service for itself, we will add a skeleton CM - service so that we can add CM service to topology when auto-discovery is - turned on and CM service is selected in the descriptor - */ - final ApiService cmService = new ApiService(); - cmService.setName(CM_SERVICE_TYPE.toLowerCase(Locale.ROOT)); - cmService.setType(CM_SERVICE_TYPE); - serviceList.add(cmService); - - // if Legacy Cloudera Manager API Clients Compatibility is turned off, some HDFS settings are in CORE_SETTINGS - ApiServiceConfig coreSettingsConfig = coreSettingsConfig(client, servicesResourceApi, serviceList); - - for (ApiService service : serviceList) { - final List<ServiceModelGenerator> modelGenerators = serviceModelGeneratorsHolder.getServiceModelGenerators(service.getType()); - if (shouldSkipServiceDiscovery(modelGenerators, includedServices)) { - //log.skipServiceDiscovery(service.getName(), service.getType()); - //continue; - } - log.discoveringService(service.getName(), service.getType()); - ApiServiceConfig serviceConfig = null; - /* no reason to check service config for CM or CORE_SETTINGS services */ - if (!CM_SERVICE_TYPE.equals(service.getType()) && !CORE_SETTINGS_TYPE.equals(service.getType())) { - serviceConfig = getServiceConfig(client.getConfig(), servicesResourceApi, service); - } - ApiRoleList roleList = getRoles(client.getConfig(), rolesResourceApi, clusterName, service); - if (roleList != null && roleList.getItems() != null) { - for (ApiRole role : roleList.getItems()) { - String roleName = role.getName(); - log.discoveringServiceRole(roleName, role.getType()); - - ApiConfigList roleConfig = null; - /* no reason to check role config for CM or CORE_SETTINGS services */ - if (!CM_SERVICE_TYPE.equals(service.getType()) && !CORE_SETTINGS_TYPE.equals(service.getType())) { - roleConfig = getRoleConfig(client.getConfig(), rolesResourceApi, service, role); - } - - if (modelGenerators != null) { - for (ServiceModelGenerator serviceModelGenerator : modelGenerators) { - ServiceModelGeneratorHandleResponse response = serviceModelGenerator.handles(service, serviceConfig, role, roleConfig); - if (response.handled()) { - serviceModelGenerator.setApiClient(client); - ServiceModel serviceModel = serviceModelGenerator.generateService(service, serviceConfig, role, roleConfig, coreSettingsConfig); - serviceModels.add(serviceModel); - } else if (!response.getConfigurationIssues().isEmpty()) { - log.serviceRoleHasConfigurationIssues(roleName, String.join(";", response.getConfigurationIssues())); - } - } - } - - log.discoveredServiceRole(roleName, role.getType()); - } - } + @SuppressWarnings("PMD.UnusedFormalParameter") + private Set<ServiceModel> discoverService(DiscoveryApiClient client, String clusterName, Collection<String> includedServices, + ApiService service, ServicesResourceApi servicesResourceApi, + ServiceRoleCollector roleCollector, ApiServiceConfig coreSettingsConfig) throws ApiException { + Set<ServiceModel> serviceModels = new HashSet<>(); + final List<ServiceModelGenerator> modelGenerators = serviceModelGeneratorsHolder.getServiceModelGenerators(service.getType()); + //if (shouldSkipServiceDiscovery(modelGenerators, includedServices)) { + //log.skipServiceDiscovery(service.getName(), service.getType()); + //continue; + //} + log.discoveringService(service.getName(), service.getType()); + ApiServiceConfig serviceConfig = null; + /* no reason to check service config for CM or CORE_SETTINGS services */ + if (!CM_SERVICE_TYPE.equals(service.getType()) && !CORE_SETTINGS_TYPE.equals(service.getType())) { + serviceConfig = getServiceConfig(client.getConfig(), servicesResourceApi, service); + } + ApiRoleConfigList roleConfigList = getAllServiceRoleConfigurations(client.getConfig(), roleCollector, clusterName, service); + if (roleConfigList != null && roleConfigList.getItems() != null) { + for (ApiRoleConfig roleConfig : roleConfigList.getItems()) { + ApiRole role = new ApiRole() + .name(roleConfig.getName()) + .type(roleConfig.getRoleType()) + .hostRef(roleConfig.getHostRef()); + ApiConfigList roleConfigs = roleConfig.getConfig(); + ServiceRoleDetails serviceRoleDetails = new ServiceRoleDetails(service, serviceConfig, role, roleConfigs); + + serviceModels.addAll(generateServiceModels(client, serviceRoleDetails, coreSettingsConfig, modelGenerators)); + } + } + + log.discoveredService(service.getName(), service.getType()); + return serviceModels; + } - log.discoveredService(service.getName(), service.getType()); + private Set<ServiceModel> generateServiceModels(DiscoveryApiClient client, ServiceRoleDetails serviceRoleDetails, ApiServiceConfig coreSettingsConfig, List<ServiceModelGenerator> modelGenerators) throws ApiException { + Set<ServiceModel> serviceModels = new HashSet<>(); + log.discoveringServiceRole(serviceRoleDetails.getRole().getName(), serviceRoleDetails.getRole().getType()); + + if (modelGenerators != null) { + for (ServiceModelGenerator serviceModelGenerator : modelGenerators) { + ServiceModel serviceModel = generateServiceModel(client, serviceRoleDetails, coreSettingsConfig, serviceModelGenerator); + if (serviceModel != null) { + serviceModels.add(serviceModel); + } } - ClouderaManagerCluster cluster = new ClouderaManagerCluster(clusterName); - cluster.addServiceModels(serviceModels); - return cluster; + } + + log.discoveredServiceRole(serviceRoleDetails.getRole().getName(), serviceRoleDetails.getRole().getType()); + return serviceModels; + } + + private static ServiceModel generateServiceModel(DiscoveryApiClient client, ServiceRoleDetails sd, + ApiServiceConfig coreSettingsConfig, ServiceModelGenerator serviceModelGenerator) throws ApiException { + ServiceModelGeneratorHandleResponse response = serviceModelGenerator.handles(sd.getService(), sd.getServiceConfig(), sd.getRole(), sd.getRoleConfig()); + if (response.handled()) { + serviceModelGenerator.setApiClient(client); + return serviceModelGenerator.generateService(sd.getService(), sd.getServiceConfig(), sd.getRole(), sd.getRoleConfig(), coreSettingsConfig); + } else if (!response.getConfigurationIssues().isEmpty()) { + log.serviceRoleHasConfigurationIssues(sd.getRole().getName(), String.join(";", response.getConfigurationIssues())); } return null; } + private List<ApiService> getServiceList(ServiceDiscoveryConfig config, ServicesResourceApi servicesResourceApi) throws ApiException { + List<ApiService> serviceList = getClusterServices(config, servicesResourceApi); + if (serviceList != null) { Review Comment: Done, removed. Issue Time Tracking ------------------- Worklog Id: (was: 975119) Time Spent: 0.5h (was: 20m) > Update CM service discovery with the enhanced role configs endpoint > ------------------------------------------------------------------- > > Key: KNOX-3084 > URL: https://issues.apache.org/jira/browse/KNOX-3084 > Project: Apache Knox > Issue Type: Task > Components: cm-discovery > Affects Versions: 2.1.0 > Reporter: Tamás Marcinkovics > Assignee: Tamás Marcinkovics > Priority: Major > Time Spent: 0.5h > Remaining Estimate: 0h > > There is a new CM API endpoint to fetch all role configurations for a given > service ({{RolesResouce.readRolesConfig}}) if the supported API version is > greater than or equal to v57. This endpoint is available in the > cloudera-manager-api-swagger:7.13.1 artifact. > [https://repository.cloudera.com/service/rest/repository/browse/cloudera-repos/com/cloudera/api/swagger/cloudera-manager-api-swagger/7.13.1/] > On the Knox side, we need to change the existing {{readRoles}} and > {{readRoleConfig}} API calls to the new {{readRolesConfig}} call. > The {{view}} parameter should still remain {{full}} as > {{full_with_no_health_check}} only returns role configuration parameters with > non-default values. > As the new cloudera-manager-api-swagger artifact is using okhttp 4.10, we > also need to change {{DiscoveryApiClient}} setup and our Okhttp interceptors > from Okhttp 2.7.5 to Okhttp 4. -- This message was sent by Atlassian Jira (v8.20.10#820010)