@@ -18,11 +18,14 @@ package vmoperator
18
18
19
19
import (
20
20
"context"
21
+ "sort"
21
22
22
23
"github.com/pkg/errors"
23
24
vmoprv1 "github.com/vmware-tanzu/vm-operator/api/v1alpha2"
24
25
apierrors "k8s.io/apimachinery/pkg/api/errors"
25
26
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
27
+ clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
28
+ "sigs.k8s.io/cluster-api/util/patch"
26
29
"sigs.k8s.io/controller-runtime/pkg/client"
27
30
ctrlutil "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
28
31
@@ -37,15 +40,31 @@ type RPService struct {
37
40
// ReconcileResourcePolicy ensures that a VirtualMachineSetResourcePolicy exists for the cluster
38
41
// Returns the name of a policy if it exists, otherwise returns an error.
39
42
func (s * RPService ) ReconcileResourcePolicy (ctx context.Context , clusterCtx * vmware.ClusterContext ) (string , error ) {
40
- resourcePolicy , err := s .getVirtualMachineSetResourcePolicy (ctx , clusterCtx )
43
+ clusterModuleGroups , err := getClusterModuleGroups (ctx , s .Client , clusterCtx .Cluster )
44
+ if err != nil {
45
+ return "" , err
46
+ }
47
+
48
+ resourcePolicy , err := getVirtualMachineSetResourcePolicy (ctx , s .Client , clusterCtx .Cluster )
41
49
if err != nil {
42
50
if ! apierrors .IsNotFound (err ) {
43
51
return "" , errors .Errorf ("unexpected error in getting the Resource policy: %+v" , err )
44
52
}
45
- resourcePolicy , err = s .createVirtualMachineSetResourcePolicy (ctx , clusterCtx )
53
+ resourcePolicy , err = s .createVirtualMachineSetResourcePolicy (ctx , clusterCtx , clusterModuleGroups )
46
54
if err != nil {
47
55
return "" , errors .Errorf ("failed to create Resource Policy: %+v" , err )
48
56
}
57
+ return resourcePolicy .Name , nil
58
+ }
59
+
60
+ // Ensure .spec.clusterModuleGroups is up to date.
61
+ helper , err := patch .NewHelper (resourcePolicy , s .Client )
62
+ if err != nil {
63
+ return "" , err
64
+ }
65
+ resourcePolicy .Spec .ClusterModuleGroups = clusterModuleGroups
66
+ if err := helper .Patch (ctx , resourcePolicy ); err != nil {
67
+ return "" , err
49
68
}
50
69
51
70
return resourcePolicy .Name , nil
@@ -60,29 +79,26 @@ func (s *RPService) newVirtualMachineSetResourcePolicy(clusterCtx *vmware.Cluste
60
79
}
61
80
}
62
81
63
- func ( s * RPService ) getVirtualMachineSetResourcePolicy (ctx context.Context , clusterCtx * vmware. ClusterContext ) (* vmoprv1.VirtualMachineSetResourcePolicy , error ) {
82
+ func getVirtualMachineSetResourcePolicy (ctx context.Context , ctrlClient client. Client , cluster * clusterv1. Cluster ) (* vmoprv1.VirtualMachineSetResourcePolicy , error ) {
64
83
vmResourcePolicy := & vmoprv1.VirtualMachineSetResourcePolicy {}
65
84
vmResourcePolicyName := client.ObjectKey {
66
- Namespace : clusterCtx . Cluster .Namespace ,
67
- Name : clusterCtx . Cluster .Name ,
85
+ Namespace : cluster .Namespace ,
86
+ Name : cluster .Name ,
68
87
}
69
- err := s . Client .Get (ctx , vmResourcePolicyName , vmResourcePolicy )
88
+ err := ctrlClient .Get (ctx , vmResourcePolicyName , vmResourcePolicy )
70
89
return vmResourcePolicy , err
71
90
}
72
91
73
- func (s * RPService ) createVirtualMachineSetResourcePolicy (ctx context.Context , clusterCtx * vmware.ClusterContext ) (* vmoprv1.VirtualMachineSetResourcePolicy , error ) {
92
+ func (s * RPService ) createVirtualMachineSetResourcePolicy (ctx context.Context , clusterCtx * vmware.ClusterContext , clusterModuleGroups [] string ) (* vmoprv1.VirtualMachineSetResourcePolicy , error ) {
74
93
vmResourcePolicy := s .newVirtualMachineSetResourcePolicy (clusterCtx )
75
94
76
95
_ , err := ctrlutil .CreateOrPatch (ctx , s .Client , vmResourcePolicy , func () error {
77
96
vmResourcePolicy .Spec = vmoprv1.VirtualMachineSetResourcePolicySpec {
78
97
ResourcePool : vmoprv1.ResourcePoolSpec {
79
98
Name : clusterCtx .Cluster .Name ,
80
99
},
81
- Folder : clusterCtx .Cluster .Name ,
82
- ClusterModuleGroups : []string {
83
- ControlPlaneVMClusterModuleGroupName ,
84
- getMachineDeploymentNameForCluster (clusterCtx .Cluster ),
85
- },
100
+ Folder : clusterCtx .Cluster .Name ,
101
+ ClusterModuleGroups : clusterModuleGroups ,
86
102
}
87
103
// Ensure that the VirtualMachineSetResourcePolicy is owned by the VSphereCluster
88
104
if err := ctrlutil .SetOwnerReference (
@@ -106,3 +122,32 @@ func (s *RPService) createVirtualMachineSetResourcePolicy(ctx context.Context, c
106
122
}
107
123
return vmResourcePolicy , nil
108
124
}
125
+
126
+ func getClusterModuleGroups (ctx context.Context , ctrlClient client.Client , cluster * clusterv1.Cluster ) ([]string , error ) {
127
+ machineDeploymentNames , err := getMachineDeploymentNamesForCluster (ctx , ctrlClient , cluster )
128
+ if err != nil {
129
+ return nil , err
130
+ }
131
+
132
+ clusterModuleGroups := append ([]string {ControlPlaneVMClusterModuleGroupName }, machineDeploymentNames ... )
133
+
134
+ // sort elements to have deterministic output.
135
+ sort .Strings (clusterModuleGroups )
136
+
137
+ return clusterModuleGroups , nil
138
+ }
139
+
140
+ func checkClusterModuleGroup (ctx context.Context , ctrlClient client.Client , cluster * clusterv1.Cluster , clusterModuleGroupName string ) error {
141
+ resourcePolicy , err := getVirtualMachineSetResourcePolicy (ctx , ctrlClient , cluster )
142
+ if err != nil {
143
+ return err
144
+ }
145
+
146
+ for _ , cm := range resourcePolicy .Status .ClusterModules {
147
+ if cm .GroupName == clusterModuleGroupName {
148
+ return nil
149
+ }
150
+ }
151
+
152
+ return errors .Errorf ("VirtualMachineSetResourcePolicy's .status.clusterModules does not yet contain %s" , clusterModuleGroupName )
153
+ }
0 commit comments