func NewDatabase()

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
}