138 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			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
 | |
| }
 |