[ 
https://issues.apache.org/jira/browse/KNOX-3084?focusedWorklogId=975120&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-975120
 ]

ASF GitHub Bot logged work on KNOX-3084:
----------------------------------------

                Author: ASF GitHub Bot
            Created on: 18/Jul/25 13:15
            Start Date: 18/Jul/25 13:15
    Worklog Time Spent: 10m 
      Work Description: bonampak commented on code in PR #1059:
URL: https://github.com/apache/knox/pull/1059#discussion_r2216021550


##########
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());

Review Comment:
   done





Issue Time Tracking
-------------------

    Worklog Id:     (was: 975120)
    Time Spent: 40m  (was: 0.5h)

> 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: 40m
>  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)

Reply via email to