Skip to content

Commit b5bfd09

Browse files
[release-2.12] ✨ Add clusterInfo updating/deleting for inventory API (#1151)
* adjust the inventory client Signed-off-by: myan <[email protected]> * add the managed cluster info controller Signed-off-by: myan <[email protected]> * finished the framework Signed-off-by: myan <[email protected]> * add delete and update Signed-off-by: myan <[email protected]> * fix the test Signed-off-by: myan <[email protected]> * fix the controller teset Signed-off-by: myan <[email protected]> * modify the delete Signed-off-by: myan <[email protected]> * remove the test Signed-off-by: myan <[email protected]> --------- Signed-off-by: myan <[email protected]> Co-authored-by: myan <[email protected]>
1 parent 0246442 commit b5bfd09

File tree

23 files changed

+721
-727
lines changed

23 files changed

+721
-727
lines changed

agent/cmd/agent/main.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -255,14 +255,14 @@ func createManager(restConfig *rest.Config, agentConfig *config.AgentConfig) (
255255
// if the transport consumer and producer is ready then the func will be invoked by the transport controller
256256
func transportCallback(mgr ctrl.Manager, agentConfig *config.AgentConfig,
257257
) controller.TransportCallback {
258-
return func(producer transport.Producer, consumer transport.Consumer) error {
258+
return func(transportClient transport.TransportClient) error {
259259
// Need this controller to update the value of clusterclaim hub.open-cluster-management.io
260260
// we use the value to decide whether install the ACM or not
261261
if err := controllers.AddHubClusterClaimController(mgr); err != nil {
262262
return fmt.Errorf("failed to add hub.open-cluster-management.io clusterclaim controller: %w", err)
263263
}
264264

265-
if err := controllers.AddCRDController(mgr, mgr.GetConfig(), agentConfig, producer, consumer); err != nil {
265+
if err := controllers.AddCRDController(mgr, mgr.GetConfig(), agentConfig, transportClient); err != nil {
266266
return fmt.Errorf("failed to add crd controller: %w", err)
267267
}
268268

agent/pkg/controllers/crd_controller.go

+18-20
Original file line numberDiff line numberDiff line change
@@ -30,30 +30,29 @@ const (
3030
var crdCtrlStarted = false
3131

3232
type crdController struct {
33-
mgr ctrl.Manager
34-
log logr.Logger
35-
restConfig *rest.Config
36-
agentConfig *config.AgentConfig
37-
producer transport.Producer
38-
consumer transport.Consumer
33+
mgr ctrl.Manager
34+
log logr.Logger
35+
restConfig *rest.Config
36+
agentConfig *config.AgentConfig
37+
transportClient transport.TransportClient
3938
}
4039

4140
func (c *crdController) Reconcile(ctx context.Context, request ctrl.Request) (ctrl.Result, error) {
4241
switch {
4342
case request.Name == clusterManagersCRDName:
44-
return c.reconcileClusterManagers(ctx, request)
43+
return c.addACMController(ctx, request)
4544
case request.Name == stackRoxCentralCRDName && c.agentConfig.EnableStackroxIntegration:
46-
return c.reconcileStackRoxCentrals()
45+
return c.addStackRoxCentrals()
4746
default:
4847
return ctrl.Result{}, nil
4948
}
5049
}
5150

52-
func (c *crdController) reconcileClusterManagers(ctx context.Context, request ctrl.Request) (ctrl.Result, error) {
51+
func (c *crdController) addACMController(ctx context.Context, request ctrl.Request) (ctrl.Result, error) {
5352
reqLogger := c.log.WithValues("Request.Namespace", request.Namespace, "Request.Name", request.Name)
5453
reqLogger.V(2).Info("crd controller", "NamespacedName:", request.NamespacedName)
5554

56-
if err := statusController.AddControllers(ctx, c.mgr, c.producer, c.agentConfig); err != nil {
55+
if err := statusController.AddControllers(ctx, c.mgr, c.transportClient, c.agentConfig); err != nil {
5756
return ctrl.Result{}, fmt.Errorf("failed to add status syncer: %w", err)
5857
}
5958

@@ -63,7 +62,7 @@ func (c *crdController) reconcileClusterManagers(ctx context.Context, request ct
6362
}
6463

6564
// add spec controllers
66-
if err := specController.AddToManager(ctx, c.mgr, c.consumer, c.agentConfig); err != nil {
65+
if err := specController.AddToManager(ctx, c.mgr, c.transportClient.GetConsumer(), c.agentConfig); err != nil {
6766
return ctrl.Result{}, fmt.Errorf("failed to add spec syncer: %w", err)
6867
}
6968
reqLogger.V(2).Info("add spec controllers to manager")
@@ -81,15 +80,15 @@ func (c *crdController) reconcileClusterManagers(ctx context.Context, request ct
8180
return ctrl.Result{}, nil
8281
}
8382

84-
func (c *crdController) reconcileStackRoxCentrals() (result ctrl.Result, err error) {
83+
func (c *crdController) addStackRoxCentrals() (result ctrl.Result, err error) {
8584
c.log.Info("Detected the presence of the StackRox central CRD")
8685

8786
// Create the object that polls the StackRox API and publishes the message, then add it to the controller
8887
// manager so that it will be started automatically.
8988
syncer, err := security.NewStackRoxSyncer().
9089
SetLogger(c.log.WithName("stackrox-syncer")).
9190
SetTopic(c.agentConfig.TransportConfig.KafkaCredential.StatusTopic).
92-
SetProducer(c.producer).
91+
SetProducer(c.transportClient.GetProducer()).
9392
SetKubernetesClient(c.mgr.GetClient()).
9493
SetPollInterval(c.agentConfig.StackroxPollInterval).
9594
Build()
@@ -115,7 +114,7 @@ func (c *crdController) reconcileStackRoxCentrals() (result ctrl.Result, err err
115114
// this controller is used to watch the multiclusterhub crd or clustermanager crd
116115
// if the crd exists, then add controllers to the manager dynamically
117116
func AddCRDController(mgr ctrl.Manager, restConfig *rest.Config, agentConfig *config.AgentConfig,
118-
producer transport.Producer, consumer transport.Consumer,
117+
transportClient transport.TransportClient,
119118
) error {
120119
if crdCtrlStarted {
121120
return nil
@@ -141,12 +140,11 @@ func AddCRDController(mgr ctrl.Manager, restConfig *rest.Config, agentConfig *co
141140
}),
142141
).
143142
Complete(&crdController{
144-
mgr: mgr,
145-
restConfig: restConfig,
146-
agentConfig: agentConfig,
147-
producer: producer,
148-
consumer: consumer,
149-
log: ctrl.Log.WithName("crd-controller"),
143+
mgr: mgr,
144+
restConfig: restConfig,
145+
agentConfig: agentConfig,
146+
transportClient: transportClient,
147+
log: ctrl.Log.WithName("crd-controller"),
150148
}); err != nil {
151149
return err
152150
}

agent/pkg/status/controller/controller.go

+26-11
Original file line numberDiff line numberDiff line change
@@ -24,27 +24,43 @@ import (
2424
var statusCtrlStarted = false
2525

2626
// AddControllers adds all the controllers to the Manager.
27-
func AddControllers(ctx context.Context, mgr ctrl.Manager, producer transport.Producer,
27+
func AddControllers(ctx context.Context, mgr ctrl.Manager, transportClient transport.TransportClient,
2828
agentConfig *config.AgentConfig,
2929
) error {
3030
if statusCtrlStarted {
3131
return nil
3232
}
33-
// managed cluster info
34-
if err := managedclusters.LaunchManagedClusterInfoSyncer(ctx, mgr, agentConfig, producer); err != nil {
35-
return fmt.Errorf("failed to launch managedclusterinfo syncer: %w", err)
33+
if err := agentstatusconfig.AddConfigController(mgr, agentConfig); err != nil {
34+
return fmt.Errorf("failed to add ConfigMap controller: %w", err)
3635
}
3736

38-
// if it's rest transport, skip the following controllers
39-
if agentConfig.TransportConfig.TransportType == string(transport.Rest) {
40-
statusCtrlStarted = true
41-
return nil
37+
var err error
38+
switch agentConfig.TransportConfig.TransportType {
39+
case string(transport.Kafka):
40+
err = addKafkaSyncer(ctx, mgr, transportClient.GetProducer(), agentConfig)
41+
case string(transport.Rest):
42+
err = addInventorySyncer(ctx, mgr, transportClient.GetRequester(), agentConfig)
43+
}
44+
if err != nil {
45+
return fmt.Errorf("failed to add the syncer: %w", err)
4246
}
4347

44-
if err := agentstatusconfig.AddConfigController(mgr, agentConfig); err != nil {
45-
return fmt.Errorf("failed to add ConfigMap controller: %w", err)
48+
statusCtrlStarted = true
49+
return nil
50+
}
51+
52+
func addInventorySyncer(ctx context.Context, mgr ctrl.Manager, inventoryRequester transport.Requester,
53+
agentConfig *config.AgentConfig,
54+
) error {
55+
if err := managedclusters.AddManagedClusterInfoCtrl(mgr, inventoryRequester); err != nil {
56+
return err
4657
}
58+
return nil
59+
}
4760

61+
func addKafkaSyncer(ctx context.Context, mgr ctrl.Manager, producer transport.Producer,
62+
agentConfig *config.AgentConfig,
63+
) error {
4864
// managed cluster
4965
if err := managedclusters.LaunchManagedClusterSyncer(ctx, mgr, agentConfig, producer); err != nil {
5066
return fmt.Errorf("failed to launch managedcluster syncer: %w", err)
@@ -95,6 +111,5 @@ func AddControllers(ctx context.Context, mgr ctrl.Manager, producer transport.Pr
95111
agentConfig.TransportConfig.KafkaCredential.StatusTopic); err != nil {
96112
return fmt.Errorf("failed to launch time filter: %w", err)
97113
}
98-
99114
return nil
100115
}

pkg/transport/inventory/transfer/k8s_cluster_test.go agent/pkg/status/controller/managedclusters/k8s_cluster_test.go

+38-25
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,35 @@
1-
package transfer
1+
package managedclusters
22

33
import (
44
"testing"
55

66
kessel "github.com/project-kessel/inventory-api/api/kessel/inventory/v1beta1/resources"
77
clusterinfov1beta1 "github.com/stolostron/cluster-lifecycle-api/clusterinfo/v1beta1"
88
"github.com/stretchr/testify/assert"
9+
"k8s.io/apimachinery/pkg/api/resource"
910
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1011
clusterv1 "open-cluster-management.io/api/cluster/v1"
1112
)
1213

13-
func TestGetK8SCluster(t *testing.T) {
14+
func TestGetK8SClusterInfo(t *testing.T) {
1415
clusterInfo := createMockClusterInfo("test-cluster", clusterinfov1beta1.KubeVendorOpenShift, "4.10.0",
1516
clusterinfov1beta1.CloudVendorAWS)
1617

1718
// Call the function
18-
result := GetK8SCluster(clusterInfo, "guest")
19+
k8sCluster := GetK8SCluster(clusterInfo, "guest")
1920

2021
// Assert the results
21-
assert.NotNil(t, result)
22-
assert.Equal(t, "k8s-cluster", result.K8SCluster.Metadata.ResourceType)
23-
assert.Equal(t, kessel.ReporterData_ACM, result.K8SCluster.ReporterData.ReporterType)
24-
assert.Equal(t, "https://api.test-cluster.example.com", result.K8SCluster.ReporterData.ApiHref)
25-
assert.Equal(t, "https://console.test-cluster.example.com", result.K8SCluster.ReporterData.ConsoleHref)
26-
assert.Equal(t, "test-cluster-id", result.K8SCluster.ResourceData.ExternalClusterId)
27-
assert.Equal(t, "1.23.0", result.K8SCluster.ResourceData.KubeVersion)
28-
assert.Equal(t, kessel.K8SClusterDetail_READY, result.K8SCluster.ResourceData.ClusterStatus)
29-
assert.Equal(t, kessel.K8SClusterDetail_AWS_UPI, result.K8SCluster.ResourceData.CloudPlatform)
30-
assert.Equal(t, kessel.K8SClusterDetail_OPENSHIFT, result.K8SCluster.ResourceData.KubeVendor)
31-
assert.Equal(t, "4.10.0", result.K8SCluster.ResourceData.VendorVersion)
22+
assert.NotNil(t, k8sCluster)
23+
assert.Equal(t, "k8s-cluster", k8sCluster.Metadata.ResourceType)
24+
assert.Equal(t, kessel.ReporterData_ACM, k8sCluster.ReporterData.ReporterType)
25+
assert.Equal(t, "https://api.test-cluster.example.com", k8sCluster.ReporterData.ApiHref)
26+
assert.Equal(t, "https://console.test-cluster.example.com", k8sCluster.ReporterData.ConsoleHref)
27+
assert.Equal(t, "test-cluster-id", k8sCluster.ResourceData.ExternalClusterId)
28+
assert.Equal(t, "1.23.0", k8sCluster.ResourceData.KubeVersion)
29+
assert.Equal(t, kessel.K8SClusterDetail_READY, k8sCluster.ResourceData.ClusterStatus)
30+
assert.Equal(t, kessel.K8SClusterDetail_AWS_UPI, k8sCluster.ResourceData.CloudPlatform)
31+
assert.Equal(t, kessel.K8SClusterDetail_OPENSHIFT, k8sCluster.ResourceData.KubeVendor)
32+
assert.Equal(t, "4.10.0", k8sCluster.ResourceData.VendorVersion)
3233
}
3334

3435
func TestKubeVendorK8SCluster(t *testing.T) {
@@ -70,19 +71,19 @@ func TestKubeVendorK8SCluster(t *testing.T) {
7071

7172
for _, tc := range testCases {
7273
t.Run(tc.name, func(t *testing.T) {
73-
result := GetK8SCluster(tc.clusterInfo, "guest")
74+
k8sCluster := GetK8SCluster(tc.clusterInfo, "guest")
7475

75-
assert.NotNil(t, result)
76-
assert.Equal(t, tc.expectedVendor, result.K8SCluster.ResourceData.KubeVendor)
77-
assert.Equal(t, tc.expectedVersion, result.K8SCluster.ResourceData.VendorVersion)
76+
assert.NotNil(t, k8sCluster)
77+
assert.Equal(t, tc.expectedVendor, k8sCluster.ResourceData.KubeVendor)
78+
assert.Equal(t, tc.expectedVersion, k8sCluster.ResourceData.VendorVersion)
7879
// Add more assertions for common fields
79-
assert.Equal(t, "k8s-cluster", result.K8SCluster.Metadata.ResourceType)
80-
assert.Equal(t, kessel.ReporterData_ACM, result.K8SCluster.ReporterData.ReporterType)
81-
assert.Equal(t, "https://api.test-cluster.example.com", result.K8SCluster.ReporterData.ApiHref)
82-
assert.Equal(t, "https://console.test-cluster.example.com", result.K8SCluster.ReporterData.ConsoleHref)
83-
assert.Equal(t, "test-cluster-id", result.K8SCluster.ResourceData.ExternalClusterId)
84-
assert.Equal(t, "1.23.0", result.K8SCluster.ResourceData.KubeVersion)
85-
assert.Equal(t, kessel.K8SClusterDetail_READY, result.K8SCluster.ResourceData.ClusterStatus)
80+
assert.Equal(t, "k8s-cluster", k8sCluster.Metadata.ResourceType)
81+
assert.Equal(t, kessel.ReporterData_ACM, k8sCluster.ReporterData.ReporterType)
82+
assert.Equal(t, "https://api.test-cluster.example.com", k8sCluster.ReporterData.ApiHref)
83+
assert.Equal(t, "https://console.test-cluster.example.com", k8sCluster.ReporterData.ConsoleHref)
84+
assert.Equal(t, "test-cluster-id", k8sCluster.ResourceData.ExternalClusterId)
85+
assert.Equal(t, "1.23.0", k8sCluster.ResourceData.KubeVersion)
86+
assert.Equal(t, kessel.K8SClusterDetail_READY, k8sCluster.ResourceData.ClusterStatus)
8687
})
8788
}
8889
}
@@ -109,6 +110,18 @@ func createMockClusterInfo(name string, kubeVendor clusterinfov1beta1.KubeVendor
109110
Status: metav1.ConditionTrue,
110111
},
111112
},
113+
NodeList: []clusterinfov1beta1.NodeStatus{
114+
{
115+
Name: "ip-10-0-14-217.ec2.internal",
116+
Capacity: clusterinfov1beta1.ResourceList{
117+
clusterv1.ResourceCPU: resource.MustParse("16"),
118+
clusterv1.ResourceMemory: resource.MustParse("64453796Ki"),
119+
},
120+
Labels: map[string]string{
121+
"node.kubernetes.io/instance-type": "m6a.4xlarge",
122+
},
123+
},
124+
},
112125
},
113126
}
114127

0 commit comments

Comments
 (0)