code: function getVcl(conf) {
    const config = _.extend({
      version: new Date().toISOString(),
      timeout: defaultTimeout,
      urlPassList: ['cache-control=no-cache'],
      hash: [
        'req.url',
        [
          'req.http.host',
          'server.ip',
        ],
      ],
      hisForPassTTL: 120,
    }, conf);
    /* istanbul ignore if */
    if (!config.directors || !config.name) {
      throw new Error('directors, name can not be null');
    }
    if (!config.directors.length) {
      throw new Error('directors can not be empty');
    }
    if (config.name === '$HOSTNAME') {
      config.name = os.hostname();
    } else if (config.name[0] === '$') {
      config.name = process.env[config.name.substring(1)];
    }
    _.forEach(config.directors, (item) => {
      if (!item.timeout) {
        /* eslint no-param-reassign:0 */
        item.timeout = config.timeout;
      }
      if (item.type === 'shard') {
        throw new Error('shard director is not support');
      }
    });
    const cloneConfig = _.extend({
      stale: 3,
      varnish: '5',
      hashConfig: getHash(config.hash),
      passRules: getPassRules(config.urlPassList),
    }, config);
    return getConfig(cloneConfig.directors).then((data) => {
      _.extend(cloneConfig, data);
      return readFilePromise(path.join(__dirname, 'template/varnish.tpl'));
    }).then(tpl => _.template(tpl)(cloneConfig));
  }
docs: [getVcl description]
  @param  {[type]} config [description]
  @return {[type]}        [description]