in oracle/controllers/databasecontroller/database_resources.go [50:124]
func NewDatabase(ctx context.Context, r *DatabaseReconciler, db *v1alpha1.Database, dbDomain, cdbName string, log logr.Logger) (bool, error) {
r.Recorder.Eventf(db, corev1.EventTypeNormal, k8s.CreatingDatabase, fmt.Sprintf("Creating new database %q", db.Spec.Name))
ctx, cancel := context.WithTimeout(ctx, dialTimeout)
defer cancel()
req := &controllers.CreateDatabaseRequest{
Name: db.Spec.Name,
CdbName: cdbName,
DbDomain: dbDomain,
}
userVerStr := ""
// database_controller.validateSpec has validated the spec earlier;
// So no duplicated validation here.
if db.Spec.AdminPassword != "" {
userVerStr = db.Spec.AdminPassword
req.Password = db.Spec.AdminPassword
if lastPwd, ok := db.Status.UserResourceVersions[pdbAdminUserName]; ok {
req.LastPassword = lastPwd
}
}
if db.Spec.AdminPasswordGsmSecretRef != nil {
userVerStr = fmt.Sprintf(gsmResourceVersionString, db.Spec.AdminPasswordGsmSecretRef.ProjectId, db.Spec.AdminPasswordGsmSecretRef.SecretId, db.Spec.AdminPasswordGsmSecretRef.Version)
ref := &controllers.GsmSecretReference{
ProjectId: db.Spec.AdminPasswordGsmSecretRef.ProjectId,
SecretId: db.Spec.AdminPasswordGsmSecretRef.SecretId,
Version: db.Spec.AdminPasswordGsmSecretRef.Version,
}
if lastVer, ok := db.Status.UserResourceVersions[pdbAdminUserName]; ok {
ref.LastVersion = lastVer
}
req.AdminPasswordGsmSecretRef = ref
}
cdOut, err := controllers.CreateDatabase(ctx, r, r.DatabaseClientFactory, db.Namespace, db.Spec.Instance, *req)
if err != nil {
return false, fmt.Errorf("resource/NewDatabase: failed on CreateDatabase gRPC call: %v", err)
}
log.Info("resource/NewDatabase: CreateDatabase DONE with this output", "out", cdOut)
// "AdminUserSyncCompleted" status indicates PDB existed
// and admin user sync completed.
if cdOut == "AdminUserSyncCompleted" {
r.Recorder.Eventf(db, corev1.EventTypeWarning, k8s.DatabaseAlreadyExists, fmt.Sprintf("Database %q already exists, sync admin user performed", db.Spec.Name))
// Update user version status map after newly synced database admin user.
// The caller will update the status by r.Status().Update.
if db.Status.UserResourceVersions == nil {
db.Status.UserResourceVersions = make(map[string]string)
}
db.Status.UserResourceVersions[pdbAdminUserName] = userVerStr
// Return true indicating PDB already existed and return
// PDB admin userVerMap which need to by synced by caller.
// The caller will trigger syncUser instead of createUser later.
return true, nil
}
// Indicated underlying database exists and admin user is in sync with the config.
if cdOut == "AlreadyExists" {
r.Recorder.Eventf(db, corev1.EventTypeWarning, k8s.DatabaseAlreadyExists, fmt.Sprintf("Database %q already exists", db.Spec.Name))
return true, nil
}
hostname, err := os.Hostname()
if err != nil {
log.Error(err, "resources/NewDatabase: failed to get a hostname")
}
log.V(1).Info("resources/NewDatabase: new database requested: DONE", "hostname", hostname)
// Update user version status map after newly created database.
// The caller will update the status by r.Status().Update.
if db.Status.UserResourceVersions == nil {
db.Status.UserResourceVersions = make(map[string]string)
}
db.Status.UserResourceVersions[pdbAdminUserName] = userVerStr
return false, nil
}