Skip to content

Commit

Permalink
add config-spec-hash annotation to manifestwork (#157)
Browse files Browse the repository at this point in the history
Signed-off-by: haoqing0110 <[email protected]>
  • Loading branch information
haoqing0110 authored Mar 28, 2023
1 parent 9de90ed commit 7c87212
Show file tree
Hide file tree
Showing 50 changed files with 4,752 additions and 2,547 deletions.
4 changes: 2 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ require (
github.com/fatih/structs v1.1.0
github.com/onsi/ginkgo v1.16.5
github.com/onsi/gomega v1.24.1
github.com/openshift/build-machinery-go v0.0.0-20211213093930-7e33a7eb4ce3
github.com/openshift/build-machinery-go v0.0.0-20230306181456-d321ffa04533
github.com/openshift/library-go v0.0.0-20220525173854-9b950a41acdc
github.com/spf13/cobra v1.6.0
github.com/spf13/pflag v1.0.5
Expand All @@ -21,7 +21,7 @@ require (
k8s.io/component-base v0.26.1
k8s.io/klog/v2 v2.80.1
k8s.io/utils v0.0.0-20221128185143-99ec85e7a448
open-cluster-management.io/api v0.10.1-0.20230315095131-f784db2cd015
open-cluster-management.io/api v0.10.1-0.20230327022939-01b4ef0a6c5e
sigs.k8s.io/controller-runtime v0.14.4
)

Expand Down
8 changes: 4 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -305,8 +305,8 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
github.com/onsi/gomega v1.24.1 h1:KORJXNNTzJXzu4ScJWssJfJMnJ+2QJqhoQSRwNlze9E=
github.com/onsi/gomega v1.24.1/go.mod h1:3AOiACssS3/MajrniINInwbfOOtfZvplPzuRSmvt1jM=
github.com/openshift/build-machinery-go v0.0.0-20211213093930-7e33a7eb4ce3 h1:65oBhJYHzYK5VL0gF1eiYY37lLzyLZ47b9y5Kib1nf8=
github.com/openshift/build-machinery-go v0.0.0-20211213093930-7e33a7eb4ce3/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE=
github.com/openshift/build-machinery-go v0.0.0-20230306181456-d321ffa04533 h1:mh3ZYs7kPIIe3UUY6tJcTExmtjnXXUu0MrBuK2W/Qvw=
github.com/openshift/build-machinery-go v0.0.0-20230306181456-d321ffa04533/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE=
github.com/openshift/library-go v0.0.0-20220525173854-9b950a41acdc h1:j+upvKc1uLzuL+q/JXie8+IMohOooTCaEC9w+4d1Ztk=
github.com/openshift/library-go v0.0.0-20220525173854-9b950a41acdc/go.mod h1:AMZwYwSdbvALDl3QobEzcJ2IeDO7DYLsr42izKzh524=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
Expand Down Expand Up @@ -805,8 +805,8 @@ k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+O
k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4=
k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 h1:KTgPnR10d5zhztWptI952TNtt/4u5h3IzDXkdIMuo2Y=
k8s.io/utils v0.0.0-20221128185143-99ec85e7a448/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
open-cluster-management.io/api v0.10.1-0.20230315095131-f784db2cd015 h1:kbZTH7u23/WcRdsaPFOwM/g0viTwTg2TSC2PgVcV394=
open-cluster-management.io/api v0.10.1-0.20230315095131-f784db2cd015/go.mod h1:wmPEOyy+AUn0KYr32J4TZBW/FTPlmF0/Nc4whZSXlIc=
open-cluster-management.io/api v0.10.1-0.20230327022939-01b4ef0a6c5e h1:9CqVKR0f94T1wnIbUF9Q89EeEJWkFU05/Ozbov2zelI=
open-cluster-management.io/api v0.10.1-0.20230327022939-01b4ef0a6c5e/go.mod h1:WgKUCJ7+Bf40DsOmH1Gdkpyj3joco+QLzrlM6Ak39zE=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
Expand Down
77 changes: 77 additions & 0 deletions pkg/addonmanager/controllers/agentdeploy/util_test.go
Original file line number Diff line number Diff line change
@@ -1 +1,78 @@
package agentdeploy

import (
"reflect"
"testing"

"github.com/stretchr/testify/assert"
addonapiv1alpha1 "open-cluster-management.io/api/addon/v1alpha1"
workapiv1 "open-cluster-management.io/api/work/v1"
)

func TestConfigsToAnnotations(t *testing.T) {
cases := []struct {
name string
configReference []addonapiv1alpha1.ConfigReference
expectAnnotations map[string]string
}{
{
name: "generate annotaions",
configReference: []addonapiv1alpha1.ConfigReference{
{
ConfigGroupResource: addonapiv1alpha1.ConfigGroupResource{
Group: "addon.open-cluster-management.io",
Resource: "addondeploymentconfigs",
},
DesiredConfig: &addonapiv1alpha1.ConfigSpecHash{
ConfigReferent: addonapiv1alpha1.ConfigReferent{
Name: "test",
Namespace: "open-cluster-management",
},
SpecHash: "hash1",
},
},
{
ConfigGroupResource: addonapiv1alpha1.ConfigGroupResource{
Resource: "addonhubconfigs",
},
DesiredConfig: &addonapiv1alpha1.ConfigSpecHash{
ConfigReferent: addonapiv1alpha1.ConfigReferent{
Name: "test",
},
SpecHash: "hash2",
},
},
},
expectAnnotations: map[string]string{
workapiv1.ManifestConfigSpecHashAnnotationKey: `{"addondeploymentconfigs.addon.open-cluster-management.io/open-cluster-management/test":"hash1","addonhubconfigs//test":"hash2"}`},
},
{
name: "generate annotaions without configReference",
configReference: []addonapiv1alpha1.ConfigReference{},
expectAnnotations: nil,
},
{
name: "generate annotaions without DesiredConfig",
configReference: []addonapiv1alpha1.ConfigReference{
{
ConfigGroupResource: addonapiv1alpha1.ConfigGroupResource{
Group: "addon.open-cluster-management.io",
Resource: "addondeploymentconfigs",
},
},
},
expectAnnotations: map[string]string{
workapiv1.ManifestConfigSpecHashAnnotationKey: `{}`},
},
}

for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
annotations, err := configsToAnnotations(c.configReference)
assert.NoError(t, err)
if !reflect.DeepEqual(annotations, c.expectAnnotations) {
t.Fatalf("Expected annotations to be equal but got %v (expected) and %v (actual)", c.expectAnnotations, annotations)
}
})
}
}
48 changes: 48 additions & 0 deletions pkg/addonmanager/controllers/agentdeploy/utils.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package agentdeploy

import (
"encoding/json"
"fmt"

"k8s.io/apimachinery/pkg/api/meta"
Expand Down Expand Up @@ -293,10 +294,16 @@ func (b *addonWorksBuilder) BuildDeployWorks(addonWorkNamespace string,
}
}

annotations, err := configsToAnnotations(addon.Status.ConfigReferences)
if err != nil {
return nil, nil, err
}

return b.workBuilder.Build(deployObjects,
newAddonWorkObjectMeta(b.processor.manifestWorkNamePrefix(addon.Namespace, addon.Name), addon.Name, addon.Namespace, addonWorkNamespace, owner),
workbuilder.ExistingManifestWorksOption(existingWorks),
workbuilder.ManifestConfigOption(manifestOptions),
workbuilder.ManifestAnnotations(annotations),
workbuilder.DeletionOption(deletionOption))
}

Expand Down Expand Up @@ -494,3 +501,44 @@ func getDeletionOrphaningRule(obj runtime.Object) (*workapiv1.OrphaningRule, err
}
return rule, nil
}

// convert config reference to annotations.
func configsToAnnotations(configReference []addonapiv1alpha1.ConfigReference) (map[string]string, error) {
if len(configReference) == 0 {
return nil, nil
}

// annotations is a map stores the config name and config spec hash.
//
// config name follows the format of <resource>.<group>/<namespace>/<name>, for example,
// addondeploymentconfigs.addon.open-cluster-management.io/open-cluster-management/default.
// for a cluster scoped resource, the namespace would be empty, for example,
// addonhubconfigs.addon.open-cluster-management.io//default.
annotations := make(map[string]string, len(configReference))
for _, v := range configReference {
if v.DesiredConfig == nil {
continue
}
resourceStr := v.Resource
if len(v.Group) > 0 {
resourceStr += fmt.Sprintf(".%s", v.Group)
}
resourceStr += fmt.Sprintf("/%s/%s", v.DesiredConfig.Namespace, v.DesiredConfig.Name)

annotations[resourceStr] = v.DesiredConfig.SpecHash
}

// converts the annotations map into a JSON byte string.
jsonBytes, err := json.Marshal(annotations)
if err != nil {
return nil, err
}

// return a map with key as "open-cluster-management.io/config-spec-hash" and value is the JSON byte string.
// For example:
// open-cluster-management.io/config-spec-hash: '{"addonhubconfigs.addon.open-cluster-management.io//default":"613d134a2ec072a8a6451af913979f496d657ef5",
// "addondeploymentconfigs.addon.open-cluster-management.io/open-cluster-management/default":"cca7df9188fb920dcfab374940452393e2037619"}'
return map[string]string{
workapiv1.ManifestConfigSpecHashAnnotationKey: string(jsonBytes),
}, nil
}
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ func TestAddonConfigReconcile(t *testing.T) {
clusterManagementAddon: newClusterManagementAddon("test",
[]addonv1alpha1.ConfigMeta{{ConfigGroupResource: addonv1alpha1.ConfigGroupResource{Group: "core", Resource: "Foo"}, DefaultConfig: &addonv1alpha1.ConfigReferent{Name: "test"}}},
addonv1alpha1.InstallStrategy{
Type: addonv1alpha1.AddonInstallStrategyManualPlacements,
Type: addonv1alpha1.AddonInstallStrategyPlacements,
Placements: []addonv1alpha1.PlacementStrategy{
{
PlacementRef: addonv1alpha1.PlacementRef{Name: "test-placement", Namespace: "default"},
Expand Down Expand Up @@ -142,7 +142,7 @@ func TestAddonConfigReconcile(t *testing.T) {
clusterManagementAddon: newClusterManagementAddon("test",
[]addonv1alpha1.ConfigMeta{{ConfigGroupResource: addonv1alpha1.ConfigGroupResource{Group: "core", Resource: "Foo"}, DefaultConfig: &addonv1alpha1.ConfigReferent{Name: "test"}}},
addonv1alpha1.InstallStrategy{
Type: addonv1alpha1.AddonInstallStrategyManualPlacements,
Type: addonv1alpha1.AddonInstallStrategyPlacements,
Placements: []addonv1alpha1.PlacementStrategy{
{
PlacementRef: addonv1alpha1.PlacementRef{Name: "test-placement", Namespace: "default"},
Expand Down Expand Up @@ -194,7 +194,7 @@ func TestAddonConfigReconcile(t *testing.T) {
clusterManagementAddon: newClusterManagementAddon("test",
[]addonv1alpha1.ConfigMeta{{ConfigGroupResource: addonv1alpha1.ConfigGroupResource{Group: "core", Resource: "Foo"}, DefaultConfig: &addonv1alpha1.ConfigReferent{Name: "test"}}},
addonv1alpha1.InstallStrategy{
Type: addonv1alpha1.AddonInstallStrategyManualPlacements,
Type: addonv1alpha1.AddonInstallStrategyPlacements,
Placements: []addonv1alpha1.PlacementStrategy{
{
PlacementRef: addonv1alpha1.PlacementRef{Name: "test-placement", Namespace: "default"},
Expand Down Expand Up @@ -241,7 +241,7 @@ func TestAddonConfigReconcile(t *testing.T) {
clusterManagementAddon: newClusterManagementAddon("test",
[]addonv1alpha1.ConfigMeta{{ConfigGroupResource: addonv1alpha1.ConfigGroupResource{Group: "core", Resource: "Foo"}, DefaultConfig: &addonv1alpha1.ConfigReferent{Name: "test"}}},
addonv1alpha1.InstallStrategy{
Type: addonv1alpha1.AddonInstallStrategyManualPlacements,
Type: addonv1alpha1.AddonInstallStrategyPlacements,
Placements: []addonv1alpha1.PlacementStrategy{
{
PlacementRef: addonv1alpha1.PlacementRef{Name: "test-placement", Namespace: "default"},
Expand Down
10 changes: 5 additions & 5 deletions pkg/manager/controllers/addonmanagement/controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ func TestAddonInstallReconcile(t *testing.T) {
clusterManagementAddon: func() *addonv1alpha1.ClusterManagementAddOn {
addon := addontesting.NewClusterManagementAddon("test", "", "")
addon.Spec.InstallStrategy = addonv1alpha1.InstallStrategy{
Type: addonv1alpha1.AddonInstallStrategyManualPlacements,
Type: addonv1alpha1.AddonInstallStrategyPlacements,
Placements: []addonv1alpha1.PlacementStrategy{
{
PlacementRef: addonv1alpha1.PlacementRef{Name: "test-placement", Namespace: "default"},
Expand All @@ -76,7 +76,7 @@ func TestAddonInstallReconcile(t *testing.T) {
clusterManagementAddon: func() *addonv1alpha1.ClusterManagementAddOn {
addon := addontesting.NewClusterManagementAddon("test", "", "")
addon.Spec.InstallStrategy = addonv1alpha1.InstallStrategy{
Type: addonv1alpha1.AddonInstallStrategyManualPlacements,
Type: addonv1alpha1.AddonInstallStrategyPlacements,
Placements: []addonv1alpha1.PlacementStrategy{
{
PlacementRef: addonv1alpha1.PlacementRef{Name: "test-placement", Namespace: "default"},
Expand All @@ -97,7 +97,7 @@ func TestAddonInstallReconcile(t *testing.T) {
clusterManagementAddon: func() *addonv1alpha1.ClusterManagementAddOn {
addon := addontesting.NewClusterManagementAddon("test", "", "")
addon.Spec.InstallStrategy = addonv1alpha1.InstallStrategy{
Type: addonv1alpha1.AddonInstallStrategyManualPlacements,
Type: addonv1alpha1.AddonInstallStrategyPlacements,
Placements: []addonv1alpha1.PlacementStrategy{
{
PlacementRef: addonv1alpha1.PlacementRef{Name: "test-placement", Namespace: "default"},
Expand Down Expand Up @@ -134,7 +134,7 @@ func TestAddonInstallReconcile(t *testing.T) {
clusterManagementAddon: func() *addonv1alpha1.ClusterManagementAddOn {
addon := addontesting.NewClusterManagementAddon("test", "", "")
addon.Spec.InstallStrategy = addonv1alpha1.InstallStrategy{
Type: addonv1alpha1.AddonInstallStrategyManualPlacements,
Type: addonv1alpha1.AddonInstallStrategyPlacements,
Placements: []addonv1alpha1.PlacementStrategy{
{
PlacementRef: addonv1alpha1.PlacementRef{Name: "test-placement", Namespace: "default"},
Expand Down Expand Up @@ -171,7 +171,7 @@ func TestAddonInstallReconcile(t *testing.T) {
clusterManagementAddon: func() *addonv1alpha1.ClusterManagementAddOn {
addon := addontesting.NewClusterManagementAddon("test", "", "")
addon.Spec.InstallStrategy = addonv1alpha1.InstallStrategy{
Type: addonv1alpha1.AddonInstallStrategyManualPlacements,
Type: addonv1alpha1.AddonInstallStrategyPlacements,
Placements: []addonv1alpha1.PlacementStrategy{
{
PlacementRef: addonv1alpha1.PlacementRef{Name: "test-placement", Namespace: "default"},
Expand Down
5 changes: 4 additions & 1 deletion test/integration/addon_configs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ var _ = ginkgo.Describe("AddConfigs", func() {
gomega.Expect(err).ToNot(gomega.HaveOccurred())

cma.Spec.InstallStrategy = addonapiv1alpha1.InstallStrategy{
Type: addonapiv1alpha1.AddonInstallStrategyManualPlacements,
Type: addonapiv1alpha1.AddonInstallStrategyPlacements,
Placements: []addonapiv1alpha1.PlacementStrategy{
{
PlacementRef: addonapiv1alpha1.PlacementRef{Name: "test-placement", Namespace: configDefaultNamespace},
Expand All @@ -137,6 +137,9 @@ var _ = ginkgo.Describe("AddConfigs", func() {
},
},
},
RolloutStrategy: addonapiv1alpha1.RolloutStrategy{
Type: addonapiv1alpha1.AddonRolloutStrategyUpdateAll,
},
},
},
}
Expand Down
5 changes: 4 additions & 1 deletion test/integration/addon_manager_install_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,10 +101,13 @@ var _ = ginkgo.Describe("Agent deploy", func() {
gomega.Expect(err).ToNot(gomega.HaveOccurred())

clusterManagementAddon.Spec.InstallStrategy = addonapiv1alpha1.InstallStrategy{
Type: addonapiv1alpha1.AddonInstallStrategyManualPlacements,
Type: addonapiv1alpha1.AddonInstallStrategyPlacements,
Placements: []addonapiv1alpha1.PlacementStrategy{
{
PlacementRef: addonapiv1alpha1.PlacementRef{Name: "test-placement", Namespace: placementNamespace},
RolloutStrategy: addonapiv1alpha1.RolloutStrategy{
Type: addonapiv1alpha1.AddonRolloutStrategyUpdateAll,
},
},
},
}
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

24 changes: 10 additions & 14 deletions vendor/github.com/openshift/build-machinery-go/Makefile

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 7c87212

Please sign in to comment.