code: func (m *Meta) RunOperation(b backend.Enhanced, opReq *backend.Operation) (*backend.RunningOperation, error) {
  	if opReq.ConfigDir != "" {
  		opReq.ConfigDir = m.normalizePath(opReq.ConfigDir)
  	}
  
  	op, err := b.Operation(context.Background(), opReq)
  	if err != nil {
  		return nil, fmt.Errorf("error starting operation: %s", err)
  	}
  
  	// Wait for the operation to complete or an interrupt to occur
  	select {
  	case <-m.ShutdownCh:
  		// gracefully stop the operation
  		op.Stop()
  
  		// Notify the user
  		m.Ui.Output(outputInterrupt)
  
  		// Still get the result, since there is still one
  		select {
  		case <-m.ShutdownCh:
  			m.Ui.Error(
  				"Two interrupts received. Exiting immediately. Note that data\n" +
  					"loss may have occurred.")
  
  			// cancel the operation completely
  			op.Cancel()
  
  			// the operation should return asap
  			// but timeout just in case
  			select {
  			case <-op.Done():
  			case <-time.After(5 * time.Second):
  			}
  
  			return nil, errors.New("operation canceled")
  
  		case <-op.Done():
  			// operation completed after Stop
  		}
  	case <-op.Done():
  		// operation completed normally
  	}
  
  	return op, nil
  }
docs: // RunOperation executes the given operation on the given backend, blocking
  // until that operation completes or is inteerrupted, and then returns
  // the RunningOperation object representing the completed or
  // aborted operation that is, despite the name, no longer running.
  //
  // An error is returned if the operation either fails to start or is cancelled.
  // If the operation runs to completion then no error is returned even if the
  // operation itself is unsuccessful. Use the "Result" field of the
  // returned operation object to recognize operation-level failure.