Skip to content

Commit

Permalink
chore: fix connect secret error (#139)
Browse files Browse the repository at this point in the history
  • Loading branch information
1aal authored Dec 27, 2023
1 parent f1704c0 commit c659bfa
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 22 deletions.
17 changes: 9 additions & 8 deletions pkg/cluster/cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ type GetOptions struct {
WithEvent TypeNeed
WithDataProtection TypeNeed
WithCompDef TypeNeed
WithComp TypeNeed
}

type ObjectsGetter struct {
Expand All @@ -78,9 +79,9 @@ type ObjectsGetter struct {

func NewClusterObjects() *ClusterObjects {
return &ClusterObjects{
Cluster: &appsv1alpha1.Cluster{},
Nodes: []*corev1.Node{},
CompDef: []*appsv1alpha1.ComponentDefinition{},
Cluster: &appsv1alpha1.Cluster{},
Nodes: []*corev1.Node{},
CompDefs: []*appsv1alpha1.ComponentDefinition{},
}
}

Expand Down Expand Up @@ -270,14 +271,14 @@ func (o *ObjectsGetter) Get() (*ClusterObjects, error) {
}

if o.WithCompDef == Need {
comps := []*appsv1alpha1.ComponentDefinition{}
if err = listResources(o.Dynamic, types.CompDefGVR(), "", metav1.ListOptions{}, &comps); err != nil {
compDefs := []*appsv1alpha1.ComponentDefinition{}
if err = listResources(o.Dynamic, types.CompDefGVR(), "", metav1.ListOptions{}, &compDefs); err != nil {
return nil, err
}
for _, compSpec := range objs.Cluster.Spec.ComponentSpecs {
for _, comp := range comps {
for _, comp := range compDefs {
if compSpec.ComponentDef == comp.Name {
objs.CompDef = append(objs.CompDef, comp)
objs.CompDefs = append(objs.CompDefs, comp)
break
}
}
Expand All @@ -297,7 +298,7 @@ func (o *ObjectsGetter) Get() (*ClusterObjects, error) {
for _, compSpec := range objs.Cluster.Spec.ComponentSpecs {
for _, comp := range comps {
if compSpec.ComponentDef == comp.Name {
objs.CompDef = append(objs.CompDef, comp)
objs.CompDefs = append(objs.CompDefs, comp)
break
}
}
Expand Down
3 changes: 2 additions & 1 deletion pkg/cluster/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ type ClusterObjects struct {
Backups []dpv1alpha1.Backup

// 0.8 API
CompDef []*appsv1alpha1.ComponentDefinition
CompDefs []*appsv1alpha1.ComponentDefinition
Components []*appsv1alpha1.Component
}

type ClusterInfo struct {
Expand Down
54 changes: 42 additions & 12 deletions pkg/cmd/cluster/connect.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,10 @@ type ConnectOptions struct {
targetCluster *appsv1alpha1.Cluster
targetClusterDef *appsv1alpha1.ClusterDefinition

// componentDefV2 refer to the *appsv1alpha1.Component
// componentDefV2 refer to the *appsv1alpha1.ComponentDefinition
componentDefV2 *appsv1alpha1.ComponentDefinition
// componentV2 refer to the *appsv1alpha1.Component
componentV2 *appsv1alpha1.Component

characterType string
userName string
Expand Down Expand Up @@ -289,15 +291,18 @@ func (o *ConnectOptions) getAuthInfo() (*engines.AuthInfo, error) {
WithService: cluster.Need,
WithSecret: cluster.Need,
WithCompDef: cluster.Maybe,
WithComp: cluster.Maybe,
},
}

objs, err := getter.Get()
if err != nil {
return nil, err
}

if user, passwd, err := getUserAndPassword(objs.ClusterDef, o.componentDefV2, objs.Secrets); err != nil {
if o.componentDefV2 != nil {
o.componentV2 = getClusterCompByCompDef(objs.Components, o.componentDefV2.Name)
}
if user, passwd, err := getUserAndPassword(objs.ClusterDef, o.componentDefV2, o.componentV2, objs.Secrets); err != nil {
return nil, err
} else {
return &engines.AuthInfo{
Expand Down Expand Up @@ -371,7 +376,10 @@ func (o *ConnectOptions) getConnectionInfo() (*engines.ConnectionInfo, error) {
info.ComponentName = o.componentName
info.HeadlessEndpoint = getOneHeadlessEndpoint(objs.ClusterDef, objs.Secrets)
// get username and password
if info.User, info.Password, err = getUserAndPassword(objs.ClusterDef, o.componentDefV2, objs.Secrets); err != nil {
if o.componentDefV2 != nil {
o.componentV2 = getClusterCompByCompDef(objs.Components, o.componentDefV2.Name)
}
if info.User, info.Password, err = getUserAndPassword(objs.ClusterDef, o.componentDefV2, o.componentV2, objs.Secrets); err != nil {
return nil, err
}
if !o.showPassword {
Expand Down Expand Up @@ -408,7 +416,7 @@ func (o *ConnectOptions) getConnectionInfo() (*engines.ConnectionInfo, error) {

// getUserAndPassword gets cluster user and password from secrets
// TODO:@shanshanying, should use admin user and password. Use root credential for now.
func getUserAndPassword(clusterDef *appsv1alpha1.ClusterDefinition, compDef *appsv1alpha1.ComponentDefinition, secrets *corev1.SecretList) (string, string, error) {
func getUserAndPassword(clusterDef *appsv1alpha1.ClusterDefinition, compDef *appsv1alpha1.ComponentDefinition, comp *appsv1alpha1.Component, secrets *corev1.SecretList) (string, string, error) {
var (
user, password = "", ""
err error
Expand Down Expand Up @@ -445,19 +453,23 @@ func getUserAndPassword(clusterDef *appsv1alpha1.ClusterDefinition, compDef *app
}
// 0.8 API connect
if secret == nil && compDef != nil {
for i := range compDef.Spec.SystemAccounts {
if compDef.Spec.SystemAccounts[i].InitAccount {
for j, s := range secrets.Items {
if strings.Contains(s.Name, compDef.Spec.SystemAccounts[j].Name) {
secret = &secrets.Items[j]
break
}
for _, account := range compDef.Spec.SystemAccounts {
if !account.InitAccount {
continue
}
for i, s := range secrets.Items {
if s.Name == fmt.Sprintf("%s-account-%s", comp.Name, account.Name) {
secret = &secrets.Items[i]
break
}
}
if secret != nil {
break
}
}
if secret == nil {
return "", "", fmt.Errorf("failed to get the username and password by cluster component definition")
}
user, err = getSecretVal(secret, "username")
if err != nil {
return user, password, err
Expand Down Expand Up @@ -505,3 +517,21 @@ func (o *ConnectOptions) getClusterCharacterType() error {
o.characterType = o.componentDef.CharacterType
return nil
}

func getClusterCompByCompDef(comps []*appsv1alpha1.Component, compDefName string) *appsv1alpha1.Component {
// get 0.8 API component
if len(comps) == 0 {
return nil
}
for i, comp := range comps {
labels := comp.Labels
if labels == nil {
continue
}
if name := labels[constant.ComponentDefinitionLabelKey]; name == compDefName {
return comps[i]
}
}

return nil
}
2 changes: 1 addition & 1 deletion pkg/cmd/cluster/connect_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ var _ = Describe("connection", func() {
secretList := &corev1.SecretList{}
secretList.Items = []corev1.Secret{secret}
It("getUserAndPassword", func() {
u, p, err := getUserAndPassword(testing.FakeClusterDef(), nil, secretList)
u, p, err := getUserAndPassword(testing.FakeClusterDef(), nil, nil, secretList)
Expect(err).Should(Succeed())
Expect(u).Should(Equal(user))
Expect(p).Should(Equal(password))
Expand Down
5 changes: 5 additions & 0 deletions pkg/types/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ const (
ResourceClusterDefs = "clusterdefinitions"
ResourceClusterVersions = "clusterversions"
ResourceComponentDefs = "componentdefinitions"
ResourceComponents = "components"
ResourceOpsRequests = "opsrequests"
ResourceOpsDefinitions = "opsdefinitions"
ResourceConfigConstraintVersions = "configconstraints"
Expand Down Expand Up @@ -292,6 +293,10 @@ func CompDefGVR() schema.GroupVersionResource {
return schema.GroupVersionResource{Group: AppsAPIGroup, Version: AppsAPIVersion, Resource: ResourceComponentDefs}
}

func ComponentGVR() schema.GroupVersionResource {
return schema.GroupVersionResource{Group: AppsAPIGroup, Version: AppsAPIVersion, Resource: ResourceComponents}
}

func OpsDefinitionGVR() schema.GroupVersionResource {
return schema.GroupVersionResource{Group: AppsAPIGroup, Version: AppsAPIVersion, Resource: ResourceOpsDefinitions}
}
Expand Down

0 comments on commit c659bfa

Please sign in to comment.