func NewUsers()

in oracle/controllers/databasecontroller/database_resources.go [127:203]


func NewUsers(ctx context.Context, r *DatabaseReconciler, db *v1alpha1.Database, dbDomain, cdbName string, log logr.Logger) error {
	log.Info("resources/NewUsers: new database users requested", "dbName", db.Spec.Name, "requestedUsers", db.Spec.Users)
	var usernames, usersCmds, grantsCmds []string
	var userSpecs []*controllers.User
	userVerMap := make(map[string]string)
	// Copy pdb admin user version into local map to sync later.
	if v, ok := db.Status.UserResourceVersions[pdbAdminUserName]; ok {
		userVerMap[pdbAdminUserName] = v
	}
	for k, u := range db.Spec.Users {
		log.Info("create user", "user#", k, "username", u.Name)
		if len(usernames) < 3 {
			usernames = append(usernames, u.Name)
		} else if len(usernames) == 3 {
			usernames = append(usernames, "...")
		}
		// database_controller.validateSpec has validated the spec earlier;
		// So no duplicated validation here.
		if u.Password != "" {
			usersCmds = append(usersCmds, sql.QueryCreateUser(u.Name, u.Password))
			userVerMap[u.Name] = u.Password
		}
		if u.GsmSecretRef != nil {
			userSpecs = append(userSpecs, &controllers.User{
				Name: u.Name,
				PasswordGsmSecretRef: &controllers.GsmSecretReference{
					ProjectId: u.GsmSecretRef.ProjectId,
					SecretId:  u.GsmSecretRef.SecretId,
					Version:   u.GsmSecretRef.Version,
				}})
			userVerMap[u.Name] = fmt.Sprintf(gsmResourceVersionString, u.GsmSecretRef.ProjectId, u.GsmSecretRef.SecretId, u.GsmSecretRef.Version)
		}

		for _, p := range u.Privileges {
			grantsCmds = append(grantsCmds, sql.QueryGrantPrivileges(string(p), u.Name))
		}
	}

	r.Recorder.Eventf(db, corev1.EventTypeNormal, k8s.CreatingUser, "Creating new users %v", usernames)

	ctx, cancel := context.WithTimeout(ctx, dialTimeout)
	defer cancel()

	req := &controllers.CreateUsersRequest{
		CdbName:       cdbName,
		PdbName:       db.Spec.Name,
		GrantPrivsCmd: grantsCmds,
		DbDomain:      dbDomain,
	}
	if usersCmds != nil {
		req.CreateUsersCmd = usersCmds
	}
	if userSpecs != nil {
		req.User = userSpecs
	}
	cdOut, err := controllers.CreateUsers(ctx, r, r.DatabaseClientFactory, db.Namespace, db.Spec.Instance, *req)
	if err != nil {
		log.Error(err, "resources/NewUsers: failed on CreateUsers gRPC call")
	}
	log.Info("resources/NewUsers: CreateUsers succeeded with this output", "output", cdOut)

	hostname, err := os.Hostname()
	if err != nil {
		log.Error(err, "resources/NewUsers: failed to get a hostname")
	}
	log.V(1).Info("resources/NewUsers: new database users requested: DONE", "hostname", hostname)
	r.Recorder.Eventf(db, corev1.EventTypeNormal, k8s.CreatedUser, "Created new users %v", usernames)

	db.Status.Conditions = k8s.Upsert(db.Status.Conditions, k8s.UserReady, v1.ConditionTrue, k8s.CreateComplete, "")
	db.Status.UserNames = usernames
	db.Status.UserResourceVersions = userVerMap
	r.updateIsChangeApplied(ctx, db)
	if err := r.Status().Update(ctx, db); err != nil {
		return err
	}
	return nil
}