diff --git a/cmd/qat_plugin/README.md b/cmd/qat_plugin/README.md index 004ca509c..706724cc5 100644 --- a/cmd/qat_plugin/README.md +++ b/cmd/qat_plugin/README.md @@ -148,6 +148,11 @@ When using the operator for deploying the plugin with provisioning config, use ` There's also a possibility for a node specific congfiguration through passing a nodename via `NODE_NAME` into initcontainer's environment and passing a node specific profile (`qat-$NODE_NAME.conf`) via ConfigMap volume mount. +Existing DaemonSet annotations can be updated through CR annotations in [deviceplugin_v1_qatdeviceplugin.yaml](../../deployments/operator/samples/deviceplugin_v1_qatdeviceplugin.yaml). + +By default, the operator based deployment sets AppArmor policy to `"unconfined"` but this can be overridden by setting the AppArmor annotation to a new value in the CR annotations. + +For non-operator plugin deployments such annotations can be dropped with the kustomization if required. ### Verify Plugin Registration diff --git a/deployments/qat_plugin/base/intel-qat-plugin.yaml b/deployments/qat_plugin/base/intel-qat-plugin.yaml index 6d5678c22..82858f119 100644 --- a/deployments/qat_plugin/base/intel-qat-plugin.yaml +++ b/deployments/qat_plugin/base/intel-qat-plugin.yaml @@ -4,6 +4,8 @@ metadata: name: intel-qat-plugin labels: app: intel-qat-plugin + annotations: + container.apparmor.security.beta.kubernetes.io/intel-qat-plugin: unconfined spec: selector: matchLabels: @@ -12,6 +14,8 @@ spec: metadata: labels: app: intel-qat-plugin + annotations: + container.apparmor.security.beta.kubernetes.io/intel-qat-plugin: unconfined spec: automountServiceAccountToken: false containers: diff --git a/deployments/qat_plugin/overlays/apparmor_unconfined/kustomization.yaml b/deployments/qat_plugin/overlays/apparmor_unconfined/kustomization.yaml deleted file mode 100644 index 5f9e61d0f..000000000 --- a/deployments/qat_plugin/overlays/apparmor_unconfined/kustomization.yaml +++ /dev/null @@ -1,4 +0,0 @@ -resources: - - ../../base -commonAnnotations: - container.apparmor.security.beta.kubernetes.io/intel-qat-plugin: unconfined diff --git a/deployments/qat_plugin/overlays/e2e/kustomization.yaml b/deployments/qat_plugin/overlays/e2e/kustomization.yaml index 471985c86..b82f918e6 100644 --- a/deployments/qat_plugin/overlays/e2e/kustomization.yaml +++ b/deployments/qat_plugin/overlays/e2e/kustomization.yaml @@ -1,6 +1,4 @@ nameSuffix: -e2e -commonAnnotations: - container.apparmor.security.beta.kubernetes.io/intel-qat-plugin: unconfined resources: - ../qat_initcontainer diff --git a/pkg/controllers/qat/controller.go b/pkg/controllers/qat/controller.go index ddacf02a4..3f33d2007 100644 --- a/pkg/controllers/qat/controller.go +++ b/pkg/controllers/qat/controller.go @@ -103,16 +103,13 @@ func (c *controller) NewDaemonSet(rawObj client.Object) *apps.DaemonSet { func (c *controller) UpdateDaemonSet(rawObj client.Object, ds *apps.DaemonSet) (updated bool) { dp := rawObj.(*devicepluginv1.QatDevicePlugin) - // Remove always incrementing annotation so it doesn't cause the next DeepEqual - // to return false every time. - dsAnnotations := ds.ObjectMeta.DeepCopy().Annotations - delete(dsAnnotations, "deprecated.daemonset.template.generation") - - if !reflect.DeepEqual(dsAnnotations, dp.ObjectMeta.Annotations) { - pluginAnnotations := dp.ObjectMeta.DeepCopy().Annotations - ds.ObjectMeta.Annotations = pluginAnnotations - ds.Spec.Template.Annotations = pluginAnnotations - updated = true + // Update only existing daemonset annotations + for k, v := range ds.ObjectMeta.Annotations { + if v2, ok := dp.ObjectMeta.Annotations[k]; ok && v2 != v { + ds.ObjectMeta.Annotations[k] = v2 + ds.Spec.Template.Annotations[k] = v2 + updated = true + } } if ds.Spec.Template.Spec.Containers[0].Image != dp.Spec.Image { diff --git a/pkg/controllers/qat/controller_test.go b/pkg/controllers/qat/controller_test.go index 5030f73c2..3105e4e2b 100644 --- a/pkg/controllers/qat/controller_test.go +++ b/pkg/controllers/qat/controller_test.go @@ -164,9 +164,16 @@ func (c *controller) newDaemonSetExpected(rawObj client.Object) *apps.DaemonSet func TestNewDaemonSetQAT(t *testing.T) { c := &controller{} - plugin := &devicepluginv1.QatDevicePlugin{} + plugin := &devicepluginv1.QatDevicePlugin{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + "container.apparmor.security.beta.kubernetes.io/intel-qat-plugin": "runtime/default", + }, + }, + } plugin.Name = "testing" plugin.Spec.InitImage = "intel/intel-qat-initcontainer:" + controllers.ImageMinVersion.String() + expected := c.newDaemonSetExpected(plugin) actual := c.NewDaemonSet(plugin)