Skip to content

Commit

Permalink
Automate the creation of the permissions needed by k8sattributes. (op…
Browse files Browse the repository at this point in the history
…en-telemetry#2396)

* Automate the creation of the RBAC resources for the k8sattributes processor

Signed-off-by: Israel Blancas <[email protected]>

* Add missing permission

Signed-off-by: Israel Blancas <[email protected]>

* Add missing changelog

Signed-off-by: Israel Blancas <[email protected]>

---------

Signed-off-by: Israel Blancas <[email protected]>
  • Loading branch information
iblancasa authored Jan 12, 2024
1 parent b3da6b2 commit 42e9d03
Show file tree
Hide file tree
Showing 2 changed files with 125 additions and 0 deletions.
16 changes: 16 additions & 0 deletions .chloggen/2395-automate-permissions-k8sattribures.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
change_type: enhancement

# The name of the component, or a single word describing the area of concern, (e.g. operator, target allocator, github action)
component: operator

# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: Automate the creation of the permissions needed by the k8sattributes processor

# One or more tracking issues related to the change
issues: [2395]

# (Optional) One or more lines of additional information to render under the primary note.
# These lines will be padded with 2 spaces and then inserted directly into the document.
# Use pipe (|) for multiline entries.
subtext:
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
// Copyright The OpenTelemetry Authors
//
// 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 processor

import (
"fmt"
"strings"

"github.com/go-logr/logr"
rbacv1 "k8s.io/api/rbac/v1"
)

var _ ProcessorParser = &K8sAttributesParser{}

const (
parserNameK8sAttributes = "__k8sattributes"
)

// PrometheusExporterParser parses the configuration for k8sattributes processor.
type K8sAttributesParser struct {
config map[interface{}]interface{}
logger logr.Logger
name string
}

// NewK8sAttributesParser builds a new parser k8sattributes processor.
func NewK8sAttributesParser(logger logr.Logger, name string, config map[interface{}]interface{}) ProcessorParser {
return &K8sAttributesParser{
logger: logger,
name: name,
config: config,
}
}

// ParserName returns the name of this parser.
func (o *K8sAttributesParser) ParserName() string {
return parserNameK8sAttributes
}

func (o *K8sAttributesParser) GetRBACRules() []rbacv1.PolicyRule {
var prs []rbacv1.PolicyRule

extractCfg, ok := o.config["extract"]
if !ok {
return prs
}

metadataCfg, ok := extractCfg.(map[interface{}]interface{})["metadata"]
if !ok {
return prs
}

metadata, ok := metadataCfg.([]interface{})
if !ok {
return prs
}

// This one needs to be added always
policy := rbacv1.PolicyRule{
APIGroups: []string{""},
Resources: []string{"pods", "namespaces"},
Verbs: []string{"get", "watch", "list"},
}
prs = append(prs, policy)

for _, m := range metadata {
metadataField := fmt.Sprint(m)
if metadataField == "k8s.deployment.uid" || metadataField == "k8s.deployment.name" {
prs = append(prs,
rbacv1.PolicyRule{
APIGroups: []string{"apps"},
Resources: []string{"replicasets"},
Verbs: []string{"get", "watch", "list"},
},
rbacv1.PolicyRule{
APIGroups: []string{"extensions"},
Resources: []string{"replicasets"},
Verbs: []string{"get", "watch", "list"},
},
)
} else if strings.Contains(metadataField, "k8s.node") {
prs = append(prs,
rbacv1.PolicyRule{
APIGroups: []string{""},
Resources: []string{"nodes"},
Verbs: []string{"get", "watch", "list"},
},
)
}
}

return prs
}

func init() {
Register("k8sattributes", NewK8sAttributesParser)
}

0 comments on commit 42e9d03

Please sign in to comment.