func install()

in cmd/ops_agent_windows/install_windows.go [53:123]


func install() error {
	m, err := mgr.Connect()
	if err != nil {
		return err
	}
	defer m.Disconnect()

	diagnosticError := uninstallDiagnosticService(m)
	if diagnosticError != nil {
		return diagnosticError
	}

	handles := make([]*mgr.Service, len(services))
	for i, s := range services {
		// Registering with the event log is required to suppress the "The description for Event ID 1 from source Google Cloud Ops Agent cannot be found" message in the logs.
		if err := eventlog.InstallAsEventCreate(s.name, eventlog.Error|eventlog.Warning|eventlog.Info); err != nil {
			// Ignore error since it likely means the event log already exists.
		}
		deps := []string{"rpcss"}
		if i > 0 {
			// All services depend on the config generation service.
			deps = append(deps, services[0].name)
		}
		serviceHandle, err := m.OpenService(s.name)
		if err == nil {
			// Service already exists; just update its configuration.
			defer serviceHandle.Close()
			config, err := serviceHandle.Config()
			if err != nil {
				return err
			}
			config.DisplayName = s.displayName
			config.BinaryPathName = escapeExe(s.exepath, s.args)
			config.Dependencies = deps
			config.DelayedAutoStart = true
			if err := serviceHandle.UpdateConfig(config); err != nil {
				return err
			}
		} else {
			serviceHandle, err = m.CreateService(
				s.name,
				s.exepath,
				mgr.Config{
					DisplayName:      s.displayName,
					StartType:        mgr.StartAutomatic,
					Dependencies:     deps,
					DelayedAutoStart: true,
				},
				s.args...,
			)
			if err != nil {
				return err
			}
			defer serviceHandle.Close()
		}
		// restart after 1s then 2s, reset error counter after 60s
		serviceHandle.SetRecoveryActions([]mgr.RecoveryAction{
			{Type: mgr.ServiceRestart, Delay: time.Second},
			{Type: mgr.ServiceRestart, Delay: 2 * time.Second},
		}, 60)
		handles[i] = serviceHandle
	}

	// Automatically (re)start the Ops Agent service.
	for i := len(services) - 1; i >= 0; i-- {
		if err := stopService(handles[i], 30*time.Second); err != nil {
			return fmt.Errorf("failed to stop service: %v, error: %v", services[i].name, err)
		}
	}
	return handles[0].Start()
}