[
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)