/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.plugin.docker.machine.ext.provider;
import org.eclipse.che.api.core.util.SystemInfo;
import org.eclipse.che.commons.annotation.Nullable;
import org.eclipse.che.commons.lang.IoUtil;
import org.eclipse.che.inject.CheBootstrap;
import org.eclipse.che.plugin.docker.machine.WindowsHostUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Strings;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
/**
* Provides path to the configuration folder on hosted machine for mounting it to docker machine.
*
* <p/> It provides different bindings value of Unix and Window OS. <br/>
* Also it can return null value if binding is useless.
*
* @author Sergii Leschenko
*/
@Singleton
public class DockerExtConfBindingProvider implements Provider<String> {
public static final String EXT_CHE_LOCAL_CONF_DIR = "/mnt/che/conf";
private static final String PLUGIN_CONF = "plugin-conf";
private static final String CONTAINER_TARGET = ":" + EXT_CHE_LOCAL_CONF_DIR;
private static final Logger LOG = LoggerFactory.getLogger(DockerExtConfBindingProvider.class);
@Inject
@Nullable @Named("che.docker.volumes_agent_options")
private String agentVolumeOptions;
@Override
public String get() {
String localConfDir = System.getenv(CheBootstrap.CHE_LOCAL_CONF_DIR);
if (localConfDir == null) {
return null;
}
File extConfDir = new File(localConfDir, PLUGIN_CONF);
if (!extConfDir.isDirectory()) {
if (extConfDir.exists()) {
LOG.warn("{} set to the {} but it must be directory not file",
CheBootstrap.CHE_LOCAL_CONF_DIR, extConfDir);
}
return null;
}
if (SystemInfo.isWindows()) {
try {
final Path cheHome = WindowsHostUtils.ensureCheHomeExist();
final Path plgConfDir = cheHome.resolve(PLUGIN_CONF);
IoUtil.copy(extConfDir, plgConfDir.toFile(), null, true);
return getTargetOptions(plgConfDir.toString());
} catch (IOException e) {
LOG.warn(e.getMessage());
throw new RuntimeException(e);
}
} else {
return getTargetOptions(extConfDir.getAbsolutePath());
}
}
private String getTargetOptions(final String path) {
if (!Strings.isNullOrEmpty(agentVolumeOptions)) {
return path + CONTAINER_TARGET + ":" + agentVolumeOptions;
} else {
return path + CONTAINER_TARGET;
}
}
}