oceanbase

Форк
0
/
obproxy_config.go 
137 строк · 4.6 Кб
1
/**
2
 * Copyright (c) 2021 OceanBase
3
 * OceanBase CE is licensed under Mulan PubL v2.
4
 * You can use this software according to the terms and conditions of the Mulan PubL v2.
5
 * You may obtain a copy of Mulan PubL v2 at:
6
 *          http://license.coscl.org.cn/MulanPubL-2.0
7
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
8
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
9
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
10
 * See the Mulan PubL v2 for more details.
11
 */
12

13
package model
14

15
import (
16
	"crypto/md5"
17
	"encoding/hex"
18
	"encoding/json"
19
	"fmt"
20

21
	"github.com/pkg/errors"
22
)
23

24
const (
25
	OBPROXY_BIN_URL_FORMAT        = "%s/client?Action=GetObProxy"
26
	CONFIG_URL_FORMAT_TEMPLATE_V1 = "%s/services?Action=ObRootServiceInfo&ObRegion=${ObRegion}"
27
	CONFIG_URL_FORMAT_TEMPLATE_V2 = "%s/services?Action=ObRootServiceInfo&version=2&ObCluster=${ObCluster}&ObClusterId=${OBClusterId}"
28
)
29

30
type ObProxyConfig struct {
31
	ObProxyBinUrl string                `json:"ObProxyBinUrl"`
32
	MetaDatabase  *MetaDatabaseInfo     `json:"ObProxyDatabaseInfo"`
33
	ConfigUrlList []*RootServiceInfoUrl `json:"ObRootServiceInfoUrlList"`
34
	Version       string                `json:"Version"`
35
}
36

37
type ObProxyConfigWithTemplate struct {
38
	ObProxyBinUrl string            `json:"ObProxyBinUrl"`
39
	MetaDatabase  *MetaDatabaseInfo `json:"ObProxyDatabaseInfo"`
40
	Version       string            `json:"Version"`
41
	ObClusters    []string          `json:"ObClusterList"`
42
	TemplateV1    string            `json:"ObRootServiceInfoUrlTemplate"`
43
	TemplateV2    string            `json:"ObRootServiceInfoUrlTemplateV2"`
44
}
45

46
type ObProxyConfigVersionOnly struct {
47
	Version string `json:"Version"`
48
}
49

50
type MetaDatabaseInfo struct {
51
	Database  string `json:"DataBase"`
52
	ConfigUrl string `json:"MetaDataBase"`
53
	Password  string `json:"Password"`
54
	User      string `json:"User"`
55
}
56

57
type RootServiceInfoUrl struct {
58
	ObCluster string `json:"ObRegion"`
59
	Url       string `json:"ObRootServiceInfoUrl"`
60
}
61

62
func NewDefaultMetaDatabaseInfo(serviceAddress string) *MetaDatabaseInfo {
63
	return &MetaDatabaseInfo{
64
		Database:  "***",
65
		User:      "***",
66
		Password:  "***",
67
		ConfigUrl: fmt.Sprintf("%s/services?Action=ObRootServiceInfo&User_ID=alibaba&UID=admin&ObRegion=obdv1", serviceAddress),
68
	}
69
}
70

71
func NewObProxyConfigVersionOnly(version string) *ObProxyConfigVersionOnly {
72
	return &ObProxyConfigVersionOnly{
73
		Version: version,
74
	}
75
}
76

77
func NewObProxyConfig(serviceAddress string, configUrlList []*RootServiceInfoUrl) (*ObProxyConfig, error) {
78
	obProxyBinUrl := fmt.Sprintf(OBPROXY_BIN_URL_FORMAT, serviceAddress)
79
	metaDatabaseInfo := NewDefaultMetaDatabaseInfo(serviceAddress)
80
	metaJson, err := json.Marshal(metaDatabaseInfo)
81
	if err != nil {
82
		return nil, errors.Wrap(err, "encode obproxy metadb")
83
	}
84
	configUrlJson, err := json.Marshal(configUrlList)
85
	if err != nil {
86
		return nil, errors.Wrap(err, "encode config urls")
87
	}
88
	strForMd5 := string(configUrlJson) + string(metaJson) + obProxyBinUrl
89
	h := md5.New()
90
	h.Write([]byte(strForMd5))
91
	version := hex.EncodeToString(h.Sum(nil))
92
	return &ObProxyConfig{
93
		ObProxyBinUrl: obProxyBinUrl,
94
		MetaDatabase:  NewDefaultMetaDatabaseInfo(serviceAddress),
95
		ConfigUrlList: configUrlList,
96
		Version:       version,
97
	}, nil
98
}
99

100
func NewObProxyConfigWithTemplate(serviceAddress string, clusterNames []string) (*ObProxyConfigWithTemplate, error) {
101
	obProxyBinUrl := fmt.Sprintf(OBPROXY_BIN_URL_FORMAT, serviceAddress)
102
	metaDatabaseInfo := NewDefaultMetaDatabaseInfo(serviceAddress)
103
	metaJson, err := json.Marshal(metaDatabaseInfo)
104
	if err != nil {
105
		return nil, errors.Wrap(err, "encode obproxy metadb")
106
	}
107

108
	clusterNamesJson, err := json.Marshal(clusterNames)
109
	if err != nil {
110
		return nil, errors.Wrap(err, "encode cluster names")
111
	}
112

113
	templateStrV1 := fmt.Sprintf(CONFIG_URL_FORMAT_TEMPLATE_V1, serviceAddress)
114
	templateV1Json, err := json.Marshal(templateStrV1)
115
	if err != nil {
116
		return nil, errors.Wrap(err, "encode config url template v1")
117
	}
118

119
	templateStrV2 := fmt.Sprintf(CONFIG_URL_FORMAT_TEMPLATE_V2, serviceAddress)
120
	templateV2Json, err := json.Marshal(templateStrV2)
121
	if err != nil {
122
		return nil, errors.Wrap(err, "encode config url template v2")
123
	}
124

125
	strForMd5 := string(clusterNamesJson) + string(templateV1Json) + string(templateV2Json) + string(metaJson) + obProxyBinUrl
126
	h := md5.New()
127
	h.Write([]byte(strForMd5))
128
	version := hex.EncodeToString(h.Sum(nil))
129
	return &ObProxyConfigWithTemplate{
130
		ObProxyBinUrl: obProxyBinUrl,
131
		MetaDatabase:  NewDefaultMetaDatabaseInfo(serviceAddress),
132
		ObClusters:    clusterNames,
133
		TemplateV1:    templateStrV1,
134
		TemplateV2:    templateStrV2,
135
		Version:       version,
136
	}, nil
137
}
138

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.