Skip to content

Commit 37b01d8

Browse files
implement APIs for multi namespace support for Cluster API objects
add unit tests for multi namespace scenarios
1 parent 3603557 commit 37b01d8

File tree

15 files changed

+1040
-328
lines changed

15 files changed

+1040
-328
lines changed

clusterctl/clusterdeployer/clusterclient.go

Lines changed: 98 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -104,12 +104,33 @@ func (c *clusterClient) Apply(manifest string) error {
104104
return c.waitForKubectlApply(manifest)
105105
}
106106

107-
func (c *clusterClient) GetClusterObjects() ([]*clusterv1.Cluster, error) {
107+
func (c *clusterClient) GetContextNamespace() string {
108+
if c.configOverrides.Context.Namespace == "" {
109+
c.configOverrides.Context.Namespace = apiv1.NamespaceDefault
110+
}
111+
return c.configOverrides.Context.Namespace
112+
}
113+
114+
func (c *clusterClient) GetClusterObject(name, ns string) (*clusterv1.Cluster, error) {
115+
clustersInNamespace, err := c.GetClusterObjectsInNamespace(ns)
116+
if err != nil {
117+
return nil, err
118+
}
119+
var cluster *clusterv1.Cluster
120+
for _, nc := range clustersInNamespace {
121+
if nc.Name == name {
122+
cluster = nc
123+
break
124+
}
125+
}
126+
return cluster, nil
127+
}
128+
129+
func (c *clusterClient) GetClusterObjectsInNamespace(namespace string) ([]*clusterv1.Cluster, error) {
108130
clusters := []*clusterv1.Cluster{}
109-
// TODO: Iterate over all namespaces where we could have Cluster API Objects https://github.com/kubernetes-sigs/cluster-api/issues/252
110-
clusterlist, err := c.clientSet.ClusterV1alpha1().Clusters(apiv1.NamespaceDefault).List(metav1.ListOptions{})
131+
clusterlist, err := c.clientSet.ClusterV1alpha1().Clusters(namespace).List(metav1.ListOptions{})
111132
if err != nil {
112-
return nil, fmt.Errorf("error listing cluster objects: %v", err)
133+
return nil, fmt.Errorf("error listing cluster objects in namespace %q: %v", namespace, err)
113134
}
114135

115136
for i := 0; i < len(clusterlist.Items); i++ {
@@ -118,11 +139,15 @@ func (c *clusterClient) GetClusterObjects() ([]*clusterv1.Cluster, error) {
118139
return clusters, nil
119140
}
120141

121-
func (c *clusterClient) GetMachineDeploymentObjects() ([]*clusterv1.MachineDeployment, error) {
142+
func (c *clusterClient) GetClusterObjects() ([]*clusterv1.Cluster, error) {
122143
// TODO: Iterate over all namespaces where we could have Cluster API Objects https://github.com/kubernetes-sigs/cluster-api/issues/252
123-
machineDeploymentList, err := c.clientSet.ClusterV1alpha1().MachineDeployments(apiv1.NamespaceDefault).List(metav1.ListOptions{})
144+
return c.GetClusterObjectsInNamespace(apiv1.NamespaceDefault)
145+
}
146+
147+
func (c *clusterClient) GetMachineDeploymentObjectsInNamespace(namespace string) ([]*clusterv1.MachineDeployment, error) {
148+
machineDeploymentList, err := c.clientSet.ClusterV1alpha1().MachineDeployments(namespace).List(metav1.ListOptions{})
124149
if err != nil {
125-
return nil, fmt.Errorf("error listing machine deployment objects: %v", err)
150+
return nil, fmt.Errorf("error listing machine deployment objects in namespace %q: %v", namespace, err)
126151
}
127152
var machineDeployments []*clusterv1.MachineDeployment
128153
for i := 0; i < len(machineDeploymentList.Items); i++ {
@@ -131,11 +156,15 @@ func (c *clusterClient) GetMachineDeploymentObjects() ([]*clusterv1.MachineDeplo
131156
return machineDeployments, nil
132157
}
133158

134-
func (c *clusterClient) GetMachineSetObjects() ([]*clusterv1.MachineSet, error) {
159+
func (c *clusterClient) GetMachineDeploymentObjects() ([]*clusterv1.MachineDeployment, error) {
135160
// TODO: Iterate over all namespaces where we could have Cluster API Objects https://github.com/kubernetes-sigs/cluster-api/issues/252
161+
return c.GetMachineDeploymentObjectsInNamespace(apiv1.NamespaceDefault)
162+
}
163+
164+
func (c *clusterClient) GetMachineSetObjectsInNamespace(namespace string) ([]*clusterv1.MachineSet, error) {
136165
machineSetList, err := c.clientSet.ClusterV1alpha1().MachineSets(apiv1.NamespaceDefault).List(metav1.ListOptions{})
137166
if err != nil {
138-
return nil, fmt.Errorf("error listing machine set objects: %v", err)
167+
return nil, fmt.Errorf("error listing machine set objects in namespace %q: %v", namespace, err)
139168
}
140169
var machineSets []*clusterv1.MachineSet
141170
for i := 0; i < len(machineSetList.Items); i++ {
@@ -144,12 +173,16 @@ func (c *clusterClient) GetMachineSetObjects() ([]*clusterv1.MachineSet, error)
144173
return machineSets, nil
145174
}
146175

147-
func (c *clusterClient) GetMachineObjects() ([]*clusterv1.Machine, error) {
176+
func (c *clusterClient) GetMachineSetObjects() ([]*clusterv1.MachineSet, error) {
148177
// TODO: Iterate over all namespaces where we could have Cluster API Objects https://github.com/kubernetes-sigs/cluster-api/issues/252
178+
return c.GetMachineSetObjectsInNamespace(apiv1.NamespaceDefault)
179+
}
180+
181+
func (c *clusterClient) GetMachineObjectsInNamespace(namespace string) ([]*clusterv1.Machine, error) {
149182
machines := []*clusterv1.Machine{}
150-
machineslist, err := c.clientSet.ClusterV1alpha1().Machines(apiv1.NamespaceDefault).List(metav1.ListOptions{})
183+
machineslist, err := c.clientSet.ClusterV1alpha1().Machines(namespace).List(metav1.ListOptions{})
151184
if err != nil {
152-
return nil, fmt.Errorf("error listing machine objects: %v", err)
185+
return nil, fmt.Errorf("error listing machine objects in namespace %q: %v", namespace, err)
153186
}
154187

155188
for i := 0; i < len(machineslist.Items); i++ {
@@ -158,46 +191,52 @@ func (c *clusterClient) GetMachineObjects() ([]*clusterv1.Machine, error) {
158191
return machines, nil
159192
}
160193

194+
func (c *clusterClient) GetMachineObjects() ([]*clusterv1.Machine, error) {
195+
// TODO: Iterate over all namespaces where we could have Cluster API Objects https://github.com/kubernetes-sigs/cluster-api/issues/252
196+
return c.GetMachineObjectsInNamespace(apiv1.NamespaceDefault)
197+
}
198+
161199
func (c *clusterClient) CreateClusterObject(cluster *clusterv1.Cluster) error {
162-
// TODO: Support specific namespaces https://github.com/kubernetes-sigs/cluster-api/issues/252
163-
_, err := c.clientSet.ClusterV1alpha1().Clusters(apiv1.NamespaceDefault).Create(cluster)
200+
namespace := c.configOverrides.Context.Namespace
201+
if cluster.Namespace != "" {
202+
namespace = cluster.Namespace
203+
}
204+
205+
_, err := c.clientSet.ClusterV1alpha1().Clusters(namespace).Create(cluster)
164206
if err != nil {
165-
return fmt.Errorf("error creating cluster: %v", err)
207+
return fmt.Errorf("error creating cluster in namespace %v: %v", namespace, err)
166208
}
167209
return err
168210
}
169211

170-
func (c *clusterClient) CreateMachineDeploymentObjects(deployments []*clusterv1.MachineDeployment) error {
171-
// TODO: Support specific namespaces https://github.com/kubernetes-sigs/cluster-api/issues/252
212+
func (c *clusterClient) CreateMachineDeploymentObjects(deployments []*clusterv1.MachineDeployment, namespace string) error {
172213
for _, deploy := range deployments {
173214
// TODO: Run in parallel https://github.com/kubernetes-sigs/cluster-api/issues/258
174-
_, err := c.clientSet.ClusterV1alpha1().MachineDeployments(apiv1.NamespaceDefault).Create(deploy)
215+
_, err := c.clientSet.ClusterV1alpha1().MachineDeployments(namespace).Create(deploy)
175216
if err != nil {
176-
return fmt.Errorf("error creating a machine deployment object: %v", err)
217+
return fmt.Errorf("error creating a machine deployment object in namespace %q: %v", namespace, err)
177218
}
178219
}
179220
return nil
180221
}
181222

182-
func (c *clusterClient) CreateMachineSetObjects(machineSets []*clusterv1.MachineSet) error {
183-
// TODO: Support specific namespaces https://github.com/kubernetes-sigs/cluster-api/issues/252
223+
func (c *clusterClient) CreateMachineSetObjects(machineSets []*clusterv1.MachineSet, namespace string) error {
184224
for _, ms := range machineSets {
185225
// TODO: Run in parallel https://github.com/kubernetes-sigs/cluster-api/issues/258
186-
_, err := c.clientSet.ClusterV1alpha1().MachineSets(apiv1.NamespaceDefault).Create(ms)
226+
_, err := c.clientSet.ClusterV1alpha1().MachineSets(namespace).Create(ms)
187227
if err != nil {
188-
return fmt.Errorf("error creating a machine set object: %v", err)
228+
return fmt.Errorf("error creating a machine set object in namespace %q: %v", namespace, err)
189229
}
190230
}
191231
return nil
192232
}
193233

194-
func (c *clusterClient) CreateMachineObjects(machines []*clusterv1.Machine) error {
195-
// TODO: Support specific namespaces https://github.com/kubernetes-sigs/cluster-api/issues/252
234+
func (c *clusterClient) CreateMachineObjects(machines []*clusterv1.Machine, namespace string) error {
196235
for _, machine := range machines {
197236
// TODO: Run in parallel https://github.com/kubernetes-sigs/cluster-api/issues/258
198-
createdMachine, err := c.clientSet.ClusterV1alpha1().Machines(apiv1.NamespaceDefault).Create(machine)
237+
createdMachine, err := c.clientSet.ClusterV1alpha1().Machines(namespace).Create(machine)
199238
if err != nil {
200-
return fmt.Errorf("error creating a machine object: %v", err)
239+
return fmt.Errorf("error creating a machine object in namespace %v: %v", namespace, err)
201240
}
202241
err = waitForMachineReady(c.clientSet, createdMachine)
203242
if err != nil {
@@ -208,70 +247,81 @@ func (c *clusterClient) CreateMachineObjects(machines []*clusterv1.Machine) erro
208247
}
209248

210249
func (c *clusterClient) DeleteClusterObjects() error {
211-
err := c.clientSet.ClusterV1alpha1().Clusters(apiv1.NamespaceDefault).DeleteCollection(newDeleteOptions(), metav1.ListOptions{})
250+
return c.DeleteClusterObjectsInNamespace(apiv1.NamespaceDefault)
251+
}
252+
253+
func (c *clusterClient) DeleteClusterObjectsInNamespace(namespace string) error {
254+
err := c.clientSet.ClusterV1alpha1().Clusters(namespace).DeleteCollection(newDeleteOptions(), metav1.ListOptions{})
212255
if err != nil {
213-
return fmt.Errorf("error deleting cluster objects: %v", err)
256+
return fmt.Errorf("error deleting cluster objects in namespace %q: %v", namespace, err)
214257
}
215258
err = c.waitForClusterDelete()
216259
if err != nil {
217-
return fmt.Errorf("error waiting for cluster(s) deletion to complete: %v", err)
260+
return fmt.Errorf("error waiting for cluster(s) deletion to complete in namespace %q: %v", namespace, err)
218261
}
219262
return nil
220263
}
221264

222265
func (c *clusterClient) DeleteMachineDeploymentObjects() error {
223-
err := c.clientSet.ClusterV1alpha1().MachineDeployments(apiv1.NamespaceDefault).DeleteCollection(newDeleteOptions(), metav1.ListOptions{})
266+
return c.DeleteMachineDeploymentObjectsInNamespace(apiv1.NamespaceDefault)
267+
}
268+
269+
func (c *clusterClient) DeleteMachineDeploymentObjectsInNamespace(namespace string) error {
270+
err := c.clientSet.ClusterV1alpha1().MachineDeployments(namespace).DeleteCollection(newDeleteOptions(), metav1.ListOptions{})
224271
if err != nil {
225-
return fmt.Errorf("error deleting machine deployment objects: %v", err)
272+
return fmt.Errorf("error deleting machine deployment objects in namespace %q: %v", namespace, err)
226273
}
227274
err = c.waitForMachineDeploymentsDelete()
228275
if err != nil {
229-
return fmt.Errorf("error waiting for machine deployment(s) deletion to complete: %v", err)
276+
return fmt.Errorf("error waiting for machine deployment(s) deletion to complete in namespace %q: %v", namespace, err)
230277
}
231278
return nil
232279
}
233280

234281
func (c *clusterClient) DeleteMachineSetObjects() error {
235-
err := c.clientSet.ClusterV1alpha1().MachineSets(apiv1.NamespaceDefault).DeleteCollection(newDeleteOptions(), metav1.ListOptions{})
282+
return c.DeleteMachineSetObjectsInNamespace(apiv1.NamespaceDefault)
283+
}
284+
285+
func (c *clusterClient) DeleteMachineSetObjectsInNamespace(namespace string) error {
286+
err := c.clientSet.ClusterV1alpha1().MachineSets(namespace).DeleteCollection(newDeleteOptions(), metav1.ListOptions{})
236287
if err != nil {
237-
return fmt.Errorf("error deleting machine set objects: %v", err)
288+
return fmt.Errorf("error deleting machine set objects in namespace %q: %v", namespace, err)
238289
}
239290
err = c.waitForMachineSetsDelete()
240291
if err != nil {
241-
return fmt.Errorf("error waiting for machine set(s) deletion to complete: %v", err)
292+
return fmt.Errorf("error waiting for machine set(s) deletion to complete in namespace %q: %v", namespace, err)
242293
}
243294
return nil
244295
}
245296

246297
func (c *clusterClient) DeleteMachineObjects() error {
247-
err := c.clientSet.ClusterV1alpha1().Machines(apiv1.NamespaceDefault).DeleteCollection(newDeleteOptions(), metav1.ListOptions{})
298+
return c.DeleteMachineObjectsInNamespace(apiv1.NamespaceDefault)
299+
}
300+
301+
func (c *clusterClient) DeleteMachineObjectsInNamespace(namespace string) error {
302+
err := c.clientSet.ClusterV1alpha1().Machines(namespace).DeleteCollection(newDeleteOptions(), metav1.ListOptions{})
248303
if err != nil {
249-
return fmt.Errorf("error deleting machine objects: %v", err)
304+
return fmt.Errorf("error deleting machine objects in namespace %q: %v", namespace, err)
250305
}
251306
err = c.waitForMachinesDelete()
252307
if err != nil {
253-
return fmt.Errorf("error waiting for machine(s) deletion to complete: %v", err)
308+
return fmt.Errorf("error waiting for machine(s) deletion to complete in namespace %q: %v", namespace, err)
254309
}
255310
return nil
256311
}
257312

258313
func newDeleteOptions() *metav1.DeleteOptions {
259-
propogationPolicy := metav1.DeletePropagationForeground
314+
propagationPolicy := metav1.DeletePropagationForeground
260315
return &metav1.DeleteOptions{
261-
PropagationPolicy: &propogationPolicy,
316+
PropagationPolicy: &propagationPolicy,
262317
}
263318
}
264319

265-
func (c *clusterClient) UpdateClusterObjectEndpoint(masterIP string) error {
266-
clusters, err := c.GetClusterObjects()
320+
func (c *clusterClient) UpdateClusterObjectEndpoint(masterIP, clusterName, ns string) error {
321+
cluster, err := c.GetClusterObject(clusterName, ns)
267322
if err != nil {
268323
return err
269324
}
270-
if len(clusters) != 1 {
271-
// TODO: Do not assume default namespace nor single cluster https://github.com/kubernetes-sigs/cluster-api/issues/252
272-
return fmt.Errorf("More than the one expected cluster found %v", clusters)
273-
}
274-
cluster := clusters[0]
275325
cluster.Status.APIEndpoints = append(cluster.Status.APIEndpoints,
276326
clusterv1.APIEndpoint{
277327
Host: masterIP,

0 commit comments

Comments
 (0)