func enable()

in vmextension/enabledisable.go [27:100]


func enable(ext *VMExtension) (string, error) {
	// If the sequence number has not changed and we require it to, then exit
	// remember the sequence number
	// execute the command
	enableCmd, exists := ext.exec.cmds["enable"]
	if !exists {
		msg := "extension does not have an enable command"
		ext.ExtensionLogger.Error(msg)
		reportErrorWithClarification(ext, enableCmd, ErrorNoSequenceNumber, msg)
		return msg, fmt.Errorf(msg)
	}
	requestedSequenceNumber, err := ext.GetRequestedSequenceNumber()
	if err != nil {
		msg := "could not determine requested sequence number"
		ext.ExtensionLogger.Error("%s: %v", msg, err)
		reportErrorWithClarification(ext, enableCmd, ErrorUnparseableSeqNo, err.Error()+msg)
		return msg, err
	}

	if ext.exec.requiresSeqNoChange && ext.CurrentSequenceNumber != nil && requestedSequenceNumber <= *ext.CurrentSequenceNumber {
		ext.ExtensionLogger.Info("sequence number has not increased. Exiting.")
		exithelper.Exiter.Exit(0)
	}

	ext.ExtensionLogger.Info("Running operation %v for seqNo %v", enableCmd.operation.ToString(), requestedSequenceNumber)
	reportStatus(ext, status.StatusTransitioning, enableCmd, "")

	err = ext.exec.manager.SetSequenceNumberInternal(ext.Name, ext.Version, requestedSequenceNumber)
	if err != nil {
		msg := "failed to write new sequence number"
		ext.ExtensionLogger.Warn("%s: %v", msg, err)
		// execution is not stopped by design
	}

	if ext.exec.supportsDisable && isDisabled(ext) {
		// The sequence number has changed and we're disabled, so re-enable the extension
		ext.ExtensionLogger.Info("re-enabling the extension")
		err := setDisabled(ext, false)
		if err != nil {
			// Note: we don't return here because the least we can do is let the extension do its stuff
			ext.ExtensionLogger.Error("Could not re-enable the extension: %v", err)
		}
	}

	// execute the command, save its error
	msg, runErr := ext.exec.enableCallback(ext)
	if runErr != nil {
		unifiedErr := runErr
		ewc, supportsEwc := runErr.(ErrorWithClarification)
		if supportsEwc {
			unifiedErr = ewc.Err
		}
		ext.ExtensionLogger.Error("Enable failed: %v", unifiedErr)
		var msgToReport string
		if msg == "" {
			msgToReport = unifiedErr.Error()
		} else {
			msgToReport = msg
		}

		if supportsEwc {
			// The extension supports error clarifications
			reportErrorWithClarification(ext, enableCmd, ewc.ErrorCode, msgToReport)
		} else {
			// The extension does not support error clarifications
			reportStatus(ext, status.StatusError, enableCmd, msgToReport)
		}
	} else {
		ext.ExtensionLogger.Info("Enable succeeded")
		reportStatus(ext, status.StatusSuccess, enableCmd, msg)
	}

	return msg, runErr
}