package at.ac.ait.archistar.engine.userinterface; import io.netty.channel.nio.NioEventLoopGroup; import java.io.File; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; import org.jboss.resteasy.plugins.server.netty.NettyJaxrsServer; import org.jboss.resteasy.spi.ResteasyDeployment; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import at.ac.ait.archistar.backendserver.storageinterface.FilesystemStorage; import at.ac.ait.archistar.backendserver.storageinterface.StorageServer; import at.ac.ait.archistar.engine.Engine; import at.ac.ait.archistar.engine.distributor.BFTDistributor; import at.ac.ait.archistar.engine.distributor.Distributor; import at.ac.ait.archistar.engine.distributor.TestServerConfiguration; import at.ac.ait.archistar.engine.metadata.MetadataService; import at.ac.ait.archistar.engine.metadata.SimpleMetadataService; import at.archistar.crypto.CryptoEngine; import at.archistar.crypto.RabinBenOrEngine; import at.archistar.crypto.secretsharing.WeakSecurityException; import at.archistar.crypto.random.FakeRandomSource; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.security.NoSuchAlgorithmException; /** * this bootstrap a local S3 archistar instance containing one archistar * director with an client-side S3/HTTP/Rest interface and four backend-storage * servers utilizing filesystem based storage. * * Note: maybe we should exchange the filesystem based storage with a pure * memory based storage as this would remove the need for writable filesystems * for the test case * * @author andy */ public class ArchistarS3 { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { NettyJaxrsServer netty; Logger logger = LoggerFactory.getLogger(ArchistarS3.class); logger.info("Starting archistar storage engine"); Engine engine = createEngine(); engine.connect(); /* setup buckets/services? */ ResteasyDeployment deployment = new ResteasyDeployment(); HashMap<String, FakeBucket> buckets = new HashMap<>(); buckets.put("fake_bucket", new FakeBucket(engine)); List<Object> resources = new LinkedList<>(); resources.add(new FakeRoot(buckets)); deployment.setResources(resources); List<Object> providers = new LinkedList<>(); providers.add(new RedirectorFilter()); deployment.setProviders(providers); netty = createServer(deployment); netty.start(); } @SuppressFBWarnings("DMI_HARDCODED_ABSOLUTE_FILENAME") private static final String BASE_PATH = "/var/spool/archistar/test-s3/"; private static void createDir(Set<StorageServer> servers, File baseDir, int subdir) { File dir1 = new File(baseDir, Integer.toString(subdir + 1)); if (!dir1.exists()) { assert(dir1.mkdir()); } servers.add(new FilesystemStorage(subdir, dir1)); } @SuppressFBWarnings("DMI_HARDCODED_ABSOLUTE_FILENAME") private static Set<StorageServer> createNewServers() { File baseDir = new File(BASE_PATH); if (!baseDir.exists()) { assert(baseDir.mkdirs()); } HashSet<StorageServer> servers = new HashSet<>(); for (int i=0; i < 4; i++) { createDir(servers, baseDir, i); } return servers; } private static Engine createEngine() { NioEventLoopGroup loopGroup = new NioEventLoopGroup(16); TestServerConfiguration serverConfig = new TestServerConfiguration(createNewServers(), loopGroup); serverConfig.setupTestServer(1); try { CryptoEngine crypto = new RabinBenOrEngine(4, 3, new FakeRandomSource()); Distributor distributor = new BFTDistributor(serverConfig, loopGroup); MetadataService metadata = new SimpleMetadataService(serverConfig, distributor, crypto); return new Engine(serverConfig, metadata, distributor, crypto); } catch (NoSuchAlgorithmException | WeakSecurityException ex) { assert(false); } return null; } private static NettyJaxrsServer createServer(ResteasyDeployment deployment) throws Exception { NettyJaxrsServer netty = new NettyJaxrsServer(); netty.setDeployment(deployment); netty.setPort(8080); netty.setRootResourcePath(""); netty.setSecurityDomain(null); return netty; } }