Skip to content

Commit 0a3edd8

Browse files
authored
Merge pull request #778 from chris-sun-star/test0328
Fix test problems
2 parents 8bff302 + d10064e commit 0a3edd8

File tree

9 files changed

+90
-31
lines changed

9 files changed

+90
-31
lines changed

internal/clients/obcluster.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,3 +170,19 @@ func GetPodOfOBServer(ctx context.Context, observer *v1alpha1.OBServer) (*corev1
170170
}
171171
return pod, nil
172172
}
173+
174+
func ListOBParametersOfOBCluster(ctx context.Context, obcluster *v1alpha1.OBCluster) (*v1alpha1.OBParameterList, error) {
175+
client := client.GetClient()
176+
var obparameterList v1alpha1.OBParameterList
177+
obj, err := client.DynamicClient.Resource(schema.OBParameterGVR).Namespace(obcluster.Namespace).List(ctx, metav1.ListOptions{
178+
LabelSelector: fmt.Sprintf("%s=%s", oceanbaseconst.LabelRefUID, string(obcluster.GetUID())),
179+
})
180+
if err != nil {
181+
return nil, errors.Wrap(err, "List obparameters")
182+
}
183+
err = runtime.DefaultUnstructuredConverter.FromUnstructured(obj.UnstructuredContent(), &obparameterList)
184+
if err != nil {
185+
return nil, errors.Wrap(err, "Convert unstructured to obparameter list")
186+
}
187+
return &obparameterList, nil
188+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
Copyright (c) 2025 OceanBase
3+
ob-operator is licensed under Mulan PSL v2.
4+
You can use this software according to the terms and conditions of the Mulan PSL v2.
5+
You may obtain a copy of Mulan PSL v2 at:
6+
http://license.coscl.org.cn/MulanPSL2
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 PSL v2 for more details.
11+
*/
12+
13+
package schema
14+
15+
import "k8s.io/apimachinery/pkg/runtime/schema"
16+
17+
const (
18+
OBParameterGroup = "oceanbase.oceanbase.com"
19+
OBParameterVersion = "v1alpha1"
20+
OBParameterKind = "OBParameter"
21+
OBParameterResource = "obparameters"
22+
)
23+
24+
var (
25+
OBParameterGVR = schema.GroupVersionResource{
26+
Group: OBParameterGroup,
27+
Version: OBParameterVersion,
28+
Resource: OBParameterResource,
29+
}
30+
)

internal/dashboard/business/k8s/utils.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ func ListK8sClusterEvents(ctx context.Context, c *client.Client, queryEventParam
131131
func ListK8sClusterNodes(ctx context.Context, c *client.Client) ([]response.K8sNode, error) {
132132
nodeList, err := c.ClientSet.CoreV1().Nodes().List(ctx, metav1.ListOptions{})
133133
nodes := make([]response.K8sNode, 0)
134-
nodeMetricsMap, metricsErr := resource.ListNodeMetrics(ctx)
134+
nodeMetricsMap, metricsErr := resource.ListNodeMetrics(ctx, c)
135135
if err == nil {
136136
for _, node := range nodeList.Items {
137137
internalAddress, externalAddress := extractNodeAddress(&node)

internal/dashboard/business/oceanbase/obcluster.go

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -981,13 +981,18 @@ func ListOBClusterParameters(ctx context.Context, nn *param.K8sObjectIdentity) (
981981
logger.WithError(err).Info("Failed to get OceanBase database connection")
982982
return nil, errors.Wrapf(err, "Failed to get connection go obcluster")
983983
}
984+
parameterList, err := clients.ListOBParametersOfOBCluster(ctx, obcluster)
985+
if err != nil {
986+
logger.WithError(err).Error("Failed to list parameters")
987+
return nil, errors.New("Failed to list obcluster parameters in k8s")
988+
}
984989
parameters, err := conn.ListClusterParameters(ctx)
985990
if err != nil {
986991
logger.WithError(err).Error("Failed to query parameters")
987-
return nil, errors.New("Failed to list obcluster parameters")
992+
return nil, errors.New("Failed to list obcluster parameters in obcluster")
988993
}
989994
// convert to response data structure
990-
aggParameters := aggregrateParametersByName(parameters)
995+
aggParameters := aggregrateParameters(parameterList.Items, parameters)
991996
return aggParameters, nil
992997
}
993998

@@ -1047,7 +1052,7 @@ func aggregrateParameterByName(parameters []*model.Parameter) response.Aggregate
10471052
}
10481053
}
10491054

1050-
func aggregrateParametersByName(parameters []*model.Parameter) []response.AggregatedParameter {
1055+
func aggregrateParameters(obparameters []v1alpha1.OBParameter, parameters []*model.Parameter) []response.AggregatedParameter {
10511056
aggMap := make(map[string][]*model.Parameter)
10521057
for _, parameter := range parameters {
10531058
parameterList, exists := aggMap[parameter.Name]
@@ -1058,8 +1063,15 @@ func aggregrateParametersByName(parameters []*model.Parameter) []response.Aggreg
10581063
aggMap[parameter.Name] = parameterList
10591064
}
10601065
aggParameters := make([]response.AggregatedParameter, 0)
1061-
for _, parameterList := range aggMap {
1066+
for name, parameterList := range aggMap {
10621067
aggParameter := aggregrateParameterByName(parameterList)
1068+
for _, obparameter := range obparameters {
1069+
if name == obparameter.Spec.Parameter.Name {
1070+
aggParameter.IsManagedByOperator = true
1071+
aggParameter.Status = obparameter.Status.Status
1072+
break
1073+
}
1074+
}
10631075
aggParameters = append(aggParameters, aggParameter)
10641076
}
10651077
return aggParameters

internal/dashboard/handler/remote_k8s_handler.go

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ See the Mulan PSL v2 for more details.
1313
package handler
1414

1515
import (
16+
"encoding/hex"
17+
1618
"github.com/gin-gonic/gin"
1719

1820
k8sbiz "github.com/oceanbase/ob-operator/internal/dashboard/business/k8s"
@@ -97,11 +99,15 @@ func PatchRemoteK8sCluster(c *gin.Context) (*k8s.K8sClusterInfo, error) {
9799
}
98100
encryptedKey := c.GetHeader(HEADER_ENCRYPTED_KEY)
99101
if encryptedKey != "" {
100-
key, err := crypto.DecryptWithPrivateKey(encryptedKey)
102+
keyStr, err := crypto.DecryptWithPrivateKey(encryptedKey)
103+
if err != nil {
104+
return nil, httpErr.NewBadRequest(err.Error())
105+
}
106+
key, err := hex.DecodeString(keyStr)
101107
if err != nil {
102108
return nil, httpErr.NewBadRequest(err.Error())
103109
}
104-
body.KubeConfig, err = crypto.AESDecrypt(key, body.KubeConfig)
110+
body.KubeConfig, err = crypto.AESDecrypt(string(key), body.KubeConfig)
105111
if err != nil {
106112
return nil, httpErr.NewBadRequest(err.Error())
107113
}
@@ -131,11 +137,15 @@ func CreateRemoteK8sCluster(c *gin.Context) (*k8s.K8sClusterInfo, error) {
131137
}
132138
encryptedKey := c.GetHeader(HEADER_ENCRYPTED_KEY)
133139
if encryptedKey != "" {
134-
key, err := crypto.DecryptWithPrivateKey(encryptedKey)
140+
keyStr, err := crypto.DecryptWithPrivateKey(encryptedKey)
141+
if err != nil {
142+
return nil, httpErr.NewBadRequest(err.Error())
143+
}
144+
key, err := hex.DecodeString(keyStr)
135145
if err != nil {
136146
return nil, httpErr.NewBadRequest(err.Error())
137147
}
138-
body.KubeConfig, err = crypto.AESDecrypt(key, body.KubeConfig)
148+
body.KubeConfig, err = crypto.AESDecrypt(string(key), body.KubeConfig)
139149
if err != nil {
140150
return nil, httpErr.NewBadRequest(err.Error())
141151
}

internal/dashboard/model/response/obcluster.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -160,11 +160,13 @@ type AggregratedParameterValue struct {
160160
}
161161

162162
type AggregatedParameter struct {
163-
Name string `json:"name"`
164-
Values []AggregratedParameterValue `json:"values"`
165-
Scope string `json:"scope"`
166-
EditLevel string `json:"editLevel"`
167-
DataType string `json:"dataType"`
168-
Info string `json:"info"`
169-
Section string `json:"section"`
163+
Name string `json:"name"`
164+
Values []AggregratedParameterValue `json:"values"`
165+
Scope string `json:"scope"`
166+
EditLevel string `json:"editLevel"`
167+
DataType string `json:"dataType"`
168+
Info string `json:"info"`
169+
Section string `json:"section"`
170+
IsManagedByOperator bool `json:"isManagedByOperator"`
171+
Status string `json:"status"`
170172
}

internal/dashboard/router/v1/k8s_router.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ func InitK8sClusterRoutes(g *gin.RouterGroup) {
3131
g.GET("/k8s/clusters", h.Wrap(h.ListRemoteK8sClusters, k8sClusterReadGuard))
3232
g.GET("/k8s/clusters/:name", h.Wrap(h.GetRemoteK8sCluster, k8sClusterReadGuard))
3333
g.PATCH("/k8s/clusters/:name", h.Wrap(h.PatchRemoteK8sCluster, k8sClusterWriteGuard))
34+
g.DELETE("/k8s/clusters/:name", h.Wrap(h.DeleteRemoteK8sCluster, k8sClusterWriteGuard))
3435
g.POST("/k8s/clusters", h.Wrap(h.CreateRemoteK8sCluster, k8sClusterWriteGuard))
3536
g.GET("/k8s/clusters/:name/events", h.Wrap(h.ListRemoteK8sEvents, k8sClusterReadGuard))
3637
g.GET("/k8s/clusters/:name/nodes", h.Wrap(h.ListRemoteK8sNodes, k8sClusterReadGuard))

pkg/k8s/resource/node.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,9 @@ func ListNodes(ctx context.Context) (*corev1.NodeList, error) {
4242
})
4343
}
4444

45-
func ListNodeMetrics(ctx context.Context) (map[string]metricsv1beta1.NodeMetrics, error) {
46-
client := client.GetClient()
45+
func ListNodeMetrics(ctx context.Context, c *client.Client) (map[string]metricsv1beta1.NodeMetrics, error) {
4746
nodeMetricsMap := make(map[string]metricsv1beta1.NodeMetrics)
48-
metricsList, err := client.MetricsClientset.MetricsV1beta1().NodeMetricses().List(ctx, metav1.ListOptions{
47+
metricsList, err := c.MetricsClientset.MetricsV1beta1().NodeMetricses().List(ctx, metav1.ListOptions{
4948
TimeoutSeconds: &timeout,
5049
})
5150
if err == nil {

ui/src/pages/K8sCluster/Createk8sClusterModal.tsx

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -61,16 +61,6 @@ export default function Createk8sClusterModal({
6161
return CryptoJS.lib.WordArray.random(16).toString(CryptoJS.enc.Hex);
6262
}
6363

64-
function hexToString(hexString) {
65-
let fullString = '';
66-
for (let i = 0; i < hexString.length; i += 2) {
67-
const hex = hexString.substr(i, 2);
68-
const decimal = parseInt(hex, 16);
69-
fullString += String.fromCharCode(decimal);
70-
}
71-
return fullString;
72-
}
73-
7464
// Function to encrypt data using AES-256
7565
function encryptAES(data, key, iv) {
7666
const encrypted = CryptoJS.AES.encrypt(data, CryptoJS.enc.Hex.parse(key), {
@@ -91,10 +81,9 @@ export default function Createk8sClusterModal({
9181
const key = generateAESKey();
9282
const iv = generateIV();
9383
const encryptedData = encryptAES(values.kubeConfig, key, iv);
94-
9584
values.kubeConfig = encryptedData;
9685

97-
const encryptedKey = encryptText(hexToString(key), publicKey);
86+
const encryptedKey = encryptText(key, publicKey);
9887

9988
if (isEdit && !isEmpty(editData)) {
10089
patchK8sCluster(editData?.name, values, {

0 commit comments

Comments
 (0)