in oracle/pkg/database/dbdaemon/dbdaemon_server.go [1787:1864]
func (s *Server) CreateListener(ctx context.Context, req *dbdpb.CreateListenerRequest) (*dbdpb.CreateListenerResponse, error) {
domain := req.GetDbDomain()
if req.GetDbDomain() != "" {
domain = fmt.Sprintf(".%s", req.GetDbDomain())
}
// default CDB service name is <CDB Name>.<domain>
cdbServiceName := req.GetDatabaseName() + domain
if req.GetCdbServiceName() != "" {
cdbServiceName = req.GetCdbServiceName()
}
uid, gid, err := oracleUserUIDGID(true)
if err != nil {
return nil, fmt.Errorf("initDBListeners: get uid gid failed: %v", err)
}
l := &provision.ListenerInput{
DatabaseName: req.DatabaseName,
DatabaseBase: consts.OracleBase,
DatabaseHome: s.databaseHome,
DatabaseHost: s.hostName,
DBDomain: domain,
CDBServiceName: cdbServiceName,
}
if !req.GetExcludePdb() {
pdbNames, err := s.fetchPDBNames(ctx)
if err != nil {
return nil, err
}
l.PluggableDatabaseNames = pdbNames
}
lType := consts.SECURE
lDir := filepath.Join(listenerDir, lType)
listenerFileContent, tnsFileContent, sqlNetContent, err := provision.LoadTemplateListener(l, lType, fmt.Sprint(req.Port), req.Protocol)
if err != nil {
return &dbdpb.CreateListenerResponse{}, fmt.Errorf("initDBListeners: loading template for listener %q failed: %v", req.DatabaseName, err)
}
if err != nil {
return nil, fmt.Errorf("initDBListeners: error while fetching uid gid: %v", err)
}
if err := provision.MakeDirs(ctx, []string{lDir}, uid, gid); err != nil {
return nil, fmt.Errorf("initDBListeners: making a listener directory %q failed: %v", lDir, err)
}
// Prepare listener.ora.
if err := ioutil.WriteFile(filepath.Join(lDir, "listener.ora"), []byte(listenerFileContent), 0600); err != nil {
return nil, fmt.Errorf("initDBListeners: creating a listener.ora file failed: %v", err)
}
// Prepare sqlnet.ora.
if err := ioutil.WriteFile(filepath.Join(lDir, "sqlnet.ora"), []byte(sqlNetContent), 0600); err != nil {
return nil, fmt.Errorf("initDBListeners: unable to write sqlnet: %v", err)
}
// Prepare tnsnames.ora.
if err := ioutil.WriteFile(filepath.Join(lDir, "tnsnames.ora"), []byte(tnsFileContent), 0600); err != nil {
return nil, fmt.Errorf("initDBListeners: creating a tnsnames.ora file failed: %v", err)
}
if _, err := s.BounceListener(ctx, &dbdpb.BounceListenerRequest{
Operation: dbdpb.BounceListenerRequest_STOP,
ListenerName: lType,
TnsAdmin: lDir,
}); err != nil {
klog.ErrorS(err, "Listener stop failed", "name", lType, "lDir", lDir)
}
if _, err := s.BounceListener(ctx, &dbdpb.BounceListenerRequest{
Operation: dbdpb.BounceListenerRequest_START,
ListenerName: lType,
TnsAdmin: lDir,
}); err != nil {
return nil, fmt.Errorf("listener %s startup failed: %s, %v", lType, lDir, err)
}
return &dbdpb.CreateListenerResponse{}, nil
}