Skip to content

Commit

Permalink
Added RTE metrics package and manifests
Browse files Browse the repository at this point in the history
We will use the pkg/metrics to generate the needed metrics manifests to be applied by the operator.

Signed-off-by: Ronny Baturov <[email protected]>
  • Loading branch information
rbaturov committed Oct 6, 2024
1 parent 34f7221 commit 4751257
Show file tree
Hide file tree
Showing 8 changed files with 285 additions and 19 deletions.
20 changes: 11 additions & 9 deletions controllers/numaresourcesoperator_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ import (
"github.com/openshift-kni/numaresources-operator/pkg/hash"
"github.com/openshift-kni/numaresources-operator/pkg/images"
"github.com/openshift-kni/numaresources-operator/pkg/loglevel"
rtemetricsmanifests "github.com/openshift-kni/numaresources-operator/pkg/metrics/manifests/monitor"
"github.com/openshift-kni/numaresources-operator/pkg/objectnames"
apistate "github.com/openshift-kni/numaresources-operator/pkg/objectstate/api"
rtestate "github.com/openshift-kni/numaresources-operator/pkg/objectstate/rte"
Expand All @@ -70,15 +71,16 @@ const numaResourcesRetryPeriod = 1 * time.Minute
// NUMAResourcesOperatorReconciler reconciles a NUMAResourcesOperator object
type NUMAResourcesOperatorReconciler struct {
client.Client
Scheme *runtime.Scheme
Platform platform.Platform
APIManifests apimanifests.Manifests
RTEManifests rtemanifests.Manifests
Namespace string
Images images.Data
ImagePullPolicy corev1.PullPolicy
Recorder record.EventRecorder
ForwardMCPConds bool
Scheme *runtime.Scheme
Platform platform.Platform
APIManifests apimanifests.Manifests
RTEManifests rtemanifests.Manifests
RTEMetricsManifests rtemetricsmanifests.Manifests
Namespace string
Images images.Data
ImagePullPolicy corev1.PullPolicy
Recorder record.EventRecorder
ForwardMCPConds bool
}

// TODO: narrow down
Expand Down
27 changes: 17 additions & 10 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ import (
"github.com/openshift-kni/numaresources-operator/internal/api/features"
"github.com/openshift-kni/numaresources-operator/pkg/hash"
"github.com/openshift-kni/numaresources-operator/pkg/images"
rtemetricsmanifests "github.com/openshift-kni/numaresources-operator/pkg/metrics/manifests/monitor"
"github.com/openshift-kni/numaresources-operator/pkg/numaresourcesscheduler/controlplane"
schedmanifests "github.com/openshift-kni/numaresources-operator/pkg/numaresourcesscheduler/manifests/sched"
rteupdate "github.com/openshift-kni/numaresources-operator/pkg/objectupdate/rte"
Expand Down Expand Up @@ -254,18 +255,24 @@ func main() {
klog.ErrorS(err, "unable to render RTE manifests", "controller", "NUMAResourcesOperator")
os.Exit(1)
}
rteMetricsManifests, err := rtemetricsmanifests.GetManifests(namespace)
if err != nil {
klog.ErrorS(err, "unable to load the RTE metrics manifests")
os.Exit(1)
}

if err = (&controllers.NUMAResourcesOperatorReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorderFor("numaresources-controller"),
APIManifests: apiManifests,
RTEManifests: rteManifestsRendered,
Platform: clusterPlatform,
Images: imgs,
ImagePullPolicy: pullPolicy,
Namespace: namespace,
ForwardMCPConds: params.enableMCPCondsForward,
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorderFor("numaresources-controller"),
APIManifests: apiManifests,
RTEManifests: rteManifestsRendered,
RTEMetricsManifests: rteMetricsManifests,
Platform: clusterPlatform,
Images: imgs,
ImagePullPolicy: pullPolicy,
Namespace: namespace,
ForwardMCPConds: params.enableMCPCondsForward,
}).SetupWithManager(mgr); err != nil {
klog.ErrorS(err, "unable to create controller", "controller", "NUMAResourcesOperator")
os.Exit(1)
Expand Down
85 changes: 85 additions & 0 deletions pkg/metrics/manifests/manifests.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
/*
* Copyright 2024 Red Hat, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package manifests

import (
"embed"
"fmt"
"path/filepath"

corev1 "k8s.io/api/core/v1"
rbacv1 "k8s.io/api/rbac/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/kubernetes/scheme"
)

//go:embed yaml
var src embed.FS

func Service(namespace string) (*corev1.Service, error) {
obj, err := loadObject(filepath.Join("yaml", "service.yaml"))
if err != nil {
return nil, err
}

service, ok := obj.(*corev1.Service)
if !ok {
return nil, fmt.Errorf("unexpected type, got %t", obj)
}

if namespace != "" {
service.Namespace = namespace
}
return service, nil
}

func ClusterRoleBinding(namespace string) (*rbacv1.ClusterRoleBinding, error) {
return loadClusterRoleBinding("clusterrolebinding.yaml", namespace)
}

func loadClusterRoleBinding(crbName, namespace string) (*rbacv1.ClusterRoleBinding, error) {
obj, err := loadObject(filepath.Join("yaml", crbName))
if err != nil {
return nil, err
}

crb, ok := obj.(*rbacv1.ClusterRoleBinding)
if !ok {
return nil, fmt.Errorf("unexpected type, got %t", obj)
}
for idx := 0; idx < len(crb.Subjects); idx++ {
crb.Subjects[idx].Namespace = namespace
}
return crb, nil
}

func deserializeObjectFromData(data []byte) (runtime.Object, error) {
decode := scheme.Codecs.UniversalDeserializer().Decode
obj, _, err := decode(data, nil, nil)
if err != nil {
return nil, err
}
return obj, nil
}

func loadObject(path string) (runtime.Object, error) {
data, err := src.ReadFile(path)
if err != nil {
return nil, err
}
return deserializeObjectFromData(data)
}
30 changes: 30 additions & 0 deletions pkg/metrics/manifests/manifests_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
* Copyright 2024 Red Hat, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package manifests

import (
"testing"
)

func TestLoad(t *testing.T) {
if obj, err := Service(""); obj == nil || err != nil {
t.Errorf("Service() failed: err=%v", err)
}
if obj, err := ClusterRoleBinding(""); obj == nil || err != nil {
t.Errorf("ClusterRoleBinding() failed: err=%v", err)
}
}
60 changes: 60 additions & 0 deletions pkg/metrics/manifests/monitor/monitor.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/*
* Copyright 2024 Red Hat, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package sched

import (
corev1 "k8s.io/api/core/v1"
rbacv1 "k8s.io/api/rbac/v1"
"sigs.k8s.io/controller-runtime/pkg/client"
"github.com/openshift-kni/numaresources-operator/pkg/metrics/manifests"
)

type Manifests struct {
Service *corev1.Service
ClusterRoleBinding *rbacv1.ClusterRoleBinding
}

func (mf Manifests) ToObjects() []client.Object {
return []client.Object{
mf.Service,
mf.ClusterRoleBinding,
}
}

func (mf Manifests) Clone() Manifests {
return Manifests{
Service: mf.Service.DeepCopy(),
ClusterRoleBinding: mf.ClusterRoleBinding.DeepCopy(),
}
}

func GetManifests(namespace string) (Manifests, error) {
var err error
mf := Manifests{}

mf.Service, err = manifests.Service(namespace)
if err != nil {
return mf, err
}

mf.ClusterRoleBinding, err = manifests.ClusterRoleBinding(namespace)
if err != nil {
return mf, err
}

return mf, nil
}
53 changes: 53 additions & 0 deletions pkg/metrics/manifests/monitor/monitor_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/*
* Copyright 2024 Red Hat, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package sched

import (
"reflect"
"testing"
)

func TestGetManifests(t *testing.T) {
mf, err := GetManifests("")
if err != nil {
t.Fatalf("GetManifests() failed: err=%v", err)
}

for _, obj := range mf.ToObjects() {
if obj == nil {
t.Fatalf("GetManifests(): loaded nil manifest")
}
}
}

func TestCloneManifests(t *testing.T) {
mf, err := GetManifests("")
if err != nil {
t.Fatalf("GetManifests() failed: err=%v", err)
}

mf2 := mf.Clone()
if !reflect.DeepEqual(mf, mf2) {
t.Fatalf("Clone() returned manifests failing DeepEqual")
}

for _, obj := range mf2.ToObjects() {
if obj == nil {
t.Fatalf("Clone(): produced nil manifest")
}
}
}
12 changes: 12 additions & 0 deletions pkg/metrics/manifests/yaml/clusterrolebinding.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: rte-proxy-rolebinding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: numaresources-proxy-role
subjects:
- kind: ServiceAccount
name: rte
namespace: numaresources
17 changes: 17 additions & 0 deletions pkg/metrics/manifests/yaml/service.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.openshift.io/serving-cert-secret-name: rte-secret-kube-rbac-proxy-tls
labels:
name: resource-topology
name: rte-metrics-service
namespace: numaresources
spec:
ports:
- name: https
port: 8443
protocol: TCP
targetPort: https
selector:
name: resource-topology

0 comments on commit 4751257

Please sign in to comment.