Fix: install dependency is invalid for runtime addon when it's clusters arg is nil

Signed-off-by: zhaohuihui <zhaohuihui_yewu@cmss.chinamobile.com>
This commit is contained in:
zhaohuihui
2023-04-21 21:28:53 +08:00
parent 5549619ef9
commit 142242a02d
3 changed files with 187 additions and 46 deletions
+41 -10
View File
@@ -1015,18 +1015,11 @@ func (h *Installer) installDependency(addon *InstallPackage) error {
continue
}
depHandler := *h
// get dependency addon original parameters
depArgs, depArgsErr := GetAddonLegacyParameters(h.ctx, h.cli, dep.Name)
// reset dependency addon clusters parameter
depArgs, depArgsErr := getDependencyArgs(h.ctx, h.cli, dep.Name, depClusters)
if depArgsErr != nil {
if !apierrors.IsNotFound(depArgsErr) {
return depArgsErr
}
return depArgsErr
}
if depArgs == nil {
depArgs = map[string]interface{}{}
}
// reset the cluster arg
depArgs[types.ClustersArg] = depClusters
depHandler.args = depArgs
@@ -1092,6 +1085,23 @@ func checkDependencyNeedInstall(ctx context.Context, k8sClient client.Client, de
needInstallAddonDep = true
depClusters = addonClusters
} else {
// if addon clusters is nil, meaning to deploy to all clusters
if addonClusters == nil {
hasTopologyPolicy := false
topologyPolicyValue := map[string]interface{}{}
for _, policy := range depApp.Spec.Policies {
if policy.Type == "topology" {
hasTopologyPolicy = true
unmarshalErr := json.Unmarshal(policy.Properties.Raw, &topologyPolicyValue)
if unmarshalErr != nil {
return true, nil, unmarshalErr
}
break
}
}
need := hasTopologyPolicy && topologyPolicyValue["clusterLabelSelector"] == nil
return need, nil, nil
}
// get the runtime clusters of current dependency addon
for _, r := range depApp.Status.AppliedResources {
if r.Cluster != "" && !stringslices.Contains(depClusters, r.Cluster) {
@@ -1110,6 +1120,27 @@ func checkDependencyNeedInstall(ctx context.Context, k8sClient client.Client, de
return needInstallAddonDep, depClusters, nil
}
// getDependencyArgs resets the dependency clusters arg according needed install depClusters
func getDependencyArgs(ctx context.Context, k8sClient client.Client, depName string, depClusters []string) (map[string]interface{}, error) {
depArgs, depArgsErr := GetAddonLegacyParameters(ctx, k8sClient, depName)
if depArgsErr != nil && !apierrors.IsNotFound(depArgsErr) {
return nil, depArgsErr
}
// reset the cluster arg
if depClusters == nil {
// delete clusters args, when render addon, it will use clusterLabelSelector then render addon to all clusters
if depArgs != nil && depArgs[types.ClustersArg] != nil {
delete(depArgs, types.ClustersArg)
}
} else {
if depArgs == nil {
depArgs = map[string]interface{}{}
}
depArgs[types.ClustersArg] = depClusters
}
return depArgs, nil
}
// checkDependency checks if addon's dependency
func (h *Installer) checkDependency(addon *InstallPackage) ([]string, error) {
var app v1beta1.Application
+24
View File
@@ -194,6 +194,30 @@ var _ = Describe("Addon test", func() {
Expect(needInstallAddonDep).Should(BeTrue())
Expect(depClusters).Should(Equal(addonClusters))
}, 30*time.Second).Should(Succeed())
// case3: addonClusters is nil
needInstallAddonDep2, depClusters2, err := checkDependencyNeedInstall(ctx, k8sClient, depAddonName, nil)
Expect(needInstallAddonDep2).Should(BeFalse())
Expect(depClusters2).Should(BeNil())
Expect(err).Should(BeNil())
})
It("getDependencyArgs func test", func() {
// case1: depClusters is nil
depAddonName := "legacy-addon"
depArgs, err := getDependencyArgs(ctx, k8sClient, depAddonName, nil)
Expect(depArgs).Should(BeNil())
Expect(err).Should(BeNil())
// case2: depClusters is not nil
app = v1beta1.Application{}
Expect(yaml.Unmarshal([]byte(legacyAppYaml), &app)).Should(BeNil())
app.SetNamespace(testns)
Expect(k8sClient.Create(ctx, &app)).Should(BeNil())
depClusters := []string{"cluster1", "cluster2"}
depArgs2, err := getDependencyArgs(ctx, k8sClient, depAddonName, depClusters)
Expect(depArgs2["clusters"]).Should(Equal(depClusters))
Expect(err).Should(BeNil())
})
It(" determineAddonAppName func test", func() {