| // Licensed to the Apache Software Foundation (ASF) under one | |
| // or more contributor license agreements. See the NOTICE file | |
| // distributed with this work for additional information | |
| // regarding copyright ownership. The ASF licenses this file | |
| // to you under the Apache License, Version 2.0 (the | |
| // "License"); you may not use this file except in compliance | |
| // with the License. You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, | |
| // software distributed under the License is distributed on an | |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| // KIND, either express or implied. See the License for the | |
| // specific language governing permissions and limitations | |
| // under the License. | |
| package resource | |
| import ( | |
| "bytes" | |
| "errors" | |
| "os" | |
| dorisv1 "github.com/apache/doris-operator/api/doris/v1" | |
| "github.com/spf13/viper" | |
| corev1 "k8s.io/api/core/v1" | |
| "k8s.io/klog/v2" | |
| ) | |
| // the fe ports key | |
| const ( | |
| HTTP_PORT = "http_port" | |
| RPC_PORT = "rpc_port" | |
| QUERY_PORT = "query_port" | |
| EDIT_LOG_PORT = "edit_log_port" | |
| ) | |
| // the cn or be ports key | |
| const ( | |
| THRIFT_PORT = "thrift_port" | |
| BE_PORT = "be_port" | |
| WEBSERVER_PORT = "webserver_port" | |
| HEARTBEAT_SERVICE_PORT = "heartbeat_service_port" | |
| BRPC_PORT = "brpc_port" | |
| ) | |
| // the default ResolveKey | |
| const ( | |
| FE_RESOLVEKEY = "fe.conf" | |
| BE_RESOLVEKEY = "be.conf" | |
| CN_RESOLVEKEY = "be.conf" | |
| BROKER_RESOLVEKEY = "apache_hdfs_broker.conf" | |
| MS_RESOLVEKEY = "doris_cloud.conf" | |
| DefaultMsToken = "greedisgood9999" | |
| DefaultMsTokenKey = "http_token" | |
| ENABLE_TLS_KEY = "enable_tls" | |
| TLS_CERTIFICATE_PATH_KEY = "tls_certificate_path" | |
| TLS_PRIVATE_KEY_PATH_KEY = "tls_private_key_path" | |
| TLS_CA_CERTIFICATE_PATH_KEY = "tls_ca_certificate_path" | |
| ) | |
| const ARROW_FLIGHT_SQL_PORT = "arrow_flight_sql_port" | |
| const BRPC_LISTEN_PORT = "brpc_listen_port" | |
| const BROKER_IPC_PORT = "broker_ipc_port" | |
| const GRACE_SHUTDOWN_WAIT_SECONDS = "grace_shutdown_wait_seconds" | |
| const ENABLE_FQDN = "enable_fqdn_mode" | |
| const START_MODEL_FQDN = "FQDN" | |
| const START_MODEL_IP = "IP" | |
| // defMap the default port about abilities. | |
| var defMap = map[string]int32{ | |
| HTTP_PORT: 8030, | |
| RPC_PORT: 9020, | |
| QUERY_PORT: 9030, | |
| EDIT_LOG_PORT: 9010, | |
| THRIFT_PORT: 9060, | |
| BE_PORT: 9060, | |
| WEBSERVER_PORT: 8040, | |
| HEARTBEAT_SERVICE_PORT: 9050, | |
| BRPC_PORT: 8060, | |
| BROKER_IPC_PORT: 8000, | |
| BRPC_LISTEN_PORT: 5000, | |
| ARROW_FLIGHT_SQL_PORT: -1, | |
| } | |
| // GetStartMode return fe host type, fqdn(host) or ip, from 'fe.conf' enable_fqdn_mode | |
| func GetStartMode(config map[string]interface{}) string { | |
| // not use configmap | |
| if len(config) == 0 { | |
| return START_MODEL_FQDN | |
| } | |
| // use configmap | |
| v, ok := config[ENABLE_FQDN] | |
| if ok && v.(string) == "true" { | |
| return START_MODEL_FQDN | |
| } else { | |
| return START_MODEL_IP | |
| } | |
| } | |
| func GetDefaultPort(key string) int32 { | |
| return defMap[key] | |
| } | |
| func getDefaultResolveKey(componentType dorisv1.ComponentType) string { | |
| switch componentType { | |
| case dorisv1.Component_FE: | |
| return FE_RESOLVEKEY | |
| case dorisv1.Component_BE: | |
| return BE_RESOLVEKEY | |
| case dorisv1.Component_CN: | |
| return CN_RESOLVEKEY | |
| case dorisv1.Component_Broker: | |
| return BROKER_RESOLVEKEY | |
| default: | |
| klog.Infof("the componentType: %s have not default ResolveKey", componentType) | |
| } | |
| return "" | |
| } | |
| func ResolveConfigMaps(configMaps []*corev1.ConfigMap, componentType dorisv1.ComponentType) (map[string]interface{}, error) { | |
| key := getDefaultResolveKey(componentType) | |
| for _, configMap := range configMaps { | |
| if configMap == nil { | |
| continue | |
| } | |
| if value, ok := configMap.Data[key]; ok { | |
| os.Setenv("DORIS_HOME", getDefaultDorisHome(componentType)) | |
| viper.SetConfigType("properties") | |
| viper.AutomaticEnv() | |
| viper.ReadConfig(bytes.NewBuffer([]byte(value))) | |
| return viper.AllSettings(), nil | |
| } | |
| } | |
| err := errors.New("not fund configmap ResolveKey: " + key) | |
| return nil, err | |
| } | |
| func GetMountConfigMapInfo(c dorisv1.ConfigMapInfo) (finalConfigMaps []dorisv1.MountConfigMapInfo) { | |
| if c.ConfigMapName != "" { | |
| finalConfigMaps = append( | |
| finalConfigMaps, | |
| dorisv1.MountConfigMapInfo{ | |
| ConfigMapName: c.ConfigMapName, | |
| MountPath: "", | |
| }, | |
| ) | |
| } | |
| finalConfigMaps = append(finalConfigMaps, c.ConfigMaps...) | |
| return finalConfigMaps | |
| } | |
| // getDorisCoreConfigMapName return a configmap`s name include doris configurations such as fe.conf/be.conf | |
| func getDorisCoreConfigMapName(dcr *dorisv1.DorisCluster, componentType dorisv1.ComponentType) string { | |
| var cmInfo dorisv1.ConfigMapInfo | |
| switch componentType { | |
| case dorisv1.Component_FE: | |
| cmInfo = dcr.Spec.FeSpec.ConfigMapInfo | |
| case dorisv1.Component_BE: | |
| cmInfo = dcr.Spec.BeSpec.ConfigMapInfo | |
| case dorisv1.Component_CN: | |
| cmInfo = dcr.Spec.CnSpec.ConfigMapInfo | |
| case dorisv1.Component_Broker: | |
| cmInfo = dcr.Spec.BrokerSpec.ConfigMapInfo | |
| default: | |
| klog.Infof("getCoreCmName: the componentType: %s have not default ResolveKey", componentType) | |
| } | |
| maps := GetMountConfigMapInfo(cmInfo) | |
| for i := range maps { | |
| if maps[i].MountPath == "" || maps[i].MountPath == ConfigEnvPath { | |
| return maps[i].ConfigMapName | |
| } | |
| } | |
| return "" | |
| } | |
| func GetDorisCoreConfigMapNames(dcr *dorisv1.DorisCluster) map[dorisv1.ComponentType]string { | |
| dorisCoreConfigMaps := map[dorisv1.ComponentType]string{} | |
| if dcr.Spec.FeSpec != nil { | |
| if cm := getDorisCoreConfigMapName(dcr, dorisv1.Component_FE); cm != "" { | |
| dorisCoreConfigMaps[dorisv1.Component_FE] = cm | |
| } | |
| } | |
| if dcr.Spec.BeSpec != nil { | |
| if cm := getDorisCoreConfigMapName(dcr, dorisv1.Component_BE); cm != "" { | |
| dorisCoreConfigMaps[dorisv1.Component_BE] = cm | |
| } | |
| } | |
| if dcr.Spec.CnSpec != nil { | |
| if cm := getDorisCoreConfigMapName(dcr, dorisv1.Component_CN); cm != "" { | |
| dorisCoreConfigMaps[dorisv1.Component_CN] = cm | |
| } | |
| } | |
| if dcr.Spec.BrokerSpec != nil { | |
| if cm := getDorisCoreConfigMapName(dcr, dorisv1.Component_Broker); cm != "" { | |
| dorisCoreConfigMaps[dorisv1.Component_Broker] = cm | |
| } | |
| } | |
| return dorisCoreConfigMaps | |
| } |