func()

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
}