func()

in oracle/pkg/agents/standby/verify_standby_settings_task.go [127:183]


func (task *verifyStandbySettingsTask) verifyPrimaryDBParams(ctx context.Context) error {
	//check DB version
	version, err := fetchAndParseSingleColumnMultiRowQueries(ctx, task.primary, task.dbdClient, checkDBVersionSQL)
	if err != nil {
		//ORA-12170: TNS:Connect timeout occurred (this happens if the host doesn't exist or is not reachable)
		if strings.Contains(err.Error(), "ORA-12170:") {
			addResultAsErr(task, standbyhelpers.StandbySettingErr_CONNECTION_FAILURE,
				fmt.Sprintf(failedToConnectMsg, task.primary.Host, task.primary.Port, task.primary.Service, tnsConnectTimeoutMsg))
			return err
		}
		if strings.Contains(err.Error(), "ORA-12541:") {
			addResultAsErr(task, standbyhelpers.StandbySettingErr_CONNECTION_FAILURE,
				fmt.Sprintf(failedToConnectMsg, task.primary.Host, task.primary.Port, task.primary.Service, tnsNoListenerMsg))
			return err
		}
		// ORA-01017: invalid username/password; logon denied (this happens if the sys password is wrong or remote password file mode is NONE)
		if strings.Contains(err.Error(), "ORA-01017:") {
			addResultAsErr(task, standbyhelpers.StandbySettingErr_CONNECTION_FAILURE,
				fmt.Sprintf(failedToConnectMsg, task.primary.Host, task.primary.Port, task.primary.Service, invalidLogonMsg))
			return err
		}

		internalErr := fmt.Errorf("failed to query version: %v", err)
		addResultAsErr(task, standbyhelpers.StandbySettingErr_INTERNAL_ERROR, internalErr.Error())
		return internalErr
	}

	if len(version) != 1 {
		internalErr := fmt.Errorf("got unexpected response for DB version query: %v", version)
		addResultAsErr(task, standbyhelpers.StandbySettingErr_INTERNAL_ERROR, internalErr.Error())
		return internalErr
	}
	if k, ok := supportedDBVersionToKeyWord[task.standby.Version]; !ok || !strings.Contains(strings.ToUpper(version[0]), strings.ToUpper(k)) {
		addResultAsErr(task, standbyhelpers.StandbySettingErr_INCOMPATIBLE_DATABASE_VERSION, fmt.Sprintf(incompatibleVersionMsg, version[0], task.standby.Version))
	}

	//Check primary data guard broker and password file mode.
	dbParams, err := fetchAndParseSingleColumnMultiRowQueries(ctx, task.primary, task.dbdClient, checkDBParamsSQL)
	if err != nil {
		internalErr := fmt.Errorf("failed to query DB params: %v", err)
		addResultAsErr(task, standbyhelpers.StandbySettingErr_INTERNAL_ERROR, internalErr.Error())
		return internalErr
	}
	if len(dbParams) != 2 {
		internalErr := fmt.Errorf("got unexpected response for DB params query: %v", dbParams)
		addResultAsErr(task, standbyhelpers.StandbySettingErr_INTERNAL_ERROR, internalErr.Error())
		return internalErr
	}
	if strings.ToUpper(dbParams[0]) != "TRUE" {
		addResultAsErr(task, standbyhelpers.StandbySettingErr_INVALID_DB_PARAM, fmt.Sprintf(invalidDataGuardBrokerMsg))
	}
	if strings.ToUpper(dbParams[1]) != "SHARED" && strings.ToUpper(dbParams[1]) != "EXCLUSIVE" {
		addResultAsErr(task, standbyhelpers.StandbySettingErr_INVALID_DB_PARAM, fmt.Sprintf(unsupportedDBPwdFileModeMsg, dbParams[1]))
	}

	return nil
}