blob: 513f4a3a36e9e7d0e066d059d5284fea2443cdf8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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
* <p/>
* http://www.apache.org/licenses/LICENSE-2.0
* <p/>
* 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.
*/
package org.apache.knox.gateway;
import org.apache.knox.gateway.filter.rewrite.api.UrlRewriteEnvironment;
import org.apache.knox.gateway.filter.rewrite.api.UrlRewriteProcessor;
import org.apache.knox.gateway.filter.rewrite.api.UrlRewriteRulesDescriptor;
import org.apache.knox.gateway.filter.rewrite.api.UrlRewriteRulesDescriptorFactory;
import org.apache.knox.gateway.filter.rewrite.api.UrlRewriteServletContextListener;
import org.apache.knox.gateway.filter.rewrite.api.UrlRewriteServletEnvironment;
import org.apache.knox.gateway.filter.rewrite.api.UrlRewriteServletFilter;
import org.apache.knox.gateway.filter.rewrite.impl.UrlRewriteRequest;
import org.apache.knox.gateway.services.ServiceType;
import org.apache.knox.gateway.services.GatewayServices;
import org.apache.knox.gateway.services.registry.ServiceRegistry;
import org.apache.knox.gateway.util.XmlUtils;
import org.apache.knox.test.TestUtils;
import org.apache.knox.test.mock.MockServletInputStream;
import org.easymock.EasyMock;
import org.junit.Test;
import org.w3c.dom.Document;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import java.io.InputStream;
import java.io.Reader;
import java.nio.charset.StandardCharsets;
import static org.apache.knox.test.TestUtils.LOG_ENTER;
import static org.apache.knox.test.TestUtils.LOG_EXIT;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.xml.HasXPath.hasXPath;
public class OozieServiceDefinitionTest {
@Test( timeout = TestUtils.MEDIUM_TIMEOUT )
public void testOozieRewriteRulesForLiteralTemplateValuesBugKnox394() throws Exception {
LOG_ENTER();
// This is a unique part of this test.
String testResource = "oozie-request-with-var.xml";
// Mock out the service url registry which is required for several url rewrite functions to work.
ServiceRegistry registry = EasyMock.createNiceMock( ServiceRegistry.class );
EasyMock.expect( registry.lookupServiceURL( "test-cluster", "NAMENODE" ) ).andReturn( "test-scheme://test-host:42" ).anyTimes();
// Mock out the gateway services registry which is required for several url rewrite functions to work.
GatewayServices services = EasyMock.createNiceMock( GatewayServices.class );
EasyMock.expect( services.getService( ServiceType.SERVICE_REGISTRY_SERVICE ) ).andReturn( registry ).anyTimes();
UrlRewriteProcessor rewriteProcessor = new UrlRewriteProcessor();
ServletContext servletContext = EasyMock.createNiceMock( ServletContext.class );
EasyMock.expect( servletContext.getAttribute( UrlRewriteServletContextListener.PROCESSOR_ATTRIBUTE_NAME ) ).andReturn( rewriteProcessor ).anyTimes();
EasyMock.expect( servletContext.getAttribute( GatewayServices.GATEWAY_SERVICES_ATTRIBUTE ) ).andReturn( services ).anyTimes();
EasyMock.expect( servletContext.getAttribute( GatewayServices.GATEWAY_CLUSTER_ATTRIBUTE ) ).andReturn( "test-cluster" ).anyTimes();
HttpServletRequest servletRequest = EasyMock.createNiceMock( HttpServletRequest.class );
EasyMock.expect( servletRequest.getInputStream() ).andReturn( new MockServletInputStream( TestUtils.getResourceStream( OozieServiceDefinitionTest.class, testResource ) ) ).anyTimes();
EasyMock.expect( servletRequest.getContentType() ).andReturn( "text/xml" ).anyTimes();
FilterConfig filterConfig = EasyMock.createNiceMock( FilterConfig.class );
EasyMock.expect( filterConfig.getServletContext() ).andReturn( servletContext ).anyTimes();
EasyMock.expect( filterConfig.getInitParameter( UrlRewriteServletFilter.REQUEST_BODY_FILTER_PARAM ) ).andReturn( "OOZIE/oozie/configuration" ).anyTimes();
EasyMock.replay( registry, services, servletContext, servletRequest, filterConfig );
UrlRewriteEnvironment rewriteEnvironment = new UrlRewriteServletEnvironment( servletContext );
Reader rulesReader = TestUtils.getResourceReader( "services/oozie/4.0.0/rewrite.xml", StandardCharsets.UTF_8 );
UrlRewriteRulesDescriptor rewriteRules = UrlRewriteRulesDescriptorFactory
.load( "xml", rulesReader );
rulesReader.close();
rewriteProcessor.initialize( rewriteEnvironment, rewriteRules );
UrlRewriteRequest rewriteRequest = new UrlRewriteRequest( filterConfig, servletRequest );
InputStream stream = rewriteRequest.getInputStream();
Document document = XmlUtils.readXml( stream );
assertThat( document,
hasXPath( "/configuration/property[name='oozie.wf.application.path']/value",
equalTo( "${appPath}/workflow.xml" ) ) );
LOG_EXIT();
}
@Test( timeout = TestUtils.MEDIUM_TIMEOUT )
public void testOozieRewriteRulesForLiteralComplexTemplateValuesBugKnox394() throws Exception {
LOG_ENTER();
// This is a unique part of this test.
String testResource = "oozie-request-with-complex-var.xml";
// Mock out the service url registry which is required for several url rewrite functions to work.
ServiceRegistry registry = EasyMock.createNiceMock( ServiceRegistry.class );
EasyMock.expect( registry.lookupServiceURL( "test-cluster", "NAMENODE" ) ).andReturn( "test-scheme://test-host:42" ).anyTimes();
// Mock out the gateway services registry which is required for several url rewrite functions to work.
GatewayServices services = EasyMock.createNiceMock( GatewayServices.class );
EasyMock.expect( services.getService( ServiceType.SERVICE_REGISTRY_SERVICE ) ).andReturn( registry ).anyTimes();
UrlRewriteProcessor rewriteProcessor = new UrlRewriteProcessor();
ServletContext servletContext = EasyMock.createNiceMock( ServletContext.class );
EasyMock.expect( servletContext.getAttribute( UrlRewriteServletContextListener.PROCESSOR_ATTRIBUTE_NAME ) ).andReturn( rewriteProcessor ).anyTimes();
EasyMock.expect( servletContext.getAttribute( GatewayServices.GATEWAY_SERVICES_ATTRIBUTE ) ).andReturn( services ).anyTimes();
EasyMock.expect( servletContext.getAttribute( GatewayServices.GATEWAY_CLUSTER_ATTRIBUTE ) ).andReturn( "test-cluster" ).anyTimes();
HttpServletRequest servletRequest = EasyMock.createNiceMock( HttpServletRequest.class );
EasyMock.expect( servletRequest.getInputStream() ).andReturn( new MockServletInputStream( TestUtils.getResourceStream( OozieServiceDefinitionTest.class, testResource ) ) ).anyTimes();
EasyMock.expect( servletRequest.getContentType() ).andReturn( "text/xml" ).anyTimes();
FilterConfig filterConfig = EasyMock.createNiceMock( FilterConfig.class );
EasyMock.expect( filterConfig.getServletContext() ).andReturn( servletContext ).anyTimes();
EasyMock.expect( filterConfig.getInitParameter( UrlRewriteServletFilter.REQUEST_BODY_FILTER_PARAM ) ).andReturn( "OOZIE/oozie/configuration" ).anyTimes();
EasyMock.replay( registry, services, servletContext, servletRequest, filterConfig );
UrlRewriteEnvironment rewriteEnvironment = new UrlRewriteServletEnvironment( servletContext );
Reader rulesReader = TestUtils.getResourceReader( "services/oozie/4.0.0/rewrite.xml", StandardCharsets.UTF_8 );
UrlRewriteRulesDescriptor rewriteRules = UrlRewriteRulesDescriptorFactory.load( "xml", rulesReader );
rulesReader.close();
rewriteProcessor.initialize( rewriteEnvironment, rewriteRules );
UrlRewriteRequest rewriteRequest = new UrlRewriteRequest( filterConfig, servletRequest );
InputStream stream = rewriteRequest.getInputStream();
Document document = XmlUtils.readXml( stream );
assertThat( document,
hasXPath( "/configuration/property[name='oozie.wf.application.path']/value",
equalTo( "${nameNode}/user/${user.name}/${examplesRoot}/apps/hive" ) ) );
LOG_EXIT();
}
@Test( timeout = TestUtils.MEDIUM_TIMEOUT )
public void testOozieRewriteRulesForValuesRelativeToServiceRegistry() throws Exception {
LOG_ENTER();
// This is a unique part of this test.
String testResource = "oozie-request-relative.xml";
// Mock out the service url registry which is required for several url rewrite functions to work.
ServiceRegistry registry = EasyMock.createNiceMock( ServiceRegistry.class );
EasyMock.expect( registry.lookupServiceURL( "test-cluster", "NAMENODE" ) ).andReturn( "test-scheme://test-host:42" ).anyTimes();
// Mock out the gateway services registry which is required for several url rewrite functions to work.
GatewayServices services = EasyMock.createNiceMock( GatewayServices.class );
EasyMock.expect( services.getService( ServiceType.SERVICE_REGISTRY_SERVICE ) ).andReturn( registry ).anyTimes();
UrlRewriteProcessor rewriteProcessor = new UrlRewriteProcessor();
ServletContext servletContext = EasyMock.createNiceMock( ServletContext.class );
EasyMock.expect( servletContext.getAttribute( UrlRewriteServletContextListener.PROCESSOR_ATTRIBUTE_NAME ) ).andReturn( rewriteProcessor ).anyTimes();
EasyMock.expect( servletContext.getAttribute( GatewayServices.GATEWAY_SERVICES_ATTRIBUTE ) ).andReturn( services ).anyTimes();
EasyMock.expect( servletContext.getAttribute( GatewayServices.GATEWAY_CLUSTER_ATTRIBUTE ) ).andReturn( "test-cluster" ).anyTimes();
HttpServletRequest servletRequest = EasyMock.createNiceMock( HttpServletRequest.class );
EasyMock.expect( servletRequest.getInputStream() ).andReturn( new MockServletInputStream( TestUtils.getResourceStream( OozieServiceDefinitionTest.class, testResource ) ) ).anyTimes();
EasyMock.expect( servletRequest.getContentType() ).andReturn( "text/xml" ).anyTimes();
EasyMock.expect( servletRequest.getContentLength() ).andReturn( -1 ).anyTimes();
FilterConfig filterConfig = EasyMock.createNiceMock( FilterConfig.class );
EasyMock.expect( filterConfig.getServletContext() ).andReturn( servletContext ).anyTimes();
EasyMock.expect( filterConfig.getInitParameter( UrlRewriteServletFilter.REQUEST_BODY_FILTER_PARAM ) ).andReturn( "OOZIE/oozie/configuration" ).anyTimes();
EasyMock.replay( registry, services, servletContext, servletRequest, filterConfig );
UrlRewriteEnvironment rewriteEnvironment = new UrlRewriteServletEnvironment( servletContext );
Reader rulesReader = TestUtils.getResourceReader( "services/oozie/4.0.0/rewrite.xml", StandardCharsets.UTF_8 );
UrlRewriteRulesDescriptor rewriteRules = UrlRewriteRulesDescriptorFactory.load( "xml", rulesReader );
rulesReader.close();
rewriteProcessor.initialize( rewriteEnvironment, rewriteRules );
UrlRewriteRequest rewriteRequest = new UrlRewriteRequest( filterConfig, servletRequest );
InputStream stream = rewriteRequest.getInputStream();
Document document = XmlUtils.readXml( stream );
assertThat( document,
hasXPath( "/configuration/property[name='oozie.wf.application.path']/value",
equalTo( "test-scheme://test-host:42/workflow.xml" ) ) );
LOG_EXIT();
}
}