Skip to content

Commit c39d9fb

Browse files
authored
Merge pull request #416 from gianlucam76/release-1.2
(feat) Enhance applier and agent patches
2 parents b09062f + 22e1a2d commit c39d9fb

File tree

6 files changed

+346
-5
lines changed

6 files changed

+346
-5
lines changed

controllers/classifier_deployer.go

Lines changed: 94 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import (
4141
"sigs.k8s.io/cluster-api/util"
4242
"sigs.k8s.io/cluster-api/util/annotations"
4343
"sigs.k8s.io/controller-runtime/pkg/client"
44+
"sigs.k8s.io/yaml"
4445

4546
"github.com/projectsveltos/classifier/controllers/keymanager"
4647
"github.com/projectsveltos/classifier/pkg/agent"
@@ -494,6 +495,7 @@ func deploySveltosAgentWithKubeconfigInCluster(ctx context.Context, c client.Cli
494495

495496
patches, err := getSveltosAgentPatches(ctx, c, logger)
496497
if err != nil {
498+
logger.V(logs.LogInfo).Error(err, "failed to get patches")
497499
return err
498500
}
499501

@@ -1855,7 +1857,75 @@ func removeSveltosAgentFromManagementCluster(ctx context.Context,
18551857
return nil
18561858
}
18571859

1858-
func getSveltosAgentPatches(ctx context.Context, c client.Client,
1860+
func getPatchesFromConfigMap(configMap *corev1.ConfigMap, logger logr.Logger,
1861+
) ([]libsveltosv1beta1.Patch, error) {
1862+
1863+
patches := make([]libsveltosv1beta1.Patch, 0)
1864+
for k := range configMap.Data {
1865+
patch := &libsveltosv1beta1.Patch{}
1866+
err := yaml.Unmarshal([]byte(configMap.Data[k]), patch)
1867+
if err != nil {
1868+
logger.V(logs.LogInfo).Error(err, "failed to marshal unstructured object")
1869+
return nil, err
1870+
}
1871+
1872+
if patch.Patch == "" {
1873+
return nil, fmt.Errorf("ConfigMap %s: content of key %s is not a Patch",
1874+
configMap.Name, k)
1875+
}
1876+
1877+
if patch.Target == nil {
1878+
patch.Target = &libsveltosv1beta1.PatchSelector{
1879+
Kind: "Deployment",
1880+
Group: "apps",
1881+
}
1882+
}
1883+
1884+
patches = append(patches, *patch)
1885+
}
1886+
1887+
return patches, nil
1888+
}
1889+
1890+
func getSveltosAgentPatchesNew(ctx context.Context, c client.Client,
1891+
logger logr.Logger) ([]libsveltosv1beta1.Patch, error) {
1892+
1893+
configMapName := getSveltosAgentConfigMap()
1894+
configMap := &corev1.ConfigMap{}
1895+
if configMapName != "" {
1896+
err := c.Get(ctx,
1897+
types.NamespacedName{Namespace: projectsveltos, Name: configMapName},
1898+
configMap)
1899+
if err != nil {
1900+
logger.V(logs.LogInfo).Info(fmt.Sprintf("failed to get ConfigMap %s: %v",
1901+
configMapName, err))
1902+
return nil, err
1903+
}
1904+
}
1905+
1906+
return getPatchesFromConfigMap(configMap, logger)
1907+
}
1908+
1909+
func getSveltosApplierPatchesNew(ctx context.Context, c client.Client,
1910+
logger logr.Logger) ([]libsveltosv1beta1.Patch, error) {
1911+
1912+
configMapName := getSveltosApplierConfigMap()
1913+
configMap := &corev1.ConfigMap{}
1914+
if configMapName != "" {
1915+
err := c.Get(ctx,
1916+
types.NamespacedName{Namespace: projectsveltos, Name: configMapName},
1917+
configMap)
1918+
if err != nil {
1919+
logger.V(logs.LogInfo).Info(fmt.Sprintf("failed to get ConfigMap %s: %v",
1920+
configMapName, err))
1921+
return nil, err
1922+
}
1923+
}
1924+
1925+
return getPatchesFromConfigMap(configMap, logger)
1926+
}
1927+
1928+
func getSveltosAgentPatchesOld(ctx context.Context, c client.Client,
18591929
logger logr.Logger) ([]libsveltosv1beta1.Patch, error) {
18601930

18611931
patches := make([]libsveltosv1beta1.Patch, 0)
@@ -1887,7 +1957,7 @@ func getSveltosAgentPatches(ctx context.Context, c client.Client,
18871957
return patches, nil
18881958
}
18891959

1890-
func getSveltosApplierPatches(ctx context.Context, c client.Client,
1960+
func getSveltosApplierPatchesOld(ctx context.Context, c client.Client,
18911961
logger logr.Logger) ([]libsveltosv1beta1.Patch, error) {
18921962

18931963
patches := make([]libsveltosv1beta1.Patch, 0)
@@ -1919,6 +1989,28 @@ func getSveltosApplierPatches(ctx context.Context, c client.Client,
19191989
return patches, nil
19201990
}
19211991

1992+
func getSveltosAgentPatches(ctx context.Context, c client.Client,
1993+
logger logr.Logger) ([]libsveltosv1beta1.Patch, error) {
1994+
1995+
patches, err := getSveltosAgentPatchesNew(ctx, c, logger)
1996+
if err == nil {
1997+
return patches, nil
1998+
}
1999+
2000+
return getSveltosAgentPatchesOld(ctx, c, logger)
2001+
}
2002+
2003+
func getSveltosApplierPatches(ctx context.Context, c client.Client,
2004+
logger logr.Logger) ([]libsveltosv1beta1.Patch, error) {
2005+
2006+
patches, err := getSveltosApplierPatchesNew(ctx, c, logger)
2007+
if err == nil {
2008+
return patches, nil
2009+
}
2010+
2011+
return getSveltosApplierPatchesOld(ctx, c, logger)
2012+
}
2013+
19222014
func addTemplateSpecLabels(u *unstructured.Unstructured, lbls map[string]string) (*unstructured.Unstructured, error) {
19232015
var deployment appsv1.Deployment
19242016
err := runtime.DefaultUnstructuredConverter.FromUnstructured(u.UnstructuredContent(), &deployment)

controllers/classifier_deployer_test.go

Lines changed: 247 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -665,6 +665,235 @@ var _ = Describe("Classifier Deployer", func() {
665665
return true
666666
}, timeout, pollingInterval).Should(BeTrue())
667667
})
668+
669+
It("getSveltosAgentPatches reads post render patches from ConfigMap", func() {
670+
cmYAML := `apiVersion: v1
671+
data:
672+
deployment-patch: |-
673+
patch: |-
674+
- op: replace
675+
path: /spec/template/spec/containers/0/resources/requests/cpu
676+
value: 500m
677+
- op: replace
678+
path: /spec/template/spec/containers/0/resources/requests/memory
679+
value: 512Mi
680+
- op: replace
681+
path: /spec/template/spec/containers/0/resources/limits/cpu
682+
value: 500m
683+
- op: replace
684+
path: /spec/template/spec/containers/0/resources/limits/memory
685+
value: 1024Mi
686+
target:
687+
kind: Deployment
688+
name: sveltos-agent-manager
689+
namespace: projectsveltos
690+
clusterrole-patch: |-
691+
patch: |-
692+
- op: remove
693+
path: /rules
694+
target:
695+
kind: ClusterRole
696+
name: sveltos-agent-manager-role
697+
kind: ConfigMap
698+
metadata:
699+
name: sveltos-agent-config
700+
namespace: projectsveltos`
701+
702+
cm, err := deployer.GetUnstructured([]byte(cmYAML), logger)
703+
Expect(err).To(BeNil())
704+
705+
initObjects := []client.Object{}
706+
for i := range cm {
707+
initObjects = append(initObjects, cm[i])
708+
}
709+
710+
c := fake.NewClientBuilder().WithScheme(scheme).WithObjects(initObjects...).Build()
711+
712+
controllers.SetSveltosAgentConfigMap("sveltos-agent-config")
713+
patches, err := controllers.GetSveltosAgentPatches(context.TODO(), c, logger)
714+
Expect(err).To(BeNil())
715+
Expect(len(patches)).To(Equal(2))
716+
controllers.SetSveltosAgentConfigMap("")
717+
718+
verifyPatches(patches)
719+
})
720+
721+
It("getSveltosApplierPatches reads post render patches from ConfigMap", func() {
722+
cmYAML := `apiVersion: v1
723+
data:
724+
deployment-patch: |-
725+
patch: |-
726+
- op: replace
727+
path: /spec/template/spec/containers/0/resources/requests/cpu
728+
value: 500m
729+
- op: replace
730+
path: /spec/template/spec/containers/0/resources/requests/memory
731+
value: 512Mi
732+
target:
733+
kind: Deployment
734+
name: sveltos-applier-manager
735+
namespace: projectsveltos
736+
clusterrole-patch: |-
737+
patch: |-
738+
- op: remove
739+
path: /rules
740+
target:
741+
kind: ClusterRole
742+
name: sveltos-applier-manager-role
743+
kind: ConfigMap
744+
metadata:
745+
name: sveltos-applier-config
746+
namespace: projectsveltos`
747+
748+
cm, err := deployer.GetUnstructured([]byte(cmYAML), logger)
749+
Expect(err).To(BeNil())
750+
751+
initObjects := []client.Object{}
752+
for i := range cm {
753+
initObjects = append(initObjects, cm[i])
754+
}
755+
756+
c := fake.NewClientBuilder().WithScheme(scheme).WithObjects(initObjects...).Build()
757+
758+
controllers.SetSveltosApplierConfigMap("sveltos-applier-config")
759+
patches, err := controllers.GetSveltosApplierPatches(context.TODO(), c, logger)
760+
Expect(err).To(BeNil())
761+
Expect(len(patches)).To(Equal(2))
762+
controllers.SetSveltosApplierConfigMap("")
763+
764+
verifyPatches(patches)
765+
})
766+
767+
It("getSveltosAgentPatches with Strategic Merge Patch", func() {
768+
cmYAML := `apiVersion: v1
769+
data:
770+
deployment-spec-patch: |-
771+
patch: |-
772+
apiVersion: apps/v1
773+
kind: Deployment
774+
metadata:
775+
name: "sveltos-ag*"
776+
spec:
777+
template:
778+
spec:
779+
containers:
780+
- name: manager
781+
resources:
782+
requests:
783+
memory: 256Mi
784+
target:
785+
kind: Deployment
786+
group: apps
787+
name: "sveltos-ag*"
788+
kind: ConfigMap
789+
metadata:
790+
name: sveltos-agent-config
791+
namespace: projectsveltos`
792+
793+
cm, err := deployer.GetUnstructured([]byte(cmYAML), logger)
794+
Expect(err).To(BeNil())
795+
796+
initObjects := []client.Object{}
797+
for i := range cm {
798+
initObjects = append(initObjects, cm[i])
799+
}
800+
801+
c := fake.NewClientBuilder().WithScheme(scheme).WithObjects(initObjects...).Build()
802+
803+
controllers.SetSveltosAgentConfigMap("sveltos-agent-config")
804+
patches, err := controllers.GetSveltosAgentPatches(context.TODO(), c, logger)
805+
Expect(err).To(BeNil())
806+
Expect(len(patches)).To(Equal(1))
807+
Expect(patches[0].Target.Kind).To(Equal("Deployment"))
808+
Expect(patches[0].Patch).ToNot(BeEmpty())
809+
controllers.SetSveltosAgentConfigMap("")
810+
})
811+
812+
It("getSveltosAgentPatches reads old post render patches from ConfigMap", func() {
813+
cmYAML := `apiVersion: v1
814+
data:
815+
deployment-patch: |-
816+
image-patch: |-
817+
- op: replace
818+
path: /spec/template/spec/containers/0/image
819+
value: registry.ciroos.ai/samay/third-party-images/projectsveltos/sveltos-agent:f2d27fef1-251024102029-amd64
820+
- op: add
821+
path: /spec/template/spec/imagePullSecrets
822+
value:
823+
- name: regcred
824+
- op: replace
825+
path: /spec/template/spec/containers/0/resources/requests/cpu
826+
value: 500m
827+
- op: replace
828+
path: /spec/template/spec/containers/0/resources/requests/memory
829+
value: 512Mi
830+
- op: replace
831+
path: /spec/template/spec/containers/0/resources/limits/cpu
832+
value: 500m
833+
- op: replace
834+
path: /spec/template/spec/containers/0/resources/limits/memory
835+
value: 1024Mi
836+
kind: ConfigMap
837+
metadata:
838+
name: sveltos-agent-config-old
839+
namespace: projectsveltos`
840+
841+
cm, err := deployer.GetUnstructured([]byte(cmYAML), logger)
842+
Expect(err).To(BeNil())
843+
844+
initObjects := []client.Object{}
845+
for i := range cm {
846+
initObjects = append(initObjects, cm[i])
847+
}
848+
849+
c := fake.NewClientBuilder().WithScheme(scheme).WithObjects(initObjects...).Build()
850+
851+
controllers.SetSveltosAgentConfigMap("sveltos-agent-config-old")
852+
patches, err := controllers.GetSveltosAgentPatches(context.TODO(), c, logger)
853+
Expect(err).To(BeNil())
854+
Expect(len(patches)).To(Equal(1))
855+
controllers.SetSveltosAgentConfigMap("")
856+
})
857+
858+
It("getSveltosAgentPatches with old Strategic Merge Patch", func() {
859+
cmYAML := `apiVersion: v1
860+
data:
861+
patch: |-
862+
apiVersion: apps/v1
863+
kind: Deployment
864+
metadata:
865+
name: "sveltos-ag*"
866+
spec:
867+
template:
868+
spec:
869+
containers:
870+
- name: manager
871+
resources:
872+
requests:
873+
memory: 256Mi
874+
kind: ConfigMap
875+
metadata:
876+
name: sveltos-agent-config-old
877+
namespace: projectsveltos`
878+
879+
cm, err := deployer.GetUnstructured([]byte(cmYAML), logger)
880+
Expect(err).To(BeNil())
881+
882+
initObjects := []client.Object{}
883+
for i := range cm {
884+
initObjects = append(initObjects, cm[i])
885+
}
886+
887+
c := fake.NewClientBuilder().WithScheme(scheme).WithObjects(initObjects...).Build()
888+
889+
controllers.SetSveltosAgentConfigMap("sveltos-agent-config-old")
890+
patches, err := controllers.GetSveltosAgentPatches(context.TODO(), c, logger)
891+
Expect(err).To(BeNil())
892+
Expect(len(patches)).To(Equal(1))
893+
Expect(patches[0].Target.Kind).To(Equal("Deployment"))
894+
Expect(patches[0].Patch).ToNot(BeEmpty())
895+
controllers.SetSveltosAgentConfigMap("")
896+
})
668897
})
669898

670899
func prepareCluster() *clusterv1.Cluster {
@@ -775,3 +1004,21 @@ func verifyLabels(currentLabels, expectedLabels map[string]string) bool {
7751004

7761005
return true
7771006
}
1007+
1008+
func verifyPatches(patches []libsveltosv1beta1.Patch) {
1009+
found := false
1010+
for i := range patches {
1011+
if patches[i].Target.Kind == "Deployment" {
1012+
found = true
1013+
}
1014+
}
1015+
Expect(found).To(BeTrue())
1016+
1017+
found = false
1018+
for i := range patches {
1019+
if patches[i].Target.Kind == "ClusterRole" {
1020+
found = true
1021+
}
1022+
}
1023+
Expect(found).To(BeTrue())
1024+
}

controllers/export_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ var (
3838
RemoveSveltosAgentFromManagementCluster = removeSveltosAgentFromManagementCluster
3939
GetSveltosAgentLabels = getSveltosAgentLabels
4040
GetSveltosAgentNamespace = getSveltosAgentNamespace
41+
GetSveltosAgentPatches = getSveltosAgentPatches
42+
GetSveltosApplierPatches = getSveltosApplierPatches
4143

4244
CreateAccessRequest = createAccessRequest
4345
GetAccessRequestName = getAccessRequestName

0 commit comments

Comments
 (0)