private ClouderaManagerCluster discoverCluster()

in gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscovery.java [258:331]


  private ClouderaManagerCluster discoverCluster(DiscoveryApiClient client, String clusterName, Collection<String> includedServices)
      throws ApiException {
    ServicesResourceApi servicesResourceApi = new ServicesResourceApi(client);
    RolesResourceApi rolesResourceApi = new RolesResourceApi(client);

    log.discoveringCluster(clusterName);

    Set<ServiceModel> serviceModels = new HashSet<>();

    List<ApiService> serviceList = getClusterServices(client.getConfig(), servicesResourceApi);

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

        log.discoveredService(service.getName(), service.getType());
      }
      ClouderaManagerCluster cluster = new ClouderaManagerCluster(clusterName);
      cluster.addServiceModels(serviceModels);
      return cluster;
    }
    return null;
  }