/* * 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.mesos.resource; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.ignite.mesos.ClusterProperties; import static org.apache.ignite.mesos.resource.ResourceHandler.CONFIG_PREFIX; import static org.apache.ignite.mesos.resource.ResourceHandler.DEFAULT_CONFIG; import static org.apache.ignite.mesos.resource.ResourceHandler.IGNITE_PREFIX; import static org.apache.ignite.mesos.resource.ResourceHandler.LIBS_PREFIX; /** * Provides path to user's libs and config file. */ public class ResourceProvider { /** */ private static final Logger log = Logger.getLogger(ResourceProvider.class.getSimpleName()); /** Ignite url. */ private String igniteUrl; /** Resources. */ private Collection<String> libsUris; /** Url config. */ private String cfgUrl; /** Config name. */ private String cfgName; /** * @param props Cluster properties. * @param provider Ignite provider. * @param baseUrl Base url. */ public void init(ClusterProperties props, IgniteProvider provider, String baseUrl) throws IOException { if (props.ignitePackageUrl() == null && props.ignitePackagePath() == null) { // Downloading ignite. try { igniteUrl = baseUrl + IGNITE_PREFIX + provider.getIgnite(props.igniteVer()); } catch (Exception e) { log.log(Level.SEVERE, "Failed to download Ignite [err={0}, ver={1}].\n" + "If application working behind NAT or Intranet and does not have access to external resources " + "then you can use IGNITE_PACKAGE_URL or IGNITE_PACKAGE_PATH property that allow to use local " + "resources.", new Object[]{e, props.igniteVer()}); } } if (props.ignitePackagePath() != null) { Path ignitePackPath = Paths.get(props.ignitePackagePath()); if (Files.exists(ignitePackPath) && !Files.isDirectory(ignitePackPath)) { try { String fileName = provider.copyToWorkDir(props.ignitePackagePath()); assert fileName != null; igniteUrl = baseUrl + IGNITE_PREFIX + fileName; } catch (Exception e) { log.log(Level.SEVERE, "Failed to copy Ignite to working directory [err={0}, path={1}].", new Object[] {e, props.ignitePackagePath()}); throw e; } } else throw new IllegalArgumentException("Failed to find a ignite archive by path: " + props.ignitePackagePath()); } // Find all jar files into user folder. if (props.userLibs() != null && !props.userLibs().isEmpty()) { File libsDir = new File(props.userLibs()); List<String> libs = new ArrayList<>(); if (libsDir.isDirectory()) { File[] files = libsDir.listFiles(); if (files != null) { for (File lib : files) { if (lib.isFile() && lib.canRead() && (lib.getName().endsWith(".jar") || lib.getName().endsWith(".JAR"))) libs.add(baseUrl + LIBS_PREFIX + lib.getName()); } } } libsUris = libs.isEmpty() ? null : libs; } // Set configuration url. if (props.igniteCfg() != null) { File cfg = new File(props.igniteCfg()); if (cfg.isFile() && cfg.canRead()) { cfgUrl = baseUrl + CONFIG_PREFIX + cfg.getName(); cfgName = cfg.getName(); } } else { cfgName = "ignite-default-config.xml"; cfgUrl = baseUrl + DEFAULT_CONFIG + cfgName; } } /** * @return Config name. */ public String configName() { return cfgName; } /** * @return Ignite url. */ public String igniteUrl() { return igniteUrl; } /** * @return Urls to user's libs. */ public Collection<String> resourceUrl() { return libsUris; } /** * @return Url to config file. */ public String igniteConfigUrl() { return cfgUrl; } }