diff --git a/cli/k8s_client/types.go b/cli/k8s_client/types.go index a5ab6678a..ac65525a9 100644 --- a/cli/k8s_client/types.go +++ b/cli/k8s_client/types.go @@ -143,65 +143,67 @@ type KubernetesClient interface { } type DeploymentYAMLArguments struct { - DeploymentName string `json:"deploymentName"` - TridentImage string `json:"tridentImage"` - AutosupportImage string `json:"autosupportImage"` - AutosupportProxy string `json:"autosupportProxy"` - AutosupportInsecure bool `json:"autosupportInsecure"` - AutosupportCustomURL string `json:"autosupportCustomURL"` - AutosupportSerialNumber string `json:"autosupportSerialNumber"` - AutosupportHostname string `json:"autosupportHostname"` - ImageRegistry string `json:"imageRegistry"` - LogFormat string `json:"logFormat"` - LogLevel string `json:"logLevel"` - LogWorkflows string `json:"logWorkflows"` - LogLayers string `json:"logLayers"` - ImagePullSecrets []string `json:"imagePullSecrets"` - Labels map[string]string `json:"labels"` - ControllingCRDetails map[string]string `json:"controllingCRDetails"` - Debug bool `json:"debug"` - UseIPv6 bool `json:"useIPv6"` - SilenceAutosupport bool `json:"silenceAutosupport"` - Version *versionutils.Version `json:"version"` - DisableAuditLog bool `json:"disableAuditLog"` - HTTPRequestTimeout string `json:"httpRequestTimeout"` - NodeSelector map[string]string `json:"nodeSelector"` - Tolerations []map[string]string `json:"tolerations"` - ServiceAccountName string `json:"serviceAccountName"` - ImagePullPolicy string `json:"imagePullPolicy"` - EnableForceDetach bool `json:"enableForceDetach"` - ACPImage string `json:"acpImage"` - EnableACP bool `json:"enableACP"` - CloudProvider string `json:"cloudProvider"` - IdentityLabel bool `json:"identityLabel"` - K8sAPIQPS int `json:"k8sAPIQPS"` + DeploymentName string `json:"deploymentName"` + TridentImage string `json:"tridentImage"` + AutosupportImage string `json:"autosupportImage"` + AutosupportProxy string `json:"autosupportProxy"` + AutosupportInsecure bool `json:"autosupportInsecure"` + AutosupportCustomURL string `json:"autosupportCustomURL"` + AutosupportSerialNumber string `json:"autosupportSerialNumber"` + AutosupportHostname string `json:"autosupportHostname"` + ImageRegistry string `json:"imageRegistry"` + LogFormat string `json:"logFormat"` + LogLevel string `json:"logLevel"` + LogWorkflows string `json:"logWorkflows"` + LogLayers string `json:"logLayers"` + ImagePullSecrets []string `json:"imagePullSecrets"` + Labels map[string]string `json:"labels"` + ControllingCRDetails map[string]string `json:"controllingCRDetails"` + Debug bool `json:"debug"` + UseIPv6 bool `json:"useIPv6"` + SilenceAutosupport bool `json:"silenceAutosupport"` + Version *versionutils.Version `json:"version"` + DisableAuditLog bool `json:"disableAuditLog"` + HTTPRequestTimeout string `json:"httpRequestTimeout"` + NodeSelector map[string]string `json:"nodeSelector"` + Tolerations []map[string]string `json:"tolerations"` + ServiceAccountName string `json:"serviceAccountName"` + ImagePullPolicy string `json:"imagePullPolicy"` + EnableForceDetach bool `json:"enableForceDetach"` + ACPImage string `json:"acpImage"` + EnableACP bool `json:"enableACP"` + CloudProvider string `json:"cloudProvider"` + IdentityLabel bool `json:"identityLabel"` + K8sAPIQPS int `json:"k8sAPIQPS"` + Resources *v1.ResourceRequirements `json:"resources"` } type DaemonsetYAMLArguments struct { - DaemonsetName string `json:"daemonsetName"` - TridentImage string `json:"tridentImage"` - ImageRegistry string `json:"imageRegistry"` - KubeletDir string `json:"kubeletDir"` - LogFormat string `json:"logFormat"` - LogLevel string `json:"logLevel"` - LogWorkflows string `json:"logWorkflows"` - LogLayers string `json:"logLayers"` - ProbePort string `json:"probePort"` - ImagePullSecrets []string `json:"imagePullSecrets"` - Labels map[string]string `json:"labels"` - ControllingCRDetails map[string]string `json:"controllingCRDetails"` - EnableForceDetach bool `json:"enableForceDetach"` - DisableAuditLog bool `json:"disableAuditLog"` - Debug bool `json:"debug"` - Version *versionutils.Version `json:"version"` - HTTPRequestTimeout string `json:"httpRequestTimeout"` - NodeSelector map[string]string `json:"nodeSelector"` - Tolerations []map[string]string `json:"tolerations"` - ServiceAccountName string `json:"serviceAccountName"` - ImagePullPolicy string `json:"imagePullPolicy"` - ISCSISelfHealingInterval string `json:"iscsiSelfHealingInterval"` - ISCSISelfHealingWaitTime string `json:"iscsiSelfHealingWaitTime"` - NodePrep []string `json:"nodePrep"` + DaemonsetName string `json:"daemonsetName"` + TridentImage string `json:"tridentImage"` + ImageRegistry string `json:"imageRegistry"` + KubeletDir string `json:"kubeletDir"` + LogFormat string `json:"logFormat"` + LogLevel string `json:"logLevel"` + LogWorkflows string `json:"logWorkflows"` + LogLayers string `json:"logLayers"` + ProbePort string `json:"probePort"` + ImagePullSecrets []string `json:"imagePullSecrets"` + Labels map[string]string `json:"labels"` + ControllingCRDetails map[string]string `json:"controllingCRDetails"` + EnableForceDetach bool `json:"enableForceDetach"` + DisableAuditLog bool `json:"disableAuditLog"` + Debug bool `json:"debug"` + Version *versionutils.Version `json:"version"` + HTTPRequestTimeout string `json:"httpRequestTimeout"` + NodeSelector map[string]string `json:"nodeSelector"` + Tolerations []map[string]string `json:"tolerations"` + ServiceAccountName string `json:"serviceAccountName"` + ImagePullPolicy string `json:"imagePullPolicy"` + ISCSISelfHealingInterval string `json:"iscsiSelfHealingInterval"` + ISCSISelfHealingWaitTime string `json:"iscsiSelfHealingWaitTime"` + NodePrep []string `json:"nodePrep"` + Resources *v1.ResourceRequirements `json:"resources"` } type TridentVersionPodYAMLArguments struct { diff --git a/cli/k8s_client/yaml_factory.go b/cli/k8s_client/yaml_factory.go index 546e39e5f..10e53d949 100644 --- a/cli/k8s_client/yaml_factory.go +++ b/cli/k8s_client/yaml_factory.go @@ -11,6 +11,8 @@ import ( commonconfig "github.com/netapp/trident/config" . "github.com/netapp/trident/logging" "github.com/netapp/trident/utils" + v1 "k8s.io/api/core/v1" + "sigs.k8s.io/yaml" ) const ( @@ -524,6 +526,7 @@ func GetCSIDeploymentYAML(args *DeploymentYAMLArguments) string { deploymentYAML = utils.ReplaceMultilineYAMLTag(deploymentYAML, "OWNER_REF", constructOwnerRef(args.ControllingCRDetails)) deploymentYAML = utils.ReplaceMultilineYAMLTag(deploymentYAML, "NODE_SELECTOR", constructNodeSelector(args.NodeSelector)) deploymentYAML = utils.ReplaceMultilineYAMLTag(deploymentYAML, "NODE_TOLERATIONS", constructTolerations(args.Tolerations)) + deploymentYAML = utils.ReplaceMultilineYAMLTag(deploymentYAML, "RESOURCES", constructResources(args.Resources)) deploymentYAML = strings.ReplaceAll(deploymentYAML, "{ENABLE_FORCE_DETACH}", strconv.FormatBool(args.EnableForceDetach)) deploymentYAML = strings.ReplaceAll(deploymentYAML, "{ENABLE_ACP}", enableACP) deploymentYAML = strings.ReplaceAll(deploymentYAML, "{K8S_API_CLIENT_TRIDENT_THROTTLE}", K8sAPITridentThrottle) @@ -594,6 +597,7 @@ spec: {ENABLE_ACP} {DEBUG} {K8S_API_CLIENT_TRIDENT_THROTTLE} + {RESOURCES} livenessProbe: exec: command: @@ -647,9 +651,7 @@ spec: {AUTOSUPPORT_HOSTNAME} {AUTOSUPPORT_DEBUG} {AUTOSUPPORT_INSECURE} - resources: - limits: - memory: 1Gi + {RESOURCES} volumeMounts: - name: asup-dir mountPath: /asup @@ -667,6 +669,7 @@ spec: - "--retry-interval-start=8s" - "--retry-interval-max=30s" {K8S_API_CLIENT_SIDECAR_THROTTLE} + {RESOURCES} env: - name: ADDRESS value: /var/lib/csi/sockets/pluginproxy/csi.sock @@ -686,6 +689,7 @@ spec: - "--retry-interval-start=10s" - "--csi-address=$(ADDRESS)" {K8S_API_CLIENT_SIDECAR_THROTTLE} + {RESOURCES} env: - name: ADDRESS value: /var/lib/csi/sockets/pluginproxy/csi.sock @@ -700,6 +704,7 @@ spec: - "--timeout=300s" - "--csi-address=$(ADDRESS)" {K8S_API_CLIENT_SIDECAR_THROTTLE} + {RESOURCES} env: - name: ADDRESS value: /var/lib/csi/sockets/pluginproxy/csi.sock @@ -718,6 +723,7 @@ spec: - "--timeout=300s" - "--csi-address=$(ADDRESS)" {K8S_API_CLIENT_SIDECAR_THROTTLE} + {RESOURCES} env: - name: ADDRESS value: /var/lib/csi/sockets/pluginproxy/csi.sock @@ -909,6 +915,7 @@ func GetCSIDaemonSetYAMLLinux(args *DaemonsetYAMLArguments) string { daemonSetYAML = utils.ReplaceMultilineYAMLTag(daemonSetYAML, "NODE_TOLERATIONS", constructTolerations(tolerations)) daemonSetYAML = utils.ReplaceMultilineYAMLTag(daemonSetYAML, "LABELS", constructLabels(args.Labels)) daemonSetYAML = utils.ReplaceMultilineYAMLTag(daemonSetYAML, "OWNER_REF", constructOwnerRef(args.ControllingCRDetails)) + daemonSetYAML = utils.ReplaceMultilineYAMLTag(daemonSetYAML, "RESOURCES", constructResources(args.Resources)) // Log before secrets are inserted into YAML. Log().WithField("yaml", daemonSetYAML).Trace("CSI Daemonset Linux YAML.") @@ -1056,6 +1063,7 @@ spec: timeoutSeconds: 5 periodSeconds: 10 initialDelaySeconds: 15 + {RESOURCES} env: - name: KUBE_NODE_NAME valueFrom: @@ -1097,6 +1105,7 @@ spec: - "--v={SIDECAR_LOG_LEVEL}" - "--csi-address=$(ADDRESS)" - "--kubelet-registration-path=$(REGISTRATION_PATH)" + {RESOURCES} env: - name: ADDRESS value: /plugin/csi.sock @@ -2762,6 +2771,16 @@ func constructOwnerRef(ownerRef map[string]string) string { return ownerRefData } +func constructResources(res *v1.ResourceRequirements) string { + r := struct { + Resources *v1.ResourceRequirements `json:"resources"` + }{ + Resources: res, + } + bytes, _ := yaml.Marshal(r) + return string(bytes) +} + func constructImagePullSecrets(imagePullSecrets []string) string { var imagePullSecretsData string if len(imagePullSecrets) > 0 { diff --git a/cli/k8s_client/yaml_factory_test.go b/cli/k8s_client/yaml_factory_test.go index f12eca464..2392c0d88 100644 --- a/cli/k8s_client/yaml_factory_test.go +++ b/cli/k8s_client/yaml_factory_test.go @@ -16,6 +16,7 @@ import ( pspv1beta1 "k8s.io/api/policy/v1beta1" csiv1 "k8s.io/api/storage/v1" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/netapp/trident/config" @@ -514,6 +515,30 @@ func TestGetCSIDeploymentYAML_K8sAPIQPS(t *testing.T) { } } +func TestGetCSIDeploymentYAML_Resources(t *testing.T) { + args := &DeploymentYAMLArguments{Resources: &v1.ResourceRequirements{ + Limits: v1.ResourceList{v1.ResourceCPU: resource.MustParse("114m"), v1.ResourceMemory: resource.MustParse("256Mi")}, + Requests: v1.ResourceList{v1.ResourceCPU: resource.MustParse("200m"), v1.ResourceMemory: resource.MustParse("512Mi")}, + }} + + expectedResourcesString := ` + resources: + limits: + cpu: 114m + memory: 256Mi + requests: + cpu: 200m + memory: 512Mi +` + yamlData := GetCSIDeploymentYAML(args) + _, err := yaml.YAMLToJSON([]byte(yamlData)) + if err != nil { + t.Fatalf("expected valid YAML, got %s", yamlData) + } + assert.Contains(t, yamlData, expectedResourcesString, + fmt.Sprintf("expected resources in final YAML: %s", yamlData)) +} + func TestGetCSIDaemonSetYAMLLinux(t *testing.T) { versions := []string{"1.21.0", "1.23.0", "1.25.0"} @@ -859,6 +884,30 @@ func TestGetCSIDaemonSetYAMLLinux_Tolerations(t *testing.T) { fmt.Sprintf("expected default tolerations to not appear in final YAML: %s", yamlData)) } +func TestGetCSIDaemonSetYAMLLinux_Resources(t *testing.T) { + args := &DaemonsetYAMLArguments{Resources: &v1.ResourceRequirements{ + Limits: v1.ResourceList{v1.ResourceCPU: resource.MustParse("114m"), v1.ResourceMemory: resource.MustParse("256Mi")}, + Requests: v1.ResourceList{v1.ResourceCPU: resource.MustParse("200m"), v1.ResourceMemory: resource.MustParse("512Mi")}, + }} + + expectedResourcesString := ` + resources: + limits: + cpu: 114m + memory: 256Mi + requests: + cpu: 200m + memory: 512Mi +` + yamlData := GetCSIDaemonSetYAMLLinux(args) + _, err := yaml.YAMLToJSON([]byte(yamlData)) + if err != nil { + t.Fatalf("expected valid YAML, got %s", yamlData) + } + assert.Contains(t, yamlData, expectedResourcesString, + fmt.Sprintf("expected resources in final YAML: %s", yamlData)) +} + func TestGetCSIDaemonSetYAMLWindows(t *testing.T) { versions := []string{"1.21.0", "1.23.0", "1.25.0"} diff --git a/helm/trident-operator/templates/tridentorchestrator.yaml b/helm/trident-operator/templates/tridentorchestrator.yaml index 73eab358a..ea76442db 100644 --- a/helm/trident-operator/templates/tridentorchestrator.yaml +++ b/helm/trident-operator/templates/tridentorchestrator.yaml @@ -17,6 +17,10 @@ spec: {{- if .Values.tridentDebug }} debug: {{ .Values.tridentDebug }} {{- end }} + daemonsetResources: + {{- toYaml .Values.tridentDaemonsetResources | nindent 4 }} + deploymentResources: + {{- toYaml .Values.tridentDeploymentResources | nindent 4 }} {{- if .Values.tridentLogLevel }} logLevel: {{ .Values.tridentLogLevel }} {{- end }} diff --git a/helm/trident-operator/values.yaml b/helm/trident-operator/values.yaml index a7e8d2536..e01b7c279 100644 --- a/helm/trident-operator/values.yaml +++ b/helm/trident-operator/values.yaml @@ -112,6 +112,18 @@ tridentDisableAuditLog: true # tridentDebug allows the log level of Trident to be set to debug tridentDebug: false +# tridentDaemonsetResources permits specifying the resources for all containers of the trident-node daemonset. example: +# tridentDaemonsetResources: +# requests: +# cpu: 250m +# limits: +# cpu: 100m +# memory: 1Gi +tridentDaemonsetResources: {} + +# tridentDeploymentResources permits specifying the resources for all containers of the trident-controller deployment. +tridentDeploymentResources: + # tridentLogWorkflows allows specific Trident workflows to be enabled for trace logging or log suppression. tridentLogWorkflows: "" diff --git a/operator/controllers/orchestrator/installer/installer.go b/operator/controllers/orchestrator/installer/installer.go index d02fc9f30..f0eaee1f1 100644 --- a/operator/controllers/orchestrator/installer/installer.go +++ b/operator/controllers/orchestrator/installer/installer.go @@ -103,6 +103,9 @@ var ( nodePrep []string + daemonsetResources *v1.ResourceRequirements + deploymentResources *v1.ResourceRequirements + CRDnames = []string{ ActionMirrorUpdateCRDName, ActionSnapshotRestoreCRDName, @@ -391,6 +394,14 @@ func (i *Installer) setInstallationParams( nodePrep = validation.FormatProtocols(cr.Spec.NodePrep) + if cr.Spec.DaemonsetResources != nil { + daemonsetResources = cr.Spec.DaemonsetResources + } + + if cr.Spec.DeploymentResources != nil { + deploymentResources = cr.Spec.DeploymentResources + } + if cr.Spec.ProbePort != nil { probePort = strconv.FormatInt(*cr.Spec.ProbePort, 10) } @@ -1526,6 +1537,7 @@ func (i *Installer) createOrPatchTridentDeployment( EnableACP: enableACP, IdentityLabel: identityLabel, K8sAPIQPS: k8sAPIQPS, + Resources: deploymentResources, } newDeploymentYAML := k8sclient.GetCSIDeploymentYAML(deploymentArgs) @@ -1606,6 +1618,7 @@ func (i *Installer) createOrPatchTridentDaemonSet( ISCSISelfHealingInterval: iscsiSelfHealingInterval, ISCSISelfHealingWaitTime: iscsiSelfHealingWaitTime, NodePrep: nodePrep, + Resources: daemonsetResources, } var newDaemonSetYAML string diff --git a/operator/crd/apis/netapp/v1/types.go b/operator/crd/apis/netapp/v1/types.go index a04c9212a..578446539 100644 --- a/operator/crd/apis/netapp/v1/types.go +++ b/operator/crd/apis/netapp/v1/types.go @@ -5,6 +5,7 @@ package v1 import ( "fmt" + v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" ) @@ -38,44 +39,46 @@ type TridentOrchestratorList struct { // TridentOrchestratorSpec defines the desired state of TridentOrchestrator type TridentOrchestratorSpec struct { - EnableForceDetach bool `json:"enableForceDetach"` - DisableAuditLog *bool `json:"disableAuditLog"` - Namespace string `json:"namespace"` - IPv6 bool `json:"IPv6,omitempty"` - K8sTimeout int `json:"k8sTimeout,omitempty"` - HTTPRequestTimeout string `json:"httpRequestTimeout,omitempty"` - SilenceAutosupport bool `json:"silenceAutosupport,omitempty"` - AutosupportImage string `json:"autosupportImage,omitempty"` - AutosupportProxy string `json:"autosupportProxy,omitempty"` - AutosupportInsecure bool `json:"autosupportInsecure,omitempty"` - AutosupportSerialNumber string `json:"autosupportSerialNumber,omitempty"` - AutosupportHostname string `json:"autosupportHostname,omitempty"` - Uninstall bool `json:"uninstall,omitempty"` - LogFormat string `json:"logFormat,omitempty"` - LogLevel string `json:"logLevel,omitempty"` - Debug bool `json:"debug,omitempty"` - LogWorkflows string `json:"logWorkflows,omitempty"` - LogLayers string `json:"logLayers,omitempty"` - ProbePort *int64 `json:"probePort,omitempty"` - TridentImage string `json:"tridentImage,omitempty"` - ImageRegistry string `json:"imageRegistry,omitempty"` - KubeletDir string `json:"kubeletDir,omitempty"` - Wipeout []string `json:"wipeout,omitempty"` - ImagePullSecrets []string `json:"imagePullSecrets,omitempty"` - ControllerPluginNodeSelector map[string]string `json:"controllerPluginNodeSelector,omitempty"` - ControllerPluginTolerations []Toleration `json:"controllerPluginTolerations,omitempty"` - NodePluginNodeSelector map[string]string `json:"nodePluginNodeSelector,omitempty"` - NodePluginTolerations []Toleration `json:"nodePluginTolerations,omitempty"` - Windows bool `json:"windows,omitempty"` - ImagePullPolicy string `json:"imagePullPolicy,omitempty"` - CloudProvider string `json:"cloudProvider,omitempty"` - CloudIdentity string `json:"cloudIdentity,omitempty"` - EnableACP bool `json:"enableACP,omitempty"` - ACPImage string `json:"acpImage,omitempty"` - ISCSISelfHealingInterval string `json:"iscsiSelfHealingInterval,omitempty"` - ISCSISelfHealingWaitTime string `json:"iscsiSelfHealingWaitTime,omitempty"` - K8sAPIQPS int `json:"k8sAPIQPS,omitempty"` - NodePrep []string `json:"nodePrep"` + EnableForceDetach bool `json:"enableForceDetach"` + DisableAuditLog *bool `json:"disableAuditLog"` + Namespace string `json:"namespace"` + IPv6 bool `json:"IPv6,omitempty"` + K8sTimeout int `json:"k8sTimeout,omitempty"` + HTTPRequestTimeout string `json:"httpRequestTimeout,omitempty"` + SilenceAutosupport bool `json:"silenceAutosupport,omitempty"` + AutosupportImage string `json:"autosupportImage,omitempty"` + AutosupportProxy string `json:"autosupportProxy,omitempty"` + AutosupportInsecure bool `json:"autosupportInsecure,omitempty"` + AutosupportSerialNumber string `json:"autosupportSerialNumber,omitempty"` + AutosupportHostname string `json:"autosupportHostname,omitempty"` + Uninstall bool `json:"uninstall,omitempty"` + LogFormat string `json:"logFormat,omitempty"` + LogLevel string `json:"logLevel,omitempty"` + Debug bool `json:"debug,omitempty"` + LogWorkflows string `json:"logWorkflows,omitempty"` + LogLayers string `json:"logLayers,omitempty"` + ProbePort *int64 `json:"probePort,omitempty"` + TridentImage string `json:"tridentImage,omitempty"` + ImageRegistry string `json:"imageRegistry,omitempty"` + KubeletDir string `json:"kubeletDir,omitempty"` + Wipeout []string `json:"wipeout,omitempty"` + ImagePullSecrets []string `json:"imagePullSecrets,omitempty"` + ControllerPluginNodeSelector map[string]string `json:"controllerPluginNodeSelector,omitempty"` + ControllerPluginTolerations []Toleration `json:"controllerPluginTolerations,omitempty"` + NodePluginNodeSelector map[string]string `json:"nodePluginNodeSelector,omitempty"` + NodePluginTolerations []Toleration `json:"nodePluginTolerations,omitempty"` + Windows bool `json:"windows,omitempty"` + ImagePullPolicy string `json:"imagePullPolicy,omitempty"` + CloudProvider string `json:"cloudProvider,omitempty"` + CloudIdentity string `json:"cloudIdentity,omitempty"` + EnableACP bool `json:"enableACP,omitempty"` + ACPImage string `json:"acpImage,omitempty"` + ISCSISelfHealingInterval string `json:"iscsiSelfHealingInterval,omitempty"` + ISCSISelfHealingWaitTime string `json:"iscsiSelfHealingWaitTime,omitempty"` + K8sAPIQPS int `json:"k8sAPIQPS,omitempty"` + NodePrep []string `json:"nodePrep"` + DaemonsetResources *v1.ResourceRequirements `json:"daemonsetResources,omitempty"` + DeploymentResources *v1.ResourceRequirements `json:"deploymentResources,omitempty"` } // Toleration @@ -124,35 +127,37 @@ type TridentOrchestratorStatus struct { } type TridentOrchestratorSpecValues struct { - EnableForceDetach string `json:"enableForceDetach"` - DisableAuditLog string `json:"disableAuditLog"` - IPv6 string `json:"IPv6"` - SilenceAutosupport string `json:"silenceAutosupport"` - AutosupportImage string `json:"autosupportImage"` - AutosupportProxy string `json:"autosupportProxy"` - AutosupportInsecure bool `json:"autosupportInsecure"` - AutosupportSerialNumber string `json:"autosupportSerialNumber"` - AutosupportHostname string `json:"autosupportHostname"` - K8sTimeout string `json:"k8sTimeout"` - HTTPRequestTimeout string `json:"httpRequestTimeout"` - LogFormat string `json:"logFormat"` - LogLevel string `json:"logLevel"` - Debug string `json:"debug"` - LogWorkflows string `json:"logWorkflows"` - LogLayers string `json:"logLayers"` - ProbePort string `json:"probePort"` - TridentImage string `json:"tridentImage"` - ImageRegistry string `json:"imageRegistry"` - KubeletDir string `json:"kubeletDir"` - ImagePullSecrets []string `json:"imagePullSecrets"` - NodePluginNodeSelector map[string]string `json:"nodePluginNodeSelector,omitempty"` - NodePluginTolerations []Toleration `json:"nodePluginTolerations,omitempty"` - ImagePullPolicy string `json:"imagePullPolicy"` - EnableACP string `json:"enableACP"` - ACPImage string `json:"acpImage"` - ISCSISelfHealingInterval string `json:"iscsiSelfHealingInterval"` - ISCSISelfHealingWaitTime string `json:"iscsiSelfHealingWaitTime"` - NodePrep []string `json:"nodePrep"` + EnableForceDetach string `json:"enableForceDetach"` + DisableAuditLog string `json:"disableAuditLog"` + IPv6 string `json:"IPv6"` + SilenceAutosupport string `json:"silenceAutosupport"` + AutosupportImage string `json:"autosupportImage"` + AutosupportProxy string `json:"autosupportProxy"` + AutosupportInsecure bool `json:"autosupportInsecure"` + AutosupportSerialNumber string `json:"autosupportSerialNumber"` + AutosupportHostname string `json:"autosupportHostname"` + K8sTimeout string `json:"k8sTimeout"` + HTTPRequestTimeout string `json:"httpRequestTimeout"` + LogFormat string `json:"logFormat"` + LogLevel string `json:"logLevel"` + Debug string `json:"debug"` + LogWorkflows string `json:"logWorkflows"` + LogLayers string `json:"logLayers"` + ProbePort string `json:"probePort"` + TridentImage string `json:"tridentImage"` + ImageRegistry string `json:"imageRegistry"` + KubeletDir string `json:"kubeletDir"` + ImagePullSecrets []string `json:"imagePullSecrets"` + NodePluginNodeSelector map[string]string `json:"nodePluginNodeSelector,omitempty"` + NodePluginTolerations []Toleration `json:"nodePluginTolerations,omitempty"` + ImagePullPolicy string `json:"imagePullPolicy"` + EnableACP string `json:"enableACP"` + ACPImage string `json:"acpImage"` + ISCSISelfHealingInterval string `json:"iscsiSelfHealingInterval"` + ISCSISelfHealingWaitTime string `json:"iscsiSelfHealingWaitTime"` + NodePrep []string `json:"nodePrep"` + DaemonsetResources *v1.ResourceRequirements `json:"daemonsetResources,omitempty"` + DeploymentResources *v1.ResourceRequirements `json:"deploymentResources,omitempty"` } /************************