containerd/vendor/github.com/intel/goresctrl/pkg/rdt/kubernetes.go
Markus Lehtonen eba1048163 Update dependencies
Signed-off-by: Markus Lehtonen <markus.lehtonen@intel.com>
2022-01-04 09:27:54 +02:00

75 lines
2.8 KiB
Go

/*
Copyright 2021 Intel Corporation
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 rdt
import (
"fmt"
"github.com/intel/goresctrl/pkg/kubernetes"
)
const (
// RdtContainerAnnotation is the CRI level container annotation for setting
// the RDT class (CLOS) of a container
RdtContainerAnnotation = "io.kubernetes.cri.rdt-class"
// RdtPodAnnotation is a Pod annotation for setting the RDT class (CLOS) of
// all containers of the pod
RdtPodAnnotation = "rdt.resources.beta.kubernetes.io/pod"
// RdtPodAnnotationContainerPrefix is prefix for per-container Pod annotation
// for setting the RDT class (CLOS) of one container of the pod
RdtPodAnnotationContainerPrefix = "rdt.resources.beta.kubernetes.io/container."
)
// ContainerClassFromAnnotations determines the effective RDT class of a
// container from the Pod annotations and CRI level container annotations of a
// container. Verifies that the class exists in goresctrl configuration and that
// it is allowed to be used.
func ContainerClassFromAnnotations(containerName string, containerAnnotations, podAnnotations map[string]string) (string, error) {
clsName, clsOrigin := kubernetes.ContainerClassFromAnnotations(
RdtContainerAnnotation, RdtPodAnnotation, RdtPodAnnotationContainerPrefix,
containerName, containerAnnotations, podAnnotations)
if clsOrigin != kubernetes.ClassOriginNotFound {
if rdt == nil {
return "", fmt.Errorf("RDT not initialized, class %q not available", clsName)
}
// Verify validity of class name
if !IsQualifiedClassName(clsName) {
return "", fmt.Errorf("unqualified RDT class name %q", clsName)
}
// If RDT has been initialized we check that the class exists
if _, ok := rdt.getClass(clsName); !ok {
return "", fmt.Errorf("RDT class %q does not exist in configuration", clsName)
}
// If classes have been configured by goresctrl
if clsConf, ok := rdt.conf.Classes[unaliasClassName(clsName)]; ok {
// Check that the class is allowed
if clsOrigin == kubernetes.ClassOriginPodAnnotation && clsConf.Kubernetes.DenyPodAnnotation {
return "", fmt.Errorf("RDT class %q not allowed from Pod annotations", clsName)
} else if clsOrigin == kubernetes.ClassOriginContainerAnnotation && clsConf.Kubernetes.DenyContainerAnnotation {
return "", fmt.Errorf("RDT class %q not allowed from Container annotation", clsName)
}
}
}
return clsName, nil
}