oceanbase
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
13package model
14
15import (
16"crypto/md5"
17"encoding/hex"
18"encoding/json"
19"fmt"
20
21"github.com/pkg/errors"
22)
23
24const (
25OBPROXY_BIN_URL_FORMAT = "%s/client?Action=GetObProxy"
26CONFIG_URL_FORMAT_TEMPLATE_V1 = "%s/services?Action=ObRootServiceInfo&ObRegion=${ObRegion}"
27CONFIG_URL_FORMAT_TEMPLATE_V2 = "%s/services?Action=ObRootServiceInfo&version=2&ObCluster=${ObCluster}&ObClusterId=${OBClusterId}"
28)
29
30type ObProxyConfig struct {
31ObProxyBinUrl string `json:"ObProxyBinUrl"`
32MetaDatabase *MetaDatabaseInfo `json:"ObProxyDatabaseInfo"`
33ConfigUrlList []*RootServiceInfoUrl `json:"ObRootServiceInfoUrlList"`
34Version string `json:"Version"`
35}
36
37type ObProxyConfigWithTemplate struct {
38ObProxyBinUrl string `json:"ObProxyBinUrl"`
39MetaDatabase *MetaDatabaseInfo `json:"ObProxyDatabaseInfo"`
40Version string `json:"Version"`
41ObClusters []string `json:"ObClusterList"`
42TemplateV1 string `json:"ObRootServiceInfoUrlTemplate"`
43TemplateV2 string `json:"ObRootServiceInfoUrlTemplateV2"`
44}
45
46type ObProxyConfigVersionOnly struct {
47Version string `json:"Version"`
48}
49
50type MetaDatabaseInfo struct {
51Database string `json:"DataBase"`
52ConfigUrl string `json:"MetaDataBase"`
53Password string `json:"Password"`
54User string `json:"User"`
55}
56
57type RootServiceInfoUrl struct {
58ObCluster string `json:"ObRegion"`
59Url string `json:"ObRootServiceInfoUrl"`
60}
61
62func NewDefaultMetaDatabaseInfo(serviceAddress string) *MetaDatabaseInfo {
63return &MetaDatabaseInfo{
64Database: "***",
65User: "***",
66Password: "***",
67ConfigUrl: fmt.Sprintf("%s/services?Action=ObRootServiceInfo&User_ID=alibaba&UID=admin&ObRegion=obdv1", serviceAddress),
68}
69}
70
71func NewObProxyConfigVersionOnly(version string) *ObProxyConfigVersionOnly {
72return &ObProxyConfigVersionOnly{
73Version: version,
74}
75}
76
77func NewObProxyConfig(serviceAddress string, configUrlList []*RootServiceInfoUrl) (*ObProxyConfig, error) {
78obProxyBinUrl := fmt.Sprintf(OBPROXY_BIN_URL_FORMAT, serviceAddress)
79metaDatabaseInfo := NewDefaultMetaDatabaseInfo(serviceAddress)
80metaJson, err := json.Marshal(metaDatabaseInfo)
81if err != nil {
82return nil, errors.Wrap(err, "encode obproxy metadb")
83}
84configUrlJson, err := json.Marshal(configUrlList)
85if err != nil {
86return nil, errors.Wrap(err, "encode config urls")
87}
88strForMd5 := string(configUrlJson) + string(metaJson) + obProxyBinUrl
89h := md5.New()
90h.Write([]byte(strForMd5))
91version := hex.EncodeToString(h.Sum(nil))
92return &ObProxyConfig{
93ObProxyBinUrl: obProxyBinUrl,
94MetaDatabase: NewDefaultMetaDatabaseInfo(serviceAddress),
95ConfigUrlList: configUrlList,
96Version: version,
97}, nil
98}
99
100func NewObProxyConfigWithTemplate(serviceAddress string, clusterNames []string) (*ObProxyConfigWithTemplate, error) {
101obProxyBinUrl := fmt.Sprintf(OBPROXY_BIN_URL_FORMAT, serviceAddress)
102metaDatabaseInfo := NewDefaultMetaDatabaseInfo(serviceAddress)
103metaJson, err := json.Marshal(metaDatabaseInfo)
104if err != nil {
105return nil, errors.Wrap(err, "encode obproxy metadb")
106}
107
108clusterNamesJson, err := json.Marshal(clusterNames)
109if err != nil {
110return nil, errors.Wrap(err, "encode cluster names")
111}
112
113templateStrV1 := fmt.Sprintf(CONFIG_URL_FORMAT_TEMPLATE_V1, serviceAddress)
114templateV1Json, err := json.Marshal(templateStrV1)
115if err != nil {
116return nil, errors.Wrap(err, "encode config url template v1")
117}
118
119templateStrV2 := fmt.Sprintf(CONFIG_URL_FORMAT_TEMPLATE_V2, serviceAddress)
120templateV2Json, err := json.Marshal(templateStrV2)
121if err != nil {
122return nil, errors.Wrap(err, "encode config url template v2")
123}
124
125strForMd5 := string(clusterNamesJson) + string(templateV1Json) + string(templateV2Json) + string(metaJson) + obProxyBinUrl
126h := md5.New()
127h.Write([]byte(strForMd5))
128version := hex.EncodeToString(h.Sum(nil))
129return &ObProxyConfigWithTemplate{
130ObProxyBinUrl: obProxyBinUrl,
131MetaDatabase: NewDefaultMetaDatabaseInfo(serviceAddress),
132ObClusters: clusterNames,
133TemplateV1: templateStrV1,
134TemplateV2: templateStrV2,
135Version: version,
136}, nil
137}
138