Skip to content

Commit e51e8e4

Browse files
Operator to fetch region and IaaS provider for IPI cluster (#45)
* Operator to fetch region and IaaS provider for IPI cluster * move static string to contants * fix constants
1 parent dd2ec3a commit e51e8e4

File tree

8 files changed

+96
-25
lines changed

8 files changed

+96
-25
lines changed

config/rbac/role.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,13 @@ rules:
128128
- deployments/finalizers
129129
verbs:
130130
- update
131+
- apiGroups:
132+
- config.openshift.io
133+
resources:
134+
- infrastructures
135+
verbs:
136+
- get
137+
- list
131138
- apiGroups:
132139
- monitoring.coreos.com
133140
resources:

controllers/constants/constants.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,9 @@ const (
9898
DefaultNamespace = "default"
9999
ReconcilationTime = 5 * time.Minute
100100
TransportEndpointError = "transport endpoint is not connected"
101+
102+
InfraProviderPlatformIBM = "IBMCloud"
103+
InfraProviderType = "VPC"
101104
)
102105

103106
var CommonCSIResourceLabels = map[string]string{

controllers/ibmobjectcsi_controller.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ type IBMObjectCSIReconciler struct {
8888
//+kubebuilder:rbac:groups=apiextensions.k8s.io,resources=customresourcedefinitions,verbs=create;list;watch;delete
8989
//+kubebuilder:rbac:groups=objectdriver.csi.ibm.com,resources=*,verbs=*
9090
//+kubebuilder:rbac:groups=storage.k8s.io,resources=storageclasses,verbs=create;get;list;watch;delete;update
91+
//+kubebuilder:rbac:groups=config.openshift.io,resources=infrastructures,verbs=get;list
9192

9293
// Reconcile is part of the main kubernetes reconciliation loop which aims to
9394
// move the current state of the cluster closer to the desired state.

controllers/ibmobjectcsi_controller_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -898,7 +898,7 @@ func TestIBMObjectCSIReconcile(t *testing.T) {
898898
Client: client,
899899
Scheme: scheme,
900900
// Recorder: record.NewFakeRecorder(0),
901-
ControllerHelper: common.NewControllerHelper(client),
901+
ControllerHelper: common.NewControllerHelper(client, TestLog),
902902
}
903903

904904
res, err := ibmObjectCSIReconciler.Reconcile(TestCtx, ibmObjectCSIReconcileRequest)

controllers/util/common/common.go

Lines changed: 75 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/IBM/ibm-object-csi-driver-operator/controllers/internal/crutils"
1111
"github.com/IBM/ibm-object-csi-driver-operator/controllers/util"
1212
"github.com/go-logr/logr"
13+
openshiftclient "github.com/openshift/client-go/config/clientset/versioned"
1314
corev1 "k8s.io/api/core/v1"
1415
rbacv1 "k8s.io/api/rbac/v1"
1516
storagev1 "k8s.io/api/storage/v1"
@@ -18,6 +19,7 @@ import (
1819
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1920
"k8s.io/apimachinery/pkg/types"
2021
"k8s.io/client-go/kubernetes"
22+
"k8s.io/client-go/rest"
2123
"sigs.k8s.io/controller-runtime/pkg/client"
2224
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
2325
)
@@ -34,9 +36,10 @@ type ControllerHelper struct {
3436
}
3537

3638
// NewControllerHelper ...
37-
func NewControllerHelper(client client.Client) *ControllerHelper {
39+
func NewControllerHelper(client client.Client, logger logr.Logger) *ControllerHelper {
3840
return &ControllerHelper{
3941
Client: client,
42+
Log: logger,
4043
}
4144
}
4245

@@ -251,17 +254,24 @@ func (ch *ControllerHelper) getAccessorAndFinalizerName(instance crutils.Instanc
251254
return accessor, finalizerName, nil
252255
}
253256

254-
// Check the platform, if IBM Cloud then get Region and IaaS provider
255-
func (ch *ControllerHelper) GetIBMClusterInfo(clientset *kubernetes.Clientset) error {
257+
// Check the platform, if IBMCloud then get Region and IaaS provider
258+
// If not IBMCloud, check if it is unmanaged/IPI cluster
259+
func (ch *ControllerHelper) GetClusterInfo(inConfig rest.Config) error {
260+
logger := ch.Log.WithName("getClusterInfo")
261+
logger.Info("Checking cluster platform...")
262+
256263
var listOptions = &client.ListOptions{}
257264
var err error
258265
nodes := corev1.NodeList{}
259266

260-
logger := ch.Log.WithName("getClusterInfo")
261-
logger.Info("Checking cluster platform...")
267+
k8sClient, err := kubernetes.NewForConfig(&inConfig)
268+
if err != nil {
269+
logger.Error(err, "Unable to load cluster config")
270+
return err
271+
}
262272

263-
if clientset != nil {
264-
list, err := clientset.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{})
273+
if k8sClient != nil {
274+
list, err := k8sClient.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{})
265275
if err == nil {
266276
nodes = *list
267277
}
@@ -273,21 +283,74 @@ func (ch *ControllerHelper) GetIBMClusterInfo(clientset *kubernetes.Clientset) e
273283
return err
274284
}
275285

276-
logger.Info("Get cluster region...")
286+
logger.Info("Get IBM cluster region...")
277287
if val, ok := nodes.Items[0].Labels["ibm-cloud.kubernetes.io/region"]; ok {
278288
ch.Region = val
279-
logger.Info("Detected IBM Cluster region: ", ch.Region)
289+
logger.Info("Detected", "IBM Cluster region: ", ch.Region)
290+
} else {
291+
logger.Info("Node label 'ibm-cloud.kubernetes.io/region' not found")
280292
}
281293

282-
logger.Info("Get cluster IaaS Provider...")
294+
logger.Info("Get IBM cluster IaaS Provider...")
283295
if val, ok := nodes.Items[0].Labels["ibm-cloud.kubernetes.io/iaas-provider"]; ok {
284-
logger.Info("Detected IBM IaaS provider: ", val)
296+
logger.Info("Detected", "IBM IaaS provider: ", val)
285297
if val == "g2" {
286298
ch.IaaSProvider = constants.IaasIBMVPC
287299
} else {
288300
ch.IaaSProvider = constants.IaasIBMClassic
289301
}
290-
logger.Info("Detected endpoint type: ", ch.IaaSProvider)
302+
logger.Info("Detected", "endpoint type: ", ch.IaaSProvider)
303+
} else {
304+
logger.Info("Node label 'ibm-cloud.kubernetes.io/iaas-provider' not found")
305+
}
306+
307+
if ch.Region == "" || ch.IaaSProvider == "" {
308+
// check if it is unmanaged cluster
309+
logger.Info("Region or IaaSProvider not set. checking if it is unmanaged cluster")
310+
311+
ocClient, err := openshiftclient.NewForConfig(&inConfig)
312+
if err != nil {
313+
logger.Error(err, "Unable to load cluster config")
314+
return err
315+
}
316+
317+
infra, err := ocClient.ConfigV1().Infrastructures().Get(context.TODO(), "cluster", metav1.GetOptions{})
318+
if err != nil {
319+
logger.Error(err, "Failed to get infrastructure")
320+
return err
321+
}
322+
323+
logger.Info("cluster infrastructure", "platformStatus:", infra.Status.PlatformStatus)
324+
325+
platformType := infra.Status.PlatformStatus.Type
326+
logger.Info("Detected", "infra cloud provider platform: ", platformType)
327+
328+
if platformType == constants.InfraProviderPlatformIBM {
329+
logger.Info("Get cluster region...")
330+
region := infra.Status.PlatformStatus.IBMCloud.Location
331+
if region != "" {
332+
ch.Region = region
333+
logger.Info("Detected", "Cluster region: ", ch.Region)
334+
} else {
335+
logger.Info("cluster region not found")
336+
}
337+
338+
logger.Info("Get cluster Provider...")
339+
providerType := infra.Status.PlatformStatus.IBMCloud.ProviderType
340+
if providerType != "" {
341+
logger.Info("Detected", "IaaS provider: ", providerType)
342+
if providerType == constants.InfraProviderType {
343+
ch.IaaSProvider = constants.IaasIBMVPC
344+
} else {
345+
ch.IaaSProvider = constants.IaasIBMClassic
346+
}
347+
logger.Info("Detected", "endpoint type: ", ch.IaaSProvider)
348+
} else {
349+
logger.Info("cluster IaaS provider not found")
350+
}
351+
} else {
352+
logger.Info("cloud provider is not IBMCloud")
353+
}
291354
}
292355
return nil
293356
}

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ require (
88
github.com/imdario/mergo v0.3.16
99
github.com/onsi/ginkgo/v2 v2.19.1
1010
github.com/onsi/gomega v1.34.1
11+
github.com/openshift/client-go v0.0.0-20240528061634-b054aa794d87
1112
github.com/presslabs/controller-util v0.12.0
1213
github.com/stretchr/testify v1.9.0
1314
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56
@@ -46,6 +47,7 @@ require (
4647
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
4748
github.com/modern-go/reflect2 v1.0.2 // indirect
4849
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
50+
github.com/openshift/api v0.0.0-20240527133614-ba11c1587003 // indirect
4951
github.com/pkg/errors v0.9.1 // indirect
5052
github.com/pmezard/go-difflib v1.0.0 // indirect
5153
github.com/prometheus/client_golang v1.16.0 // indirect

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ github.com/onsi/ginkgo/v2 v2.19.1 h1:QXgq3Z8Crl5EL1WBAC98A5sEBHARrAJNzAmMxzLcRF0
8080
github.com/onsi/ginkgo/v2 v2.19.1/go.mod h1:O3DtEWQkPa/F7fBMgmZQKKsluAy8pd3rEQdrjkPb9zA=
8181
github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
8282
github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
83+
github.com/openshift/api v0.0.0-20240527133614-ba11c1587003 h1:ewhIvyXCcvH6m3U02bMFtd/DfsmOSbOCuVzon+zGu7g=
84+
github.com/openshift/api v0.0.0-20240527133614-ba11c1587003/go.mod h1:OOh6Qopf21pSzqNVCB5gomomBXb8o5sGKZxG2KNpaXM=
85+
github.com/openshift/client-go v0.0.0-20240528061634-b054aa794d87 h1:JtLhaGpSEconE+1IKmIgCOof/Len5ceG6H1pk43yv5U=
86+
github.com/openshift/client-go v0.0.0-20240528061634-b054aa794d87/go.mod h1:3IPD4U0qyovZS4EFady2kqY32m8lGcbs/Wx+yprg9z8=
8387
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
8488
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
8589
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=

main.go

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import (
2525
// to ensure that exec-entrypoint and run can make use of them.
2626
"k8s.io/apimachinery/pkg/runtime"
2727
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
28-
"k8s.io/client-go/kubernetes"
2928
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
3029
_ "k8s.io/client-go/plugin/pkg/client/auth"
3130
"k8s.io/client-go/rest"
@@ -93,24 +92,16 @@ func main() {
9392
setupLog.Error(err, "unable to start manager")
9493
os.Exit(1)
9594
}
96-
controllerHelper := common.NewControllerHelper(mgr.GetClient())
95+
controllerHelper := common.NewControllerHelper(mgr.GetClient(), setupLog)
9796

9897
// TODO: TIER Based SC Get cluster info
99-
var clstrClient *kubernetes.Clientset
10098
inConfig, err := rest.InClusterConfig()
10199
if err != nil {
102100
setupLog.Info("Get Cluster Info: Unable to load config")
103101
} else {
104-
clstrClient, err = kubernetes.NewForConfig(inConfig)
102+
err = controllerHelper.GetClusterInfo(*inConfig)
105103
if err != nil {
106-
setupLog.Info("Get Cluster Info: Unable to load config")
107-
} else {
108-
err = controllerHelper.GetIBMClusterInfo(clstrClient)
109-
if err != nil {
110-
setupLog.Info("Get Cluster Info", "warning", err)
111-
} else {
112-
setupLog.Info("Detected: ", "IaaS Provider", controllerHelper.GetIaaSProvider())
113-
}
104+
setupLog.Info("Get Cluster Info", "warning", err)
114105
}
115106
}
116107

0 commit comments

Comments
 (0)