diff --git a/portal-ui/src/screens/Console/Tenants/AddTenant/Steps/Configure.tsx b/portal-ui/src/screens/Console/Tenants/AddTenant/Steps/Configure.tsx index 5b39966b2..8e03172f2 100644 --- a/portal-ui/src/screens/Console/Tenants/AddTenant/Steps/Configure.tsx +++ b/portal-ui/src/screens/Console/Tenants/AddTenant/Steps/Configure.tsx @@ -170,6 +170,12 @@ const Configure = ({ classes }: IConfigureProps) => { (state: AppState) => state.createTenant.fields.configure.tenantSecurityContext ); + const customRuntime = useSelector( + (state: AppState) => state.createTenant.fields.configure.customRuntime + ); + const runtimeClassName = useSelector( + (state: AppState) => state.createTenant.fields.configure.runtimeClassName + ); const [validationErrors, setValidationErrors] = useState({}); @@ -561,6 +567,47 @@ const Configure = ({ classes }: IConfigureProps) => { )} + + { + const targetD = e.target; + const checked = targetD.checked; + + updateField("customRuntime", checked); + }} + label={"Custom Runtime Configurations"} + /> + + {customRuntime && ( + +
+ + Custom Runtime Configurations + + +
+ ) => { + updateField("runtimeClassName", e.target.value); + cleanValidation("tenant_runtime_runtimeClassName"); + }} + label="Runtime Class Name" + value={runtimeClassName} + error={ + validationErrors["tenant_runtime_runtimeClassName"] || "" + } + /> +
+
+
+
+ )}
diff --git a/portal-ui/src/screens/Console/Tenants/AddTenant/Steps/TenantResources/NameTenantMain.tsx b/portal-ui/src/screens/Console/Tenants/AddTenant/Steps/TenantResources/NameTenantMain.tsx index 8d1a1720d..4526cff4d 100644 --- a/portal-ui/src/screens/Console/Tenants/AddTenant/Steps/TenantResources/NameTenantMain.tsx +++ b/portal-ui/src/screens/Console/Tenants/AddTenant/Steps/TenantResources/NameTenantMain.tsx @@ -124,7 +124,7 @@ const NameTenantMain = ({ classes, formToRender }: INameTenantMainScreen) => { return ( - + diff --git a/portal-ui/src/screens/Console/Tenants/AddTenant/createTenantSlice.ts b/portal-ui/src/screens/Console/Tenants/AddTenant/createTenantSlice.ts index 62e61266d..c8319f86b 100644 --- a/portal-ui/src/screens/Console/Tenants/AddTenant/createTenantSlice.ts +++ b/portal-ui/src/screens/Console/Tenants/AddTenant/createTenantSlice.ts @@ -103,6 +103,8 @@ const initialState: ICreateTenant = { exposeMinIO: true, exposeConsole: true, tenantCustom: false, + customRuntime: false, + runtimeClassName: "", envVars: [{ key: "", value: "" }], logSearchEnabled: false, prometheusEnabled: false, diff --git a/portal-ui/src/screens/Console/Tenants/AddTenant/thunks/createTenantThunk.ts b/portal-ui/src/screens/Console/Tenants/AddTenant/thunks/createTenantThunk.ts index 99ba0aef5..2b5371e7f 100644 --- a/portal-ui/src/screens/Console/Tenants/AddTenant/thunks/createTenantThunk.ts +++ b/portal-ui/src/screens/Console/Tenants/AddTenant/thunks/createTenantThunk.ts @@ -139,6 +139,8 @@ export const createTenantAsync = createAsyncThunk( const minioDomains = fields.configure.minioDomains; const consoleDomain = fields.configure.consoleDomain; const environmentVariables = fields.configure.envVars; + const customRuntime = fields.configure.customRuntime; + const runtimeClassName = fields.configure.runtimeClassName; let tolerations = state.createTenant.tolerations; let namespace = state.createTenant.fields.nameTenant.namespace; @@ -171,6 +173,14 @@ export const createTenantAsync = createAsyncThunk( const erasureCode = ecParity.split(":")[1]; + let runtimeClass = {}; + + if (customRuntime) { + runtimeClass = { + runtimeClassName, + }; + } + let dataSend: ITenantCreator = { name: tenantName, namespace: namespace, @@ -195,8 +205,9 @@ export const createTenantAsync = createAsyncThunk( storage_class_name: selectedStorageClass, }, securityContext: tenantCustom ? tenantSecurityContext : null, - ...affinityObject, tolerations: tolerationValues, + ...affinityObject, + ...runtimeClass, }, ], erasureCodingParity: parseInt(erasureCode, 10), diff --git a/portal-ui/src/screens/Console/Tenants/ListTenants/types.ts b/portal-ui/src/screens/Console/Tenants/ListTenants/types.ts index 8012de4fc..790a14b21 100644 --- a/portal-ui/src/screens/Console/Tenants/ListTenants/types.ts +++ b/portal-ui/src/screens/Console/Tenants/ListTenants/types.ts @@ -53,6 +53,7 @@ export interface IPool { affinity?: IAffinityModel; tolerations?: ITolerationModel[]; securityContext?: ISecurityContext | null; + runtimeClassName: string; } export interface IPodListElement { diff --git a/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/AddPool/PoolConfiguration.tsx b/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/AddPool/PoolConfiguration.tsx index 1b1751b68..e5f16b449 100644 --- a/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/AddPool/PoolConfiguration.tsx +++ b/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/AddPool/PoolConfiguration.tsx @@ -86,6 +86,12 @@ const PoolConfiguration = ({ classes }: IConfigureProps) => { const securityContext = useSelector( (state: AppState) => state.addPool.configuration.securityContext ); + const customRuntime = useSelector( + (state: AppState) => state.addPool.configuration.customRuntime + ); + const runtimeClassName = useSelector( + (state: AppState) => state.addPool.configuration.runtimeClassName + ); const [validationErrors, setValidationErrors] = useState({}); @@ -276,6 +282,52 @@ const PoolConfiguration = ({ classes }: IConfigureProps) => { )} + + { + const targetD = e.target; + const checked = targetD.checked; + + updateField("customRuntime", checked); + }} + label={"Custom Runtime Configurations"} + /> + + {customRuntime && ( + +
+ + Custom Runtime Configurations + + +
+ ) => { + updateField("runtimeClassName", e.target.value); + cleanValidation("tenant_runtime_runtimeClassName"); + }} + label="Runtime Class Name" + value={runtimeClassName} + error={ + validationErrors["tenant_runtime_runtimeClassName"] || "" + } + /> +
+
+
+
+ )}
); }; diff --git a/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/AddPool/addPoolSlice.ts b/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/AddPool/addPoolSlice.ts index 72a52689e..949ffa3fe 100644 --- a/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/AddPool/addPoolSlice.ts +++ b/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/AddPool/addPoolSlice.ts @@ -71,6 +71,8 @@ const initialState: IAddPool = { fsGroupChangePolicy: "Always", runAsNonRoot: true, }, + customRuntime: false, + runtimeClassName: "", }, nodeSelectorPairs: [{ key: "", value: "" }], tolerations: [ diff --git a/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/AddPool/addPoolThunks.ts b/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/AddPool/addPoolThunks.ts index e17ff090b..9bc732c51 100644 --- a/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/AddPool/addPoolThunks.ts +++ b/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/AddPool/addPoolThunks.ts @@ -42,6 +42,9 @@ export const addPoolAsync = createAsyncThunk( const securityContextEnabled = state.addPool.configuration.securityContextEnabled; const securityContext = state.addPool.configuration.securityContext; + const customRuntime = state.addPool.configuration.customRuntime; + const runtimeClassName = state.addPool.configuration.runtimeClassName; + if (tenant === null) { return; } @@ -72,6 +75,14 @@ export const addPoolAsync = createAsyncThunk( (toleration) => toleration.key.trim() !== "" ); + let runtimeClass = {}; + + if (customRuntime) { + runtimeClass = { + runtimeClassName, + }; + } + const data: IAddPoolRequest = { name: poolName, servers: numberOfNodes, @@ -84,6 +95,7 @@ export const addPoolAsync = createAsyncThunk( tolerations: tolerationValues, securityContext: securityContextEnabled ? securityContext : null, ...affinityObject, + ...runtimeClass, }; const poolsURL = `/namespaces/${tenant?.namespace || ""}/tenants/${ tenant?.name || "" diff --git a/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/Details/PoolDetails.tsx b/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/Details/PoolDetails.tsx index 1bd7d0990..f198f8631 100644 --- a/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/Details/PoolDetails.tsx +++ b/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/Details/PoolDetails.tsx @@ -79,6 +79,8 @@ const PoolDetails = () => { ); }; + console.log(poolInformation); + return ( @@ -108,6 +110,10 @@ const PoolDetails = () => { value={poolInformation.volumes_per_server} /> + diff --git a/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/EditPool/EditPoolConfiguration.tsx b/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/EditPool/EditPoolConfiguration.tsx index f32cb19c0..fa90e03d3 100644 --- a/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/EditPool/EditPoolConfiguration.tsx +++ b/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/EditPool/EditPoolConfiguration.tsx @@ -88,6 +88,12 @@ const PoolConfiguration = ({ classes }: IConfigureProps) => { const securityContext = useSelector( (state: AppState) => state.editPool.fields.configuration.securityContext ); + const customRuntime = useSelector( + (state: AppState) => state.editPool.fields.configuration.customRuntime + ); + const runtimeClassName = useSelector( + (state: AppState) => state.editPool.fields.configuration.runtimeClassName + ); const [validationErrors, setValidationErrors] = useState({}); @@ -275,6 +281,52 @@ const PoolConfiguration = ({ classes }: IConfigureProps) => { )} + + { + const targetD = e.target; + const checked = targetD.checked; + + updateField("customRuntime", checked); + }} + label={"Custom Runtime Configurations"} + /> + + {customRuntime && ( + +
+ + Custom Runtime Configurations + + +
+ ) => { + updateField("runtimeClassName", e.target.value); + cleanValidation("tenant_runtime_runtimeClassName"); + }} + label="Runtime Class Name" + value={runtimeClassName} + error={ + validationErrors["tenant_runtime_runtimeClassName"] || "" + } + /> +
+
+
+
+ )} ); }; diff --git a/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/EditPool/editPoolSlice.ts b/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/EditPool/editPoolSlice.ts index a376f5a34..908aaa233 100644 --- a/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/EditPool/editPoolSlice.ts +++ b/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/EditPool/editPoolSlice.ts @@ -53,6 +53,8 @@ const initialState: IEditPool = { fsGroupChangePolicy: "Always", runAsNonRoot: true, }, + customRuntime: false, + runtimeClassName: "", }, nodeSelectorPairs: [{ key: "", value: "" }], tolerations: [ @@ -156,6 +158,8 @@ export const editPoolSlice = createSlice({ action.payload.securityContext?.fsGroupChangePolicy || "Always", runAsNonRoot: !!action.payload.securityContext?.runAsNonRoot, }, + customRuntime: !!action.payload.runtimeClassName, + runtimeClassName: action.payload.runtimeClassName, }, affinity: { podAffinity, diff --git a/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/EditPool/thunks/editPoolAsync.ts b/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/EditPool/thunks/editPoolAsync.ts index 79d245f8f..e3f5dcde1 100644 --- a/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/EditPool/thunks/editPoolAsync.ts +++ b/portal-ui/src/screens/Console/Tenants/TenantDetails/Pools/EditPool/thunks/editPoolAsync.ts @@ -45,6 +45,10 @@ export const editPoolAsync = createAsyncThunk( const securityContextEnabled = state.editPool.fields.configuration.securityContextEnabled; const securityContext = state.editPool.fields.configuration.securityContext; + const customRuntime = state.editPool.fields.configuration.customRuntime; + const runtimeClassName = + state.editPool.fields.configuration.runtimeClassName; + if (!tenant) { return; } @@ -98,6 +102,14 @@ export const editPoolAsync = createAsyncThunk( return request; }); + let runtimeClass = {}; + + if (customRuntime) { + runtimeClass = { + runtimeClassName, + }; + } + const data: IEditPoolRequest = { pools: [ ...cleanPools, @@ -113,6 +125,7 @@ export const editPoolAsync = createAsyncThunk( tolerations: tolerationValues, securityContext: securityContextEnabled ? securityContext : null, ...affinityObject, + ...runtimeClass, }, ], }; diff --git a/portal-ui/src/screens/Console/Tenants/types.ts b/portal-ui/src/screens/Console/Tenants/types.ts index 9f964b2ae..2e76194cd 100644 --- a/portal-ui/src/screens/Console/Tenants/types.ts +++ b/portal-ui/src/screens/Console/Tenants/types.ts @@ -155,6 +155,8 @@ export interface IConfigureFields { exposeConsole: boolean; prometheusEnabled: boolean; tenantCustom: boolean; + customRuntime: boolean; + runtimeClassName: string; envVars: LabelKeyPair[]; logSearchEnabled: boolean; logSearchVolumeSize: string; @@ -324,6 +326,8 @@ export interface IAddPoolSetup { export interface IPoolConfiguration { securityContextEnabled: boolean; securityContext: ISecurityContext; + customRuntime: boolean; + runtimeClassName: string; } export interface ITenantIdentityProviderResponse {