package com.thinkbiganalytics.controller.metadata;
/*-
* #%L
* thinkbig-nifi-core-service
* %%
* Copyright (C) 2017 ThinkBig Analytics
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import com.thinkbiganalytics.nifi.core.api.metadata.MetadataProviderService;
import com.thinkbiganalytics.nifi.v2.core.metadata.MetadataProviderSelectorService;
import org.apache.nifi.components.PropertyDescriptor;
import org.apache.nifi.processor.AbstractProcessor;
import org.apache.nifi.processor.ProcessContext;
import org.apache.nifi.processor.ProcessSession;
import org.apache.nifi.processor.exception.ProcessException;
import org.apache.nifi.reporting.InitializationException;
import org.apache.nifi.ssl.SSLContextService;
import org.apache.nifi.ssl.StandardSSLContextService;
import org.apache.nifi.util.TestRunner;
import org.apache.nifi.util.TestRunners;
import org.junit.Assert;
import java.util.ArrayList;
import java.util.List;
/**
* To test with SSL 1. use the nifi-toolkit to generate selfsigned key and trust store tls-toolkit.sh standalone -n 'localhost' -C 'CN=kylo, OU=ThinkBig' -o . 2. set the application properties to make
* thinkbig-services run under SSL using the generated files from #1 (example below) server.ssl.key-store=/Users/sr186054/tools/test-ssl/test/localhost/keystore.jks
* server.ssl.key-store-password=sxkJ96yw2ZZktkVFtflln2IqjxkXPCD+vh3gAPDhQ18 server.ssl.key-store-type=jks server.ssl.trust-store=/Users/sr186054/tools/test-ssl/test/localhost/truststore.jks
* server.ssl.trust-store-password=S1+cc2FKMzk2td/p6OJE0U6FUM3fV5jnlrYj46CoUSU server.ssl.trust-store-type=JKS 3. setup the SSLContextService below to use the truststore and client keystore 4. run the
* #testMetadataService method to assess the connections
*/
public class MetadataProviderSelectorServiceTest {
private static String SSL_SERVICE_NAME = "ssl-service-1";
private static String METADATA_SERVICE_NAME = "metadataService1";
private SSLContextService createSslContextService(TestRunner runner) throws InitializationException {
SSLContextService service = new StandardSSLContextService();
runner.addControllerService(SSL_SERVICE_NAME, service);
runner.setProperty(service, StandardSSLContextService.KEYSTORE.getName(), "/Users/sr186054/tools/test-ssl/test/CN=kylo_OU=ThinkBig.p12");
runner.setProperty(service, StandardSSLContextService.KEYSTORE_PASSWORD.getName(), "RQDTSpm");
runner.setProperty(service, StandardSSLContextService.KEYSTORE_TYPE.getName(), "PKCS12");
runner.setProperty(service, StandardSSLContextService.TRUSTSTORE.getName(), "/Users/sr186054/tools/test-ssl/test/localhost/truststore.jks");
runner.setProperty(service, StandardSSLContextService.TRUSTSTORE_PASSWORD.getName(), "S1+cc2FKMzk2td/p6OJE0U6FUM3fV5jnlrYj46CoUSU");
runner.setProperty(service, StandardSSLContextService.TRUSTSTORE_TYPE.getName(), "JKS");
runner.enableControllerService(service);
return service;
}
private MetadataProviderSelectorService createMetadataProviderSelectorService(TestRunner runner, boolean useSsl) throws InitializationException {
MetadataProviderSelectorService metadataProviderSelectorService = new MetadataProviderSelectorService();
runner.addControllerService(METADATA_SERVICE_NAME, metadataProviderSelectorService);
if (useSsl) {
runner.setProperty(metadataProviderSelectorService, MetadataProviderSelectorService.SSL_CONTEXT_SERVICE.getName(), createSslContextService(runner).getIdentifier());
}
runner.setProperty(metadataProviderSelectorService, MetadataProviderSelectorService.CLIENT_URL.getName(), "https://localhost:8420/api/v1/metadata");
runner.setProperty(metadataProviderSelectorService, MetadataProviderSelectorService.CLIENT_USERNAME.getName(), "dladmin");
runner.setProperty(metadataProviderSelectorService, MetadataProviderSelectorService.CLIENT_PASSWORD.getName(), "thinkbig");
runner.enableControllerService(metadataProviderSelectorService);
return metadataProviderSelectorService;
}
// @Test
public void testMetadataService() throws InitializationException {
String category = "web_data";
String feed = "web_signup";
final TestRunner runner = TestRunners.newTestRunner(TestProcessor.class);
MetadataProviderSelectorService metadataService = createMetadataProviderSelectorService(runner, true);
runner.assertValid(metadataService);
metadataService = (MetadataProviderSelectorService) runner.getProcessContext().getControllerServiceLookup().getControllerService(METADATA_SERVICE_NAME);
Assert.assertNotNull(metadataService);
String feedId = metadataService.getProvider().getFeedId(category, feed);
Assert.assertNotNull(feedId);
}
public static class TestProcessor extends AbstractProcessor {
public TestProcessor() {
super();
}
@Override
public void onTrigger(ProcessContext context, ProcessSession session) throws ProcessException {
}
@Override
protected List<PropertyDescriptor> getSupportedPropertyDescriptors() {
List<PropertyDescriptor> propDescs = new ArrayList<>();
propDescs.add(new PropertyDescriptor.Builder()
.name("Metadata CLientService")
.description("Metadata CLientService")
.identifiesControllerService(MetadataProviderService.class)
.required(true)
.build());
return propDescs;
}
}
}