func()

in oracle/pkg/database/dbdaemon/dbdaemon_server.go [1620:1703]


func (s *Server) createCDB(ctx context.Context, req *dbdpb.CreateCDBRequest) (*dbdpb.CreateCDBResponse, error) {
	klog.InfoS("CreateCDB request invoked", "req", req)

	password, err := security.RandOraclePassword()
	if err != nil {
		return nil, fmt.Errorf("error generating temporary password")
	}
	characterSet := req.GetCharacterSet()
	sid := req.GetDatabaseName()
	memoryPercent := req.GetMemoryPercent()
	var initParams string

	if sid == "" {
		return nil, fmt.Errorf("dbdaemon/CreateCDB: DBname is empty")
	}
	if characterSet == "" {
		characterSet = "AL32UTF8"
	}
	if memoryPercent == 0 {
		memoryPercent = 25
	}
	if req.GetAdditionalParams() == nil {
		initParams = strings.Join(provision.MapToSlice(provision.GetDefaultInitParams(req.DatabaseName)), ",")
		if req.GetDbDomain() != "" {
			initParams = fmt.Sprintf("%s,DB_DOMAIN=%s", initParams, req.GetDbDomain())
		}
	} else {

		foundDBDomain := false
		for _, param := range req.GetAdditionalParams() {
			if strings.Contains(strings.ToUpper(param), "DB_DOMAIN=") {
				foundDBDomain = true
				break
			}
		}
		initParamsArr := req.GetAdditionalParams()
		if !foundDBDomain && req.GetDbDomain() != "" {
			initParamsArr = append(initParamsArr, fmt.Sprintf("DB_DOMAIN=%s", req.GetDbDomain()))
		}

		initParamsMap, err := provision.MergeInitParams(provision.GetDefaultInitParams(req.DatabaseName), initParamsArr)
		if err != nil {
			return nil, fmt.Errorf("error while merging user defined init params with default values, %v", err)
		}
		initParamsArr = provision.MapToSlice(initParamsMap)
		initParams = strings.Join(initParamsArr, ",")
	}

	params := []string{
		"-silent",
		"-createDatabase",
		"-templateName", "General_Purpose.dbc",
		"-gdbName", sid,
		"-responseFile", "NO_VALUE",
		"-createAsContainerDatabase", strconv.FormatBool(true),
		"-sid", sid,
		"-characterSet", characterSet,
		fmt.Sprintf("-memoryPercentage"), strconv.FormatInt(int64(memoryPercent), 10),
		"-emConfiguration", "NONE",
		"-datafileDestination", oraDataDir,
		"-storageType", "FS",
		"-initParams", initParams,
		"-databaseType", "MULTIPURPOSE",
		"-recoveryAreaDestination", "/u03/app/oracle/fast_recovery_area",
		"-sysPassword", password,
		"-systemPassword", password,
	}

	_, err = s.dbdClient.ProxyRunDbca(ctx, &dbdpb.ProxyRunDbcaRequest{OracleHome: s.databaseHome, DatabaseName: req.DatabaseName, Params: params})
	if err != nil {
		return nil, fmt.Errorf("error while running dbca command: %v", err)
	}
	klog.InfoS("dbdaemon/CreateCDB: CDB created successfully")

	if _, err := s.BounceDatabase(ctx, &dbdpb.BounceDatabaseRequest{
		Operation:    dbdpb.BounceDatabaseRequest_SHUTDOWN,
		DatabaseName: req.GetDatabaseName(),
	}); err != nil {
		return nil, fmt.Errorf("dbdaemon/CreateCDB: shutdown failed: %v", err)
	}

	klog.InfoS("dbdaemon/CreateCDB successfully completed")
	return &dbdpb.CreateCDBResponse{}, nil
}