code: func (p *glusterBlockProvisioner) createVolume(volSizeInt int, blockVol string, config *provisionerConfig) (*glusterBlockVolume, error) {
  
  	blockRes := &glusterBlockVolume{}
  	sizeStr := strconv.Itoa(volSizeInt)
  	haCountStr := strconv.Itoa(config.haCount)
  
  	klog.V(2).Infof("create block volume of size %d  and configuration %+v", volSizeInt, config)
  
  	// Possible opModes are gluster-block and heketi:
  	switch config.opMode {
  
  	// An experimental/Test Mode:
  	case glusterBlockOpmode:
  
  		gBlockCreateErr := p.glusterBlockExecCreate(blockRes, config, sizeStr, haCountStr, blockVol)
  		if gBlockCreateErr != nil {
  			klog.Errorf("gluster block volume creation failed: %v", gBlockCreateErr)
  			return nil, fmt.Errorf("gluster block volume creation failed: %v", gBlockCreateErr)
  		}
  
  	case heketiOpmode:
  		hBlockCreateErr := p.heketiBlockVolCreate(blockRes, config, volSizeInt, haCountStr, blockVol)
  		if hBlockCreateErr != nil {
  			klog.Errorf("heketi block volume creation failed: %v", hBlockCreateErr)
  			return nil, fmt.Errorf("heketi block volume creation failed: %v", hBlockCreateErr)
  		}
  
  	default:
  		return nil, fmt.Errorf("error parsing value for 'opmode' for volume plugin %s", provisionerName)
  	}
  	return blockRes, nil
  }
docs: // createVolume creates a gluster block volume i.e. the storage asset.