in component/xload/xload.go [103:217]
func (xl *Xload) Configure(_ bool) error {
log.Trace("Xload::Configure : %s", xl.Name())
// xload component should be used only in readonly mode
var readonly bool
err := config.UnmarshalKey("read-only", &readonly)
if err != nil {
log.Err("Xload::Configure : config error [unable to obtain read-only]")
return fmt.Errorf("config error in %s [%s]", xl.Name(), err.Error())
}
if !readonly {
log.Err("Xload::Configure : Xload component should be used only in read-only mode")
return fmt.Errorf("Xload component should be used in only in read-only mode")
}
conf := XloadOptions{}
err = config.UnmarshalKey(xl.Name(), &conf)
if err != nil {
log.Err("Xload::Configure : config error [invalid config attributes]")
return fmt.Errorf("Xload: config error [invalid config attributes]")
}
blockSize := (float64)(defaultBlockSize) // 16 MB as default block size
if config.IsSet(compName + ".block-size-mb") {
blockSize = conf.BlockSize
} else if config.IsSet("stream.block-size-mb") {
err = config.UnmarshalKey("stream.block-size-mb", &blockSize)
if err != nil {
log.Err("Xload::Configure : Failed to unmarshal block-size-mb [%s]", err.Error())
}
}
xl.blockSize = uint64(blockSize * float64(MB))
localPath := strings.TrimSpace(conf.Path)
if localPath == "" {
if config.IsSet("file_cache.path") {
err = config.UnmarshalKey("file_cache.path", &localPath)
if err != nil {
log.Err("Xload::Configure : Failed to unmarshal tmp-path [%s]", err.Error())
}
}
}
xl.path = common.ExpandPath(localPath)
if xl.path == "" {
// TODO:: xload : should we use current working directory in this case
log.Err("Xload::Configure : config error [path not given in xload]")
return fmt.Errorf("config error in %s [path not given]", xl.Name())
} else {
//check mnt path is not same as xload path
mntPath := ""
err = config.UnmarshalKey("mount-path", &mntPath)
if err != nil {
log.Err("Xload::Configure : config error [unable to obtain Mount Path [%s]]", err.Error())
return fmt.Errorf("config error in %s [%s]", xl.Name(), err.Error())
}
if xl.path == mntPath {
log.Err("Xload::Configure : config error [xload path is same as mount path]")
return fmt.Errorf("config error in %s error [xload path is same as mount path]", xl.Name())
}
_, err = os.Stat(xl.path)
if os.IsNotExist(err) {
log.Info("Xload::Configure : config error [xload path does not exist, attempting to create path]")
err := os.Mkdir(xl.path, os.FileMode(0755))
if err != nil {
log.Err("Xload::Configure : config error creating directory of xload path [%s]", err.Error())
return fmt.Errorf("config error in %s [%s]", xl.Name(), err.Error())
}
}
if !common.IsDirectoryEmpty(xl.path) {
log.Err("Xload::Configure : config error %s directory is not empty", xl.path)
return fmt.Errorf("config error in %s [temp directory not empty]", xl.Name())
}
}
var mode Mode = EMode.PRELOAD() // using preload as the default mode
if len(conf.Mode) > 0 {
err = mode.Parse(conf.Mode)
if err != nil {
log.Err("Xload::Configure : Failed to parse mode %s [%s]", conf.Mode, err.Error())
return fmt.Errorf("invalid mode in xload : %s", conf.Mode)
}
if mode == EMode.INVALID_MODE() {
log.Err("Xload::Configure : Invalid mode : %s", conf.Mode)
return fmt.Errorf("invalid mode in xload : %s", conf.Mode)
}
}
xl.mode = mode
xl.exportProgress = conf.ExportProgress
xl.validateMD5 = conf.ValidateMD5
allowOther := false
err = config.UnmarshalKey("allow-other", &allowOther)
if err != nil {
log.Err("Xload::Configure : config error [unable to obtain allow-other]")
}
if allowOther {
xl.defaultPermission = common.DefaultAllowOtherPermissionBits
} else {
xl.defaultPermission = common.DefaultFilePermissionBits
}
log.Crit("Xload::Configure : block size %v, mode %v, path %v, default permission %v, export progress %v, validate md5 %v", xl.blockSize,
xl.mode.String(), xl.path, xl.defaultPermission, xl.exportProgress, xl.validateMD5)
return nil
}