mirror of
https://github.com/intel/intel-device-plugins-for-kubernetes.git
synced 2025-06-03 03:59:37 +00:00
Merge pull request #493 from rojkov/release-0.19
Upgrade to k8s v1.19.3
This commit is contained in:
commit
ad02fc43b8
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -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
73
go.mod
@ -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
|
||||
)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
|
@ -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{})
|
||||
|
||||
|
@ -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")
|
||||
|
||||
|
@ -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")
|
||||
|
@ -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")
|
||||
|
||||
|
@ -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{
|
||||
|
Loading…
Reference in New Issue
Block a user