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
}