Search in sources :

Example 1 with ApiRoleList

use of com.cloudera.api.swagger.model.ApiRoleList in project knox by apache.

the class ClouderaManagerServiceDiscovery method discoverCluster.

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);
    repository.registerCluster(client.getConfig());
    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);
        for (ApiService service : serviceList) {
            final List<ServiceModelGenerator> modelGenerators = serviceModelGenerators.get(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 service */
            if (!CM_SERVICE_TYPE.equals(service.getType())) {
                serviceConfig = getServiceConfig(client.getConfig(), servicesResourceApi, service);
            }
            ApiRoleList roleList = getRoles(client.getConfig(), rolesResourceApi, clusterName, service);
            if (roleList != 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 service */
                    if (!CM_SERVICE_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);
                                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;
}
Also used : ServicesResourceApi(com.cloudera.api.swagger.ServicesResourceApi) RolesResourceApi(com.cloudera.api.swagger.RolesResourceApi) ApiRole(com.cloudera.api.swagger.model.ApiRole) ApiConfigList(com.cloudera.api.swagger.model.ApiConfigList) ApiService(com.cloudera.api.swagger.model.ApiService) ApiRoleList(com.cloudera.api.swagger.model.ApiRoleList) HashSet(java.util.HashSet) ApiServiceConfig(com.cloudera.api.swagger.model.ApiServiceConfig)

Example 2 with ApiRoleList

use of com.cloudera.api.swagger.model.ApiRoleList in project knox by apache.

the class PollingConfigurationAnalyzer method getCurrentServiceConfiguration.

/**
 * Get the current configuration for the specified service.
 *
 * @param address     The address of the ClouderaManager instance.
 * @param clusterName The name of the cluster.
 * @param service     The name of the service.
 *
 * @return A ServiceConfigurationModel object with the configuration properties associated with the specified
 * service.
 */
protected ServiceConfigurationModel getCurrentServiceConfiguration(final String address, final String clusterName, final String service) {
    ServiceConfigurationModel currentConfig = null;
    log.gettingCurrentClusterConfiguration(service, clusterName, address);
    ApiClient apiClient = getApiClient(configCache.getDiscoveryConfig(address, clusterName));
    ServicesResourceApi api = new ServicesResourceApi(apiClient);
    try {
        ApiServiceConfig svcConfig = api.readServiceConfig(clusterName, service, "full");
        Map<ApiRole, ApiConfigList> roleConfigs = new HashMap<>();
        RolesResourceApi rolesApi = (new RolesResourceApi(apiClient));
        ApiRoleList roles = rolesApi.readRoles(clusterName, service, "", "full");
        for (ApiRole role : roles.getItems()) {
            ApiConfigList config = rolesApi.readRoleConfig(clusterName, role.getName(), service, "full");
            roleConfigs.put(role, config);
        }
        currentConfig = new ServiceConfigurationModel(svcConfig, roleConfigs);
    } catch (ApiException e) {
        log.clouderaManagerConfigurationAPIError(e);
    }
    return currentConfig;
}
Also used : ServicesResourceApi(com.cloudera.api.swagger.ServicesResourceApi) ApiRole(com.cloudera.api.swagger.model.ApiRole) ApiConfigList(com.cloudera.api.swagger.model.ApiConfigList) HashMap(java.util.HashMap) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) RolesResourceApi(com.cloudera.api.swagger.RolesResourceApi) ApiRoleList(com.cloudera.api.swagger.model.ApiRoleList) ApiClient(com.cloudera.api.swagger.client.ApiClient) DiscoveryApiClient(org.apache.knox.gateway.topology.discovery.cm.DiscoveryApiClient) ApiServiceConfig(com.cloudera.api.swagger.model.ApiServiceConfig) ApiException(com.cloudera.api.swagger.client.ApiException)

Example 3 with ApiRoleList

use of com.cloudera.api.swagger.model.ApiRoleList in project knox by apache.

the class ClouderaManagerServiceDiscoveryTest method doTestDiscovery.

private ServiceDiscovery.Cluster doTestDiscovery(final String hostName, final String serviceName, final String serviceType, final String roleName, final String roleType, final Map<String, String> serviceProperties, final Map<String, String> roleProperties) {
    final String clusterName = "cluster-1";
    GatewayConfig gwConf = EasyMock.createNiceMock(GatewayConfig.class);
    EasyMock.replay(gwConf);
    ServiceDiscoveryConfig sdConfig = createMockDiscoveryConfig(clusterName);
    // Create the test client for providing test response content
    TestDiscoveryApiClient mockClient = new TestDiscoveryApiClient(sdConfig, null, null);
    // Prepare the service list response for the cluster
    ApiServiceList serviceList = EasyMock.createNiceMock(ApiServiceList.class);
    final List<ApiService> apiServiceList = new ArrayList<>();
    apiServiceList.add(createMockApiService(serviceName, serviceType, clusterName));
    EasyMock.expect(serviceList.getItems()).andReturn(apiServiceList).anyTimes();
    EasyMock.replay(serviceList);
    mockClient.addResponse(ApiServiceList.class, new TestApiServiceListResponse(serviceList));
    // Prepare the service config response for the cluster
    ApiServiceConfig serviceConfig = createMockApiServiceConfig(serviceProperties);
    mockClient.addResponse(ApiServiceConfig.class, new TestApiServiceConfigResponse(serviceConfig));
    // Prepare the role
    ApiRole role = createMockApiRole(roleName, roleType, hostName);
    ApiRoleList roleList = EasyMock.createNiceMock(ApiRoleList.class);
    EasyMock.expect(roleList.getItems()).andReturn(Collections.singletonList(role)).anyTimes();
    EasyMock.replay(roleList);
    mockClient.addResponse(ApiRoleList.class, new TestApiRoleListResponse(roleList));
    // Configure the role
    ApiConfigList roleConfigList = createMockApiConfigList(roleProperties);
    mockClient.addResponse(ApiConfigList.class, new TestApiConfigListResponse(roleConfigList));
    // Invoke the service discovery
    ClouderaManagerServiceDiscovery cmsd = new ClouderaManagerServiceDiscovery(true, gwConf);
    // to clear the repo
    cmsd.onConfigurationChange(null, null);
    ServiceDiscovery.Cluster cluster = cmsd.discover(gwConf, sdConfig, clusterName, Collections.emptySet(), mockClient);
    assertNotNull(cluster);
    assertEquals(clusterName, cluster.getName());
    return cluster;
}
Also used : ArrayList(java.util.ArrayList) ApiServiceList(com.cloudera.api.swagger.model.ApiServiceList) ServiceDiscoveryConfig(org.apache.knox.gateway.topology.discovery.ServiceDiscoveryConfig) ApiRole(com.cloudera.api.swagger.model.ApiRole) ApiConfigList(com.cloudera.api.swagger.model.ApiConfigList) ApiService(com.cloudera.api.swagger.model.ApiService) ApiRoleList(com.cloudera.api.swagger.model.ApiRoleList) GatewayConfig(org.apache.knox.gateway.config.GatewayConfig) ApiServiceConfig(com.cloudera.api.swagger.model.ApiServiceConfig) ServiceDiscovery(org.apache.knox.gateway.topology.discovery.ServiceDiscovery)

Example 4 with ApiRoleList

use of com.cloudera.api.swagger.model.ApiRoleList in project knox by apache.

the class ClouderaManagerServiceDiscoveryRepositoryTest method testAddRole.

@Test
public void testAddRole() throws Exception {
    final String serviceName = "HDFS-1";
    final String roleName = "NAMENODE-1";
    repository.registerCluster(serviceDiscoveryConfig);
    final ApiService service = EasyMock.createNiceMock(ApiService.class);
    EasyMock.expect(service.getName()).andReturn(serviceName).anyTimes();
    final ApiRole role = EasyMock.createNiceMock(ApiRole.class);
    EasyMock.expect(role.getName()).andReturn(roleName).anyTimes();
    final ApiRoleList roles = EasyMock.createNiceMock(ApiRoleList.class);
    EasyMock.expect(roles.getItems()).andReturn(Collections.singletonList(role)).anyTimes();
    EasyMock.replay(service, role, roles);
    assertFalse(containsRole(service, roleName));
    repository.addService(serviceDiscoveryConfig, service);
    repository.addRoles(serviceDiscoveryConfig, service, roles);
    assertTrue(containsRole(service, roleName));
}
Also used : ApiRole(com.cloudera.api.swagger.model.ApiRole) ApiService(com.cloudera.api.swagger.model.ApiService) ApiRoleList(com.cloudera.api.swagger.model.ApiRoleList) Test(org.junit.Test)

Example 5 with ApiRoleList

use of com.cloudera.api.swagger.model.ApiRoleList in project knox by apache.

the class ClouderaManagerServiceDiscovery method getRoles.

private ApiRoleList getRoles(ServiceDiscoveryConfig serviceDiscoveryConfig, RolesResourceApi rolesResourceApi, String clusterName, ApiService service) {
    log.lookupRolesFromRepository();
    // first, try in the service discovery repository
    ApiRoleList roles = repository.getRoles(serviceDiscoveryConfig, service);
    if (roles == null || roles.getItems() == null) {
        // no roles in the repository -> query CM
        final String serviceName = service.getName();
        try {
            log.lookupRolesFromCM();
            /* Populate roles for CM Service since they are not discoverable */
            if (CM_SERVICE_TYPE.equalsIgnoreCase(serviceName)) {
                roles = new ApiRoleList();
                final ApiRole cmRole = new ApiRole();
                cmRole.setName(CM_ROLE_TYPE);
                cmRole.setType(CM_ROLE_TYPE);
                roles.addItemsItem(cmRole);
            } else {
                roles = rolesResourceApi.readRoles(clusterName, serviceName, "", VIEW_SUMMARY);
            }
            // make sure that role is populated in the service discovery repository to avoid subsequent CM calls
            repository.addRoles(serviceDiscoveryConfig, service, roles);
        } catch (Exception e) {
            log.failedToAccessServiceRoleConfigs(serviceName, "N/A", clusterName, e);
        }
    }
    return roles;
}
Also used : ApiRole(com.cloudera.api.swagger.model.ApiRole) ApiRoleList(com.cloudera.api.swagger.model.ApiRoleList) ApiException(com.cloudera.api.swagger.client.ApiException)

Aggregations

ApiRole (com.cloudera.api.swagger.model.ApiRole)6 ApiRoleList (com.cloudera.api.swagger.model.ApiRoleList)6 ApiConfigList (com.cloudera.api.swagger.model.ApiConfigList)4 ApiService (com.cloudera.api.swagger.model.ApiService)4 ApiServiceConfig (com.cloudera.api.swagger.model.ApiServiceConfig)3 RolesResourceApi (com.cloudera.api.swagger.RolesResourceApi)2 ServicesResourceApi (com.cloudera.api.swagger.ServicesResourceApi)2 ApiException (com.cloudera.api.swagger.client.ApiException)2 Test (org.junit.Test)2 ApiClient (com.cloudera.api.swagger.client.ApiClient)1 ApiConfig (com.cloudera.api.swagger.model.ApiConfig)1 ApiServiceList (com.cloudera.api.swagger.model.ApiServiceList)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 HashSet (java.util.HashSet)1 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)1 GatewayConfig (org.apache.knox.gateway.config.GatewayConfig)1 ServiceDiscovery (org.apache.knox.gateway.topology.discovery.ServiceDiscovery)1 ServiceDiscoveryConfig (org.apache.knox.gateway.topology.discovery.ServiceDiscoveryConfig)1 DiscoveryApiClient (org.apache.knox.gateway.topology.discovery.cm.DiscoveryApiClient)1