mirror of https://github.com/portainer/portainer
				
				
				
			
		
			
				
	
	
		
			91 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
import _ from 'lodash-es';
 | 
						|
import * as JsonPatch from 'fast-json-patch';
 | 
						|
 | 
						|
import { KubernetesPersistentVolumeClaim } from 'Kubernetes/models/volume/models';
 | 
						|
import { KubernetesPersistentVolumClaimCreatePayload } from 'Kubernetes/models/volume/payloads';
 | 
						|
import { KubernetesPortainerApplicationOwnerLabel, KubernetesPortainerApplicationNameLabel } from 'Kubernetes/models/application/models';
 | 
						|
 | 
						|
const storageClassToPVCAccessModes = {
 | 
						|
  RWO: 'ReadWriteOnce',
 | 
						|
  RWX: 'ReadWriteMany',
 | 
						|
};
 | 
						|
 | 
						|
class KubernetesPersistentVolumeClaimConverter {
 | 
						|
  static apiToPersistentVolumeClaim(data, storageClasses, yaml) {
 | 
						|
    const res = new KubernetesPersistentVolumeClaim();
 | 
						|
    res.Id = data.metadata.uid;
 | 
						|
    res.Name = data.metadata.name;
 | 
						|
    res.Namespace = data.metadata.namespace;
 | 
						|
    res.CreationDate = data.metadata.creationTimestamp;
 | 
						|
    res.Storage = `${data.spec.resources.requests.storage}B`;
 | 
						|
    res.AccessModes = data.spec.accessModes || [];
 | 
						|
    res.storageClass = _.find(storageClasses, { Name: data.spec.storageClassName });
 | 
						|
    res.Yaml = yaml ? yaml.data : '';
 | 
						|
    res.ApplicationOwner = data.metadata.labels ? data.metadata.labels[KubernetesPortainerApplicationOwnerLabel] : '';
 | 
						|
    res.ApplicationName = data.metadata.labels ? data.metadata.labels[KubernetesPortainerApplicationNameLabel] : '';
 | 
						|
    return res;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Generate KubernetesPersistentVolumeClaim list from KubernetesApplicationFormValues
 | 
						|
   * @param {KubernetesApplicationFormValues} formValues
 | 
						|
   */
 | 
						|
  static applicationFormValuesToVolumeClaims(formValues) {
 | 
						|
    _.remove(formValues.PersistedFolders, (item) => item.needsDeletion);
 | 
						|
    const res = _.map(formValues.PersistedFolders, (item) => {
 | 
						|
      const pvc = new KubernetesPersistentVolumeClaim();
 | 
						|
      if (!_.isEmpty(item.existingVolume)) {
 | 
						|
        const existantPVC = item.existingVolume.PersistentVolumeClaim;
 | 
						|
        pvc.Name = existantPVC.Name;
 | 
						|
        if (item.persistentVolumeClaimName) {
 | 
						|
          pvc.PreviousName = item.persistentVolumeClaimName;
 | 
						|
        }
 | 
						|
        pvc.storageClass = existantPVC.storageClass;
 | 
						|
        pvc.Storage = existantPVC.Storage.charAt(0);
 | 
						|
        pvc.CreationDate = existantPVC.CreationDate;
 | 
						|
        pvc.Id = existantPVC.Id;
 | 
						|
      } else {
 | 
						|
        if (item.persistentVolumeClaimName) {
 | 
						|
          pvc.Name = item.persistentVolumeClaimName;
 | 
						|
          if (!item.useNewVolume) {
 | 
						|
            pvc.PreviousName = item.persistentVolumeClaimName;
 | 
						|
          }
 | 
						|
        } else {
 | 
						|
          pvc.Name = formValues.Name + '-' + pvc.Name;
 | 
						|
        }
 | 
						|
        pvc.Storage = '' + item.size + item.sizeUnit.charAt(0);
 | 
						|
        pvc.storageClass = item.storageClass;
 | 
						|
      }
 | 
						|
      pvc.MountPath = item.containerPath;
 | 
						|
      pvc.Namespace = formValues.ResourcePool.Namespace.Name;
 | 
						|
      pvc.ApplicationOwner = formValues.ApplicationOwner;
 | 
						|
      pvc.ApplicationName = formValues.Name;
 | 
						|
      return pvc;
 | 
						|
    });
 | 
						|
    return res;
 | 
						|
  }
 | 
						|
 | 
						|
  static createPayload(pvc) {
 | 
						|
    const res = new KubernetesPersistentVolumClaimCreatePayload();
 | 
						|
    res.metadata.name = pvc.Name;
 | 
						|
    res.metadata.namespace = pvc.Namespace;
 | 
						|
    res.spec.resources.requests.storage = pvc.Storage;
 | 
						|
    res.spec.storageClassName = pvc.storageClass ? pvc.storageClass.Name : '';
 | 
						|
    const accessModes = pvc.storageClass && pvc.storageClass.AccessModes ? pvc.storageClass.AccessModes.map((accessMode) => storageClassToPVCAccessModes[accessMode]) : [];
 | 
						|
    res.spec.accessModes = accessModes;
 | 
						|
    res.metadata.labels.app = pvc.ApplicationName;
 | 
						|
    res.metadata.labels[KubernetesPortainerApplicationOwnerLabel] = pvc.ApplicationOwner;
 | 
						|
    res.metadata.labels[KubernetesPortainerApplicationNameLabel] = pvc.ApplicationName;
 | 
						|
    return res;
 | 
						|
  }
 | 
						|
 | 
						|
  static patchPayload(oldPVC, newPVC) {
 | 
						|
    const oldPayload = KubernetesPersistentVolumeClaimConverter.createPayload(oldPVC);
 | 
						|
    const newPayload = KubernetesPersistentVolumeClaimConverter.createPayload(newPVC);
 | 
						|
    const payload = JsonPatch.compare(oldPayload, newPayload);
 | 
						|
    return payload;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
export default KubernetesPersistentVolumeClaimConverter;
 |