Files
oceanbase/tools/ob-configserver/model/obproxy_config.go
2022-05-30 16:44:36 +08:00

138 lines
4.6 KiB
Go

/**
* Copyright (c) 2021 OceanBase
* OceanBase CE is licensed under Mulan PubL v2.
* You can use this software according to the terms and conditions of the Mulan PubL v2.
* You may obtain a copy of Mulan PubL v2 at:
* http://license.coscl.org.cn/MulanPubL-2.0
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PubL v2 for more details.
*/
package model
import (
"crypto/md5"
"encoding/hex"
"encoding/json"
"fmt"
"github.com/pkg/errors"
)
const (
OBPROXY_BIN_URL_FORMAT = "%s/client?Action=GetObProxy"
CONFIG_URL_FORMAT_TEMPLATE_V1 = "%s/services?Action=ObRootServiceInfo&ObRegion=${ObRegion}"
CONFIG_URL_FORMAT_TEMPLATE_V2 = "%s/services?Action=ObRootServiceInfo&version=2&ObCluster=${ObCluster}&ObClusterId=${OBClusterId}"
)
type ObProxyConfig struct {
ObProxyBinUrl string `json:"ObProxyBinUrl"`
MetaDatabase *MetaDatabaseInfo `json:"ObProxyDatabaseInfo"`
ConfigUrlList []*RootServiceInfoUrl `json:"ObRootServiceInfoUrlList"`
Version string `json:"Version"`
}
type ObProxyConfigWithTemplate struct {
ObProxyBinUrl string `json:"ObProxyBinUrl"`
MetaDatabase *MetaDatabaseInfo `json:"ObProxyDatabaseInfo"`
Version string `json:"Version"`
ObClusters []string `json:"ObClusterList"`
TemplateV1 string `json:"ObRootServiceInfoUrlTemplate"`
TemplateV2 string `json:"ObRootServiceInfoUrlTemplateV2"`
}
type ObProxyConfigVersionOnly struct {
Version string `json:"Version"`
}
type MetaDatabaseInfo struct {
Database string `json:"DataBase"`
ConfigUrl string `json:"MetaDataBase"`
Password string `json:"Password"`
User string `json:"User"`
}
type RootServiceInfoUrl struct {
ObCluster string `json:"ObRegion"`
Url string `json:"ObRootServiceInfoUrl"`
}
func NewDefaultMetaDatabaseInfo(serviceAddress string) *MetaDatabaseInfo {
return &MetaDatabaseInfo{
Database: "***",
User: "***",
Password: "***",
ConfigUrl: fmt.Sprintf("%s/services?Action=ObRootServiceInfo&User_ID=alibaba&UID=admin&ObRegion=obdv1", serviceAddress),
}
}
func NewObProxyConfigVersionOnly(version string) *ObProxyConfigVersionOnly {
return &ObProxyConfigVersionOnly{
Version: version,
}
}
func NewObProxyConfig(serviceAddress string, configUrlList []*RootServiceInfoUrl) (*ObProxyConfig, error) {
obProxyBinUrl := fmt.Sprintf(OBPROXY_BIN_URL_FORMAT, serviceAddress)
metaDatabaseInfo := NewDefaultMetaDatabaseInfo(serviceAddress)
metaJson, err := json.Marshal(metaDatabaseInfo)
if err != nil {
return nil, errors.Wrap(err, "encode obproxy metadb")
}
configUrlJson, err := json.Marshal(configUrlList)
if err != nil {
return nil, errors.Wrap(err, "encode config urls")
}
strForMd5 := string(configUrlJson) + string(metaJson) + obProxyBinUrl
h := md5.New()
h.Write([]byte(strForMd5))
version := hex.EncodeToString(h.Sum(nil))
return &ObProxyConfig{
ObProxyBinUrl: obProxyBinUrl,
MetaDatabase: NewDefaultMetaDatabaseInfo(serviceAddress),
ConfigUrlList: configUrlList,
Version: version,
}, nil
}
func NewObProxyConfigWithTemplate(serviceAddress string, clusterNames []string) (*ObProxyConfigWithTemplate, error) {
obProxyBinUrl := fmt.Sprintf(OBPROXY_BIN_URL_FORMAT, serviceAddress)
metaDatabaseInfo := NewDefaultMetaDatabaseInfo(serviceAddress)
metaJson, err := json.Marshal(metaDatabaseInfo)
if err != nil {
return nil, errors.Wrap(err, "encode obproxy metadb")
}
clusterNamesJson, err := json.Marshal(clusterNames)
if err != nil {
return nil, errors.Wrap(err, "encode cluster names")
}
templateStrV1 := fmt.Sprintf(CONFIG_URL_FORMAT_TEMPLATE_V1, serviceAddress)
templateV1Json, err := json.Marshal(templateStrV1)
if err != nil {
return nil, errors.Wrap(err, "encode config url template v1")
}
templateStrV2 := fmt.Sprintf(CONFIG_URL_FORMAT_TEMPLATE_V2, serviceAddress)
templateV2Json, err := json.Marshal(templateStrV2)
if err != nil {
return nil, errors.Wrap(err, "encode config url template v2")
}
strForMd5 := string(clusterNamesJson) + string(templateV1Json) + string(templateV2Json) + string(metaJson) + obProxyBinUrl
h := md5.New()
h.Write([]byte(strForMd5))
version := hex.EncodeToString(h.Sum(nil))
return &ObProxyConfigWithTemplate{
ObProxyBinUrl: obProxyBinUrl,
MetaDatabase: NewDefaultMetaDatabaseInfo(serviceAddress),
ObClusters: clusterNames,
TemplateV1: templateStrV1,
TemplateV2: templateStrV2,
Version: version,
}, nil
}