diff --git a/app/kubernetes/converters/application.js b/app/kubernetes/converters/application.js index 3c075956b..94363767c 100644 --- a/app/kubernetes/converters/application.js +++ b/app/kubernetes/converters/application.js @@ -300,7 +300,7 @@ class KubernetesApplicationConverter { formValues.ApplicationOwner = KubernetesCommonHelper.ownerToLabel(formValues.ApplicationOwner); const claims = KubernetesPersistentVolumeClaimConverter.applicationFormValuesToVolumeClaims(formValues); - const rwx = _.find(claims, (item) => _.includes(item.StorageClass.AccessModes, 'RWX')) !== undefined; + const rwx = KubernetesApplicationHelper.hasRWX(claims); const deployment = (formValues.DeploymentType === KubernetesApplicationDeploymentTypes.REPLICATED && diff --git a/app/kubernetes/converters/persistentVolumeClaim.js b/app/kubernetes/converters/persistentVolumeClaim.js index 60ea28c58..5985a4723 100644 --- a/app/kubernetes/converters/persistentVolumeClaim.js +++ b/app/kubernetes/converters/persistentVolumeClaim.js @@ -62,7 +62,7 @@ class KubernetesPersistentVolumeClaimConverter { res.metadata.name = pvc.Name; res.metadata.namespace = pvc.Namespace; res.spec.resources.requests.storage = pvc.Storage; - res.spec.storageClassName = pvc.StorageClass.Name; + res.spec.storageClassName = pvc.StorageClass ? pvc.StorageClass.Name : ''; res.metadata.labels.app = pvc.ApplicationName; res.metadata.labels[KubernetesPortainerApplicationOwnerLabel] = pvc.ApplicationOwner; res.metadata.labels[KubernetesPortainerApplicationNameLabel] = pvc.ApplicationName; diff --git a/app/kubernetes/helpers/application/index.js b/app/kubernetes/helpers/application/index.js index b66a49019..1c461cd80 100644 --- a/app/kubernetes/helpers/application/index.js +++ b/app/kubernetes/helpers/application/index.js @@ -349,6 +349,14 @@ class KubernetesApplicationHelper { app.Volumes.push(volume); }); } + + static hasRWOOnly(formValues) { + return _.find(formValues.PersistedFolders, (item) => item.StorageClass && _.isEqual(item.StorageClass.AccessModes, ['RWO'])); + } + + static hasRWX(claims) { + return _.find(claims, (item) => item.StorageClass && _.includes(item.StorageClass.AccessModes, 'RWX')) !== undefined; + } /* #endregion */ /* #region PLACEMENTS FV <> AFFINITY */ diff --git a/app/kubernetes/views/applications/create/createApplicationController.js b/app/kubernetes/views/applications/create/createApplicationController.js index 46ece0ced..9de41e5ec 100644 --- a/app/kubernetes/views/applications/create/createApplicationController.js +++ b/app/kubernetes/views/applications/create/createApplicationController.js @@ -462,7 +462,7 @@ class KubernetesCreateApplicationController { // * The data access policy is set to ISOLATED supportGlobalDeployment() { const hasFolders = this.formValues.PersistedFolders.length !== 0; - const hasRWOOnly = _.find(this.formValues.PersistedFolders, (item) => _.isEqual(item.StorageClass.AccessModes, ['RWO'])); + const hasRWOOnly = KubernetesApplicationHelper.hasRWOOnly(this.formValues); const isIsolated = this.formValues.DataAccessPolicy === this.ApplicationDataAccessPolicies.ISOLATED; if ((hasFolders && hasRWOOnly) || isIsolated) { @@ -483,7 +483,7 @@ class KubernetesCreateApplicationController { // * The access policy is set to isolated supportScalableReplicaDeployment() { const hasFolders = this.formValues.PersistedFolders.length !== 0; - const hasRWOOnly = _.find(this.formValues.PersistedFolders, (item) => _.isEqual(item.StorageClass.AccessModes, ['RWO'])); + const hasRWOOnly = KubernetesApplicationHelper.hasRWOOnly(this.formValues); const isIsolated = this.formValues.DataAccessPolicy === this.ApplicationDataAccessPolicies.ISOLATED; if (!hasFolders || isIsolated || (hasFolders && !hasRWOOnly)) { @@ -499,7 +499,7 @@ class KubernetesCreateApplicationController { for (let i = 0; i < this.formValues.PersistedFolders.length; i++) { const folder = this.formValues.PersistedFolders[i]; - if (_.isEqual(folder.StorageClass.AccessModes, ['RWO'])) { + if (folder.StorageClass && _.isEqual(folder.StorageClass.AccessModes, ['RWO'])) { storageOptions.push(folder.StorageClass.Name); } }