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
}