/******************************************************************************* * * Pentaho Big Data * * Copyright (C) 2002-2017 by Pentaho : http://www.pentaho.com * ******************************************************************************* * * 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. * ******************************************************************************/ package org.pentaho.hadoop.shim.common; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.lang.reflect.Method; import org.apache.commons.vfs2.FileObject; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.ContentSummary; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.permission.FsPermission; import org.pentaho.di.core.vfs.KettleVFS; public class DistributedCacheTestUtil { static FileObject createTestFolderWithContent() throws Exception { return createTestFolderWithContent( "sample-folder" ); } static FileObject createTestFolderWithContent( String rootFolderName ) throws Exception { String rootName = "bin/test/" + rootFolderName; FileObject root = KettleVFS.getFileObject( rootName ); root.resolveFile( "jar1.jar" ).createFile(); root.resolveFile( "jar2.jar" ).createFile(); root.resolveFile( "folder" ).resolveFile( "file.txt" ).createFile(); root.resolveFile( "pentaho-mapreduce-libraries.zip" ).createFile(); createTestHadoopConfiguration( rootName ); return root; } static FileObject createTestHadoopConfiguration( String rootFolderName ) throws Exception { FileObject location = KettleVFS.getFileObject( rootFolderName + "/hadoop-configurations/test-config" ); FileObject lib = location.resolveFile( "lib" ); FileObject libPmr = lib.resolveFile( "pmr" ); FileObject pmrLibJar = libPmr.resolveFile( "configuration-specific.jar" ); lib.createFolder(); lib.resolveFile( "required.jar" ).createFile(); libPmr.createFolder(); pmrLibJar.createFile(); return location; } static FileSystem getLocalFileSystem( Configuration conf ) throws IOException { FileSystem fs = org.apache.hadoop.fs.FileSystem.getLocal( conf ); try { Method setWriteChecksum = fs.getClass().getMethod( "setWriteChecksum", boolean.class ); setWriteChecksum.invoke( fs, false ); } catch ( Exception ex ) { // ignore, this Hadoop implementation doesn't support checksum verification } return fs; } /** * Utility to attempt to stage a file to HDFS for use with Distributed Cache. * * @param ch Distributed Cache Helper * @param source File or directory to stage * @param fs FileSystem to stage to * @param root Root directory to clean up when this test is complete * @param dest Destination path to stage to * @param expectedFileCount Expected number of files to exist in the destination once staged * @param expectedDirCount Expected number of directories to exist in the destiation once staged * @throws Exception */ static void stageForCacheTester( DistributedCacheUtilImpl ch, FileObject source, FileSystem fs, Path root, Path dest, int expectedFileCount, int expectedDirCount ) throws Exception { try { ch.stageForCache( source, fs, dest, true ); assertTrue( fs.exists( dest ) ); ContentSummary cs = fs.getContentSummary( dest ); assertEquals( expectedFileCount, cs.getFileCount() ); assertEquals( expectedDirCount, cs.getDirectoryCount() ); assertEquals( FsPermission.createImmutable( (short) 0755 ), fs.getFileStatus( dest ).getPermission() ); } finally { // Clean up after ourself if ( !fs.delete( root, true ) ) { System.err.println( "error deleting FileSystem temp dir " + root ); } } } }