func()

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
}