in vmextension/vmextension.go [142:253]
func getVMExtensionInternal(initInfo *InitializationInfo, manager environmentmanager.IGetVMExtensionEnvironmentManager) (ext *VMExtension, _ error) {
if initInfo == nil {
return nil, extensionerrors.ErrArgCannotBeNull
}
if len(initInfo.Name) < 1 || len(initInfo.Version) < 1 {
return nil, extensionerrors.ErrArgCannotBeNullOrEmpty
}
if initInfo.EnableCallback == nil {
return nil, extensionerrors.ErrArgCannotBeNull
}
handlerEnv, err := manager.GetHandlerEnvironment(initInfo.Name, initInfo.Version)
if err != nil {
return nil, err
}
extensionLogger := logging.NewWithName(handlerEnv, initInfo.LogFileNamePattern)
// Create our event manager. This will be disabled if no eventsFolder exists
extensionEvents := extensionevents.New(extensionLogger, handlerEnv)
// Determine the sequence number requested
newSeqNo := func() (uint, error) { return manager.FindSeqNum(extensionLogger, handlerEnv.ConfigFolder) }
// Determine the current sequence number
retriever := seqno.ProdSequenceNumberRetriever{}
var currentSeqNo = new(uint)
retrievedSequenceNumber, err := manager.GetCurrentSequenceNumber(extensionLogger, &retriever, initInfo.Name, initInfo.Version)
if err != nil {
if err == extensionerrors.ErrNoSettingsFiles || err == extensionerrors.ErrNoMrseqFile {
// current sequence number could not be found, this is a special error
currentSeqNo = nil
} else {
return nil, fmt.Errorf("failed to read the current sequence number due to '%v'", err)
}
} else {
*currentSeqNo = retrievedSequenceNumber
}
cmdInstall := cmd{install, InstallOperation, false, initInfo.InstallExitCode}
cmdEnable := cmd{enable, EnableOperation, true, initInfo.OtherExitCode}
cmdUninstall := cmd{uninstall, UninstallOperation, false, initInfo.OtherExitCode}
// Only support Update and Disable if we need to
var cmdDisable cmd
var cmdUpdate cmd
var cmdResetState cmd
if initInfo.UpdateCallback != nil {
cmdUpdate = cmd{update, UpdateOperation, false, 3}
} else {
cmdUpdate = cmd{noop, UpdateOperation, false, 3}
}
if initInfo.SupportsDisable || initInfo.DisableCallback != nil {
cmdDisable = cmd{disable, DisableOperation, true, 3}
} else {
cmdDisable = cmd{noop, DisableOperation, true, 3}
}
if initInfo.SupportsResetState || initInfo.ResetStateCallback != nil {
cmdResetState = cmd{resetState, ResetStateOperation, false, 3}
} else {
cmdResetState = cmd{noop, ResetStateOperation, false, 3}
}
settings := func() (*settings.HandlerSettings, error) {
return manager.GetHandlerSettings(extensionLogger, handlerEnv)
}
var statusFormatter status.StatusMessageFormatter
if initInfo.CustomStatusFormatter != nil {
statusFormatter = initInfo.CustomStatusFormatter
} else {
statusFormatter = status.StatusMsg
}
ext = &VMExtension{
Name: initInfo.Name,
Version: initInfo.Version,
GetRequestedSequenceNumber: newSeqNo,
CurrentSequenceNumber: currentSeqNo,
HandlerEnv: handlerEnv,
GetSettings: settings,
ExtensionEvents: extensionEvents,
ExtensionLogger: extensionLogger,
statusFormatter: statusFormatter,
exec: &executionInfo{
manager: manager,
requiresSeqNoChange: initInfo.RequiresSeqNoChange,
supportsDisable: initInfo.SupportsDisable,
supportsResetState: initInfo.SupportsResetState,
enableCallback: initInfo.EnableCallback,
disableCallback: initInfo.DisableCallback,
updateCallback: initInfo.UpdateCallback,
resetStateCallBack: initInfo.ResetStateCallback,
installCallback: initInfo.InstallCallback,
uninstallCallback: initInfo.UninstallCallback,
cmds: map[OperationName]cmd{
InstallOperation: cmdInstall,
UninstallOperation: cmdUninstall,
EnableOperation: cmdEnable,
UpdateOperation: cmdUpdate,
DisableOperation: cmdDisable,
ResetStateOperation: cmdResetState,
},
},
}
return ext, nil
}