func getVMExtensionInternal()

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
}