mirror of
https://github.com/kubevela/kubevela.git
synced 2026-08-27 16:17:34 +00:00
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:
+41
-10
@@ -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
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user