Merge pull request #493 from rojkov/release-0.19

Upgrade to k8s v1.19.3
This commit is contained in:
Ed Bartosh 2020-11-10 16:19:38 +02:00 committed by GitHub
commit ad02fc43b8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 554 additions and 428 deletions

View File

@ -57,6 +57,7 @@ func main() {
Scheme: scheme,
MetricsBindAddress: metricsAddr,
Port: 9443,
Logger: ctrl.Log.WithName("FpgaAdmissionWebhook"),
LeaderElection: enableLeaderElection,
LeaderElectionID: "f2c6a4df.intel.com",
})
@ -73,7 +74,6 @@ func main() {
if err = (&controllers.AcceleratorFunctionReconciler{
Client: mgr.GetClient(),
Log: ctrl.Log.WithName("controllers").WithName("AcceleratorFunction"),
Scheme: mgr.GetScheme(),
PatcherManager: pm,
}).SetupWithManager(mgr); err != nil {
@ -83,7 +83,6 @@ func main() {
if err = (&controllers.FpgaRegionReconciler{
Client: mgr.GetClient(),
Log: ctrl.Log.WithName("controllers").WithName("FpgaRegion"),
Scheme: mgr.GetScheme(),
PatcherManager: pm,
}).SetupWithManager(mgr); err != nil {

View File

@ -122,7 +122,6 @@ func main() {
if err = (&fpgacontroller.AcceleratorFunctionReconciler{
Client: mgr.GetClient(),
Log: mgr.GetLogger().WithName("controllers").WithName("AcceleratorFunction"),
Scheme: mgr.GetScheme(),
PatcherManager: pm,
}).SetupWithManager(mgr); err != nil {
@ -132,7 +131,6 @@ func main() {
if err = (&fpgacontroller.FpgaRegionReconciler{
Client: mgr.GetClient(),
Log: mgr.GetLogger().WithName("controllers").WithName("FpgaRegion"),
Scheme: mgr.GetScheme(),
PatcherManager: pm,
}).SetupWithManager(mgr); err != nil {

View File

@ -26,6 +26,21 @@ rules:
- patch
- update
- watch
- apiGroups:
- coordination.k8s.io
resources:
- leases
verbs:
- create
- apiGroups:
- coordination.k8s.io
resourceNames:
- d1c7b6d5.intel.com
resources:
- leases
verbs:
- get
- update
- apiGroups:
- deviceplugin.intel.com
resources:

73
go.mod
View File

@ -5,49 +5,50 @@ go 1.15
require (
github.com/fsnotify/fsnotify v1.4.9
github.com/go-ini/ini v1.46.0
github.com/go-logr/logr v0.1.0
github.com/go-logr/logr v0.2.1
github.com/google/gousb v0.0.0-20190812193832-18f4c1d8a750
github.com/klauspost/cpuid v1.3.1
github.com/onsi/ginkgo v1.12.1
github.com/onsi/gomega v1.10.1
github.com/pkg/errors v0.8.1
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd
google.golang.org/grpc v1.26.0
github.com/onsi/ginkgo v1.14.1
github.com/onsi/gomega v1.10.2
github.com/pkg/errors v0.9.1
golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4
google.golang.org/grpc v1.27.0
gopkg.in/ini.v1 v1.46.0 // indirect
k8s.io/api v0.18.6
k8s.io/apimachinery v0.18.6
k8s.io/client-go v0.18.6
k8s.io/component-base v0.18.2
k8s.io/api v0.19.3
k8s.io/apimachinery v0.19.3
k8s.io/client-go v0.19.3
k8s.io/component-base v0.19.3
k8s.io/klog v1.0.0
k8s.io/kubelet v0.17.3
k8s.io/kubernetes v1.18.2
k8s.io/utils v0.0.0-20200603063816-c1c6865ac451
sigs.k8s.io/controller-runtime v0.6.2
k8s.io/kubernetes v1.19.3
k8s.io/utils v0.0.0-20200912215256-4140de9c8800
sigs.k8s.io/controller-runtime v0.7.0-alpha.6
)
replace (
k8s.io/api => k8s.io/api v0.18.2
k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.18.2
k8s.io/apimachinery => k8s.io/apimachinery v0.18.3-beta.0
k8s.io/apiserver => k8s.io/apiserver v0.18.2
k8s.io/cli-runtime => k8s.io/cli-runtime v0.18.2
k8s.io/client-go => k8s.io/client-go v0.18.2
k8s.io/cloud-provider => k8s.io/cloud-provider v0.18.2
k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.18.2
k8s.io/code-generator => k8s.io/code-generator v0.18.3-beta.0
k8s.io/component-base => k8s.io/component-base v0.18.2
k8s.io/cri-api => k8s.io/cri-api v0.18.3-beta.0
k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.18.2
k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.18.2
k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.18.2
k8s.io/kube-proxy => k8s.io/kube-proxy v0.18.2
k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.18.2
k8s.io/kubectl => k8s.io/kubectl v0.18.2
k8s.io/kubelet => k8s.io/kubelet v0.18.2
k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.18.2
k8s.io/metrics => k8s.io/metrics v0.18.2
k8s.io/api => k8s.io/api v0.19.3
k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.19.3
k8s.io/apimachinery => k8s.io/apimachinery v0.19.4-rc.0
k8s.io/apiserver => k8s.io/apiserver v0.19.3
k8s.io/cli-runtime => k8s.io/cli-runtime v0.19.3
k8s.io/client-go => k8s.io/client-go v0.19.3
k8s.io/cloud-provider => k8s.io/cloud-provider v0.19.3
k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.19.3
k8s.io/code-generator => k8s.io/code-generator v0.19.4-rc.0
k8s.io/component-base => k8s.io/component-base v0.19.3
k8s.io/controller-manager => k8s.io/controller-manager v0.19.4-rc.0
k8s.io/cri-api => k8s.io/cri-api v0.19.4-rc.0
k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.19.3
k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.19.3
k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.19.3
k8s.io/kube-proxy => k8s.io/kube-proxy v0.19.3
k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.19.3
k8s.io/kubectl => k8s.io/kubectl v0.19.3
k8s.io/kubelet => k8s.io/kubelet v0.19.3
k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.19.3
k8s.io/metrics => k8s.io/metrics v0.19.3
k8s.io/node-api => k8s.io/node-api v0.17.3
k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.18.2
k8s.io/sample-cli-plugin => k8s.io/sample-cli-plugin v0.18.2
k8s.io/sample-controller => k8s.io/sample-controller v0.18.2
k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.19.3
k8s.io/sample-cli-plugin => k8s.io/sample-cli-plugin v0.19.3
k8s.io/sample-controller => k8s.io/sample-controller v0.19.3
)

618
go.sum

File diff suppressed because it is too large Load Diff

View File

@ -52,7 +52,7 @@ type controller struct {
scheme *runtime.Scheme
}
func (c *controller) CreateEmptyObject() runtime.Object {
func (c *controller) CreateEmptyObject() client.Object {
return &devicepluginv1.FpgaDevicePlugin{}
}
@ -65,7 +65,7 @@ func (c *controller) GetTotalObjectCount(ctx context.Context, clnt client.Client
return len(list.Items), nil
}
func (c *controller) NewDaemonSet(rawObj runtime.Object) *apps.DaemonSet {
func (c *controller) NewDaemonSet(rawObj client.Object) *apps.DaemonSet {
devicePlugin := rawObj.(*devicepluginv1.FpgaDevicePlugin)
yes := true
directoryOrCreate := v1.HostPathDirectoryOrCreate
@ -199,7 +199,7 @@ func (c *controller) NewDaemonSet(rawObj runtime.Object) *apps.DaemonSet {
}
}
func (c *controller) UpdateDaemonSet(rawObj runtime.Object, ds *apps.DaemonSet) (updated bool) {
func (c *controller) UpdateDaemonSet(rawObj client.Object, ds *apps.DaemonSet) (updated bool) {
dp := rawObj.(*devicepluginv1.FpgaDevicePlugin)
if ds.Spec.Template.Spec.Containers[0].Image != dp.Spec.Image {
@ -226,7 +226,7 @@ func (c *controller) UpdateDaemonSet(rawObj runtime.Object, ds *apps.DaemonSet)
return updated
}
func (c *controller) UpdateStatus(rawObj runtime.Object, ds *apps.DaemonSet, nodeNames []string) (updated bool, err error) {
func (c *controller) UpdateStatus(rawObj client.Object, ds *apps.DaemonSet, nodeNames []string) (updated bool, err error) {
dp := rawObj.(*devicepluginv1.FpgaDevicePlugin)
dsRef, err := reference.GetReference(c.scheme, ds)

View File

@ -52,7 +52,7 @@ type controller struct {
scheme *runtime.Scheme
}
func (c *controller) CreateEmptyObject() runtime.Object {
func (c *controller) CreateEmptyObject() client.Object {
return &devicepluginv1.GpuDevicePlugin{}
}
@ -65,7 +65,7 @@ func (c *controller) GetTotalObjectCount(ctx context.Context, clnt client.Client
return len(list.Items), nil
}
func (c *controller) NewDaemonSet(rawObj runtime.Object) *apps.DaemonSet {
func (c *controller) NewDaemonSet(rawObj client.Object) *apps.DaemonSet {
devicePlugin := rawObj.(*devicepluginv1.GpuDevicePlugin)
var nodeSelector map[string]string
@ -225,7 +225,7 @@ func removeVolume(volumes []v1.Volume, name string) []v1.Volume {
return newVolumes
}
func (c *controller) UpdateDaemonSet(rawObj runtime.Object, ds *apps.DaemonSet) (updated bool) {
func (c *controller) UpdateDaemonSet(rawObj client.Object, ds *apps.DaemonSet) (updated bool) {
dp := rawObj.(*devicepluginv1.GpuDevicePlugin)
if ds.Spec.Template.Spec.Containers[0].Image != dp.Spec.Image {
@ -263,7 +263,7 @@ func (c *controller) UpdateDaemonSet(rawObj runtime.Object, ds *apps.DaemonSet)
return updated
}
func (c *controller) UpdateStatus(rawObj runtime.Object, ds *apps.DaemonSet, nodeNames []string) (updated bool, err error) {
func (c *controller) UpdateStatus(rawObj client.Object, ds *apps.DaemonSet, nodeNames []string) (updated bool, err error) {
dp := rawObj.(*devicepluginv1.GpuDevicePlugin)
dsRef, err := reference.GetReference(c.scheme, ds)

View File

@ -52,7 +52,7 @@ type controller struct {
scheme *runtime.Scheme
}
func (c *controller) CreateEmptyObject() runtime.Object {
func (c *controller) CreateEmptyObject() client.Object {
return &devicepluginv1.QatDevicePlugin{}
}
@ -65,7 +65,7 @@ func (c *controller) GetTotalObjectCount(ctx context.Context, clnt client.Client
return len(list.Items), nil
}
func (c *controller) NewDaemonSet(rawObj runtime.Object) *apps.DaemonSet {
func (c *controller) NewDaemonSet(rawObj client.Object) *apps.DaemonSet {
devicePlugin := rawObj.(*devicepluginv1.QatDevicePlugin)
yes := true
return &apps.DaemonSet{
@ -148,7 +148,7 @@ func (c *controller) NewDaemonSet(rawObj runtime.Object) *apps.DaemonSet {
}
}
func (c *controller) UpdateDaemonSet(rawObj runtime.Object, ds *apps.DaemonSet) (updated bool) {
func (c *controller) UpdateDaemonSet(rawObj client.Object, ds *apps.DaemonSet) (updated bool) {
dp := rawObj.(*devicepluginv1.QatDevicePlugin)
if ds.Spec.Template.Spec.Containers[0].Image != dp.Spec.Image {
@ -170,7 +170,7 @@ func (c *controller) UpdateDaemonSet(rawObj runtime.Object, ds *apps.DaemonSet)
return updated
}
func (c *controller) UpdateStatus(rawObj runtime.Object, ds *apps.DaemonSet, nodeNames []string) (updated bool, err error) {
func (c *controller) UpdateStatus(rawObj client.Object, ds *apps.DaemonSet, nodeNames []string) (updated bool, err error) {
dp := rawObj.(*devicepluginv1.QatDevicePlugin)
dsRef, err := reference.GetReference(c.scheme, ds)

View File

@ -27,6 +27,7 @@ import (
"k8s.io/apimachinery/pkg/runtime"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/log"
)
var (
@ -63,19 +64,20 @@ func GetDevicePluginCount(pluginKind string) int {
// +kubebuilder:rbac:groups=apps,resources=daemonsets,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups="",resources=pods,verbs=get;list;watch
// +kubebuilder:rbac:groups=coordination.k8s.io,resources=leases,verbs=create
// +kubebuilder:rbac:groups=coordination.k8s.io,resources=leases,resourceNames=d1c7b6d5.intel.com,verbs=get;update
// DevicePluginController provides functionality for manipulating actual device plugin CRD objects.
type DevicePluginController interface {
CreateEmptyObject() (devicePlugin runtime.Object)
CreateEmptyObject() (devicePlugin client.Object)
GetTotalObjectCount(ctx context.Context, client client.Client) (count int, err error)
NewDaemonSet(devicePlugin runtime.Object) *apps.DaemonSet
UpdateDaemonSet(runtime.Object, *apps.DaemonSet) (updated bool)
UpdateStatus(runtime.Object, *apps.DaemonSet, []string) (updated bool, err error)
NewDaemonSet(devicePlugin client.Object) *apps.DaemonSet
UpdateDaemonSet(client.Object, *apps.DaemonSet) (updated bool)
UpdateStatus(client.Object, *apps.DaemonSet, []string) (updated bool, err error)
}
type reconciler struct {
client.Client
log logr.Logger
scheme *runtime.Scheme
pluginKind string
ownerKey string
@ -83,9 +85,8 @@ type reconciler struct {
}
// Reconcile reconciles a device plugin object.
func (r *reconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
ctx := context.Background()
log := r.log.WithValues(r.pluginKind, req.NamespacedName)
func (r *reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
log := log.FromContext(ctx).WithValues(r.pluginKind, req.NamespacedName)
if err := r.updateBookKeeper(ctx); err != nil {
log.Error(err, "unable to total count of device plugins")
@ -101,7 +102,7 @@ func (r *reconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
devicePlugin := r.controller.CreateEmptyObject()
if err := r.Get(ctx, req.NamespacedName, devicePlugin); err != nil {
return r.maybeDeleteDaemoSets(ctx, err, childDaemonSets.Items, log)
return r.maybeDeleteDaemonSets(ctx, err, childDaemonSets.Items, log)
}
// Create a daemon set for the plugin if it doesn't exist.
@ -154,7 +155,6 @@ func (r *reconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
func SetupWithManager(mgr ctrl.Manager, controller DevicePluginController, apiGVString, pluginKind, ownerKey string) error {
r := &reconciler{
Client: mgr.GetClient(),
log: ctrl.Log.WithName("controllers").WithName(pluginKind),
scheme: mgr.GetScheme(),
ownerKey: ownerKey,
controller: controller,
@ -165,7 +165,7 @@ func SetupWithManager(mgr ctrl.Manager, controller DevicePluginController, apiGV
// Index DaemonSets with their owner (e.g. QatDevicePlugin).
if err := mgr.GetFieldIndexer().IndexField(ctx, &apps.DaemonSet{}, ownerKey,
func(rawObj runtime.Object) []string {
func(rawObj client.Object) []string {
// grab the DaemonSet object, extract the owner...
ds := rawObj.(*apps.DaemonSet)
owner := metav1.GetControllerOf(ds)
@ -186,7 +186,7 @@ func SetupWithManager(mgr ctrl.Manager, controller DevicePluginController, apiGV
// Index Pods with their owner (DaemonSet).
if err := mgr.GetFieldIndexer().IndexField(ctx, &v1.Pod{}, ownerKey,
func(rawObj runtime.Object) []string {
func(rawObj client.Object) []string {
// grab the Pod object, extract the owner...
pod := rawObj.(*v1.Pod)
owner := metav1.GetControllerOf(pod)
@ -221,7 +221,7 @@ func (r *reconciler) updateBookKeeper(ctx context.Context) error {
return nil
}
func (r *reconciler) createDaemonSet(ctx context.Context, dp runtime.Object, log logr.Logger) (ctrl.Result, error) {
func (r *reconciler) createDaemonSet(ctx context.Context, dp client.Object, log logr.Logger) (ctrl.Result, error) {
ds := r.controller.NewDaemonSet(dp)
if err := ctrl.SetControllerReference(dp.(metav1.Object), ds, r.scheme); err != nil {
@ -237,11 +237,11 @@ func (r *reconciler) createDaemonSet(ctx context.Context, dp runtime.Object, log
return ctrl.Result{}, nil
}
func (r *reconciler) maybeDeleteDaemoSets(ctx context.Context, err error, daemonSets []apps.DaemonSet, log logr.Logger) (ctrl.Result, error) {
func (r *reconciler) maybeDeleteDaemonSets(ctx context.Context, err error, daemonSets []apps.DaemonSet, log logr.Logger) (ctrl.Result, error) {
if apierrors.IsNotFound(err) {
for _, ds := range daemonSets {
if err = r.Delete(ctx, ds.DeepCopyObject(), client.PropagationPolicy(metav1.DeletePropagationBackground)); client.IgnoreNotFound(err) != nil {
log.Error(err, "unable to delete DaemonSet", "DaemonSet", ds)
for i := range daemonSets {
if err = r.Delete(ctx, &daemonSets[i], client.PropagationPolicy(metav1.DeletePropagationBackground)); client.IgnoreNotFound(err) != nil {
log.Error(err, "unable to delete DaemonSet", "DaemonSet", daemonSets[i])
return ctrl.Result{}, err
}
}
@ -258,11 +258,12 @@ func (r *reconciler) maybeDeleteRedundantDaemonSets(ctx context.Context, dsets [
count := len(dsets)
if count > 1 {
log.V(0).Info("there are redundant DaemonSets", "redundantDS", count-1)
for _, ds := range dsets[1:] {
if err := r.Delete(ctx, ds.DeepCopyObject(), client.PropagationPolicy(metav1.DeletePropagationBackground)); client.IgnoreNotFound(err) != nil {
log.Error(err, "unable to delete redundant DaemonSet", "DaemonSet", ds)
redundantSets := dsets[1:]
for i := range redundantSets {
if err := r.Delete(ctx, &redundantSets[i], client.PropagationPolicy(metav1.DeletePropagationBackground)); client.IgnoreNotFound(err) != nil {
log.Error(err, "unable to delete redundant DaemonSet", "DaemonSet", redundantSets[i])
} else {
log.V(1).Info("deleted redundant DaemonSet", "DaemonSet", ds)
log.V(1).Info("deleted redundant DaemonSet", "DaemonSet", redundantSets[i])
}
}
}

View File

@ -52,7 +52,7 @@ type controller struct {
scheme *runtime.Scheme
}
func (c *controller) CreateEmptyObject() runtime.Object {
func (c *controller) CreateEmptyObject() client.Object {
return &devicepluginv1.SgxDevicePlugin{}
}
@ -65,7 +65,7 @@ func (c *controller) GetTotalObjectCount(ctx context.Context, clnt client.Client
return len(list.Items), nil
}
func (c *controller) NewDaemonSet(rawObj runtime.Object) *apps.DaemonSet {
func (c *controller) NewDaemonSet(rawObj client.Object) *apps.DaemonSet {
devicePlugin := rawObj.(*devicepluginv1.SgxDevicePlugin)
var nodeSelector map[string]string
@ -175,7 +175,7 @@ func (c *controller) NewDaemonSet(rawObj runtime.Object) *apps.DaemonSet {
}
}
func (c *controller) UpdateDaemonSet(rawObj runtime.Object, ds *apps.DaemonSet) (updated bool) {
func (c *controller) UpdateDaemonSet(rawObj client.Object, ds *apps.DaemonSet) (updated bool) {
dp := rawObj.(*devicepluginv1.SgxDevicePlugin)
if ds.Spec.Template.Spec.Containers[0].Image != dp.Spec.Image {
@ -202,7 +202,7 @@ func (c *controller) UpdateDaemonSet(rawObj runtime.Object, ds *apps.DaemonSet)
return updated
}
func (c *controller) UpdateStatus(rawObj runtime.Object, ds *apps.DaemonSet, nodeNames []string) (updated bool, err error) {
func (c *controller) UpdateStatus(rawObj client.Object, ds *apps.DaemonSet, nodeNames []string) (updated bool, err error) {
dp := rawObj.(*devicepluginv1.SgxDevicePlugin)
dsRef, err := reference.GetReference(c.scheme, ds)

View File

@ -76,7 +76,10 @@ func newServer(devType string,
}
func (srv *server) GetDevicePluginOptions(ctx context.Context, empty *pluginapi.Empty) (*pluginapi.DevicePluginOptions, error) {
return &pluginapi.DevicePluginOptions{PreStartRequired: srv.preStartContainer != nil}, nil
return &pluginapi.DevicePluginOptions{
PreStartRequired: srv.preStartContainer != nil,
GetPreferredAllocationAvailable: false,
}, nil
}
func (srv *server) sendDevices(stream pluginapi.DevicePlugin_ListAndWatchServer) error {
@ -158,6 +161,10 @@ func (srv *server) PreStartContainer(ctx context.Context, rqt *pluginapi.PreStar
return nil, errors.New("PreStartContainer() should not be called as this device plugin doesn't implement it")
}
func (srv *server) GetPreferredAllocation(ctx context.Context, rqt *pluginapi.PreferredAllocationRequest) (*pluginapi.PreferredAllocationResponse, error) {
return nil, errors.New("GetPreferredAllocation should not be called as this device plugin doesn't implement it")
}
// Serve starts a gRPC server to serve pluginapi.PluginInterfaceServer interface.
func (srv *server) Serve(namespace string) error {
return srv.setupAndServe(namespace, pluginapi.DevicePluginPath, pluginapi.KubeletSocket)

View File

@ -522,6 +522,13 @@ func TestPreStartContainer(t *testing.T) {
}
}
func TestGetPreferredAllocation(t *testing.T) {
srv := &server{}
if _, err := srv.GetPreferredAllocation(context.Background(), nil); err == nil {
t.Error("expected an unimplemented error, but got success")
}
}
func TestNewServer(t *testing.T) {
_ = newServer("test", nil, nil)
}

View File

@ -20,11 +20,11 @@ package fpgacontroller
import (
"context"
"github.com/go-logr/logr"
apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/runtime"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/log"
fpgav2 "github.com/intel/intel-device-plugins-for-kubernetes/pkg/apis/fpga.intel.com/v2"
"github.com/intel/intel-device-plugins-for-kubernetes/pkg/fpgacontroller/patcher"
@ -35,15 +35,13 @@ import (
// AcceleratorFunctionReconciler reconciles AcceleratorFunction objects.
type AcceleratorFunctionReconciler struct {
client.Client
Log logr.Logger
Scheme *runtime.Scheme
PatcherManager *patcher.PatcherManager
}
// Reconcile reconciles updates for AcceleratorFunction objects.
func (r *AcceleratorFunctionReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
ctx := context.Background()
log := r.Log.WithValues("af", req.NamespacedName)
func (r *AcceleratorFunctionReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
log := log.FromContext(ctx).WithValues("af", req.NamespacedName)
p := r.PatcherManager.GetPatcher(req.NamespacedName.Namespace)
var af fpgav2.AcceleratorFunction
@ -72,15 +70,13 @@ func (r *AcceleratorFunctionReconciler) SetupWithManager(mgr ctrl.Manager) error
// FpgaRegionReconciler reconciles AcceleratorFunction objects.
type FpgaRegionReconciler struct {
client.Client
Log logr.Logger
Scheme *runtime.Scheme
PatcherManager *patcher.PatcherManager
}
// Reconcile reconciles updates for FpgaRegion objects.
func (r *FpgaRegionReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
ctx := context.Background()
log := r.Log.WithValues("af", req.NamespacedName)
func (r *FpgaRegionReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
log := log.FromContext(ctx).WithValues("fpgaregion", req.NamespacedName)
p := r.PatcherManager.GetPatcher(req.NamespacedName.Namespace)
var region fpgav2.FpgaRegion

View File

@ -15,6 +15,7 @@
package fpgacontroller
import (
"context"
"errors"
"testing"
@ -23,13 +24,14 @@ import (
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/klog/klogr"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/log"
fpgav2 "github.com/intel/intel-device-plugins-for-kubernetes/pkg/apis/fpga.intel.com/v2"
"github.com/intel/intel-device-plugins-for-kubernetes/pkg/fpgacontroller/patcher"
)
var (
log = ctrl.Log.WithName("test")
logger = ctrl.Log.WithName("test")
scheme = runtime.NewScheme()
)
@ -64,10 +66,10 @@ func TestAcceleratorFunctionReconcile(t *testing.T) {
Client: &mockClient{
getError: tt.getError,
},
Log: log,
PatcherManager: patcher.NewPatcherManager(log),
PatcherManager: patcher.NewPatcherManager(logger),
}
_, err := reconciler.Reconcile(ctrl.Request{})
ctx := log.IntoContext(context.Background(), logger)
_, err := reconciler.Reconcile(ctx, ctrl.Request{})
if err != nil && !tt.expectedErr {
t.Errorf("unexpected error: %+v", err)
}
@ -82,7 +84,7 @@ func TestAcceleratorFunctionSetupWithManager(t *testing.T) {
r := &AcceleratorFunctionReconciler{}
err := r.SetupWithManager(&mockManager{
scheme: scheme,
log: log,
log: logger,
})
if err != nil {
t.Errorf("unexpected error: %+v", err)
@ -115,10 +117,10 @@ func TestFpgaRegionReconcile(t *testing.T) {
Client: &mockClient{
getError: tt.getError,
},
Log: log,
PatcherManager: patcher.NewPatcherManager(log),
PatcherManager: patcher.NewPatcherManager(logger),
}
_, err := reconciler.Reconcile(ctrl.Request{})
ctx := log.IntoContext(context.Background(), logger)
_, err := reconciler.Reconcile(ctx, ctrl.Request{})
if err != nil && !tt.expectedErr {
t.Errorf("unexpected error: %+v", err)
}
@ -133,7 +135,7 @@ func TestFpgaRegionSetupWithManager(t *testing.T) {
r := &FpgaRegionReconciler{}
err := r.SetupWithManager(&mockManager{
scheme: scheme,
log: log,
log: logger,
})
if err != nil {
t.Errorf("unexpected error: %+v", err)

View File

@ -36,27 +36,27 @@ type mockClient struct {
getError error
}
func (c *mockClient) Create(context.Context, runtime.Object, ...client.CreateOption) error {
func (c *mockClient) Create(context.Context, client.Object, ...client.CreateOption) error {
return nil
}
func (c *mockClient) Delete(context.Context, runtime.Object, ...client.DeleteOption) error {
func (c *mockClient) Delete(context.Context, client.Object, ...client.DeleteOption) error {
return nil
}
func (c *mockClient) DeleteAllOf(context.Context, runtime.Object, ...client.DeleteAllOfOption) error {
func (c *mockClient) DeleteAllOf(context.Context, client.Object, ...client.DeleteAllOfOption) error {
return nil
}
func (c *mockClient) Get(context.Context, types.NamespacedName, runtime.Object) error {
func (c *mockClient) Get(context.Context, types.NamespacedName, client.Object) error {
return c.getError
}
func (c *mockClient) List(context.Context, runtime.Object, ...client.ListOption) error {
func (c *mockClient) List(context.Context, client.ObjectList, ...client.ListOption) error {
return nil
}
func (c *mockClient) Patch(context.Context, runtime.Object, client.Patch, ...client.PatchOption) error {
func (c *mockClient) Patch(context.Context, client.Object, client.Patch, ...client.PatchOption) error {
return nil
}
@ -64,7 +64,15 @@ func (c *mockClient) Status() client.StatusWriter {
return nil
}
func (c *mockClient) Update(context.Context, runtime.Object, ...client.UpdateOption) error {
func (c *mockClient) Update(context.Context, client.Object, ...client.UpdateOption) error {
return nil
}
func (c *mockClient) Scheme() *runtime.Scheme {
return nil
}
func (c *mockClient) RESTMapper() meta.RESTMapper {
return nil
}
@ -137,6 +145,6 @@ func (m *mockManager) SetFields(interface{}) error {
return nil
}
func (m *mockManager) Start(<-chan struct{}) error {
func (m *mockManager) Start(context.Context) error {
return nil
}

View File

@ -121,13 +121,25 @@ func createPod(fmw *framework.Framework, name string, resourceName v1.ResourceNa
resourceList := v1.ResourceList{resourceName: resource.MustParse("1"),
"cpu": resource.MustParse("1"),
"hugepages-2Mi": resource.MustParse("20Mi")}
podSpec := fmw.NewTestPod(name, resourceList, resourceList)
podSpec.Spec.RestartPolicy = v1.RestartPolicyNever
podSpec.Spec.Containers[0].Image = image
podSpec.Spec.Containers[0].Command = command
podSpec.Spec.Containers[0].SecurityContext = &v1.SecurityContext{
Capabilities: &v1.Capabilities{
Add: []v1.Capability{"IPC_LOCK"},
podSpec := &v1.Pod{
ObjectMeta: metav1.ObjectMeta{Name: name},
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Name: "testcontainer",
Image: image,
Command: command,
Resources: v1.ResourceRequirements{
Requests: resourceList,
Limits: resourceList,
},
SecurityContext: &v1.SecurityContext{
Capabilities: &v1.Capabilities{
Add: []v1.Capability{"IPC_LOCK"},
},
},
},
},
},
}

View File

@ -27,6 +27,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/kubernetes/test/e2e/framework"
"k8s.io/kubernetes/test/e2e/framework/kubectl"
imageutils "k8s.io/kubernetes/test/utils/image"
)
const (
@ -78,9 +79,21 @@ func checkPodMutation(f *framework.Framework, mappingsNamespace string, source,
framework.RunKubectlOrDie(f.Namespace.Name, "apply", "-n", mappingsNamespace, "-f", filepath.Dir(kustomizationPath)+"/../mappings-collection.yaml")
ginkgo.By("submitting a pod for admission")
podSpec := f.NewTestPod("webhook-tester",
v1.ResourceList{source: resource.MustParse("1")},
v1.ResourceList{source: resource.MustParse("1")})
podSpec := &v1.Pod{
ObjectMeta: metav1.ObjectMeta{Name: "webhook-tester"},
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Name: "testcontainer",
Image: imageutils.GetPauseImageName(),
Resources: v1.ResourceRequirements{
Requests: v1.ResourceList{source: resource.MustParse("1")},
Limits: v1.ResourceList{source: resource.MustParse("1")},
},
},
},
},
}
pod, err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).Create(context.TODO(),
podSpec, metav1.CreateOptions{})

View File

@ -65,13 +65,24 @@ func describe() {
}
ginkgo.By("submitting a pod requesting GPU resources")
podSpec := f.NewTestPod("gpuplugin-tester",
v1.ResourceList{"gpu.intel.com/i915": resource.MustParse("1")},
v1.ResourceList{"gpu.intel.com/i915": resource.MustParse("1")})
podSpec.Spec.RestartPolicy = v1.RestartPolicyNever
podSpec.Spec.Containers[0].Image = imageutils.GetE2EImage(imageutils.BusyBox)
podSpec.Spec.Containers[0].Command = []string{"/bin/sh"}
podSpec.Spec.Containers[0].Args = []string{"-c", "echo hello world"}
podSpec := &v1.Pod{
ObjectMeta: metav1.ObjectMeta{Name: "gpuplugin-tester"},
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Args: []string{"-c", "echo hello world"},
Name: "testcontainer",
Image: imageutils.GetE2EImage(imageutils.BusyBox),
Command: []string{"/bin/sh"},
Resources: v1.ResourceRequirements{
Requests: v1.ResourceList{"gpu.intel.com/i915": resource.MustParse("1")},
Limits: v1.ResourceList{"gpu.intel.com/i915": resource.MustParse("1")},
},
},
},
RestartPolicy: v1.RestartPolicyNever,
},
}
pod, err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).Create(context.TODO(), podSpec, metav1.CreateOptions{})
framework.ExpectNoError(err, "pod Create API error")

View File

@ -68,13 +68,24 @@ func describeQatKernelPlugin() {
}
ginkgo.By("submitting a pod requesting QAT resources")
podSpec := f.NewTestPod("qatplugin-tester",
v1.ResourceList{"qat.intel.com/cy1_dc0": resource.MustParse("1")},
v1.ResourceList{"qat.intel.com/cy1_dc0": resource.MustParse("1")})
podSpec.Spec.RestartPolicy = v1.RestartPolicyNever
podSpec.Spec.Containers[0].Image = imageutils.GetE2EImage(imageutils.BusyBox)
podSpec.Spec.Containers[0].Command = []string{"/bin/sh"}
podSpec.Spec.Containers[0].Args = []string{"-c", "echo mode"}
podSpec := &v1.Pod{
ObjectMeta: metav1.ObjectMeta{Name: "qatplugin-tester"},
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Args: []string{"-c", "echo mode"},
Name: "testcontainer",
Image: imageutils.GetE2EImage(imageutils.BusyBox),
Command: []string{"/bin/sh"},
Resources: v1.ResourceRequirements{
Requests: v1.ResourceList{"qat.intel.com/cy1_dc0": resource.MustParse("1")},
Limits: v1.ResourceList{"qat.intel.com/cy1_dc0": resource.MustParse("1")},
},
},
},
RestartPolicy: v1.RestartPolicyNever,
},
}
pod, err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).Create(context.TODO(),
podSpec, metav1.CreateOptions{})
framework.ExpectNoError(err, "pod Create API error")

View File

@ -84,13 +84,24 @@ func describe() {
}
ginkgo.By("submitting a pod requesting SGX enclave resources")
podSpec := f.NewTestPod("sgxplugin-tester",
v1.ResourceList{"sgx.intel.com/epc": resource.MustParse("42")},
v1.ResourceList{"sgx.intel.com/epc": resource.MustParse("42")})
podSpec.Spec.RestartPolicy = v1.RestartPolicyNever
podSpec.Spec.Containers[0].Image = imageutils.GetE2EImage(imageutils.BusyBox)
podSpec.Spec.Containers[0].Command = []string{"/bin/sh"}
podSpec.Spec.Containers[0].Args = []string{"-c", "echo hello world"}
podSpec := &v1.Pod{
ObjectMeta: metav1.ObjectMeta{Name: "sgxplugin-tester"},
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Args: []string{"-c", "echo hello world"},
Name: "testcontainer",
Image: imageutils.GetE2EImage(imageutils.BusyBox),
Command: []string{"/bin/sh"},
Resources: v1.ResourceRequirements{
Requests: v1.ResourceList{"sgx.intel.com/epc": resource.MustParse("42")},
Limits: v1.ResourceList{"sgx.intel.com/epc": resource.MustParse("42")},
},
},
},
RestartPolicy: v1.RestartPolicyNever,
},
}
pod, err := f.ClientSet.CoreV1().Pods(f.Namespace.Name).Create(context.TODO(), podSpec, metav1.CreateOptions{})
framework.ExpectNoError(err, "pod Create API error")

View File

@ -53,7 +53,7 @@ func TestAPIs(t *testing.T) {
}
var _ = BeforeSuite(func(done Done) {
logf.SetLogger(zap.LoggerTo(GinkgoWriter, true))
logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true)))
By("bootstrapping test environment")
testEnv = &envtest.Environment{