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
}