/*
* The Alluxio Open Foundation licenses this work under the Apache License, version 2.0
* (the "License"). You may not use this work except in compliance with the License, which is
* available at www.apache.org/licenses/LICENSE-2.0
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied, as more fully set forth in the License.
*
* See the NOTICE file distributed with this work for information regarding copyright ownership.
*/
package alluxio.underfs.swift;
import alluxio.AlluxioURI;
import alluxio.Configuration;
import alluxio.Constants;
import alluxio.PropertyKey;
import alluxio.underfs.UnderFileSystem;
import alluxio.underfs.UnderFileSystemConfiguration;
import alluxio.underfs.UnderFileSystemFactory;
import com.google.common.base.Preconditions;
import com.google.common.base.Throwables;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import javax.annotation.concurrent.ThreadSafe;
/**
* Factory for creating {@link SwiftUnderFileSystem}.
*/
@ThreadSafe
public class SwiftUnderFileSystemFactory implements UnderFileSystemFactory {
private static final Logger LOG = LoggerFactory.getLogger(SwiftUnderFileSystemFactory.class);
/**
* Constructs a new {@link SwiftUnderFileSystemFactory}.
*/
public SwiftUnderFileSystemFactory() {}
@Override
public UnderFileSystem create(String path, UnderFileSystemConfiguration conf) {
Preconditions.checkNotNull(path);
if (addAndCheckSwiftCredentials()) {
try {
return new SwiftUnderFileSystem(new AlluxioURI(path), conf);
} catch (Exception e) {
throw Throwables.propagate(e);
}
}
String err = "Swift Credentials not available, cannot create Swift Under File System.";
LOG.error(err);
throw Throwables.propagate(new IOException(err));
}
@Override
public boolean supportsPath(String path) {
return path != null && path.startsWith(Constants.HEADER_SWIFT);
}
/**
* Adds Swift credentials from system properties to the Alluxio configuration if they are not
* already present.
*
* @return true if simulation mode or if all required authentication credentials are present
*/
private boolean addAndCheckSwiftCredentials() {
PropertyKey[] propertiesToRead = {PropertyKey.SWIFT_API_KEY, PropertyKey.SWIFT_TENANT_KEY,
PropertyKey.SWIFT_USER_KEY, PropertyKey.SWIFT_AUTH_URL_KEY,
PropertyKey.SWIFT_AUTH_METHOD_KEY, PropertyKey.SWIFT_PASSWORD_KEY,
PropertyKey.SWIFT_SIMULATION, PropertyKey.SWIFT_REGION_KEY};
for (PropertyKey property : propertiesToRead) {
if (System.getProperty(property.toString()) != null
&& (!Configuration.containsKey(property) || Configuration.get(property) == null)) {
Configuration.set(property, System.getProperty(property.toString()));
}
}
// We do not need authentication credentials in simulation mode
if (Configuration.containsKey(PropertyKey.SWIFT_SIMULATION)
&& Configuration.getBoolean(PropertyKey.SWIFT_SIMULATION)) {
return true;
}
// API or Password Key is required
PropertyKey apiOrPasswordKey = Configuration.containsKey(PropertyKey.SWIFT_API_KEY)
? PropertyKey.SWIFT_API_KEY : PropertyKey.SWIFT_PASSWORD_KEY;
// Check if required credentials exist
PropertyKey[] requiredProperties = {apiOrPasswordKey, PropertyKey.SWIFT_TENANT_KEY,
PropertyKey.SWIFT_AUTH_URL_KEY, PropertyKey.SWIFT_USER_KEY};
for (PropertyKey propertyName : requiredProperties) {
if (Configuration.get(propertyName) == null) {
return false;
}
}
return true;
}
}