/* * 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 * * 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.apache.ignite.internal.processors.igfs; import java.io.OutputStream; import java.util.Collection; import java.util.Map; import org.apache.ignite.Ignite; import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteFileSystem; import org.apache.ignite.IgniteLogger; import org.apache.ignite.cache.CacheWriteSynchronizationMode; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.FileSystemConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.igfs.IgfsBlockLocation; import org.apache.ignite.igfs.IgfsFile; import org.apache.ignite.igfs.IgfsMode; import org.apache.ignite.igfs.IgfsPath; import org.apache.ignite.igfs.secondary.IgfsSecondaryFileSystem; import org.apache.ignite.igfs.secondary.IgfsSecondaryFileSystemPositionedReadable; import org.apache.ignite.internal.util.typedef.G; import org.apache.ignite.resources.FileSystemResource; import org.apache.ignite.resources.IgniteInstanceResource; import org.apache.ignite.resources.LoggerResource; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.jetbrains.annotations.Nullable; import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL; import static org.apache.ignite.cache.CacheMode.PARTITIONED; import static org.apache.ignite.cache.CacheMode.REPLICATED; /** * Tests for resource injection to secondary file system. */ public class IgfsSecondaryFileSystemInjectionSelfTest extends GridCommonAbstractTest { /** IGFS name. */ protected static final String IGFS_NAME = "igfs-test"; /** Test implementation of secondary filesystem. */ private TestBaseSecondaryFsMock secondary; /** {@inheritDoc} */ @Override protected void afterTest() throws Exception { G.stopAll(true); } /** {@inheritDoc} */ @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception { IgniteConfiguration cfg = super.getConfiguration(gridName); FileSystemConfiguration igfsCfg = new FileSystemConfiguration(); igfsCfg.setName(IGFS_NAME); igfsCfg.setDefaultMode(IgfsMode.DUAL_SYNC); igfsCfg.setSecondaryFileSystem(secondary); CacheConfiguration dataCacheCfg = defaultCacheConfiguration(); dataCacheCfg.setCacheMode(PARTITIONED); dataCacheCfg.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC); dataCacheCfg.setAtomicityMode(TRANSACTIONAL); CacheConfiguration metaCacheCfg = defaultCacheConfiguration(); metaCacheCfg.setCacheMode(REPLICATED); metaCacheCfg.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC); metaCacheCfg.setAtomicityMode(TRANSACTIONAL); igfsCfg.setDataCacheConfiguration(dataCacheCfg); igfsCfg.setMetaCacheConfiguration(metaCacheCfg); cfg.setFileSystemConfiguration(igfsCfg); return cfg; } /** * @throws Exception If failed. */ @SuppressWarnings({"UnusedDeclaration"}) public void testInjectPrimaryByField() throws Exception { secondary = new TestBaseSecondaryFsMock() { @FileSystemResource private IgfsImpl igfs; @LoggerResource private IgniteLogger log; @IgniteInstanceResource private Ignite ig; @Override boolean checkInjection(Ignite ignite, IgniteFileSystem primary) { return igfs == primary && log instanceof IgniteLogger && ig == ignite; } }; Ignite ig = startGrid(0); IgniteFileSystem igfs = ig.fileSystem(IGFS_NAME); assert secondary.checkInjection(ig, igfs); } /** * @throws Exception If failed. */ @SuppressWarnings({"UnusedDeclaration"}) public void testInjectPrimaryByMethods() throws Exception { secondary = new TestBaseSecondaryFsMock() { /** Ignite instance. */ private Ignite ig; /** IGFS instance. */ private IgniteFileSystem igfs; /** Logger injected flag */ private boolean logSet; /** * @param igfs Primary IGFS. */ @FileSystemResource void setPrimaryIgfs(IgfsImpl igfs) { this.igfs = igfs; } /** * @param log Ignite logger. */ @LoggerResource void setIgLogger(IgniteLogger log) { logSet = log instanceof IgniteLogger; } /** * @param ig Ignite instance. */ @IgniteInstanceResource void setIgniteInst(Ignite ig) { this.ig = ig; } @Override boolean checkInjection(Ignite ignite, IgniteFileSystem primary) { return ignite == ig && primary == igfs && logSet; } }; Ignite ig = startGrid(0); IgniteFileSystem igfs = ig.fileSystem(IGFS_NAME); assert secondary.checkInjection(ig, igfs); } /** * */ private static abstract class TestBaseSecondaryFsMock implements IgfsSecondaryFileSystem { /** {@inheritDoc} */ @Override public boolean exists(IgfsPath path) { return false; } /** {@inheritDoc} */ @Override public IgfsFile update(IgfsPath path, Map<String, String> props) throws IgniteException { return null; } /** {@inheritDoc} */ @Override public void rename(IgfsPath src, IgfsPath dest) throws IgniteException { // No-op. } /** {@inheritDoc} */ @Override public boolean delete(IgfsPath path, boolean recursive) throws IgniteException { return false; } /** {@inheritDoc} */ @Override public void mkdirs(IgfsPath path) throws IgniteException { // No-op. } /** {@inheritDoc} */ @Override public void mkdirs(IgfsPath path, @Nullable Map<String, String> props) throws IgniteException { // No-op. } /** {@inheritDoc} */ @Override public Collection<IgfsPath> listPaths(IgfsPath path) throws IgniteException { return null; } /** {@inheritDoc} */ @Override public Collection<IgfsFile> listFiles(IgfsPath path) throws IgniteException { return null; } /** {@inheritDoc} */ @Override public IgfsSecondaryFileSystemPositionedReadable open(IgfsPath path, int bufSize) throws IgniteException { return null; } /** {@inheritDoc} */ @Override public OutputStream create(IgfsPath path, boolean overwrite) throws IgniteException { return null; } /** {@inheritDoc} */ @Override public OutputStream create(IgfsPath path, int bufSize, boolean overwrite, int replication, long blockSize, @Nullable Map<String, String> props) throws IgniteException { return null; } /** {@inheritDoc} */ @Override public OutputStream append(IgfsPath path, int bufSize, boolean create, @Nullable Map<String, String> props) throws IgniteException { return null; } /** {@inheritDoc} */ @Override public IgfsFile info(IgfsPath path) throws IgniteException { return null; } /** {@inheritDoc} */ @Override public long usedSpaceSize() throws IgniteException { return 0; } /** {@inheritDoc} */ @Override public void setTimes(IgfsPath path, long modificationTime, long accessTime) throws IgniteException { // No-op. } /** {@inheritDoc} */ @Override public Collection<IgfsBlockLocation> affinity(IgfsPath path, long start, long len, long maxLen) throws IgniteException { return null; } /** * @param ignite Ignite instance. * @param primary Primary IGFS. * @return {@code True} if injection is correct. */ abstract boolean checkInjection(Ignite ignite, IgniteFileSystem primary); } }