@openshift-assisted/ui-lib 2.7.13-cim → 2.7.14-cim
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cim/index.js +9 -9
- package/dist/cim/index.js.map +2 -2
- package/dist/index.js +20 -20
- package/dist/index.js.map +2 -2
- package/dist/locales/en/translation.json +1 -0
- package/dist/ocm/index.js +15 -15
- package/dist/ocm/index.js.map +2 -2
- package/dist/src/common/components/clusterDetail/ClusterCredentials.d.ts +1 -0
- package/package.json +1 -1
package/dist/ocm/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
var Pk=Object.create;var Pa=Object.defineProperty;var wk=Object.getOwnPropertyDescriptor;var Dk=Object.getOwnPropertyNames;var Ek=Object.getPrototypeOf,Ak=Object.prototype.hasOwnProperty;var df=e=>Pa(e,"__esModule",{value:!0});var Fk=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),lr=(e,t)=>{df(e);for(var o in t)Pa(e,o,{get:t[o],enumerable:!0})},Vk=(e,t,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Dk(t))!Ak.call(e,r)&&r!=="default"&&Pa(e,r,{get:()=>t[r],enumerable:!(o=wk(t,r))||o.enumerable});return e},Nk=e=>Vk(df(Pa(e!=null?Pk(Ek(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e);var Hf=Fk((s6,Ea)=>{var mf,ff,gf,hf,Cf,yf,vf,Sf,If,wa,vu,bf,xf,kf,si,Tf,Pf,wf,Df,Ef,Af,Ff,Vf,Nf,Da;(function(e){var t=typeof global=="object"?global:typeof self=="object"?self:typeof this=="object"?this:{};typeof define=="function"&&define.amd?define("tslib",["exports"],function(r){e(o(t,o(r)))}):typeof Ea=="object"&&typeof Ea.exports=="object"?e(o(t,o(Ea.exports))):e(o(t));function o(r,s){return r!==t&&(typeof Object.create=="function"?Object.defineProperty(r,"__esModule",{value:!0}):r.__esModule=!0),function(i,n){return r[i]=s?s(i,n):n}}})(function(e){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,s){r.__proto__=s}||function(r,s){for(var i in s)Object.prototype.hasOwnProperty.call(s,i)&&(r[i]=s[i])};mf=function(r,s){if(typeof s!="function"&&s!==null)throw new TypeError("Class extends value "+String(s)+" is not a constructor or null");t(r,s);function i(){this.constructor=r}r.prototype=s===null?Object.create(s):(i.prototype=s.prototype,new i)},ff=Object.assign||function(r){for(var s,i=1,n=arguments.length;i<n;i++){s=arguments[i];for(var a in s)Object.prototype.hasOwnProperty.call(s,a)&&(r[a]=s[a])}return r},gf=function(r,s){var i={};for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&s.indexOf(n)<0&&(i[n]=r[n]);if(r!=null&&typeof Object.getOwnPropertySymbols=="function")for(var a=0,n=Object.getOwnPropertySymbols(r);a<n.length;a++)s.indexOf(n[a])<0&&Object.prototype.propertyIsEnumerable.call(r,n[a])&&(i[n[a]]=r[n[a]]);return i},hf=function(r,s,i,n){var a=arguments.length,l=a<3?s:n===null?n=Object.getOwnPropertyDescriptor(s,i):n,p;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")l=Reflect.decorate(r,s,i,n);else for(var u=r.length-1;u>=0;u--)(p=r[u])&&(l=(a<3?p(l):a>3?p(s,i,l):p(s,i))||l);return a>3&&l&&Object.defineProperty(s,i,l),l},Cf=function(r,s){return function(i,n){s(i,n,r)}},yf=function(r,s){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(r,s)},vf=function(r,s,i,n){function a(l){return l instanceof i?l:new i(function(p){p(l)})}return new(i||(i=Promise))(function(l,p){function u(m){try{d(n.next(m))}catch(g){p(g)}}function c(m){try{d(n.throw(m))}catch(g){p(g)}}function d(m){m.done?l(m.value):a(m.value).then(u,c)}d((n=n.apply(r,s||[])).next())})},Sf=function(r,s){var i={label:0,sent:function(){if(l[0]&1)throw l[1];return l[1]},trys:[],ops:[]},n,a,l,p;return p={next:u(0),throw:u(1),return:u(2)},typeof Symbol=="function"&&(p[Symbol.iterator]=function(){return this}),p;function u(d){return function(m){return c([d,m])}}function c(d){if(n)throw new TypeError("Generator is already executing.");for(;i;)try{if(n=1,a&&(l=d[0]&2?a.return:d[0]?a.throw||((l=a.return)&&l.call(a),0):a.next)&&!(l=l.call(a,d[1])).done)return l;switch(a=0,l&&(d=[d[0]&2,l.value]),d[0]){case 0:case 1:l=d;break;case 4:return i.label++,{value:d[1],done:!1};case 5:i.label++,a=d[1],d=[0];continue;case 7:d=i.ops.pop(),i.trys.pop();continue;default:if(l=i.trys,!(l=l.length>0&&l[l.length-1])&&(d[0]===6||d[0]===2)){i=0;continue}if(d[0]===3&&(!l||d[1]>l[0]&&d[1]<l[3])){i.label=d[1];break}if(d[0]===6&&i.label<l[1]){i.label=l[1],l=d;break}if(l&&i.label<l[2]){i.label=l[2],i.ops.push(d);break}l[2]&&i.ops.pop(),i.trys.pop();continue}d=s.call(r,i)}catch(m){d=[6,m],a=0}finally{n=l=0}if(d[0]&5)throw d[1];return{value:d[0]?d[1]:void 0,done:!0}}},If=function(r,s){for(var i in r)i!=="default"&&!Object.prototype.hasOwnProperty.call(s,i)&&Da(s,r,i)},Da=Object.create?function(r,s,i,n){n===void 0&&(n=i);var a=Object.getOwnPropertyDescriptor(s,i);(!a||("get"in a?!s.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return s[i]}}),Object.defineProperty(r,n,a)}:function(r,s,i,n){n===void 0&&(n=i),r[n]=s[i]},wa=function(r){var s=typeof Symbol=="function"&&Symbol.iterator,i=s&&r[s],n=0;if(i)return i.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(s?"Object is not iterable.":"Symbol.iterator is not defined.")},vu=function(r,s){var i=typeof Symbol=="function"&&r[Symbol.iterator];if(!i)return r;var n=i.call(r),a,l=[],p;try{for(;(s===void 0||s-- >0)&&!(a=n.next()).done;)l.push(a.value)}catch(u){p={error:u}}finally{try{a&&!a.done&&(i=n.return)&&i.call(n)}finally{if(p)throw p.error}}return l},bf=function(){for(var r=[],s=0;s<arguments.length;s++)r=r.concat(vu(arguments[s]));return r},xf=function(){for(var r=0,s=0,i=arguments.length;s<i;s++)r+=arguments[s].length;for(var n=Array(r),a=0,s=0;s<i;s++)for(var l=arguments[s],p=0,u=l.length;p<u;p++,a++)n[a]=l[p];return n},kf=function(r,s,i){if(i||arguments.length===2)for(var n=0,a=s.length,l;n<a;n++)(l||!(n in s))&&(l||(l=Array.prototype.slice.call(s,0,n)),l[n]=s[n]);return r.concat(l||Array.prototype.slice.call(s))},si=function(r){return this instanceof si?(this.v=r,this):new si(r)},Tf=function(r,s,i){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var n=i.apply(r,s||[]),a,l=[];return a={},p("next"),p("throw"),p("return"),a[Symbol.asyncIterator]=function(){return this},a;function p(h){n[h]&&(a[h]=function(C){return new Promise(function(I,S){l.push([h,C,I,S])>1||u(h,C)})})}function u(h,C){try{c(n[h](C))}catch(I){g(l[0][3],I)}}function c(h){h.value instanceof si?Promise.resolve(h.value.v).then(d,m):g(l[0][2],h)}function d(h){u("next",h)}function m(h){u("throw",h)}function g(h,C){h(C),l.shift(),l.length&&u(l[0][0],l[0][1])}},Pf=function(r){var s,i;return s={},n("next"),n("throw",function(a){throw a}),n("return"),s[Symbol.iterator]=function(){return this},s;function n(a,l){s[a]=r[a]?function(p){return(i=!i)?{value:si(r[a](p)),done:a==="return"}:l?l(p):p}:l}},wf=function(r){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var s=r[Symbol.asyncIterator],i;return s?s.call(r):(r=typeof wa=="function"?wa(r):r[Symbol.iterator](),i={},n("next"),n("throw"),n("return"),i[Symbol.asyncIterator]=function(){return this},i);function n(l){i[l]=r[l]&&function(p){return new Promise(function(u,c){p=r[l](p),a(u,c,p.done,p.value)})}}function a(l,p,u,c){Promise.resolve(c).then(function(d){l({value:d,done:u})},p)}},Df=function(r,s){return Object.defineProperty?Object.defineProperty(r,"raw",{value:s}):r.raw=s,r};var o=Object.create?function(r,s){Object.defineProperty(r,"default",{enumerable:!0,value:s})}:function(r,s){r.default=s};Ef=function(r){if(r&&r.__esModule)return r;var s={};if(r!=null)for(var i in r)i!=="default"&&Object.prototype.hasOwnProperty.call(r,i)&&Da(s,r,i);return o(s,r),s},Af=function(r){return r&&r.__esModule?r:{default:r}},Ff=function(r,s,i,n){if(i==="a"&&!n)throw new TypeError("Private accessor was defined without a getter");if(typeof s=="function"?r!==s||!n:!s.has(r))throw new TypeError("Cannot read private member from an object whose class did not declare it");return i==="m"?n:i==="a"?n.call(r):n?n.value:s.get(r)},Vf=function(r,s,i,n,a){if(n==="m")throw new TypeError("Private method is not writable");if(n==="a"&&!a)throw new TypeError("Private accessor was defined without a setter");if(typeof s=="function"?r!==s||!a:!s.has(r))throw new TypeError("Cannot write private member to an object whose class did not declare it");return n==="a"?a.call(r,i):a?a.value=i:s.set(r,i),i},Nf=function(r,s){if(s===null||typeof s!="object"&&typeof s!="function")throw new TypeError("Cannot use 'in' operator on non-object");return typeof r=="function"?s===r:r.has(s)},e("__extends",mf),e("__assign",ff),e("__rest",gf),e("__decorate",hf),e("__param",Cf),e("__metadata",yf),e("__awaiter",vf),e("__generator",Sf),e("__exportStar",If),e("__createBinding",Da),e("__values",wa),e("__read",vu),e("__spread",bf),e("__spreadArrays",xf),e("__spreadArray",kf),e("__await",si),e("__asyncGenerator",Tf),e("__asyncDelegator",Pf),e("__asyncValues",wf),e("__makeTemplateObject",Df),e("__importStar",Ef),e("__importDefault",Af),e("__classPrivateFieldGet",Ff),e("__classPrivateFieldSet",Vf),e("__classPrivateFieldIn",Nf)})});var Kf={};lr(Kf,{BASE_PATH:()=>Uf,FETCH_ABORTED_ERROR_CODE:()=>en,FETCH_CONNECTIVITY_ERROR_CODE:()=>bu,client:()=>V,getApiErrorCode:()=>xu,getApiErrorMessage:()=>D,handleApiError:()=>x,ocmClient:()=>oe,setAuthInterceptor:()=>Wk});import Iu from"axios";import Bf from"axios-case-converter";var Of=Nk(Hf()),{__extends:i6,__assign:Aa,__rest:n6,__decorate:a6,__param:l6,__metadata:p6,__awaiter:u6,__generator:c6,__exportStar:d6,__createBinding:m6,__values:f6,__read:g6,__spread:h6,__spreadArrays:C6,__spreadArray:y6,__await:v6,__asyncGenerator:S6,__asyncDelegator:I6,__asyncValues:b6,__makeTemplateObject:x6,__importStar:k6,__importDefault:T6,__classPrivateFieldGet:P6,__classPrivateFieldSet:w6,__classPrivateFieldIn:D6}=Of.default;function Lf(e){return e.toLowerCase()}var Hk=[/([a-z0-9])([A-Z])/g,/([A-Z])([A-Z][a-z])/g],Ok=/[^A-Z0-9]+/gi;function Mf(e,t){t===void 0&&(t={});for(var o=t.splitRegexp,r=o===void 0?Hk:o,s=t.stripRegexp,i=s===void 0?Ok:s,n=t.transform,a=n===void 0?Lf:n,l=t.delimiter,p=l===void 0?" ":l,u=_f(_f(e,r,"$1\0$2"),i,"\0"),c=0,d=u.length;u.charAt(c)==="\0";)c++;for(;u.charAt(d-1)==="\0";)d--;return u.slice(c,d).split("\0").map(a).join(p)}function _f(e,t,o){return t instanceof RegExp?e.replace(t,o):t.reduce(function(r,s){return r.replace(s,o)},e)}function Su(e,t){var o=e.charAt(0),r=e.substr(1).toLowerCase();return t>0&&o>="0"&&o<="9"?"_"+o+r:""+o.toUpperCase()+r}function Wf(e,t){return t===void 0&&(t={}),Mf(e,Aa({delimiter:"",transform:Su},t))}function Lk(e,t){return t===0?e.toLowerCase():Su(e,t)}function zf(e,t){return t===void 0&&(t={}),Wf(e,Aa({transform:Lk},t))}var Uf="/api/assisted-install",Gf={caseFunctions:{camel:e=>zf(e,{stripRegexp:/[^A-Z0-9.-]+/gi})}},Mk=()=>{let e=Iu.create();return e.interceptors.request.use(t=>({...t,url:`${process.env.REACT_APP_API_ROOT}${t.url}`})),Bf(e,Gf)},V=Mk(),oe,_k=e=>(e.interceptors.request.use(t=>({...t,url:`${Uf}${t.url}`})),e),Wk=e=>{oe=e(Iu.create()),V=Bf(_k(e(Iu.create())),Gf)};import Gk from"axios";import{Severity as $k}from"@sentry/browser";import qk from"lodash/pick";import{Severity as $f,captureException as Bk,captureMessage as zk}from"@sentry/browser";var Lo=(e,t,o=$f.Error)=>{oe?(t&&zk(t,o),Bk(e)):o===$f.Error?console.error(t,e):console.warn(t,e)};var L;(function(s){s.x86="x86_64",s.ARM="arm64",s.DAY1_CLUSTER_USES_MULTI="multi",s.USE_DAY1_ARCHITECTURE="cluster-day1-cpu-architecture"})(L||(L={}));var go;(function(r){r.x86="amd64",r.ARM="arm64",r.MULTI="multi"})(go||(go={}));var ii=[L.x86,L.ARM],qf=["vsphere","nutanix"],Yf=["baremetal","none"];var Fa=e=>e==="dev-preview"||e==="tech-preview";function jf(e){return typeof e=="object"&&e!==null}function Rf(e,t){return t in e}var Q;(function(i){i.LOADING="LOADING",i.RELOADING="RELOADING",i.ERROR="ERROR",i.EMPTY="EMPTY",i.LOADED="LOADED"})(Q||(Q={}));function Va(e){return jf(e)&&Rf(e,"isAxiosError")&&e.isAxiosError===!0}var vs=e=>Va(e)?typeof e.response?.data=="object":!1;import Uk from"lodash/isString";var Ge=e=>e instanceof Error?e.message:Uk(e)?e:"Unexpected error";var en="ERR_CANCELED",bu="CONNECTIVITY_ERROR",x=(e,t)=>{if(Gk.isCancel(e))Lo(e,"Request canceled",$k.Info);else if(vs(e)){let o=`URL: ${JSON.stringify(e.config.url,null,1)}
|
|
1
|
+
var wk=Object.create;var Pa=Object.defineProperty;var Dk=Object.getOwnPropertyDescriptor;var Ek=Object.getOwnPropertyNames;var Ak=Object.getPrototypeOf,Fk=Object.prototype.hasOwnProperty;var df=e=>Pa(e,"__esModule",{value:!0});var Vk=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),lr=(e,t)=>{df(e);for(var o in t)Pa(e,o,{get:t[o],enumerable:!0})},Nk=(e,t,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Ek(t))!Fk.call(e,r)&&r!=="default"&&Pa(e,r,{get:()=>t[r],enumerable:!(o=Dk(t,r))||o.enumerable});return e},Hk=e=>Nk(df(Pa(e!=null?wk(Ak(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e);var Hf=Vk((s6,Ea)=>{var mf,ff,gf,hf,Cf,yf,vf,Sf,If,wa,vu,bf,xf,kf,si,Tf,Pf,wf,Df,Ef,Af,Ff,Vf,Nf,Da;(function(e){var t=typeof global=="object"?global:typeof self=="object"?self:typeof this=="object"?this:{};typeof define=="function"&&define.amd?define("tslib",["exports"],function(r){e(o(t,o(r)))}):typeof Ea=="object"&&typeof Ea.exports=="object"?e(o(t,o(Ea.exports))):e(o(t));function o(r,s){return r!==t&&(typeof Object.create=="function"?Object.defineProperty(r,"__esModule",{value:!0}):r.__esModule=!0),function(i,n){return r[i]=s?s(i,n):n}}})(function(e){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,s){r.__proto__=s}||function(r,s){for(var i in s)Object.prototype.hasOwnProperty.call(s,i)&&(r[i]=s[i])};mf=function(r,s){if(typeof s!="function"&&s!==null)throw new TypeError("Class extends value "+String(s)+" is not a constructor or null");t(r,s);function i(){this.constructor=r}r.prototype=s===null?Object.create(s):(i.prototype=s.prototype,new i)},ff=Object.assign||function(r){for(var s,i=1,n=arguments.length;i<n;i++){s=arguments[i];for(var a in s)Object.prototype.hasOwnProperty.call(s,a)&&(r[a]=s[a])}return r},gf=function(r,s){var i={};for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&s.indexOf(n)<0&&(i[n]=r[n]);if(r!=null&&typeof Object.getOwnPropertySymbols=="function")for(var a=0,n=Object.getOwnPropertySymbols(r);a<n.length;a++)s.indexOf(n[a])<0&&Object.prototype.propertyIsEnumerable.call(r,n[a])&&(i[n[a]]=r[n[a]]);return i},hf=function(r,s,i,n){var a=arguments.length,l=a<3?s:n===null?n=Object.getOwnPropertyDescriptor(s,i):n,p;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")l=Reflect.decorate(r,s,i,n);else for(var u=r.length-1;u>=0;u--)(p=r[u])&&(l=(a<3?p(l):a>3?p(s,i,l):p(s,i))||l);return a>3&&l&&Object.defineProperty(s,i,l),l},Cf=function(r,s){return function(i,n){s(i,n,r)}},yf=function(r,s){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(r,s)},vf=function(r,s,i,n){function a(l){return l instanceof i?l:new i(function(p){p(l)})}return new(i||(i=Promise))(function(l,p){function u(m){try{d(n.next(m))}catch(g){p(g)}}function c(m){try{d(n.throw(m))}catch(g){p(g)}}function d(m){m.done?l(m.value):a(m.value).then(u,c)}d((n=n.apply(r,s||[])).next())})},Sf=function(r,s){var i={label:0,sent:function(){if(l[0]&1)throw l[1];return l[1]},trys:[],ops:[]},n,a,l,p;return p={next:u(0),throw:u(1),return:u(2)},typeof Symbol=="function"&&(p[Symbol.iterator]=function(){return this}),p;function u(d){return function(m){return c([d,m])}}function c(d){if(n)throw new TypeError("Generator is already executing.");for(;i;)try{if(n=1,a&&(l=d[0]&2?a.return:d[0]?a.throw||((l=a.return)&&l.call(a),0):a.next)&&!(l=l.call(a,d[1])).done)return l;switch(a=0,l&&(d=[d[0]&2,l.value]),d[0]){case 0:case 1:l=d;break;case 4:return i.label++,{value:d[1],done:!1};case 5:i.label++,a=d[1],d=[0];continue;case 7:d=i.ops.pop(),i.trys.pop();continue;default:if(l=i.trys,!(l=l.length>0&&l[l.length-1])&&(d[0]===6||d[0]===2)){i=0;continue}if(d[0]===3&&(!l||d[1]>l[0]&&d[1]<l[3])){i.label=d[1];break}if(d[0]===6&&i.label<l[1]){i.label=l[1],l=d;break}if(l&&i.label<l[2]){i.label=l[2],i.ops.push(d);break}l[2]&&i.ops.pop(),i.trys.pop();continue}d=s.call(r,i)}catch(m){d=[6,m],a=0}finally{n=l=0}if(d[0]&5)throw d[1];return{value:d[0]?d[1]:void 0,done:!0}}},If=function(r,s){for(var i in r)i!=="default"&&!Object.prototype.hasOwnProperty.call(s,i)&&Da(s,r,i)},Da=Object.create?function(r,s,i,n){n===void 0&&(n=i);var a=Object.getOwnPropertyDescriptor(s,i);(!a||("get"in a?!s.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return s[i]}}),Object.defineProperty(r,n,a)}:function(r,s,i,n){n===void 0&&(n=i),r[n]=s[i]},wa=function(r){var s=typeof Symbol=="function"&&Symbol.iterator,i=s&&r[s],n=0;if(i)return i.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(s?"Object is not iterable.":"Symbol.iterator is not defined.")},vu=function(r,s){var i=typeof Symbol=="function"&&r[Symbol.iterator];if(!i)return r;var n=i.call(r),a,l=[],p;try{for(;(s===void 0||s-- >0)&&!(a=n.next()).done;)l.push(a.value)}catch(u){p={error:u}}finally{try{a&&!a.done&&(i=n.return)&&i.call(n)}finally{if(p)throw p.error}}return l},bf=function(){for(var r=[],s=0;s<arguments.length;s++)r=r.concat(vu(arguments[s]));return r},xf=function(){for(var r=0,s=0,i=arguments.length;s<i;s++)r+=arguments[s].length;for(var n=Array(r),a=0,s=0;s<i;s++)for(var l=arguments[s],p=0,u=l.length;p<u;p++,a++)n[a]=l[p];return n},kf=function(r,s,i){if(i||arguments.length===2)for(var n=0,a=s.length,l;n<a;n++)(l||!(n in s))&&(l||(l=Array.prototype.slice.call(s,0,n)),l[n]=s[n]);return r.concat(l||Array.prototype.slice.call(s))},si=function(r){return this instanceof si?(this.v=r,this):new si(r)},Tf=function(r,s,i){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var n=i.apply(r,s||[]),a,l=[];return a={},p("next"),p("throw"),p("return"),a[Symbol.asyncIterator]=function(){return this},a;function p(h){n[h]&&(a[h]=function(C){return new Promise(function(I,S){l.push([h,C,I,S])>1||u(h,C)})})}function u(h,C){try{c(n[h](C))}catch(I){g(l[0][3],I)}}function c(h){h.value instanceof si?Promise.resolve(h.value.v).then(d,m):g(l[0][2],h)}function d(h){u("next",h)}function m(h){u("throw",h)}function g(h,C){h(C),l.shift(),l.length&&u(l[0][0],l[0][1])}},Pf=function(r){var s,i;return s={},n("next"),n("throw",function(a){throw a}),n("return"),s[Symbol.iterator]=function(){return this},s;function n(a,l){s[a]=r[a]?function(p){return(i=!i)?{value:si(r[a](p)),done:a==="return"}:l?l(p):p}:l}},wf=function(r){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var s=r[Symbol.asyncIterator],i;return s?s.call(r):(r=typeof wa=="function"?wa(r):r[Symbol.iterator](),i={},n("next"),n("throw"),n("return"),i[Symbol.asyncIterator]=function(){return this},i);function n(l){i[l]=r[l]&&function(p){return new Promise(function(u,c){p=r[l](p),a(u,c,p.done,p.value)})}}function a(l,p,u,c){Promise.resolve(c).then(function(d){l({value:d,done:u})},p)}},Df=function(r,s){return Object.defineProperty?Object.defineProperty(r,"raw",{value:s}):r.raw=s,r};var o=Object.create?function(r,s){Object.defineProperty(r,"default",{enumerable:!0,value:s})}:function(r,s){r.default=s};Ef=function(r){if(r&&r.__esModule)return r;var s={};if(r!=null)for(var i in r)i!=="default"&&Object.prototype.hasOwnProperty.call(r,i)&&Da(s,r,i);return o(s,r),s},Af=function(r){return r&&r.__esModule?r:{default:r}},Ff=function(r,s,i,n){if(i==="a"&&!n)throw new TypeError("Private accessor was defined without a getter");if(typeof s=="function"?r!==s||!n:!s.has(r))throw new TypeError("Cannot read private member from an object whose class did not declare it");return i==="m"?n:i==="a"?n.call(r):n?n.value:s.get(r)},Vf=function(r,s,i,n,a){if(n==="m")throw new TypeError("Private method is not writable");if(n==="a"&&!a)throw new TypeError("Private accessor was defined without a setter");if(typeof s=="function"?r!==s||!a:!s.has(r))throw new TypeError("Cannot write private member to an object whose class did not declare it");return n==="a"?a.call(r,i):a?a.value=i:s.set(r,i),i},Nf=function(r,s){if(s===null||typeof s!="object"&&typeof s!="function")throw new TypeError("Cannot use 'in' operator on non-object");return typeof r=="function"?s===r:r.has(s)},e("__extends",mf),e("__assign",ff),e("__rest",gf),e("__decorate",hf),e("__param",Cf),e("__metadata",yf),e("__awaiter",vf),e("__generator",Sf),e("__exportStar",If),e("__createBinding",Da),e("__values",wa),e("__read",vu),e("__spread",bf),e("__spreadArrays",xf),e("__spreadArray",kf),e("__await",si),e("__asyncGenerator",Tf),e("__asyncDelegator",Pf),e("__asyncValues",wf),e("__makeTemplateObject",Df),e("__importStar",Ef),e("__importDefault",Af),e("__classPrivateFieldGet",Ff),e("__classPrivateFieldSet",Vf),e("__classPrivateFieldIn",Nf)})});var Kf={};lr(Kf,{BASE_PATH:()=>Uf,FETCH_ABORTED_ERROR_CODE:()=>en,FETCH_CONNECTIVITY_ERROR_CODE:()=>bu,client:()=>V,getApiErrorCode:()=>xu,getApiErrorMessage:()=>D,handleApiError:()=>x,ocmClient:()=>oe,setAuthInterceptor:()=>zk});import Iu from"axios";import Bf from"axios-case-converter";var Of=Hk(Hf()),{__extends:i6,__assign:Aa,__rest:n6,__decorate:a6,__param:l6,__metadata:p6,__awaiter:u6,__generator:c6,__exportStar:d6,__createBinding:m6,__values:f6,__read:g6,__spread:h6,__spreadArrays:C6,__spreadArray:y6,__await:v6,__asyncGenerator:S6,__asyncDelegator:I6,__asyncValues:b6,__makeTemplateObject:x6,__importStar:k6,__importDefault:T6,__classPrivateFieldGet:P6,__classPrivateFieldSet:w6,__classPrivateFieldIn:D6}=Of.default;function Lf(e){return e.toLowerCase()}var Ok=[/([a-z0-9])([A-Z])/g,/([A-Z])([A-Z][a-z])/g],Lk=/[^A-Z0-9]+/gi;function Mf(e,t){t===void 0&&(t={});for(var o=t.splitRegexp,r=o===void 0?Ok:o,s=t.stripRegexp,i=s===void 0?Lk:s,n=t.transform,a=n===void 0?Lf:n,l=t.delimiter,p=l===void 0?" ":l,u=_f(_f(e,r,"$1\0$2"),i,"\0"),c=0,d=u.length;u.charAt(c)==="\0";)c++;for(;u.charAt(d-1)==="\0";)d--;return u.slice(c,d).split("\0").map(a).join(p)}function _f(e,t,o){return t instanceof RegExp?e.replace(t,o):t.reduce(function(r,s){return r.replace(s,o)},e)}function Su(e,t){var o=e.charAt(0),r=e.substr(1).toLowerCase();return t>0&&o>="0"&&o<="9"?"_"+o+r:""+o.toUpperCase()+r}function Wf(e,t){return t===void 0&&(t={}),Mf(e,Aa({delimiter:"",transform:Su},t))}function Mk(e,t){return t===0?e.toLowerCase():Su(e,t)}function zf(e,t){return t===void 0&&(t={}),Wf(e,Aa({transform:Mk},t))}var Uf="/api/assisted-install",Gf={caseFunctions:{camel:e=>zf(e,{stripRegexp:/[^A-Z0-9.-]+/gi})}},_k=()=>{let e=Iu.create();return e.interceptors.request.use(t=>({...t,url:`${process.env.REACT_APP_API_ROOT}${t.url}`})),Bf(e,Gf)},V=_k(),oe,Wk=e=>(e.interceptors.request.use(t=>({...t,url:`${Uf}${t.url}`})),e),zk=e=>{oe=e(Iu.create()),V=Bf(Wk(e(Iu.create())),Gf)};import $k from"axios";import{Severity as qk}from"@sentry/browser";import Yk from"lodash/pick";import{Severity as $f,captureException as Uk,captureMessage as Bk}from"@sentry/browser";var Lo=(e,t,o=$f.Error)=>{oe?(t&&Bk(t,o),Uk(e)):o===$f.Error?console.error(t,e):console.warn(t,e)};var L;(function(s){s.x86="x86_64",s.ARM="arm64",s.DAY1_CLUSTER_USES_MULTI="multi",s.USE_DAY1_ARCHITECTURE="cluster-day1-cpu-architecture"})(L||(L={}));var go;(function(r){r.x86="amd64",r.ARM="arm64",r.MULTI="multi"})(go||(go={}));var ii=[L.x86,L.ARM],qf=["vsphere","nutanix"],Yf=["baremetal","none"];var Fa=e=>e==="dev-preview"||e==="tech-preview";function jf(e){return typeof e=="object"&&e!==null}function Rf(e,t){return t in e}var Q;(function(i){i.LOADING="LOADING",i.RELOADING="RELOADING",i.ERROR="ERROR",i.EMPTY="EMPTY",i.LOADED="LOADED"})(Q||(Q={}));function Va(e){return jf(e)&&Rf(e,"isAxiosError")&&e.isAxiosError===!0}var vs=e=>Va(e)?typeof e.response?.data=="object":!1;import Gk from"lodash/isString";var Ge=e=>e instanceof Error?e.message:Gk(e)?e:"Unexpected error";var en="ERR_CANCELED",bu="CONNECTIVITY_ERROR",x=(e,t)=>{if($k.isCancel(e))Lo(e,"Request canceled",qk.Info);else if(vs(e)){let o=`URL: ${JSON.stringify(e.config.url,null,1)}
|
|
2
2
|
`;o+=`Method: ${JSON.stringify(e.config.method,null,1)}
|
|
3
3
|
`,e.response?(o+=`Status: ${e.response.status}
|
|
4
|
-
`,o+=`Response: ${JSON.stringify(
|
|
5
|
-
`):e.request&&(o+=`Status Code: ${JSON.stringify(e.request.__sentry_xhr__.status_code,null,1)}`),Lo(e,o)}else Lo(e);if(t)return t(e)},D=e=>vs(e)?e.response?.data?.message||e.response?.data.reason||e.message:Ge(e),xu=e=>{if(!Va(e))return bu;let t=e.response?.status||0;return t>=400&&t<500?t:e.code===en?en:bu};var
|
|
4
|
+
`,o+=`Response: ${JSON.stringify(Yk(e.response.data,["code","message","reason"]),null,1)}
|
|
5
|
+
`):e.request&&(o+=`Status Code: ${JSON.stringify(e.request.__sentry_xhr__.status_code,null,1)}`),Lo(e,o)}else Lo(e);if(t)return t(e)},D=e=>vs(e)?e.response?.data?.message||e.response?.data.reason||e.message:Ge(e),xu=e=>{if(!Va(e))return bu;let t=e.response?.status||0;return t>=400&&t<500?t:e.code===en?en:bu};var Ky={};lr(Ky,{store:()=>Sr,storeDay2:()=>EO});import{configureStore as Ry}from"@reduxjs/toolkit";import{createSlice as sO,createAsyncThunk as iO}from"@reduxjs/toolkit";import jk from"react";window.Fragment=jk.Fragment;import{createElement as Or,forwardRef as mT}from"react";import{useField as aT}from"formik";import{FormGroup as lT,HelperTextItem as pT,Split as uT,SplitItem as Zf,TextInput as cT}from"@patternfly/react-core";import{Address4 as Rk}from"ip-address";import Kk from"lodash/set";import Xk from"lodash/groupBy";import Jk from"lodash/pickBy";var T=(e,t,o)=>(o=o?`${o}-`:"",`form-${t}-${e.replace(/\./g,"-")}-${o}field`),Ss=e=>e.split(`
|
|
6
6
|
`).map(t=>t.trim()).filter(Boolean).join(`
|
|
7
|
-
`),Mo=e=>e.split(",").map(t=>t.trim()).filter(Boolean).join(","),ro=(e,t)=>Object.keys(e).filter(o=>t[o]),Xf=e=>e.find(t=>t.default)?.value||e[0]?.value||"",Ej=e=>e.reduce((o,r)=>{let s=r.split("=");return o[s[0]]=s[1],o},{}),Jk=e=>e.reduce((t,{path:o,message:r})=>({...t,[o]:(t[o]||[]).concat(r)}),{}),ku=e=>{let t=Xk(Kk(e),o=>o.length>1);return Object.keys(t)},ni=e=>async t=>{try{await e.validate(t,{abortEarly:!1})}catch(o){let{inner:r}=o;if(!r||r.length===0)return{};let s=[],i=[];r.forEach(l=>{/\.|\[/.test(l.path)?i.push(l):s.push(l)});let n=Jk(s);if(i.length===0)return n;let a={};return i.forEach(l=>{Rk(a,l.path,[l.message])}),{...n,...a}}},tn=(e,t)=>`${e}[${t}]`,Aj=(e,t)=>`${e}.${t}`,Jf=e=>!!e?.every(t=>t.cidr&&jk.isValid(t.cidr)),Fj=(e={})=>{let t=[];for(let o in e)t.push(`${o}=${e[o]}`);return t};import Zk from"react";import{css as Qk}from"@patternfly/react-styles";var eT=({fieldId:e,children:t,isError:o=!1})=>Zk.createElement("div",{className:Qk("pf-c-form__helper-text",{"pf-m-error":o}),id:`${e}-helper`,"aria-live":"polite"},t),j=eT;import{useEffect as iT,useState as sT}from"react";import{useField as tT}from"formik";var oT=e=>Array.isArray(e)?e.join(". "):e,rT=({name:e,inputError:t,validate:o})=>{let[r,{error:s}]=tT({name:e,validate:o}),[i,n]=sT(!1);iT(()=>{r.value&&n(r.value)},[r.value,n]);let a=r.value||!r.value&&i;return oT((a?s:"")||t)},pr=rT;var cT=dT(({label:e,labelIcon:t,helperText:o,isRequired:r,onChange:s,validate:i,idPostfix:n,children:a,noDefaultOnChange:l,inputError:p,description:u,labelInfo:c,showErrorMessage:d=!0,...m},g)=>{let[h]=nT({name:m.name,validate:i}),C=T(m.name,"input",n),I=pr({name:m.name,inputError:p,validate:i}),S=!I;return Or(aT,{fieldId:C,label:e,helperText:typeof o=="string"?o:Or(j,{fieldId:C},o),helperTextInvalid:d?I:void 0,validated:S?"default":"error",isRequired:r,labelIcon:t,labelInfo:c},u&&Or(j,{fieldId:C},Or(lT,{variant:"indeterminate"},u)),Or(pT,null,Or(Zf,{isFilled:!0},Or(uT,{...h,...m,ref:g,id:C,validated:S?"default":"error",isRequired:r,"aria-describedby":`${C}-helper`,onChange:(y,v)=>{m.isDisabled||(!l&&h.onChange(v),s&&s(v))}})),Or(Zf,null,a)))}),St=cT;import{createElement as Tu}from"react";import{useField as mT}from"formik";import{Checkbox as fT,FormGroup as gT}from"@patternfly/react-core";var hT=({label:e,helperText:t,onChange:o,validate:r,idPostfix:s,...i})=>{let[n,{touched:a,error:l}]=mT({name:i.name,validate:r}),p=T(i.name,"checkbox",s),u=!(a&&l);return Tu(gT,{fieldId:p,helperTextInvalid:u?"":l,validated:u?"default":"error"},Tu(fT,{...n,...i,id:p,label:e,"aria-describedby":`${p}-helper`,description:typeof t=="string"?t:Tu(j,{fieldId:p},t),isValid:u,isChecked:n.value,onChange:(d,m)=>{n.onChange(m),o&&o(d,m)}}))},Lr=hT;import{createElement as Na}from"react";import{useField as CT}from"formik";import{FormGroup as yT,TextArea as vT}from"@patternfly/react-core";var ST=({label:e,helperText:t,getErrorText:o,isRequired:r,children:s,idPostfix:i,labelIcon:n,groupClassName:a,...l})=>{let[p,{touched:u,error:c}]=CT(l.name),d=T(l.name,"input",i),m=!(u&&c),h=(()=>!m&&c?o?o(c):c:"")(),{isDisabled:C,...I}=l;return Na(yT,{fieldId:d,label:e,helperText:typeof t=="string"?t:Na(j,{fieldId:d},t),helperTextInvalid:typeof h=="string"?h:Na(j,{fieldId:d,isError:!0},h),validated:m?"default":"error",isRequired:r,labelIcon:n,className:a},s,Na(vT,{...p,...I,id:d,style:{resize:"vertical"},validated:m?"default":"error",isRequired:r,"aria-describedby":`${d}-helper`,onChange:(S,y)=>p.onChange(y),disabled:C}))},ur=ST;import{createElement as Ha}from"react";import{useField as IT}from"formik";import{FormGroup as bT,FormSelect as xT,FormSelectOption as kT}from"@patternfly/react-core";var TT=({label:e,options:t,helperText:o,isRequired:r,onChange:s,getHelperText:i,idPostfix:n,labelIcon:a,callFormikOnChange:l=!0,...p})=>{let[u,{touched:c,error:d}]=IT(p.name),m=T(p.name,"input",n),g=!(c&&d),h=g?"":d,C=i?i(u.value):o;return Ha(bT,{fieldId:m,label:e,helperText:typeof C=="string"?C:Ha(j,{fieldId:m},C),helperTextInvalid:h,validated:g?"default":"error",isRequired:r,labelIcon:a},Ha(xT,{...u,...p,id:m,validated:g?"default":"error",isRequired:r,"aria-describedby":`${m}-helper`,onChange:(I,S)=>{l&&u.onChange(S),s&&s(S)}},t.map((I,S)=>Ha(kT,{key:I.id||S,...I}))))},on=TT;import ai from"react";import{useField as wT}from"formik";import DT from"fuse.js";import{FormGroup as ET,Select as AT,SelectOption as FT,SelectVariant as VT}from"@patternfly/react-core";import{useTranslation as PT}from"react-i18next";function f(){return PT(process.env.TRANSLATION_NAMESPACE)}var NT=({label:e,options:t,helperText:o,placeholderText:r,isRequired:s,onChange:i,getHelperText:n,idPostfix:a,labelIcon:l,...p})=>{let[u,c]=ai.useState(!1),[d,{touched:m,error:g},{setValue:h}]=wT(p.name),C=T(p.name,"multiinput",a),I=!(m&&g),S=I?"":g,y=n?n(d.value):o,v=Y=>c(Y),w=()=>{h([]),i&&i([]),c(!1)},E=(Y,je)=>{let tt=d.value,vt=je.value||je,b;tt.includes(vt)?b=tt.filter(P=>P!==vt):b=[...d.value,vt],h(b),i&&i(b)},F=d.value.map(Y=>{let je=t.find(tt=>tt.value===Y);return je?{value:je.value,toString:()=>je.displayName,compareTo:tt=>tt.value===Y}:Y}),q=t.filter(Y=>!(d.value||[]).includes(Y.value)).map(Y=>ai.createElement(FT,{key:Y.id,id:Y.id,value:Y.value},Y.displayName)),Z=new DT(t,{ignoreLocation:!0,keys:["displayName"]}),{t:ae}=f();return ai.createElement(ET,{fieldId:C,label:e,helperText:typeof y=="string"?y:ai.createElement(j,{fieldId:C},y),helperTextInvalid:S,validated:I?"default":"error",isRequired:s,labelIcon:l},ai.createElement(AT,{...d,...p,id:C,variant:VT.typeaheadMulti,typeAheadAriaLabel:ae("ai:Select a state"),validated:I?"default":"error","aria-describedby":`${C}-helper`,isCreatable:!1,placeholderText:r,isOpen:u,onToggle:v,onSelect:E,onClear:w,selections:F,onFilter:(Y,je)=>{if(!je||je==="")return q;let tt=Z.search(je).map(vt=>vt.item.id);return ai.Children.toArray(q).filter(({props:vt})=>tt.includes(vt.id))}},q))},HT=NT;import{createElement as Oa}from"react";import{FormGroup as OT,Button as Qf}from"@patternfly/react-core";var LT=({isSet:e,isEdit:t,helperTextHidden:o,onToggle:r,idPostfix:s,...i})=>{let{label:n,name:a}=i,l=T(a,"input",s);return t?Oa(ur,{...i},e&&Oa(Qf,{onClick:()=>r(!0),variant:"link"},"Keep existing value")):Oa(OT,{fieldId:l,label:n,helperText:o,isRequired:i.isRequired},Oa(Qf,{onClick:()=>r(!1),variant:"link"},"Change"))},MT=LT;import{createElement as La,useState as eg}from"react";import{useField as _T}from"formik";import{FormGroup as WT,FileUpload as zT}from"@patternfly/react-core";var BT=({label:e,labelIcon:t,helperText:o,getErrorText:r,isRequired:s,children:i,idPostfix:n,isDisabled:a,name:l,onBlur:p,allowEdittingUploadedText:u=!0,dropzoneProps:c,transformValue:d})=>{let{t:m}=f(),[g,h]=eg(),[C,I]=eg(!1),[S,{touched:y,error:v},w]=_T(l),E=T(l,"input",n),F=!((y||g)&&v),Z=(()=>!F&&v?r?r(v):v:"")();return La(WT,{fieldId:E,label:e,helperText:typeof o=="string"?o:La(j,{fieldId:E},o),helperTextInvalid:typeof Z=="string"?Z:La(j,{fieldId:E,isError:!0},Z),validated:F?"default":"error",isRequired:s,labelIcon:t},i,La(zT,{filenamePlaceholder:m("ai:Drag a file here or browse to upload"),browseButtonText:m("ai:Browse..."),clearButtonText:m("ai:Clear"),id:S.name,style:{resize:"vertical"},validated:F?"default":"error",isRequired:s,"aria-describedby":`${E}-helper`,type:"text",value:S.value,filename:g,onChange:(ae,Y)=>{h(Y),w.setTouched(!0),d&&typeof ae=="string"?w.setValue(d(ae)):w.setValue(ae)},onBlur:ae=>{S.onBlur(ae),p&&p(ae)},onReadStarted:()=>I(!0),onReadFinished:()=>I(!1),isLoading:C,disabled:a,dropzoneProps:{...c,onDropRejected:c?.onDropRejected&&c?.onDropRejected(w)},allowEditingUploadedText:u}))},Pu=BT;import{createElement as rn}from"react";import{useField as UT}from"formik";import{FormGroup as GT,Switch as tg,Tooltip as $T}from"@patternfly/react-core";var qT=({label:e,helperText:t,isRequired:o,onChange:r,onChangeCustomOverride:s,getHelperText:i,idPostfix:n,labelIcon:a,tooltipProps:l,switchOuiaId:p,...u})=>{let[c,{touched:d,error:m}]=UT(u.name),g=T(u.name,"input",n),h=!(d&&m),C=h?"":m,I=i?i(c.value):t,S={...c,id:g,label:e,isDisabled:u.isDisabled,isChecked:Boolean(c.value),hasCheckIcon:Boolean(c.value),ouiaId:p,onChange:(y,v)=>{s?s(y,v):(c.onChange(v),r&&r(y,v))}};return rn(GT,{fieldId:g,helperText:typeof I=="string"?I:rn(j,{fieldId:g},I),helperTextInvalid:C,validated:h?"default":"error",isRequired:o,labelIcon:a},l?rn($T,{...l},rn(tg,{...S})):rn(tg,{...S}))},li=qT;import cr from"react";import{shallowEqual as og}from"react-redux";import rg from"lodash/debounce";import{useFormikContext as sg}from"formik";var ho=(e=1e3)=>{let[t,o]=cr.useState([]),{values:r,isSubmitting:s,submitForm:i}=sg(),n=cr.useRef(r),a=cr.useRef(rg(async l=>{await i(),o(p=>p.filter(u=>u>l))},e));return cr.useEffect(()=>{if(!og(n.current,r)&&!s){let l=Date.now();o(p=>(p.push(l),p)),a.current(l)}s||(n.current=r)},[r,s,o]),cr.useEffect(()=>{let l=a.current;return()=>l.cancel()},[]),!!t.length},YT=({debounce:e=1e3})=>{let{values:t,dirty:o,isSubmitting:r,submitForm:s}=sg(),i=cr.useRef(t),n=cr.useRef(rg(s,e));return cr.useEffect(()=>{!og(i.current,t)&&o&&!r&&n.current(),r||(i.current=t)},[t,o,r]),cr.useEffect(()=>{let a=n.current;return()=>a.cancel()},[]),null},wu=YT;import Ne from"react";import{ExternalLinkAltIcon as pg}from"@patternfly/react-icons";var lg={};lr(lg,{AI_UI_TAG:()=>ci,APPROVE_NODES_IN_CL_LINK:()=>_u,CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV4:()=>JT,CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV6:()=>ZT,CLUSTER_MANAGER_SITE_LINK:()=>_a,CNV_LINK:()=>Ou,DUAL_STACK:()=>wt,ENCRYPTING_DISK_DURING_INSTALLATION:()=>Wa,EVENTS_POLLING_INTERVAL:()=>Wu,EVENT_SEVERITIES:()=>$u,FEEDBACK_FORM_LINK:()=>RT,IPV4_STACK:()=>yo,MS_PER_DAY:()=>qu,NETWORK_TYPE_OVN:()=>Ts,NETWORK_TYPE_SDN:()=>Co,NMSTATE_EXAMPLES_LINK:()=>Mu,NO_SUBNET_SET:()=>qt,NUTANIX_CONFIG_LINK:()=>Ru,OCP_RELEASES_PAGE:()=>ju,OCP_STATIC_IP_DOC:()=>Yu,ODF_LINK:()=>Lu,ODF_REQUIREMENTS_LINK:()=>Au,OPENSHIFT_LIFE_CYCLE_DATES_LINK:()=>Ma,OPENSHIFT_NETWORKING_DOCS_LINK:()=>Du,OPERATOR_NAME_CNV:()=>Mr,OPERATOR_NAME_CONSOLE:()=>ag,OPERATOR_NAME_CVO:()=>ng,OPERATOR_NAME_LSO:()=>Ba,OPERATOR_NAME_LVM:()=>Wo,OPERATOR_NAME_ODF:()=>_o,POLLING_INTERVAL:()=>bs,PREFIX_MAX_RESTRICTION:()=>za,PULL_SECRET_INFO_LINK:()=>Eu,REDHAT_CONSOLE_OPENSHIFT:()=>Nu,SSH_GENERATION_DOC_LINK:()=>Hu,TECH_SUPPORT_LEVEL_LINK:()=>sn,TIME_ZERO:()=>ui,VSPHERE_CONFIG_LINK:()=>Is,clusterFieldLabels:()=>zu,clusterStatusLabels:()=>dr,clusterValidationGroupLabels:()=>XT,clusterValidationLabels:()=>Uu,diskRoleLabels:()=>nn,getAssistedUiLibVersion:()=>Gu,getOcpConsoleNodesPage:()=>Vu,getProductBrandingCode:()=>KT,getReportIssueLink:()=>Fu,hostRoles:()=>xs,hostValidationFailureHints:()=>pi,hostValidationGroupLabels:()=>Bu,hostValidationLabels:()=>ks,operatorLabels:()=>an});var ig="2.7.13-cim";var Ma="https://access.redhat.com/support/policy/updates/openshift#dates",Du="https://docs.openshift.com/container-platform/4.7/installing/installing_bare_metal/installing-bare-metal.html#installation-network-user-infra_installing-bare-metal",_a="https://console.redhat.com/openshift/install/pull-secret",Eu=_a,Au="https://access.redhat.com/documentation/en-us/red_hat_openshift_data_foundation/4.9/html/planning_your_deployment/infrastructure-requirements_rhodf#resource-requirements_rhodf",Is="https://access.redhat.com/solutions/6677901",Fu=()=>"https://issues.redhat.com/secure/CreateIssue!default.jspa?pid=12332330&issuetype=1&components=12370775",RT="https://docs.google.com/forms/d/e/1FAIpQLSfg9M8wRW4m_HkWeAl6KpB5dTcMu8iI3iJ29GlLfZpF2hnjng/viewform",sn="https://access.redhat.com/support/offerings/techpreview",Wa="https://docs.openshift.com/container-platform/4.7/installing/install_config/installing-customizing.html#installation-special-config-encrypt-disk_installing-customizing",Vu=e=>`${e}/k8s/cluster/nodes`,Nu="https://console.redhat.com/openshift",Hu="https://www.redhat.com/sysadmin/configure-ssh-keygen",Ou="https://cloud.redhat.com/learn/topics/virtualization/",Lu="https://www.redhat.com/en/resources/openshift-data-foundation-datasheet",Mu="https://nmstate.io/examples.html",_u="https://docs.openshift.com/container-platform/4.11/installing/installing_platform_agnostic/installing-platform-agnostic.html#installation-approve-csrs_installing-platform-agnostic",KT=()=>"redhat",bs=10*1e3,Wu=10*1e3,xs=e=>[{value:"auto-assign",label:e("ai:Auto-assign"),description:e("ai:A role will be chosen automatically based on detected hardware and network latency.")},{value:"master",label:e("ai:Control plane node"),description:e("ai:Runs the control plane components of OpenShift, including the API server.")},{value:"worker",label:e("ai:Worker"),description:e("ai:Runs application workloads. Connect at least 5 hosts to enable dedicated workers.")}],dr=e=>({"pending-for-input":e("ai:Draft"),insufficient:e("ai:Draft"),ready:e("ai:Draft"),"preparing-for-installation":e("ai:Preparing for installation"),installing:e("ai:Installing"),"installing-pending-user-action":e("ai:Installing (pending action)"),finalizing:e("ai:Finalizing"),cancelled:e("ai:Installation cancelled"),error:e("ai:Error"),installed:e("ai:Installed"),"adding-hosts":e("ai:Adding hosts")}),zu=e=>({name:e("ai:Cluster name"),baseDnsDomain:e("ai:Base domain"),clusterNetworkCidr:e("ai:Cluster network CIDR"),clusterNetworkHostPrefix:e("ai:Cluster network host prefix"),serviceNetworkCidr:e("ai:Service network CIDR"),apiVip:e("ai:API IP"),ingressVip:e("ai:Ingress IP"),pullSecret:e("ai:Pull secret"),sshPublicKey:e("ai:SSH public key"),SNODisclaimer:e("ai:Single Node OpenShift disclaimer"),diskEncryptionTangServers:e("ai:Tang servers' URLs or thumbprints"),selectedHostIds:e("ai:Hosts selection"),httpProxy:e("ai:HTTP proxy"),httpsProxy:e("ai:HTTPS proxy"),noProxy:e("ai:No proxy"),machineNetworks:e("ai:Machine networks"),clusterNetworks:e("ai:Cluster networks"),serviceNetworks:e("ai:Service networks")}),Bu=e=>({hardware:e("ai:Hardware"),network:e("ai:Network"),operators:e("ai:Operators"),infrastructure:e("ai:Infrastructure")}),ks=e=>({"compatible-with-cluster-platform":e("ai:Compatible with cluster platform"),"has-default-route":e("ai:Default route to host"),"sufficient-network-latency-requirement-for-role":e("ai:Network latency"),"sufficient-packet-loss-requirement-for-role":e("ai:Packet loss"),"has-inventory":e("ai:Hardware information"),"has-min-cpu-cores":e("ai:Minimum CPU cores"),"has-min-memory":e("ai:Minimum Memory"),"has-min-valid-disks":e("ai:Minimum disks of required size"),"has-cpu-cores-for-role":e("ai:Minimum CPU cores for selected role"),"has-memory-for-role":e("ai:Minimum memory for selected role"),"hostname-unique":e("ai:Unique hostname"),"hostname-valid":e("ai:Valid hostname"),connected:e("ai:Connected"),"media-connected":e("ai:Media Connected"),"machine-cidr-defined":e("ai:Machine CIDR"),"belongs-to-machine-cidr":e("ai:Belongs to machine CIDR"),"ignition-downloadable":e("ai:Ignition file downloadable"),"belongs-to-majority-group":e("ai:Belongs to majority connected group"),"valid-platform-network-settings":e("ai:Platform network settings"),"ntp-synced":e("ai:NTP synchronization"),"container-images-available":e("ai:Container images availability"),"lso-requirements-satisfied":e("ai:LSO requirements"),"ocs-requirements-satisfied":e("ai:OCS requirements"),"odf-requirements-satisfied":e("ai:ODF requirements"),"lvm-requirements-satisfied":e("ai:LVM requirements"),"cnv-requirements-satisfied":e("ai:CNV requirements"),"disk-encryption-requirements-satisfied":e("ai:Disk encryption requirements"),"sufficient-installation-disk-speed":e("ai:Installation disk speed"),"api-domain-name-resolved-correctly":e("ai:API domain name resolution"),"api-int-domain-name-resolved-correctly":e("ai:API internal domain name resolution"),"apps-domain-name-resolved-correctly":e("ai:Application ingress domain name resolution"),"dns-wildcard-not-configured":e("ai:DNS wildcard not configured"),"non-overlapping-subnets":e("ai:Non overlapping subnets"),"vsphere-disk-uuid-enabled":e("ai:Vsphere disk uuid enabled"),"compatible-agent":e("ai:Agent compatibility"),"no-skip-installation-disk":e("ai:No skip installation disk"),"no-skip-missing-disk":e("ai:No skip missing disk"),"service-has-sufficient-spoke-kube-api-access":e("ai:Service has sufficient spoke kube api access")}),pi=e=>({"compatible-with-cluster-platform":"","has-default-route":"","sufficient-network-latency-requirement-for-role":"","sufficient-packet-loss-requirement-for-role":"","has-inventory":"","has-min-cpu-cores":"","has-min-memory":"","has-min-valid-disks":"","has-cpu-cores-for-role":"","has-memory-for-role":"","hostname-unique":"","hostname-valid":"",connected:"","media-connected":"","machine-cidr-defined":"","belongs-to-machine-cidr":"","ignition-downloadable":"","belongs-to-majority-group":"","valid-platform-network-settings":"","ntp-synced":e("ai:Please manually fix host's NTP configuration or provide additional NTP sources."),"container-images-available":"","lso-requirements-satisfied":"","ocs-requirements-satisfied":"","odf-requirements-satisfied":"","lvm-requirements-satisfied":"","cnv-requirements-satisfied":"","disk-encryption-requirements-satisfied":"","sufficient-installation-disk-speed":"","api-domain-name-resolved-correctly":"","api-int-domain-name-resolved-correctly":"","apps-domain-name-resolved-correctly":"","dns-wildcard-not-configured":"","non-overlapping-subnets":"","vsphere-disk-uuid-enabled":"","compatible-agent":"","no-skip-installation-disk":"","no-skip-missing-disk":"","service-has-sufficient-spoke-kube-api-access":""}),Uu=e=>({"network-type-valid":e("ai:Valid network type"),"machine-cidr-defined":e("ai:Machine CIDR"),"cluster-cidr-defined":e("ai:Cluster CIDR"),"service-cidr-defined":e("ai:Service CIDR"),"no-cidrs-overlapping":e("ai:No overlapping CIDR"),"networks-same-address-families":e("ai:Networks same address families"),"network-prefix-valid":e("ai:Valid network prefix"),"machine-cidr-equals-to-calculated-cidr":e("ai:Machine CIDR conforms expected"),"api-vip-defined":e("ai:API IP"),"api-vip-valid":e("ai:API IP validity"),"ingress-vip-defined":e("ai:Ingress IP"),"ingress-vip-valid":e("ai:Ingress IP validity"),"all-hosts-are-ready-to-install":e("ai:All hosts are ready to install"),"sufficient-masters-count":e("ai:Control plane nodes count"),"dns-domain-defined":e("ai:DNS domain"),"pull-secret-set":e("ai:Pull secret"),"ntp-server-configured":e("ai:NTP server"),"lso-requirements-satisfied":e("ai:LSO requirements"),"ocs-requirements-satisfied":e("ai:OCS requirements"),"odf-requirements-satisfied":e("ai:ODF requirements"),"lvm-requirements-satisfied":e("ai:LVM requirements"),"cnv-requirements-satisfied":e("ai:CNV requirements")}),XT=e=>({configuration:e("ai:General configuration"),hostsData:e("ai:Hosts"),"hosts-data":e("ai:Hosts"),network:e("ai:Networking"),operators:e("ai:Operators")}),JT={clusterNetworkCidr:"10.128.0.0/14",clusterNetworkHostPrefix:23,serviceNetworkCidr:"172.30.0.0/16"},ZT={clusterNetworkCidr:"2002:db8::/53",clusterNetworkHostPrefix:64,serviceNetworkCidr:"2003:db8::/112"},Gu=()=>ig,$u=["info","warning","error","critical"],ui="0001-01-01T00:00:00.000Z",qu=1e3*60*60*24,qt="NO_SUBNET_SET",Ts="OVNKubernetes",Co="OpenShiftSDN",yo="singleStack",wt="dualStack",za={IPv6:128,IPv4:25},nn=e=>({none:e("ai:None"),install:e("ai:Installation disk")}),Mr="cnv",Ba="lso",_o="odf",Wo="lvm",ng="cvo",ag="console",an=e=>({[ag]:e("ai:OpenShift Console"),[ng]:e("ai:OpenShift Cluster Version Operator"),[Ba]:e("ai:OpenShift Local Storage"),[_o]:e("ai:OpenShift Data Foundation"),[Wo]:e("ai:OpenShift Data Foundation Logical Volume Manager"),[Mr]:e("ai:OpenShift Virtualization")}),Yu="https://docs.openshift.com/container-platform/latest/scalability_and_performance/ztp-deploying-disconnected.html#ztp-configuring-a-static-ip_ztp-deploying-disconnected",ci="ui_ocm",ju="openshift/releases",Ru="https://access.redhat.com/solutions/6983944";import Ku from"react";import QT from"classnames";import{Button as eP,Popover as tP}from"@patternfly/react-core";import{OutlinedQuestionCircleIcon as oP}from"@patternfly/react-icons";var rP=({component:e,variant:t="plain",IconComponent:o=oP,noVerticalAlign:r=!1,buttonClassName:s,buttonOuiaId:i,...n})=>Ku.createElement(tP,{...n},Ku.createElement(eP,{component:e,variant:t,onClick:a=>a.preventDefault(),className:QT("pf-c-form__group-label-help","pf-u-p-0",s),ouiaId:i},Ku.createElement(o,{noVerticalAlign:r}))),W=rP;import{Trans as ug}from"react-i18next";var Xu=({isOcm:e})=>{let{t}=f();return Ne.createElement(W,{noVerticalAlign:!0,bodyContent:Ne.createElement(Ne.Fragment,null,Ne.createElement(ug,{t},"ai:Pull secrets are used to download OpenShift Container Platform components and connect clusters to a Red Hat account."," "),e?Ne.createElement(dg,null):Ne.createElement(Ne.Fragment,null,Ne.createElement(ug,{t},"ai:Pull secrets can be found in")," ",Ne.createElement(cg,null)))})},cg=()=>{let{t:e}=f();return Ne.createElement("a",{href:_a,target:"_blank",rel:"noopener noreferrer"},e("ai:OpenShift Cluster Manager")," ",Ne.createElement(pg,null))},dg=()=>{let{t:e}=f();return Ne.createElement("a",{href:Eu,target:"_blank",rel:"noopener noreferrer"},e("ai:Learn more about pull secrets and view examples")," ",Ne.createElement(pg,null),".")},mg=({isOcm:e})=>{let{t}=f();return e?Ne.createElement(dg,null):Ne.createElement(Ne.Fragment,null,t("ai:A Red Hat account's pull secret can be found in "),"\xA0",Ne.createElement(cg,null))},sP=({isOcm:e})=>{let{t}=f();return Ne.createElement(ur,{name:"pullSecret",label:t("ai:Pull secret"),labelIcon:e?void 0:Ne.createElement(Xu,{isOcm:e}),getErrorText:o=>Ne.createElement(Ne.Fragment,null,o," ",Ne.createElement(mg,{isOcm:e})),helperText:Ne.createElement(mg,{isOcm:e}),rows:10,isRequired:!0})},Ua=sP;import iP from"react";import{useField as nP}from"formik";import{Radio as aP}from"@patternfly/react-core";var lP=({callFormikOnChange:e=!0,name:t,value:o,onChange:r,...s})=>{let[i]=nP({name:t,value:o,type:"radio"}),n=T(t,"radio",i.value);return iP.createElement(aP,{...i,...s,id:n,isChecked:!!i.checked,onChange:(a,l)=>{r?.(a,l),e&&i.onChange(l)}})},Re=lP;import{Fragment as DP,createElement as di,useCallback as PP,useEffect as wP,useRef as TP}from"react";import{useField as vP,useFormikContext as SP}from"formik";import{Checkbox as IP,FormGroup as bP,Tooltip as xP}from"@patternfly/react-core";var fg={};lr(fg,{ACM_ENABLED_FEATURES:()=>pP,FeatureGateContext:()=>Zu,FeatureGateContextProvider:()=>Ps,SINGLE_CLUSTER_ENABLED_FEATURES:()=>uP,STANDALONE_DEPLOYMENT_ENABLED_FEATURES:()=>cP,useFeature:()=>_r});import Ju from"react";var pP={ASSISTED_INSTALLER_SNO_FEATURE:!0,ASSISTED_INSTALLER_OCS_FEATURE:!1,ASSISTED_INSTALLER_ODF_FEATURE:!1,ASSISTED_INSTALLER_CNV_FEATURE:!1,ASSISTED_INSTALLER_NETWORK_TYPE_SELECTION_FEATURE:!1,ASSISTED_INSTALLER_PLATFORM_INTEGRATION_FEATURE:!1},uP={ASSISTED_INSTALLER_SNO_FEATURE:!1,ASSISTED_INSTALLER_OCS_FEATURE:!1,ASSISTED_INSTALLER_ODF_FEATURE:!1,ASSISTED_INSTALLER_CNV_FEATURE:!1,ASSISTED_INSTALLER_NETWORK_TYPE_SELECTION_FEATURE:!1,ASSISTED_INSTALLER_PLATFORM_INTEGRATION_FEATURE:!1},cP={ASSISTED_INSTALLER_SNO_FEATURE:!0,ASSISTED_INSTALLER_OCS_FEATURE:!0,ASSISTED_INSTALLER_ODF_FEATURE:!0,ASSISTED_INSTALLER_CNV_FEATURE:!0,ASSISTED_INSTALLER_NETWORK_TYPE_SELECTION_FEATURE:!0,ASSISTED_INSTALLER_PLATFORM_INTEGRATION_FEATURE:!0},Zu=Ju.createContext({isFeatureEnabled:()=>!1}),Ps=({features:e,children:t})=>{let o={ASSISTED_INSTALLER_OCS_FEATURE:!1,ASSISTED_INSTALLER_ODF_FEATURE:!1,ASSISTED_INSTALLER_CNV_FEATURE:!1,...e},r=s=>!!o[s];return Ju.createElement(Zu.Provider,{value:{isFeatureEnabled:r}},t)},_r=e=>{let{isFeatureEnabled:t}=Ju.useContext(Zu);return t(e)};import oc from"react";import vo from"react";import{Label as gP,Popover as hP}from"@patternfly/react-core";import{InfoCircleIcon as CP}from"@patternfly/react-icons";import gg from"react";import{Text as dP}from"@patternfly/react-core";import{ExternalLinkAltIcon as mP}from"@patternfly/react-icons";var fP=({href:e,children:t,onClick:o})=>gg.createElement(dP,{component:"a",href:e,onClick:o,target:"_blank",rel:"noopener noreferrer"},t||e," ",gg.createElement(mP,{color:"rgb(0, 123, 186)"})),ot=fP;var ln;(function(r){r[r.default=0]="default",r[r.inline=1]="inline",r[r.inlineRight=2]="inlineRight"})(ln||(ln={}));var hg=({position:e=1,className:t="pf-u-ml-md",text:o,popoverText:r,externalLink:s,testId:i})=>{let n=t,{t:a}=f();switch(e){case 2:n+=" pf-u-float-right";break;case 1:n+=" pf-u-display-inline";break}let l=vo.createElement(vo.Fragment,null,vo.createElement("div",{style:{marginBottom:"var(--pf-global--spacer--sm)"}},r),s&&vo.createElement(vo.Fragment,null,vo.createElement(ot,{href:s},a("ai:Learn more"))));return vo.createElement(hP,{bodyContent:l,position:"top"},vo.createElement(gP,{style:{cursor:"pointer"},color:"orange",onClick:p=>p.preventDefault(),icon:vo.createElement(CP,{color:"var(--pf-c-label__content--Color)"}),className:n,"data-testid":`${i}`},o))},Qu=e=>{let{t}=f();return vo.createElement(hg,{text:t("ai:Developer Preview"),popoverText:t("ai:Developer preview features are not intended to be used in production environments. The clusters deployed with the developer preview features are considered to be development clusters and are not supported through the Red Hat Customer Portal case management system."),...e})};Qu.displayName="DeveloperPreview";var ec=e=>{let{t}=f();return vo.createElement(hg,{text:t("ai:Technology Preview"),popoverText:t("ai:Technology preview features provide early access to upcoming product innovations, enabling you to test functionality and provide feedback during the development process."),externalLink:sn,...e})};ec.displayName="TechnologyPreview";import tc from"react";var Cg=tc.createContext(null),yg=({value:e,children:t})=>tc.createElement(Cg.Provider,{value:e},t),be=()=>{let e=tc.useContext(Cg),{t}=f();if(!e)throw new Error(t("ai:useFeatureSupportLevel must be used within FeatureSupportLevelContextProvider."));return e};var yP=({featureId:e,openshiftVersion:t})=>{let o=be(),r=oc.useMemo(()=>{if(!!t)return o.getFeatureSupportLevel(t,e)},[t,e,o]);if(!Fa(r))return null;let s=`${e}-support-level`;return r==="tech-preview"?oc.createElement(ec,{testId:s}):oc.createElement(Qu,{testId:s})},so=yP;var kP=({versions:e,validate:t,idPostfix:o,...r})=>{let{values:{openshiftVersion:s}}=SP(),i=_r("ASSISTED_INSTALLER_SNO_FEATURE"),[n,a,l]=vP({name:r.name,validate:t}),p=be(),u=TP(s),c=T(r.name,"input",o),{t:d}=f(),{value:m}=a,{setValue:g}=l,h=!!e.find(S=>p.isFeatureSupported(S.value,"SNO")),C=PP(S=>g(S?"None":"Full"),[g]),I=p.getFeatureDisabledReason(s,"SNO",d);return wP(()=>{u.current!==s&&!p.isFeatureSupported(s,"SNO")&&C(!1),u.current=s},[s,C,p]),i&&h?di(bP,{isInline:!0,fieldId:c},di(xP,{hidden:!I,content:I},di(IP,{...n,...r,id:c,label:di(DP,null,d("ai:Install single node OpenShift (SNO)"),"\xA0",di(so,{featureId:"SNO",openshiftVersion:s})),"aria-describedby":`${c}-helper`,description:di(j,{fieldId:c},d("ai:SNO enables you to install OpenShift using only one host.")),isChecked:m==="None",onChange:C,className:"with-tooltip"}))):null},rc=kP;import{createElement as mi,forwardRef as OP}from"react";import{useField as EP}from"formik";import{FormGroup as AP,NumberInput as FP,Split as VP,SplitItem as vg}from"@patternfly/react-core";var NP=OP(({label:e,labelIcon:t,helperText:o,isRequired:r,validate:s,idPostfix:i,minValue:n=0,maxValue:a,children:l,formatValue:p,onChange:u,...c},d)=>{let[m,{touched:g,error:h},{setValue:C}]=EP({name:c.name,validate:s}),I=T(c.name,"numberinput",i),S=!(g&&h),y=S?"":h,v=q=>{let Z=q<n?n:q;Z=a&&Z>a?a:Z,Z=p?p(Z):Z,C(Z),u?.(Z)},w=()=>{v(m.value+1)},E=()=>{v(m.value-1)},F=q=>{let Z=q.target.value;v(isNaN(Z)?0:Number(Z))};return mi(AP,{fieldId:I,label:e,helperText:typeof o=="string"?o:mi(j,{fieldId:I},o),helperTextInvalid:y,validated:S?"default":"error",isRequired:r,labelIcon:t},mi(VP,null,mi(vg,{isFilled:!0},mi(FP,{...c,value:m.value,onMinus:E,onChange:F,onPlus:w,min:n,max:a,ref:d,id:I,"aria-describedby":`${I}-helper`})),mi(vg,null,l)))}),HP=NP;import{Fragment as UP,createElement as fi,useEffect as BP,useState as Sg}from"react";import{useField as LP}from"formik";import{FormGroup as MP,HelperTextItem as _P}from"@patternfly/react-core";import{CodeEditor as WP}from"@patternfly/react-code-editor";var zP=({label:e,labelIcon:t,helperText:o,isRequired:r,validate:s,idPostfix:i,language:n,name:a,description:l,isDisabled:p})=>{let[u,,{setValue:c,setTouched:d}]=LP({name:a,validate:s}),m=T(a,"input",i),[g,h]=Sg(),[C,I]=Sg(),S=pr({name:a,validate:s});return BP(()=>{if(!!C)return g&&g.dispose(),h(C.onDidChangeModelContent(()=>{d(!0),c(C.getModel()?.getValue(),!0)})),()=>{g&&g.dispose()}},[C]),fi(UP,null,fi(MP,{fieldId:m,label:e,helperText:typeof o=="string"?o:fi(j,{fieldId:m},o),helperTextInvalid:S,validated:!S?"default":"error",isRequired:r,labelIcon:t},l&&fi(j,{fieldId:m},fi(_P,{variant:"indeterminate"},l)),fi(WP,{code:u.value,isUploadEnabled:!p,isDownloadEnabled:!0,isCopyEnabled:!0,isLanguageLabelVisible:!0,height:"400px",language:n,onEditorDidMount:v=>I(v)})))},sc=zP;import{createElement as Dt,forwardRef as uw,useState as cw}from"react";import{useField as GP}from"formik";import $P from"classnames";import{FormGroup as qP,HelperTextItem as YP,TextInput as jP,HelperText as RP,Popover as KP,PopoverPosition as XP,InputGroup as JP,Button as ZP}from"@patternfly/react-core";import{CheckCircleIcon as QP,CheckIcon as ew,ExclamationCircleIcon as tw,InfoCircleIcon as ow,TimesIcon as rw}from"@patternfly/react-icons";import{global_palette_green_500 as sw}from"@patternfly/react-tokens/dist/js/global_palette_green_500";import{global_danger_color_100 as iw}from"@patternfly/react-tokens/dist/js/global_danger_color_100";import{global_palette_blue_300 as nw}from"@patternfly/react-tokens/dist/js/global_palette_blue_300";var aw=(e,t,o)=>{if(t){if(o?.includes(e))return{variant:"error",icon:Dt(rw,null)}}else return{variant:"indeterminate"};return{variant:"success",icon:Dt(ew,null)}},lw=({value:e,error:t,richValidationMessages:o})=>Dt(RP,{component:"ul",className:"rich-input__rules"},Object.keys(o).map(r=>{let s=aw(o[r],e,t);return Dt(YP,{key:r,isDynamic:!0,component:"li",...s},o[r])})),pw=uw(({label:e,labelIcon:t,helperText:o,isRequired:r,onChange:s,validate:i,idPostfix:n,noDefaultOnChange:a,richValidationMessages:l,...p},u)=>{let[c,d]=cw(!1),[m,{error:g,value:h,touched:C},{setTouched:I}]=GP({name:p.name,validate:i}),S=T(p.name,"input",n),y=!C||!g?.length;return Dt(qP,{fieldId:S,label:e,helperText:typeof o=="string"?o:Dt(j,{fieldId:S},o),validated:y?"default":"error",isRequired:r,labelIcon:t},Dt(JP,{className:$P("rich-input__group",{"rich_input__group--invalid":!y})},Dt(jP,{...m,...p,ref:u,id:S,isRequired:r,"aria-describedby":`${S}-helper`,onChange:(v,w)=>{!c&&d(!0),!a&&m.onChange(w),I(!0,!1),s&&s(w)},className:"rich-input__text",onBlur:()=>d(!1)}),Dt(KP,{isVisible:c,shouldClose:()=>d(!1),shouldOpen:()=>d(!0),"aria-label":"validation popover",position:XP.top,bodyContent:Dt(lw,{value:h,error:g,richValidationMessages:l})},Dt(ZP,{variant:"plain","aria-label":"Validation"},y?h?Dt(QP,{color:sw.value}):Dt(ow,{color:nw.value}):Dt(tw,{color:iw.value})))))}),ws=pw;import{useField as dw}from"formik";import{createElement as fw}from"react";var mw=({name:e,label:t,isRequired:o,isDisabled:r,helperText:s})=>{let[i,,{setValue:n,setTouched:a}]=dw(e);return fw(ur,{name:e,label:t,helperText:s,onBlur:()=>{i.value&&(n(Mo(i.value)),a(!0))},spellCheck:!1,isRequired:o,isDisabled:r})},ic=mw;import nc from"react";import{Button as gw,ButtonVariant as hw,Tooltip as Cw}from"@patternfly/react-core";import{MinusCircleIcon as yw}from"@patternfly/react-icons";import vw from"classnames";var Sw=1500,Iw=({onRemove:e,hideRemoveButton:t=!0,children:o,className:r,removeButtonDataTestId:s,...i})=>nc.createElement(Cw,{hidden:t,exitDelay:Sw,flipBehavior:["right","bottom"],position:"right-start",distance:0,content:nc.createElement(gw,{variant:hw.plain,onClick:e,"data-testid":s},nc.createElement(yw,{size:"sm"})),className:vw("ai-remove-button__tooltip ",r),...i},o),pn=Iw;import{Button as bw,ButtonVariant as xw}from"@patternfly/react-core";import{PlusCircleIcon as kw}from"@patternfly/react-icons";import Ig from"react";var Tw=({onAdd:e,variant:t=xw.link,children:o,...r})=>Ig.createElement(bw,{icon:Ig.createElement(kw,null),onClick:e,variant:t,...r},o),ac=Tw;import{useField as Pw}from"formik";import{Fragment as xg,createElement as mr,useEffect as Nw,useRef as Vw,useState as Hw}from"react";import{PencilAltIcon as ww}from"@patternfly/react-icons";import{Split as Dw,SplitItem as bg}from"@patternfly/react-core";var Ew=({name:e,isRequired:t,onBlur:o,showErrorMessage:r})=>{let s=Vw();return Nw(()=>s?.current?.focus(),[]),mr(St,{name:e,isRequired:t,onBlur:o,ref:s,showErrorMessage:r})},Aw=({name:e,isRequired:t,showErrorMessage:o})=>{let[r,s]=Hw(!1),[i]=Pw({name:e}),n=pr({name:e});return mr(xg,null,r?mr(Ew,{name:e,isRequired:t,onBlur:()=>s(!1),showErrorMessage:o}):mr(xg,null,mr(Dw,null,mr(bg,{className:"ai-pencil-field__text"},i.value),mr(bg,null,mr(ww,{onClick:()=>s(!0)})))),mr("div",{className:"pf-c-form__helper-text pf-m-error"},n))},Fw=Aw;import{overlap as zw}from"cidr-tools";import{Address4 as gc,Address6 as hc}from"ip-address";import Qa from"is-cidr";import{isInSubnet as Bw}from"is-in-subnet";import{array as hn,lazy as lD,mixed as aD,number as il,object as Ic,string as Pe}from"yup";import{Address4 as Ka,Address6 as Xa}from"ip-address";import Ow from"lodash/camelCase";var O=e=>{let t;if(e)try{let o=e.replace(/"([\w-]+)":/g,(r,s)=>`"${Ow(s)}":`);t=JSON.parse(o)}catch(o){console.error("Failed to parse api string",o,e)}else console.info("Empty api string received.");return t},kg=(e="")=>e.replace(/^(http|https):\/\//,"");import un from"lodash/fp/head";var Ds=({machineNetworks:e,machineNetworkCidr:t})=>un(e)?.cidr??t;var gi=e=>e||[],Wr=e=>gi(e?.monitoredOperators).filter(t=>t.operatorType==="olm"),Ga=(e,t)=>gi(e).some(o=>o.name&&o.name===t),Tg=e=>!e.hosts||e.hosts.length<=3,le=({highAvailabilityMode:e})=>e==="None",Pg=({validationsInfo:e})=>O(e),lc=({machineNetworks:e,serviceNetworks:t,clusterNetworks:o},r)=>{switch(r){case"machineNetworks":return un(e)?.cidr;case"clusterNetworks":return un(o)?.cidr;case"serviceNetworks":return un(t)?.cidr}},pc=({machineNetworks:e,serviceNetworks:t,clusterNetworks:o},r)=>{switch(r){case"machineNetworks":return e&&e[1].cidr;case"clusterNetworks":return o&&o[1].cidr;case"serviceNetworks":return t&&t[1].cidr}},wg=({clusterNetworks:e})=>un(e)?.hostPrefix,Dg=({clusterNetworks:e})=>e&&e[1].hostPrefix,zo=({cpuArchitecture:e})=>e===L.ARM,Lw=e=>e.hosts?e.hosts.length<5:!0,cn=e=>e.schedulableMastersForcedTrue===void 0?Lw(e):e.schedulableMastersForcedTrue,io=e=>cn(e)?!0:e.schedulableMasters||!1,So=({platform:e})=>qf.includes(e?.type??"none"),$a=e=>e.canSelectCpuArch!==!1;import Mw from"filesize.js";import S8 from"fuse.js";var de="-",Eg="ODD";var Ag=(e,t)=>["pending-for-input","insufficient","ready","adding-hosts"].includes(e)&&["disabled","disabled-unbound"].includes(t),Fg=(e,t)=>["pending-for-input","insufficient","ready","adding-hosts"].includes(e)&&["discovering","discovering-unbound","disconnected","disconnected-unbound","known","known-unbound","insufficient","insufficient-unbound","pending-for-input"].includes(t),Vg=(e,t)=>["pending-for-input","insufficient","ready","adding-hosts"].includes(e)&&["discovering","discovering-unbound","known","known-unbound","disconnected","disconnected-unbound","disabled","disabled-unbound","insufficient","insufficient-unbound","resetting","resetting-pending-user-input","resetting-pending-user-action","installing-pending-user-action","pending-for-input","added-to-existing-cluster","error"].includes(t),Ng=(e,t)=>["adding-hosts"].includes(e)&&["error","installing-pending-user-action"].includes(t),qa=(e,t)=>["pending-for-input","insufficient","ready","adding-hosts"].includes(e)&&["discovering","discovering-unbound","known","known-unbound","disconnected","disconnected-unbound","disabled","disabled-unbound","insufficient","insufficient-unbound","pending-for-input"].includes(t),Hg=(e,t,o)=>qa(e,t)&&!o,Og=e=>["insufficient","adding-hosts","ready","pending-for-input"].includes(e),Lg=qa,dn=e=>["installing","finalizing","error","cancelled","installed","adding-hosts"].includes(e),Ya=(e,t)=>e.kind==="AddHostsCluster"&&e.status==="adding-hosts"&&t==="known",mn=e=>e.progressStages||[],uc=e=>e.progress?.currentStage?e.progress:{currentStage:"Starting installation",progressInfo:void 0,installationPercentage:void 0},ja=e=>{let t=mn(e),o=uc(e);return Math.round((o?.installationPercentage||0)/100*t.length)},Mg=e=>["discovering","discovering-unbound","known","known-unbound","disconnected","disconnected-unbound","insufficient","insufficient-unbound","pending-for-input"].includes(e),cc=(e,t,o)=>{let r=`${xs(t).find(s=>s.value===e.role)?.label||xs(t)[0].label}`;return o&&e.role==="master"&&(r=t("ai:Control plane node, Worker")),`${r}${e.bootstrap?" (bootstrap)":""}`},dc=e=>!!e.logsCollectedAt&&e.logsCollectedAt!==ui,Es=e=>e.controllerLogsCollectedAt!==ui||!!(e.hosts||[]).find(t=>dc(t)),Ra=e=>e.readyHostCount||0,fn=e=>e.enabledHostCount||0,gn=e=>e.totalHostCount||0,zr=(e=[])=>e.filter(t=>t.status!=="disabled"),Bo=(e,t)=>e.requestedHostname||t.hostname||"",_g=(e,t)=>{let o=de,{systemVendor:r}=e;return r!==void 0&&(r.virtual?o=t("ai:Virtual machine"):o=t("ai:Bare metal")),o},Io=(...e)=>Mw.call(null,...e).toUpperCase().replace(/I/,"i"),He=e=>{let{inventory:t=""}=e;return O(t)||{}};var _w=e=>Object.keys(e).reduce((t,o)=>{let r=e[o].filter(s=>s.status==="failure");return[...t,...r]},[]),Wg=e=>{let t=_w(e).map(o=>o.id);if(!t.length)return!1;for(let o of t)if(!["ntp-synced","container-images-available"].includes(o))return!1;return!0};var fr=e=>Ka.isValid(e)?new Ka(e):Xa.isValid(e)?new Xa(e):null,mc=e=>{if(e){let t=e.startAddress().correctForm(),o=e.endAddress().correctForm();return`(${t} - ${o})`}return""},Ww=e=>e?`${e.address} ${mc(e)}`:"",zg=e=>{let t=e.hosts?.reduce((o,r)=>{let s=O(r.inventory)||{};return o={...o,[r.id]:Bo(r,s)},o},{})||{};return e.hostNetworks?.map(o=>({subnet:o.cidr||"",hostIDs:o.hostIds?.map(r=>t[r]||r)||[],humanized:Ww(fr(o.cidr))}))||[]};var Bg=(e,t)=>{let o=t.map(r=>r.cidr);return e.length===t.length&&e.every(r=>o.includes(r.cidr))},Ug=(e,t)=>e.length===t.length&&e.every(o=>t.find(r=>r.cidr===o.cidr&&r.hostPrefix===o.hostPrefix));var Gg=(e,t=!1)=>!(e||t),$g=(e,t=!1)=>e||t?Ts:Co,qg=e=>e.some(t=>Ka.isValid(t.subnet))&&e.some(t=>Xa.isValid(t.subnet)),fc=e=>e&&e.length>1&&Ka.isValid(e[0].cidr||"")&&Xa.isValid(e[1].cidr||""),hi=({machineNetworks:e,clusterNetworks:t,serviceNetworks:o})=>fc(e)&&fc(t)&&fc(o);var Yg=e=>({usePlatformIntegration:So(e),schedulableMasters:io(e)}),jg=()=>({nodeLabeling:""});var Yt=e=>({INVALID_LENGTH_OCM:e("ai:1-54 characters"),INVALID_LENGTH_ACM:e("ai:2-54 characters"),INVALID_VALUE_OCM:Ja(e).INVALID_VALUE,INVALID_VALUE_ACM:e("ai:Use lowercase alphanumeric characters or hyphen (-)"),INVALID_START_END:e("ai:Start and end with a lowercase letter or a number."),NOT_UNIQUE:e("ai:Must be unique")}),Rg=e=>({INVALID_LENGTH:Yt(e).INVALID_LENGTH_OCM,INVALID_VALUE:Yt(e).INVALID_VALUE_OCM,INVALID_START_END:Yt(e).INVALID_START_END}),Kg=e=>({INVALID_LENGTH:Yt(e).INVALID_LENGTH_OCM,INVALID_VALUE:Yt(e).INVALID_VALUE_OCM,INVALID_START_END:Yt(e).INVALID_START_END,NOT_UNIQUE:Yt(e).NOT_UNIQUE}),z8=e=>({INVALID_LENGTH:Yt(e).INVALID_LENGTH_ACM,INVALID_VALUE:Yt(e).INVALID_VALUE_ACM,INVALID_START_END:Yt(e).INVALID_START_END,NOT_UNIQUE:Yt(e).NOT_UNIQUE}),Ja=e=>({INVALID_LENGTH:e("ai:1-253 characters"),NOT_UNIQUE:e("ai:Must be unique"),INVALID_VALUE:e("ai:Use lowercase alphanumeric characters, dot (.) or hyphen (-)"),INVALID_START_END:e("ai:Must start and end with an lowercase alphanumeric character"),INVALID_FORMAT:e("ai:Number of characters between dots (.) must be 1-63")}),Br=e=>({...Ja(e),LOCALHOST_ERR:e('ai:Do not use forbidden words, for example: "localhost".')}),Xg=e=>({INVALID_LENGTH:e("ai:1-63 characters"),INVALID_VALUE:e("ai:Use alphanumeric characters, dot (.), underscore (_) or hyphen (-)"),INVALID_START_END:e("ai:Must start and end with an alphanumeric character")}),Jg=e=>({INVALID_VALUE:e("ai:The Value is not valid BMC address, supported protocols are redfish-virtualmedia or idrac-virtualmedia.")}),Za=["localhost","localhost.localdomain","localhost4","localhost4.localdomain4","localhost6","localhost6.localdomain6"];var Zg=/^[a-zA-Z0-9]+$/,Qg=/^[a-z0-9](.*[a-z0-9])?$/,Uw=/^[a-z0-9-.]*$/,Gw=/^[a-z0-9](.*[a-z0-9])?$/,$w=/^[.-a-z0-9]?(([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)*)[.-a-z0-9]?$/,qw=/^[a-z0-9-]*$/,Yw=/^(ssh-rsa|ssh-ed25519|ecdsa-[-a-z0-9]*) AAAA[0-9A-Za-z+/]+[=]{0,3}( .+)?$/,eh=/^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/,jw=/^([a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62}){1}(\.[a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62})*[._]?$/,Rw="0.0.0.0",Kw="0000:0000:0000:0000:0000:0000:0000:0000",Xw=/^([0-9A-Fa-f]{2}[:]){5}([0-9A-Fa-f]{2})$/,Jw=/^[^.]{1,63}(?:[.][^.]{1,63})*$/,Zw=/^((redfish-virtualmedia|idrac-virtualmedia)(\+https?)?:(\/\/([a-z0-9\-._~%!$&'()*+,;=]+@)?([a-z0-9\-._~%]+|\[[a-f0-9:.]+\]|\[v[a-f0-9][a-z0-9\-._~%!$&'()*+,;=:]+\])(:[0-9]+)?(\/[a-z0-9\-._~%!$&'()*+,;=:@]+)*\/?|(\/?[a-z0-9\-._~%!$&'()*+,;=:@]+(\/[a-z0-9\-._~%!$&'()*+,;=:@]+)*\/?)?)|([a-z0-9\-._~%!$&'()*+,;=@]+(\/[a-z0-9\-._~%!$&'()*+,;=:@]+)*\/?|(\/[a-z0-9\-._~%!$&'()*+,;=:@]+)+\/?))(\?[a-z0-9\-._~%!$&'()*+,;=:@/?]*)?(#[a-z0-9\-._~%!$&'()*+,;=:@/?]*)?$/i,Qw=/^[a-zA-Z0-9-._]*$/,th=(e,t,o="",r,s=!1)=>{let i=Yt(e);return Pe().required("Required").matches(s?$w:qw,{message:s?i.INVALID_VALUE_OCM:i.INVALID_VALUE_ACM,excludeEmptyString:!0}).matches(Gw,{message:i.INVALID_START_END,excludeEmptyString:!0}).min(s?1:2,s?i.INVALID_LENGTH_OCM:i.INVALID_LENGTH_ACM).max(54,s?i.INVALID_LENGTH_OCM:i.INVALID_LENGTH_ACM).when("useRedHatDnsService",{is:!0,then:Pe().test("is-name-unique",i.NOT_UNIQUE,n=>{let a=`${n}.${o}`;return!n||!t.includes(a)}),otherwise:Pe().test("is-name-unique",i.NOT_UNIQUE,n=>r?!n||!t.includes(n):!0)})},el=Pe().test("ssh-public-key",'SSH public key must consist of "[TYPE] key [[EMAIL]]", supported types are: ssh-rsa, ssh-ed25519, ecdsa-[VARIANT]. A single key can be provided only.',e=>e?!!Ss(e).match(Yw):!0),oh=Pe().test("is-well-formed-json","Invalid pull secret format. You must use your Red Hat account's pull secret.",e=>{let t=!0;if(!e)return t;try{let o=JSON.parse(e);return o.constructor.name==="Object"&&!!o?.auths&&o.auths.constructor.name==="Object"}catch{return!t}}),rh=Pe().test("ip-validation","Not a valid IP address",e=>gc.isValid(e)||hc.isValid(e)),tl=Pe().matches(Xw,{message:'Value "${value}" is not valid MAC address.',excludeEmptyString:!0}),eD=(e,{machineNetworks:t,hostSubnet:o})=>Pe().test("vip-validation","IP Address is outside of selected subnet",function(r){if(!r)return!0;try{rh.validateSync(r)}catch(i){return this.createError({message:Ge(i)})}let s=[];if(t){let i=t?.map(n=>n.cidr);s.push(...e.filter(n=>i?.includes(n.subnet)))}else{let i=e.find(n=>n.subnet===o);i&&s.push(i)}for(let i of s)if(i?.subnet)if(i.hostIDs.length){if(Bw(r,i.subnet))return!0}else return!0;return!1}),tD=({ingressVip:e,apiVip:t})=>Pe().test("vip-uniqueness-validation","The Ingress and API IP addresses cannot be the same.",o=>o?e!==t:!0),oD=(e,t)=>Pe().test("required-once-set",t||"The value is required.",o=>o||!e),rD=Pe().when(["managedNetworkingType"],{is:"clusterManaged",then:Pe().notOneOf([qt],"Host subnet must be selected.")}),Cc=(e,t,o)=>aD().when(["vipDhcpAllocation","managedNetworkingType"],{is:(r,s)=>!r&&s!=="userManaged",then:oD(o,"Required. Please provide an IP address").concat(eD(e,t)).concat(tD(t)).when("hostSubnet",{is:r=>r!==qt,then:Pe().required("Required. Please provide an IP address")})}),sh=e=>Pe().required("A value is required.").test("valid-ip-address","Invalid IP address block. Expected value is a network expressed in CIDR notation (IP/netmask). For example: 123.123.123.0/24, 2055:d7a::/116",(t="")=>Qa.v4(t)||Qa.v6(t)).test("valid-netmask",`IPv4 netmask must be between 1-25 and include at least 128 addresses.
|
|
8
|
-
IPv6 netmask must be between 8-128 and include at least 256 addresses.`,(t="")=>{let o=parseInt(t.split("/")[1]);return Qa.v4(t)&&0<o&&o<26||Qa.v6(t)&&7<o&&o<129}).test("cidr-is-not-unspecified","The specified CIDR is invalid because its resulting routing prefix matches the unspecified address.",(t="")=>{let o=fr(t);if(o===null)return!1;let r=o.startAddress().address;return r!==Rw&&r!==Kw}).test("valid-cidr-base-address",({value:t})=>`${t} is not a valid CIDR`,(t="")=>{let o=fr(t);if(o===null)return!1;let r=o.startAddress().parsedAddress;return o.parsedAddress.every((n,a)=>n===r[a])}).test("cidrs-can-not-overlap","Provided CIDRs can not overlap.",t=>{try{if(t&&e&&e.length>0)return!zw(t,e)}catch{return!1}return!0}),yc=Pe().test("dns-name-label-length","Single label of the DNS name can not be longer than 63 characters.",(e="")=>e.split(".").every(t=>t.length<=63)).matches(eh,{message:'Value "${value}" is not valid DNS name. Example: basedomain.example.com',excludeEmptyString:!0}),sD=e=>{let t="The host prefix is required.",o="The host prefix is a number between 1 and 32 for IPv4 and between 8 and 128 for IPv6.",r=(e||"").split("/")[1];if(!r)return il().required(t).min(1,o).max(32,o);let s=parseInt(r);isNaN(s)&&(s=1);let i="The host prefix is a number between size of the cluster network CIDR range",n=`${i} (${s}) and 25.`,a=`${i} (8) and 128.`;return hc.isValid(e||"")?il().required(t).min(8,a).max(128,a):gc.isValid(e||"")?il().required(t).min(s,n).max(25,n):il().required(t)},ol=(e,t,o)=>{let r=Ja(e);return Pe().min(1,r.INVALID_LENGTH).max(253,r.INVALID_LENGTH).test(r.INVALID_START_END,r.INVALID_START_END,s=>{let i=s?.trim();return i?!!i[0].match(Qg)&&(i[i.length-1]?!!i[i.length-1].match(Qg):!0):!0}).matches(Jw,r.INVALID_FORMAT).matches(Uw,{message:r.INVALID_VALUE,excludeEmptyString:!0}).test(r.NOT_UNIQUE,r.NOT_UNIQUE,s=>!s||s===o?!0:!t.find(i=>i===s)).notOneOf(Za,Br(e).LOCALHOST_ERR)},iD="Provide a valid HTTP URL.",vc=(e,t)=>Pe().test("http-proxy-no-empty-validation","At least one of the HTTP or HTTPS proxy URLs is required.",o=>!e.enableProxy||o||e[t]).test("http-proxy-validation",iD,o=>{if(!o)return!0;try{return new URL(o).protocol==="http:"}catch{return!1}}),nD=e=>!e||e!=="",Sc=(e,t=eh)=>{if(!e||e.match(t))return!0;try{rh.validateSync(e)}catch{return!1}return!0},ih=Pe().test("no-proxy-validation","Provide a comma separated list of valid DNS names or IP addresses.",e=>{if(!e||e==="*")return!0;let t=Mo(e).split(",").map(o=>o.charAt(0)==="."?o.substring(1):o);return t.every(nD)&&t.every(o=>Sc(o,jw))}),nh=Pe().test("ntp-source-validation","Provide a comma separated list of valid DNS names or IP addresses.",e=>e?Mo(e).split(",").every(t=>Sc(t)):!0),ah=Pe().test("day2-api-vip","Provide a valid DNS name or IP Address",e=>e?Sc(e):!0),Z8=e=>{let t=Jg(e);return Pe().matches(Zw,{message:t.INVALID_VALUE,excludeEmptyString:!0})},Q8=e=>{let t=Xg(e);return Pe().min(1,t.INVALID_LENGTH).max(63,t.INVALID_LENGTH).test(t.INVALID_START_END,t.INVALID_START_END,o=>{let r=o?.trim();return r?!!r[0].match(Zg)&&(r[r.length-1]?!!r[r.length-1].match(Zg):!0):!0}).matches(Qw,{message:t.INVALID_VALUE,excludeEmptyString:!0})},lh=hn().of(Ic({cidr:rD,clusterId:Pe()})),ph=hn().of(lD(e=>Ic({cidr:sh(void 0),hostPrefix:sD(e.cidr),clusterId:Pe()}))),uh=hn().of(Ic({cidr:sh(void 0),clusterId:Pe()})),rl=e=>hn().max(2,`Maximum number of ${e} subnets in dual stack is 2.`).test("dual-stack-ipv4","First network has to be IPv4 subnet.",t=>t[0].cidr&&gc.isValid(t[0].cidr)).test("dual-stack-ipv6","Second network has to be IPv6 subnet.",t=>t[1].cidr&&hc.isValid(t[1].cidr)),sl=hn().test("single-stack","All network subnets must be IPv4.",e=>Jf(e));import{createElement as Ci,useState as fD}from"react";import{useField as pD}from"formik";import{FormGroup as uD,Label as cD}from"@patternfly/react-core";import dD from"react-tagsinput";var mD=({value:e,onClose:t})=>Ci(cD,{className:"label-field__value",variant:"outline",onClose:t},e),c5=({label:e,labelIcon:t,helperText:o,isRequired:r,onChange:s,validate:i,idPostfix:n,...a})=>{let{t:l}=f(),[p,u]=fD(""),[c,{touched:d,error:m},{setValue:g,setTouched:h}]=pD({name:a.name,validate:i}),C=T(a.name,"input",n),I=!(d&&m);return Ci(uD,{fieldId:C,label:e,helperText:typeof o=="string"?o:Ci(j,{fieldId:C},o),helperTextInvalid:I?"":m,validated:I?"default":"error",isRequired:r,labelIcon:t},l("ai:Enter key=value and then press 'enter' or 'space' or use a ',' to input the label."),Ci("div",{className:"co-search-input pf-c-form-control"},Ci(dD,{...c,onChange:y=>{g(y),u(""),s&&s(y),!d&&h(!0)},addKeys:[13,32,188],renderTag:({tag:y,key:v,onRemove:w,getTagDisplayValue:E})=>Ci(mD,{key:v,onClose:()=>w(v),value:E(y)}),addOnBlur:!0,inputProps:{autoFocus:!1,className:"label-field__input",placeholder:c.value?.length?"":"app=frontend",spellCheck:"false",id:"tags-input",value:p,onChange:y=>u(y.target.value),["data-test"]:"tags-input"}})))};import yi from"react";import{Title as gD,EmptyState as hD,EmptyStateBody as CD,Bullseye as yD,EmptyStateIcon as vD,EmptyStateSecondaryActions as SD}from"@patternfly/react-core";import{SearchIcon as ID}from"@patternfly/react-icons";var bD=({title:e="No results found",content:t,icon:o=ID,primaryAction:r,secondaryActions:s})=>yi.createElement(yD,null,yi.createElement(hD,null,yi.createElement(vD,{icon:o}),yi.createElement(gD,{headingLevel:"h2"},e),t&&yi.createElement(CD,null,t),r,s&&yi.createElement(SD,null,s))),bo=bD;import Uo from"react";import{Title as xD,EmptyState as kD,EmptyStateBody as TD,Bullseye as PD,EmptyStateIcon as wD,EmptyStateVariant as DD,Button as ED,ButtonVariant as AD,EmptyStateSecondaryActions as FD}from"@patternfly/react-core";import{ExclamationCircleIcon as VD}from"@patternfly/react-icons";import{global_danger_color_200 as ND}from"@patternfly/react-tokens";var HD=({fetchData:e})=>{let{t}=f();return Uo.createElement(Uo.Fragment,null,t("ai:There was an error retrieving data. Check your connection and")," ",e?Uo.createElement(ED,{onClick:e,variant:AD.link,isInline:!0},t("ai:try again")):t("ai:try again"),".")},OD=({title:e="Error loading data",content:t,fetchData:o,icon:r=VD,iconColor:s=ND.value,variant:i=DD.small,primaryAction:n,actions:a})=>Uo.createElement(PD,null,Uo.createElement(kD,{variant:i},Uo.createElement(wD,{icon:r,color:s}),Uo.createElement(xD,{headingLevel:"h2"},e),Uo.createElement(TD,null,t||Uo.createElement(HD,{fetchData:o})),n,a&&Uo.createElement(FD,null,a))),_=OD;import Cn from"react";import{EmptyState as LD,EmptyStateBody as MD,Bullseye as _D,EmptyStateVariant as WD,Spinner as zD,EmptyStateSecondaryActions as BD}from"@patternfly/react-core";var UD=({content:e,primaryAction:t,secondaryActions:o})=>Cn.createElement(_D,null,Cn.createElement(LD,{variant:WD.small},Cn.createElement(zD,{size:"xl"}),e&&Cn.createElement(MD,null,e),t,o&&Cn.createElement(BD,null,o))),z=UD;import ch from"react";import{Button as GD,ToolbarItem as $D}from"@patternfly/react-core";var qD=({...e})=>ch.createElement($D,null,ch.createElement(GD,{...e})),ht=qD;import dh from"react";import{ToolbarItem as YD,Text as jD}from"@patternfly/react-core";var RD=e=>dh.createElement(YD,null,dh.createElement(jD,{...e})),KD=RD;import bc from"react";import{ToolbarGroup as XD,ToolbarItem as JD,Progress as ZD,ProgressSize as QD}from"@patternfly/react-core";var eE=({style:e,size:t=QD.sm})=>bc.createElement(XD,{style:{flexGrow:1}},bc.createElement(JD,{style:{flexGrow:1}},bc.createElement(ZD,{style:{...e,gridGap:0},size:t}))),tE=eE;import oE from"react";import{ToolbarGroup as rE}from"@patternfly/react-core";var sE=({children:e})=>oE.createElement(rE,{alignment:{md:"alignRight"}},e),xc=sE;import{createElement as vi,useEffect as pE}from"react";import{useField as iE}from"formik";import{FormGroup as nE,TextContent as aE,Text as lE}from"@patternfly/react-core";var mh=({label:e,name:t,children:o,helperText:r,helperTextInvalid:s,isRequired:i,isValid:n=!0})=>{let a=T(t,"static");return vi(nE,{fieldId:a,label:e,helperText:typeof r=="string"?r:vi(j,{fieldId:a},r),helperTextInvalid:s,validated:n?"default":"error",isRequired:i},o)},nl=({value:e,...t})=>{let[,,o]=iE({name:t.name});return pE(()=>{o.setValue(e)},[e]),vi(mh,{...t})},al=({children:e,...t})=>{let o=T(t.name,"static");return vi(mh,{...t},vi(aE,null,vi(lE,{component:"p",id:o,"aria-describedby":`${o}-helper`},e)))};import{createElement as ut}from"react";import{ActionList as tA,ActionListItem as Tn,Button as Dc,ButtonVariant as Ec,Spinner as oA,SplitItem as rA,Stack as sA,StackItem as Ac,Text as iA,TextVariants as nA}from"@patternfly/react-core";import xh from"react";import{ButtonVariant as ZE}from"@patternfly/react-core";import Et from"react";import{Button as $E,Modal as qE,ButtonVariant as YE,ModalVariant as jE,ModalBoxBody as RE}from"@patternfly/react-core";import{ExclamationTriangleIcon as KE}from"@patternfly/react-icons";import{global_warning_color_100 as XE}from"@patternfly/react-tokens";import xn,{useEffect as GE,useState as wc}from"react";import Rt from"react";import{Label as mE}from"@patternfly/react-core";import{TableVariant as fE,Table as gE,TableBody as hE,breakWord as CE}from"@patternfly/react-table";import{InfoCircleIcon as yE,ExclamationTriangleIcon as vE,ExclamationCircleIcon as SE,SearchIcon as IE}from"@patternfly/react-icons";var jt=e=>e?new Date(e).toLocaleString():de,w9=e=>e?new Date(e).toLocaleTimeString():de;import uE from"lodash/upperFirst";import cE from"lodash/endsWith";import{SortByDirection as dE}from"@patternfly/react-table";var fh=(e,t)=>[{heightAuto:!0,cells:[{props:{colSpan:t},title:e}]}],ll=(e,t)=>(o,r)=>{let s=e.direction===dE.asc?1:-1,i=t(o,e.index),n=t(r,e.index),a=typeof i=="string"?i:i?.sortableValue,l=typeof n=="string"?n:n?.sortableValue;return typeof a=="string"||typeof l=="string"?(a=a||"",a.localeCompare(l)*s):(a=a||0,l=l||0,(a-l)*s)},xo=e=>`${uE(e)}${cE(e,".")||e===""?"":"."}`,pl=e=>({title:jt(e),sortableValue:e?new Date(e).getTime():0});var W9=()=>({className:"pf-m-break-word"}),gh=()=>({className:"pf-m-fit-content"}),z9=()=>({className:"pf-m-nowrap"}),B9=()=>({className:"pf-m-truncate"}),U9=()=>({className:"pf-m-wrap"}),hh=()=>({className:"table-no-padding"});var bE=({rowData:e})=>e?.props?.event.sortableTime+e?.props?.event.message,xE=e=>{switch(e){case"info":return"blue";case"warning":return"orange";case"error":return"red";case"critical":return"purple"}},kE=e=>{switch(e){case"info":return Rt.createElement(yE,null);case"warning":return Rt.createElement(vE,null);case"error":case"critical":return Rt.createElement(SE,null)}},TE=({events:e,className:t})=>{let{t:o}=f();if(e.length===0)return Rt.createElement(bo,{icon:IE,title:o("ai:No events found"),content:o("ai:There are no events found.")});let s=e.map(i=>({...i,sortableTime:new Date(i.eventTime).getTime()})).sort((i,n)=>n.sortableTime-i.sortableTime).map(i=>({cells:[{title:Rt.createElement("strong",null,jt(i.eventTime))},{title:Rt.createElement(Rt.Fragment,null,i.severity!=="info"&&Rt.createElement(Rt.Fragment,null,Rt.createElement(mE,{color:xE(i.severity),icon:kE(i.severity)},i.severity)," "),i.message)}],props:{event:i}}));return Rt.createElement("div",{className:t},Rt.createElement(gE,{rows:s,cells:[{title:o("ai:Time"),cellTransforms:[gh,hh]},{title:o("ai:Message"),cellTransforms:[CE]}],variant:fE.compact,"aria-label":o("ai:Events table"),borders:!1},Rt.createElement(hE,{rowKey:bE})))},yn=TE;import Ur from"react";import{Button as _E,ButtonVariant as WE}from"@patternfly/react-core";import{SearchIcon as zE}from"@patternfly/react-icons";import we from"react";import Ch from"lodash/capitalize";import{Toolbar as PE,ToolbarItem as wE,ToolbarContent as DE,ToolbarFilter as yh,Button as EE,ButtonVariant as AE,InputGroup as FE,Select as vh,SelectOption as vn,TextInput as VE,Badge as NE}from"@patternfly/react-core";import{SearchIcon as HE,FilterIcon as OE}from"@patternfly/react-icons";var Sh=({text:e})=>we.createElement(we.Fragment,null,we.createElement(OE,null)," ",e),Sn="select-all-actions",In="cluster-level-action",bn="deleted-hosts-action",kc=e=>(e||[]).map(t=>{let o=O(t.inventory)||{},r=t.requestedHostname;return o.hostname!==t.requestedHostname&&(r+=` (${o.hostname})`),{hostname:r,id:t.id}}),ul=e=>({fulltext:"",hosts:kc(e.hosts).map(t=>t.id),severity:[],clusterLevel:!0,orphanedHosts:!0,selectAll:!0}),LE=(e,t)=>t.filter(o=>o.severity===e).length,ME=({filters:e,setFilters:t,cluster:o,events:r})=>{let[s,i]=we.useState(!1),[n,a]=we.useState(!1),l=we.useMemo(()=>kc(o.hosts),[o.hosts]),p=()=>{t(ul(o))},u=(v,w,E)=>{let F=(ae,Y,je,tt)=>({...tt,[ae]:Y?[...tt[ae],je]:tt[ae].filter(vt=>vt!==je)}),q=(ae,Y)=>({...Y,selectAll:v==="severity"?Y.selectAll:Y.hosts.length===ae&&Y.orphanedHosts&&Y.clusterLevel}),Z=F(v,w,E,e);Z=q(o.hosts?.length||0,Z),t(Z)},c=()=>i(!s),d=(v,w)=>{let E=v.target.checked;switch(w){case Sn:t(E?{...e,hosts:kc(o.hosts).map(F=>F.id),clusterLevel:!0,orphanedHosts:!0,selectAll:!0}:{...e,clusterLevel:!1,orphanedHosts:!1,selectAll:!1,hosts:[]});break;case bn:t({...e,orphanedHosts:E,selectAll:E&&e.clusterLevel&&e.hosts.length===o.hosts?.length});break;case In:t({...e,clusterLevel:E,selectAll:E&&e.orphanedHosts&&e.hosts.length===o.hosts?.length});break;default:u("hosts",E,w)}},m=()=>a(!n),g=(v,w)=>{u("severity",v.target.checked,w)},h=v=>{t({...e,fulltext:v})},C=(v,w)=>{if(v){let E=w.key||w;t({...e,[v]:e[v].filter(F=>F!==E)})}else p()},I=v=>{t({...e,[v]:[]})},S=()=>{let v=e.clusterLevel?[...e.hosts,In]:e.hosts;return v=e.orphanedHosts?[...v,bn]:v,v=e.selectAll?[...v,Sn]:v,v},{t:y}=f();return we.createElement(PE,{id:"clusters-events-toolbar",className:"pf-m-toggle-group-container",collapseListedFiltersBreakpoint:"xl",clearAllFilters:p},we.createElement(DE,null,we.createElement(yh,{categoryName:"hosts"},we.createElement(vh,{variant:"checkbox","aria-label":"hosts",onToggle:c,onSelect:d,selections:S(),customBadgeText:e.hosts?.length||0,isOpen:s,placeholderText:we.createElement(Sh,{text:"Hosts"}),isDisabled:l.length===0},[we.createElement(vn,{inputId:`checkbox-${Sn}`,key:Sn,value:Sn},y("ai:Select All")),we.createElement(vn,{inputId:`checkbox-${In}`,key:In,value:In},y("ai:Cluster-level events")),we.createElement(vn,{inputId:`checkbox-${bn}`,key:bn,value:bn},y("ai:Deleted hosts")),...l.map(v=>we.createElement(vn,{key:v.id,value:v.id},v.hostname))])),we.createElement(yh,{chips:e.severity.map(v=>({key:v,node:Ch(v)})),deleteChip:C,deleteChipGroup:I,categoryName:"severity"},we.createElement(vh,{variant:"checkbox","aria-label":"Severity",onToggle:m,onSelect:g,selections:e.severity,isOpen:n,placeholderText:we.createElement(Sh,{text:"Severity"})},$u.map(v=>we.createElement(vn,{"data-testid":`${v}-filter-option`,key:v,value:v},Ch(v)," ",we.createElement(NE,{isRead:!0},LE(v,r)))))),we.createElement(wE,null,we.createElement(FE,null,we.createElement(VE,{name:"search-text",id:"search-text",type:"search","aria-label":"text to be searched",onChange:h,value:e.fulltext,placeholder:y("ai:Filter by text")}),we.createElement(EE,{variant:AE.control,"aria-label":"search text button"},we.createElement(HE,null))))))},Tc=ME;var BE=(e,t=[],o)=>t.filter(r=>e.severity.length===0||e.severity.includes(r.severity)).filter(r=>!r.hostId||e.hosts.includes(r.hostId)||e.orphanedHosts&&!(o||[]).find(s=>s.id===r.hostId)).filter(r=>r.hostId||e.clusterLevel).filter(r=>!e.fulltext||(r.message||"").toLowerCase().includes(e.fulltext.toLowerCase())),UE=({events:e,cluster:t,className:o})=>{let[r,s]=Ur.useState(()=>ul(t)),i=Ur.useMemo(()=>BE(r,e,t.hosts),[r,e,t.hosts]),{t:n}=f();return Ur.createElement(Ur.Fragment,null,Ur.createElement(Tc,{filters:r,setFilters:s,cluster:t,events:e}),i.length===0&&e.length>0?Ur.createElement(bo,{icon:zE,title:n("ai:No matching events"),content:n("ai:There are no events that match the current filters. Adjust or clear the filters to view events."),primaryAction:Ur.createElement(_E,{variant:WE.primary,onClick:()=>s(ul(t)),id:"empty-state-cluster-events-clear-filters-button","data-ouia-id":"button-clear-events-filter"},n("ai:Clear filters"))}):Ur.createElement(yn,{events:i,className:o}))},Pc=UE;var Ih=({onFetchEvents:e,...t})=>{let[o,r]=wc(),[s,i]=wc(0),[n,a]=wc(""),{cluster:l,hostId:p,entityKind:u,className:c}=t;GE(()=>{let m;return e({clusterId:l.id,hostId:p},g=>{r(g),a(""),m=setTimeout(()=>i(Date.now()),Wu)},a),()=>clearTimeout(m)},[s,l.id,p,e]);let d=xn.useCallback(()=>{i(Date.now())},[i]);return n?xn.createElement(_,{title:n,fetchData:d}):o?u==="cluster"?xn.createElement(Pc,{events:o,cluster:l,className:c}):xn.createElement(yn,{events:o,className:c}):xn.createElement(z,null)};import{Trans as JE}from"react-i18next";var bh=({ButtonComponent:e=ht,onFetchEvents:t,onClick:o,hostId:r,cluster:s,entityKind:i,children:n,title:a,fallbackEventsURL:l,...p})=>{let[u,c]=Et.useState(!1),d=()=>c(!1);return Et.createElement(Et.Fragment,null,Et.createElement(e,{...p,onClick:o||(()=>c(!0))},n||a),Et.createElement(kn,{title:a,isOpen:u,onClose:d,hostId:r,cluster:s,entityKind:i,onFetchEvents:t,fallbackEventsURL:l}))},kn=({onFetchEvents:e,hostId:t,cluster:o,entityKind:r,onClose:s,isOpen:i,title:n,fallbackEventsURL:a})=>{let{t:l}=f();return Et.createElement(qE,{title:n,isOpen:i,"aria-label":l("ai:Displays events"),hasNoBodyWrapper:!0,actions:[Et.createElement($E,{key:"close",variant:YE.primary,onClick:s},l("ai:Close"))],onClose:s,variant:jE.large,className:"events-modal"},Et.createElement(RE,{className:"events-modal__body"},a?Et.createElement(_,{title:l("ai:Could not load events"),content:Et.createElement(Et.Fragment,null,Et.createElement(JE,{t:l},"ai:Could not load events from the standard location. You can check the events in the ",Et.createElement(ot,{href:a},"raw format"),".")),icon:KE,iconColor:XE.value}):Et.createElement(Ih,{hostId:t,cluster:o,entityKind:r,onFetchEvents:e,className:"events-modal__event-list"})))};import{MonitoringIcon as QE}from"@patternfly/react-icons";var eA=({cluster:e,onFetchEvents:t})=>xh.createElement(bh,{id:"cluster-events-button",entityKind:"cluster",icon:xh.createElement(QE,null),cluster:e,title:"Cluster Events",variant:ZE.secondary,onFetchEvents:t},"View Cluster Events"),Gr=eA;var $r=({alerts:e,errors:t,onNext:o,onBack:r,onCancel:s,isNextDisabled:i,isBackDisabled:n,leftExtraActions:a,isSubmitting:l,submittingText:p,nextButtonText:u,cluster:c,onFetchEvents:d})=>{let{t:m}=f();return p=p||m("ai:Saving changes..."),ut(sA,{hasGutter:!0},e&&ut(Ac,null,e),t&&ut(Ac,null,t),ut(Ac,null,ut(tA,{"data-testid":"wizard-step-actions"},a,o&&ut(Tn,null,ut(Dc,{variant:Ec.primary,name:"next",onClick:o,isDisabled:i},u||m("ai:Next"))),r&&ut(Tn,null,ut(Dc,{variant:Ec.secondary,name:"back",onClick:r,isDisabled:n},m("ai:Back"))),ut(Tn,null,ut(Dc,{variant:Ec.link,name:"cancel",onClick:s,isDisabled:!1},m("ai:Cancel"))),l&&ut(Tn,null,ut(iA,{component:nA.small},ut(oA,{size:"sm"})," ",p)),ut(rA,{isFilled:!0}),c&&d&&ut(Tn,null,ut(Gr,{cluster:c,onFetchEvents:d})))))};import kh from"react";var ee=({condition:e=!1,children:t})=>e?kh.createElement(kh.Fragment,null,t):null;import Si from"react";import{DropdownItem as aA,DropdownToggle as lA,Dropdown as pA}from"@patternfly/react-core";import{CaretDownIcon as uA}from"@patternfly/react-icons";var Th=({current:e,defaultValue:t,items:o,setValue:r,isDisabled:s,idPrefix:i,position:n,menuAppendTo:a})=>{let[l,p]=Si.useState(!1),u=o.map(({value:m,label:g,description:h})=>Si.createElement(aA,{key:m,id:m,description:h},g)),c=Si.useCallback(m=>{r(m?.currentTarget.id),p(!1)},[r,p]),d=Si.useMemo(()=>Si.createElement(lA,{onToggle:m=>p(!s&&m),toggleIndicator:uA,isDisabled:s,id:i?`${i}-dropdown-toggle-items`:void 0,className:"role-dropdown"},e||t),[p,e,s,t,i]);return Si.createElement(pA,{onSelect:c,dropdownItems:u,toggle:d,isOpen:l,isPlain:!0,id:i?`${i}-dropdown-toggle`:void 0,position:n,menuAppendTo:a})};import Go from"react";import{TextContent as cA,TextList as Ph,TextListVariants as wh,TextListItem as cl,TextListItemVariants as dl,Text as dA}from"@patternfly/react-core";var It=({children:e,title:t,titleComponent:o="h2"})=>Go.createElement(cA,null,t&&Go.createElement(dA,{component:o},t),Go.createElement(Ph,{component:wh.dl,className:"detail-list"},e)),A=({title:e,value:t="",idPrefix:o,testId:r,isHidden:s=!1,classNameValue:i})=>s?null:Go.createElement(Go.Fragment,null,Go.createElement(cl,{component:dl.dt,id:o?`${o}-title`:void 0,"data-testid":r?`${r}-title`:void 0},e),Go.createElement(cl,{component:dl.dd,id:o?`${o}-value`:void 0,"data-testid":r?`${r}-value`:void 0,className:i},Array.isArray(t)?Go.createElement(Ph,{component:wh.dl},t.map((n,a)=>[Go.createElement(cl,{"data-testid":r?`${r}-title-${a}`:void 0,key:n.title,component:dl.dt},n.title),Go.createElement(cl,{"data-testid":r?`${r}-value-${a}`:void 0,key:`dd-${n.title}`,component:dl.dd},n.value)])):t));import ml from"react";import{WizardNavItem as mA}from"@patternfly/react-core";import{ExclamationCircleIcon as fA}from"@patternfly/react-icons";import{global_danger_color_100 as gA}from"@patternfly/react-tokens";var hA=(e,t,o,r)=>!o&&!r&&!t()?ml.createElement(ml.Fragment,null,e,ml.createElement(fA,{className:"wizard-nav-item-warning-icon",color:gA.value,size:"sm"})):e,CA=({isValid:e=()=>!0,children:t,...o})=>{let{content:r,isDisabled:s,isCurrent:i}=o;return ml.createElement(mA,{...o,content:hA(r,e,s,i)},t)},fl=CA;import Fc from"react";import{AlertGroup as wA,AlertActionCloseButton as DA,Alert as EA}from"@patternfly/react-core";import As from"react";var Eh={};lr(Eh,{alertsSlice:()=>qr,dialogsSlice:()=>gl});import{v4 as yA}from"uuid";import{createSlice as vA}from"@reduxjs/toolkit";import{AlertVariant as SA}from"@patternfly/react-core";var Dh=[],qr=vA({initialState:Dh,name:"alerts",reducers:{addAlert:(e,t)=>[{key:yA(),variant:SA.danger,...t.payload},...e],removeAlert:(e,t)=>e.filter(o=>o.key!==t.payload),clearAlerts:()=>Dh}});import{createSlice as IA}from"@reduxjs/toolkit";var bA={},gl=IA({initialState:bA,name:"alerts",reducers:{openDialog:(e,t)=>(e[t.payload.dialogId]=t.payload.data||{},e),closeDialog:(e,t)=>(e[t.payload.dialogId]=void 0,e)}});var{addAlert:xA,removeAlert:kA,clearAlerts:TA}=qr.actions,PA=qr.reducer,Ah=As.createContext(null),$o=({children:e})=>{let[t,o]=As.useReducer(PA,[]),r={alerts:t,addAlert:As.useCallback(s=>o(xA(s)),[]),removeAlert:As.useCallback(s=>o(kA(s)),[]),clearAlerts:As.useCallback(()=>o(TA()),[])};return As.createElement(Ah.Provider,{value:r},e)},N=()=>{let e=As.useContext(Ah),{t}=f();if(!e)throw new Error(t("ai:useAlerts must be used within AlertsContextProvider"));return e};var AA=({className:e})=>{let{alerts:t,removeAlert:o}=N(),r=s=>o(s.key);return t.length?Fc.createElement(wA,{className:e},t.map(s=>Fc.createElement(EA,{actionClose:Fc.createElement(DA,{onClose:()=>r(s)}),isInline:!0,...s},s.message))):null},gr=AA;import Pn from"react";import FA,{defaultProps as VA}from"prism-react-renderer";import{Text as NA,TextVariants as HA,ClipboardCopy as OA,clipboardCopyFunc as LA}from"@patternfly/react-core";import MA from"prism-react-renderer/themes/github";var _A=({code:e,language:t="bash",theme:o=MA,copiable:r=!1})=>Pn.createElement(FA,{...VA,code:e,language:t,theme:o},({className:s,style:i,tokens:n,getLineProps:a,getTokenProps:l})=>Pn.createElement(NA,{component:HA.pre,className:s,style:i},r&&Pn.createElement(OA,{isReadOnly:!0,variant:"inline-compact",onCopy:p=>LA(p,e),style:{float:"right",background:"inherit"}}),n.map((p,u)=>Pn.createElement("div",{key:u,...a({line:p,key:u})},p.map((c,d)=>Pn.createElement("span",{key:d,...l({token:c,key:d})})))))),ct=_A;import WA from"react";var zA=e=>WA.createElement("div",{...e,className:"pf-c-form"}),wn=zA;import{createElement as En}from"react";import{Alert as BA,AlertVariant as UA,Progress as GA,ProgressMeasureLocation as $A,Stack as qA,StackItem as Fh}from"@patternfly/react-core";var YA=({error:e,progress:t})=>{let{t:o}=f();return En(qA,{hasGutter:!0},e&&En(Fh,null,En(BA,{variant:UA.danger,title:e.title,isInline:!0},e.message)),t!==null&&En(Fh,null,En(GA,{value:t,measureLocation:$A.outside,"aria-label":o("ai:Progress")})))},Dn=YA;import{createElement as Vc}from"react";import{Modal as jA,Button as Vh,ModalVariant as RA}from"@patternfly/react-core";var KA=({title:e,titleIconVariant:t,content:o,confirmationButtonText:r="Yes",confirmationButtonVariant:s="danger",onClose:i,onConfirm:n})=>{let{t:a}=f();return Vc(jA,{title:e,titleIconVariant:t,isOpen:!0,onClose:i,variant:RA.small,actions:[Vc(Vh,{"data-testid":"confirm-modal-submit",key:"confirm",variant:s,onClick:n},r),Vc(Vh,{key:"cancel",variant:"link",onClick:i},a("ai:Cancel"))]},o)},Fs=KA;import Nh from"react";import{Text as XA,TextContent as JA}from"@patternfly/react-core";var ZA=({children:e})=>Nh.createElement(JA,null,Nh.createElement(XA,{component:"h2"},e)),Ke=ZA;import hl from"react";import{WizardBody as QA}from"@patternfly/react-core";import{css as Hh}from"@patternfly/react-styles";import Oh from"@patternfly/react-styles/css/components/Wizard/wizard";var eF=({navigation:e,footer:t,children:o})=>hl.createElement("div",{className:Hh(Oh.wizardOuterWrap,"cluster-wizard-step")},hl.createElement("div",{className:Hh(Oh.wizardInnerWrap)},e,hl.createElement(QA,{"aria-labelledby":"step-id",hasNoBodyPadding:!1},o)),t&&hl.createElement("div",{className:"pf-c-wizard__footer cluster-wizard-step__footer"},t)),ye=eF;import iF from"lodash/values";import At from"react";import{Alert as Gh,AlertGroup as nF,AlertVariant as $h,Flex as aF,FlexItem as Hc,List as lF,ListItem as pF}from"@patternfly/react-core";import Lh from"lodash/values";import Mh from"lodash/keys";import _h from"lodash/reduce";var Wh=({validationId:e,hostGroup:t,clusterGroup:o},r)=>Mh(r).find(i=>{let{cluster:n,host:a}=r[i];return n.validationIds.includes(e)||a.validationIds.includes(e)||o&&n.groups.includes(o)||t&&a.groups.includes(t)}),tF=(e,t)=>{let o=Lh(e).flat().filter(r=>r&&t.includes(r.id));return o.length===t.length&&o.every(r=>r?.status==="disabled"||r?.status==="success")},oF=(e,t,o)=>t.every(r=>e[r]?.every(s=>s.status==="disabled"||s.status==="success"||o.includes(s.id))),Nc=(e,t)=>{let o=Lh(e).flat().filter(r=>r&&t.includes(r.id));return o.length===t.length&&o.every(r=>r?.status==="disabled"||r?.status==="success")},rF=(e,t,o)=>t.every(r=>e[r]?.every(s=>s.status==="disabled"||s.status==="success"||o.includes(s.id))),An=(e,t,o)=>{let{groups:r,validationIds:s}=o[t].host;return _h(e,(i,n,a)=>{if(r.includes(a))return i[a]=n,i;let l=(n||[]).filter(p=>s.includes(p.id));return l.length&&(i[a]=l),i},{})},Fn=(e,t,o)=>{let{status:r}=o;if(["insufficient","pending-for-input"].includes(r)){let{softValidationIds:s}=t[e],i=(typeof o.validationsInfo=="string"?O(o.validationsInfo):o.validationsInfo)||{},{groups:n,validationIds:a}=t[e].host;return rF(i,n,s)&&Nc(i,a)?"known":r}return r},zh=(e,t,o)=>{let{groups:r,validationIds:s}=o[t].cluster;return _h(e,(i,n,a)=>{if(r.includes(a))return i[a]=n,i;let l=(n||[]).filter(p=>s.includes(p.id));return l.length&&(i[a]=l),i},{})},Yr=(e,t,o,r=[])=>{let{status:s}=o;if(["insufficient","pending-for-input"].includes(s)){let i=(typeof o.validationsInfo=="string"?O(o.validationsInfo):o.validationsInfo)||{},{groups:n,validationIds:a}=t[e].cluster,{softValidationIds:l}=t[e],{allowedStatuses:p}=t[e].host;return r.every(c=>p.length===0||p.includes(Fn(e,t,c)))&&oF(i,n,l)&&tF(i,a)?"ready":s}return s},Bh=e=>Object.keys(e).reduce((t,o)=>[...t,...e[o].softValidationIds],[]),sF=e=>Object.keys(e).reduce((t,o)=>{let r=e[o].filter(s=>s.status==="failure");return[...t,...r]},[]),Cl=(e,t,o)=>{let r=An(e,t,o),s=sF(r).map(i=>i.id);if(!s.length)return!1;for(let i of s)if(!o[t].softValidationIds.includes(i))return!1;return!0},Uh=(e,t,o)=>{let r=Mh(t),s=!0;return r.find(i=>{if(i===o&&(s=!1),s)return!1;let{host:n}=t[i];return n.validationIds.includes(e)})};var uF=({currentStepId:e,clusterStatus:t,validationsInfo:o,hosts:r,wizardStepsValidationsMap:s,children:i})=>{let{failedClusterValidations:n,failedHostnameValidations:a}=At.useMemo(()=>{let u=zh(o||{},e,s),c=iF(u).flat(),d=r.some(m=>{let g=typeof m.validationsInfo=="string"?O(m.validationsInfo):m.validationsInfo;return!Nc(g||{},["hostname-valid","hostname-unique"])});return{failedClusterValidations:c.filter(m=>m?.status==="failure"),failedHostnameValidations:d}},[o,e,s,r]),l=Yr(e,s,{status:t,validationsInfo:o||{}},r)==="ready",{t:p}=f();return At.createElement(At.Fragment,null,!o&&At.createElement(Gh,{variant:$h.info,title:"Cluster validations are initializing.",isInline:!0},p("ai:Please hold on till background checks are started.")),!l&&At.createElement(nF,null,i,At.createElement(Gh,{variant:$h.warning,title:"Cluster is not ready yet.",isInline:!0},At.createElement(aF,{spaceItems:{default:"spaceItemsSm"},direction:{default:"column"}},!!n.length&&At.createElement(At.Fragment,null,At.createElement(Hc,null,p("ai:The following requirements must be met:")),At.createElement(Hc,null,At.createElement(lF,null,n.filter(Boolean).map(u=>At.createElement(pF,{key:u.id},u.message))))),a&&At.createElement(Hc,null,p("ai:The cluster is not ready yet. Some hosts have an ineligible name. To change the hostname, click on it."))))))},Oc=uF;import{Table as mN,TableBody as fN,TableVariant as gN}from"@patternfly/react-table";import{createElement as LC,useMemo as CN}from"react";import K,{Fragment as mF}from"react";import{Alert as vl,AlertGroup as fF,AlertVariant as Rh,Level as gF,LevelItem as Kh}from"@patternfly/react-core";import{global_warning_color_100 as hF,global_success_color_100 as CF}from"@patternfly/react-tokens";import{PendingIcon as yF,CheckCircleIcon as vF,ExclamationTriangleIcon as SF}from"@patternfly/react-icons";import no from"react";import{Button as Lc,ButtonVariant as Mc,Flex as qh,FlexItem as yl,Popover as cF}from"@patternfly/react-core";import{ExclamationTriangleIcon as Yh}from"@patternfly/react-icons";import{global_warning_color_100 as jh}from"@patternfly/react-tokens";var dF=({host:e,inventory:t={},onEditHostname:o,title:r,className:s,hosts:i,readonly:n=!1})=>{let a=r||Bo(e,t)||de,l=a!=="localhost",u=(i?!i.find(m=>{let g=O(m.inventory||"")||{};return m.id!==e.id&&Bo(m,g)===a}):!0)&&l,c=no.createElement(qh,{alignItems:{default:"alignItemsCenter"}},o&&!u&&no.createElement(yl,{className:"pf-u-mr-xs"},no.createElement(Yh,{color:jh.value})),no.createElement(yl,null,a)),{t:d}=f();return!n&&o?u?no.createElement(Lc,{variant:Mc.link,isInline:!0,onClick:o,className:s},c):no.createElement(cF,{headerContent:no.createElement(qh,{alignItems:{default:"alignItemsCenter"}},no.createElement(yl,{className:"pf-u-mr-xs"},no.createElement(Yh,{color:jh.value})),no.createElement(yl,null,d("ai:Hostname is not valid"))),bodyContent:d(l?"ai:Hostname is not unique":"ai:Hostname can not be localhost"),footerContent:no.createElement(Lc,{variant:Mc.link,isInline:!0,className:s,onClick:o},d("ai:Change hostname")),minWidth:"30rem",maxWidth:"50rem",hideOnOutsideClick:!0,zIndex:300},no.createElement(Lc,{variant:Mc.link,isInline:!0,className:s},c)):c},Vn=dF;var Xh=({validations:e,variant:t,title:o,actionLinks:r=[]})=>{let{t:s}=f();return K.createElement(vl,{title:o,variant:t,actionLinks:r,isInline:!0},K.createElement("ul",null,e.map(i=>K.createElement("li",{key:i.id},K.createElement("strong",null,ks(s)[i.id]||i.id,":"),"\xA0",xo(i.message)," ",i.status==="failure"&&pi(s)[i.id]))))},IF=({onEditHostname:e,host:t,hostnameValidations:o,variant:r})=>{let{t:s}=f(),i=[K.createElement(Vn,{key:"change-hostname",title:s("ai:Change hostname"),onEditHostname:e,host:t})],n=s("ai:Illegal hostname");return o.length===1?K.createElement(vl,{title:n,variant:r,actionLinks:i,isInline:!0},xo(o[0].message)):K.createElement(Xh,{title:n,validations:o,variant:r,actionLinks:i})},bF=({AdditionalNTPSourcesDialogToggleComponent:e,variant:t,validation:o})=>{let r=[K.createElement(e,{key:"add-ntp-sources"})],{t:s}=f();return K.createElement(vl,{title:s("ai:NTP synchronization failure"),variant:t,actionLinks:r,isInline:!0},xo(o.message)," ",pi(s)[o.id])},xF=({UpdateDay2ApiVipDialogToggleComponent:e,variant:t,validation:o})=>{let r=[K.createElement(e,{key:"update-api-vip"})],{t:s}=f();return K.createElement(vl,{title:s("ai:API connectivity failure"),variant:t,actionLinks:r,isInline:!0},xo(o.message))},Jh=({validations:e,title:t,variant:o,onEditHostname:r,AdditionalNTPSourcesDialogToggleComponent:s,UpdateDay2ApiVipDialogToggleComponent:i,host:n})=>{if(!e.length)return null;let a={["hostname-unique"]:void 0,["hostname-valid"]:void 0,["ntp-synced"]:void 0,["ignition-downloadable"]:void 0},l=[],p=[];for(let c of e)c.id in a&&c.status==="failure"?a[c.id]=c:p.push(c);let u=[];return a["hostname-unique"]&&u.push(a["hostname-unique"]),a["hostname-valid"]&&u.push(a["hostname-valid"]),u.length>0&&r&&l.push(K.createElement(IF,{hostnameValidations:u,variant:o,onEditHostname:r,host:n,key:"hostname-alert"})),a["ignition-downloadable"]&&i&&l.push(K.createElement(xF,{UpdateDay2ApiVipDialogToggleComponent:i,validation:a["ignition-downloadable"],variant:o,key:"ignition-downloadable-alert"})),a["ntp-synced"]&&s&&l.push(K.createElement(bF,{AdditionalNTPSourcesDialogToggleComponent:s,validation:a["ntp-synced"],variant:o,key:"ntp-sync-alert"})),p.length>0&&l.push(K.createElement(Xh,{validations:p,variant:o,title:t,key:"insufficient-alert"})),K.createElement(fF,null,l)},Zh=({validationsInfo:e,...t})=>{let{t:o}=f();return K.createElement(K.Fragment,null,Object.keys(e).map(r=>{let s=Bu(o)[r],i=e[r].filter(l=>l.status==="pending"),n=e[r].filter(l=>l.status==="failure"||l.status==="error");return K.createElement(mF,{key:r},K.createElement(gF,{className:"host-validation-groups__validation-group"},K.createElement(Kh,null,K.createElement("strong",null,s)),K.createElement(Kh,null,(()=>n.length?K.createElement(K.Fragment,null,o("ai:Failed")," ",K.createElement(SF,{color:hF.value})):i.length?K.createElement(K.Fragment,null,o("ai:Pending input")," ",K.createElement(yF,null)):K.createElement(K.Fragment,null,o("ai:Ready")," ",K.createElement(vF,{color:CF.value})))())),!n.length&&K.createElement(Jh,{variant:Rh.info,title:o("ai:Pending validations:"),validations:i,...t}),K.createElement(Jh,{variant:Rh.warning,title:o("ai:Failed validations:"),validations:n,...t}))}))};import Qh from"react";import EF from"react";import{useCallback as kF,useEffect as TF,useRef as PF,useState as wF}from"react";var DF=e=>{let t=PF(!1);TF(()=>(t.current=!0,()=>{t.current=!1}),[]);let[o,r]=wF(e),s=kF(i=>{t.current&&r(i)},[]);return[o,s]},qo=DF;import{useRef as YZ}from"react";import $Z from"lodash/isEqual";var AF=({host:e,onEditRole:t,current:o,position:r})=>{let[s,i]=qo(!1),n=async l=>{i(!0);try{await t(l)}finally{i(!1)}},{t:a}=f();return EF.createElement(Th,{defaultValue:xs(a)[0].value,current:o,items:xs(a),setValue:n,isDisabled:s,idPrefix:`role-${e.requestedHostname}`,position:r,menuAppendTo:()=>document.body})},_c=AF;var FF=({host:e,role:t,readonly:o=!1,onEditRole:r,position:s})=>!o&&r?Qh.createElement(_c,{host:e,onEditRole:r,current:t,position:s}):Qh.createElement("span",null,t),Sl=FF;import Kt from"react";import{Popover as VF,Level as Wc,LevelItem as Ii}from"@patternfly/react-core";var NF=({cluster:e,inParenthesis:t=!1,valueId:o="hosts-count"})=>{let{t:r}=f(),s=Kt.createElement(Kt.Fragment,null,"readyHostCount"in e&&Kt.createElement(Wc,null,Kt.createElement(Ii,null,r("ai:Ready for the installation")),Kt.createElement(Ii,null,Ra(e))),"enabledHostCount"in e&&Kt.createElement(Wc,null,Kt.createElement(Ii,null,r("ai:Enabled for the installation")),Kt.createElement(Ii,null,fn(e))),Kt.createElement(Wc,null,Kt.createElement(Ii,null,r("ai:All discovered")),Kt.createElement(Ii,null,gn(e)))),i="enabledHostCount"in e?fn(e):gn(e);return Kt.createElement(VF,{headerContent:r("ai:Hosts in the cluster"),bodyContent:s},Kt.createElement("a",{id:o},t&&"(",i,t&&")"))},Nn=NF;import H from"react";import{Popover as $F,Button as qF,Text as On,TextContent as bi,FlexItem as bl,Flex as sC,Stack as YF,StackItem as jF}from"@patternfly/react-core";import RF from"human-date";import HF from"react";import{Progress as OF,ProgressVariant as eC,ProgressMeasureLocation as tC,ProgressSize as LF}from"@patternfly/react-core";var MF=e=>{switch(e){case"cancelled":case"error":return eC.danger;case"installed":return eC.success;default:return}},_F=e=>e==="installed"?tC.none:tC.top,WF=({host:e})=>{let{status:t}=e,o=mn(e),{currentStage:r,progressInfo:s}=uc(e),i=ja(e),n=`${r}${s?`: ${s}`:" "}`;return HF.createElement(OF,{title:n,value:i,min:1,max:o.length,label:`Step ${i} of ${o.length}`,valueText:`Step ${i} of ${o.length}: ${n}`,variant:MF(t),measureLocation:_F(t),size:LF.sm})},Hn=WF;import zc from"react";import{ExternalLinkAltIcon as zF}from"@patternfly/react-icons";import{Button as BF,ButtonVariant as UF}from"@patternfly/react-core";import oC from"react";var jr=oC.createContext({}),Il=({cluster:e,resetCluster:t,ocpConsoleUrl:o,children:r})=>oC.createElement(jr.Provider,{value:{cluster:e,resetCluster:t,ocpConsoleUrl:o}},r);var GF=({id:e,title:t="OpenShift console"})=>{let{ocpConsoleUrl:o}=zc.useContext(jr)||{};return o?zc.createElement(BF,{variant:UF.link,onClick:()=>window.open(Vu(o),"_blank","noopener noreferrer"),id:e},t," ",zc.createElement(zF,null)):null},rC=GF;import{UnknownIcon as KF}from"@patternfly/react-icons";var XF=(e,t)=>{let o=mn(e),r=ja(e);return t.withProgress?`${t.title} ${r}/${o.length}`:t.title},JF=({details:e,autoCSR:t,additionalPopoverContent:o,...r})=>{let{host:s}=r,{status:i,statusInfo:n}=s,{t:a}=f();return["installing-in-progress"].includes(i)?H.createElement(bi,null,H.createElement(Hn,{host:s})):["error","cancelled","installing-pending-user-action"].includes(i)?H.createElement(bi,null,H.createElement(On,null,e,H.createElement("br",null),xo(n)),H.createElement(Hn,{host:s})):["installed"].includes(i)?H.createElement(bi,null,H.createElement(On,null,e),H.createElement(Hn,{host:s})):["added-to-existing-cluster"].includes(i)?H.createElement(bi,null,H.createElement(On,null,e),!t&&H.createElement(H.Fragment,null,H.createElement("br",null),a("ai:To finish adding nodes to the cluster, approve the join request inside OpenShift Console's Nodes section."),H.createElement("br",null),a("ai:It may take a few minutes for the join request to appear."),H.createElement("br",null),a("ai:If you prefer using the CLI, follow the instructions in"),"\xA0",H.createElement(ot,{href:_u},a("ai:How to approve nodes using the CLI"))),H.createElement(Hn,{host:s})):["preparing-for-installation","preparing-successful","installing","unbinding-pending-user-action","binding","unbinding","reclaiming","reclaiming-rebooting"].includes(i)?H.createElement(bi,null,H.createElement(On,null,e)):H.createElement(YF,{hasGutter:!0},o,H.createElement(jF,null,e&&H.createElement(bi,null,H.createElement(On,null,e)),H.createElement(Zh,{...r})))},ZF=({host:e})=>{let{progress:t,statusUpdatedAt:o}=e,{t:r}=f();if(e.status==="added-to-existing-cluster")return H.createElement(rC,{id:`host-status-detail-link-to-ocp-nodes-${e.requestedHostname||e.id}`});let s;return e.status==="installing-in-progress"?t?.stageUpdatedAt&&t.stageUpdatedAt!==t.stageStartedAt?s=r("ai:Step started at {{startedAt}}, updated {{updatedAt}}",{startedAt:jt(t.stageStartedAt),updatedAt:RF.relativeTime(t.stageUpdatedAt)}):s=r("ai:Step started at {{startedAt}}",{startedAt:jt(t?.stageStartedAt||o)}):o&&(s=r("ai:Status updated at {{humanizedDataTime}}",{humanizedDataTime:jt(o)})),H.createElement(H.Fragment,null,!!s&&H.createElement("small",null,s))},iC=e=>H.createElement($F,{headerContent:H.createElement("div",null,e.title),bodyContent:H.createElement(JF,{...e}),footerContent:H.createElement(ZF,{host:e.host}),minWidth:"30rem",maxWidth:"50rem",hideOnOutsideClick:e.hideOnOutsideClick,zIndex:e.zIndex||300},H.createElement(qF,{variant:"link",isInline:!0,isSmall:e.isSmall},e.children)),QF=({host:e,validationsInfo:t,status:o,onEditHostname:r,AdditionalNTPSourcesDialogToggleComponent:s,UpdateDay2ApiVipDialogToggleComponent:i,children:n,zIndex:a,autoCSR:l,additionalPopoverContent:p})=>{let[u,c]=H.useState(!1),d=H.useCallback(()=>{c(!u),r?.()},[u,r]),{title:m,icon:g,sublabel:h,details:C,noPopover:I}=o,S=XF(e,o),y={hideOnOutsideClick:!u,host:e,onEditHostname:d,AdditionalNTPSourcesDialogToggleComponent:s,title:m,validationsInfo:t,details:C,UpdateDay2ApiVipDialogToggleComponent:i,zIndex:a,autoCSR:l,additionalPopoverContent:p};return H.createElement(sC,{alignItems:{default:"alignItemsCenter"},spaceItems:{default:"spaceItemsXs"}},H.createElement(bl,null,g||H.createElement(KF,null)),H.createElement(sC,{direction:{default:"column"},spaceItems:{default:"spaceItemsXs"}},!n&&!h&&!I?H.createElement(iC,{...y},S):H.createElement(bl,null,S),n&&H.createElement(bl,null,n),h&&H.createElement(bl,{className:"pf-u-font-size-xs",style:{marginTop:"calc(-1 * var(--pf-l-flex--spacer--xs))"}},H.createElement(iC,{...y},h))))},Vs=QF;import uC from"react";import{Modal as uV,ModalVariant as cV}from"@patternfly/react-core";import Ft from"react";import{object as pV}from"yup";import{Button as nC,ButtonVariant as eV,ButtonType as tV,Form as oV,ModalBoxBody as rV,ModalBoxFooter as sV,AlertVariant as aC,Alert as lC,AlertActionCloseButton as iV}from"@patternfly/react-core";import{Formik as nV}from"formik";var aV=(e,t,o=[])=>pV().shape({hostname:ol(e,o,t.hostname)}),lV=({host:e,inventory:t,usedHostnames:o,onCancel:r,onSave:s,onFormSaveError:i})=>{let n=Ft.useRef();Ft.useEffect(()=>{n.current?.focus(),n.current?.select()},[]);let{requestedHostname:a}=e,{hostname:l}=t,p={hostId:e.id,hostname:a||""},{t:u}=f();return Ft.createElement(nV,{validateOnMount:!0,initialValues:p,initialStatus:{error:null},validate:ni(aV(u,p,o)),onSubmit:async(c,d)=>{if(c.hostname===p.hostname){r();return}try{await s(c),r()}catch(m){let g=i&&i(m)||u("ai:Host update failed.");d.setStatus({error:{title:u("ai:Failed to update host"),message:g}})}}},({handleSubmit:c,status:d,setStatus:m,isSubmitting:g,isValid:h,dirty:C})=>Ft.createElement(oV,{onSubmit:c},Ft.createElement(rV,null,Ft.createElement(wn,null,d.error&&Ft.createElement(lC,{variant:aC.danger,title:d.error.title,actionClose:Ft.createElement(iV,{onClose:()=>m({error:null})}),isInline:!0},d.error.message),Ft.createElement(lC,{variant:aC.info,title:u("ai:This name will replace the original discovered hostname."),isInline:!0}),Ft.createElement(al,{name:"discoveredHostname",label:"Discovered hostname"},l||""),Ft.createElement(ws,{label:u("ai:New hostname"),name:"hostname",ref:n,isRequired:!0,isDisabled:!Mg(e.status),richValidationMessages:Br(u)}))),Ft.createElement(sV,null,Ft.createElement(nC,{key:"submit",type:tV.submit,isDisabled:g||!h||!C},u("ai:Change")),Ft.createElement(nC,{key:"cancel",variant:eV.link,onClick:r},u("ai:Cancel")))))},pC=lV;var dV=({isOpen:e,host:t,inventory:o,usedHostnames:r,onClose:s,onSave:i,onFormSaveError:n})=>t&&o?uC.createElement(uV,{"aria-label":"Change hostname dialog",title:"Change hostname",isOpen:e,onClose:s,variant:cV.small,hasNoBodyWrapper:!0},uC.createElement(pC,{host:t,inventory:o,usedHostnames:r,onCancel:s,onSave:i,onFormSaveError:n})):null,Bc=dV;import{List as eee,ListItem as tee,TextContent as oee}from"@patternfly/react-core";import{Fragment as pee,createElement as lee}from"react";import dt from"react";import{Button as mV,ButtonVariant as fV,Popover as gV,Text as xi,TextContent as hV,TextVariants as Ln}from"@patternfly/react-core";import{InfoCircleIcon as CV}from"@patternfly/react-icons";import{Trans as yV}from"react-i18next";var vV=()=>{let{t:e}=f();return dt.createElement(hV,null,dt.createElement(xi,{component:Ln.p},e("ai:Your libvirt virtual machines should be configured to restart automatically after a reboot. You can check this by running:")),dt.createElement(ct,{code:"virsh dumpxml <name> | grep on_reboot"}),dt.createElement(xi,{component:Ln.p},e("ai:And verify that this is the output:")),dt.createElement(ct,{code:"<on_reboot>restart</on_reboot>"}),dt.createElement(xi,{component:Ln.p},e("ai:If not, please start your VMs with the following configuration:")),dt.createElement(ct,{code:"--events on_reboot=restart"}),dt.createElement(xi,{component:Ln.p},dt.createElement(yV,{t:e,components:{code:dt.createElement("code",null)},i18nKey:"ai:When using <code>{{executionCommand}}</code>, please run:",values:{executionCommand:"virt-install"}})),dt.createElement(ct,{code:"virt-install --wait -1 <rest of the command>"}),dt.createElement(xi,{component:Ln.p},e("ai:Otherwise, the VMs will not be able to reboot during the installation process.")))},SV=()=>{let{t:e}=f();return dt.createElement(xi,{component:"p"},dt.createElement(gV,{bodyContent:dt.createElement(vV,null),minWidth:"35rem"},dt.createElement(mV,{variant:fV.link,isInline:!0},dt.createElement(CV,{size:"sm"}),"\xA0",e("ai:Check your VM reboot configuration"))))},Uc=SV;import{createElement as Ct,useCallback as CC,useEffect as EV,useState as hC}from"react";import{Dropdown as cC,DropdownItem as dC,DropdownToggle as mC,DropdownToggleCheckbox as IV,Pagination as bV,Split as xV,SplitItem as fC,Toolbar as kV,ToolbarContent as TV,ToolbarItem as gC,Tooltip as PV}from"@patternfly/react-core";import{CaretDownIcon as wV}from"@patternfly/react-icons";var DV=({itemIDs:e,selectedIDs:t,setSelectedIDs:o,actions:r,showPagination:s,clearAllFilters:i,children:n,...a})=>{let[l,p]=hC(!1),[u,c]=hC(!1),d=CC(()=>c(!u),[u]),m=CC(()=>p(!l),[l]);EV(()=>{t.every(v=>e.includes(v))||o(t.filter(v=>e.includes(v)))},[t,e,o]);let g=!1;t.length&&(g=t.length===e.length&&e.every(v=>t.includes(v))?!0:null);let h=g===!1,C=Ct(cC,{onSelect:m,toggle:Ct(mC,{onToggle:m,toggleIndicator:wV,isDisabled:h},"Actions"),isOpen:l,dropdownItems:r}),I=()=>o(e),S=()=>o([]),{t:y}=f();return Ct(xV,{hasGutter:!0},Ct(fC,{isFilled:!0},Ct(kV,{className:"table-toolbar",clearAllFilters:i},Ct(TV,{className:"table-toolbar__content"},Ct(gC,null,Ct(cC,{onSelect:d,toggle:Ct(mC,{splitButtonItems:[Ct(IV,{id:"select-checkbox",key:"select-checkbox","aria-label":y("ai:Select all"),onChange:v=>v?I():S(),isChecked:g},t.length," ",y("ai:selected"))],onToggle:d}),isOpen:u,dropdownItems:[Ct(dC,{key:"select-all",onClick:I},y("ai:Select all")),Ct(dC,{key:"select-none",onClick:S},y("ai:Select none"))]})),n,Ct(gC,null,h?Ct(PV,{content:"Select one or more hosts"},C):C)))),s&&Ct(fC,null,Ct(bV,{itemCount:e.length,...a,isCompact:!0})))},Gc=DV;import{createElement as vC}from"react";import{DropdownItem as yC}from"@patternfly/react-core";var $c=({onChangeHostname:e})=>vC(yC,{onClick:e},"Change hostname"),qc=({onDeleteHost:e})=>vC(yC,{onClick:e},"Delete");import{createElement as X,useCallback as JV,useEffect as XV,useRef as TC,useState as ZV}from"react";import{Button as Yc,ButtonType as AV,ButtonVariant as FV,Form as VV,HelperText as NV,HelperTextItem as HV,Modal as OV,ModalBoxBody as LV,ModalBoxFooter as MV,Popover as _V,Split as WV,SplitItem as jc,Stack as zV,StackItem as xl}from"@patternfly/react-core";import{Formik as BV,useFormikContext as UV}from"formik";import{object as KV}from"yup";import{global_palette_blue_300 as GV}from"@patternfly/react-tokens/dist/js/global_palette_blue_300";import{InfoCircleIcon as $V}from"@patternfly/react-icons";var SC=e=>{let t=He(e);return Bo(e,t)||""},IC=(e,t)=>t.hostname.replace(/{{n+}}/g,`${e+1}`),bC=(e,t,o)=>{let r=0;return t.map(s=>{let[i,n]=o(s),a={newHostname:i?IC(r,e):void 0,reason:i?void 0:n};return i&&r++,a})},xC={hostname:""},qV=(e,t,o)=>KV().shape({hostname:ol(o,t,e.hostname).required(o("ai:Required field"))}),kC=(e,t)=>(e={...e||{},hostname:(e?.hostname||[]).concat(t)},e),YV=(e,t,o,r,s)=>async i=>{let n=bC(i,e,r).filter(p=>!p.reason).map(({newHostname:p})=>p),a=t.reduce((p,u)=>(e.find(c=>c.id===u.id)||p.push(SC(u)),p),[]),l=await ni(o)({...i,hostname:n[0]||""});return(n.some(p=>a.includes(p||""))||new Set(n).size!==n.length)&&(l=kC(l,Br(s).NOT_UNIQUE)),n.some(p=>Za.includes(p||""))&&(l=kC(l,Br(s).LOCALHOST_ERR)),l},jV=({selectedHosts:e,isOpen:t,patchingHost:o,onClose:r,canChangeHostname:s})=>{let{values:i,handleSubmit:n,isSubmitting:a,status:l,isValid:p}=UV(),u=TC(),c=TC(e);XV(()=>{t&&u.current?.focus()},[t]),JV(()=>{a||(c.current=e)},[e,a]);let d=c.current,m=bC(i,d,s),{t:g}=f();return X(VV,{onSubmit:n},X(LV,null,X(zV,{hasGutter:!0},X(xl,null,X("div",null,g("ai:Rename hostnames using the custom template:")),X("div",null,X("strong",null,"{{n}}")," ",g("ai:to add a number."))),X(xl,null,X(ws,{name:"hostname",ref:u,isRequired:!0,richValidationMessages:Br(g)}),X(NV,null,X(HV,{variant:"indeterminate"},g("ai:For example: host-{{n}}",{interpolation:{suffix:"###",prefix:"###"}})))),X(xl,null,g("ai:Preview"),X("div",{className:"hostname-preview"},d.map((h,C)=>{let{newHostname:I,reason:S}=m[C];return X(WV,{key:h.id||C,hasGutter:!0},X(jc,{className:"hostname-column"},X("div",{className:"hostname-column__text"},X("strong",null,SC(h)))),X(jc,null,X("div",null,X("strong",null,">"))),X(jc,{isFilled:!0},S?X(_V,{"aria-label":g("ai:Cannot change hostname popover"),headerContent:X("div",null,g("ai:Hostname cannot be changed")),bodyContent:X("div",null,S)},X(Yc,{variant:"link",icon:X($V,{color:GV.value}),isInline:!0},g("ai:Not changeable"))):I||g("ai:New hostname will appear here...")))}))),X(xl,null,X(Dn,{error:l?.error,progress:a?100*(o+1)/d.length:null})))),X(MV,null,X(Yc,{key:"submit",type:AV.submit,isDisabled:a||!p},g("ai:Change")),X(Yc,{onClick:r,variant:FV.secondary,isDisabled:a},g("ai:Cancel"))))},RV=({isOpen:e,onClose:t,selectedHostIDs:o,hosts:r,onChangeHostname:s,canChangeHostname:i})=>{let[n,a]=ZV(0),l=r.filter(u=>o.includes(u.id)),{t:p}=f();return X(OV,{"aria-label":p("ai:Change hostnames dialog"),title:p("ai:Change hostnames"),isOpen:e,onClose:t,hasNoBodyWrapper:!0,id:"mass-change-hostname-modal",variant:"small"},X(BV,{initialValues:xC,validate:YV(l,r,qV(xC,[],p),i,p),onSubmit:async(u,c)=>{let d=0;try{for(let m of l){a(d);let g=IC(d,u);await s(m,g),d++}t()}catch(m){c.setStatus({error:{title:p("ai:Failed to update host"),message:D(m)}})}}},X(jV,{isOpen:e,selectedHosts:l,patchingHost:n,onClose:t,canChangeHostname:i})))},Rc=RV;import{createElement as Yo,useState as DC}from"react";import{Button as PC,ButtonVariant as wC,Modal as QV,ModalBoxBody as eN,ModalBoxFooter as tN,Stack as oN,StackItem as Kc}from"@patternfly/react-core";var rN=({isOpen:e,onClose:t,onDelete:o,hosts:r,children:s})=>{let[i,n]=DC(null),[a,l]=DC(),{t:p}=f(),u=async()=>{l(void 0);let c=0;try{for(let d of r)n(100*(c+1)/r.length),await o(d);n(null),t()}catch(d){l({title:p("ai:Failed to delete host"),message:Ge(d)}),n(null)}};return Yo(QV,{"aria-label":p("ai:Delete hosts dialog"),title:p("ai:Delete hosts"),isOpen:e,onClose:t,hasNoBodyWrapper:!0,id:"mass-delete-modal",variant:"medium",titleIconVariant:"warning"},Yo(eN,null,Yo(oN,{hasGutter:!0},Yo(Kc,null,p("ai:You are deleting multiple resources. All resources listed below will be deleted if you continue. This action cannot be undone.")),Yo(Kc,null,s),Yo(Kc,null,Yo(Dn,{error:a,progress:i})))),Yo(tN,null,Yo(PC,{onClick:u,isDisabled:i!==null,variant:wC.danger},p("ai:Delete hosts")),Yo(PC,{onClick:t,variant:wC.secondary,isDisabled:i!==null},p("ai:Cancel"))))},Xc=rN;import{createElement as ve}from"react";import{AddCircleOIcon as sN,BanIcon as Jc,CheckCircleIcon as EC,ConnectedIcon as AC,DisconnectedIcon as FC,ExclamationCircleIcon as iN,ExclamationTriangleIcon as kl,InProgressIcon as hr,LinkIcon as nN,PendingIcon as aN,PlusIcon as lN}from"@patternfly/react-icons";import{global_danger_color_100 as pN,global_warning_color_100 as Tl,global_success_color_100 as VC,chart_color_blue_300 as uN}from"@patternfly/react-tokens";var ki=Object.freeze({"unbinding-pending-user-action":{key:"unbinding-pending-user-action",title:"Removing from cluster",category:"Discovery related",icon:ve(hr,null),details:"This host is being removed from the cluster. To finish, reboot the host with the infrastructure environment ISO."},reclaiming:{key:"reclaiming",title:"Returning to the infrastructure environment",category:"Discovery related",icon:ve(hr,null),details:"This host is being removed from the cluster."},"reclaiming-rebooting":{key:"reclaiming-rebooting",title:"Rebooting while returning to the infrastructure environment",category:"Discovery related",icon:ve(hr,null),details:"This host is being rebooted to be available for reuse in another cluster."},"preparing-failed":{key:"preparing-failed",title:"Preparing step failed",category:"Installation related",details:"Preparing step failed"},unbinding:{key:"unbinding",title:"Removing from cluster",category:"Discovery related",icon:ve(hr,null),details:"This host is being removed from the cluster."},"disabled-unbound":{key:"disabled-unbound",title:"Disabled",category:"Discovery related",icon:ve(Jc,null),details:"This host was manually removed from a cluster and can not be included in another one. Enable this host to make it available again."},"disconnected-unbound":{key:"disconnected-unbound",title:"Disconnected",category:"Discovery related",icon:ve(FC,null),details:"Ensure the host is running, responsive, and is able to contact the installer."},"discovering-unbound":{key:"discovering-unbound",title:"Discovering",category:"Discovery related",icon:ve(AC,null),details:"This host is transmitting its hardware and networking information to the installer. Please wait while this information is received."},"insufficient-unbound":{key:"insufficient-unbound",title:"Insufficient",category:"Discovery related",icon:ve(kl,{color:Tl.value}),details:"This host does not meet the minimum hardware or networking requirements and can not be included in the cluster."},"known-unbound":{key:"known-unbound",title:"Available",category:"Discovery related",icon:ve(lN,{color:uN.value}),details:"This host meets the minimum hardware and networking requirements and can be included in the cluster."},binding:{key:"binding",title:"Binding",category:"Discovery related",icon:ve(nN,null),details:"This host is being added to the cluster."},discovering:{key:"discovering",title:"Discovering",category:"Discovery related",icon:ve(AC,null),details:"This host is transmitting its hardware and networking information to the installer. Please wait while this information is received."},"pending-for-input":{key:"pending-for-input",title:"Pending input",category:"Discovery related",icon:ve(aN,null)},known:{key:"known",title:"Ready",category:"Discovery related",icon:ve(EC,{color:VC.value}),details:"This host meets the minimum hardware and networking requirements and will be included in the cluster."},disconnected:{key:"disconnected",title:"Disconnected",category:"Discovery related",icon:ve(FC,null),details:"This host has lost its connection to the installer and will not be included in the cluster unless connectivity is restored."},insufficient:{key:"insufficient",title:"Insufficient",category:"Discovery related",icon:ve(kl,{color:Tl.value}),details:"This host does not meet the minimum hardware or networking requirements and will not be included in the cluster."},disabled:{key:"disabled",title:"Disabled",category:"Discovery related",icon:ve(Jc,null),details:"This host was manually disabled and will not be included in the cluster. Enable this host to include it again."},"preparing-for-installation":{key:"preparing-for-installation",title:"Preparing for installation",category:"Installation related",icon:ve(hr,null)},"preparing-successful":{key:"preparing-successful",title:"Preparing step successful",category:"Installation related",icon:ve(hr,null)},installing:{key:"installing",title:"Starting installation",category:"Installation related",icon:ve(hr,null)},"installing-in-progress":{key:"installing-in-progress",title:"Installing",category:"Installation related",icon:ve(hr,null),withProgress:!0},"installing-pending-user-action":{key:"installing-pending-user-action",title:"Pending user action",category:"Installation related",icon:ve(kl,{color:Tl.value}),details:"This host is pending user action"},installed:{key:"installed",title:"Installed",category:"Installation related",icon:ve(EC,{color:VC.value}),details:"This host completed its installation successfully."},cancelled:{key:"cancelled",title:"Installation cancelled",category:"Installation related",icon:ve(Jc,null),details:"This host installation has been cancelled.",withProgress:!0},error:{key:"error",title:"Error",category:"Installation related",icon:ve(iN,{color:pN.value}),details:"This host failed its installation.",withProgress:!0},resetting:{key:"resetting",title:"Resetting",category:"Installation related",icon:ve(hr,null),details:"This host is resetting the installation."},"resetting-pending-user-action":{key:"resetting-pending-user-action",title:"Reboot required",category:"Installation related",icon:ve(kl,{color:Tl.value}),details:"Host already booted from disk during previous installation. To finish resetting the installation please boot the host into Discovery ISO."},"added-to-existing-cluster":{key:"added-to-existing-cluster",title:"Installed",category:"Installation related",icon:ve(sN,null),details:"This host completed its installation successfully."}});import cN from"humanize-plus";var NC=e=>e.memory?.physicalBytes||0,HC=e=>e.disks?.filter(t=>t.driveType!==Eg).reduce((t,o)=>t+(o.sizeBytes||0),0)||0,dN=e=>cN.formatNumber(e.cpu?.frequency||0),OC=e=>({cores:e.cpu?.count||0,memory:NC(e),disks:HC(e)}),Zc={title:de,sortableValue:0},Ti=e=>{let t=Zc,o=Zc,r=Zc,s=de;if(e.cpu?.count){let a=e.cpu?.flags?.includes("ht")?" (hyper-threaded)":"";s=`${e.cpu?.count} cores${a} at ${dN(e)} MHz`,t={title:e.cpu?.count.toString(),sortableValue:e.cpu?.count}}let i=NC(e);i&&(o={title:Io(i,2,"iec"),sortableValue:i});let n=HC(e);return n&&(r={title:Io(n,2,"si"),sortableValue:n}),{serialNumber:e.systemVendor?.serialNumber||de,cores:t,cpuSpeed:s,memory:o,disk:r}};var hN=({hosts:e=[]})=>{let t=CN(()=>{let o=zr(e).reduce((r,s)=>{r.count++;let i=O(s.inventory);if(i){let n=OC(i);r.cores+=n.cores,r.memory+=n.memory,r.fs+=n.disks}return r},{count:0,cores:0,memory:0,fs:0});return[{cells:["Hosts",o.count]},{cells:["Cores",o.cores]},{cells:["Memory",Io(o.memory,2,"iec")]},{cells:["Storage",Io(o.fs,2,"si")]}]},[e]);return LC(mN,{rows:t,cells:["",""],variant:gN.compact,borders:!1,"aria-label":"Cluster summary table",className:"review-hosts-table"},LC(fN,null))},Qc=hN;import We from"react";import yN from"lodash/values";import{Button as vN,ButtonVariant as SN}from"@patternfly/react-core";import{CheckCircleIcon as IN,ExclamationCircleIcon as bN,ExclamationTriangleIcon as xN}from"@patternfly/react-icons";import{global_success_color_100 as kN,global_danger_color_100 as TN,global_warning_color_100 as PN}from"@patternfly/react-tokens";import{Trans as wN}from"react-i18next";var MC=()=>{let{t:e}=f();return We.createElement(We.Fragment,null,We.createElement(IN,{color:kN.value})," ",e("ai:All validations passed"))},DN=({id:e,count:t})=>{let{t:o}=f();return We.createElement("div",{id:e},o("ai:There is still {{count}} pending validation",{count:t}))},EN=({step:e,setCurrentStepId:t,wizardStepNames:o})=>We.createElement(vN,{variant:SN.link,onClick:()=>t(e),isInline:!0},o[e]),_C=({validation:e,clusterGroup:t,hostGroup:o,severity:r="danger",setCurrentStepId:s,wizardStepNames:i,wizardStepsValidationsMap:n})=>{let{t:a}=f(),l=a("ai:{{check_failed}} check failed",{check_failed:ks(a)[e.id]||Uu(a)[e.id]||e.id}),p,u=Wh({validationId:e.id,clusterGroup:t,hostGroup:o},n);u==="review"?p=a("ai:Please wait till all validations are finished."):u?p=We.createElement(We.Fragment,null,We.createElement(wN,{t:a},"ai:It can be fixed in the"," ",We.createElement(EN,{step:u,setCurrentStepId:s,wizardStepNames:i})," ","step.")):console.error("Unknown validation ID detected in the ",t||o," group:",JSON.stringify(e));let c;return r==="warning"?c=We.createElement(xN,{color:PN.value}):c=We.createElement(bN,{color:TN.value,size:"sm"}),We.createElement("div",{id:`failing-validation-${e.id}`},c," ",l,p?".":""," ",p)},ed=({validationsInfo:e="",setCurrentStepId:t,wizardStepNames:o,wizardStepsValidationsMap:r})=>{let s=O(e)||{},i=[],n=0;return Object.keys(s).forEach(a=>{let l=p=>{p.status==="pending"&&n++,p.status==="failure"&&i.push(We.createElement(_C,{key:p.id,validation:p,clusterGroup:a,setCurrentStepId:t,wizardStepNames:o,wizardStepsValidationsMap:r}))};s[a].forEach(l)}),n&&i.unshift(We.createElement(DN,{key:"pending-validations",id:"cluster-pending-validations",count:n})),i.length===0?We.createElement(MC,null):We.createElement(We.Fragment,null,i)},td=({hosts:e=[],setCurrentStepId:t,wizardStepNames:o,allClusterWizardSoftValidationIds:r,wizardStepsValidationsMap:s})=>{let i={};zr(e).forEach(a=>{let l=O(a.validationsInfo)||{};Object.keys(l).forEach(p=>{let u=c=>{if(c.status==="failure"){let d=r.includes(c.id)?"warning":"danger";i[c.id]=i[c.id]||We.createElement(_C,{key:c.id,validation:c,hostGroup:p,severity:d,setCurrentStepId:t,wizardStepNames:o,wizardStepsValidationsMap:s})}};l[p].forEach(u)})});let n=yN(i);return n.length===0?We.createElement(MC,null):We.createElement(We.Fragment,null,n)};import{array as UC,bool as NN,boolean as VN,lazy as FN,object as od,string as GC}from"yup";var WC=()=>[{url:"",thumbprint:""}],AN=e=>{if(!e)return WC();let t=WC();try{t=JSON.parse(e)}catch{console.warn("Tang Servers can not be parsed")}return t},zC=({cluster:e,pullSecret:t,managedDomains:o,ocpVersions:r,baseDomain:s})=>{let{name:i="",highAvailabilityMode:n="Full",baseDnsDomain:a=s||"",openshiftVersion:l=Xf(r)}=e||{};return{name:i,highAvailabilityMode:n,openshiftVersion:l,pullSecret:t||"",baseDnsDomain:a,SNODisclaimer:n==="None",useRedHatDnsService:!!a&&o.map(p=>p.domain).includes(a),enableDiskEncryptionOnMasters:["all","masters"].includes(e?.diskEncryption?.enableOn??"none"),enableDiskEncryptionOnWorkers:["all","workers"].includes(e?.diskEncryption?.enableOn??"none"),diskEncryptionMode:e?.diskEncryption?.mode??"tpmv2",diskEncryptionTangServers:AN(e?.diskEncryption?.tangServers),diskEncryption:e?.diskEncryption??{},cpuArchitecture:e?.cpuArchitecture||L.x86}},BC=({usedClusterNames:e,featureSupportLevels:t,pullSecretSet:o,ocpVersions:r,validateUniqueName:s,isOcm:i,t:n})=>FN(a=>{let l=()=>th(n,e,a.baseDnsDomain,s,i);return o?od({name:l(),baseDnsDomain:yc.required("Required")}):od({name:l(),baseDnsDomain:yc.required("Required"),pullSecret:oh.required("Required."),SNODisclaimer:VN().when(["highAvailabilityMode","openshiftVersion"],{is:(p,u)=>{let c=(r||[]).find(d=>d.value===u);return p==="None"&&c&&t.getFeatureSupportLevel(c.value,"SNO")==="dev-preview"},then:NN().oneOf([!0],n("ai:Confirm the Single Node OpenShift disclaimer to continue."))}),diskEncryptionTangServers:UC().when("diskEncryptionMode",{is:p=>p==="tang",then:UC().of(od().shape({url:GC().url(n('ai:Tang Server URL must be a valid URL starting with "http://" or "https://"')).required(n("ai:Required.")),thumbprint:GC().required(n("ai:Required."))}))})})});import noe from"react";import{DescriptionList as loe,DescriptionListDescription as poe,DescriptionListGroup as uoe,DescriptionListTerm as coe,Grid as doe,GridItem as moe}from"@patternfly/react-core";import jo from"react";import{Flex as HN,FlexItem as $C,Progress as ON,ProgressMeasureLocation as qC,ProgressVariant as YC}from"@patternfly/react-core";var LN=e=>{switch(e){case"cancelled":case"error":return YC.danger;case"installed":case"adding-hosts":return YC.success;default:return}},MN=e=>["installed","adding-hosts"].includes(e)?qC.none:qC.top,_N=(e,t,o)=>e==="installed"||e==="adding-hosts"?o("ai:Installed on {{humanizedDataTime}}",{humanizedDataTime:jt(t)}):e==="error"?o("ai:Failed on {{humanizedDataTime}}",{humanizedDataTime:jt(t)}):e==="cancelled"?o("ai:Cancelled on {{humanizedDataTime}}",{humanizedDataTime:jt(t)}):dr(o)[e]||e,WN=({cluster:e,minimizedView:t=!1,totalPercentage:o})=>{let{status:r}=e,{t:s}=f();return jo.createElement(jo.Fragment,null,jo.createElement(It,null,jo.createElement(HN,{direction:{default:t?"row":"column"}},jo.createElement($C,null,jo.createElement(A,{title:s("ai:Started on"),value:jt(e.installStartedAt),idPrefix:"cluster-progress-started-on"})),jo.createElement($C,null,jo.createElement(A,{title:s("ai:Status"),value:_N(e.status,e.installCompletedAt,s),idPrefix:"cluster-progress-status"})))),jo.createElement(ee,{condition:!t},jo.createElement(ON,{value:o||0,label:`${o||0}%`,title:" ",measureLocation:MN(r),variant:LN(r),className:"cluster-progress-bar"})))},Mn=WN;import Xe from"react";import{GridItem as jN,ClipboardCopy as RN,clipboardCopyFunc as KN,Button as XN,Alert as JN}from"@patternfly/react-core";import Oe from"react";import{Modal as zN,Button as rd,ButtonVariant as sd,Text as BN,ModalVariant as UN,ExpandableSection as GN}from"@patternfly/react-core";import{InfoCircleIcon as $N}from"@patternfly/react-icons";var qN=e=>e&&e.length>0?[...e.slice(1)].reduce((t,o)=>`${t}
|
|
9
|
-
${o}`,e[0]):"",jC=e=>{let{requiredList:t,...o}=e;return Oe.createElement(GN,{...o},Oe.createElement(ct,{code:qN(t),language:"markup",copiable:!0}))},YN=({cluster:e,consoleUrl:t})=>{let[o,r]=Oe.useState(!0),s=()=>r(!o),[i="",n=""]=[e.apiVip,e.ingressVip],a=`${e.name}.${e.baseDnsDomain}`,l=`apps.${a}`,p=[`${i} api.${a}`,`${n} oauth-openshift.${l}`,`${n} ${kg(t)}`,`${n} grafana-openshift-monitoring.${l}`,`${n} thanos-querier-openshift-monitoring.${l}`,`${n} prometheus-k8s-openshift-monitoring.${l}`,`${n} alertmanager-main-openshift-monitoring.${l}`],u=`*.${l}.`.length+2,c=[`api.${a}`.padEnd(u)+`A ${i}`,`*.${l}`.padEnd(u)+`A ${n}`],{t:d}=f();return Oe.createElement(Oe.Fragment,null,Oe.createElement(BN,{component:"p"},d("ai:In order to access the OpenShift Web Console, use external DNS server or local configuration to resolve its hostname. To do so, either:")),Oe.createElement(jC,{toggleText:d("ai:Option 1: Add the following records to your DNS server (recommended)"),className:"pf-u-pb-md",isExpanded:o,onToggle:s,requiredList:c}),Oe.createElement(jC,{toggleText:d("ai:Option 2: Update your local /etc/hosts or /etc/resolv.conf files"),className:"pf-u-pb-md",isExpanded:!o,onToggle:s,requiredList:p}))},RC=({cluster:e,consoleUrl:t,isDisabled:o,id:r})=>{let[s,i]=Oe.useState(!1),{t:n}=f();return Oe.createElement(Oe.Fragment,null,Oe.createElement(ht,{type:"button",variant:sd.primary,isDisabled:o,onClick:()=>i(!0),"data-testid":r},n("ai:Launch OpenShift Console")),Oe.createElement(XC,{closeModal:()=>i(!1),consoleUrl:t,cluster:e,isOpen:s}))},KC=({cluster:e,consoleUrl:t,idPrefix:o})=>{let[r,s]=Oe.useState(!1),{t:i}=f();return Oe.createElement(Oe.Fragment,null,Oe.createElement(rd,{variant:"link",icon:Oe.createElement($N,null),iconPosition:"left",isInline:!0,onClick:()=>s(!0),"data-testid":`${o}-troubleshooting-hint-open`},i("ai:Not able to access the Web Console?")),Oe.createElement(XC,{closeModal:()=>s(!1),consoleUrl:t,cluster:e,isOpen:r}))},XC=({closeModal:e,cluster:t,consoleUrl:o,isOpen:r})=>{let{t:s}=f(),i=[Oe.createElement(rd,{type:"submit",key:"launch",variant:sd.primary,onClick:()=>window.open(o,"_blank","noopener"),isDisabled:!o},s("ai:Launch OpenShift Console")),Oe.createElement(rd,{variant:sd.secondary,onClick:()=>e(),key:"close"},s("ai:Close"))];return Oe.createElement(zN,{title:s("ai:OpenShift Web Console troubleshooting"),isOpen:r,onClose:e,actions:i,variant:UN.large},Oe.createElement(YN,{cluster:t,consoleUrl:o}))};import{ExternalLinkAltIcon as ZN}from"@patternfly/react-icons";var QN=({cluster:e,credentials:t,error:o=!1,retry:r,idPrefix:s="cluster-creds",credentialsError:i=""})=>{let n,{t:a}=f();if(o)i.includes("403")?n=Xe.createElement(JN,{variant:"info",isInline:!0,title:"You do not have permission to view the cluster credentials"},"For more information, contact your organization administrator"):n=Xe.createElement(_,{title:a("ai:Failed to fetch cluster credentials."),fetchData:r});else if(!t)n=Xe.createElement(z,null);else{if(!t.username&&!t.consoleUrl)return Xe.createElement(Xe.Fragment,null,"N/A");n=Xe.createElement(It,null,t.consoleUrl&&Xe.createElement(A,{title:a("ai:Web Console URL"),value:Xe.createElement(Xe.Fragment,null,Xe.createElement(XN,{variant:"link",icon:Xe.createElement(ZN,null),iconPosition:"right",isInline:!0,onClick:()=>window.open(t.consoleUrl,"_blank","noopener"),"data-testid":`${s}-link-console-url`},t.consoleUrl),Xe.createElement("br",null),e.apiVip&&e.ingressVip&&Xe.createElement(KC,{consoleUrl:t.consoleUrl,cluster:e,idPrefix:s}))}),t.username&&Xe.createElement(Xe.Fragment,null,Xe.createElement(A,{title:"Username",value:t.username}),Xe.createElement(A,{title:a("ai:Password"),value:Xe.createElement(RN,{isReadOnly:!0,onCopy:l=>KN(l,t.password)},"\u2022\u2022\u2022\u2022\u2022")})))}return Xe.createElement(jN,{span:12},n)},id=QN;import JC from"react";import{saveAs as ZC}from"file-saver";import{Button as eH,ButtonVariant as tH}from"@patternfly/react-core";var Pl=new AbortController,ge={abortLastGetRequest(){Pl.abort(),Pl=new AbortController},makeBaseURI(e){return`/v2/clusters/${e||""}`},makeDownloadsBaseURI(e){return`${ge.makeBaseURI(e)}/downloads`},makeLogsBaseURI(e){return`${ge.makeBaseURI(e)}/logs`},makeDownloadsCredentialsBaseURI(e){return`${ge.makeDownloadsBaseURI(e)}/credentials`},makeDownloadsCredentialsPresignedBaseURI(e){return`${ge.makeDownloadsBaseURI(e)}/credentials-presigned`},makeDownloadsFilesPresignedBaseURI(e){return`${ge.makeDownloadsBaseURI(e)}/files-presigned`},makeSupportedPlatformsBaseURI(e){return`${ge.makeBaseURI(e)}/supported-platforms`},makeActionsBaseURI(e){return`${ge.makeBaseURI(e)}/actions`},downloadClusterCredentials(e,t){return V.get(`${ge.makeDownloadsCredentialsBaseURI(e)}?file_name=${t}`,{responseType:"blob",headers:{Accept:"application/octet-stream"}})},getPresignedForClusterCredentials({clusterId:e,fileName:t,hostId:o,logsType:r}){let s=`${r?`&logs_type=${r}`:""}${o?`&host_id=${o}`:""}`;return V.get(`${ge.makeDownloadsCredentialsPresignedBaseURI(e)}?file_name=${t}${s}`)},getPresignedForClusterFiles({clusterId:e,fileName:t,hostId:o,logsType:r}){let s=`${r?`&logs_type=${r}`:""}${o?`&host_id=${o}`:""}`;return V.get(`${ge.makeDownloadsFilesPresignedBaseURI(e)}?file_name=${t}${s}`)},list(){return V.get(`${ge.makeBaseURI()}`,{signal:Pl.signal})},get(e){return V.get(`${ge.makeBaseURI(e)}`,{signal:Pl.signal})},getSupportedPlatforms(e){return V.get(`${ge.makeSupportedPlatformsBaseURI(e)}`)},getPreflightRequirements(e){return V.get(`${ge.makeBaseURI(e)}/preflight-requirements`)},getDefaultConfig(){return V.get(`${ge.makeBaseURI()}/default-config`)},deregister(e){return V.delete(`${ge.makeBaseURI(e)}`)},register(e){return V.post(`${ge.makeBaseURI()}`,e)},update(e,t){return V.patch(`${ge.makeBaseURI(e)}`,t)},install(e){return V.post(`${ge.makeActionsBaseURI(e)}/install`)},cancel(e){return V.post(`${ge.makeActionsBaseURI(e)}/cancel`)},reset(e){return V.post(`${ge.makeActionsBaseURI(e)}/reset`)},registerAddHosts(e){return V.post(`${ge.makeBaseURI()}import`,e)},allowAddHosts(e){return V.post(`${ge.makeActionsBaseURI(e)}/allow-add-workers`)},downloadLogs(e,t){let o=`logs_type=${t?`host&host_id=${t}`:"all"}`;return V.get(`${ge.makeLogsBaseURI(e)}?${o}`,{responseType:"blob",headers:{Accept:"application/octet-stream"}})},getCredentials(e){return V.get(`${ge.makeBaseURI(e)}/credentials`)},listByOpenshiftId(e){return V.get(`${ge.makeBaseURI()}?openshift_cluster_id=${e||""}`)},listBySubscriptionIds(e){return V.get(`${ge.makeBaseURI()}?ams_subscription_ids=${e.toString()}`)}},M=ge;var oH=e=>{let t=e["content-disposition"]&&e["content-disposition"].match(/filename=".*"/);return t?t[0].slice(10,-1):"kubeconfig"},rH=({clusterId:e,status:t,id:o,handleDownload:r})=>{let{addAlert:s}=N(),i=JC.useCallback(async(a,l)=>{try{if(oe){let{data:p}=await M.getPresignedForClusterCredentials({clusterId:a,fileName:"kubeconfig"});ZC(p.url)}else{let p=await M.downloadClusterCredentials(a,"kubeconfig"),u=oH(p.headers);ZC(p.data,u)}}catch(p){x(p,u=>{s({title:l("ai:Could not download kubeconfig"),message:D(u)})})}},[s]),{t:n}=f();return JC.createElement(eH,{variant:tH.secondary,onClick:r||(()=>i(e,n)),isDisabled:!dn(t),id:o,"data-testid":o},"Download kubeconfig")},_n=rH;import Dl from"react";import{useFormikContext as lH}from"formik";import Vt from"react";import{Alert as sH,AlertVariant as QC,List as iH,ListItem as wl,Stack as nH,StackItem as ey}from"@patternfly/react-core";var aH=({snoSupportLevel:e,isDisabled:t=!1,snoExpansionSupported:o=!1})=>{let{t:r}=f();if(!["dev-preview","supported"].includes(e))return null;let s=e==="dev-preview",i=Vt.createElement(Vt.Fragment,null,Vt.createElement(wl,null,r("ai:Installing SNO will result in a non-highly available OpenShift deployment.")),!o&&Vt.createElement(wl,null,r("ai:Currently, adding additional machines to your cluster is not supported."))),n=Vt.createElement(Vt.Fragment,null,Vt.createElement(wl,null,r("ai:SNO is in a proof-of-concept stage and is not supported in any way.")),Vt.createElement(wl,null,r("ai:OpenShift in-place upgrades aren't expected to work with SNO. If an upgrade is needed, your system will need a redeployment.")));return Vt.createElement(sH,{variant:s?QC.warning:QC.info,title:r("ai:Limitations for using Single Node OpenShift"),isInline:!0},Vt.createElement(nH,{hasGutter:!0},Vt.createElement(ey,null,Vt.createElement(iH,null,i,s&&n)),s&&Vt.createElement(ey,null,Vt.createElement(Lr,{name:"SNODisclaimer",label:r("ai:I understand, accept, and agree to the limitations associated with using Single Node OpenShift."),isDisabled:t}))))},nd=aH;var pH=({versions:e,highAvailabilityMode:t})=>{let{values:o}=lH(),r=be(),s=r.getFeatureSupportLevel(o.openshiftVersion,"SNO"),i=r.isFeatureSupported(o.openshiftVersion,"SINGLE_NODE_EXPANSION"),n=r.isFeatureDisabled(o.openshiftVersion,"SNO");return Dl.createElement(Dl.Fragment,null,Dl.createElement(rc,{name:"highAvailabilityMode",versions:e,isDisabled:n}),t==="None"&&s&&Dl.createElement(nd,{isDisabled:n,snoSupportLevel:s,snoExpansionSupported:i}))},ad=pH;import Ire from"react";import{ExclamationCircleIcon as xre,ExclamationTriangleIcon as kre,ExternalLinkAltIcon as Tre}from"@patternfly/react-icons";import{global_warning_color_100 as wre,global_danger_color_100 as Dre}from"@patternfly/react-tokens";var uH="name-of-month DD, YYYY",cH={"4.8":"January 27, 2023","4.7":"August 24, 2022","4.6":"October 27, 2022"},El={"dates format":uH,versions:cH};function Al(e){let t=new Date(e),o=new Date;return Math.floor(Math.abs(o.valueOf()-t.valueOf())/qu)}function ty(e,t){return t&&t!==ui?e-Al(t):e}import{Fragment as IH,createElement as Fl}from"react";import{useField as vH}from"formik";import{Fragment as yH,createElement as Cr,useEffect as CH,useState as hH}from"react";import{useFormikContext as dH}from"formik";import{Checkbox as mH,FormGroup as fH}from"@patternfly/react-core";var pd=({fieldId:e="sshPublicKey"})=>{let{t}=f();return Cr(j,{fieldId:e},t("ai:Paste the content of a public ssh key you want to use to connect to the hosts into this field.")," ",Cr(ot,{href:Hu},t("ai:Learn more")))},gH=({clusterSshKey:e,imageSshKey:t,isDisabled:o=!1})=>{let r=!!t&&(e===t||!e),[s,i]=hH(r),{values:n,setFieldValue:a,errors:l,touched:p}=dH(),u=l.sshPublicKey,c=()=>{n.sshPublicKey&&a("sshPublicKey",Ss(n.sshPublicKey))};CH(()=>{!o&&s&&a("sshPublicKey",t)},[s,t,a,o]);let d=T("shareDiscoverySshKey","checkbox"),{t:m}=f();return Cr(yH,null,Cr(fH,{fieldId:d,label:m("ai:Host SSH Public Key for troubleshooting after installation"),helperTextInvalid:u,validated:p&&u?"error":"default"},Cr(ee,{condition:Boolean(t)},Cr(mH,{name:"shareDiscoverySshKey",id:d,label:m("ai:Use the same host discovery SSH key"),"aria-describedby":`${d}-helper`,isChecked:s,isDisabled:o,onChange:i})),Cr(ee,{condition:!s},Cr(ur,{name:"sshPublicKey",helperText:Cr(pd,null),onBlur:c,isDisabled:o}))))},ud=gH;var SH=({isRequired:e})=>{let[{name:t,value:o},,{setValue:r}]=vH("sshPublicKey"),{t:s}=f();return Fl(Pu,{label:Fl(IH,null,s("ai:SSH public key")," ",Fl(W,{bodyContent:s("ai:Provide an SSH key to be able to connect to the hosts for debugging purposes during the discovery process")})),name:t,helperText:Fl(pd,null),idPostfix:"discovery",onBlur:()=>o&&r(Ss(o)),dropzoneProps:{accept:".pub",maxSize:2048,onDropRejected:({setError:i})=>()=>i(s("ai:File not supported."))},transformValue:Ss,isRequired:e})},cd=SH;import Se from"react";import{useFormikContext as oy}from"formik";import{Grid as bH}from"@patternfly/react-core";import{Trans as dd}from"react-i18next";var ry=()=>{let{setFieldValue:e,values:t}=oy(),o=()=>{t.noProxy&&e("noProxy",Mo(t.noProxy))},{t:r}=f();return Se.createElement(bH,{hasGutter:!0},Se.createElement(St,{label:Se.createElement(Se.Fragment,null,r("ai:HTTP proxy URL")," ",Se.createElement(W,{bodyContent:r("ai:The HTTP proxy URL that agents should use to access the discovery service.")})),name:"httpProxy",placeholder:"http://<user>:<password>@<ipaddr>:<port>",helperText:Se.createElement("div",null,Se.createElement(dd,{t:r,components:{bold:Se.createElement("strong",null)},i18nKey:"ai:URL must start with <bold>http</bold>."}))}),Se.createElement(St,{label:Se.createElement(Se.Fragment,null,r("ai:HTTPS proxy URL")," ",Se.createElement(W,{bodyContent:r("ai:Specify the HTTPS proxy that agents should use to access the discovery service. If you don't provide a value, your HTTP proxy URL will be used by default for both HTTP and HTTPS connections.")})),name:"httpsProxy",placeholder:"http://<user>:<password>@<ipaddr>:<port>",helperText:Se.createElement("div",null,Se.createElement(dd,{t:r,components:{bold:Se.createElement("strong",null)},i18nKey:"ai:URL must start with <bold>http</bold> (https schemes are not currently supported)."}))}),Se.createElement(St,{label:Se.createElement(Se.Fragment,null,r("ai:No proxy domains")," ",Se.createElement(W,{bodyContent:r("ai:Exclude destination domain names, IP addresses, or other network CIDRs from proxying by adding them to this comma-separated list.")})),name:"noProxy",placeholder:"one.domain.com,second.domain.com",helperText:Se.createElement("div",null,Se.createElement(dd,{t:r,components:{bold:Se.createElement("strong",null)},i18nKey:"ai:Use a comma to separate each listed domain. Preface a domain with <bold>.</bold> to include its subdomains. Use <bold>*</bold> to bypass the proxy for all destinations."})),onBlur:o}))},xH=()=>{let{setFieldValue:e,values:t,initialValues:o}=oy(),r=i=>{i?(e("httpProxy",o.httpProxy),e("httpsProxy",o.httpsProxy),e("noProxy",o.noProxy)):(e("httpProxy",""),e("httpsProxy",""),e("noProxy",""))},{t:s}=f();return Se.createElement(Se.Fragment,null,Se.createElement(Lr,{label:s("ai:Configure cluster-wide proxy settings"),name:"enableProxy",className:"ai-proxy-fields",helperText:Se.createElement("p",null,s("ai:If hosts are behind a firewall that requires the use of a proxy, provide additional information about the proxy.")),onChange:i=>r(i),body:t.enableProxy&&Se.createElement(ry,null)}))},md=xH;import Lse from"react";import{Modal as _se,ModalVariant as Wse}from"@patternfly/react-core";import Me from"react";import{saveAs as BH}from"file-saver";import{Alert as uy,Button as vd,ButtonVariant as Sd,ClipboardCopy as cy,clipboardCopyFunc as dy,ModalBoxBody as UH,ModalBoxFooter as GH,Stack as $H,StackItem as Id}from"@patternfly/react-core";import Ro from"react";import{TextListItem as Wn,OrderType as kH,Text as TH,TextContent as PH,TextList as wH}from"@patternfly/react-core";import{Trans as DH}from"react-i18next";var EH=({showAllInstructions:e=!1,isSNO:t=!1})=>{let{t:o}=f();return Ro.createElement(PH,null,Ro.createElement(TH,{component:"h3"},o("ai:Adding hosts instructions")),Ro.createElement(wH,{component:"ol",type:kH.number,style:{marginLeft:0}},Ro.createElement(Wn,{hidden:!e},o("ai:Click the Add host button.",{count:+t})),Ro.createElement(Wn,{hidden:!e},o("ai:Configure the SSH key and proxy settings after the modal appears (optional).")),Ro.createElement(Wn,null,o("ai:Download the Discovery ISO (onto a USB drive, attach it to a virtual media, etc.) and use it to boot your hosts.")),Ro.createElement(Wn,null,Ro.createElement(DH,{t:o,count:+t,components:{bold:Ro.createElement("strong",null)},i18nKey:"ai:Keep the Discovery ISO media connected to the device throughout the installation process and set each host to boot <bold>only one time</bold> from this device. "})),Ro.createElement(Wn,null,o("ai:Booted hosts should appear in the host inventory table. This may take a few minutes."))))},fd=EH;import ze from"react";import{lazy as WH,object as zH}from"yup";import{Button as gd,Form as VH,ModalBoxBody as NH,ModalBoxFooter as HH,AlertVariant as ly,Alert as hd,Stack as OH,StackItem as Cd}from"@patternfly/react-core";import{ExternalLinkAltIcon as LH}from"@patternfly/react-icons";import{Formik as MH}from"formik";import Ko from"react";import{Stack as AH,StackItem as sy}from"@patternfly/react-core";var iy="imageType",ny=({text:e,popoverContent:t})=>Ko.createElement(Ko.Fragment,null,e," ",Ko.createElement(W,{component:"a",bodyContent:t,noVerticalAlign:!0})),FH=()=>{let{t:e}=f();return Ko.createElement(AH,{hasGutter:!0},Ko.createElement(sy,null,Ko.createElement(Re,{name:iy,id:"minimal-iso",value:"minimal-iso",label:Ko.createElement(ny,{text:e("ai:Minimal image file: Provision with virtual media"),popoverContent:e("ai:Recommended option. The generated discovery ISO will be smaller, but will need to download additional data during boot. This option is useful if ISO storage capacity is limited or if it's being served over a constrained network.")})})),Ko.createElement(sy,null,Ko.createElement(Re,{name:iy,id:"full-iso",value:"full-iso",label:Ko.createElement(ny,{text:e("ai:Full image file: Provision with physical media"),popoverContent:e("ai:The generated discovery ISO will contain everything needed to boot.")})})))},ay=FH;var yd=()=>{let{t:e}=f();return ze.createElement(hd,{title:e("ai:To use static network configuration, follow the steps listed in the documentation."),isInline:!0,variant:"info"},ze.createElement(gd,{variant:"link",icon:ze.createElement(LH,null),iconPosition:"right",isInline:!0,onClick:()=>window.open(Yu,"_blank","noopener")},e("ai:View documentation")))},_H=WH(e=>zH().shape({sshPublicKey:el,httpProxy:vc(e,"httpsProxy"),httpsProxy:vc(e,"httpProxy"),noProxy:ih})),py=({handleSubmit:e,onCancel:t,sshPublicKey:o,httpProxy:r,httpsProxy:s,noProxy:i,imageType:n,hideDiscoveryImageType:a,hasDHCP:l})=>{let p={sshPublicKey:o||"",httpProxy:r||"",httpsProxy:s||"",noProxy:i||"",enableProxy:!!(r||s||i),imageType:n||"minimal-iso"},{t:u}=f();return ze.createElement(MH,{initialValues:p,initialStatus:{error:null},validationSchema:_H,onSubmit:e},({submitForm:c,isSubmitting:d,status:m})=>ze.createElement(ze.Fragment,null,ze.createElement(NH,null,ze.createElement(OH,{hasGutter:!0},ze.createElement(Cd,null,ze.createElement(hd,{variant:ly.info,isInline:!0,title:u("ai:Generate a Discovery ISO in order to add hosts to the cluster.")})),l===!1&&ze.createElement(Cd,null,ze.createElement(yd,null)),ze.createElement(Cd,null,ze.createElement(VH,null,m?.error&&ze.createElement(hd,{variant:ly.danger,title:m.error.title,isInline:!0},m.error.message),!a&&ze.createElement(ay,null),ze.createElement(cd,null),ze.createElement(md,null))))),ze.createElement(HH,null,ze.createElement(gd,{onClick:c,isDisabled:d,isLoading:d},u(d?"ai:Generating":"ai:Generate Discovery ISO")),ze.createElement(gd,{key:"cancel",variant:"link",onClick:t},u("ai:Cancel")))))};var qH=({fileName:e="discovery.iso",downloadUrl:t,onClose:o,onReset:r,hasDHCP:s,isSNO:i=!1})=>{let n=`wget -O ${e} '${t||""}'`,{t:a}=f();return Me.createElement(Me.Fragment,null,Me.createElement(UH,null,Me.createElement($H,{hasGutter:!0},Me.createElement(Id,null,Me.createElement(uy,{isInline:!0,variant:"success",title:a("ai:Discovery ISO is ready to be downloaded")},Me.createElement(Me.Fragment,null,"\xA0",Me.createElement(fd,{isSNO:i})))),s===!1&&Me.createElement(Id,null,Me.createElement(yd,null)),Me.createElement(Id,null,Me.createElement(It,null,Me.createElement(A,{title:a("ai:Discovery ISO URL"),value:Me.createElement(cy,{isReadOnly:!0,onCopy:l=>dy(l,t)},t)}),Me.createElement(A,{title:a("ai:Command to download the ISO:"),value:Me.createElement(cy,{isReadOnly:!0,onCopy:l=>dy(l,n)},n)})),Me.createElement(uy,{variant:"info",isInline:!0,title:`${a("ai:Never share your downloaded ISO with anyone else.")} ${a("ai:Forwarding it could put your credentials and personal data at risk.")}`})))),Me.createElement(GH,null,Me.createElement(vd,{variant:Sd.primary,onClick:()=>t&&BH(t),"data-testid":"download-iso-btn",isDisabled:!t},a("ai:Download Discovery ISO")),Me.createElement(vd,{variant:Sd.secondary,onClick:o,"data-testid":"close-iso-btn"},a("ai:Close")),r&&Me.createElement(vd,{variant:Sd.link,onClick:r,"data-testid":"edit-iso-btn"},a("ai:Edit ISO configuration"))))},Vl=qH;import YH from"react";import{Alert as jH,AlertVariant as RH}from"@patternfly/react-core";var KH=({someDisksAreSkipFormatting:e})=>{let{t}=f();return YH.createElement(jH,{variant:RH.warning,isInline:!0,title:t(e?"ai:There may be issues with the boot order":"ai:All bootable disks will be formatted during installation. Make sure to backup any sensitive data.")},e?t("ai:You have opted out of formatting bootable disks on some hosts. To ensure the hosts reboot into the expected installation disk, manual user intervention may be required during OpenShift installation."):"")},bd=KH;import pe from"react";import{Button as XH,Modal as Xse,ButtonVariant as JH,ModalVariant as Jse,TextContent as ZH,Text as rt,TextVariants as st}from"@patternfly/react-core";import{InfoCircleIcon as QH}from"@patternfly/react-icons";import{Trans as eO}from"react-i18next";var my=()=>{let{t:e}=f();return pe.createElement(ZH,null,pe.createElement(rt,{component:st.p},e("ai:To troubleshoot host discovery issues, complete the following steps:")),pe.createElement(rt,{component:st.h2},e("ai:Verify that your host machine is powered on")),pe.createElement(rt,{component:st.p},e("ai:Note: Boot time depends on several factors such as your hardware and network configuration, and if you are booting from an ISO.")),pe.createElement(rt,{component:st.h2},e("ai:If you used DHCP networking, verify that your DHCP server is enabled")),pe.createElement(rt,{component:st.h2},e("ai:If you used static IP, bridges, and bonds networking, verify that your configurations are correct")),pe.createElement(rt,{component:st.h2},e("ai:SSH into your machine")),pe.createElement(rt,{component:st.p},e("ai:Verify that you can access your host machine using SSH, or a console such as BMC or virtual machine console. In the CLI, enter the following command:")),pe.createElement(ct,{code:"ssh -i <identity_file> core@<machine-ip>"}),pe.createElement(rt,{component:st.p},e("ai:NOTE: Authentication is provided by the discovery ISO, therefore when you access your host using SSH, a password is not required. Optional -i parameter can be used to specify the private key that matches the public key provided when generating Discovery ISO.")),pe.createElement(rt,{component:st.h2},e("ai:Verify that the discovery agent is running with the correct parameters")),pe.createElement(ct,{code:"ps -ef | grep agent"}),pe.createElement(rt,{component:st.p},e("ai:The output displays the following:")),pe.createElement(ct,{code:`root 1786 1 0 08:03 ? 00:00:00 /usr/local/bin/agent --url https://api.openshift.com --cluster-id e4c85fbe-77c7-411e-b107-5120f615c4fb --agent-version registry.redhat.io/openshift4/assisted-installer-agent-rhel8:v4.6.0-17 --insecure=false
|
|
7
|
+
`),Mo=e=>e.split(",").map(t=>t.trim()).filter(Boolean).join(","),ro=(e,t)=>Object.keys(e).filter(o=>t[o]),Xf=e=>e.find(t=>t.default)?.value||e[0]?.value||"",Ej=e=>e.reduce((o,r)=>{let s=r.split("=");return o[s[0]]=s[1],o},{}),Zk=e=>e.reduce((t,{path:o,message:r})=>({...t,[o]:(t[o]||[]).concat(r)}),{}),ku=e=>{let t=Jk(Xk(e),o=>o.length>1);return Object.keys(t)},ni=e=>async t=>{try{await e.validate(t,{abortEarly:!1})}catch(o){let{inner:r}=o;if(!r||r.length===0)return{};let s=[],i=[];r.forEach(l=>{/\.|\[/.test(l.path)?i.push(l):s.push(l)});let n=Zk(s);if(i.length===0)return n;let a={};return i.forEach(l=>{Kk(a,l.path,[l.message])}),{...n,...a}}},tn=(e,t)=>`${e}[${t}]`,Aj=(e,t)=>`${e}.${t}`,Jf=e=>!!e?.every(t=>t.cidr&&Rk.isValid(t.cidr)),Fj=(e={})=>{let t=[];for(let o in e)t.push(`${o}=${e[o]}`);return t};import Qk from"react";import{css as eT}from"@patternfly/react-styles";var tT=({fieldId:e,children:t,isError:o=!1})=>Qk.createElement("div",{className:eT("pf-c-form__helper-text",{"pf-m-error":o}),id:`${e}-helper`,"aria-live":"polite"},t),j=tT;import{useEffect as nT,useState as iT}from"react";import{useField as oT}from"formik";var rT=e=>Array.isArray(e)?e.join(". "):e,sT=({name:e,inputError:t,validate:o})=>{let[r,{error:s}]=oT({name:e,validate:o}),[i,n]=iT(!1);nT(()=>{r.value&&n(r.value)},[r.value,n]);let a=r.value||!r.value&&i;return rT((a?s:"")||t)},pr=sT;var dT=mT(({label:e,labelIcon:t,helperText:o,isRequired:r,onChange:s,validate:i,idPostfix:n,children:a,noDefaultOnChange:l,inputError:p,description:u,labelInfo:c,showErrorMessage:d=!0,...m},g)=>{let[h]=aT({name:m.name,validate:i}),C=T(m.name,"input",n),I=pr({name:m.name,inputError:p,validate:i}),S=!I;return Or(lT,{fieldId:C,label:e,helperText:typeof o=="string"?o:Or(j,{fieldId:C},o),helperTextInvalid:d?I:void 0,validated:S?"default":"error",isRequired:r,labelIcon:t,labelInfo:c},u&&Or(j,{fieldId:C},Or(pT,{variant:"indeterminate"},u)),Or(uT,null,Or(Zf,{isFilled:!0},Or(cT,{...h,...m,ref:g,id:C,validated:S?"default":"error",isRequired:r,"aria-describedby":`${C}-helper`,onChange:(y,v)=>{m.isDisabled||(!l&&h.onChange(v),s&&s(v))}})),Or(Zf,null,a)))}),St=dT;import{createElement as Tu}from"react";import{useField as fT}from"formik";import{Checkbox as gT,FormGroup as hT}from"@patternfly/react-core";var CT=({label:e,helperText:t,onChange:o,validate:r,idPostfix:s,...i})=>{let[n,{touched:a,error:l}]=fT({name:i.name,validate:r}),p=T(i.name,"checkbox",s),u=!(a&&l);return Tu(hT,{fieldId:p,helperTextInvalid:u?"":l,validated:u?"default":"error"},Tu(gT,{...n,...i,id:p,label:e,"aria-describedby":`${p}-helper`,description:typeof t=="string"?t:Tu(j,{fieldId:p},t),isValid:u,isChecked:n.value,onChange:(d,m)=>{n.onChange(m),o&&o(d,m)}}))},Lr=CT;import{createElement as Na}from"react";import{useField as yT}from"formik";import{FormGroup as vT,TextArea as ST}from"@patternfly/react-core";var IT=({label:e,helperText:t,getErrorText:o,isRequired:r,children:s,idPostfix:i,labelIcon:n,groupClassName:a,...l})=>{let[p,{touched:u,error:c}]=yT(l.name),d=T(l.name,"input",i),m=!(u&&c),h=(()=>!m&&c?o?o(c):c:"")(),{isDisabled:C,...I}=l;return Na(vT,{fieldId:d,label:e,helperText:typeof t=="string"?t:Na(j,{fieldId:d},t),helperTextInvalid:typeof h=="string"?h:Na(j,{fieldId:d,isError:!0},h),validated:m?"default":"error",isRequired:r,labelIcon:n,className:a},s,Na(ST,{...p,...I,id:d,style:{resize:"vertical"},validated:m?"default":"error",isRequired:r,"aria-describedby":`${d}-helper`,onChange:(S,y)=>p.onChange(y),disabled:C}))},ur=IT;import{createElement as Ha}from"react";import{useField as bT}from"formik";import{FormGroup as xT,FormSelect as kT,FormSelectOption as TT}from"@patternfly/react-core";var PT=({label:e,options:t,helperText:o,isRequired:r,onChange:s,getHelperText:i,idPostfix:n,labelIcon:a,callFormikOnChange:l=!0,...p})=>{let[u,{touched:c,error:d}]=bT(p.name),m=T(p.name,"input",n),g=!(c&&d),h=g?"":d,C=i?i(u.value):o;return Ha(xT,{fieldId:m,label:e,helperText:typeof C=="string"?C:Ha(j,{fieldId:m},C),helperTextInvalid:h,validated:g?"default":"error",isRequired:r,labelIcon:a},Ha(kT,{...u,...p,id:m,validated:g?"default":"error",isRequired:r,"aria-describedby":`${m}-helper`,onChange:(I,S)=>{l&&u.onChange(S),s&&s(S)}},t.map((I,S)=>Ha(TT,{key:I.id||S,...I}))))},on=PT;import ai from"react";import{useField as DT}from"formik";import ET from"fuse.js";import{FormGroup as AT,Select as FT,SelectOption as VT,SelectVariant as NT}from"@patternfly/react-core";import{useTranslation as wT}from"react-i18next";function f(){return wT(process.env.TRANSLATION_NAMESPACE)}var HT=({label:e,options:t,helperText:o,placeholderText:r,isRequired:s,onChange:i,getHelperText:n,idPostfix:a,labelIcon:l,...p})=>{let[u,c]=ai.useState(!1),[d,{touched:m,error:g},{setValue:h}]=DT(p.name),C=T(p.name,"multiinput",a),I=!(m&&g),S=I?"":g,y=n?n(d.value):o,v=Y=>c(Y),w=()=>{h([]),i&&i([]),c(!1)},E=(Y,Re)=>{let tt=d.value,vt=Re.value||Re,b;tt.includes(vt)?b=tt.filter(P=>P!==vt):b=[...d.value,vt],h(b),i&&i(b)},F=d.value.map(Y=>{let Re=t.find(tt=>tt.value===Y);return Re?{value:Re.value,toString:()=>Re.displayName,compareTo:tt=>tt.value===Y}:Y}),q=t.filter(Y=>!(d.value||[]).includes(Y.value)).map(Y=>ai.createElement(VT,{key:Y.id,id:Y.id,value:Y.value},Y.displayName)),Z=new ET(t,{ignoreLocation:!0,keys:["displayName"]}),{t:ae}=f();return ai.createElement(AT,{fieldId:C,label:e,helperText:typeof y=="string"?y:ai.createElement(j,{fieldId:C},y),helperTextInvalid:S,validated:I?"default":"error",isRequired:s,labelIcon:l},ai.createElement(FT,{...d,...p,id:C,variant:NT.typeaheadMulti,typeAheadAriaLabel:ae("ai:Select a state"),validated:I?"default":"error","aria-describedby":`${C}-helper`,isCreatable:!1,placeholderText:r,isOpen:u,onToggle:v,onSelect:E,onClear:w,selections:F,onFilter:(Y,Re)=>{if(!Re||Re==="")return q;let tt=Z.search(Re).map(vt=>vt.item.id);return ai.Children.toArray(q).filter(({props:vt})=>tt.includes(vt.id))}},q))},OT=HT;import{createElement as Oa}from"react";import{FormGroup as LT,Button as Qf}from"@patternfly/react-core";var MT=({isSet:e,isEdit:t,helperTextHidden:o,onToggle:r,idPostfix:s,...i})=>{let{label:n,name:a}=i,l=T(a,"input",s);return t?Oa(ur,{...i},e&&Oa(Qf,{onClick:()=>r(!0),variant:"link"},"Keep existing value")):Oa(LT,{fieldId:l,label:n,helperText:o,isRequired:i.isRequired},Oa(Qf,{onClick:()=>r(!1),variant:"link"},"Change"))},_T=MT;import{createElement as La,useState as eg}from"react";import{useField as WT}from"formik";import{FormGroup as zT,FileUpload as BT}from"@patternfly/react-core";var UT=({label:e,labelIcon:t,helperText:o,getErrorText:r,isRequired:s,children:i,idPostfix:n,isDisabled:a,name:l,onBlur:p,allowEdittingUploadedText:u=!0,dropzoneProps:c,transformValue:d})=>{let{t:m}=f(),[g,h]=eg(),[C,I]=eg(!1),[S,{touched:y,error:v},w]=WT(l),E=T(l,"input",n),F=!((y||g)&&v),Z=(()=>!F&&v?r?r(v):v:"")();return La(zT,{fieldId:E,label:e,helperText:typeof o=="string"?o:La(j,{fieldId:E},o),helperTextInvalid:typeof Z=="string"?Z:La(j,{fieldId:E,isError:!0},Z),validated:F?"default":"error",isRequired:s,labelIcon:t},i,La(BT,{filenamePlaceholder:m("ai:Drag a file here or browse to upload"),browseButtonText:m("ai:Browse..."),clearButtonText:m("ai:Clear"),id:S.name,style:{resize:"vertical"},validated:F?"default":"error",isRequired:s,"aria-describedby":`${E}-helper`,type:"text",value:S.value,filename:g,onChange:(ae,Y)=>{h(Y),w.setTouched(!0),d&&typeof ae=="string"?w.setValue(d(ae)):w.setValue(ae)},onBlur:ae=>{S.onBlur(ae),p&&p(ae)},onReadStarted:()=>I(!0),onReadFinished:()=>I(!1),isLoading:C,disabled:a,dropzoneProps:{...c,onDropRejected:c?.onDropRejected&&c?.onDropRejected(w)},allowEditingUploadedText:u}))},Pu=UT;import{createElement as rn}from"react";import{useField as GT}from"formik";import{FormGroup as $T,Switch as tg,Tooltip as qT}from"@patternfly/react-core";var YT=({label:e,helperText:t,isRequired:o,onChange:r,onChangeCustomOverride:s,getHelperText:i,idPostfix:n,labelIcon:a,tooltipProps:l,switchOuiaId:p,...u})=>{let[c,{touched:d,error:m}]=GT(u.name),g=T(u.name,"input",n),h=!(d&&m),C=h?"":m,I=i?i(c.value):t,S={...c,id:g,label:e,isDisabled:u.isDisabled,isChecked:Boolean(c.value),hasCheckIcon:Boolean(c.value),ouiaId:p,onChange:(y,v)=>{s?s(y,v):(c.onChange(v),r&&r(y,v))}};return rn($T,{fieldId:g,helperText:typeof I=="string"?I:rn(j,{fieldId:g},I),helperTextInvalid:C,validated:h?"default":"error",isRequired:o,labelIcon:a},l?rn(qT,{...l},rn(tg,{...S})):rn(tg,{...S}))},li=YT;import cr from"react";import{shallowEqual as og}from"react-redux";import rg from"lodash/debounce";import{useFormikContext as sg}from"formik";var ho=(e=1e3)=>{let[t,o]=cr.useState([]),{values:r,isSubmitting:s,submitForm:i}=sg(),n=cr.useRef(r),a=cr.useRef(rg(async l=>{await i(),o(p=>p.filter(u=>u>l))},e));return cr.useEffect(()=>{if(!og(n.current,r)&&!s){let l=Date.now();o(p=>(p.push(l),p)),a.current(l)}s||(n.current=r)},[r,s,o]),cr.useEffect(()=>{let l=a.current;return()=>l.cancel()},[]),!!t.length},jT=({debounce:e=1e3})=>{let{values:t,dirty:o,isSubmitting:r,submitForm:s}=sg(),i=cr.useRef(t),n=cr.useRef(rg(s,e));return cr.useEffect(()=>{!og(i.current,t)&&o&&!r&&n.current(),r||(i.current=t)},[t,o,r]),cr.useEffect(()=>{let a=n.current;return()=>a.cancel()},[]),null},wu=jT;import Ne from"react";import{ExternalLinkAltIcon as pg}from"@patternfly/react-icons";var lg={};lr(lg,{AI_UI_TAG:()=>ci,APPROVE_NODES_IN_CL_LINK:()=>_u,CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV4:()=>ZT,CLUSTER_DEFAULT_NETWORK_SETTINGS_IPV6:()=>QT,CLUSTER_MANAGER_SITE_LINK:()=>_a,CNV_LINK:()=>Ou,DUAL_STACK:()=>wt,ENCRYPTING_DISK_DURING_INSTALLATION:()=>Wa,EVENTS_POLLING_INTERVAL:()=>Wu,EVENT_SEVERITIES:()=>$u,FEEDBACK_FORM_LINK:()=>KT,IPV4_STACK:()=>yo,MS_PER_DAY:()=>qu,NETWORK_TYPE_OVN:()=>Ts,NETWORK_TYPE_SDN:()=>Co,NMSTATE_EXAMPLES_LINK:()=>Mu,NO_SUBNET_SET:()=>qt,NUTANIX_CONFIG_LINK:()=>Ru,OCP_RELEASES_PAGE:()=>ju,OCP_STATIC_IP_DOC:()=>Yu,ODF_LINK:()=>Lu,ODF_REQUIREMENTS_LINK:()=>Au,OPENSHIFT_LIFE_CYCLE_DATES_LINK:()=>Ma,OPENSHIFT_NETWORKING_DOCS_LINK:()=>Du,OPERATOR_NAME_CNV:()=>Mr,OPERATOR_NAME_CONSOLE:()=>ag,OPERATOR_NAME_CVO:()=>ng,OPERATOR_NAME_LSO:()=>Ba,OPERATOR_NAME_LVM:()=>Wo,OPERATOR_NAME_ODF:()=>_o,POLLING_INTERVAL:()=>bs,PREFIX_MAX_RESTRICTION:()=>za,PULL_SECRET_INFO_LINK:()=>Eu,REDHAT_CONSOLE_OPENSHIFT:()=>Nu,SSH_GENERATION_DOC_LINK:()=>Hu,TECH_SUPPORT_LEVEL_LINK:()=>sn,TIME_ZERO:()=>ui,VSPHERE_CONFIG_LINK:()=>Is,clusterFieldLabels:()=>zu,clusterStatusLabels:()=>dr,clusterValidationGroupLabels:()=>JT,clusterValidationLabels:()=>Uu,diskRoleLabels:()=>nn,getAssistedUiLibVersion:()=>Gu,getOcpConsoleNodesPage:()=>Vu,getProductBrandingCode:()=>XT,getReportIssueLink:()=>Fu,hostRoles:()=>xs,hostValidationFailureHints:()=>pi,hostValidationGroupLabels:()=>Bu,hostValidationLabels:()=>ks,operatorLabels:()=>an});var ig="2.7.14-cim";var Ma="https://access.redhat.com/support/policy/updates/openshift#dates",Du="https://docs.openshift.com/container-platform/4.7/installing/installing_bare_metal/installing-bare-metal.html#installation-network-user-infra_installing-bare-metal",_a="https://console.redhat.com/openshift/install/pull-secret",Eu=_a,Au="https://access.redhat.com/documentation/en-us/red_hat_openshift_data_foundation/4.9/html/planning_your_deployment/infrastructure-requirements_rhodf#resource-requirements_rhodf",Is="https://access.redhat.com/solutions/6677901",Fu=()=>"https://issues.redhat.com/secure/CreateIssue!default.jspa?pid=12332330&issuetype=1&components=12370775",KT="https://docs.google.com/forms/d/e/1FAIpQLSfg9M8wRW4m_HkWeAl6KpB5dTcMu8iI3iJ29GlLfZpF2hnjng/viewform",sn="https://access.redhat.com/support/offerings/techpreview",Wa="https://docs.openshift.com/container-platform/4.7/installing/install_config/installing-customizing.html#installation-special-config-encrypt-disk_installing-customizing",Vu=e=>`${e}/k8s/cluster/nodes`,Nu="https://console.redhat.com/openshift",Hu="https://www.redhat.com/sysadmin/configure-ssh-keygen",Ou="https://cloud.redhat.com/learn/topics/virtualization/",Lu="https://www.redhat.com/en/resources/openshift-data-foundation-datasheet",Mu="https://nmstate.io/examples.html",_u="https://docs.openshift.com/container-platform/4.11/installing/installing_platform_agnostic/installing-platform-agnostic.html#installation-approve-csrs_installing-platform-agnostic",XT=()=>"redhat",bs=10*1e3,Wu=10*1e3,xs=e=>[{value:"auto-assign",label:e("ai:Auto-assign"),description:e("ai:A role will be chosen automatically based on detected hardware and network latency.")},{value:"master",label:e("ai:Control plane node"),description:e("ai:Runs the control plane components of OpenShift, including the API server.")},{value:"worker",label:e("ai:Worker"),description:e("ai:Runs application workloads. Connect at least 5 hosts to enable dedicated workers.")}],dr=e=>({"pending-for-input":e("ai:Draft"),insufficient:e("ai:Draft"),ready:e("ai:Draft"),"preparing-for-installation":e("ai:Preparing for installation"),installing:e("ai:Installing"),"installing-pending-user-action":e("ai:Installing (pending action)"),finalizing:e("ai:Finalizing"),cancelled:e("ai:Installation cancelled"),error:e("ai:Error"),installed:e("ai:Installed"),"adding-hosts":e("ai:Adding hosts")}),zu=e=>({name:e("ai:Cluster name"),baseDnsDomain:e("ai:Base domain"),clusterNetworkCidr:e("ai:Cluster network CIDR"),clusterNetworkHostPrefix:e("ai:Cluster network host prefix"),serviceNetworkCidr:e("ai:Service network CIDR"),apiVip:e("ai:API IP"),ingressVip:e("ai:Ingress IP"),pullSecret:e("ai:Pull secret"),sshPublicKey:e("ai:SSH public key"),SNODisclaimer:e("ai:Single Node OpenShift disclaimer"),diskEncryptionTangServers:e("ai:Tang servers' URLs or thumbprints"),selectedHostIds:e("ai:Hosts selection"),httpProxy:e("ai:HTTP proxy"),httpsProxy:e("ai:HTTPS proxy"),noProxy:e("ai:No proxy"),machineNetworks:e("ai:Machine networks"),clusterNetworks:e("ai:Cluster networks"),serviceNetworks:e("ai:Service networks")}),Bu=e=>({hardware:e("ai:Hardware"),network:e("ai:Network"),operators:e("ai:Operators"),infrastructure:e("ai:Infrastructure")}),ks=e=>({"compatible-with-cluster-platform":e("ai:Compatible with cluster platform"),"has-default-route":e("ai:Default route to host"),"sufficient-network-latency-requirement-for-role":e("ai:Network latency"),"sufficient-packet-loss-requirement-for-role":e("ai:Packet loss"),"has-inventory":e("ai:Hardware information"),"has-min-cpu-cores":e("ai:Minimum CPU cores"),"has-min-memory":e("ai:Minimum Memory"),"has-min-valid-disks":e("ai:Minimum disks of required size"),"has-cpu-cores-for-role":e("ai:Minimum CPU cores for selected role"),"has-memory-for-role":e("ai:Minimum memory for selected role"),"hostname-unique":e("ai:Unique hostname"),"hostname-valid":e("ai:Valid hostname"),connected:e("ai:Connected"),"media-connected":e("ai:Media Connected"),"machine-cidr-defined":e("ai:Machine CIDR"),"belongs-to-machine-cidr":e("ai:Belongs to machine CIDR"),"ignition-downloadable":e("ai:Ignition file downloadable"),"belongs-to-majority-group":e("ai:Belongs to majority connected group"),"valid-platform-network-settings":e("ai:Platform network settings"),"ntp-synced":e("ai:NTP synchronization"),"container-images-available":e("ai:Container images availability"),"lso-requirements-satisfied":e("ai:LSO requirements"),"ocs-requirements-satisfied":e("ai:OCS requirements"),"odf-requirements-satisfied":e("ai:ODF requirements"),"lvm-requirements-satisfied":e("ai:LVM requirements"),"cnv-requirements-satisfied":e("ai:CNV requirements"),"disk-encryption-requirements-satisfied":e("ai:Disk encryption requirements"),"sufficient-installation-disk-speed":e("ai:Installation disk speed"),"api-domain-name-resolved-correctly":e("ai:API domain name resolution"),"api-int-domain-name-resolved-correctly":e("ai:API internal domain name resolution"),"apps-domain-name-resolved-correctly":e("ai:Application ingress domain name resolution"),"dns-wildcard-not-configured":e("ai:DNS wildcard not configured"),"non-overlapping-subnets":e("ai:Non overlapping subnets"),"vsphere-disk-uuid-enabled":e("ai:Vsphere disk uuid enabled"),"compatible-agent":e("ai:Agent compatibility"),"no-skip-installation-disk":e("ai:No skip installation disk"),"no-skip-missing-disk":e("ai:No skip missing disk"),"service-has-sufficient-spoke-kube-api-access":e("ai:Service has sufficient spoke kube api access")}),pi=e=>({"compatible-with-cluster-platform":"","has-default-route":"","sufficient-network-latency-requirement-for-role":"","sufficient-packet-loss-requirement-for-role":"","has-inventory":"","has-min-cpu-cores":"","has-min-memory":"","has-min-valid-disks":"","has-cpu-cores-for-role":"","has-memory-for-role":"","hostname-unique":"","hostname-valid":"",connected:"","media-connected":"","machine-cidr-defined":"","belongs-to-machine-cidr":"","ignition-downloadable":"","belongs-to-majority-group":"","valid-platform-network-settings":"","ntp-synced":e("ai:Please manually fix host's NTP configuration or provide additional NTP sources."),"container-images-available":"","lso-requirements-satisfied":"","ocs-requirements-satisfied":"","odf-requirements-satisfied":"","lvm-requirements-satisfied":"","cnv-requirements-satisfied":"","disk-encryption-requirements-satisfied":"","sufficient-installation-disk-speed":"","api-domain-name-resolved-correctly":"","api-int-domain-name-resolved-correctly":"","apps-domain-name-resolved-correctly":"","dns-wildcard-not-configured":"","non-overlapping-subnets":"","vsphere-disk-uuid-enabled":"","compatible-agent":"","no-skip-installation-disk":"","no-skip-missing-disk":"","service-has-sufficient-spoke-kube-api-access":""}),Uu=e=>({"network-type-valid":e("ai:Valid network type"),"machine-cidr-defined":e("ai:Machine CIDR"),"cluster-cidr-defined":e("ai:Cluster CIDR"),"service-cidr-defined":e("ai:Service CIDR"),"no-cidrs-overlapping":e("ai:No overlapping CIDR"),"networks-same-address-families":e("ai:Networks same address families"),"network-prefix-valid":e("ai:Valid network prefix"),"machine-cidr-equals-to-calculated-cidr":e("ai:Machine CIDR conforms expected"),"api-vip-defined":e("ai:API IP"),"api-vip-valid":e("ai:API IP validity"),"ingress-vip-defined":e("ai:Ingress IP"),"ingress-vip-valid":e("ai:Ingress IP validity"),"all-hosts-are-ready-to-install":e("ai:All hosts are ready to install"),"sufficient-masters-count":e("ai:Control plane nodes count"),"dns-domain-defined":e("ai:DNS domain"),"pull-secret-set":e("ai:Pull secret"),"ntp-server-configured":e("ai:NTP server"),"lso-requirements-satisfied":e("ai:LSO requirements"),"ocs-requirements-satisfied":e("ai:OCS requirements"),"odf-requirements-satisfied":e("ai:ODF requirements"),"lvm-requirements-satisfied":e("ai:LVM requirements"),"cnv-requirements-satisfied":e("ai:CNV requirements")}),JT=e=>({configuration:e("ai:General configuration"),hostsData:e("ai:Hosts"),"hosts-data":e("ai:Hosts"),network:e("ai:Networking"),operators:e("ai:Operators")}),ZT={clusterNetworkCidr:"10.128.0.0/14",clusterNetworkHostPrefix:23,serviceNetworkCidr:"172.30.0.0/16"},QT={clusterNetworkCidr:"2002:db8::/53",clusterNetworkHostPrefix:64,serviceNetworkCidr:"2003:db8::/112"},Gu=()=>ig,$u=["info","warning","error","critical"],ui="0001-01-01T00:00:00.000Z",qu=1e3*60*60*24,qt="NO_SUBNET_SET",Ts="OVNKubernetes",Co="OpenShiftSDN",yo="singleStack",wt="dualStack",za={IPv6:128,IPv4:25},nn=e=>({none:e("ai:None"),install:e("ai:Installation disk")}),Mr="cnv",Ba="lso",_o="odf",Wo="lvm",ng="cvo",ag="console",an=e=>({[ag]:e("ai:OpenShift Console"),[ng]:e("ai:OpenShift Cluster Version Operator"),[Ba]:e("ai:OpenShift Local Storage"),[_o]:e("ai:OpenShift Data Foundation"),[Wo]:e("ai:OpenShift Data Foundation Logical Volume Manager"),[Mr]:e("ai:OpenShift Virtualization")}),Yu="https://docs.openshift.com/container-platform/latest/scalability_and_performance/ztp-deploying-disconnected.html#ztp-configuring-a-static-ip_ztp-deploying-disconnected",ci="ui_ocm",ju="openshift/releases",Ru="https://access.redhat.com/solutions/6983944";import Ku from"react";import eP from"classnames";import{Button as tP,Popover as oP}from"@patternfly/react-core";import{OutlinedQuestionCircleIcon as rP}from"@patternfly/react-icons";var sP=({component:e,variant:t="plain",IconComponent:o=rP,noVerticalAlign:r=!1,buttonClassName:s,buttonOuiaId:i,...n})=>Ku.createElement(oP,{...n},Ku.createElement(tP,{component:e,variant:t,onClick:a=>a.preventDefault(),className:eP("pf-c-form__group-label-help","pf-u-p-0",s),ouiaId:i},Ku.createElement(o,{noVerticalAlign:r}))),W=sP;import{Trans as ug}from"react-i18next";var Xu=({isOcm:e})=>{let{t}=f();return Ne.createElement(W,{noVerticalAlign:!0,bodyContent:Ne.createElement(Ne.Fragment,null,Ne.createElement(ug,{t},"ai:Pull secrets are used to download OpenShift Container Platform components and connect clusters to a Red Hat account."," "),e?Ne.createElement(dg,null):Ne.createElement(Ne.Fragment,null,Ne.createElement(ug,{t},"ai:Pull secrets can be found in")," ",Ne.createElement(cg,null)))})},cg=()=>{let{t:e}=f();return Ne.createElement("a",{href:_a,target:"_blank",rel:"noopener noreferrer"},e("ai:OpenShift Cluster Manager")," ",Ne.createElement(pg,null))},dg=()=>{let{t:e}=f();return Ne.createElement("a",{href:Eu,target:"_blank",rel:"noopener noreferrer"},e("ai:Learn more about pull secrets and view examples")," ",Ne.createElement(pg,null),".")},mg=({isOcm:e})=>{let{t}=f();return e?Ne.createElement(dg,null):Ne.createElement(Ne.Fragment,null,t("ai:A Red Hat account's pull secret can be found in "),"\xA0",Ne.createElement(cg,null))},iP=({isOcm:e})=>{let{t}=f();return Ne.createElement(ur,{name:"pullSecret",label:t("ai:Pull secret"),labelIcon:e?void 0:Ne.createElement(Xu,{isOcm:e}),getErrorText:o=>Ne.createElement(Ne.Fragment,null,o," ",Ne.createElement(mg,{isOcm:e})),helperText:Ne.createElement(mg,{isOcm:e}),rows:10,isRequired:!0})},Ua=iP;import nP from"react";import{useField as aP}from"formik";import{Radio as lP}from"@patternfly/react-core";var pP=({callFormikOnChange:e=!0,name:t,value:o,onChange:r,...s})=>{let[i]=aP({name:t,value:o,type:"radio"}),n=T(t,"radio",i.value);return nP.createElement(lP,{...i,...s,id:n,isChecked:!!i.checked,onChange:(a,l)=>{r?.(a,l),e&&i.onChange(l)}})},Ke=pP;import{Fragment as EP,createElement as di,useCallback as wP,useEffect as DP,useRef as PP}from"react";import{useField as SP,useFormikContext as IP}from"formik";import{Checkbox as bP,FormGroup as xP,Tooltip as kP}from"@patternfly/react-core";var fg={};lr(fg,{ACM_ENABLED_FEATURES:()=>uP,FeatureGateContext:()=>Zu,FeatureGateContextProvider:()=>Ps,SINGLE_CLUSTER_ENABLED_FEATURES:()=>cP,STANDALONE_DEPLOYMENT_ENABLED_FEATURES:()=>dP,useFeature:()=>_r});import Ju from"react";var uP={ASSISTED_INSTALLER_SNO_FEATURE:!0,ASSISTED_INSTALLER_OCS_FEATURE:!1,ASSISTED_INSTALLER_ODF_FEATURE:!1,ASSISTED_INSTALLER_CNV_FEATURE:!1,ASSISTED_INSTALLER_NETWORK_TYPE_SELECTION_FEATURE:!1,ASSISTED_INSTALLER_PLATFORM_INTEGRATION_FEATURE:!1},cP={ASSISTED_INSTALLER_SNO_FEATURE:!1,ASSISTED_INSTALLER_OCS_FEATURE:!1,ASSISTED_INSTALLER_ODF_FEATURE:!1,ASSISTED_INSTALLER_CNV_FEATURE:!1,ASSISTED_INSTALLER_NETWORK_TYPE_SELECTION_FEATURE:!1,ASSISTED_INSTALLER_PLATFORM_INTEGRATION_FEATURE:!1},dP={ASSISTED_INSTALLER_SNO_FEATURE:!0,ASSISTED_INSTALLER_OCS_FEATURE:!0,ASSISTED_INSTALLER_ODF_FEATURE:!0,ASSISTED_INSTALLER_CNV_FEATURE:!0,ASSISTED_INSTALLER_NETWORK_TYPE_SELECTION_FEATURE:!0,ASSISTED_INSTALLER_PLATFORM_INTEGRATION_FEATURE:!0},Zu=Ju.createContext({isFeatureEnabled:()=>!1}),Ps=({features:e,children:t})=>{let o={ASSISTED_INSTALLER_OCS_FEATURE:!1,ASSISTED_INSTALLER_ODF_FEATURE:!1,ASSISTED_INSTALLER_CNV_FEATURE:!1,...e},r=s=>!!o[s];return Ju.createElement(Zu.Provider,{value:{isFeatureEnabled:r}},t)},_r=e=>{let{isFeatureEnabled:t}=Ju.useContext(Zu);return t(e)};import oc from"react";import vo from"react";import{Label as hP,Popover as CP}from"@patternfly/react-core";import{InfoCircleIcon as yP}from"@patternfly/react-icons";import gg from"react";import{Text as mP}from"@patternfly/react-core";import{ExternalLinkAltIcon as fP}from"@patternfly/react-icons";var gP=({href:e,children:t,onClick:o})=>gg.createElement(mP,{component:"a",href:e,onClick:o,target:"_blank",rel:"noopener noreferrer"},t||e," ",gg.createElement(fP,{color:"rgb(0, 123, 186)"})),ot=gP;var ln;(function(r){r[r.default=0]="default",r[r.inline=1]="inline",r[r.inlineRight=2]="inlineRight"})(ln||(ln={}));var hg=({position:e=1,className:t="pf-u-ml-md",text:o,popoverText:r,externalLink:s,testId:i})=>{let n=t,{t:a}=f();switch(e){case 2:n+=" pf-u-float-right";break;case 1:n+=" pf-u-display-inline";break}let l=vo.createElement(vo.Fragment,null,vo.createElement("div",{style:{marginBottom:"var(--pf-global--spacer--sm)"}},r),s&&vo.createElement(vo.Fragment,null,vo.createElement(ot,{href:s},a("ai:Learn more"))));return vo.createElement(CP,{bodyContent:l,position:"top"},vo.createElement(hP,{style:{cursor:"pointer"},color:"orange",onClick:p=>p.preventDefault(),icon:vo.createElement(yP,{color:"var(--pf-c-label__content--Color)"}),className:n,"data-testid":`${i}`},o))},Qu=e=>{let{t}=f();return vo.createElement(hg,{text:t("ai:Developer Preview"),popoverText:t("ai:Developer preview features are not intended to be used in production environments. The clusters deployed with the developer preview features are considered to be development clusters and are not supported through the Red Hat Customer Portal case management system."),...e})};Qu.displayName="DeveloperPreview";var ec=e=>{let{t}=f();return vo.createElement(hg,{text:t("ai:Technology Preview"),popoverText:t("ai:Technology preview features provide early access to upcoming product innovations, enabling you to test functionality and provide feedback during the development process."),externalLink:sn,...e})};ec.displayName="TechnologyPreview";import tc from"react";var Cg=tc.createContext(null),yg=({value:e,children:t})=>tc.createElement(Cg.Provider,{value:e},t),be=()=>{let e=tc.useContext(Cg),{t}=f();if(!e)throw new Error(t("ai:useFeatureSupportLevel must be used within FeatureSupportLevelContextProvider."));return e};var vP=({featureId:e,openshiftVersion:t})=>{let o=be(),r=oc.useMemo(()=>{if(!!t)return o.getFeatureSupportLevel(t,e)},[t,e,o]);if(!Fa(r))return null;let s=`${e}-support-level`;return r==="tech-preview"?oc.createElement(ec,{testId:s}):oc.createElement(Qu,{testId:s})},so=vP;var TP=({versions:e,validate:t,idPostfix:o,...r})=>{let{values:{openshiftVersion:s}}=IP(),i=_r("ASSISTED_INSTALLER_SNO_FEATURE"),[n,a,l]=SP({name:r.name,validate:t}),p=be(),u=PP(s),c=T(r.name,"input",o),{t:d}=f(),{value:m}=a,{setValue:g}=l,h=!!e.find(S=>p.isFeatureSupported(S.value,"SNO")),C=wP(S=>g(S?"None":"Full"),[g]),I=p.getFeatureDisabledReason(s,"SNO",d);return DP(()=>{u.current!==s&&!p.isFeatureSupported(s,"SNO")&&C(!1),u.current=s},[s,C,p]),i&&h?di(xP,{isInline:!0,fieldId:c},di(kP,{hidden:!I,content:I},di(bP,{...n,...r,id:c,label:di(EP,null,d("ai:Install single node OpenShift (SNO)"),"\xA0",di(so,{featureId:"SNO",openshiftVersion:s})),"aria-describedby":`${c}-helper`,description:di(j,{fieldId:c},d("ai:SNO enables you to install OpenShift using only one host.")),isChecked:m==="None",onChange:C,className:"with-tooltip"}))):null},rc=TP;import{createElement as mi,forwardRef as LP}from"react";import{useField as AP}from"formik";import{FormGroup as FP,NumberInput as VP,Split as NP,SplitItem as vg}from"@patternfly/react-core";var HP=LP(({label:e,labelIcon:t,helperText:o,isRequired:r,validate:s,idPostfix:i,minValue:n=0,maxValue:a,children:l,formatValue:p,onChange:u,...c},d)=>{let[m,{touched:g,error:h},{setValue:C}]=AP({name:c.name,validate:s}),I=T(c.name,"numberinput",i),S=!(g&&h),y=S?"":h,v=q=>{let Z=q<n?n:q;Z=a&&Z>a?a:Z,Z=p?p(Z):Z,C(Z),u?.(Z)},w=()=>{v(m.value+1)},E=()=>{v(m.value-1)},F=q=>{let Z=q.target.value;v(isNaN(Z)?0:Number(Z))};return mi(FP,{fieldId:I,label:e,helperText:typeof o=="string"?o:mi(j,{fieldId:I},o),helperTextInvalid:y,validated:S?"default":"error",isRequired:r,labelIcon:t},mi(NP,null,mi(vg,{isFilled:!0},mi(VP,{...c,value:m.value,onMinus:E,onChange:F,onPlus:w,min:n,max:a,ref:d,id:I,"aria-describedby":`${I}-helper`})),mi(vg,null,l)))}),OP=HP;import{Fragment as GP,createElement as fi,useEffect as UP,useState as Sg}from"react";import{useField as MP}from"formik";import{FormGroup as _P,HelperTextItem as WP}from"@patternfly/react-core";import{CodeEditor as zP}from"@patternfly/react-code-editor";var BP=({label:e,labelIcon:t,helperText:o,isRequired:r,validate:s,idPostfix:i,language:n,name:a,description:l,isDisabled:p})=>{let[u,,{setValue:c,setTouched:d}]=MP({name:a,validate:s}),m=T(a,"input",i),[g,h]=Sg(),[C,I]=Sg(),S=pr({name:a,validate:s});return UP(()=>{if(!!C)return g&&g.dispose(),h(C.onDidChangeModelContent(()=>{d(!0),c(C.getModel()?.getValue(),!0)})),()=>{g&&g.dispose()}},[C]),fi(GP,null,fi(_P,{fieldId:m,label:e,helperText:typeof o=="string"?o:fi(j,{fieldId:m},o),helperTextInvalid:S,validated:!S?"default":"error",isRequired:r,labelIcon:t},l&&fi(j,{fieldId:m},fi(WP,{variant:"indeterminate"},l)),fi(zP,{code:u.value,isUploadEnabled:!p,isDownloadEnabled:!0,isCopyEnabled:!0,isLanguageLabelVisible:!0,height:"400px",language:n,onEditorDidMount:v=>I(v)})))},sc=BP;import{createElement as Dt,forwardRef as cw,useState as dw}from"react";import{useField as $P}from"formik";import qP from"classnames";import{FormGroup as YP,HelperTextItem as jP,TextInput as RP,HelperText as KP,Popover as XP,PopoverPosition as JP,InputGroup as ZP,Button as QP}from"@patternfly/react-core";import{CheckCircleIcon as ew,CheckIcon as tw,ExclamationCircleIcon as ow,InfoCircleIcon as rw,TimesIcon as sw}from"@patternfly/react-icons";import{global_palette_green_500 as iw}from"@patternfly/react-tokens/dist/js/global_palette_green_500";import{global_danger_color_100 as nw}from"@patternfly/react-tokens/dist/js/global_danger_color_100";import{global_palette_blue_300 as aw}from"@patternfly/react-tokens/dist/js/global_palette_blue_300";var lw=(e,t,o)=>{if(t){if(o?.includes(e))return{variant:"error",icon:Dt(sw,null)}}else return{variant:"indeterminate"};return{variant:"success",icon:Dt(tw,null)}},pw=({value:e,error:t,richValidationMessages:o})=>Dt(KP,{component:"ul",className:"rich-input__rules"},Object.keys(o).map(r=>{let s=lw(o[r],e,t);return Dt(jP,{key:r,isDynamic:!0,component:"li",...s},o[r])})),uw=cw(({label:e,labelIcon:t,helperText:o,isRequired:r,onChange:s,validate:i,idPostfix:n,noDefaultOnChange:a,richValidationMessages:l,...p},u)=>{let[c,d]=dw(!1),[m,{error:g,value:h,touched:C},{setTouched:I}]=$P({name:p.name,validate:i}),S=T(p.name,"input",n),y=!C||!g?.length;return Dt(YP,{fieldId:S,label:e,helperText:typeof o=="string"?o:Dt(j,{fieldId:S},o),validated:y?"default":"error",isRequired:r,labelIcon:t},Dt(ZP,{className:qP("rich-input__group",{"rich_input__group--invalid":!y})},Dt(RP,{...m,...p,ref:u,id:S,isRequired:r,"aria-describedby":`${S}-helper`,onChange:(v,w)=>{!c&&d(!0),!a&&m.onChange(w),I(!0,!1),s&&s(w)},className:"rich-input__text",onBlur:()=>d(!1)}),Dt(XP,{isVisible:c,shouldClose:()=>d(!1),shouldOpen:()=>d(!0),"aria-label":"validation popover",position:JP.top,bodyContent:Dt(pw,{value:h,error:g,richValidationMessages:l})},Dt(QP,{variant:"plain","aria-label":"Validation"},y?h?Dt(ew,{color:iw.value}):Dt(rw,{color:aw.value}):Dt(ow,{color:nw.value})))))}),ws=uw;import{useField as mw}from"formik";import{createElement as gw}from"react";var fw=({name:e,label:t,isRequired:o,isDisabled:r,helperText:s})=>{let[i,,{setValue:n,setTouched:a}]=mw(e);return gw(ur,{name:e,label:t,helperText:s,onBlur:()=>{i.value&&(n(Mo(i.value)),a(!0))},spellCheck:!1,isRequired:o,isDisabled:r})},ic=fw;import nc from"react";import{Button as hw,ButtonVariant as Cw,Tooltip as yw}from"@patternfly/react-core";import{MinusCircleIcon as vw}from"@patternfly/react-icons";import Sw from"classnames";var Iw=1500,bw=({onRemove:e,hideRemoveButton:t=!0,children:o,className:r,removeButtonDataTestId:s,...i})=>nc.createElement(yw,{hidden:t,exitDelay:Iw,flipBehavior:["right","bottom"],position:"right-start",distance:0,content:nc.createElement(hw,{variant:Cw.plain,onClick:e,"data-testid":s},nc.createElement(vw,{size:"sm"})),className:Sw("ai-remove-button__tooltip ",r),...i},o),pn=bw;import{Button as xw,ButtonVariant as kw}from"@patternfly/react-core";import{PlusCircleIcon as Tw}from"@patternfly/react-icons";import Ig from"react";var Pw=({onAdd:e,variant:t=kw.link,children:o,...r})=>Ig.createElement(xw,{icon:Ig.createElement(Tw,null),onClick:e,variant:t,...r},o),ac=Pw;import{useField as ww}from"formik";import{Fragment as xg,createElement as mr,useEffect as Hw,useRef as Nw,useState as Ow}from"react";import{PencilAltIcon as Dw}from"@patternfly/react-icons";import{Split as Ew,SplitItem as bg}from"@patternfly/react-core";var Aw=({name:e,isRequired:t,onBlur:o,showErrorMessage:r})=>{let s=Nw();return Hw(()=>s?.current?.focus(),[]),mr(St,{name:e,isRequired:t,onBlur:o,ref:s,showErrorMessage:r})},Fw=({name:e,isRequired:t,showErrorMessage:o})=>{let[r,s]=Ow(!1),[i]=ww({name:e}),n=pr({name:e});return mr(xg,null,r?mr(Aw,{name:e,isRequired:t,onBlur:()=>s(!1),showErrorMessage:o}):mr(xg,null,mr(Ew,null,mr(bg,{className:"ai-pencil-field__text"},i.value),mr(bg,null,mr(Dw,{onClick:()=>s(!0)})))),mr("div",{className:"pf-c-form__helper-text pf-m-error"},n))},Vw=Fw;import{overlap as Bw}from"cidr-tools";import{Address4 as gc,Address6 as hc}from"ip-address";import Qa from"is-cidr";import{isInSubnet as Uw}from"is-in-subnet";import{array as hn,lazy as pD,mixed as lD,number as il,object as Ic,string as Pe}from"yup";import{Address4 as Ka,Address6 as Xa}from"ip-address";import Lw from"lodash/camelCase";var O=e=>{let t;if(e)try{let o=e.replace(/"([\w-]+)":/g,(r,s)=>`"${Lw(s)}":`);t=JSON.parse(o)}catch(o){console.error("Failed to parse api string",o,e)}else console.info("Empty api string received.");return t},kg=(e="")=>e.replace(/^(http|https):\/\//,"");import un from"lodash/fp/head";var Ds=({machineNetworks:e,machineNetworkCidr:t})=>un(e)?.cidr??t;var gi=e=>e||[],Wr=e=>gi(e?.monitoredOperators).filter(t=>t.operatorType==="olm"),Ga=(e,t)=>gi(e).some(o=>o.name&&o.name===t),Tg=e=>!e.hosts||e.hosts.length<=3,le=({highAvailabilityMode:e})=>e==="None",Pg=({validationsInfo:e})=>O(e),lc=({machineNetworks:e,serviceNetworks:t,clusterNetworks:o},r)=>{switch(r){case"machineNetworks":return un(e)?.cidr;case"clusterNetworks":return un(o)?.cidr;case"serviceNetworks":return un(t)?.cidr}},pc=({machineNetworks:e,serviceNetworks:t,clusterNetworks:o},r)=>{switch(r){case"machineNetworks":return e&&e[1].cidr;case"clusterNetworks":return o&&o[1].cidr;case"serviceNetworks":return t&&t[1].cidr}},wg=({clusterNetworks:e})=>un(e)?.hostPrefix,Dg=({clusterNetworks:e})=>e&&e[1].hostPrefix,zo=({cpuArchitecture:e})=>e===L.ARM,Mw=e=>e.hosts?e.hosts.length<5:!0,cn=e=>e.schedulableMastersForcedTrue===void 0?Mw(e):e.schedulableMastersForcedTrue,io=e=>cn(e)?!0:e.schedulableMasters||!1,So=({platform:e})=>qf.includes(e?.type??"none"),$a=e=>e.canSelectCpuArch!==!1;import _w from"filesize.js";import S8 from"fuse.js";var de="-",Eg="ODD";var Ag=(e,t)=>["pending-for-input","insufficient","ready","adding-hosts"].includes(e)&&["disabled","disabled-unbound"].includes(t),Fg=(e,t)=>["pending-for-input","insufficient","ready","adding-hosts"].includes(e)&&["discovering","discovering-unbound","disconnected","disconnected-unbound","known","known-unbound","insufficient","insufficient-unbound","pending-for-input"].includes(t),Vg=(e,t)=>["pending-for-input","insufficient","ready","adding-hosts"].includes(e)&&["discovering","discovering-unbound","known","known-unbound","disconnected","disconnected-unbound","disabled","disabled-unbound","insufficient","insufficient-unbound","resetting","resetting-pending-user-input","resetting-pending-user-action","installing-pending-user-action","pending-for-input","added-to-existing-cluster","error"].includes(t),Ng=(e,t)=>["adding-hosts"].includes(e)&&["error","installing-pending-user-action"].includes(t),qa=(e,t)=>["pending-for-input","insufficient","ready","adding-hosts"].includes(e)&&["discovering","discovering-unbound","known","known-unbound","disconnected","disconnected-unbound","disabled","disabled-unbound","insufficient","insufficient-unbound","pending-for-input"].includes(t),Hg=(e,t,o)=>qa(e,t)&&!o,Og=e=>["insufficient","adding-hosts","ready","pending-for-input"].includes(e),Lg=qa,dn=e=>["installing","finalizing","error","cancelled","installed","adding-hosts"].includes(e),Ya=(e,t)=>e.kind==="AddHostsCluster"&&e.status==="adding-hosts"&&t==="known",mn=e=>e.progressStages||[],uc=e=>e.progress?.currentStage?e.progress:{currentStage:"Starting installation",progressInfo:void 0,installationPercentage:void 0},ja=e=>{let t=mn(e),o=uc(e);return Math.round((o?.installationPercentage||0)/100*t.length)},Mg=e=>["discovering","discovering-unbound","known","known-unbound","disconnected","disconnected-unbound","insufficient","insufficient-unbound","pending-for-input"].includes(e),cc=(e,t,o)=>{let r=`${xs(t).find(s=>s.value===e.role)?.label||xs(t)[0].label}`;return o&&e.role==="master"&&(r=t("ai:Control plane node, Worker")),`${r}${e.bootstrap?" (bootstrap)":""}`},dc=e=>!!e.logsCollectedAt&&e.logsCollectedAt!==ui,Es=e=>e.controllerLogsCollectedAt!==ui||!!(e.hosts||[]).find(t=>dc(t)),Ra=e=>e.readyHostCount||0,fn=e=>e.enabledHostCount||0,gn=e=>e.totalHostCount||0,zr=(e=[])=>e.filter(t=>t.status!=="disabled"),Bo=(e,t)=>e.requestedHostname||t.hostname||"",_g=(e,t)=>{let o=de,{systemVendor:r}=e;return r!==void 0&&(r.virtual?o=t("ai:Virtual machine"):o=t("ai:Bare metal")),o},Io=(...e)=>_w.call(null,...e).toUpperCase().replace(/I/,"i"),He=e=>{let{inventory:t=""}=e;return O(t)||{}};var Ww=e=>Object.keys(e).reduce((t,o)=>{let r=e[o].filter(s=>s.status==="failure");return[...t,...r]},[]),Wg=e=>{let t=Ww(e).map(o=>o.id);if(!t.length)return!1;for(let o of t)if(!["ntp-synced","container-images-available"].includes(o))return!1;return!0};var fr=e=>Ka.isValid(e)?new Ka(e):Xa.isValid(e)?new Xa(e):null,mc=e=>{if(e){let t=e.startAddress().correctForm(),o=e.endAddress().correctForm();return`(${t} - ${o})`}return""},zw=e=>e?`${e.address} ${mc(e)}`:"",zg=e=>{let t=e.hosts?.reduce((o,r)=>{let s=O(r.inventory)||{};return o={...o,[r.id]:Bo(r,s)},o},{})||{};return e.hostNetworks?.map(o=>({subnet:o.cidr||"",hostIDs:o.hostIds?.map(r=>t[r]||r)||[],humanized:zw(fr(o.cidr))}))||[]};var Bg=(e,t)=>{let o=t.map(r=>r.cidr);return e.length===t.length&&e.every(r=>o.includes(r.cidr))},Ug=(e,t)=>e.length===t.length&&e.every(o=>t.find(r=>r.cidr===o.cidr&&r.hostPrefix===o.hostPrefix));var Gg=(e,t=!1)=>!(e||t),$g=(e,t=!1)=>e||t?Ts:Co,qg=e=>e.some(t=>Ka.isValid(t.subnet))&&e.some(t=>Xa.isValid(t.subnet)),fc=e=>e&&e.length>1&&Ka.isValid(e[0].cidr||"")&&Xa.isValid(e[1].cidr||""),hi=({machineNetworks:e,clusterNetworks:t,serviceNetworks:o})=>fc(e)&&fc(t)&&fc(o);var Yg=e=>({usePlatformIntegration:So(e),schedulableMasters:io(e)}),jg=()=>({nodeLabeling:""});var Yt=e=>({INVALID_LENGTH_OCM:e("ai:1-54 characters"),INVALID_LENGTH_ACM:e("ai:2-54 characters"),INVALID_VALUE_OCM:Ja(e).INVALID_VALUE,INVALID_VALUE_ACM:e("ai:Use lowercase alphanumeric characters or hyphen (-)"),INVALID_START_END:e("ai:Start and end with a lowercase letter or a number."),NOT_UNIQUE:e("ai:Must be unique")}),Rg=e=>({INVALID_LENGTH:Yt(e).INVALID_LENGTH_OCM,INVALID_VALUE:Yt(e).INVALID_VALUE_OCM,INVALID_START_END:Yt(e).INVALID_START_END}),Kg=e=>({INVALID_LENGTH:Yt(e).INVALID_LENGTH_OCM,INVALID_VALUE:Yt(e).INVALID_VALUE_OCM,INVALID_START_END:Yt(e).INVALID_START_END,NOT_UNIQUE:Yt(e).NOT_UNIQUE}),z8=e=>({INVALID_LENGTH:Yt(e).INVALID_LENGTH_ACM,INVALID_VALUE:Yt(e).INVALID_VALUE_ACM,INVALID_START_END:Yt(e).INVALID_START_END,NOT_UNIQUE:Yt(e).NOT_UNIQUE}),Ja=e=>({INVALID_LENGTH:e("ai:1-253 characters"),NOT_UNIQUE:e("ai:Must be unique"),INVALID_VALUE:e("ai:Use lowercase alphanumeric characters, dot (.) or hyphen (-)"),INVALID_START_END:e("ai:Must start and end with an lowercase alphanumeric character"),INVALID_FORMAT:e("ai:Number of characters between dots (.) must be 1-63")}),Br=e=>({...Ja(e),LOCALHOST_ERR:e('ai:Do not use forbidden words, for example: "localhost".')}),Xg=e=>({INVALID_LENGTH:e("ai:1-63 characters"),INVALID_VALUE:e("ai:Use alphanumeric characters, dot (.), underscore (_) or hyphen (-)"),INVALID_START_END:e("ai:Must start and end with an alphanumeric character")}),Jg=e=>({INVALID_VALUE:e("ai:The Value is not valid BMC address, supported protocols are redfish-virtualmedia or idrac-virtualmedia.")}),Za=["localhost","localhost.localdomain","localhost4","localhost4.localdomain4","localhost6","localhost6.localdomain6"];var Zg=/^[a-zA-Z0-9]+$/,Qg=/^[a-z0-9](.*[a-z0-9])?$/,Gw=/^[a-z0-9-.]*$/,$w=/^[a-z0-9](.*[a-z0-9])?$/,qw=/^[.-a-z0-9]?(([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)*)[.-a-z0-9]?$/,Yw=/^[a-z0-9-]*$/,jw=/^(ssh-rsa|ssh-ed25519|ecdsa-[-a-z0-9]*) AAAA[0-9A-Za-z+/]+[=]{0,3}( .+)?$/,eh=/^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/,Rw=/^([a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62}){1}(\.[a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62})*[._]?$/,Kw="0.0.0.0",Xw="0000:0000:0000:0000:0000:0000:0000:0000",Jw=/^([0-9A-Fa-f]{2}[:]){5}([0-9A-Fa-f]{2})$/,Zw=/^[^.]{1,63}(?:[.][^.]{1,63})*$/,Qw=/^((redfish-virtualmedia|idrac-virtualmedia)(\+https?)?:(\/\/([a-z0-9\-._~%!$&'()*+,;=]+@)?([a-z0-9\-._~%]+|\[[a-f0-9:.]+\]|\[v[a-f0-9][a-z0-9\-._~%!$&'()*+,;=:]+\])(:[0-9]+)?(\/[a-z0-9\-._~%!$&'()*+,;=:@]+)*\/?|(\/?[a-z0-9\-._~%!$&'()*+,;=:@]+(\/[a-z0-9\-._~%!$&'()*+,;=:@]+)*\/?)?)|([a-z0-9\-._~%!$&'()*+,;=@]+(\/[a-z0-9\-._~%!$&'()*+,;=:@]+)*\/?|(\/[a-z0-9\-._~%!$&'()*+,;=:@]+)+\/?))(\?[a-z0-9\-._~%!$&'()*+,;=:@/?]*)?(#[a-z0-9\-._~%!$&'()*+,;=:@/?]*)?$/i,eD=/^[a-zA-Z0-9-._]*$/,th=(e,t,o="",r,s=!1)=>{let i=Yt(e);return Pe().required("Required").matches(s?qw:Yw,{message:s?i.INVALID_VALUE_OCM:i.INVALID_VALUE_ACM,excludeEmptyString:!0}).matches($w,{message:i.INVALID_START_END,excludeEmptyString:!0}).min(s?1:2,s?i.INVALID_LENGTH_OCM:i.INVALID_LENGTH_ACM).max(54,s?i.INVALID_LENGTH_OCM:i.INVALID_LENGTH_ACM).when("useRedHatDnsService",{is:!0,then:Pe().test("is-name-unique",i.NOT_UNIQUE,n=>{let a=`${n}.${o}`;return!n||!t.includes(a)}),otherwise:Pe().test("is-name-unique",i.NOT_UNIQUE,n=>r?!n||!t.includes(n):!0)})},el=Pe().test("ssh-public-key",'SSH public key must consist of "[TYPE] key [[EMAIL]]", supported types are: ssh-rsa, ssh-ed25519, ecdsa-[VARIANT]. A single key can be provided only.',e=>e?!!Ss(e).match(jw):!0),oh=Pe().test("is-well-formed-json","Invalid pull secret format. You must use your Red Hat account's pull secret.",e=>{let t=!0;if(!e)return t;try{let o=JSON.parse(e);return o.constructor.name==="Object"&&!!o?.auths&&o.auths.constructor.name==="Object"}catch{return!t}}),rh=Pe().test("ip-validation","Not a valid IP address",e=>gc.isValid(e)||hc.isValid(e)),tl=Pe().matches(Jw,{message:'Value "${value}" is not valid MAC address.',excludeEmptyString:!0}),tD=(e,{machineNetworks:t,hostSubnet:o})=>Pe().test("vip-validation","IP Address is outside of selected subnet",function(r){if(!r)return!0;try{rh.validateSync(r)}catch(i){return this.createError({message:Ge(i)})}let s=[];if(t){let i=t?.map(n=>n.cidr);s.push(...e.filter(n=>i?.includes(n.subnet)))}else{let i=e.find(n=>n.subnet===o);i&&s.push(i)}for(let i of s)if(i?.subnet)if(i.hostIDs.length){if(Uw(r,i.subnet))return!0}else return!0;return!1}),oD=({ingressVip:e,apiVip:t})=>Pe().test("vip-uniqueness-validation","The Ingress and API IP addresses cannot be the same.",o=>o?e!==t:!0),rD=(e,t)=>Pe().test("required-once-set",t||"The value is required.",o=>o||!e),sD=Pe().when(["managedNetworkingType"],{is:"clusterManaged",then:Pe().notOneOf([qt],"Host subnet must be selected.")}),Cc=(e,t,o)=>lD().when(["vipDhcpAllocation","managedNetworkingType"],{is:(r,s)=>!r&&s!=="userManaged",then:rD(o,"Required. Please provide an IP address").concat(tD(e,t)).concat(oD(t)).when("hostSubnet",{is:r=>r!==qt,then:Pe().required("Required. Please provide an IP address")})}),sh=e=>Pe().required("A value is required.").test("valid-ip-address","Invalid IP address block. Expected value is a network expressed in CIDR notation (IP/netmask). For example: 123.123.123.0/24, 2055:d7a::/116",(t="")=>Qa.v4(t)||Qa.v6(t)).test("valid-netmask",`IPv4 netmask must be between 1-25 and include at least 128 addresses.
|
|
8
|
+
IPv6 netmask must be between 8-128 and include at least 256 addresses.`,(t="")=>{let o=parseInt(t.split("/")[1]);return Qa.v4(t)&&0<o&&o<26||Qa.v6(t)&&7<o&&o<129}).test("cidr-is-not-unspecified","The specified CIDR is invalid because its resulting routing prefix matches the unspecified address.",(t="")=>{let o=fr(t);if(o===null)return!1;let r=o.startAddress().address;return r!==Kw&&r!==Xw}).test("valid-cidr-base-address",({value:t})=>`${t} is not a valid CIDR`,(t="")=>{let o=fr(t);if(o===null)return!1;let r=o.startAddress().parsedAddress;return o.parsedAddress.every((n,a)=>n===r[a])}).test("cidrs-can-not-overlap","Provided CIDRs can not overlap.",t=>{try{if(t&&e&&e.length>0)return!Bw(t,e)}catch{return!1}return!0}),yc=Pe().test("dns-name-label-length","Single label of the DNS name can not be longer than 63 characters.",(e="")=>e.split(".").every(t=>t.length<=63)).matches(eh,{message:'Value "${value}" is not valid DNS name. Example: basedomain.example.com',excludeEmptyString:!0}),iD=e=>{let t="The host prefix is required.",o="The host prefix is a number between 1 and 32 for IPv4 and between 8 and 128 for IPv6.",r=(e||"").split("/")[1];if(!r)return il().required(t).min(1,o).max(32,o);let s=parseInt(r);isNaN(s)&&(s=1);let i="The host prefix is a number between size of the cluster network CIDR range",n=`${i} (${s}) and 25.`,a=`${i} (8) and 128.`;return hc.isValid(e||"")?il().required(t).min(8,a).max(128,a):gc.isValid(e||"")?il().required(t).min(s,n).max(25,n):il().required(t)},ol=(e,t,o)=>{let r=Ja(e);return Pe().min(1,r.INVALID_LENGTH).max(253,r.INVALID_LENGTH).test(r.INVALID_START_END,r.INVALID_START_END,s=>{let i=s?.trim();return i?!!i[0].match(Qg)&&(i[i.length-1]?!!i[i.length-1].match(Qg):!0):!0}).matches(Zw,r.INVALID_FORMAT).matches(Gw,{message:r.INVALID_VALUE,excludeEmptyString:!0}).test(r.NOT_UNIQUE,r.NOT_UNIQUE,s=>!s||s===o?!0:!t.find(i=>i===s)).notOneOf(Za,Br(e).LOCALHOST_ERR)},nD="Provide a valid HTTP URL.",vc=(e,t)=>Pe().test("http-proxy-no-empty-validation","At least one of the HTTP or HTTPS proxy URLs is required.",o=>!e.enableProxy||o||e[t]).test("http-proxy-validation",nD,o=>{if(!o)return!0;try{return new URL(o).protocol==="http:"}catch{return!1}}),aD=e=>!e||e!=="",Sc=(e,t=eh)=>{if(!e||e.match(t))return!0;try{rh.validateSync(e)}catch{return!1}return!0},ih=Pe().test("no-proxy-validation","Provide a comma separated list of valid DNS names or IP addresses.",e=>{if(!e||e==="*")return!0;let t=Mo(e).split(",").map(o=>o.charAt(0)==="."?o.substring(1):o);return t.every(aD)&&t.every(o=>Sc(o,Rw))}),nh=Pe().test("ntp-source-validation","Provide a comma separated list of valid DNS names or IP addresses.",e=>e?Mo(e).split(",").every(t=>Sc(t)):!0),ah=Pe().test("day2-api-vip","Provide a valid DNS name or IP Address",e=>e?Sc(e):!0),Z8=e=>{let t=Jg(e);return Pe().matches(Qw,{message:t.INVALID_VALUE,excludeEmptyString:!0})},Q8=e=>{let t=Xg(e);return Pe().min(1,t.INVALID_LENGTH).max(63,t.INVALID_LENGTH).test(t.INVALID_START_END,t.INVALID_START_END,o=>{let r=o?.trim();return r?!!r[0].match(Zg)&&(r[r.length-1]?!!r[r.length-1].match(Zg):!0):!0}).matches(eD,{message:t.INVALID_VALUE,excludeEmptyString:!0})},lh=hn().of(Ic({cidr:sD,clusterId:Pe()})),ph=hn().of(pD(e=>Ic({cidr:sh(void 0),hostPrefix:iD(e.cidr),clusterId:Pe()}))),uh=hn().of(Ic({cidr:sh(void 0),clusterId:Pe()})),rl=e=>hn().max(2,`Maximum number of ${e} subnets in dual stack is 2.`).test("dual-stack-ipv4","First network has to be IPv4 subnet.",t=>t[0].cidr&&gc.isValid(t[0].cidr)).test("dual-stack-ipv6","Second network has to be IPv6 subnet.",t=>t[1].cidr&&hc.isValid(t[1].cidr)),sl=hn().test("single-stack","All network subnets must be IPv4.",e=>Jf(e));import{createElement as Ci,useState as gD}from"react";import{useField as uD}from"formik";import{FormGroup as cD,Label as dD}from"@patternfly/react-core";import mD from"react-tagsinput";var fD=({value:e,onClose:t})=>Ci(dD,{className:"label-field__value",variant:"outline",onClose:t},e),c5=({label:e,labelIcon:t,helperText:o,isRequired:r,onChange:s,validate:i,idPostfix:n,...a})=>{let{t:l}=f(),[p,u]=gD(""),[c,{touched:d,error:m},{setValue:g,setTouched:h}]=uD({name:a.name,validate:i}),C=T(a.name,"input",n),I=!(d&&m);return Ci(cD,{fieldId:C,label:e,helperText:typeof o=="string"?o:Ci(j,{fieldId:C},o),helperTextInvalid:I?"":m,validated:I?"default":"error",isRequired:r,labelIcon:t},l("ai:Enter key=value and then press 'enter' or 'space' or use a ',' to input the label."),Ci("div",{className:"co-search-input pf-c-form-control"},Ci(mD,{...c,onChange:y=>{g(y),u(""),s&&s(y),!d&&h(!0)},addKeys:[13,32,188],renderTag:({tag:y,key:v,onRemove:w,getTagDisplayValue:E})=>Ci(fD,{key:v,onClose:()=>w(v),value:E(y)}),addOnBlur:!0,inputProps:{autoFocus:!1,className:"label-field__input",placeholder:c.value?.length?"":"app=frontend",spellCheck:"false",id:"tags-input",value:p,onChange:y=>u(y.target.value),["data-test"]:"tags-input"}})))};import yi from"react";import{Title as hD,EmptyState as CD,EmptyStateBody as yD,Bullseye as vD,EmptyStateIcon as SD,EmptyStateSecondaryActions as ID}from"@patternfly/react-core";import{SearchIcon as bD}from"@patternfly/react-icons";var xD=({title:e="No results found",content:t,icon:o=bD,primaryAction:r,secondaryActions:s})=>yi.createElement(vD,null,yi.createElement(CD,null,yi.createElement(SD,{icon:o}),yi.createElement(hD,{headingLevel:"h2"},e),t&&yi.createElement(yD,null,t),r,s&&yi.createElement(ID,null,s))),bo=xD;import Uo from"react";import{Title as kD,EmptyState as TD,EmptyStateBody as PD,Bullseye as wD,EmptyStateIcon as DD,EmptyStateVariant as ED,Button as AD,ButtonVariant as FD,EmptyStateSecondaryActions as VD}from"@patternfly/react-core";import{ExclamationCircleIcon as ND}from"@patternfly/react-icons";import{global_danger_color_200 as HD}from"@patternfly/react-tokens";var OD=({fetchData:e})=>{let{t}=f();return Uo.createElement(Uo.Fragment,null,t("ai:There was an error retrieving data. Check your connection and")," ",e?Uo.createElement(AD,{onClick:e,variant:FD.link,isInline:!0},t("ai:try again")):t("ai:try again"),".")},LD=({title:e="Error loading data",content:t,fetchData:o,icon:r=ND,iconColor:s=HD.value,variant:i=ED.small,primaryAction:n,actions:a})=>Uo.createElement(wD,null,Uo.createElement(TD,{variant:i},Uo.createElement(DD,{icon:r,color:s}),Uo.createElement(kD,{headingLevel:"h2"},e),Uo.createElement(PD,null,t||Uo.createElement(OD,{fetchData:o})),n,a&&Uo.createElement(VD,null,a))),_=LD;import Cn from"react";import{EmptyState as MD,EmptyStateBody as _D,Bullseye as WD,EmptyStateVariant as zD,Spinner as BD,EmptyStateSecondaryActions as UD}from"@patternfly/react-core";var GD=({content:e,primaryAction:t,secondaryActions:o})=>Cn.createElement(WD,null,Cn.createElement(MD,{variant:zD.small},Cn.createElement(BD,{size:"xl"}),e&&Cn.createElement(_D,null,e),t,o&&Cn.createElement(UD,null,o))),z=GD;import ch from"react";import{Button as $D,ToolbarItem as qD}from"@patternfly/react-core";var YD=({...e})=>ch.createElement(qD,null,ch.createElement($D,{...e})),ht=YD;import dh from"react";import{ToolbarItem as jD,Text as RD}from"@patternfly/react-core";var KD=e=>dh.createElement(jD,null,dh.createElement(RD,{...e})),XD=KD;import bc from"react";import{ToolbarGroup as JD,ToolbarItem as ZD,Progress as QD,ProgressSize as eE}from"@patternfly/react-core";var tE=({style:e,size:t=eE.sm})=>bc.createElement(JD,{style:{flexGrow:1}},bc.createElement(ZD,{style:{flexGrow:1}},bc.createElement(QD,{style:{...e,gridGap:0},size:t}))),oE=tE;import rE from"react";import{ToolbarGroup as sE}from"@patternfly/react-core";var iE=({children:e})=>rE.createElement(sE,{alignment:{md:"alignRight"}},e),xc=iE;import{createElement as vi,useEffect as uE}from"react";import{useField as nE}from"formik";import{FormGroup as aE,TextContent as lE,Text as pE}from"@patternfly/react-core";var mh=({label:e,name:t,children:o,helperText:r,helperTextInvalid:s,isRequired:i,isValid:n=!0})=>{let a=T(t,"static");return vi(aE,{fieldId:a,label:e,helperText:typeof r=="string"?r:vi(j,{fieldId:a},r),helperTextInvalid:s,validated:n?"default":"error",isRequired:i},o)},nl=({value:e,...t})=>{let[,,o]=nE({name:t.name});return uE(()=>{o.setValue(e)},[e]),vi(mh,{...t})},al=({children:e,...t})=>{let o=T(t.name,"static");return vi(mh,{...t},vi(lE,null,vi(pE,{component:"p",id:o,"aria-describedby":`${o}-helper`},e)))};import{createElement as ut}from"react";import{ActionList as oA,ActionListItem as Tn,Button as Dc,ButtonVariant as Ec,Spinner as rA,SplitItem as sA,Stack as iA,StackItem as Ac,Text as nA,TextVariants as aA}from"@patternfly/react-core";import xh from"react";import{ButtonVariant as QE}from"@patternfly/react-core";import Et from"react";import{Button as qE,Modal as YE,ButtonVariant as jE,ModalVariant as RE,ModalBoxBody as KE}from"@patternfly/react-core";import{ExclamationTriangleIcon as XE}from"@patternfly/react-icons";import{global_warning_color_100 as JE}from"@patternfly/react-tokens";import xn,{useEffect as $E,useState as wc}from"react";import Rt from"react";import{Label as fE}from"@patternfly/react-core";import{TableVariant as gE,Table as hE,TableBody as CE,breakWord as yE}from"@patternfly/react-table";import{InfoCircleIcon as vE,ExclamationTriangleIcon as SE,ExclamationCircleIcon as IE,SearchIcon as bE}from"@patternfly/react-icons";var jt=e=>e?new Date(e).toLocaleString():de,w9=e=>e?new Date(e).toLocaleTimeString():de;import cE from"lodash/upperFirst";import dE from"lodash/endsWith";import{SortByDirection as mE}from"@patternfly/react-table";var fh=(e,t)=>[{heightAuto:!0,cells:[{props:{colSpan:t},title:e}]}],ll=(e,t)=>(o,r)=>{let s=e.direction===mE.asc?1:-1,i=t(o,e.index),n=t(r,e.index),a=typeof i=="string"?i:i?.sortableValue,l=typeof n=="string"?n:n?.sortableValue;return typeof a=="string"||typeof l=="string"?(a=a||"",a.localeCompare(l)*s):(a=a||0,l=l||0,(a-l)*s)},xo=e=>`${cE(e)}${dE(e,".")||e===""?"":"."}`,pl=e=>({title:jt(e),sortableValue:e?new Date(e).getTime():0});var W9=()=>({className:"pf-m-break-word"}),gh=()=>({className:"pf-m-fit-content"}),z9=()=>({className:"pf-m-nowrap"}),B9=()=>({className:"pf-m-truncate"}),U9=()=>({className:"pf-m-wrap"}),hh=()=>({className:"table-no-padding"});var xE=({rowData:e})=>e?.props?.event.sortableTime+e?.props?.event.message,kE=e=>{switch(e){case"info":return"blue";case"warning":return"orange";case"error":return"red";case"critical":return"purple"}},TE=e=>{switch(e){case"info":return Rt.createElement(vE,null);case"warning":return Rt.createElement(SE,null);case"error":case"critical":return Rt.createElement(IE,null)}},PE=({events:e,className:t})=>{let{t:o}=f();if(e.length===0)return Rt.createElement(bo,{icon:bE,title:o("ai:No events found"),content:o("ai:There are no events found.")});let s=e.map(i=>({...i,sortableTime:new Date(i.eventTime).getTime()})).sort((i,n)=>n.sortableTime-i.sortableTime).map(i=>({cells:[{title:Rt.createElement("strong",null,jt(i.eventTime))},{title:Rt.createElement(Rt.Fragment,null,i.severity!=="info"&&Rt.createElement(Rt.Fragment,null,Rt.createElement(fE,{color:kE(i.severity),icon:TE(i.severity)},i.severity)," "),i.message)}],props:{event:i}}));return Rt.createElement("div",{className:t},Rt.createElement(hE,{rows:s,cells:[{title:o("ai:Time"),cellTransforms:[gh,hh]},{title:o("ai:Message"),cellTransforms:[yE]}],variant:gE.compact,"aria-label":o("ai:Events table"),borders:!1},Rt.createElement(CE,{rowKey:xE})))},yn=PE;import Ur from"react";import{Button as WE,ButtonVariant as zE}from"@patternfly/react-core";import{SearchIcon as BE}from"@patternfly/react-icons";import we from"react";import Ch from"lodash/capitalize";import{Toolbar as wE,ToolbarItem as DE,ToolbarContent as EE,ToolbarFilter as yh,Button as AE,ButtonVariant as FE,InputGroup as VE,Select as vh,SelectOption as vn,TextInput as NE,Badge as HE}from"@patternfly/react-core";import{SearchIcon as OE,FilterIcon as LE}from"@patternfly/react-icons";var Sh=({text:e})=>we.createElement(we.Fragment,null,we.createElement(LE,null)," ",e),Sn="select-all-actions",In="cluster-level-action",bn="deleted-hosts-action",kc=e=>(e||[]).map(t=>{let o=O(t.inventory)||{},r=t.requestedHostname;return o.hostname!==t.requestedHostname&&(r+=` (${o.hostname})`),{hostname:r,id:t.id}}),ul=e=>({fulltext:"",hosts:kc(e.hosts).map(t=>t.id),severity:[],clusterLevel:!0,orphanedHosts:!0,selectAll:!0}),ME=(e,t)=>t.filter(o=>o.severity===e).length,_E=({filters:e,setFilters:t,cluster:o,events:r})=>{let[s,i]=we.useState(!1),[n,a]=we.useState(!1),l=we.useMemo(()=>kc(o.hosts),[o.hosts]),p=()=>{t(ul(o))},u=(v,w,E)=>{let F=(ae,Y,Re,tt)=>({...tt,[ae]:Y?[...tt[ae],Re]:tt[ae].filter(vt=>vt!==Re)}),q=(ae,Y)=>({...Y,selectAll:v==="severity"?Y.selectAll:Y.hosts.length===ae&&Y.orphanedHosts&&Y.clusterLevel}),Z=F(v,w,E,e);Z=q(o.hosts?.length||0,Z),t(Z)},c=()=>i(!s),d=(v,w)=>{let E=v.target.checked;switch(w){case Sn:t(E?{...e,hosts:kc(o.hosts).map(F=>F.id),clusterLevel:!0,orphanedHosts:!0,selectAll:!0}:{...e,clusterLevel:!1,orphanedHosts:!1,selectAll:!1,hosts:[]});break;case bn:t({...e,orphanedHosts:E,selectAll:E&&e.clusterLevel&&e.hosts.length===o.hosts?.length});break;case In:t({...e,clusterLevel:E,selectAll:E&&e.orphanedHosts&&e.hosts.length===o.hosts?.length});break;default:u("hosts",E,w)}},m=()=>a(!n),g=(v,w)=>{u("severity",v.target.checked,w)},h=v=>{t({...e,fulltext:v})},C=(v,w)=>{if(v){let E=w.key||w;t({...e,[v]:e[v].filter(F=>F!==E)})}else p()},I=v=>{t({...e,[v]:[]})},S=()=>{let v=e.clusterLevel?[...e.hosts,In]:e.hosts;return v=e.orphanedHosts?[...v,bn]:v,v=e.selectAll?[...v,Sn]:v,v},{t:y}=f();return we.createElement(wE,{id:"clusters-events-toolbar",className:"pf-m-toggle-group-container",collapseListedFiltersBreakpoint:"xl",clearAllFilters:p},we.createElement(EE,null,we.createElement(yh,{categoryName:"hosts"},we.createElement(vh,{variant:"checkbox","aria-label":"hosts",onToggle:c,onSelect:d,selections:S(),customBadgeText:e.hosts?.length||0,isOpen:s,placeholderText:we.createElement(Sh,{text:"Hosts"}),isDisabled:l.length===0},[we.createElement(vn,{inputId:`checkbox-${Sn}`,key:Sn,value:Sn},y("ai:Select All")),we.createElement(vn,{inputId:`checkbox-${In}`,key:In,value:In},y("ai:Cluster-level events")),we.createElement(vn,{inputId:`checkbox-${bn}`,key:bn,value:bn},y("ai:Deleted hosts")),...l.map(v=>we.createElement(vn,{key:v.id,value:v.id},v.hostname))])),we.createElement(yh,{chips:e.severity.map(v=>({key:v,node:Ch(v)})),deleteChip:C,deleteChipGroup:I,categoryName:"severity"},we.createElement(vh,{variant:"checkbox","aria-label":"Severity",onToggle:m,onSelect:g,selections:e.severity,isOpen:n,placeholderText:we.createElement(Sh,{text:"Severity"})},$u.map(v=>we.createElement(vn,{"data-testid":`${v}-filter-option`,key:v,value:v},Ch(v)," ",we.createElement(HE,{isRead:!0},ME(v,r)))))),we.createElement(DE,null,we.createElement(VE,null,we.createElement(NE,{name:"search-text",id:"search-text",type:"search","aria-label":"text to be searched",onChange:h,value:e.fulltext,placeholder:y("ai:Filter by text")}),we.createElement(AE,{variant:FE.control,"aria-label":"search text button"},we.createElement(OE,null))))))},Tc=_E;var UE=(e,t=[],o)=>t.filter(r=>e.severity.length===0||e.severity.includes(r.severity)).filter(r=>!r.hostId||e.hosts.includes(r.hostId)||e.orphanedHosts&&!(o||[]).find(s=>s.id===r.hostId)).filter(r=>r.hostId||e.clusterLevel).filter(r=>!e.fulltext||(r.message||"").toLowerCase().includes(e.fulltext.toLowerCase())),GE=({events:e,cluster:t,className:o})=>{let[r,s]=Ur.useState(()=>ul(t)),i=Ur.useMemo(()=>UE(r,e,t.hosts),[r,e,t.hosts]),{t:n}=f();return Ur.createElement(Ur.Fragment,null,Ur.createElement(Tc,{filters:r,setFilters:s,cluster:t,events:e}),i.length===0&&e.length>0?Ur.createElement(bo,{icon:BE,title:n("ai:No matching events"),content:n("ai:There are no events that match the current filters. Adjust or clear the filters to view events."),primaryAction:Ur.createElement(WE,{variant:zE.primary,onClick:()=>s(ul(t)),id:"empty-state-cluster-events-clear-filters-button","data-ouia-id":"button-clear-events-filter"},n("ai:Clear filters"))}):Ur.createElement(yn,{events:i,className:o}))},Pc=GE;var Ih=({onFetchEvents:e,...t})=>{let[o,r]=wc(),[s,i]=wc(0),[n,a]=wc(""),{cluster:l,hostId:p,entityKind:u,className:c}=t;$E(()=>{let m;return e({clusterId:l.id,hostId:p},g=>{r(g),a(""),m=setTimeout(()=>i(Date.now()),Wu)},a),()=>clearTimeout(m)},[s,l.id,p,e]);let d=xn.useCallback(()=>{i(Date.now())},[i]);return n?xn.createElement(_,{title:n,fetchData:d}):o?u==="cluster"?xn.createElement(Pc,{events:o,cluster:l,className:c}):xn.createElement(yn,{events:o,className:c}):xn.createElement(z,null)};import{Trans as ZE}from"react-i18next";var bh=({ButtonComponent:e=ht,onFetchEvents:t,onClick:o,hostId:r,cluster:s,entityKind:i,children:n,title:a,fallbackEventsURL:l,...p})=>{let[u,c]=Et.useState(!1),d=()=>c(!1);return Et.createElement(Et.Fragment,null,Et.createElement(e,{...p,onClick:o||(()=>c(!0))},n||a),Et.createElement(kn,{title:a,isOpen:u,onClose:d,hostId:r,cluster:s,entityKind:i,onFetchEvents:t,fallbackEventsURL:l}))},kn=({onFetchEvents:e,hostId:t,cluster:o,entityKind:r,onClose:s,isOpen:i,title:n,fallbackEventsURL:a})=>{let{t:l}=f();return Et.createElement(YE,{title:n,isOpen:i,"aria-label":l("ai:Displays events"),hasNoBodyWrapper:!0,actions:[Et.createElement(qE,{key:"close",variant:jE.primary,onClick:s},l("ai:Close"))],onClose:s,variant:RE.large,className:"events-modal"},Et.createElement(KE,{className:"events-modal__body"},a?Et.createElement(_,{title:l("ai:Could not load events"),content:Et.createElement(Et.Fragment,null,Et.createElement(ZE,{t:l},"ai:Could not load events from the standard location. You can check the events in the ",Et.createElement(ot,{href:a},"raw format"),".")),icon:XE,iconColor:JE.value}):Et.createElement(Ih,{hostId:t,cluster:o,entityKind:r,onFetchEvents:e,className:"events-modal__event-list"})))};import{MonitoringIcon as eA}from"@patternfly/react-icons";var tA=({cluster:e,onFetchEvents:t})=>xh.createElement(bh,{id:"cluster-events-button",entityKind:"cluster",icon:xh.createElement(eA,null),cluster:e,title:"Cluster Events",variant:QE.secondary,onFetchEvents:t},"View Cluster Events"),Gr=tA;var $r=({alerts:e,errors:t,onNext:o,onBack:r,onCancel:s,isNextDisabled:i,isBackDisabled:n,leftExtraActions:a,isSubmitting:l,submittingText:p,nextButtonText:u,cluster:c,onFetchEvents:d})=>{let{t:m}=f();return p=p||m("ai:Saving changes..."),ut(iA,{hasGutter:!0},e&&ut(Ac,null,e),t&&ut(Ac,null,t),ut(Ac,null,ut(oA,{"data-testid":"wizard-step-actions"},a,o&&ut(Tn,null,ut(Dc,{variant:Ec.primary,name:"next",onClick:o,isDisabled:i},u||m("ai:Next"))),r&&ut(Tn,null,ut(Dc,{variant:Ec.secondary,name:"back",onClick:r,isDisabled:n},m("ai:Back"))),ut(Tn,null,ut(Dc,{variant:Ec.link,name:"cancel",onClick:s,isDisabled:!1},m("ai:Cancel"))),l&&ut(Tn,null,ut(nA,{component:aA.small},ut(rA,{size:"sm"})," ",p)),ut(sA,{isFilled:!0}),c&&d&&ut(Tn,null,ut(Gr,{cluster:c,onFetchEvents:d})))))};import kh from"react";var ee=({condition:e=!1,children:t})=>e?kh.createElement(kh.Fragment,null,t):null;import Si from"react";import{DropdownItem as lA,DropdownToggle as pA,Dropdown as uA}from"@patternfly/react-core";import{CaretDownIcon as cA}from"@patternfly/react-icons";var Th=({current:e,defaultValue:t,items:o,setValue:r,isDisabled:s,idPrefix:i,position:n,menuAppendTo:a})=>{let[l,p]=Si.useState(!1),u=o.map(({value:m,label:g,description:h})=>Si.createElement(lA,{key:m,id:m,description:h},g)),c=Si.useCallback(m=>{r(m?.currentTarget.id),p(!1)},[r,p]),d=Si.useMemo(()=>Si.createElement(pA,{onToggle:m=>p(!s&&m),toggleIndicator:cA,isDisabled:s,id:i?`${i}-dropdown-toggle-items`:void 0,className:"role-dropdown"},e||t),[p,e,s,t,i]);return Si.createElement(uA,{onSelect:c,dropdownItems:u,toggle:d,isOpen:l,isPlain:!0,id:i?`${i}-dropdown-toggle`:void 0,position:n,menuAppendTo:a})};import Go from"react";import{TextContent as dA,TextList as Ph,TextListVariants as wh,TextListItem as cl,TextListItemVariants as dl,Text as mA}from"@patternfly/react-core";var It=({children:e,title:t,titleComponent:o="h2"})=>Go.createElement(dA,null,t&&Go.createElement(mA,{component:o},t),Go.createElement(Ph,{component:wh.dl,className:"detail-list"},e)),A=({title:e,value:t="",idPrefix:o,testId:r,isHidden:s=!1,classNameValue:i})=>s?null:Go.createElement(Go.Fragment,null,Go.createElement(cl,{component:dl.dt,id:o?`${o}-title`:void 0,"data-testid":r?`${r}-title`:void 0},e),Go.createElement(cl,{component:dl.dd,id:o?`${o}-value`:void 0,"data-testid":r?`${r}-value`:void 0,className:i},Array.isArray(t)?Go.createElement(Ph,{component:wh.dl},t.map((n,a)=>[Go.createElement(cl,{"data-testid":r?`${r}-title-${a}`:void 0,key:n.title,component:dl.dt},n.title),Go.createElement(cl,{"data-testid":r?`${r}-value-${a}`:void 0,key:`dd-${n.title}`,component:dl.dd},n.value)])):t));import ml from"react";import{WizardNavItem as fA}from"@patternfly/react-core";import{ExclamationCircleIcon as gA}from"@patternfly/react-icons";import{global_danger_color_100 as hA}from"@patternfly/react-tokens";var CA=(e,t,o,r)=>!o&&!r&&!t()?ml.createElement(ml.Fragment,null,e,ml.createElement(gA,{className:"wizard-nav-item-warning-icon",color:hA.value,size:"sm"})):e,yA=({isValid:e=()=>!0,children:t,...o})=>{let{content:r,isDisabled:s,isCurrent:i}=o;return ml.createElement(fA,{...o,content:CA(r,e,s,i)},t)},fl=yA;import Fc from"react";import{AlertGroup as DA,AlertActionCloseButton as EA,Alert as AA}from"@patternfly/react-core";import As from"react";var Eh={};lr(Eh,{alertsSlice:()=>qr,dialogsSlice:()=>gl});import{v4 as vA}from"uuid";import{createSlice as SA}from"@reduxjs/toolkit";import{AlertVariant as IA}from"@patternfly/react-core";var Dh=[],qr=SA({initialState:Dh,name:"alerts",reducers:{addAlert:(e,t)=>[{key:vA(),variant:IA.danger,...t.payload},...e],removeAlert:(e,t)=>e.filter(o=>o.key!==t.payload),clearAlerts:()=>Dh}});import{createSlice as bA}from"@reduxjs/toolkit";var xA={},gl=bA({initialState:xA,name:"alerts",reducers:{openDialog:(e,t)=>(e[t.payload.dialogId]=t.payload.data||{},e),closeDialog:(e,t)=>(e[t.payload.dialogId]=void 0,e)}});var{addAlert:kA,removeAlert:TA,clearAlerts:PA}=qr.actions,wA=qr.reducer,Ah=As.createContext(null),$o=({children:e})=>{let[t,o]=As.useReducer(wA,[]),r={alerts:t,addAlert:As.useCallback(s=>o(kA(s)),[]),removeAlert:As.useCallback(s=>o(TA(s)),[]),clearAlerts:As.useCallback(()=>o(PA()),[])};return As.createElement(Ah.Provider,{value:r},e)},N=()=>{let e=As.useContext(Ah),{t}=f();if(!e)throw new Error(t("ai:useAlerts must be used within AlertsContextProvider"));return e};var FA=({className:e})=>{let{alerts:t,removeAlert:o}=N(),r=s=>o(s.key);return t.length?Fc.createElement(DA,{className:e},t.map(s=>Fc.createElement(AA,{actionClose:Fc.createElement(EA,{onClose:()=>r(s)}),isInline:!0,...s},s.message))):null},gr=FA;import Pn from"react";import VA,{defaultProps as NA}from"prism-react-renderer";import{Text as HA,TextVariants as OA,ClipboardCopy as LA,clipboardCopyFunc as MA}from"@patternfly/react-core";import _A from"prism-react-renderer/themes/github";var WA=({code:e,language:t="bash",theme:o=_A,copiable:r=!1})=>Pn.createElement(VA,{...NA,code:e,language:t,theme:o},({className:s,style:i,tokens:n,getLineProps:a,getTokenProps:l})=>Pn.createElement(HA,{component:OA.pre,className:s,style:i},r&&Pn.createElement(LA,{isReadOnly:!0,variant:"inline-compact",onCopy:p=>MA(p,e),style:{float:"right",background:"inherit"}}),n.map((p,u)=>Pn.createElement("div",{key:u,...a({line:p,key:u})},p.map((c,d)=>Pn.createElement("span",{key:d,...l({token:c,key:d})})))))),ct=WA;import zA from"react";var BA=e=>zA.createElement("div",{...e,className:"pf-c-form"}),wn=BA;import{createElement as En}from"react";import{Alert as UA,AlertVariant as GA,Progress as $A,ProgressMeasureLocation as qA,Stack as YA,StackItem as Fh}from"@patternfly/react-core";var jA=({error:e,progress:t})=>{let{t:o}=f();return En(YA,{hasGutter:!0},e&&En(Fh,null,En(UA,{variant:GA.danger,title:e.title,isInline:!0},e.message)),t!==null&&En(Fh,null,En($A,{value:t,measureLocation:qA.outside,"aria-label":o("ai:Progress")})))},Dn=jA;import{createElement as Vc}from"react";import{Modal as RA,Button as Vh,ModalVariant as KA}from"@patternfly/react-core";var XA=({title:e,titleIconVariant:t,content:o,confirmationButtonText:r="Yes",confirmationButtonVariant:s="danger",onClose:i,onConfirm:n})=>{let{t:a}=f();return Vc(RA,{title:e,titleIconVariant:t,isOpen:!0,onClose:i,variant:KA.small,actions:[Vc(Vh,{"data-testid":"confirm-modal-submit",key:"confirm",variant:s,onClick:n},r),Vc(Vh,{key:"cancel",variant:"link",onClick:i},a("ai:Cancel"))]},o)},Fs=XA;import Nh from"react";import{Text as JA,TextContent as ZA}from"@patternfly/react-core";var QA=({children:e})=>Nh.createElement(ZA,null,Nh.createElement(JA,{component:"h2"},e)),Xe=QA;import hl from"react";import{WizardBody as eF}from"@patternfly/react-core";import{css as Hh}from"@patternfly/react-styles";import Oh from"@patternfly/react-styles/css/components/Wizard/wizard";var tF=({navigation:e,footer:t,children:o})=>hl.createElement("div",{className:Hh(Oh.wizardOuterWrap,"cluster-wizard-step")},hl.createElement("div",{className:Hh(Oh.wizardInnerWrap)},e,hl.createElement(eF,{"aria-labelledby":"step-id",hasNoBodyPadding:!1},o)),t&&hl.createElement("div",{className:"pf-c-wizard__footer cluster-wizard-step__footer"},t)),ye=tF;import nF from"lodash/values";import At from"react";import{Alert as Gh,AlertGroup as aF,AlertVariant as $h,Flex as lF,FlexItem as Hc,List as pF,ListItem as uF}from"@patternfly/react-core";import Lh from"lodash/values";import Mh from"lodash/keys";import _h from"lodash/reduce";var Wh=({validationId:e,hostGroup:t,clusterGroup:o},r)=>Mh(r).find(i=>{let{cluster:n,host:a}=r[i];return n.validationIds.includes(e)||a.validationIds.includes(e)||o&&n.groups.includes(o)||t&&a.groups.includes(t)}),oF=(e,t)=>{let o=Lh(e).flat().filter(r=>r&&t.includes(r.id));return o.length===t.length&&o.every(r=>r?.status==="disabled"||r?.status==="success")},rF=(e,t,o)=>t.every(r=>e[r]?.every(s=>s.status==="disabled"||s.status==="success"||o.includes(s.id))),Nc=(e,t)=>{let o=Lh(e).flat().filter(r=>r&&t.includes(r.id));return o.length===t.length&&o.every(r=>r?.status==="disabled"||r?.status==="success")},sF=(e,t,o)=>t.every(r=>e[r]?.every(s=>s.status==="disabled"||s.status==="success"||o.includes(s.id))),An=(e,t,o)=>{let{groups:r,validationIds:s}=o[t].host;return _h(e,(i,n,a)=>{if(r.includes(a))return i[a]=n,i;let l=(n||[]).filter(p=>s.includes(p.id));return l.length&&(i[a]=l),i},{})},Fn=(e,t,o)=>{let{status:r}=o;if(["insufficient","pending-for-input"].includes(r)){let{softValidationIds:s}=t[e],i=(typeof o.validationsInfo=="string"?O(o.validationsInfo):o.validationsInfo)||{},{groups:n,validationIds:a}=t[e].host;return sF(i,n,s)&&Nc(i,a)?"known":r}return r},zh=(e,t,o)=>{let{groups:r,validationIds:s}=o[t].cluster;return _h(e,(i,n,a)=>{if(r.includes(a))return i[a]=n,i;let l=(n||[]).filter(p=>s.includes(p.id));return l.length&&(i[a]=l),i},{})},Yr=(e,t,o,r=[])=>{let{status:s}=o;if(["insufficient","pending-for-input"].includes(s)){let i=(typeof o.validationsInfo=="string"?O(o.validationsInfo):o.validationsInfo)||{},{groups:n,validationIds:a}=t[e].cluster,{softValidationIds:l}=t[e],{allowedStatuses:p}=t[e].host;return r.every(c=>p.length===0||p.includes(Fn(e,t,c)))&&rF(i,n,l)&&oF(i,a)?"ready":s}return s},Bh=e=>Object.keys(e).reduce((t,o)=>[...t,...e[o].softValidationIds],[]),iF=e=>Object.keys(e).reduce((t,o)=>{let r=e[o].filter(s=>s.status==="failure");return[...t,...r]},[]),Cl=(e,t,o)=>{let r=An(e,t,o),s=iF(r).map(i=>i.id);if(!s.length)return!1;for(let i of s)if(!o[t].softValidationIds.includes(i))return!1;return!0},Uh=(e,t,o)=>{let r=Mh(t),s=!0;return r.find(i=>{if(i===o&&(s=!1),s)return!1;let{host:n}=t[i];return n.validationIds.includes(e)})};var cF=({currentStepId:e,clusterStatus:t,validationsInfo:o,hosts:r,wizardStepsValidationsMap:s,children:i})=>{let{failedClusterValidations:n,failedHostnameValidations:a}=At.useMemo(()=>{let u=zh(o||{},e,s),c=nF(u).flat(),d=r.some(m=>{let g=typeof m.validationsInfo=="string"?O(m.validationsInfo):m.validationsInfo;return!Nc(g||{},["hostname-valid","hostname-unique"])});return{failedClusterValidations:c.filter(m=>m?.status==="failure"),failedHostnameValidations:d}},[o,e,s,r]),l=Yr(e,s,{status:t,validationsInfo:o||{}},r)==="ready",{t:p}=f();return At.createElement(At.Fragment,null,!o&&At.createElement(Gh,{variant:$h.info,title:"Cluster validations are initializing.",isInline:!0},p("ai:Please hold on till background checks are started.")),!l&&At.createElement(aF,null,i,At.createElement(Gh,{variant:$h.warning,title:"Cluster is not ready yet.",isInline:!0},At.createElement(lF,{spaceItems:{default:"spaceItemsSm"},direction:{default:"column"}},!!n.length&&At.createElement(At.Fragment,null,At.createElement(Hc,null,p("ai:The following requirements must be met:")),At.createElement(Hc,null,At.createElement(pF,null,n.filter(Boolean).map(u=>At.createElement(uF,{key:u.id},u.message))))),a&&At.createElement(Hc,null,p("ai:The cluster is not ready yet. Some hosts have an ineligible name. To change the hostname, click on it."))))))},Oc=cF;import{Table as fN,TableBody as gN,TableVariant as hN}from"@patternfly/react-table";import{createElement as LC,useMemo as yN}from"react";import K,{Fragment as fF}from"react";import{Alert as vl,AlertGroup as gF,AlertVariant as Rh,Level as hF,LevelItem as Kh}from"@patternfly/react-core";import{global_warning_color_100 as CF,global_success_color_100 as yF}from"@patternfly/react-tokens";import{PendingIcon as vF,CheckCircleIcon as SF,ExclamationTriangleIcon as IF}from"@patternfly/react-icons";import no from"react";import{Button as Lc,ButtonVariant as Mc,Flex as qh,FlexItem as yl,Popover as dF}from"@patternfly/react-core";import{ExclamationTriangleIcon as Yh}from"@patternfly/react-icons";import{global_warning_color_100 as jh}from"@patternfly/react-tokens";var mF=({host:e,inventory:t={},onEditHostname:o,title:r,className:s,hosts:i,readonly:n=!1})=>{let a=r||Bo(e,t)||de,l=a!=="localhost",u=(i?!i.find(m=>{let g=O(m.inventory||"")||{};return m.id!==e.id&&Bo(m,g)===a}):!0)&&l,c=no.createElement(qh,{alignItems:{default:"alignItemsCenter"}},o&&!u&&no.createElement(yl,{className:"pf-u-mr-xs"},no.createElement(Yh,{color:jh.value})),no.createElement(yl,null,a)),{t:d}=f();return!n&&o?u?no.createElement(Lc,{variant:Mc.link,isInline:!0,onClick:o,className:s},c):no.createElement(dF,{headerContent:no.createElement(qh,{alignItems:{default:"alignItemsCenter"}},no.createElement(yl,{className:"pf-u-mr-xs"},no.createElement(Yh,{color:jh.value})),no.createElement(yl,null,d("ai:Hostname is not valid"))),bodyContent:d(l?"ai:Hostname is not unique":"ai:Hostname can not be localhost"),footerContent:no.createElement(Lc,{variant:Mc.link,isInline:!0,className:s,onClick:o},d("ai:Change hostname")),minWidth:"30rem",maxWidth:"50rem",hideOnOutsideClick:!0,zIndex:300},no.createElement(Lc,{variant:Mc.link,isInline:!0,className:s},c)):c},Vn=mF;var Xh=({validations:e,variant:t,title:o,actionLinks:r=[]})=>{let{t:s}=f();return K.createElement(vl,{title:o,variant:t,actionLinks:r,isInline:!0},K.createElement("ul",null,e.map(i=>K.createElement("li",{key:i.id},K.createElement("strong",null,ks(s)[i.id]||i.id,":"),"\xA0",xo(i.message)," ",i.status==="failure"&&pi(s)[i.id]))))},bF=({onEditHostname:e,host:t,hostnameValidations:o,variant:r})=>{let{t:s}=f(),i=[K.createElement(Vn,{key:"change-hostname",title:s("ai:Change hostname"),onEditHostname:e,host:t})],n=s("ai:Illegal hostname");return o.length===1?K.createElement(vl,{title:n,variant:r,actionLinks:i,isInline:!0},xo(o[0].message)):K.createElement(Xh,{title:n,validations:o,variant:r,actionLinks:i})},xF=({AdditionalNTPSourcesDialogToggleComponent:e,variant:t,validation:o})=>{let r=[K.createElement(e,{key:"add-ntp-sources"})],{t:s}=f();return K.createElement(vl,{title:s("ai:NTP synchronization failure"),variant:t,actionLinks:r,isInline:!0},xo(o.message)," ",pi(s)[o.id])},kF=({UpdateDay2ApiVipDialogToggleComponent:e,variant:t,validation:o})=>{let r=[K.createElement(e,{key:"update-api-vip"})],{t:s}=f();return K.createElement(vl,{title:s("ai:API connectivity failure"),variant:t,actionLinks:r,isInline:!0},xo(o.message))},Jh=({validations:e,title:t,variant:o,onEditHostname:r,AdditionalNTPSourcesDialogToggleComponent:s,UpdateDay2ApiVipDialogToggleComponent:i,host:n})=>{if(!e.length)return null;let a={["hostname-unique"]:void 0,["hostname-valid"]:void 0,["ntp-synced"]:void 0,["ignition-downloadable"]:void 0},l=[],p=[];for(let c of e)c.id in a&&c.status==="failure"?a[c.id]=c:p.push(c);let u=[];return a["hostname-unique"]&&u.push(a["hostname-unique"]),a["hostname-valid"]&&u.push(a["hostname-valid"]),u.length>0&&r&&l.push(K.createElement(bF,{hostnameValidations:u,variant:o,onEditHostname:r,host:n,key:"hostname-alert"})),a["ignition-downloadable"]&&i&&l.push(K.createElement(kF,{UpdateDay2ApiVipDialogToggleComponent:i,validation:a["ignition-downloadable"],variant:o,key:"ignition-downloadable-alert"})),a["ntp-synced"]&&s&&l.push(K.createElement(xF,{AdditionalNTPSourcesDialogToggleComponent:s,validation:a["ntp-synced"],variant:o,key:"ntp-sync-alert"})),p.length>0&&l.push(K.createElement(Xh,{validations:p,variant:o,title:t,key:"insufficient-alert"})),K.createElement(gF,null,l)},Zh=({validationsInfo:e,...t})=>{let{t:o}=f();return K.createElement(K.Fragment,null,Object.keys(e).map(r=>{let s=Bu(o)[r],i=e[r].filter(l=>l.status==="pending"),n=e[r].filter(l=>l.status==="failure"||l.status==="error");return K.createElement(fF,{key:r},K.createElement(hF,{className:"host-validation-groups__validation-group"},K.createElement(Kh,null,K.createElement("strong",null,s)),K.createElement(Kh,null,(()=>n.length?K.createElement(K.Fragment,null,o("ai:Failed")," ",K.createElement(IF,{color:CF.value})):i.length?K.createElement(K.Fragment,null,o("ai:Pending input")," ",K.createElement(vF,null)):K.createElement(K.Fragment,null,o("ai:Ready")," ",K.createElement(SF,{color:yF.value})))())),!n.length&&K.createElement(Jh,{variant:Rh.info,title:o("ai:Pending validations:"),validations:i,...t}),K.createElement(Jh,{variant:Rh.warning,title:o("ai:Failed validations:"),validations:n,...t}))}))};import Qh from"react";import AF from"react";import{useCallback as TF,useEffect as PF,useRef as wF,useState as DF}from"react";var EF=e=>{let t=wF(!1);PF(()=>(t.current=!0,()=>{t.current=!1}),[]);let[o,r]=DF(e),s=TF(i=>{t.current&&r(i)},[]);return[o,s]},qo=EF;import{useRef as YZ}from"react";import $Z from"lodash/isEqual";var FF=({host:e,onEditRole:t,current:o,position:r})=>{let[s,i]=qo(!1),n=async l=>{i(!0);try{await t(l)}finally{i(!1)}},{t:a}=f();return AF.createElement(Th,{defaultValue:xs(a)[0].value,current:o,items:xs(a),setValue:n,isDisabled:s,idPrefix:`role-${e.requestedHostname}`,position:r,menuAppendTo:()=>document.body})},_c=FF;var VF=({host:e,role:t,readonly:o=!1,onEditRole:r,position:s})=>!o&&r?Qh.createElement(_c,{host:e,onEditRole:r,current:t,position:s}):Qh.createElement("span",null,t),Sl=VF;import Kt from"react";import{Popover as NF,Level as Wc,LevelItem as Ii}from"@patternfly/react-core";var HF=({cluster:e,inParenthesis:t=!1,valueId:o="hosts-count"})=>{let{t:r}=f(),s=Kt.createElement(Kt.Fragment,null,"readyHostCount"in e&&Kt.createElement(Wc,null,Kt.createElement(Ii,null,r("ai:Ready for the installation")),Kt.createElement(Ii,null,Ra(e))),"enabledHostCount"in e&&Kt.createElement(Wc,null,Kt.createElement(Ii,null,r("ai:Enabled for the installation")),Kt.createElement(Ii,null,fn(e))),Kt.createElement(Wc,null,Kt.createElement(Ii,null,r("ai:All discovered")),Kt.createElement(Ii,null,gn(e)))),i="enabledHostCount"in e?fn(e):gn(e);return Kt.createElement(NF,{headerContent:r("ai:Hosts in the cluster"),bodyContent:s},Kt.createElement("a",{id:o},t&&"(",i,t&&")"))},Nn=HF;import H from"react";import{Popover as qF,Button as YF,Text as On,TextContent as bi,FlexItem as bl,Flex as sC,Stack as jF,StackItem as RF}from"@patternfly/react-core";import KF from"human-date";import OF from"react";import{Progress as LF,ProgressVariant as eC,ProgressMeasureLocation as tC,ProgressSize as MF}from"@patternfly/react-core";var _F=e=>{switch(e){case"cancelled":case"error":return eC.danger;case"installed":return eC.success;default:return}},WF=e=>e==="installed"?tC.none:tC.top,zF=({host:e})=>{let{status:t}=e,o=mn(e),{currentStage:r,progressInfo:s}=uc(e),i=ja(e),n=`${r}${s?`: ${s}`:" "}`;return OF.createElement(LF,{title:n,value:i,min:1,max:o.length,label:`Step ${i} of ${o.length}`,valueText:`Step ${i} of ${o.length}: ${n}`,variant:_F(t),measureLocation:WF(t),size:MF.sm})},Hn=zF;import zc from"react";import{ExternalLinkAltIcon as BF}from"@patternfly/react-icons";import{Button as UF,ButtonVariant as GF}from"@patternfly/react-core";import oC from"react";var jr=oC.createContext({}),Il=({cluster:e,resetCluster:t,ocpConsoleUrl:o,children:r})=>oC.createElement(jr.Provider,{value:{cluster:e,resetCluster:t,ocpConsoleUrl:o}},r);var $F=({id:e,title:t="OpenShift console"})=>{let{ocpConsoleUrl:o}=zc.useContext(jr)||{};return o?zc.createElement(UF,{variant:GF.link,onClick:()=>window.open(Vu(o),"_blank","noopener noreferrer"),id:e},t," ",zc.createElement(BF,null)):null},rC=$F;import{UnknownIcon as XF}from"@patternfly/react-icons";var JF=(e,t)=>{let o=mn(e),r=ja(e);return t.withProgress?`${t.title} ${r}/${o.length}`:t.title},ZF=({details:e,autoCSR:t,additionalPopoverContent:o,...r})=>{let{host:s}=r,{status:i,statusInfo:n}=s,{t:a}=f();return["installing-in-progress"].includes(i)?H.createElement(bi,null,H.createElement(Hn,{host:s})):["error","cancelled","installing-pending-user-action"].includes(i)?H.createElement(bi,null,H.createElement(On,null,e,H.createElement("br",null),xo(n)),H.createElement(Hn,{host:s})):["installed"].includes(i)?H.createElement(bi,null,H.createElement(On,null,e),H.createElement(Hn,{host:s})):["added-to-existing-cluster"].includes(i)?H.createElement(bi,null,H.createElement(On,null,e),!t&&H.createElement(H.Fragment,null,H.createElement("br",null),a("ai:To finish adding nodes to the cluster, approve the join request inside OpenShift Console's Nodes section."),H.createElement("br",null),a("ai:It may take a few minutes for the join request to appear."),H.createElement("br",null),a("ai:If you prefer using the CLI, follow the instructions in"),"\xA0",H.createElement(ot,{href:_u},a("ai:How to approve nodes using the CLI"))),H.createElement(Hn,{host:s})):["preparing-for-installation","preparing-successful","installing","unbinding-pending-user-action","binding","unbinding","reclaiming","reclaiming-rebooting"].includes(i)?H.createElement(bi,null,H.createElement(On,null,e)):H.createElement(jF,{hasGutter:!0},o,H.createElement(RF,null,e&&H.createElement(bi,null,H.createElement(On,null,e)),H.createElement(Zh,{...r})))},QF=({host:e})=>{let{progress:t,statusUpdatedAt:o}=e,{t:r}=f();if(e.status==="added-to-existing-cluster")return H.createElement(rC,{id:`host-status-detail-link-to-ocp-nodes-${e.requestedHostname||e.id}`});let s;return e.status==="installing-in-progress"?t?.stageUpdatedAt&&t.stageUpdatedAt!==t.stageStartedAt?s=r("ai:Step started at {{startedAt}}, updated {{updatedAt}}",{startedAt:jt(t.stageStartedAt),updatedAt:KF.relativeTime(t.stageUpdatedAt)}):s=r("ai:Step started at {{startedAt}}",{startedAt:jt(t?.stageStartedAt||o)}):o&&(s=r("ai:Status updated at {{humanizedDataTime}}",{humanizedDataTime:jt(o)})),H.createElement(H.Fragment,null,!!s&&H.createElement("small",null,s))},iC=e=>H.createElement(qF,{headerContent:H.createElement("div",null,e.title),bodyContent:H.createElement(ZF,{...e}),footerContent:H.createElement(QF,{host:e.host}),minWidth:"30rem",maxWidth:"50rem",hideOnOutsideClick:e.hideOnOutsideClick,zIndex:e.zIndex||300},H.createElement(YF,{variant:"link",isInline:!0,isSmall:e.isSmall},e.children)),eV=({host:e,validationsInfo:t,status:o,onEditHostname:r,AdditionalNTPSourcesDialogToggleComponent:s,UpdateDay2ApiVipDialogToggleComponent:i,children:n,zIndex:a,autoCSR:l,additionalPopoverContent:p})=>{let[u,c]=H.useState(!1),d=H.useCallback(()=>{c(!u),r?.()},[u,r]),{title:m,icon:g,sublabel:h,details:C,noPopover:I}=o,S=JF(e,o),y={hideOnOutsideClick:!u,host:e,onEditHostname:d,AdditionalNTPSourcesDialogToggleComponent:s,title:m,validationsInfo:t,details:C,UpdateDay2ApiVipDialogToggleComponent:i,zIndex:a,autoCSR:l,additionalPopoverContent:p};return H.createElement(sC,{alignItems:{default:"alignItemsCenter"},spaceItems:{default:"spaceItemsXs"}},H.createElement(bl,null,g||H.createElement(XF,null)),H.createElement(sC,{direction:{default:"column"},spaceItems:{default:"spaceItemsXs"}},!n&&!h&&!I?H.createElement(iC,{...y},S):H.createElement(bl,null,S),n&&H.createElement(bl,null,n),h&&H.createElement(bl,{className:"pf-u-font-size-xs",style:{marginTop:"calc(-1 * var(--pf-l-flex--spacer--xs))"}},H.createElement(iC,{...y},h))))},Vs=eV;import uC from"react";import{Modal as cV,ModalVariant as dV}from"@patternfly/react-core";import Ft from"react";import{object as uV}from"yup";import{Button as nC,ButtonVariant as tV,ButtonType as oV,Form as rV,ModalBoxBody as sV,ModalBoxFooter as iV,AlertVariant as aC,Alert as lC,AlertActionCloseButton as nV}from"@patternfly/react-core";import{Formik as aV}from"formik";var lV=(e,t,o=[])=>uV().shape({hostname:ol(e,o,t.hostname)}),pV=({host:e,inventory:t,usedHostnames:o,onCancel:r,onSave:s,onFormSaveError:i})=>{let n=Ft.useRef();Ft.useEffect(()=>{n.current?.focus(),n.current?.select()},[]);let{requestedHostname:a}=e,{hostname:l}=t,p={hostId:e.id,hostname:a||""},{t:u}=f();return Ft.createElement(aV,{validateOnMount:!0,initialValues:p,initialStatus:{error:null},validate:ni(lV(u,p,o)),onSubmit:async(c,d)=>{if(c.hostname===p.hostname){r();return}try{await s(c),r()}catch(m){let g=i&&i(m)||u("ai:Host update failed.");d.setStatus({error:{title:u("ai:Failed to update host"),message:g}})}}},({handleSubmit:c,status:d,setStatus:m,isSubmitting:g,isValid:h,dirty:C})=>Ft.createElement(rV,{onSubmit:c},Ft.createElement(sV,null,Ft.createElement(wn,null,d.error&&Ft.createElement(lC,{variant:aC.danger,title:d.error.title,actionClose:Ft.createElement(nV,{onClose:()=>m({error:null})}),isInline:!0},d.error.message),Ft.createElement(lC,{variant:aC.info,title:u("ai:This name will replace the original discovered hostname."),isInline:!0}),Ft.createElement(al,{name:"discoveredHostname",label:"Discovered hostname"},l||""),Ft.createElement(ws,{label:u("ai:New hostname"),name:"hostname",ref:n,isRequired:!0,isDisabled:!Mg(e.status),richValidationMessages:Br(u)}))),Ft.createElement(iV,null,Ft.createElement(nC,{key:"submit",type:oV.submit,isDisabled:g||!h||!C},u("ai:Change")),Ft.createElement(nC,{key:"cancel",variant:tV.link,onClick:r},u("ai:Cancel")))))},pC=pV;var mV=({isOpen:e,host:t,inventory:o,usedHostnames:r,onClose:s,onSave:i,onFormSaveError:n})=>t&&o?uC.createElement(cV,{"aria-label":"Change hostname dialog",title:"Change hostname",isOpen:e,onClose:s,variant:dV.small,hasNoBodyWrapper:!0},uC.createElement(pC,{host:t,inventory:o,usedHostnames:r,onCancel:s,onSave:i,onFormSaveError:n})):null,Bc=mV;import{List as eee,ListItem as tee,TextContent as oee}from"@patternfly/react-core";import{Fragment as pee,createElement as lee}from"react";import dt from"react";import{Button as fV,ButtonVariant as gV,Popover as hV,Text as xi,TextContent as CV,TextVariants as Ln}from"@patternfly/react-core";import{InfoCircleIcon as yV}from"@patternfly/react-icons";import{Trans as vV}from"react-i18next";var SV=()=>{let{t:e}=f();return dt.createElement(CV,null,dt.createElement(xi,{component:Ln.p},e("ai:Your libvirt virtual machines should be configured to restart automatically after a reboot. You can check this by running:")),dt.createElement(ct,{code:"virsh dumpxml <name> | grep on_reboot"}),dt.createElement(xi,{component:Ln.p},e("ai:And verify that this is the output:")),dt.createElement(ct,{code:"<on_reboot>restart</on_reboot>"}),dt.createElement(xi,{component:Ln.p},e("ai:If not, please start your VMs with the following configuration:")),dt.createElement(ct,{code:"--events on_reboot=restart"}),dt.createElement(xi,{component:Ln.p},dt.createElement(vV,{t:e,components:{code:dt.createElement("code",null)},i18nKey:"ai:When using <code>{{executionCommand}}</code>, please run:",values:{executionCommand:"virt-install"}})),dt.createElement(ct,{code:"virt-install --wait -1 <rest of the command>"}),dt.createElement(xi,{component:Ln.p},e("ai:Otherwise, the VMs will not be able to reboot during the installation process.")))},IV=()=>{let{t:e}=f();return dt.createElement(xi,{component:"p"},dt.createElement(hV,{bodyContent:dt.createElement(SV,null),minWidth:"35rem"},dt.createElement(fV,{variant:gV.link,isInline:!0},dt.createElement(yV,{size:"sm"}),"\xA0",e("ai:Check your VM reboot configuration"))))},Uc=IV;import{createElement as Ct,useCallback as CC,useEffect as AV,useState as hC}from"react";import{Dropdown as cC,DropdownItem as dC,DropdownToggle as mC,DropdownToggleCheckbox as bV,Pagination as xV,Split as kV,SplitItem as fC,Toolbar as TV,ToolbarContent as PV,ToolbarItem as gC,Tooltip as wV}from"@patternfly/react-core";import{CaretDownIcon as DV}from"@patternfly/react-icons";var EV=({itemIDs:e,selectedIDs:t,setSelectedIDs:o,actions:r,showPagination:s,clearAllFilters:i,children:n,...a})=>{let[l,p]=hC(!1),[u,c]=hC(!1),d=CC(()=>c(!u),[u]),m=CC(()=>p(!l),[l]);AV(()=>{t.every(v=>e.includes(v))||o(t.filter(v=>e.includes(v)))},[t,e,o]);let g=!1;t.length&&(g=t.length===e.length&&e.every(v=>t.includes(v))?!0:null);let h=g===!1,C=Ct(cC,{onSelect:m,toggle:Ct(mC,{onToggle:m,toggleIndicator:DV,isDisabled:h},"Actions"),isOpen:l,dropdownItems:r}),I=()=>o(e),S=()=>o([]),{t:y}=f();return Ct(kV,{hasGutter:!0},Ct(fC,{isFilled:!0},Ct(TV,{className:"table-toolbar",clearAllFilters:i},Ct(PV,{className:"table-toolbar__content"},Ct(gC,null,Ct(cC,{onSelect:d,toggle:Ct(mC,{splitButtonItems:[Ct(bV,{id:"select-checkbox",key:"select-checkbox","aria-label":y("ai:Select all"),onChange:v=>v?I():S(),isChecked:g},t.length," ",y("ai:selected"))],onToggle:d}),isOpen:u,dropdownItems:[Ct(dC,{key:"select-all",onClick:I},y("ai:Select all")),Ct(dC,{key:"select-none",onClick:S},y("ai:Select none"))]})),n,Ct(gC,null,h?Ct(wV,{content:"Select one or more hosts"},C):C)))),s&&Ct(fC,null,Ct(xV,{itemCount:e.length,...a,isCompact:!0})))},Gc=EV;import{createElement as vC}from"react";import{DropdownItem as yC}from"@patternfly/react-core";var $c=({onChangeHostname:e})=>vC(yC,{onClick:e},"Change hostname"),qc=({onDeleteHost:e})=>vC(yC,{onClick:e},"Delete");import{createElement as X,useCallback as ZV,useEffect as JV,useRef as TC,useState as QV}from"react";import{Button as Yc,ButtonType as FV,ButtonVariant as VV,Form as NV,HelperText as HV,HelperTextItem as OV,Modal as LV,ModalBoxBody as MV,ModalBoxFooter as _V,Popover as WV,Split as zV,SplitItem as jc,Stack as BV,StackItem as xl}from"@patternfly/react-core";import{Formik as UV,useFormikContext as GV}from"formik";import{object as XV}from"yup";import{global_palette_blue_300 as $V}from"@patternfly/react-tokens/dist/js/global_palette_blue_300";import{InfoCircleIcon as qV}from"@patternfly/react-icons";var SC=e=>{let t=He(e);return Bo(e,t)||""},IC=(e,t)=>t.hostname.replace(/{{n+}}/g,`${e+1}`),bC=(e,t,o)=>{let r=0;return t.map(s=>{let[i,n]=o(s),a={newHostname:i?IC(r,e):void 0,reason:i?void 0:n};return i&&r++,a})},xC={hostname:""},YV=(e,t,o)=>XV().shape({hostname:ol(o,t,e.hostname).required(o("ai:Required field"))}),kC=(e,t)=>(e={...e||{},hostname:(e?.hostname||[]).concat(t)},e),jV=(e,t,o,r,s)=>async i=>{let n=bC(i,e,r).filter(p=>!p.reason).map(({newHostname:p})=>p),a=t.reduce((p,u)=>(e.find(c=>c.id===u.id)||p.push(SC(u)),p),[]),l=await ni(o)({...i,hostname:n[0]||""});return(n.some(p=>a.includes(p||""))||new Set(n).size!==n.length)&&(l=kC(l,Br(s).NOT_UNIQUE)),n.some(p=>Za.includes(p||""))&&(l=kC(l,Br(s).LOCALHOST_ERR)),l},RV=({selectedHosts:e,isOpen:t,patchingHost:o,onClose:r,canChangeHostname:s})=>{let{values:i,handleSubmit:n,isSubmitting:a,status:l,isValid:p}=GV(),u=TC(),c=TC(e);JV(()=>{t&&u.current?.focus()},[t]),ZV(()=>{a||(c.current=e)},[e,a]);let d=c.current,m=bC(i,d,s),{t:g}=f();return X(NV,{onSubmit:n},X(MV,null,X(BV,{hasGutter:!0},X(xl,null,X("div",null,g("ai:Rename hostnames using the custom template:")),X("div",null,X("strong",null,"{{n}}")," ",g("ai:to add a number."))),X(xl,null,X(ws,{name:"hostname",ref:u,isRequired:!0,richValidationMessages:Br(g)}),X(HV,null,X(OV,{variant:"indeterminate"},g("ai:For example: host-{{n}}",{interpolation:{suffix:"###",prefix:"###"}})))),X(xl,null,g("ai:Preview"),X("div",{className:"hostname-preview"},d.map((h,C)=>{let{newHostname:I,reason:S}=m[C];return X(zV,{key:h.id||C,hasGutter:!0},X(jc,{className:"hostname-column"},X("div",{className:"hostname-column__text"},X("strong",null,SC(h)))),X(jc,null,X("div",null,X("strong",null,">"))),X(jc,{isFilled:!0},S?X(WV,{"aria-label":g("ai:Cannot change hostname popover"),headerContent:X("div",null,g("ai:Hostname cannot be changed")),bodyContent:X("div",null,S)},X(Yc,{variant:"link",icon:X(qV,{color:$V.value}),isInline:!0},g("ai:Not changeable"))):I||g("ai:New hostname will appear here...")))}))),X(xl,null,X(Dn,{error:l?.error,progress:a?100*(o+1)/d.length:null})))),X(_V,null,X(Yc,{key:"submit",type:FV.submit,isDisabled:a||!p},g("ai:Change")),X(Yc,{onClick:r,variant:VV.secondary,isDisabled:a},g("ai:Cancel"))))},KV=({isOpen:e,onClose:t,selectedHostIDs:o,hosts:r,onChangeHostname:s,canChangeHostname:i})=>{let[n,a]=QV(0),l=r.filter(u=>o.includes(u.id)),{t:p}=f();return X(LV,{"aria-label":p("ai:Change hostnames dialog"),title:p("ai:Change hostnames"),isOpen:e,onClose:t,hasNoBodyWrapper:!0,id:"mass-change-hostname-modal",variant:"small"},X(UV,{initialValues:xC,validate:jV(l,r,YV(xC,[],p),i,p),onSubmit:async(u,c)=>{let d=0;try{for(let m of l){a(d);let g=IC(d,u);await s(m,g),d++}t()}catch(m){c.setStatus({error:{title:p("ai:Failed to update host"),message:D(m)}})}}},X(RV,{isOpen:e,selectedHosts:l,patchingHost:n,onClose:t,canChangeHostname:i})))},Rc=KV;import{createElement as Yo,useState as DC}from"react";import{Button as PC,ButtonVariant as wC,Modal as eN,ModalBoxBody as tN,ModalBoxFooter as oN,Stack as rN,StackItem as Kc}from"@patternfly/react-core";var sN=({isOpen:e,onClose:t,onDelete:o,hosts:r,children:s})=>{let[i,n]=DC(null),[a,l]=DC(),{t:p}=f(),u=async()=>{l(void 0);let c=0;try{for(let d of r)n(100*(c+1)/r.length),await o(d);n(null),t()}catch(d){l({title:p("ai:Failed to delete host"),message:Ge(d)}),n(null)}};return Yo(eN,{"aria-label":p("ai:Delete hosts dialog"),title:p("ai:Delete hosts"),isOpen:e,onClose:t,hasNoBodyWrapper:!0,id:"mass-delete-modal",variant:"medium",titleIconVariant:"warning"},Yo(tN,null,Yo(rN,{hasGutter:!0},Yo(Kc,null,p("ai:You are deleting multiple resources. All resources listed below will be deleted if you continue. This action cannot be undone.")),Yo(Kc,null,s),Yo(Kc,null,Yo(Dn,{error:a,progress:i})))),Yo(oN,null,Yo(PC,{onClick:u,isDisabled:i!==null,variant:wC.danger},p("ai:Delete hosts")),Yo(PC,{onClick:t,variant:wC.secondary,isDisabled:i!==null},p("ai:Cancel"))))},Xc=sN;import{createElement as ve}from"react";import{AddCircleOIcon as iN,BanIcon as Jc,CheckCircleIcon as EC,ConnectedIcon as AC,DisconnectedIcon as FC,ExclamationCircleIcon as nN,ExclamationTriangleIcon as kl,InProgressIcon as hr,LinkIcon as aN,PendingIcon as lN,PlusIcon as pN}from"@patternfly/react-icons";import{global_danger_color_100 as uN,global_warning_color_100 as Tl,global_success_color_100 as VC,chart_color_blue_300 as cN}from"@patternfly/react-tokens";var ki=Object.freeze({"unbinding-pending-user-action":{key:"unbinding-pending-user-action",title:"Removing from cluster",category:"Discovery related",icon:ve(hr,null),details:"This host is being removed from the cluster. To finish, reboot the host with the infrastructure environment ISO."},reclaiming:{key:"reclaiming",title:"Returning to the infrastructure environment",category:"Discovery related",icon:ve(hr,null),details:"This host is being removed from the cluster."},"reclaiming-rebooting":{key:"reclaiming-rebooting",title:"Rebooting while returning to the infrastructure environment",category:"Discovery related",icon:ve(hr,null),details:"This host is being rebooted to be available for reuse in another cluster."},"preparing-failed":{key:"preparing-failed",title:"Preparing step failed",category:"Installation related",details:"Preparing step failed"},unbinding:{key:"unbinding",title:"Removing from cluster",category:"Discovery related",icon:ve(hr,null),details:"This host is being removed from the cluster."},"disabled-unbound":{key:"disabled-unbound",title:"Disabled",category:"Discovery related",icon:ve(Jc,null),details:"This host was manually removed from a cluster and can not be included in another one. Enable this host to make it available again."},"disconnected-unbound":{key:"disconnected-unbound",title:"Disconnected",category:"Discovery related",icon:ve(FC,null),details:"Ensure the host is running, responsive, and is able to contact the installer."},"discovering-unbound":{key:"discovering-unbound",title:"Discovering",category:"Discovery related",icon:ve(AC,null),details:"This host is transmitting its hardware and networking information to the installer. Please wait while this information is received."},"insufficient-unbound":{key:"insufficient-unbound",title:"Insufficient",category:"Discovery related",icon:ve(kl,{color:Tl.value}),details:"This host does not meet the minimum hardware or networking requirements and can not be included in the cluster."},"known-unbound":{key:"known-unbound",title:"Available",category:"Discovery related",icon:ve(pN,{color:cN.value}),details:"This host meets the minimum hardware and networking requirements and can be included in the cluster."},binding:{key:"binding",title:"Binding",category:"Discovery related",icon:ve(aN,null),details:"This host is being added to the cluster."},discovering:{key:"discovering",title:"Discovering",category:"Discovery related",icon:ve(AC,null),details:"This host is transmitting its hardware and networking information to the installer. Please wait while this information is received."},"pending-for-input":{key:"pending-for-input",title:"Pending input",category:"Discovery related",icon:ve(lN,null)},known:{key:"known",title:"Ready",category:"Discovery related",icon:ve(EC,{color:VC.value}),details:"This host meets the minimum hardware and networking requirements and will be included in the cluster."},disconnected:{key:"disconnected",title:"Disconnected",category:"Discovery related",icon:ve(FC,null),details:"This host has lost its connection to the installer and will not be included in the cluster unless connectivity is restored."},insufficient:{key:"insufficient",title:"Insufficient",category:"Discovery related",icon:ve(kl,{color:Tl.value}),details:"This host does not meet the minimum hardware or networking requirements and will not be included in the cluster."},disabled:{key:"disabled",title:"Disabled",category:"Discovery related",icon:ve(Jc,null),details:"This host was manually disabled and will not be included in the cluster. Enable this host to include it again."},"preparing-for-installation":{key:"preparing-for-installation",title:"Preparing for installation",category:"Installation related",icon:ve(hr,null)},"preparing-successful":{key:"preparing-successful",title:"Preparing step successful",category:"Installation related",icon:ve(hr,null)},installing:{key:"installing",title:"Starting installation",category:"Installation related",icon:ve(hr,null)},"installing-in-progress":{key:"installing-in-progress",title:"Installing",category:"Installation related",icon:ve(hr,null),withProgress:!0},"installing-pending-user-action":{key:"installing-pending-user-action",title:"Pending user action",category:"Installation related",icon:ve(kl,{color:Tl.value}),details:"This host is pending user action"},installed:{key:"installed",title:"Installed",category:"Installation related",icon:ve(EC,{color:VC.value}),details:"This host completed its installation successfully."},cancelled:{key:"cancelled",title:"Installation cancelled",category:"Installation related",icon:ve(Jc,null),details:"This host installation has been cancelled.",withProgress:!0},error:{key:"error",title:"Error",category:"Installation related",icon:ve(nN,{color:uN.value}),details:"This host failed its installation.",withProgress:!0},resetting:{key:"resetting",title:"Resetting",category:"Installation related",icon:ve(hr,null),details:"This host is resetting the installation."},"resetting-pending-user-action":{key:"resetting-pending-user-action",title:"Reboot required",category:"Installation related",icon:ve(kl,{color:Tl.value}),details:"Host already booted from disk during previous installation. To finish resetting the installation please boot the host into Discovery ISO."},"added-to-existing-cluster":{key:"added-to-existing-cluster",title:"Installed",category:"Installation related",icon:ve(iN,null),details:"This host completed its installation successfully."}});import dN from"humanize-plus";var NC=e=>e.memory?.physicalBytes||0,HC=e=>e.disks?.filter(t=>t.driveType!==Eg).reduce((t,o)=>t+(o.sizeBytes||0),0)||0,mN=e=>dN.formatNumber(e.cpu?.frequency||0),OC=e=>({cores:e.cpu?.count||0,memory:NC(e),disks:HC(e)}),Zc={title:de,sortableValue:0},Ti=e=>{let t=Zc,o=Zc,r=Zc,s=de;if(e.cpu?.count){let a=e.cpu?.flags?.includes("ht")?" (hyper-threaded)":"";s=`${e.cpu?.count} cores${a} at ${mN(e)} MHz`,t={title:e.cpu?.count.toString(),sortableValue:e.cpu?.count}}let i=NC(e);i&&(o={title:Io(i,2,"iec"),sortableValue:i});let n=HC(e);return n&&(r={title:Io(n,2,"si"),sortableValue:n}),{serialNumber:e.systemVendor?.serialNumber||de,cores:t,cpuSpeed:s,memory:o,disk:r}};var CN=({hosts:e=[]})=>{let t=yN(()=>{let o=zr(e).reduce((r,s)=>{r.count++;let i=O(s.inventory);if(i){let n=OC(i);r.cores+=n.cores,r.memory+=n.memory,r.fs+=n.disks}return r},{count:0,cores:0,memory:0,fs:0});return[{cells:["Hosts",o.count]},{cells:["Cores",o.cores]},{cells:["Memory",Io(o.memory,2,"iec")]},{cells:["Storage",Io(o.fs,2,"si")]}]},[e]);return LC(fN,{rows:t,cells:["",""],variant:hN.compact,borders:!1,"aria-label":"Cluster summary table",className:"review-hosts-table"},LC(gN,null))},Qc=CN;import We from"react";import vN from"lodash/values";import{Button as SN,ButtonVariant as IN}from"@patternfly/react-core";import{CheckCircleIcon as bN,ExclamationCircleIcon as xN,ExclamationTriangleIcon as kN}from"@patternfly/react-icons";import{global_success_color_100 as TN,global_danger_color_100 as PN,global_warning_color_100 as wN}from"@patternfly/react-tokens";import{Trans as DN}from"react-i18next";var MC=()=>{let{t:e}=f();return We.createElement(We.Fragment,null,We.createElement(bN,{color:TN.value})," ",e("ai:All validations passed"))},EN=({id:e,count:t})=>{let{t:o}=f();return We.createElement("div",{id:e},o("ai:There is still {{count}} pending validation",{count:t}))},AN=({step:e,setCurrentStepId:t,wizardStepNames:o})=>We.createElement(SN,{variant:IN.link,onClick:()=>t(e),isInline:!0},o[e]),_C=({validation:e,clusterGroup:t,hostGroup:o,severity:r="danger",setCurrentStepId:s,wizardStepNames:i,wizardStepsValidationsMap:n})=>{let{t:a}=f(),l=a("ai:{{check_failed}} check failed",{check_failed:ks(a)[e.id]||Uu(a)[e.id]||e.id}),p,u=Wh({validationId:e.id,clusterGroup:t,hostGroup:o},n);u==="review"?p=a("ai:Please wait till all validations are finished."):u?p=We.createElement(We.Fragment,null,We.createElement(DN,{t:a},"ai:It can be fixed in the"," ",We.createElement(AN,{step:u,setCurrentStepId:s,wizardStepNames:i})," ","step.")):console.error("Unknown validation ID detected in the ",t||o," group:",JSON.stringify(e));let c;return r==="warning"?c=We.createElement(kN,{color:wN.value}):c=We.createElement(xN,{color:PN.value,size:"sm"}),We.createElement("div",{id:`failing-validation-${e.id}`},c," ",l,p?".":""," ",p)},ed=({validationsInfo:e="",setCurrentStepId:t,wizardStepNames:o,wizardStepsValidationsMap:r})=>{let s=O(e)||{},i=[],n=0;return Object.keys(s).forEach(a=>{let l=p=>{p.status==="pending"&&n++,p.status==="failure"&&i.push(We.createElement(_C,{key:p.id,validation:p,clusterGroup:a,setCurrentStepId:t,wizardStepNames:o,wizardStepsValidationsMap:r}))};s[a].forEach(l)}),n&&i.unshift(We.createElement(EN,{key:"pending-validations",id:"cluster-pending-validations",count:n})),i.length===0?We.createElement(MC,null):We.createElement(We.Fragment,null,i)},td=({hosts:e=[],setCurrentStepId:t,wizardStepNames:o,allClusterWizardSoftValidationIds:r,wizardStepsValidationsMap:s})=>{let i={};zr(e).forEach(a=>{let l=O(a.validationsInfo)||{};Object.keys(l).forEach(p=>{let u=c=>{if(c.status==="failure"){let d=r.includes(c.id)?"warning":"danger";i[c.id]=i[c.id]||We.createElement(_C,{key:c.id,validation:c,hostGroup:p,severity:d,setCurrentStepId:t,wizardStepNames:o,wizardStepsValidationsMap:s})}};l[p].forEach(u)})});let n=vN(i);return n.length===0?We.createElement(MC,null):We.createElement(We.Fragment,null,n)};import{array as UC,bool as HN,boolean as NN,lazy as VN,object as od,string as GC}from"yup";var WC=()=>[{url:"",thumbprint:""}],FN=e=>{if(!e)return WC();let t=WC();try{t=JSON.parse(e)}catch{console.warn("Tang Servers can not be parsed")}return t},zC=({cluster:e,pullSecret:t,managedDomains:o,ocpVersions:r,baseDomain:s})=>{let{name:i="",highAvailabilityMode:n="Full",baseDnsDomain:a=s||"",openshiftVersion:l=Xf(r)}=e||{};return{name:i,highAvailabilityMode:n,openshiftVersion:l,pullSecret:t||"",baseDnsDomain:a,SNODisclaimer:n==="None",useRedHatDnsService:!!a&&o.map(p=>p.domain).includes(a),enableDiskEncryptionOnMasters:["all","masters"].includes(e?.diskEncryption?.enableOn??"none"),enableDiskEncryptionOnWorkers:["all","workers"].includes(e?.diskEncryption?.enableOn??"none"),diskEncryptionMode:e?.diskEncryption?.mode??"tpmv2",diskEncryptionTangServers:FN(e?.diskEncryption?.tangServers),diskEncryption:e?.diskEncryption??{},cpuArchitecture:e?.cpuArchitecture||L.x86}},BC=({usedClusterNames:e,featureSupportLevels:t,pullSecretSet:o,ocpVersions:r,validateUniqueName:s,isOcm:i,t:n})=>VN(a=>{let l=()=>th(n,e,a.baseDnsDomain,s,i);return o?od({name:l(),baseDnsDomain:yc.required("Required")}):od({name:l(),baseDnsDomain:yc.required("Required"),pullSecret:oh.required("Required."),SNODisclaimer:NN().when(["highAvailabilityMode","openshiftVersion"],{is:(p,u)=>{let c=(r||[]).find(d=>d.value===u);return p==="None"&&c&&t.getFeatureSupportLevel(c.value,"SNO")==="dev-preview"},then:HN().oneOf([!0],n("ai:Confirm the Single Node OpenShift disclaimer to continue."))}),diskEncryptionTangServers:UC().when("diskEncryptionMode",{is:p=>p==="tang",then:UC().of(od().shape({url:GC().url(n('ai:Tang Server URL must be a valid URL starting with "http://" or "https://"')).required(n("ai:Required.")),thumbprint:GC().required(n("ai:Required."))}))})})});import noe from"react";import{DescriptionList as loe,DescriptionListDescription as poe,DescriptionListGroup as uoe,DescriptionListTerm as coe,Grid as doe,GridItem as moe}from"@patternfly/react-core";import jo from"react";import{Flex as ON,FlexItem as $C,Progress as LN,ProgressMeasureLocation as qC,ProgressVariant as YC}from"@patternfly/react-core";var MN=e=>{switch(e){case"cancelled":case"error":return YC.danger;case"installed":case"adding-hosts":return YC.success;default:return}},_N=e=>["installed","adding-hosts"].includes(e)?qC.none:qC.top,WN=(e,t,o)=>e==="installed"||e==="adding-hosts"?o("ai:Installed on {{humanizedDataTime}}",{humanizedDataTime:jt(t)}):e==="error"?o("ai:Failed on {{humanizedDataTime}}",{humanizedDataTime:jt(t)}):e==="cancelled"?o("ai:Cancelled on {{humanizedDataTime}}",{humanizedDataTime:jt(t)}):dr(o)[e]||e,zN=({cluster:e,minimizedView:t=!1,totalPercentage:o})=>{let{status:r}=e,{t:s}=f();return jo.createElement(jo.Fragment,null,jo.createElement(It,null,jo.createElement(ON,{direction:{default:t?"row":"column"}},jo.createElement($C,null,jo.createElement(A,{title:s("ai:Started on"),value:jt(e.installStartedAt),idPrefix:"cluster-progress-started-on"})),jo.createElement($C,null,jo.createElement(A,{title:s("ai:Status"),value:WN(e.status,e.installCompletedAt,s),idPrefix:"cluster-progress-status"})))),jo.createElement(ee,{condition:!t},jo.createElement(LN,{value:o||0,label:`${o||0}%`,title:" ",measureLocation:_N(r),variant:MN(r),className:"cluster-progress-bar"})))},Mn=zN;import $e from"react";import{GridItem as RN,ClipboardCopy as KN,clipboardCopyFunc as XN,Button as JN,Alert as JC}from"@patternfly/react-core";import Oe from"react";import{Modal as BN,Button as rd,ButtonVariant as sd,Text as UN,ModalVariant as GN,ExpandableSection as $N}from"@patternfly/react-core";import{InfoCircleIcon as qN}from"@patternfly/react-icons";var YN=e=>e&&e.length>0?[...e.slice(1)].reduce((t,o)=>`${t}
|
|
9
|
+
${o}`,e[0]):"",jC=e=>{let{requiredList:t,...o}=e;return Oe.createElement($N,{...o},Oe.createElement(ct,{code:YN(t),language:"markup",copiable:!0}))},jN=({cluster:e,consoleUrl:t})=>{let[o,r]=Oe.useState(!0),s=()=>r(!o),[i="",n=""]=[e.apiVip,e.ingressVip],a=`${e.name}.${e.baseDnsDomain}`,l=`apps.${a}`,p=[`${i} api.${a}`,`${n} oauth-openshift.${l}`,`${n} ${kg(t)}`,`${n} grafana-openshift-monitoring.${l}`,`${n} thanos-querier-openshift-monitoring.${l}`,`${n} prometheus-k8s-openshift-monitoring.${l}`,`${n} alertmanager-main-openshift-monitoring.${l}`],u=`*.${l}.`.length+2,c=[`api.${a}`.padEnd(u)+`A ${i}`,`*.${l}`.padEnd(u)+`A ${n}`],{t:d}=f();return Oe.createElement(Oe.Fragment,null,Oe.createElement(UN,{component:"p"},d("ai:In order to access the OpenShift Web Console, use external DNS server or local configuration to resolve its hostname. To do so, either:")),Oe.createElement(jC,{toggleText:d("ai:Option 1: Add the following records to your DNS server (recommended)"),className:"pf-u-pb-md",isExpanded:o,onToggle:s,requiredList:c}),Oe.createElement(jC,{toggleText:d("ai:Option 2: Update your local /etc/hosts or /etc/resolv.conf files"),className:"pf-u-pb-md",isExpanded:!o,onToggle:s,requiredList:p}))},RC=({cluster:e,consoleUrl:t,isDisabled:o,id:r})=>{let[s,i]=Oe.useState(!1),{t:n}=f();return Oe.createElement(Oe.Fragment,null,Oe.createElement(ht,{type:"button",variant:sd.primary,isDisabled:o,onClick:()=>i(!0),"data-testid":r},n("ai:Launch OpenShift Console")),Oe.createElement(XC,{closeModal:()=>i(!1),consoleUrl:t,cluster:e,isOpen:s}))},KC=({cluster:e,consoleUrl:t,idPrefix:o})=>{let[r,s]=Oe.useState(!1),{t:i}=f();return Oe.createElement(Oe.Fragment,null,Oe.createElement(rd,{variant:"link",icon:Oe.createElement(qN,null),iconPosition:"left",isInline:!0,onClick:()=>s(!0),"data-testid":`${o}-troubleshooting-hint-open`},i("ai:Not able to access the Web Console?")),Oe.createElement(XC,{closeModal:()=>s(!1),consoleUrl:t,cluster:e,isOpen:r}))},XC=({closeModal:e,cluster:t,consoleUrl:o,isOpen:r})=>{let{t:s}=f(),i=[Oe.createElement(rd,{type:"submit",key:"launch",variant:sd.primary,onClick:()=>window.open(o,"_blank","noopener"),isDisabled:!o},s("ai:Launch OpenShift Console")),Oe.createElement(rd,{variant:sd.secondary,onClick:()=>e(),key:"close"},s("ai:Close"))];return Oe.createElement(BN,{title:s("ai:OpenShift Web Console troubleshooting"),isOpen:r,onClose:e,actions:i,variant:GN.large},Oe.createElement(jN,{cluster:t,consoleUrl:o}))};import{ExternalLinkAltIcon as ZN}from"@patternfly/react-icons";var QN=({cluster:e,credentials:t,error:o=!1,retry:r,idPrefix:s="cluster-creds",credentialsError:i="",notAvailable:n=!1})=>{let a,{t:l}=f();if(o)i.includes("403")?a=$e.createElement(JC,{variant:"info",isInline:!0,title:"You do not have permission to view the cluster credentials"},"For more information, contact your organization administrator"):a=$e.createElement(_,{title:l("ai:Failed to fetch cluster credentials."),fetchData:r});else if(n)a=$e.createElement(JC,{variant:"info",isInline:!0,title:l("ai:Admin credentials are not available.")});else if(!t)a=$e.createElement(z,null);else{if(!t.username&&!t.consoleUrl)return $e.createElement($e.Fragment,null,"N/A");a=$e.createElement(It,null,t.consoleUrl&&$e.createElement(A,{title:l("ai:Web Console URL"),value:$e.createElement($e.Fragment,null,$e.createElement(JN,{variant:"link",icon:$e.createElement(ZN,null),iconPosition:"right",isInline:!0,onClick:()=>window.open(t.consoleUrl,"_blank","noopener"),"data-testid":`${s}-link-console-url`},t.consoleUrl),$e.createElement("br",null),e.apiVip&&e.ingressVip&&$e.createElement(KC,{consoleUrl:t.consoleUrl,cluster:e,idPrefix:s}))}),t.username&&$e.createElement($e.Fragment,null,$e.createElement(A,{title:"Username",value:t.username}),$e.createElement(A,{title:l("ai:Password"),value:$e.createElement(KN,{isReadOnly:!0,onCopy:p=>XN(p,t.password)},"\u2022\u2022\u2022\u2022\u2022")})))}return $e.createElement(RN,{span:12},a)},id=QN;import ZC from"react";import{saveAs as QC}from"file-saver";import{Button as eH,ButtonVariant as tH}from"@patternfly/react-core";var Pl=new AbortController,ge={abortLastGetRequest(){Pl.abort(),Pl=new AbortController},makeBaseURI(e){return`/v2/clusters/${e||""}`},makeDownloadsBaseURI(e){return`${ge.makeBaseURI(e)}/downloads`},makeLogsBaseURI(e){return`${ge.makeBaseURI(e)}/logs`},makeDownloadsCredentialsBaseURI(e){return`${ge.makeDownloadsBaseURI(e)}/credentials`},makeDownloadsCredentialsPresignedBaseURI(e){return`${ge.makeDownloadsBaseURI(e)}/credentials-presigned`},makeDownloadsFilesPresignedBaseURI(e){return`${ge.makeDownloadsBaseURI(e)}/files-presigned`},makeSupportedPlatformsBaseURI(e){return`${ge.makeBaseURI(e)}/supported-platforms`},makeActionsBaseURI(e){return`${ge.makeBaseURI(e)}/actions`},downloadClusterCredentials(e,t){return V.get(`${ge.makeDownloadsCredentialsBaseURI(e)}?file_name=${t}`,{responseType:"blob",headers:{Accept:"application/octet-stream"}})},getPresignedForClusterCredentials({clusterId:e,fileName:t,hostId:o,logsType:r}){let s=`${r?`&logs_type=${r}`:""}${o?`&host_id=${o}`:""}`;return V.get(`${ge.makeDownloadsCredentialsPresignedBaseURI(e)}?file_name=${t}${s}`)},getPresignedForClusterFiles({clusterId:e,fileName:t,hostId:o,logsType:r}){let s=`${r?`&logs_type=${r}`:""}${o?`&host_id=${o}`:""}`;return V.get(`${ge.makeDownloadsFilesPresignedBaseURI(e)}?file_name=${t}${s}`)},list(){return V.get(`${ge.makeBaseURI()}`,{signal:Pl.signal})},get(e){return V.get(`${ge.makeBaseURI(e)}`,{signal:Pl.signal})},getSupportedPlatforms(e){return V.get(`${ge.makeSupportedPlatformsBaseURI(e)}`)},getPreflightRequirements(e){return V.get(`${ge.makeBaseURI(e)}/preflight-requirements`)},getDefaultConfig(){return V.get(`${ge.makeBaseURI()}/default-config`)},deregister(e){return V.delete(`${ge.makeBaseURI(e)}`)},register(e){return V.post(`${ge.makeBaseURI()}`,e)},update(e,t){return V.patch(`${ge.makeBaseURI(e)}`,t)},install(e){return V.post(`${ge.makeActionsBaseURI(e)}/install`)},cancel(e){return V.post(`${ge.makeActionsBaseURI(e)}/cancel`)},reset(e){return V.post(`${ge.makeActionsBaseURI(e)}/reset`)},registerAddHosts(e){return V.post(`${ge.makeBaseURI()}import`,e)},allowAddHosts(e){return V.post(`${ge.makeActionsBaseURI(e)}/allow-add-workers`)},downloadLogs(e,t){let o=`logs_type=${t?`host&host_id=${t}`:"all"}`;return V.get(`${ge.makeLogsBaseURI(e)}?${o}`,{responseType:"blob",headers:{Accept:"application/octet-stream"}})},getCredentials(e){return V.get(`${ge.makeBaseURI(e)}/credentials`)},listByOpenshiftId(e){return V.get(`${ge.makeBaseURI()}?openshift_cluster_id=${e||""}`)},listBySubscriptionIds(e){return V.get(`${ge.makeBaseURI()}?ams_subscription_ids=${e.toString()}`)}},M=ge;var oH=e=>{let t=e["content-disposition"]&&e["content-disposition"].match(/filename=".*"/);return t?t[0].slice(10,-1):"kubeconfig"},rH=({clusterId:e,status:t,id:o,handleDownload:r})=>{let{addAlert:s}=N(),i=ZC.useCallback(async(a,l)=>{try{if(oe){let{data:p}=await M.getPresignedForClusterCredentials({clusterId:a,fileName:"kubeconfig"});QC(p.url)}else{let p=await M.downloadClusterCredentials(a,"kubeconfig"),u=oH(p.headers);QC(p.data,u)}}catch(p){x(p,u=>{s({title:l("ai:Could not download kubeconfig"),message:D(u)})})}},[s]),{t:n}=f();return ZC.createElement(eH,{variant:tH.secondary,onClick:r||(()=>i(e,n)),isDisabled:!dn(t),id:o,"data-testid":o},"Download kubeconfig")},_n=rH;import Dl from"react";import{useFormikContext as lH}from"formik";import Vt from"react";import{Alert as sH,AlertVariant as ey,List as iH,ListItem as wl,Stack as nH,StackItem as ty}from"@patternfly/react-core";var aH=({snoSupportLevel:e,isDisabled:t=!1,snoExpansionSupported:o=!1})=>{let{t:r}=f();if(!["dev-preview","supported"].includes(e))return null;let s=e==="dev-preview",i=Vt.createElement(Vt.Fragment,null,Vt.createElement(wl,null,r("ai:Installing SNO will result in a non-highly available OpenShift deployment.")),!o&&Vt.createElement(wl,null,r("ai:Currently, adding additional machines to your cluster is not supported."))),n=Vt.createElement(Vt.Fragment,null,Vt.createElement(wl,null,r("ai:SNO is in a proof-of-concept stage and is not supported in any way.")),Vt.createElement(wl,null,r("ai:OpenShift in-place upgrades aren't expected to work with SNO. If an upgrade is needed, your system will need a redeployment.")));return Vt.createElement(sH,{variant:s?ey.warning:ey.info,title:r("ai:Limitations for using Single Node OpenShift"),isInline:!0},Vt.createElement(nH,{hasGutter:!0},Vt.createElement(ty,null,Vt.createElement(iH,null,i,s&&n)),s&&Vt.createElement(ty,null,Vt.createElement(Lr,{name:"SNODisclaimer",label:r("ai:I understand, accept, and agree to the limitations associated with using Single Node OpenShift."),isDisabled:t}))))},nd=aH;var pH=({versions:e,highAvailabilityMode:t})=>{let{values:o}=lH(),r=be(),s=r.getFeatureSupportLevel(o.openshiftVersion,"SNO"),i=r.isFeatureSupported(o.openshiftVersion,"SINGLE_NODE_EXPANSION"),n=r.isFeatureDisabled(o.openshiftVersion,"SNO");return Dl.createElement(Dl.Fragment,null,Dl.createElement(rc,{name:"highAvailabilityMode",versions:e,isDisabled:n}),t==="None"&&s&&Dl.createElement(nd,{isDisabled:n,snoSupportLevel:s,snoExpansionSupported:i}))},ad=pH;import Ire from"react";import{ExclamationCircleIcon as xre,ExclamationTriangleIcon as kre,ExternalLinkAltIcon as Tre}from"@patternfly/react-icons";import{global_warning_color_100 as wre,global_danger_color_100 as Dre}from"@patternfly/react-tokens";var uH="name-of-month DD, YYYY",cH={"4.8":"January 27, 2023","4.7":"August 24, 2022","4.6":"October 27, 2022"},El={"dates format":uH,versions:cH};function Al(e){let t=new Date(e),o=new Date;return Math.floor(Math.abs(o.valueOf()-t.valueOf())/qu)}function oy(e,t){return t&&t!==ui?e-Al(t):e}import{Fragment as IH,createElement as Fl}from"react";import{useField as vH}from"formik";import{Fragment as yH,createElement as Cr,useEffect as CH,useState as hH}from"react";import{useFormikContext as dH}from"formik";import{Checkbox as mH,FormGroup as fH}from"@patternfly/react-core";var pd=({fieldId:e="sshPublicKey"})=>{let{t}=f();return Cr(j,{fieldId:e},t("ai:Paste the content of a public ssh key you want to use to connect to the hosts into this field.")," ",Cr(ot,{href:Hu},t("ai:Learn more")))},gH=({clusterSshKey:e,imageSshKey:t,isDisabled:o=!1})=>{let r=!!t&&(e===t||!e),[s,i]=hH(r),{values:n,setFieldValue:a,errors:l,touched:p}=dH(),u=l.sshPublicKey,c=()=>{n.sshPublicKey&&a("sshPublicKey",Ss(n.sshPublicKey))};CH(()=>{!o&&s&&a("sshPublicKey",t)},[s,t,a,o]);let d=T("shareDiscoverySshKey","checkbox"),{t:m}=f();return Cr(yH,null,Cr(fH,{fieldId:d,label:m("ai:Host SSH Public Key for troubleshooting after installation"),helperTextInvalid:u,validated:p&&u?"error":"default"},Cr(ee,{condition:Boolean(t)},Cr(mH,{name:"shareDiscoverySshKey",id:d,label:m("ai:Use the same host discovery SSH key"),"aria-describedby":`${d}-helper`,isChecked:s,isDisabled:o,onChange:i})),Cr(ee,{condition:!s},Cr(ur,{name:"sshPublicKey",helperText:Cr(pd,null),onBlur:c,isDisabled:o}))))},ud=gH;var SH=({isRequired:e})=>{let[{name:t,value:o},,{setValue:r}]=vH("sshPublicKey"),{t:s}=f();return Fl(Pu,{label:Fl(IH,null,s("ai:SSH public key")," ",Fl(W,{bodyContent:s("ai:Provide an SSH key to be able to connect to the hosts for debugging purposes during the discovery process")})),name:t,helperText:Fl(pd,null),idPostfix:"discovery",onBlur:()=>o&&r(Ss(o)),dropzoneProps:{accept:".pub",maxSize:2048,onDropRejected:({setError:i})=>()=>i(s("ai:File not supported."))},transformValue:Ss,isRequired:e})},cd=SH;import Se from"react";import{useFormikContext as ry}from"formik";import{Grid as bH}from"@patternfly/react-core";import{Trans as dd}from"react-i18next";var sy=()=>{let{setFieldValue:e,values:t}=ry(),o=()=>{t.noProxy&&e("noProxy",Mo(t.noProxy))},{t:r}=f();return Se.createElement(bH,{hasGutter:!0},Se.createElement(St,{label:Se.createElement(Se.Fragment,null,r("ai:HTTP proxy URL")," ",Se.createElement(W,{bodyContent:r("ai:The HTTP proxy URL that agents should use to access the discovery service.")})),name:"httpProxy",placeholder:"http://<user>:<password>@<ipaddr>:<port>",helperText:Se.createElement("div",null,Se.createElement(dd,{t:r,components:{bold:Se.createElement("strong",null)},i18nKey:"ai:URL must start with <bold>http</bold>."}))}),Se.createElement(St,{label:Se.createElement(Se.Fragment,null,r("ai:HTTPS proxy URL")," ",Se.createElement(W,{bodyContent:r("ai:Specify the HTTPS proxy that agents should use to access the discovery service. If you don't provide a value, your HTTP proxy URL will be used by default for both HTTP and HTTPS connections.")})),name:"httpsProxy",placeholder:"http://<user>:<password>@<ipaddr>:<port>",helperText:Se.createElement("div",null,Se.createElement(dd,{t:r,components:{bold:Se.createElement("strong",null)},i18nKey:"ai:URL must start with <bold>http</bold> (https schemes are not currently supported)."}))}),Se.createElement(St,{label:Se.createElement(Se.Fragment,null,r("ai:No proxy domains")," ",Se.createElement(W,{bodyContent:r("ai:Exclude destination domain names, IP addresses, or other network CIDRs from proxying by adding them to this comma-separated list.")})),name:"noProxy",placeholder:"one.domain.com,second.domain.com",helperText:Se.createElement("div",null,Se.createElement(dd,{t:r,components:{bold:Se.createElement("strong",null)},i18nKey:"ai:Use a comma to separate each listed domain. Preface a domain with <bold>.</bold> to include its subdomains. Use <bold>*</bold> to bypass the proxy for all destinations."})),onBlur:o}))},xH=()=>{let{setFieldValue:e,values:t,initialValues:o}=ry(),r=i=>{i?(e("httpProxy",o.httpProxy),e("httpsProxy",o.httpsProxy),e("noProxy",o.noProxy)):(e("httpProxy",""),e("httpsProxy",""),e("noProxy",""))},{t:s}=f();return Se.createElement(Se.Fragment,null,Se.createElement(Lr,{label:s("ai:Configure cluster-wide proxy settings"),name:"enableProxy",className:"ai-proxy-fields",helperText:Se.createElement("p",null,s("ai:If hosts are behind a firewall that requires the use of a proxy, provide additional information about the proxy.")),onChange:i=>r(i),body:t.enableProxy&&Se.createElement(sy,null)}))},md=xH;import Lse from"react";import{Modal as _se,ModalVariant as Wse}from"@patternfly/react-core";import Me from"react";import{saveAs as BH}from"file-saver";import{Alert as cy,Button as vd,ButtonVariant as Sd,ClipboardCopy as dy,clipboardCopyFunc as my,ModalBoxBody as UH,ModalBoxFooter as GH,Stack as $H,StackItem as Id}from"@patternfly/react-core";import Ro from"react";import{TextListItem as Wn,OrderType as kH,Text as TH,TextContent as PH,TextList as wH}from"@patternfly/react-core";import{Trans as DH}from"react-i18next";var EH=({showAllInstructions:e=!1,isSNO:t=!1})=>{let{t:o}=f();return Ro.createElement(PH,null,Ro.createElement(TH,{component:"h3"},o("ai:Adding hosts instructions")),Ro.createElement(wH,{component:"ol",type:kH.number,style:{marginLeft:0}},Ro.createElement(Wn,{hidden:!e},o("ai:Click the Add host button.",{count:+t})),Ro.createElement(Wn,{hidden:!e},o("ai:Configure the SSH key and proxy settings after the modal appears (optional).")),Ro.createElement(Wn,null,o("ai:Download the Discovery ISO (onto a USB drive, attach it to a virtual media, etc.) and use it to boot your hosts.")),Ro.createElement(Wn,null,Ro.createElement(DH,{t:o,count:+t,components:{bold:Ro.createElement("strong",null)},i18nKey:"ai:Keep the Discovery ISO media connected to the device throughout the installation process and set each host to boot <bold>only one time</bold> from this device. "})),Ro.createElement(Wn,null,o("ai:Booted hosts should appear in the host inventory table. This may take a few minutes."))))},fd=EH;import ze from"react";import{lazy as WH,object as zH}from"yup";import{Button as gd,Form as VH,ModalBoxBody as NH,ModalBoxFooter as HH,AlertVariant as py,Alert as hd,Stack as OH,StackItem as Cd}from"@patternfly/react-core";import{ExternalLinkAltIcon as LH}from"@patternfly/react-icons";import{Formik as MH}from"formik";import Ko from"react";import{Stack as AH,StackItem as iy}from"@patternfly/react-core";var ny="imageType",ay=({text:e,popoverContent:t})=>Ko.createElement(Ko.Fragment,null,e," ",Ko.createElement(W,{component:"a",bodyContent:t,noVerticalAlign:!0})),FH=()=>{let{t:e}=f();return Ko.createElement(AH,{hasGutter:!0},Ko.createElement(iy,null,Ko.createElement(Ke,{name:ny,id:"minimal-iso",value:"minimal-iso",label:Ko.createElement(ay,{text:e("ai:Minimal image file: Provision with virtual media"),popoverContent:e("ai:Recommended option. The generated discovery ISO will be smaller, but will need to download additional data during boot. This option is useful if ISO storage capacity is limited or if it's being served over a constrained network.")})})),Ko.createElement(iy,null,Ko.createElement(Ke,{name:ny,id:"full-iso",value:"full-iso",label:Ko.createElement(ay,{text:e("ai:Full image file: Provision with physical media"),popoverContent:e("ai:The generated discovery ISO will contain everything needed to boot.")})})))},ly=FH;var yd=()=>{let{t:e}=f();return ze.createElement(hd,{title:e("ai:To use static network configuration, follow the steps listed in the documentation."),isInline:!0,variant:"info"},ze.createElement(gd,{variant:"link",icon:ze.createElement(LH,null),iconPosition:"right",isInline:!0,onClick:()=>window.open(Yu,"_blank","noopener")},e("ai:View documentation")))},_H=WH(e=>zH().shape({sshPublicKey:el,httpProxy:vc(e,"httpsProxy"),httpsProxy:vc(e,"httpProxy"),noProxy:ih})),uy=({handleSubmit:e,onCancel:t,sshPublicKey:o,httpProxy:r,httpsProxy:s,noProxy:i,imageType:n,hideDiscoveryImageType:a,hasDHCP:l})=>{let p={sshPublicKey:o||"",httpProxy:r||"",httpsProxy:s||"",noProxy:i||"",enableProxy:!!(r||s||i),imageType:n||"minimal-iso"},{t:u}=f();return ze.createElement(MH,{initialValues:p,initialStatus:{error:null},validationSchema:_H,onSubmit:e},({submitForm:c,isSubmitting:d,status:m})=>ze.createElement(ze.Fragment,null,ze.createElement(NH,null,ze.createElement(OH,{hasGutter:!0},ze.createElement(Cd,null,ze.createElement(hd,{variant:py.info,isInline:!0,title:u("ai:Generate a Discovery ISO in order to add hosts to the cluster.")})),l===!1&&ze.createElement(Cd,null,ze.createElement(yd,null)),ze.createElement(Cd,null,ze.createElement(VH,null,m?.error&&ze.createElement(hd,{variant:py.danger,title:m.error.title,isInline:!0},m.error.message),!a&&ze.createElement(ly,null),ze.createElement(cd,null),ze.createElement(md,null))))),ze.createElement(HH,null,ze.createElement(gd,{onClick:c,isDisabled:d,isLoading:d},u(d?"ai:Generating":"ai:Generate Discovery ISO")),ze.createElement(gd,{key:"cancel",variant:"link",onClick:t},u("ai:Cancel")))))};var qH=({fileName:e="discovery.iso",downloadUrl:t,onClose:o,onReset:r,hasDHCP:s,isSNO:i=!1})=>{let n=`wget -O ${e} '${t||""}'`,{t:a}=f();return Me.createElement(Me.Fragment,null,Me.createElement(UH,null,Me.createElement($H,{hasGutter:!0},Me.createElement(Id,null,Me.createElement(cy,{isInline:!0,variant:"success",title:a("ai:Discovery ISO is ready to be downloaded")},Me.createElement(Me.Fragment,null,"\xA0",Me.createElement(fd,{isSNO:i})))),s===!1&&Me.createElement(Id,null,Me.createElement(yd,null)),Me.createElement(Id,null,Me.createElement(It,null,Me.createElement(A,{title:a("ai:Discovery ISO URL"),value:Me.createElement(dy,{isReadOnly:!0,onCopy:l=>my(l,t)},t)}),Me.createElement(A,{title:a("ai:Command to download the ISO:"),value:Me.createElement(dy,{isReadOnly:!0,onCopy:l=>my(l,n)},n)})),Me.createElement(cy,{variant:"info",isInline:!0,title:`${a("ai:Never share your downloaded ISO with anyone else.")} ${a("ai:Forwarding it could put your credentials and personal data at risk.")}`})))),Me.createElement(GH,null,Me.createElement(vd,{variant:Sd.primary,onClick:()=>t&&BH(t),"data-testid":"download-iso-btn",isDisabled:!t},a("ai:Download Discovery ISO")),Me.createElement(vd,{variant:Sd.secondary,onClick:o,"data-testid":"close-iso-btn"},a("ai:Close")),r&&Me.createElement(vd,{variant:Sd.link,onClick:r,"data-testid":"edit-iso-btn"},a("ai:Edit ISO configuration"))))},Vl=qH;import YH from"react";import{Alert as jH,AlertVariant as RH}from"@patternfly/react-core";var KH=({someDisksAreSkipFormatting:e})=>{let{t}=f();return YH.createElement(jH,{variant:RH.warning,isInline:!0,title:t(e?"ai:There may be issues with the boot order":"ai:All bootable disks will be formatted during installation. Make sure to backup any sensitive data.")},e?t("ai:You have opted out of formatting bootable disks on some hosts. To ensure the hosts reboot into the expected installation disk, manual user intervention may be required during OpenShift installation."):"")},bd=KH;import pe from"react";import{Button as XH,Modal as Xse,ButtonVariant as JH,ModalVariant as Jse,TextContent as ZH,Text as rt,TextVariants as st}from"@patternfly/react-core";import{InfoCircleIcon as QH}from"@patternfly/react-icons";import{Trans as eO}from"react-i18next";var fy=()=>{let{t:e}=f();return pe.createElement(ZH,null,pe.createElement(rt,{component:st.p},e("ai:To troubleshoot host discovery issues, complete the following steps:")),pe.createElement(rt,{component:st.h2},e("ai:Verify that your host machine is powered on")),pe.createElement(rt,{component:st.p},e("ai:Note: Boot time depends on several factors such as your hardware and network configuration, and if you are booting from an ISO.")),pe.createElement(rt,{component:st.h2},e("ai:If you used DHCP networking, verify that your DHCP server is enabled")),pe.createElement(rt,{component:st.h2},e("ai:If you used static IP, bridges, and bonds networking, verify that your configurations are correct")),pe.createElement(rt,{component:st.h2},e("ai:SSH into your machine")),pe.createElement(rt,{component:st.p},e("ai:Verify that you can access your host machine using SSH, or a console such as BMC or virtual machine console. In the CLI, enter the following command:")),pe.createElement(ct,{code:"ssh -i <identity_file> core@<machine-ip>"}),pe.createElement(rt,{component:st.p},e("ai:NOTE: Authentication is provided by the discovery ISO, therefore when you access your host using SSH, a password is not required. Optional -i parameter can be used to specify the private key that matches the public key provided when generating Discovery ISO.")),pe.createElement(rt,{component:st.h2},e("ai:Verify that the discovery agent is running with the correct parameters")),pe.createElement(ct,{code:"ps -ef | grep agent"}),pe.createElement(rt,{component:st.p},e("ai:The output displays the following:")),pe.createElement(ct,{code:`root 1786 1 0 08:03 ? 00:00:00 /usr/local/bin/agent --url https://api.openshift.com --cluster-id e4c85fbe-77c7-411e-b107-5120f615c4fb --agent-version registry.redhat.io/openshift4/assisted-installer-agent-rhel8:v4.6.0-17 --insecure=false
|
|
10
10
|
core 2362 2311 0 08:04 pts/0 00:00:00 grep --color=auto agent`}),pe.createElement(rt,{component:st.h2},e("ai:Verify that the agent ran successfully")),pe.createElement(rt,{component:st.p},e("ai:To verify that the agent ran successfully, check the logs:")),pe.createElement(ct,{code:"sudo journalctl -u agent.service"}),pe.createElement(rt,{component:st.p},e("ai:In the following example, the errors indicate there is a network issue:")),pe.createElement(ct,{code:`Oct 15 11:26:35 localhost systemd[1]: agent.service: Service RestartSec=3s expired, scheduling restart.
|
|
11
11
|
Oct 15 11:26:35 localhost systemd[1]: agent.service: Scheduled restart job, restart counter is at 9.
|
|
12
12
|
Oct 15 11:26:35 localhost systemd[1]: Stopped agent.service.
|
|
@@ -18,17 +18,17 @@ Oct 15 11:26:35 localhost systemd[1]: agent.service: Control process exited, cod
|
|
|
18
18
|
Oct 15 11:26:35 localhost systemd[1]: agent.service: Failed with result 'exit-code'.
|
|
19
19
|
Oct 15 11:26:35 localhost systemd[1]: Failed to start agent.service.`}),pe.createElement(rt,{component:st.p},pe.createElement(eO,{t:e,components:{code:pe.createElement("code",null)},i18nKey:"ai:Check the proxy settings and verify that the assisted installer service is connected to a network. You can use <code>nmcli</code> to get additional information about your network configuration."})),pe.createElement(rt,{component:st.h2},e("ai:Check agent logs")),pe.createElement(rt,{component:st.p},e("ai:To view detailed agent logs and communication use following command:")),pe.createElement(ct,{code:"sudo journalctl TAG=agent | less"}),pe.createElement(rt,{component:st.h2},e("ai:Check assisted-installer logs")),pe.createElement(ct,{code:`sudo su
|
|
20
20
|
podman ps -a | grep assisted-installer
|
|
21
|
-
podman logs <container id>`}),pe.createElement(rt,{component:st.h2},e("ai:Check bootkube logs")),pe.createElement(ct,{code:"sudo journalctl -u bootkube"}))},
|
|
22
|
-
`),o=uO(t,r=>r.startsWith(wi));return t.slice(0,o+1).map(r=>r.slice(1))},
|
|
21
|
+
podman logs <container id>`}),pe.createElement(rt,{component:st.h2},e("ai:Check bootkube logs")),pe.createElement(ct,{code:"sudo journalctl -u bootkube"}))},gy=({setDiscoveryHintModalOpen:e,isSNO:t=!1})=>{let{t:o}=f();return pe.createElement(XH,{variant:JH.link,onClick:()=>e(!0),isInline:!0},pe.createElement(QH,{size:"sm"}),"\xA0",o("ai:Host not showing up?",{count:+t}))};import yr from"react";import{Checkbox as tO}from"@patternfly/react-core";import{useFormikContext as oO}from"formik";var rO=({defaultPullSecret:e,isOcm:t=!1})=>{let[o,r]=yr.useState(!e),{setFieldValue:s}=oO(),{t:i}=f();if(t){let n=()=>{o&&s("pullSecret",e),r(!o)};return yr.createElement(yr.Fragment,null,yr.createElement(tO,{id:"checkbox-pull-secret",className:"pf-u-display-inline-flex","aria-label":i("ai:edit pull secret"),isChecked:o,onChange:n,label:yr.createElement(yr.Fragment,null,i("ai:Edit pull secret")," ",yr.createElement(Xu,{isOcm:t}))}),o&&yr.createElement(Ua,{isOcm:t}))}return yr.createElement(Ua,{isOcm:t})},xd=rO;var kd={};lr(kd,{ClustersAPI:()=>M,ComponentVersionsAPI:()=>vy,EventsAPI:()=>Ml,FeatureSupportLevelsAPI:()=>zn,HostsAPI:()=>vr,InfraEnvsAPI:()=>Ae,ManagedDomainsAPI:()=>Nl,SupportedOpenshiftVersionsAPI:()=>Hl});var hy={makeBaseURI(){return"/v2/domains"},list(){return V.get(hy.makeBaseURI())}},Nl=hy;var Cy={makeBaseURI(){return"/v2/openshift-versions"},list(){return V.get(`${Cy.makeBaseURI()}`)}},Hl=Cy;var yy={makeBaseURI(){return"/v2/component-versions"},list(){return V.get(`${yy.makeBaseURI()}`)}},vy=yy;var Ol=new AbortController,Ns={abortLastGetRequest(){Ol.abort(),Ol=new AbortController},makeBaseURI(e){return`/v2/infra-envs/${e||""}`},list(e=""){let t=e&&`?${new URLSearchParams({cluster_id:e}).toString()}`;return V.get(`${Ns.makeBaseURI()}${t}`,{signal:Ol.signal})},get(e){return V.get(`${Ns.makeBaseURI(e)}`,{signal:Ol.signal})},update(e,t){return V.patch(`${Ns.makeBaseURI(e)}`,t)},register(e){return V.post(`${Ns.makeBaseURI()}`,e)},deregister(e){return V.delete(`${Ns.makeBaseURI(e)}`)},getImageUrl(e){return V.get(`${Ns.makeBaseURI(e)}/downloads/image-url`)}},Ae=Ns;var Ll=new AbortController,Rr={abortLastGetRequest(){Ll.abort(),Ll=new AbortController},makeBaseURI(e,t){return`${Ae.makeBaseURI(e)}/hosts/${t||""}`},makeActionsBaseURI(e,t){return`${Rr.makeBaseURI(e,t)}/actions`},list(e){return V.get(`${Rr.makeBaseURI(e)}`,{signal:Ll.signal})},get(e,t){return V.get(`${Rr.makeBaseURI(e,t)}`,{signal:Ll.signal})},update(e,t,o){return V.patch(`${Rr.makeBaseURI(e,t)}`,o)},deregister(e,t){return V.delete(`${Rr.makeBaseURI(e,t)}`)},reset(e,t){return V.post(`${Rr.makeActionsBaseURI(e,t)}/reset`)},installHost(e,t){return V.post(`${Rr.makeActionsBaseURI(e,t)}/install`)}},vr=Rr;var Sy={makeBaseURI(){return"/v2/events"},list(e){let t="?";return t+=e.clusterId?`cluster_id=${e.clusterId}&`:"",t+=e.hostId?`host_id=${e.hostId}&`:"",t+=e.infraEnvId?`infra_env_id=${e.infraEnvId}&`:"",e.categories&&(t+="categories=",e.categories.forEach(o=>{t+=`${o},`})),t=t.slice(0,-1),V.get(`${Sy.makeBaseURI()}${t}`)}},Ml=Sy;var Iy={makeBaseURI(){return"/v2/feature-support-levels"},list(){return V.get(Iy.makeBaseURI())}},zn=Iy;var Hs=iO("clusters/fetchClustersAsync",async()=>{try{let{data:e}=await M.list(),t=!!oe;return e.filter(o=>t?o.kind==="Cluster":!0)}catch(e){x(e,()=>{Promise.reject("Failed to fetch clusters.")})}}),nO={data:[],uiState:Q.LOADING},by=sO({initialState:nO,name:"clusters",reducers:{deleteCluster:(e,t)=>({...e,data:e.data.filter(o=>o.id!==t.payload)})},extraReducers:e=>{let{LOADED:t,LOADING:o,RELOADING:r,ERROR:s}=Q;e.addCase(Hs.pending,i=>{let n=i.uiState===t?r:o;return{...i,uiState:n}}).addCase(Hs.fulfilled,(i,n)=>({...i,data:[...n.payload],uiState:t})).addCase(Hs.rejected,i=>({...i,uiState:s}))}}),{deleteCluster:xy}=by.actions,ky=by.reducer;import kO from"lodash/findIndex";import TO from"lodash/set";import{createAsyncThunk as PO,createSlice as wO}from"@reduxjs/toolkit";var zy={};lr(zy,{APIs:()=>kd,ClusterDetailsService:()=>Gn,ClustersService:()=>re,DiscoveryImageFormService:()=>$l,DiskEncryptionService:()=>Gl,HostDiscoveryService:()=>$n,HostsNetworkConfigurationType:()=>De,HostsService:()=>mt,InfraEnvsService:()=>it,OperatorsService:()=>qn});var Os={removeAll(e){let t=[];for(let{id:o,infraEnvId:r}of e)t.push(vr.deregister(r,o));return Promise.all(t)},update(e,t){if(vr.abortLastGetRequest(),!e.infraEnvId)throw new Error(`Cannot update host ${e.id}, missing infraEnvId`);return vr.update(e.infraEnvId,e.id,t)},updateHostName(e,t){return Os.update(e,{hostName:t})},updateRole(e,t){return Os.update(e,{hostRole:t})},updateHostODF(e,t){return Os.update(e,{nodeLabels:t})},updateDiskRole(e,t,o){let r={disksSelectedConfig:[{id:t,role:o}]};return o==="install"&&(r.disksSkipFormatting=[{diskId:t,skipFormatting:!1}]),Os.update(e,r)},updateFormattingDisks(e,t,o){return Os.update(e,{disksSkipFormatting:[{diskId:t,skipFormatting:o}]})},delete(e){if(!e.infraEnvId)throw new Error(`Cannot delete host ${e.id}, missing infraEnvId`);return vr.deregister(e.infraEnvId,e.id)},reset(e){if(!e.infraEnvId)throw new Error(`Cannot reset host ${e.id}, missing infraEnvId`);return vr.reset(e.infraEnvId,e.id)},install(e){if(!e.infraEnvId)throw new Error(`Cannot install host ${e.id}, missing infraEnvId`);return vr.installHost(e.infraEnvId,e.id)},installAll(e){let t=[];for(let o of e)t.push(Os.install(o));return Promise.all(t)}},mt=Os;var Td="infra-env-ids-cache-v2",Pd=e=>{localStorage.setItem(Td,JSON.stringify(e))},Pi=()=>{let e="{}",t=localStorage.getItem(Td)||e;try{return JSON.parse(t)}catch{return{}}},aO={key(e){let t=Pi();return Object.keys(t)[e]},get length(){let e=Pi();return Object.keys(e).length},clear(){localStorage.removeItem(Td)},getInfraEnvId(e,t){if(!e||!t)return null;let r=Pi()[e];if(!r)return null;if(t!==L.USE_DAY1_ARCHITECTURE)return r[t]||null;let s=ii.filter(i=>r[i]);if(s.length===1)return r[s[0]];throw new Error(`More than one infraEnv found for cluster ${e} without specified architecture`)},removeInfraEnvId(e,t){if(!e)return;let o=Pi();t===L.USE_DAY1_ARCHITECTURE?delete o[e]:o[e]&&delete o[e][t],Pd(o)},removeInfraEnvs(e){if(!e)return;let t=Pi();delete t[e],Pd(t)},updateInfraEnvs(e,t){if(!e)return;let o=Pi();o[e]||(o[e]={}),t.forEach(r=>{r.cpuArchitecture&&(o[e][r.cpuArchitecture]=r.id)}),Pd(o)}},Ls=aO;var xe;(function(o){o.YAML="yaml",o.FORM="form"})(xe||(xe={}));var B;(function(o){o.ipv4="ipv4",o.ipv6="ipv6"})(B||(B={}));var Kr;(function(o){o.ETHERNET="ethernet",o.VLAN="vlan"})(Kr||(Kr={}));var Ty=e=>e.type===Kr.VLAN;import{dump as lO,load as pO}from"js-yaml";import uO from"lodash/findLastIndex";var cO={ipv4:"0.0.0.0/0",ipv6:"::/0"},dO=254,wi="#",Di="generated by ui form view",wd=e=>`${e}MachineNetwork`,Dd=(e,t)=>`${e}.${t}`,Py=e=>e===B.ipv4?0:1,wy=e=>pO(e),Dy=e=>{let t=e.split(`
|
|
22
|
+
`),o=uO(t,r=>r.startsWith(wi));return t.slice(0,o+1).map(r=>r.slice(1))},Ey=(e,t)=>`${t.map(r=>`${wi}${r}`).join(`
|
|
23
23
|
`)}
|
|
24
|
-
${lO(e)}`,Ey=(e,t)=>{let o=e.find(r=>r.startsWith(wd(t)));return o?o.split(" ")[1]:""},Ed=e=>({ipv4:Ey(e,B.ipv4),ipv6:Ey(e,B.ipv6)}),_l=e=>{let t=Ed(e);return t[B.ipv4]&&t[B.ipv6]?"dualStack":t[B.ipv4]?"ipv4":null},Bn=(e,t)=>({address:[{ip:e,"prefix-length":t}],enabled:!0,dhcp:!1}),Ay=e=>({config:{server:e.split(",")}}),Ad=(e,t,o)=>o.useVlan&&o.vlanId?{name:Dd(e,o.vlanId),type:Kr.VLAN,state:"up",vlan:{"base-iface":e,id:o.vlanId},...t}:{name:e,type:Kr.ETHERNET,state:"up",...t},Fy=(e,t,o)=>({destination:cO[e],"next-hop-address":t,"next-hop-interface":o,"table-id":dO});var mO="01:23:45:67:89:AB",Fd="DUMMY",Wl=e=>{let t=e===B.ipv4?4:6;return`${Fd}${t}`},Un={ipv4:{prefixLength:24,ip:"0.0.0.0"},ipv6:{prefixLength:64,ip:"0::0"}},fO=()=>[{name:Wl(B.ipv4),type:Kr.ETHERNET,state:"up",ipv4:Bn(Un.ipv4.ip,Un.ipv4.prefixLength)}],Vd=()=>[{macAddress:mO,logicalNicName:Wl(B.ipv4)}],Vy=e=>e.startsWith(Fd),Ny=e=>e.includes(Fd),zl=()=>{let e={interfaces:fO()};return[{networkYaml:Dy(e,[Di]),macInterfaceMap:Vd()}]},Hy=()=>({isDataComplete:!1,view:xe.FORM,formViewProtocolType:null});var Bl={async getInfraEnvId(e,t){let o=Ls.getInfraEnvId(e,t);if(o===null){let{data:r}=await Ae.list(e);if(r.length>0&&(Ls.updateInfraEnvs(e,r),o=Ls.getInfraEnvId(e,t)),!o)throw Ls.removeInfraEnvId(e,t),new Error(`No InfraEnv could be found for clusterId: ${e} and architecture ${t||""}`)}return o},async getInfraEnv(e,t){let o=await Bl.getInfraEnvId(e,t);if(o){let{data:r}=await Ae.get(o);return r}else throw new Error(`No InfraEnv could be found for clusterId: ${e} and architecture ${t||""}`)},async getAllInfraEnvIds(e){let{data:t}=await Ae.list(e);return t.map(o=>o.id)},async create(e){if(!e.clusterId)throw new Error("Cannot create InfraEnv, clusterId is missing");let{data:t}=await Ae.register(e);if(!t.id)throw new Error("API returned no ID for the underlying InfraEnv");Ls.updateInfraEnvs(e.clusterId,[t])},async removeAll(e){let{data:t}=await Ae.list(e),o=t.map(r=>Ae.deregister(r.id));return Ls.removeInfraEnvs(e),Promise.all(o)},async updateAllInfraEnvsToDhcp(e){let o=(await Bl.getAllInfraEnvIds(e)).map(r=>Ae.update(r,{staticNetworkConfig:[]}));return Promise.all(o)},async setDummyStaticConfigToInfraEnv(e){let{data:t}=await Ae.update(e,{staticNetworkConfig:zl()});return t},async syncStaticIpConfigs(e,t,o){let{data:r}=await Ae.update(t,{staticNetworkConfig:o}),s=[];return(await Bl.getAllInfraEnvIds(e)).forEach(n=>{n!==t&&s.push(Ae.update(n,{staticNetworkConfig:o}))}),Promise.all(s).then(()=>r)}},it=Bl;import gO from"lodash/omit";var Ul={findHost(e=[],t){return e.find(o=>o.id===t)},async create(e){let{data:t}=await M.register(gO(e,"staticNetworkConfig"));return await it.create({name:`${e.name}_infra-env`,pullSecret:e.pullSecret,clusterId:t.id,openshiftVersion:e.openshiftVersion,cpuArchitecture:e.cpuArchitecture,staticNetworkConfig:e.staticNetworkConfig}),t},async remove(e){let{data:t}=await M.get(e),o=t.hosts??[];o.length>0&&await mt.removeAll(o),await it.removeAll(e),await M.deregister(e)},async downloadLogs(e,t){let{data:o,headers:r}=await M.downloadLogs(e,t),i=r["content-disposition"]?.match(/filename="(.+)"/)?.[1];return{data:o,fileName:i}},update(e,t,o){return M.abortLastGetRequest(),oe&&(o=Ul.updateClusterTags(t,o)),M.update(e,o)},async install(e,t){return oe&&Ul.updateClusterTags(t,{}).tags&&await Ul.update(e,t,{}),M.install(e)},updateClusterTags(e,t){let o=e?.split(",")||[];return o.includes(ci)?delete t.tags:(o?.push(ci),t.tags=o?.join(",")),t},async get(e){let{data:t}=await M.get(e);return t}},re=Ul;import hO from"lodash/omit";var Oy={diskEncryptionEnableOn(e,t){let o;return e&&t?o="all":t?o="workers":e?o="masters":o="none",o},getDiskEncryptionParams(e){return{mode:e.diskEncryptionMode,enableOn:e.highAvailabilityMode==="None"?e.enableDiskEncryptionOnMasters?"all":"none":Oy.diskEncryptionEnableOn(e.enableDiskEncryptionOnMasters,e.enableDiskEncryptionOnWorkers),tangServers:e.diskEncryptionMode==="tang"?JSON.stringify(e.diskEncryptionTangServers):void 0}}},Gl=Oy;var De;(function(o){o.STATIC="static",o.DHCP="dhcp"})(De||(De={}));var CO={getClusterCreateParams(e){let t=hO(e,["useRedHatDnsService","SNODisclaimer","enableDiskEncryptionOnMasters","enableDiskEncryptionOnWorkers","diskEncryptionMode","diskEncryption","diskEncryptionTangServers","hostsNetworkConfigurationType"]);return t.diskEncryption=Gl.getDiskEncryptionParams(e),zo({cpuArchitecture:t.cpuArchitecture})&&(t.userManagedNetworking=!0),e.hostsNetworkConfigurationType===De.STATIC&&(t.staticNetworkConfig=zl()),oe&&(t.tags=ci),t},getClusterDetailsInitialValues({cluster:e,infraEnv:t,urlSearchParams:o,...r}){let s=zC({cluster:e,...r}),n=new URLSearchParams(o).get("useArm")==="true",a=e?.cpuArchitecture||(n?L.ARM:L.x86),l=t?.staticNetworkConfig?De.STATIC:De.DHCP;return{...s,cpuArchitecture:a,hostsNetworkConfigurationType:l}}},Gn=CO;var yO={setPlatform(e,t,o){let s=t===void 0?o?"none":"baremetal":t;e.platform={type:s}},setSchedulableMasters(e,t,o){cn(o)||(e.schedulableMasters=t.schedulableMasters)}},$n=yO;var vO={async update(e,t,o,r,s){let i={httpProxy:r.httpProxy,httpsProxy:r.httpsProxy,noProxy:r.noProxy,pullSecret:s||void 0,sshPublicKey:r.sshPublicKey},n={proxy:{httpProxy:r.httpProxy,httpsProxy:r.httpsProxy,noProxy:r.noProxy},sshAuthorizedKey:r.sshPublicKey,pullSecret:s||void 0,staticNetworkConfig:r.staticNetworkConfig,imageType:r.imageType},{data:a}=await re.update(e,t,i);Ae.abortLastGetRequest();let{data:l}=await Ae.update(o,n);return{updatedCluster:a,updatedInfraEnv:l}}},$l=vO;var ql=e=>e.kind==="AddHostsCluster",SO=(e,t)=>e.hosts?.filter(({logsInfo:o})=>o&&t.includes(o))||[],Ly=e=>{let t=["completed","timeout"],o=e.logsInfo&&t.includes(e.logsInfo),r=SO(e,t).length;return(o?1:0)+r};var IO=e=>Wr(e).map(t=>({name:t.name,properties:t.properties})),My=e=>IO(e).reduce((t,o)=>(o.name&&(t[o.name]=o),t),{}),Yl=e=>["preparing-for-installation","installing","installing-pending-user-action","finalizing"].includes(e.status),_y=e=>e.hosts?.some(t=>t.skipFormattingDisks&&t.skipFormattingDisks.length>0);var bO=e=>Object.keys(e).some(t=>!!e[t]),xO={getOLMOperators(e,t){let o=My(t),r=(s,i)=>{i?o[s]={name:s}:delete o[s]};return r(Wo,e.useOdfLogicalVolumeManager),r(Mr,e.useContainerNativeVirtualization),r(_o,e.useOpenShiftDataFoundation),bO(e)||r(Ba,!1),Object.values(o)},syncOperators(e,t){let o=e?.find(i=>i.name===Wo)===void 0,r=t?.find(i=>i.name===Wo)!==void 0,s={};return o&&r&&(s.useOdfLogicalVolumeManager=!0),s}},qn=xO;var Yn=PO("currentCluster/fetchClusterAsync",async(e,{rejectWithValue:t})=>{try{return await re.get(e)}catch(o){return x(o,()=>t({code:xu(o),message:D(o)}))}}),zy={data:void 0,uiState:Q.LOADING,permissions:{isViewerMode:!1},errorDetail:void 0,isReloadScheduled:0},By=wO({initialState:zy,name:"currentCluster",reducers:{updateClusterBase:(e,t)=>{let o=e.data?.hosts||[];return{...e,data:{...t.payload,hosts:o}}},updateCluster:(e,t)=>({...e,data:t.payload}),updateHost:(e,t)=>{let o=kO(e.data?.hosts,r=>r.id===t.payload.id);return o>=0&&TO(e,`data.hosts[${o}]`,t.payload),e},cleanCluster:()=>zy,forceReload:e=>({...e,isReloadScheduled:e.isReloadScheduled+1}),cancelForceReload:e=>({...e,isReloadScheduled:0}),updateClusterPermissions:(e,t)=>({...e,permissions:t.payload})},extraReducers:e=>{e.addCase(Yn.pending,t=>{let o=t.uiState===Q.LOADED||t.uiState===Q.ERROR&&t.data;return{...t,uiState:o?Q.RELOADING:Q.LOADING}}).addCase(Yn.fulfilled,(t,o)=>({...t,data:o.payload,uiState:Q.LOADED})).addCase(Yn.rejected,(t,o)=>{let r=o.payload;return r.code===en&&!!t.data?{...t,uiState:Q.LOADED}:{...t,uiState:Q.ERROR,errorDetail:r}})}}),{updateCluster:$e,updateClusterBase:Uy,updateHost:Xr,cleanCluster:Gy,forceReload:Jr,cancelForceReload:Nd,updateClusterPermissions:$y}=By.actions,qy=By.reducer;import{createSlice as DO}from"@reduxjs/toolkit";var Yy=DO({name:"infraEnvs",initialState:[],reducers:{},extraReducers:{}}),ble=Yy.actions,Hd=Yy.reducer;var Sr=jy({reducer:{clusters:xy,currentCluster:qy,infraEnvs:Hd},preloadedState:{}}),EO=jy({reducer:{infraEnvs:Hd}});var Xy={};lr(Xy,{getClusterTableStatusCell:()=>Wd,selectClusterNames:()=>Ky,selectClusterNamesButCurrent:()=>jO,selectClusterTableRows:()=>zd,selectClustersUIState:()=>Rn,selectCurrentCluster:()=>AO,selectCurrentClusterPermissionsState:()=>R,selectCurrentClusterState:()=>jn,selectCurrentClusterUIState:()=>FO,selectIsCurrentClusterSNO:()=>Ms});var jn=e=>e.currentCluster,AO=e=>e.currentCluster.data,FO=e=>e.currentCluster.uiState,Ms=e=>e.currentCluster.data?.highAvailabilityMode==="None",R=e=>e.currentCluster?e.currentCluster.permissions:{isViewerMode:!1};import Md from"react";import{createSelector as Rl}from"reselect";import{Link as GO}from"react-router-dom";import ko from"react";import{global_danger_color_100 as VO,global_success_color_100 as NO,global_warning_color_100 as HO}from"@patternfly/react-tokens";import{ExclamationCircleIcon as OO,ExclamationTriangleIcon as LO,FileAltIcon as MO,CheckCircleIcon as _O,InProgressIcon as WO,BanIcon as zO}from"@patternfly/react-icons";var jl=({status:e,...t})=>{switch(e){case"cancelled":return ko.createElement(zO,{size:"sm",...t});case"insufficient":case"pending-for-input":case"ready":return ko.createElement(MO,{size:"sm",...t});case"error":return ko.createElement(OO,{color:VO.value,size:"sm",...t});case"installed":return ko.createElement(_O,{color:NO.value,size:"sm",...t});case"installing-pending-user-action":return ko.createElement(LO,{color:HO.value,size:"sm",...t});case"preparing-for-installation":case"installing":case"finalizing":case"adding-hosts":return ko.createElement(WO,{size:"sm",...t});default:return ko.createElement(ko.Fragment,null)}},Od=(e,t)=>dr(e)[t]||t,BO=({status:e,testId:t,className:o})=>{let{t:r}=f(),s=Od(r,e);return ko.createElement(ko.Fragment,null,ko.createElement(jl,{status:e,"data-testid":t,className:o})," ",s)},Ld=BO;var ue="",UO=e=>{ue=e};var _d=e=>e.clusters.data,$O=e=>e.clusters.uiState,qO=e=>e.currentCluster.data?.name,Rn=Rl([_d,$O],(e,t)=>{let{LOADED:o,EMPTY:r}=Q;return!e.length&&t===o?r:t}),YO=(e,t)=>{let{id:o,name:r="",openshiftVersion:s,baseDnsDomain:i,createdAt:n}=e,a=pl(n);return{cells:[{title:Md.createElement(GO,{key:r,to:`${ue}/clusters/${o}`,id:`cluster-link-${o}`},r),props:{"data-testid":`cluster-name-${r}`},sortableValue:r},{title:i||de,props:{"data-testid":`cluster-base-domain-${r}`},sortableValue:i},{title:s,props:{"data-testid":`cluster-version-${r}`},sortableValue:s},{title:Md.createElement(Ld,{status:e.status}),props:{"data-testid":`cluster-status-${r}`},sortableValue:Od(t,e.status)},{title:Md.createElement(Nn,{cluster:e}),props:{"data-testid":`cluster-hosts-count-${r}`},sortableValue:"enabledHostCount"in e?fn(e):gn(e)},{title:a.title,props:{"data-testid":`cluster-created-time-${r}`},sortableValue:a.sortableValue}],props:{name:r,id:o,baseDnsDomain:i}}},Wd=e=>e?.cells?.[3],zd=e=>Rl(_d,t=>t.map(o=>YO(o,e))),Ky=Rl(_d,e=>e.map(t=>t.name)),jO=Rl(Ky,qO,(e,t)=>e.filter(o=>o!==t));var Jy={};lr(Jy,{OCM_CLUSTER_LIST_LINK:()=>Ud,getBasePermissions:()=>Bd,isSingleClusterMode:()=>To,ocmPermissionsToAIPermissions:()=>Kl,routeBasePath:()=>ue,setRouteBasePath:()=>UO});var To=()=>process.env.REACT_APP_BUILD_MODE==="single-cluster",Bd=e=>{if(e.permissions)return{isViewerMode:!e.permissions.canEdit};let t={isViewerMode:!1};if(!process.env.REACT_APP_CLUSTER_PERMISSIONS)return t;let o=JSON.parse(process.env.REACT_APP_CLUSTER_PERMISSIONS);return{...t,...Kl(o)}},Kl=e=>{let t={};return e.canEdit!==void 0&&(t.isViewerMode=!e.canEdit),t},Ud="/openshift";import{saveAs as Zy}from"file-saver";import RO from"lodash/get";var _s=async(e,t)=>{try{if(oe){let{data:o}=await M.getPresignedForClusterFiles({clusterId:t,fileName:"logs",hostId:void 0,logsType:"all"});Zy(o.url)}else{let{data:o,fileName:r}=await re.downloadLogs(t);Zy(o,r)}}catch(o){x(o,r=>{e({title:"Could not download cluster installation logs.",message:D(r)})})}},Qy=(e,t)=>e.filter(o=>o.status!=="disabled"&&o.role===t).length,KO=e=>Qy(e,"master"),XO=e=>Qy(e,"worker"),ev=(e,t)=>{if(!e.hosts)return 0;let o=KO(e.hosts),r=XO(e.hosts),s=o>=3&&r===0,i=o>=3&&r>=2,n=o===1;return e.hosts.filter(l=>"inventory"in l).filter(l=>l.role==="worker"&&i||l.role==="master"&&s||l.role==="master"&&n).map(l=>O(l.inventory)||{}).map(l=>RO(l,t,0)).reduce((l,p)=>l+p,0)},ppe=e=>ev(e,"cpu.count"),upe=e=>ev(e,"memory.physicalBytes"),Xo=e=>`cluster-detail-${e}`;import te from"react";import{Link as FS}from"react-router-dom";import{Stack as Bz,StackItem as gm,TextContent as VS,Text as NS,ButtonVariant as Tp,GridItem as Gs,Grid as Uz}from"@patternfly/react-core";import{Fragment as G_,createElement as Hi,useMemo as U_}from"react";import tL from"react";import{AlertActionLink as oL}from"@patternfly/react-core";import Xl from"react";var{openDialog:JO,closeDialog:ZO}=gl.actions,QO=gl.reducer,eL=["eventsDialog","editHostDialog","deleteHostDialog","resetHostDialog","additionalNTPSourcesDialog","resetClusterDialog","cancelInstallationDialog","discoveryImageDialog","day2DiscoveryImageDialog","UpdateDay2ApiVipDialog","massUpdateHostnameDialog","massDeleteHostDialog"],tv=Xl.createContext(void 0),Ei=({children:e})=>{let[t,o]=Xl.useReducer(QO,{});function r(n){return a=>o(JO({dialogId:n,data:a}))}let s=n=>()=>o(ZO({dialogId:n})),i=eL.reduce((n,a)=>{let l=t[a];return n[a]={isOpen:!!l,open:p=>r(a)(p),close:()=>s(a)(),data:l},n},{});return Xl.createElement(tv.Provider,{value:i},e)},se=()=>{let e=Xl.useContext(tv);if(e===void 0)throw new Error("useModalDialogsContext must be used within a ModalDialogsContextProvider");return e};var Po=()=>{let{additionalNTPSourcesDialog:{open:e}}=se();return tL.createElement(oL,{onClick:()=>e()},"Add NTP sources")};import{breakWord as dL,expandable as mL,sortable as wo}from"@patternfly/react-table";import{Fragment as uv,createElement as Nt}from"react";import{Address4 as ov,Address6 as rv}from"ip-address";import ao from"react";import{Button as rL,ButtonVariant as sL,Popover as iL}from"@patternfly/react-core";import{CheckCircleIcon as nL,ExclamationCircleIcon as aL,PendingIcon as lL}from"@patternfly/react-icons";import{global_danger_color_100 as pL,global_success_color_100 as uL}from"@patternfly/react-tokens";var Gd=({validation:e,actions:t,children:o})=>{let{t:r}=f(),s=pi(r)[e.id];return ao.createElement(iL,{headerContent:ao.createElement("div",null,ks(r)[e.id]),bodyContent:ao.createElement("div",null,xo(e.message),e.status==="failure"&&s&&` ${s}`),footerContent:t,zIndex:300},ao.createElement(rL,{variant:sL.link,isInline:!0},o))},cL=({validation:e,failureActions:t,pendingActions:o,children:r,showFailure:s=!0,showPending:i=!1,showSuccess:n=!1})=>{if(e){if(s&&e.status==="failure")return ao.createElement(Gd,{validation:e,actions:t},ao.createElement(aL,{color:pL.value})," ",r);if(i&&e.status==="pending")return ao.createElement(Gd,{validation:e,actions:o},ao.createElement(lL,null)," ",r);if(n&&e.status==="success")return ao.createElement(Gd,{validation:e},ao.createElement(nL,{color:uL.value})," ",r)}return ao.createElement(ao.Fragment,null,r)},Ai=cL;var Jl=(e,t)=>e.find(o=>(o.ipv4Addresses||[]).reduce((i,n)=>(ov.isValid(n)&&i.push(new ov(n)),i),[]).find(i=>i.isInSubnet(t))?!0:(o.ipv6Addresses||[]).reduce((i,n)=>(rv.isValid(n)&&i.push(new rv(n)),i),[]).find(i=>i.isInSubnet(t))),Jo=(e,t,o,r)=>({header:{title:e("ai:Hostname"),props:{id:"col-header-hostname"},transforms:[wo],cellFormatters:[mL],cellTransforms:[dL]},cell:s=>{let i=He(s),n=t?()=>t(s):void 0,a=Bo(s,i);return{title:Nt(Vn,{host:s,inventory:i,onEditHostname:n,hosts:o,readonly:r?!r():!1}),props:{"data-testid":"host-name"},sortableValue:a||""}}}),Zr=(e,t,o,r,s)=>({header:{title:e("ai:Role"),props:{id:"col-header-role"},transforms:[wo]},cell:i=>{let n=o?p=>o(i,p):void 0,a=t?.(i),l=cc(i,e,r);return{title:Nt(Sl,{host:i,readonly:!a,role:l,onEditRole:n,position:s}),props:{"data-testid":"host-role"},sortableValue:l}}}),sv=(e,t,o,r)=>({header:{title:e("ai:Status"),props:{id:"col-header-status"},transforms:[wo]},cell:s=>{let i=O(s.validationsInfo)||{},n=o?()=>o(s):void 0,a=Wg(i)&&["known","known-unbound"].includes(s.status)?"Some validations failed":void 0;return{title:Nt(Vs,{host:s,status:{...ki[s.status],sublabel:a},onEditHostname:n,validationsInfo:i,AdditionalNTPSourcesDialogToggleComponent:t,UpdateDay2ApiVipDialogToggleComponent:r}),props:{"data-testid":"host-status"},sortableValue:s.status}}}),Zl={header:{title:"Discovered on",props:{id:"col-header-discoveredat"},transforms:[wo]},cell:e=>{let{createdAt:t}=e,o=pl(t);return{title:o.title,props:{"data-testid":"host-discovered-time"},sortableValue:o.sortableValue}}};var Ql={header:{title:"CPU Cores",props:{id:"col-header-cpucores"},transforms:[wo]},cell:e=>{let t=He(e),{cores:o}=Ti(t),s=(O(e.validationsInfo)||{})?.hardware?.find(i=>i.id==="has-cpu-cores-for-role");return{title:Nt(Ai,{validation:s},o.title),props:{"data-testid":"host-cpu-cores"},sortableValue:o.sortableValue}}},ep={header:{title:"Memory",props:{id:"col-header-memory"},transforms:[wo]},cell:e=>{let t=He(e),{memory:o}=Ti(t),s=(O(e.validationsInfo)||{})?.hardware?.find(i=>i.id==="has-memory-for-role");return{title:Nt(Ai,{validation:s},o.title),props:{"data-testid":"host-memory"},sortableValue:o.sortableValue}}},Fi={header:{title:"Total storage",props:{id:"col-header-disk"},transforms:[wo]},cell:e=>{let t=He(e),{disk:o}=Ti(t),s=(O(e.validationsInfo)||{})?.hardware?.find(i=>i.id==="has-min-valid-disks");return{title:Nt(Ai,{validation:s},o.title),props:{"data-testid":"host-disks"},sortableValue:o.sortableValue}}},Qr=e=>({header:{title:Nt(Nn,{cluster:e,inParenthesis:!0})}}),iv=e=>({header:{title:"Active NIC",transforms:[wo]},cell:t=>{let r=He(t).interfaces||[],s=Ds(e),i=s?fr(s):null,n=i?Jl(r,i):null;return{title:n?.name||de,props:{"data-testid":"nic-name"},sortableValue:n?.name||de}}}),nv=e=>({header:{title:"IPv4 address",transforms:[wo]},cell:t=>{let r=He(t).interfaces||[],s=Ds(e),i=s?fr(s):null,n=i?Jl(r,i):null;return{title:(n?.ipv4Addresses||[]).join(", ")||de,props:{"data-testid":"nic-ipv4"},sortableValue:(n?.ipv4Addresses||[]).join(", ")||de}}}),av=e=>({header:{title:"IPv6 address",transforms:[wo]},cell:t=>{let r=He(t).interfaces||[],s=Ds(e),i=s?fr(s):null,n=i?Jl(r,i):null;return{title:(n?.ipv6Addresses||[]).join(", ")||de,props:{"data-testid":"nic-ipv6"},sortableValue:(n?.ipv6Addresses||[]).join(", ")||de}}}),lv=e=>({header:{title:"MAC address",transforms:[wo]},cell:t=>{let r=He(t).interfaces||[],s=Ds(e),i=s?fr(s):null,n=i?Jl(r,i):null;return{title:n?.macAddress||de,props:{"data-testid":"nic-mac-address"},sortableValue:n?.macAddress||de}}}),tp=({title:e,description:t,disabled:o})=>Nt(uv,null,e,o&&Nt(uv,null,Nt("br",null),t)),pv=({onInstallHost:e,canInstallHost:t,onEditHost:o,canEditHost:r,onHostEnable:s,canEnable:i,onHostDisable:n,canDisable:a,onHostReset:l,canReset:p,onViewHostEvents:u,onDownloadHostLogs:c,canDownloadHostLogs:d,onDeleteHost:m,canDelete:g,onEditBMH:h,canEditBMH:C,canUnbindHost:I,onUnbindHost:S})=>y=>{let v=[];if(y){let w=He(y),E=Bo(y,w);if(e&&t?.(y)&&v.push({title:"Install host",id:`button-install-host-${E}`,onClick:()=>e(y)}),o&&r){let F=r(y);if(typeof F=="boolean")F&&v.push({title:"Change hostname",id:`button-edit-host-${E}`,onClick:()=>o(y)});else{let[q,Z]=F;v.push({title:Nt(tp,{disabled:!q,description:Z,title:"Change hostname"}),id:`button-edit-host-${E}`,onClick:()=>o(y),isDisabled:!q})}}if(s&&i?.(y)&&v.push({title:"Enable in cluster",id:`button-enable-in-cluster-${E}`,onClick:()=>s(y)}),n&&a?.(y)&&v.push({title:"Disable in cluster",id:`button-disable-in-cluster-${E}`,onClick:()=>n(y)}),l&&p?.(y)&&v.push({title:"Reset host",id:`button-reset-host-${E}`,onClick:()=>l(y)}),u&&v.push({title:"View host events",id:`button-view-host-events-${E}`,onClick:()=>u(y)}),c&&d?.(y)&&v.push({title:"Download host logs",id:`button-download-host-installation-logs-${E}`,onClick:()=>c(y)}),m&&g){let F=g(y);if(typeof F=="boolean")F&&v.push({title:"Delete host",id:`button-delete-host-${E}`,onClick:()=>m(y)});else{let[q,Z]=F;v.push({title:Nt(tp,{disabled:!q,description:Z,title:"Delete host"}),id:`button-delete-host-${E}`,onClick:()=>m(y),isDisabled:!q})}}if(h&&y.href==="bmc"&&C){let[F,q]=C(y);v.push({title:Nt(tp,{disabled:!F,description:q,title:"Edit BMC"}),id:`button-edit-bmh-host-${E}`,onClick:()=>h(y),isDisabled:!F})}if(S&&I){let[F,q]=I(y);v.push({title:Nt(tp,{disabled:!F,description:q,title:"Remove from the cluster"}),id:`button-unbind-host-${E}`,onClick:()=>S(y),isDisabled:!F})}}return v};import{useMemo as gL,useState as cv}from"react";var fL=[{title:"10",value:10},{title:"20",value:20}],Zo=e=>{let[t,o]=cv(10),[r,s]=cv(1),{onSetPage:i,onPerPageSelect:n}=gL(()=>({onSetPage:(l,p)=>s(p),onPerPageSelect:(l,p)=>o(p)}),[]);return{showPagination:e>10,perPage:t,page:r,onSetPage:i,onPerPageSelect:n,perPageOptions:fL}};import{Fragment as A_,createElement as Eo,useCallback as Ot,useContext as jv,useMemo as Jn,useState as E_}from"react";import{useDispatch as Yv,useSelector as D_}from"react-redux";import Xt from"react";import{Formik as hL}from"formik";import{object as PL}from"yup";import{Alert as CL,Form as yL,Modal as vL,ModalVariant as SL,ModalBoxBody as IL,ModalBoxFooter as bL,Button as dv,AlertActionCloseButton as xL,AlertVariant as kL}from"@patternfly/react-core";var TL=({additionalNtpSource:e,onClose:t,onAdditionalNtpSource:o})=>{let r={additionalNtpSource:e||""},s=a=>PL().shape({additionalNtpSource:nh.required(a("ai:Required field"))}),{t:i}=f(),n=(a,l)=>{if(l.setStatus({error:null}),o&&a.additionalNtpSource){let p=u=>l.setStatus({error:{title:"Failed to add NTP sources",message:u}});o(a.additionalNtpSource,p)}t()};return Xt.createElement(hL,{initialValues:r,initialTouched:{additionalNtpSource:!0},initialStatus:{error:null},validationSchema:s(i),onSubmit:n},({submitForm:a,status:l,setStatus:p,isSubmitting:u,isValid:c,dirty:d})=>Xt.createElement(Xt.Fragment,null,Xt.createElement(IL,null,Xt.createElement(yL,null,l.error&&Xt.createElement(CL,{variant:kL.danger,title:l.error.title,actionClose:Xt.createElement(xL,{onClose:()=>p({error:null})}),isInline:!0},l.error.message),Xt.createElement(ic,{name:"additionalNtpSource",label:i("ai:Additional NTP Sources"),helperText:i("ai:A comma separated list of IP or domain names of the NTP pools or servers. Additional NTP sources are added to all hosts to ensure all hosts clocks are synchronized with a valid NTP server. It may take a few minutes for the new NTP sources to sync."),isRequired:!0}))),Xt.createElement(bL,null,Xt.createElement(dv,{key:"submit",onClick:a,isDisabled:u||!c||!d,isLoading:u},i(u?"ai:Adding...":"ai:Add")),Xt.createElement(dv,{key:"cancel",variant:"link",onClick:t},i("ai:Cancel")))))},mv=({additionalNtpSource:e,isOpen:t,onClose:o,onAdditionalNtpSource:r})=>Xt.createElement(vL,{"aria-label":"Add NTP sources",title:"Add NTP sources",isOpen:t,onClose:o,variant:SL.small,hasNoBodyWrapper:!0},Xt.createElement(TL,{additionalNtpSource:e,onClose:o,onAdditionalNtpSource:r}));import{saveAs as fv}from"file-saver";var gv=async(e,t)=>{try{if(!t.clusterId)throw new Error(`Cannot download logs for host ${t.id}. Missing clusterId field value in host.`);if(oe){let{data:o}=await M.getPresignedForClusterFiles({clusterId:t.clusterId,fileName:"logs",hostId:t.id,logsType:"host"});fv(o.url)}else{let{data:o,fileName:r}=await re.downloadLogs(t.clusterId,t.id);fv(o,r)}}catch(o){x(o,r=>{e({title:"Could not download host logs.",message:D(r)})})}},hv=async(e,t,o,r)=>{try{let s={additionalNtpSource:o},{data:i}=await re.update(t.id,t.tags,s);e($e(i))}catch(s){x(s,()=>r(D(s)))}},Cv=e=>!!e.find(t=>(O(t.inventory||"")||{}).systemVendor?.virtual);import{createElement as jd,useMemo as XM}from"react";import{ConnectedIcon as jM}from"@patternfly/react-icons";import ie from"react";import{Checkbox as yv,Pagination as wL,PaginationVariant as DL}from"@patternfly/react-core";import{Table as EL,TableHeader as AL,TableBody as FL,SortByDirection as VL,RowWrapper as NL,InnerScrollContainer as HL}from"@patternfly/react-table";import OL from"lodash/xor";import LL from"classnames";var ML=({rowData:e})=>e?.key,vv=ie.memo(({rows:e,cells:t,onCollapse:o,className:r,sortBy:s,onSort:i,rowWrapper:n,testId:a,actionResolver:l})=>{let p=ie.useCallback(c=>l?.(c.obj),[l]),u={canCollapseAll:!1};return ie.createElement(HL,null,ie.createElement(EL,{rows:e,cells:t,onCollapse:o,"aria-label":"Hosts table",className:LL(r,"hosts-table"),sortBy:s,onSort:i,rowWrapper:n,"data-testid":a,actionResolver:l?p:void 0,...u},ie.createElement(AL,null),ie.createElement(FL,{rowKey:ML})))});vv.displayName="tableMemo";var _L=(e,t)=>e&&t?2:e||t?1:0,WL=e=>ie.createElement(NL,{...e,"data-testid":`host-row-${Number(e.rowProps?.rowIndex)}`}),$d=ie.createContext({selectedIDs:[],allIDs:[]}),zL=({onSelect:e,id:t})=>{let{selectedIDs:o}=ie.useContext($d),r=o?.includes(t);return ie.createElement(yv,{id:`select-${t}`,onChange:()=>e(!r),isChecked:r})},BL=({onSelect:e})=>{let{allIDs:t,selectedIDs:o}=ie.useContext($d),r=OL(t,o).length===0;return t.length?ie.createElement(yv,{id:"select-all",onChange:()=>e(!r),isChecked:r}):ie.createElement("div",null)},UL=({data:e,testId:t="hosts-table",className:o,content:r,ExpandComponent:s,getDataId:i,actionResolver:n,onSelect:a,children:l,selectedIDs:p,setSelectedIDs:u,perPage:c,page:d,onSetPage:m,onPerPageSelect:g,showPagination:h,perPageOptions:C,canSelectAll:I})=>{let S=ie.useMemo(()=>e.map(i),[e,i]);ie.useEffect(()=>{if(p&&u){let b=[];p.forEach(P=>{e.find(Ie=>i(Ie)===P)||b.push(P)}),b.length&&u(p.filter(P=>!b.includes(P)))}},[e,u,p,i]);let[y,v]=ie.useState({}),[w,E]=ie.useState({index:_L(!!a,!!s),direction:VL.asc}),F=ie.useRef(e);F.current!==e&&(F.current=e);let q=ie.useCallback(b=>{u?.(b?F.current.map(i):[])},[u,i]),[Z,ae]=ie.useMemo(()=>{let b=r;a&&(b=[{header:{title:I?ie.createElement(BL,{onSelect:q}):"",cellFormatters:[],props:{style:{width:"30px"}}},cell:k=>{let Ie=i(k),Hr=`select-${Ie}`;return{title:ie.createElement(zL,{id:Ie,onSelect:Qi=>a(k,Qi)}),props:{"data-testid":Hr}}}},...r]);let P=b.map(k=>k.header);return[b,P]},[r,a,i,q,I]),Y=ie.useMemo(()=>{let b=(e||[]).map(P=>{let k=i(P),Ie=Z.filter(Qi=>!!Qi.cell).map(Qi=>Qi.cell?.(P));return{isOpen:!!y[k],cells:Ie,key:`${k}-master`,obj:P,id:k}}).sort(ll(w,(P,k=1)=>s?P.cells?.[k-1]:P.cells?.[k])).slice((d-1)*c,d*c);return s&&(b=b.reduce((P,k,Ie)=>(P.push(k),s&&P.push({fullWidth:!0,cells:[{title:k.isOpen?ie.createElement(s,{obj:k.obj}):void 0}],key:`${k.id||""}-detail`,parent:Ie*2}),P),[])),b},[Z,s,i,e,y,w,d,c]),je=ie.useMemo(()=>Y.length?Y:fh(l,ae.length),[Y,ae,l]),tt=ie.useCallback((b,P)=>{let k=Y[P].id;k&&v(Object.assign({},y,{[k]:!y[k]}))},[Y,y]),vt=ie.useCallback((b,P,k)=>{v({}),E({index:P,direction:k})},[]);return ie.createElement(ie.Fragment,null,ie.createElement($d.Provider,{value:{selectedIDs:p,allIDs:S}},ie.createElement(vv,{rows:je,cells:ae,onCollapse:s?tt:void 0,className:o,sortBy:w,onSort:vt,rowWrapper:WL,"data-testid":t,actionResolver:n})),h&&ie.createElement(wL,{variant:DL.bottom,itemCount:S.length,perPage:c,onPerPageSelect:g,page:d,onSetPage:m,perPageOptions:C}))},op=UL;import ce from"react";import{Grid as MM,GridItem as Ev}from"@patternfly/react-core";import{Table as _M,TableHeader as WM,TableBody as zM,TableVariant as BM,RowWrapper as UM}from"@patternfly/react-table";import Sv from"react";var GL=(e,t)=>{switch(t){case"failure":return e("ai:Unreachable");case"success":return e("ai:Synced");default:return e("ai:Not available")}},$L=({validationsInfo:e,AdditionalNTPSourcesDialogToggleComponent:t})=>{let o=e.network?.find(i=>i.id==="ntp-synced"),r=[];t&&r.push(Sv.createElement(t,{key:"add-ntp-sources"}));let{t:s}=f();return Sv.createElement(Ai,{validation:o,failureActions:r,pendingActions:r,showSuccess:!0,showPending:!0},GL(s,o?.status))},Iv=$L;import sp from"react";import{Grid as HM,GridItem as OM}from"@patternfly/react-core";import Ht from"react";import{TextContent as mM,Text as fM,TextVariants as gM,Popover as hM}from"@patternfly/react-core";import{Table as CM,TableHeader as yM,TableBody as vM,TableVariant as SM,RowWrapper as IM}from"@patternfly/react-table";import es from"react";import{Dropdown as qL,DropdownItem as YL,DropdownToggle as jL}from"@patternfly/react-core";import{CaretDownIcon as RL}from"@patternfly/react-icons";var bv=(e,t,o)=>e.id===t?nn(o).install:nn(o).none,KL=({host:e,disk:t,installationDiskId:o,isEditable:r,onDiskRole:s})=>{let{t:i}=f(),n=bv(t,o,i);return r&&t.id!==o&&s?es.createElement(XL,{host:e,disk:t,installationDiskId:o,onDiskRole:s}):es.createElement(es.Fragment,null,n)},XL=({host:e,disk:t,installationDiskId:o,onDiskRole:r})=>{let[s,i]=qo(!1),[n,a]=qo(!1),{t:l}=f(),p=[es.createElement(YL,{key:"install",id:"install",isDisabled:!t.installationEligibility?.eligible,description:!t.installationEligibility?.eligible&&l("ai:Disk is not eligible for installation")},nn(l).install)],u=es.useCallback(m=>{(async()=>{m?.currentTarget.id&&(a(!0),await r(e.id,t.id,m.currentTarget.id),a(!1)),i(!1)})()},[i,a,r,e.id,t.id]),c=bv(t,o,l),d=es.useMemo(()=>es.createElement(jL,{onToggle:m=>i(m),toggleIndicator:RL,isDisabled:n,className:"pf-c-button pf-m-link pf-m-inline"},c),[i,c,n]);return es.createElement(qL,{onSelect:u,dropdownItems:p,toggle:d,isOpen:s,isPlain:!0})},xv=KL;import Ir from"react";import{Alert as JL,AlertVariant as ZL,Button as QL,ButtonVariant as eM,List as tM,ListItem as oM,Popover as rM}from"@patternfly/react-core";var sM=({disk:e})=>{if(!e.installationEligibility?.eligible){let t=e.installationEligibility?.notEligibleReasons?.length||0;return Ir.createElement(rM,{headerContent:Ir.createElement("div",null,"Disk limitations"),bodyContent:Ir.createElement(iM,{...e.installationEligibility}),minWidth:"30rem",maxWidth:"50rem"},Ir.createElement(QL,{variant:eM.link,isInline:!0},t))}return null},kv=sM,iM=({eligible:e,notEligibleReasons:t})=>{let o=[],{t:r}=f();return e||o.push(Ir.createElement(JL,{key:"install-eligibility",variant:ZL.warning,title:r("ai:Disk is not eligible for installation"),isInline:!0},t&&Ir.createElement(tM,null,t.map(s=>Ir.createElement(oM,{key:s},s))))),Ir.createElement(Ir.Fragment,null,o)};import{ExclamationTriangleIcon as bM}from"@patternfly/react-icons";import{global_warning_color_100 as xM}from"@patternfly/react-tokens/dist/js/global_warning_color_100";import Tv from"react";import{Checkbox as nM,Tooltip as aM}from"@patternfly/react-core";var rp=(e,t)=>e===t,Kn=(e,t)=>Mo(e.skipFormattingDisks?e.skipFormattingDisks:"").split(",").filter(o=>o===t).length>0,Pv=(e,t)=>Mo(e.disksToBeFormatted?e.disksToBeFormatted:"").split(",").filter(o=>o===t).length>0,lM=(e,t,o)=>rp(t,o)?Kn(e,t):!1,pM=(e,t,o)=>(rp(t,o)||Pv(e,t))&&!Kn(e,t),uM=(e,t,o)=>rp(t,o)?!lM(e,t,o):!Pv(e,t),cM=(e,t,o,r)=>{r&&r(e,t,o)},dM=({host:e,diskId:t,installationDiskId:o,index:r,updateDiskSkipFormatting:s})=>Tv.createElement(aM,{hidden:!rp(t,o),content:"Installation disks are always being formatted"},Tv.createElement(nM,{id:`select-formatted-${e.id}-${r}`,isChecked:pM(e,t,o),isDisabled:uM(e,t,o),onChange:i=>cM(i,e.id,t,s)})),wv=dM;var kM=[{title:"Name"},{title:"Role"},{title:"Limitations"},{title:"Format?"},{title:"Drive type"},{title:"Size"},{title:"Serial"},{title:"Model"},{title:"WWN"}],TM=({rowData:e})=>e?.key,PM=e=>Ht.createElement(IM,{...e,"data-testid":`disk-row-${e.row?.key||""}`}),wM=()=>Ht.createElement(mM,null,Ht.createElement(fM,{component:gM.p},"This bootable disk will skip formatting")),DM=({canEditDisks:e,host:t,disks:o,installationDiskId:r,testId:s,onDiskRole:i,updateDiskSkipFormatting:n})=>{let a=!!e?.(t),l=[...o].sort((p,u)=>p.name?.localeCompare(u.name||"")||0).map((p,u)=>({cells:[{title:Ht.createElement(Ht.Fragment,null,Kn(t,p.id)&&Ht.createElement(hM,{bodyContent:Ht.createElement(wM,null),minWidth:"20rem",maxWidth:"30rem"},Ht.createElement(bM,{color:xM.value,size:"sm"}))," ",p.bootable?`${p.name||""} (bootable)`:p.name),props:{"data-testid":"disk-name"}},{title:Ht.createElement(xv,{host:t,disk:p,installationDiskId:r,isEditable:a,onDiskRole:i}),props:{"data-testid":"disk-role"}},{title:Ht.createElement(kv,{disk:p}),props:{"data-testid":"disk-limitations"}},{title:Ht.createElement(wv,{host:t,diskId:p.id,installationDiskId:r,index:u,updateDiskSkipFormatting:n}),props:{"data-testid":"disk-formatted"}},{title:p.driveType,props:{"data-testid":"drive-type"}},{title:Io(p.sizeBytes||0,2,"si"),props:{"data-testid":"disk-size"}},{title:p.serial,props:{"data-testid":"disk-serial"}},{title:p.model,props:{"data-testid":"disk-model"}},{title:p.wwn,props:{"data-testid":"disk-wwn"}}],key:p.path}));return Ht.createElement(CM,{"data-testid":s,rows:l,cells:kM,variant:SM.compact,"aria-label":"Host's disks table",borders:!1,rowWrapper:PM},Ht.createElement(yM,null),Ht.createElement(vM,{rowKey:TM}))},Dv=DM;import qd from"react";import{TextContent as EM,Text as AM,TextVariants as FM,GridItem as VM}from"@patternfly/react-core";var NM=({title:e,testId:t})=>qd.createElement(VM,null,qd.createElement(EM,null,qd.createElement(AM,{"data-testid":t,component:FM.h3},e))),Xn=NM;var LM=({host:e,canEditDisks:t,onDiskRole:o,updateDiskSkipFormatting:r})=>{let i=He(e).disks||[];return sp.createElement(HM,{hasGutter:!0},sp.createElement(Xn,{testId:"disks-section",title:`${i.length} Disk${i.length===1?"":"s"}`}),sp.createElement(OM,null,sp.createElement(Dv,{testId:"disks-table",canEditDisks:t,host:e,disks:i,installationDiskId:e.installationDiskId,onDiskRole:o,updateDiskSkipFormatting:r})))},ip=LM;var Yd=({children:e})=>ce.createElement(Ev,{span:4},ce.createElement(It,null,e)),GM=[{title:"Name"},{title:"MAC address"},{title:"IPv4 address"},{title:"IPv6 address"},{title:"Speed"}],$M=({rowData:e})=>e?.name?.title,qM=e=>ce.createElement(UM,{...e,"data-testid":`nic-row:${e.row?.key}`}),YM=({interfaces:e,testId:t})=>{let o=e.sort((s,i)=>s.name?.localeCompare(i.name||"")||0).map(s=>({cells:[{title:s.name,props:{"data-testid":"nic-name"}},{title:s.macAddress,props:{"data-testid":"nic-mac"}},{title:(s.ipv4Addresses||[]).join(", "),props:{"data-testid":"nic-ipv4"}},{title:(s.ipv6Addresses||[]).join(", "),props:{"data-testid":"nic-ipv6"}},{title:s.speedMbps&&s.speedMbps>0?`${s.speedMbps} Mbps`:"N/A",props:{"data-testid":"nic-speed"}}],key:s.name})),{t:r}=f();return ce.createElement(_M,{"data-testid":t,rows:o,cells:GM,variant:BM.compact,"aria-label":r("ai:Host's network interfaces table"),borders:!1,rowWrapper:qM},ce.createElement(WM,null),ce.createElement(zM,{rowKey:$M}))},Ws=({host:e,canEditDisks:t,onDiskRole:o,AdditionalNTPSourcesDialogToggleComponent:r,hideNTPStatus:s=!1,updateDiskSkipFormatting:i})=>{let{t:n}=f(),{id:a,validationsInfo:l}=e,p=He(e),u=ce.useMemo(()=>O(l)||{},[l]),c=Ti(p),d=p.interfaces||[],m=p.bmcAddress;p.bmcV6address&&(m=m?`${m}, ${p.bmcV6address}`:p.bmcV6address),m=m||de;let g=_g(p,n),h=ce.useMemo(()=>ce.createElement(Iv,{AdditionalNTPSourcesDialogToggleComponent:r,validationsInfo:u}),[r,u]);return ce.createElement(MM,{hasGutter:!0},ce.createElement(Xn,{testId:"host-details-section",title:"Host details"}),ce.createElement(Yd,null,ce.createElement(A,{testId:"uuid",title:"UUID",value:a}),ce.createElement(A,{testId:"manufacturer",title:n("ai:Manufacturer"),value:p.systemVendor?.manufacturer||de}),ce.createElement(A,{testId:"product",title:n("ai:Product"),value:p.systemVendor?.productName||de}),ce.createElement(A,{testId:"serial-number",title:"Serial number",value:c.serialNumber})),ce.createElement(Yd,null,ce.createElement(A,{testId:"memory-capacity",title:n("ai:Memory capacity"),value:c.memory.title}),ce.createElement(A,{testId:"cpu-model",title:n("ai:CPU model name"),value:p.cpu?.modelName||de}),ce.createElement(A,{testId:"cpu-cores-and-clock",title:n("ai:CPU cores and clock speed"),value:c.cpuSpeed}),ce.createElement(A,{testId:"cpu-arch",title:n("ai:CPU architecture"),value:p.cpu?.architecture||de})),ce.createElement(Yd,null,ce.createElement(A,{testId:"hw-type",title:"Hardware type",value:g}),ce.createElement(A,{testId:"bmc-address",title:"BMC address",value:m}),ce.createElement(A,{testId:"boot-mode",title:n("ai:Boot mode"),value:p.boot?.currentBootMode||de}),p.boot?.pxeInterface&&ce.createElement(A,{testId:"pxe-interface",title:n("ai:PXE interface"),value:p.boot?.pxeInterface}),ce.createElement(A,{isHidden:s,testId:"ntp-status",title:n("ai:NTP status"),value:h})),ce.createElement(ip,{host:e,onDiskRole:o,canEditDisks:t,updateDiskSkipFormatting:i}),ce.createElement(Xn,{testId:"nics-section",title:`${d.length} NIC${d.length===1?"":"s"}`}),ce.createElement(Ev,null,ce.createElement(YM,{interfaces:d,testId:"nics-table"})))};var RM=e=>e.id,Av=({setDiscoveryHintModalOpen:e,isSNO:t=!1})=>{let{t:o}=f();return jd(bo,{icon:jM,title:o("ai:Waiting for host...",{count:+t}),content:o("ai:Hosts may take a few minutes to appear here after booting."),secondaryActions:e&&[jd(fy,{key:"hosts-not-showing",isSNO:t,setDiscoveryHintModalOpen:e})]})};var KM=({hosts:e,skipDisabled:t,...o})=>{let r=XM(()=>(e||[]).filter(s=>!t||s.status!=="disabled"),[e,t]);return jd(op,{getDataId:RM,data:r,...o})},ts=KM;import Rd from"react";import{Modal as JM,ModalVariant as ZM,Button as Fv,ButtonVariant as Vv}from"@patternfly/react-core";var QM=({isOpen:e,hostname:t,onClose:o,onReset:r})=>Rd.createElement(JM,{title:"Reset Host",isOpen:e,onClose:o,variant:ZM.small,actions:[Rd.createElement(Fv,{"data-testid":"reset-host-submit",key:"confirm",variant:Vv.danger,onClick:r},"Reset"),Rd.createElement(Fv,{key:"cancel",variant:Vv.link,onClick:o},"Cancel")]},"Are you sure you want to reset host",` ${t||""}`," ?"),Nv=QM;import Kd from"react";import{Modal as e_,ModalVariant as t_,Button as Hv,ButtonVariant as Ov}from"@patternfly/react-core";var o_=({isOpen:e,hostname:t,onClose:o,onDelete:r})=>Kd.createElement(e_,{title:"Delete Host",isOpen:e,onClose:o,variant:t_.small,actions:[Kd.createElement(Hv,{"data-testid":"delete-host-submit",key:"confirm",variant:Ov.danger,onClick:r},"Delete"),Kd.createElement(Hv,{key:"cancel",variant:Ov.link,onClick:o},"Cancel")]},"Are you sure you want to delete host",` ${t||""}`," ?"),Lv=o_;var Do=async(e,t,o)=>{try{let{data:r}=await Ml.list(e);t(r)}catch(r){x(r,()=>{o("Failed to load events")})}};import Wv from"react";import{Modal as f_,ModalVariant as g_}from"@patternfly/react-core";import Jt from"react";import{object as m_}from"yup";import{Button as Mv,ButtonVariant as r_,ButtonType as s_,Form as i_,ModalBoxBody as n_,ModalBoxFooter as a_,AlertVariant as l_,Alert as p_,AlertActionCloseButton as u_}from"@patternfly/react-core";import{Formik as c_}from"formik";var d_=({onUpdateDay2ApiVip:e,onClose:t,currentApiVip:o})=>{let{t:r}=f(),s=Jt.useRef();Jt.useEffect(()=>{s.current?.focus(),s.current?.select()},[]);let i={apiVip:o},n=Jt.useMemo(()=>m_().shape({apiVip:ah.required(r("ai:Required field"))}),[r]);return Jt.createElement(c_,{initialValues:i,validationSchema:n,initialStatus:{error:null},onSubmit:async(a,l)=>{if(a.apiVip){let p=u=>{let c={error:{title:"Failed to update API IP",message:u}};l.setStatus(c)};await e(a.apiVip,p),t()}}},({handleSubmit:a,status:l,setStatus:p,isSubmitting:u,isValid:c,dirty:d})=>{let{error:m}=l;return Jt.createElement(i_,{onSubmit:a},Jt.createElement(n_,null,Jt.createElement(wn,null,m&&Jt.createElement(p_,{variant:l_.danger,title:m.title,actionClose:Jt.createElement(u_,{onClose:()=>p({error:null})}),isInline:!0},m.message),Jt.createElement(St,{label:"Set the IP or domain used to reach the cluster",name:"apiVip",ref:s,isRequired:!0}))),Jt.createElement(a_,null,Jt.createElement(Mv,{key:"submit",type:s_.submit,isDisabled:u||!c||!d},"Update"),Jt.createElement(Mv,{key:"cancel",variant:r_.link,onClick:t},"Cancel")))})},_v=d_;var h_=({isOpen:e,...t})=>Wv.createElement(f_,{"aria-label":"Update cluster hostname",title:"Update cluster hostname",isOpen:e,variant:g_.small,hasNoBodyWrapper:!0},Wv.createElement(_v,{...t})),zv=h_;import{sortable as T_}from"@patternfly/react-table";import qv from"react";var Xd="new",Bv=(e,t,o,r)=>{if(e===Xd&&!t)return"operators";if(t&&!t.isDataComplete)return t.view===xe.YAML?"static-ip-yaml-view":"static-ip-network-wide-configurations";switch(o){case"ready":return"review";case"pending-for-input":case"adding-hosts":case"insufficient":return C_(r);default:return"cluster-details"}},C_=e=>{let t=y_(e),o="host-discovery",r;for(let s of t)if(r=Uh(s,qe,o),r!==void 0)break;return r||o},y_=e=>{let t=[];return e?.forEach(o=>{let r=O(o.validationsInfo)||{};Object.keys(r).forEach(s=>{let i=n=>{n.status==="failure"&&t.push(n.id)};r[s].forEach(i)})}),t},Uv=()=>({cluster:{groups:[],validationIds:[]},host:{allowedStatuses:[],groups:[],validationIds:[]},softValidationIds:[]}),Jd=Uv(),v_=Uv(),S_={cluster:{groups:[],validationIds:["pull-secret-set","dns-domain-defined"]},host:{allowedStatuses:[],groups:[],validationIds:[]},softValidationIds:[]},I_={cluster:{groups:[],validationIds:["sufficient-masters-count","lso-requirements-satisfied","odf-requirements-satisfied","lvm-requirements-satisfied","cnv-requirements-satisfied"]},host:{allowedStatuses:["known","disabled"],groups:["hardware"],validationIds:["connected","media-connected","lso-requirements-satisfied","odf-requirements-satisfied","lvm-requirements-satisfied","cnv-requirements-satisfied"]},softValidationIds:["no-skip-installation-disk","no-skip-missing-disk"]},b_={cluster:{groups:[],validationIds:["sufficient-masters-count"]},host:{allowedStatuses:["known","disabled"],groups:["hardware"],validationIds:["connected","media-connected","no-skip-installation-disk","no-skip-missing-disk"]},softValidationIds:[]},x_={cluster:{groups:["network"],validationIds:[]},host:{allowedStatuses:["known","disabled"],groups:["network"],validationIds:[]},softValidationIds:["ntp-synced","container-images-available"]},k_={cluster:{groups:[],validationIds:["all-hosts-are-ready-to-install"]},host:{allowedStatuses:["known","disabled"],groups:[],validationIds:[]},softValidationIds:[]},qe={"cluster-details":S_,"static-ip-yaml-view":Jd,"static-ip-network-wide-configurations":Jd,"static-ip-host-configurations":Jd,operators:v_,"host-discovery":I_,storage:b_,networking:x_,review:k_},Gv=Bh(qe),os=({cluster:e})=>Yr("cluster-details",qe,e,e.hosts)==="ready",np=({cluster:e})=>Yr("host-discovery",qe,e,e.hosts)==="ready",ap=({cluster:e})=>Yr("storage",qe,e,e.hosts)==="ready",$v=({cluster:e})=>Yr("operators",qe,e,e.hosts)==="ready",lp=({cluster:e})=>Yr("networking",qe,e,e.hosts)==="ready",zs=e=>e.startsWith("static-ip");var P_=500,w_=e=>{let t=Fn("host-discovery",qe,e.host),o=ki[t],r=An(e.validationsInfo,"host-discovery",qe),s=Cl(r,"host-discovery",qe)?"Some validations failed":void 0;return qv.createElement(Vs,{...e,zIndex:e.isWithinModal?P_:void 0,status:{...o,sublabel:s},validationsInfo:r,AdditionalNTPSourcesDialogToggleComponent:Po})},Vi=({onEditHostname:e,isWithinModal:t})=>({header:{title:"Status",props:{id:"col-header-hwstatus"},transforms:[T_]},cell:o=>{let r=O(o.validationsInfo)||{};return{title:qv.createElement(w_,{host:o,onEditHostname:e?()=>e(o):void 0,validationsInfo:r,isWithinModal:t}),props:{"data-testid":"host-hw-status"},sortableValue:status}}});var rs=e=>{let{addAlert:t}=N(),{eventsDialog:o,editHostDialog:r,deleteHostDialog:s,resetHostDialog:i,massUpdateHostnameDialog:n,massDeleteHostDialog:a}=se(),{resetCluster:l}=jv(jr),{isViewerMode:p}=D_(R),u=Yv(),c=Jn(()=>({onDeleteHost:b=>{let P=He(b);s.open({hostId:b.id,hostname:b?.requestedHostname||P?.hostname})},onInstallHost:async b=>{let P=b.id;try{let{data:k}=await mt.install(b);l?l():u(Xr(k))}catch(k){x(k,()=>t({title:`Failed to enable host ${P}`,message:D(k)}))}}}),[u,l,t,s]),d=Ot(b=>{let{id:P,requestedHostname:k}=b,Ie=He(b),Hr=k||Ie?.hostname||P;o.open({hostId:P,hostname:Hr})},[o]),m=Ot(b=>{let P=He(b);r.open({host:b,inventory:P})},[r]),g=Ot(b=>{let P=He(b),k=b?.requestedHostname||P?.hostname||"";i.open({hostId:b.id,hostname:k})},[i]),h=Ot(b=>{gv(t,b)},[t]),C=Ot(async(b,P,k)=>{try{if(!P)throw new Error(`Cannot update disk role in host ${b}
|
|
25
|
-
Missing diskId`);let Ie=re.findHost(e.hosts,b);if(!Ie)throw new Error(`No host found with id:${b}`);let{data:Hr}=await mt.updateDiskRole(Ie,P,k);l?l():u(Xr(Hr))}catch(Ie){x(Ie,()=>t({title:"Failed to set disk role",message:D(Ie)}))}},[u,l,t,e.hosts]),I=Ot(async(b,P)=>{try{let k=re.findHost(e.hosts,b);if(!k)throw new Error(`No host found with id:${b}`);let{data:Ie}=await mt.updateHostODF(k,P);l?await l():u(Xr(Ie))}catch(k){x(k,()=>t({title:"Failed to update ODF status",message:Ge(k)}))}},[e.hosts,l,u,t]),S=Ot(async(b,P)=>{try{let{data:k}=await re.update(e.id,e.tags,{apiVipDnsName:b});u(
|
|
24
|
+
${lO(e)}`,Ay=(e,t)=>{let o=e.find(r=>r.startsWith(wd(t)));return o?o.split(" ")[1]:""},Ed=e=>({ipv4:Ay(e,B.ipv4),ipv6:Ay(e,B.ipv6)}),_l=e=>{let t=Ed(e);return t[B.ipv4]&&t[B.ipv6]?"dualStack":t[B.ipv4]?"ipv4":null},Bn=(e,t)=>({address:[{ip:e,"prefix-length":t}],enabled:!0,dhcp:!1}),Fy=e=>({config:{server:e.split(",")}}),Ad=(e,t,o)=>o.useVlan&&o.vlanId?{name:Dd(e,o.vlanId),type:Kr.VLAN,state:"up",vlan:{"base-iface":e,id:o.vlanId},...t}:{name:e,type:Kr.ETHERNET,state:"up",...t},Vy=(e,t,o)=>({destination:cO[e],"next-hop-address":t,"next-hop-interface":o,"table-id":dO});var mO="01:23:45:67:89:AB",Fd="DUMMY",Wl=e=>{let t=e===B.ipv4?4:6;return`${Fd}${t}`},Un={ipv4:{prefixLength:24,ip:"0.0.0.0"},ipv6:{prefixLength:64,ip:"0::0"}},fO=()=>[{name:Wl(B.ipv4),type:Kr.ETHERNET,state:"up",ipv4:Bn(Un.ipv4.ip,Un.ipv4.prefixLength)}],Vd=()=>[{macAddress:mO,logicalNicName:Wl(B.ipv4)}],Ny=e=>e.startsWith(Fd),Hy=e=>e.includes(Fd),zl=()=>{let e={interfaces:fO()};return[{networkYaml:Ey(e,[Di]),macInterfaceMap:Vd()}]},Oy=()=>({isDataComplete:!1,view:xe.FORM,formViewProtocolType:null});var Bl={async getInfraEnvId(e,t){let o=Ls.getInfraEnvId(e,t);if(o===null){let{data:r}=await Ae.list(e);if(r.length>0&&(Ls.updateInfraEnvs(e,r),o=Ls.getInfraEnvId(e,t)),!o)throw Ls.removeInfraEnvId(e,t),new Error(`No InfraEnv could be found for clusterId: ${e} and architecture ${t||""}`)}return o},async getInfraEnv(e,t){let o=await Bl.getInfraEnvId(e,t);if(o){let{data:r}=await Ae.get(o);return r}else throw new Error(`No InfraEnv could be found for clusterId: ${e} and architecture ${t||""}`)},async getAllInfraEnvIds(e){let{data:t}=await Ae.list(e);return t.map(o=>o.id)},async create(e){if(!e.clusterId)throw new Error("Cannot create InfraEnv, clusterId is missing");let{data:t}=await Ae.register(e);if(!t.id)throw new Error("API returned no ID for the underlying InfraEnv");Ls.updateInfraEnvs(e.clusterId,[t])},async removeAll(e){let{data:t}=await Ae.list(e),o=t.map(r=>Ae.deregister(r.id));return Ls.removeInfraEnvs(e),Promise.all(o)},async updateAllInfraEnvsToDhcp(e){let o=(await Bl.getAllInfraEnvIds(e)).map(r=>Ae.update(r,{staticNetworkConfig:[]}));return Promise.all(o)},async setDummyStaticConfigToInfraEnv(e){let{data:t}=await Ae.update(e,{staticNetworkConfig:zl()});return t},async syncStaticIpConfigs(e,t,o){let{data:r}=await Ae.update(t,{staticNetworkConfig:o}),s=[];return(await Bl.getAllInfraEnvIds(e)).forEach(n=>{n!==t&&s.push(Ae.update(n,{staticNetworkConfig:o}))}),Promise.all(s).then(()=>r)}},it=Bl;import gO from"lodash/omit";var Ul={findHost(e=[],t){return e.find(o=>o.id===t)},async create(e){let{data:t}=await M.register(gO(e,"staticNetworkConfig"));return await it.create({name:`${e.name}_infra-env`,pullSecret:e.pullSecret,clusterId:t.id,openshiftVersion:e.openshiftVersion,cpuArchitecture:e.cpuArchitecture,staticNetworkConfig:e.staticNetworkConfig}),t},async remove(e){let{data:t}=await M.get(e),o=t.hosts??[];o.length>0&&await mt.removeAll(o),await it.removeAll(e),await M.deregister(e)},async downloadLogs(e,t){let{data:o,headers:r}=await M.downloadLogs(e,t),i=r["content-disposition"]?.match(/filename="(.+)"/)?.[1];return{data:o,fileName:i}},update(e,t,o){return M.abortLastGetRequest(),oe&&(o=Ul.updateClusterTags(t,o)),M.update(e,o)},async install(e,t){return oe&&Ul.updateClusterTags(t,{}).tags&&await Ul.update(e,t,{}),M.install(e)},updateClusterTags(e,t){let o=e?.split(",")||[];return o.includes(ci)?delete t.tags:(o?.push(ci),t.tags=o?.join(",")),t},async get(e){let{data:t}=await M.get(e);return t}},re=Ul;import hO from"lodash/omit";var Ly={diskEncryptionEnableOn(e,t){let o;return e&&t?o="all":t?o="workers":e?o="masters":o="none",o},getDiskEncryptionParams(e){return{mode:e.diskEncryptionMode,enableOn:e.highAvailabilityMode==="None"?e.enableDiskEncryptionOnMasters?"all":"none":Ly.diskEncryptionEnableOn(e.enableDiskEncryptionOnMasters,e.enableDiskEncryptionOnWorkers),tangServers:e.diskEncryptionMode==="tang"?JSON.stringify(e.diskEncryptionTangServers):void 0}}},Gl=Ly;var De;(function(o){o.STATIC="static",o.DHCP="dhcp"})(De||(De={}));var CO={getClusterCreateParams(e){let t=hO(e,["useRedHatDnsService","SNODisclaimer","enableDiskEncryptionOnMasters","enableDiskEncryptionOnWorkers","diskEncryptionMode","diskEncryption","diskEncryptionTangServers","hostsNetworkConfigurationType"]);return t.diskEncryption=Gl.getDiskEncryptionParams(e),zo({cpuArchitecture:t.cpuArchitecture})&&(t.userManagedNetworking=!0),e.hostsNetworkConfigurationType===De.STATIC&&(t.staticNetworkConfig=zl()),oe&&(t.tags=ci),t},getClusterDetailsInitialValues({cluster:e,infraEnv:t,urlSearchParams:o,...r}){let s=zC({cluster:e,...r}),n=new URLSearchParams(o).get("useArm")==="true",a=e?.cpuArchitecture||(n?L.ARM:L.x86),l=t?.staticNetworkConfig?De.STATIC:De.DHCP;return{...s,cpuArchitecture:a,hostsNetworkConfigurationType:l}}},Gn=CO;var yO={setPlatform(e,t,o){let s=t===void 0?o?"none":"baremetal":t;e.platform={type:s}},setSchedulableMasters(e,t,o){cn(o)||(e.schedulableMasters=t.schedulableMasters)}},$n=yO;var vO={async update(e,t,o,r,s){let i={httpProxy:r.httpProxy,httpsProxy:r.httpsProxy,noProxy:r.noProxy,pullSecret:s||void 0,sshPublicKey:r.sshPublicKey},n={proxy:{httpProxy:r.httpProxy,httpsProxy:r.httpsProxy,noProxy:r.noProxy},sshAuthorizedKey:r.sshPublicKey,pullSecret:s||void 0,staticNetworkConfig:r.staticNetworkConfig,imageType:r.imageType},{data:a}=await re.update(e,t,i);Ae.abortLastGetRequest();let{data:l}=await Ae.update(o,n);return{updatedCluster:a,updatedInfraEnv:l}}},$l=vO;var ql=e=>e.kind==="AddHostsCluster",SO=(e,t)=>e.hosts?.filter(({logsInfo:o})=>o&&t.includes(o))||[],My=e=>{let t=["completed","timeout"],o=e.logsInfo&&t.includes(e.logsInfo),r=SO(e,t).length;return(o?1:0)+r};var IO=e=>Wr(e).map(t=>({name:t.name,properties:t.properties})),_y=e=>IO(e).reduce((t,o)=>(o.name&&(t[o.name]=o),t),{}),Yl=e=>["preparing-for-installation","installing","installing-pending-user-action","finalizing"].includes(e.status),Wy=e=>e.hosts?.some(t=>t.skipFormattingDisks&&t.skipFormattingDisks.length>0);var bO=e=>Object.keys(e).some(t=>!!e[t]),xO={getOLMOperators(e,t){let o=_y(t),r=(s,i)=>{i?o[s]={name:s}:delete o[s]};return r(Wo,e.useOdfLogicalVolumeManager),r(Mr,e.useContainerNativeVirtualization),r(_o,e.useOpenShiftDataFoundation),bO(e)||r(Ba,!1),Object.values(o)},syncOperators(e,t){let o=e?.find(i=>i.name===Wo)===void 0,r=t?.find(i=>i.name===Wo)!==void 0,s={};return o&&r&&(s.useOdfLogicalVolumeManager=!0),s}},qn=xO;var Yn=PO("currentCluster/fetchClusterAsync",async(e,{rejectWithValue:t})=>{try{return await re.get(e)}catch(o){return x(o,()=>t({code:xu(o),message:D(o)}))}}),By={data:void 0,uiState:Q.LOADING,permissions:{isViewerMode:!1},errorDetail:void 0,isReloadScheduled:0},Uy=wO({initialState:By,name:"currentCluster",reducers:{updateClusterBase:(e,t)=>{let o=e.data?.hosts||[];return{...e,data:{...t.payload,hosts:o}}},updateCluster:(e,t)=>({...e,data:t.payload}),updateHost:(e,t)=>{let o=kO(e.data?.hosts,r=>r.id===t.payload.id);return o>=0&&TO(e,`data.hosts[${o}]`,t.payload),e},cleanCluster:()=>By,forceReload:e=>({...e,isReloadScheduled:e.isReloadScheduled+1}),cancelForceReload:e=>({...e,isReloadScheduled:0}),updateClusterPermissions:(e,t)=>({...e,permissions:t.payload})},extraReducers:e=>{e.addCase(Yn.pending,t=>{let o=t.uiState===Q.LOADED||t.uiState===Q.ERROR&&t.data;return{...t,uiState:o?Q.RELOADING:Q.LOADING}}).addCase(Yn.fulfilled,(t,o)=>({...t,data:o.payload,uiState:Q.LOADED})).addCase(Yn.rejected,(t,o)=>{let r=o.payload;return r.code===en&&!!t.data?{...t,uiState:Q.LOADED}:{...t,uiState:Q.ERROR,errorDetail:r}})}}),{updateCluster:qe,updateClusterBase:Gy,updateHost:Xr,cleanCluster:$y,forceReload:Jr,cancelForceReload:Nd,updateClusterPermissions:qy}=Uy.actions,Yy=Uy.reducer;import{createSlice as DO}from"@reduxjs/toolkit";var jy=DO({name:"infraEnvs",initialState:[],reducers:{},extraReducers:{}}),ble=jy.actions,Hd=jy.reducer;var Sr=Ry({reducer:{clusters:ky,currentCluster:Yy,infraEnvs:Hd},preloadedState:{}}),EO=Ry({reducer:{infraEnvs:Hd}});var Jy={};lr(Jy,{getClusterTableStatusCell:()=>Wd,selectClusterNames:()=>Xy,selectClusterNamesButCurrent:()=>jO,selectClusterTableRows:()=>zd,selectClustersUIState:()=>Rn,selectCurrentCluster:()=>AO,selectCurrentClusterPermissionsState:()=>R,selectCurrentClusterState:()=>jn,selectCurrentClusterUIState:()=>FO,selectIsCurrentClusterSNO:()=>Ms});var jn=e=>e.currentCluster,AO=e=>e.currentCluster.data,FO=e=>e.currentCluster.uiState,Ms=e=>e.currentCluster.data?.highAvailabilityMode==="None",R=e=>e.currentCluster?e.currentCluster.permissions:{isViewerMode:!1};import Md from"react";import{createSelector as Rl}from"reselect";import{Link as GO}from"react-router-dom";import ko from"react";import{global_danger_color_100 as VO,global_success_color_100 as NO,global_warning_color_100 as HO}from"@patternfly/react-tokens";import{ExclamationCircleIcon as OO,ExclamationTriangleIcon as LO,FileAltIcon as MO,CheckCircleIcon as _O,InProgressIcon as WO,BanIcon as zO}from"@patternfly/react-icons";var jl=({status:e,...t})=>{switch(e){case"cancelled":return ko.createElement(zO,{size:"sm",...t});case"insufficient":case"pending-for-input":case"ready":return ko.createElement(MO,{size:"sm",...t});case"error":return ko.createElement(OO,{color:VO.value,size:"sm",...t});case"installed":return ko.createElement(_O,{color:NO.value,size:"sm",...t});case"installing-pending-user-action":return ko.createElement(LO,{color:HO.value,size:"sm",...t});case"preparing-for-installation":case"installing":case"finalizing":case"adding-hosts":return ko.createElement(WO,{size:"sm",...t});default:return ko.createElement(ko.Fragment,null)}},Od=(e,t)=>dr(e)[t]||t,BO=({status:e,testId:t,className:o})=>{let{t:r}=f(),s=Od(r,e);return ko.createElement(ko.Fragment,null,ko.createElement(jl,{status:e,"data-testid":t,className:o})," ",s)},Ld=BO;var ue="",UO=e=>{ue=e};var _d=e=>e.clusters.data,$O=e=>e.clusters.uiState,qO=e=>e.currentCluster.data?.name,Rn=Rl([_d,$O],(e,t)=>{let{LOADED:o,EMPTY:r}=Q;return!e.length&&t===o?r:t}),YO=(e,t)=>{let{id:o,name:r="",openshiftVersion:s,baseDnsDomain:i,createdAt:n}=e,a=pl(n);return{cells:[{title:Md.createElement(GO,{key:r,to:`${ue}/clusters/${o}`,id:`cluster-link-${o}`},r),props:{"data-testid":`cluster-name-${r}`},sortableValue:r},{title:i||de,props:{"data-testid":`cluster-base-domain-${r}`},sortableValue:i},{title:s,props:{"data-testid":`cluster-version-${r}`},sortableValue:s},{title:Md.createElement(Ld,{status:e.status}),props:{"data-testid":`cluster-status-${r}`},sortableValue:Od(t,e.status)},{title:Md.createElement(Nn,{cluster:e}),props:{"data-testid":`cluster-hosts-count-${r}`},sortableValue:"enabledHostCount"in e?fn(e):gn(e)},{title:a.title,props:{"data-testid":`cluster-created-time-${r}`},sortableValue:a.sortableValue}],props:{name:r,id:o,baseDnsDomain:i}}},Wd=e=>e?.cells?.[3],zd=e=>Rl(_d,t=>t.map(o=>YO(o,e))),Xy=Rl(_d,e=>e.map(t=>t.name)),jO=Rl(Xy,qO,(e,t)=>e.filter(o=>o!==t));var Zy={};lr(Zy,{OCM_CLUSTER_LIST_LINK:()=>Ud,getBasePermissions:()=>Bd,isSingleClusterMode:()=>To,ocmPermissionsToAIPermissions:()=>Kl,routeBasePath:()=>ue,setRouteBasePath:()=>UO});var To=()=>process.env.REACT_APP_BUILD_MODE==="single-cluster",Bd=e=>{if(e.permissions)return{isViewerMode:!e.permissions.canEdit};let t={isViewerMode:!1};if(!process.env.REACT_APP_CLUSTER_PERMISSIONS)return t;let o=JSON.parse(process.env.REACT_APP_CLUSTER_PERMISSIONS);return{...t,...Kl(o)}},Kl=e=>{let t={};return e.canEdit!==void 0&&(t.isViewerMode=!e.canEdit),t},Ud="/openshift";import{saveAs as Qy}from"file-saver";import RO from"lodash/get";var _s=async(e,t)=>{try{if(oe){let{data:o}=await M.getPresignedForClusterFiles({clusterId:t,fileName:"logs",hostId:void 0,logsType:"all"});Qy(o.url)}else{let{data:o,fileName:r}=await re.downloadLogs(t);Qy(o,r)}}catch(o){x(o,r=>{e({title:"Could not download cluster installation logs.",message:D(r)})})}},ev=(e,t)=>e.filter(o=>o.status!=="disabled"&&o.role===t).length,KO=e=>ev(e,"master"),XO=e=>ev(e,"worker"),tv=(e,t)=>{if(!e.hosts)return 0;let o=KO(e.hosts),r=XO(e.hosts),s=o>=3&&r===0,i=o>=3&&r>=2,n=o===1;return e.hosts.filter(l=>"inventory"in l).filter(l=>l.role==="worker"&&i||l.role==="master"&&s||l.role==="master"&&n).map(l=>O(l.inventory)||{}).map(l=>RO(l,t,0)).reduce((l,p)=>l+p,0)},ppe=e=>tv(e,"cpu.count"),upe=e=>tv(e,"memory.physicalBytes"),Xo=e=>`cluster-detail-${e}`;import te from"react";import{Link as VS}from"react-router-dom";import{Stack as Bz,StackItem as gm,TextContent as NS,Text as HS,ButtonVariant as Tp,GridItem as Gs,Grid as Uz}from"@patternfly/react-core";import{Fragment as G_,createElement as Hi,useMemo as U_}from"react";import tL from"react";import{AlertActionLink as oL}from"@patternfly/react-core";import Xl from"react";var{openDialog:JO,closeDialog:ZO}=gl.actions,QO=gl.reducer,eL=["eventsDialog","editHostDialog","deleteHostDialog","resetHostDialog","additionalNTPSourcesDialog","resetClusterDialog","cancelInstallationDialog","discoveryImageDialog","day2DiscoveryImageDialog","UpdateDay2ApiVipDialog","massUpdateHostnameDialog","massDeleteHostDialog"],ov=Xl.createContext(void 0),Ei=({children:e})=>{let[t,o]=Xl.useReducer(QO,{});function r(n){return a=>o(JO({dialogId:n,data:a}))}let s=n=>()=>o(ZO({dialogId:n})),i=eL.reduce((n,a)=>{let l=t[a];return n[a]={isOpen:!!l,open:p=>r(a)(p),close:()=>s(a)(),data:l},n},{});return Xl.createElement(ov.Provider,{value:i},e)},se=()=>{let e=Xl.useContext(ov);if(e===void 0)throw new Error("useModalDialogsContext must be used within a ModalDialogsContextProvider");return e};var Po=()=>{let{additionalNTPSourcesDialog:{open:e}}=se();return tL.createElement(oL,{onClick:()=>e()},"Add NTP sources")};import{breakWord as dL,expandable as mL,sortable as wo}from"@patternfly/react-table";import{Fragment as cv,createElement as Nt}from"react";import{Address4 as rv,Address6 as sv}from"ip-address";import ao from"react";import{Button as rL,ButtonVariant as sL,Popover as iL}from"@patternfly/react-core";import{CheckCircleIcon as nL,ExclamationCircleIcon as aL,PendingIcon as lL}from"@patternfly/react-icons";import{global_danger_color_100 as pL,global_success_color_100 as uL}from"@patternfly/react-tokens";var Gd=({validation:e,actions:t,children:o})=>{let{t:r}=f(),s=pi(r)[e.id];return ao.createElement(iL,{headerContent:ao.createElement("div",null,ks(r)[e.id]),bodyContent:ao.createElement("div",null,xo(e.message),e.status==="failure"&&s&&` ${s}`),footerContent:t,zIndex:300},ao.createElement(rL,{variant:sL.link,isInline:!0},o))},cL=({validation:e,failureActions:t,pendingActions:o,children:r,showFailure:s=!0,showPending:i=!1,showSuccess:n=!1})=>{if(e){if(s&&e.status==="failure")return ao.createElement(Gd,{validation:e,actions:t},ao.createElement(aL,{color:pL.value})," ",r);if(i&&e.status==="pending")return ao.createElement(Gd,{validation:e,actions:o},ao.createElement(lL,null)," ",r);if(n&&e.status==="success")return ao.createElement(Gd,{validation:e},ao.createElement(nL,{color:uL.value})," ",r)}return ao.createElement(ao.Fragment,null,r)},Ai=cL;var Jl=(e,t)=>e.find(o=>(o.ipv4Addresses||[]).reduce((i,n)=>(rv.isValid(n)&&i.push(new rv(n)),i),[]).find(i=>i.isInSubnet(t))?!0:(o.ipv6Addresses||[]).reduce((i,n)=>(sv.isValid(n)&&i.push(new sv(n)),i),[]).find(i=>i.isInSubnet(t))),Jo=(e,t,o,r)=>({header:{title:e("ai:Hostname"),props:{id:"col-header-hostname"},transforms:[wo],cellFormatters:[mL],cellTransforms:[dL]},cell:s=>{let i=He(s),n=t?()=>t(s):void 0,a=Bo(s,i);return{title:Nt(Vn,{host:s,inventory:i,onEditHostname:n,hosts:o,readonly:r?!r():!1}),props:{"data-testid":"host-name"},sortableValue:a||""}}}),Zr=(e,t,o,r,s)=>({header:{title:e("ai:Role"),props:{id:"col-header-role"},transforms:[wo]},cell:i=>{let n=o?p=>o(i,p):void 0,a=t?.(i),l=cc(i,e,r);return{title:Nt(Sl,{host:i,readonly:!a,role:l,onEditRole:n,position:s}),props:{"data-testid":"host-role"},sortableValue:l}}}),iv=(e,t,o,r)=>({header:{title:e("ai:Status"),props:{id:"col-header-status"},transforms:[wo]},cell:s=>{let i=O(s.validationsInfo)||{},n=o?()=>o(s):void 0,a=Wg(i)&&["known","known-unbound"].includes(s.status)?"Some validations failed":void 0;return{title:Nt(Vs,{host:s,status:{...ki[s.status],sublabel:a},onEditHostname:n,validationsInfo:i,AdditionalNTPSourcesDialogToggleComponent:t,UpdateDay2ApiVipDialogToggleComponent:r}),props:{"data-testid":"host-status"},sortableValue:s.status}}}),Zl={header:{title:"Discovered on",props:{id:"col-header-discoveredat"},transforms:[wo]},cell:e=>{let{createdAt:t}=e,o=pl(t);return{title:o.title,props:{"data-testid":"host-discovered-time"},sortableValue:o.sortableValue}}};var Ql={header:{title:"CPU Cores",props:{id:"col-header-cpucores"},transforms:[wo]},cell:e=>{let t=He(e),{cores:o}=Ti(t),s=(O(e.validationsInfo)||{})?.hardware?.find(i=>i.id==="has-cpu-cores-for-role");return{title:Nt(Ai,{validation:s},o.title),props:{"data-testid":"host-cpu-cores"},sortableValue:o.sortableValue}}},ep={header:{title:"Memory",props:{id:"col-header-memory"},transforms:[wo]},cell:e=>{let t=He(e),{memory:o}=Ti(t),s=(O(e.validationsInfo)||{})?.hardware?.find(i=>i.id==="has-memory-for-role");return{title:Nt(Ai,{validation:s},o.title),props:{"data-testid":"host-memory"},sortableValue:o.sortableValue}}},Fi={header:{title:"Total storage",props:{id:"col-header-disk"},transforms:[wo]},cell:e=>{let t=He(e),{disk:o}=Ti(t),s=(O(e.validationsInfo)||{})?.hardware?.find(i=>i.id==="has-min-valid-disks");return{title:Nt(Ai,{validation:s},o.title),props:{"data-testid":"host-disks"},sortableValue:o.sortableValue}}},Qr=e=>({header:{title:Nt(Nn,{cluster:e,inParenthesis:!0})}}),nv=e=>({header:{title:"Active NIC",transforms:[wo]},cell:t=>{let r=He(t).interfaces||[],s=Ds(e),i=s?fr(s):null,n=i?Jl(r,i):null;return{title:n?.name||de,props:{"data-testid":"nic-name"},sortableValue:n?.name||de}}}),av=e=>({header:{title:"IPv4 address",transforms:[wo]},cell:t=>{let r=He(t).interfaces||[],s=Ds(e),i=s?fr(s):null,n=i?Jl(r,i):null;return{title:(n?.ipv4Addresses||[]).join(", ")||de,props:{"data-testid":"nic-ipv4"},sortableValue:(n?.ipv4Addresses||[]).join(", ")||de}}}),lv=e=>({header:{title:"IPv6 address",transforms:[wo]},cell:t=>{let r=He(t).interfaces||[],s=Ds(e),i=s?fr(s):null,n=i?Jl(r,i):null;return{title:(n?.ipv6Addresses||[]).join(", ")||de,props:{"data-testid":"nic-ipv6"},sortableValue:(n?.ipv6Addresses||[]).join(", ")||de}}}),pv=e=>({header:{title:"MAC address",transforms:[wo]},cell:t=>{let r=He(t).interfaces||[],s=Ds(e),i=s?fr(s):null,n=i?Jl(r,i):null;return{title:n?.macAddress||de,props:{"data-testid":"nic-mac-address"},sortableValue:n?.macAddress||de}}}),tp=({title:e,description:t,disabled:o})=>Nt(cv,null,e,o&&Nt(cv,null,Nt("br",null),t)),uv=({onInstallHost:e,canInstallHost:t,onEditHost:o,canEditHost:r,onHostEnable:s,canEnable:i,onHostDisable:n,canDisable:a,onHostReset:l,canReset:p,onViewHostEvents:u,onDownloadHostLogs:c,canDownloadHostLogs:d,onDeleteHost:m,canDelete:g,onEditBMH:h,canEditBMH:C,canUnbindHost:I,onUnbindHost:S})=>y=>{let v=[];if(y){let w=He(y),E=Bo(y,w);if(e&&t?.(y)&&v.push({title:"Install host",id:`button-install-host-${E}`,onClick:()=>e(y)}),o&&r){let F=r(y);if(typeof F=="boolean")F&&v.push({title:"Change hostname",id:`button-edit-host-${E}`,onClick:()=>o(y)});else{let[q,Z]=F;v.push({title:Nt(tp,{disabled:!q,description:Z,title:"Change hostname"}),id:`button-edit-host-${E}`,onClick:()=>o(y),isDisabled:!q})}}if(s&&i?.(y)&&v.push({title:"Enable in cluster",id:`button-enable-in-cluster-${E}`,onClick:()=>s(y)}),n&&a?.(y)&&v.push({title:"Disable in cluster",id:`button-disable-in-cluster-${E}`,onClick:()=>n(y)}),l&&p?.(y)&&v.push({title:"Reset host",id:`button-reset-host-${E}`,onClick:()=>l(y)}),u&&v.push({title:"View host events",id:`button-view-host-events-${E}`,onClick:()=>u(y)}),c&&d?.(y)&&v.push({title:"Download host logs",id:`button-download-host-installation-logs-${E}`,onClick:()=>c(y)}),m&&g){let F=g(y);if(typeof F=="boolean")F&&v.push({title:"Delete host",id:`button-delete-host-${E}`,onClick:()=>m(y)});else{let[q,Z]=F;v.push({title:Nt(tp,{disabled:!q,description:Z,title:"Delete host"}),id:`button-delete-host-${E}`,onClick:()=>m(y),isDisabled:!q})}}if(h&&y.href==="bmc"&&C){let[F,q]=C(y);v.push({title:Nt(tp,{disabled:!F,description:q,title:"Edit BMC"}),id:`button-edit-bmh-host-${E}`,onClick:()=>h(y),isDisabled:!F})}if(S&&I){let[F,q]=I(y);v.push({title:Nt(tp,{disabled:!F,description:q,title:"Remove from the cluster"}),id:`button-unbind-host-${E}`,onClick:()=>S(y),isDisabled:!F})}}return v};import{useMemo as gL,useState as dv}from"react";var fL=[{title:"10",value:10},{title:"20",value:20}],Zo=e=>{let[t,o]=dv(10),[r,s]=dv(1),{onSetPage:i,onPerPageSelect:n}=gL(()=>({onSetPage:(l,p)=>s(p),onPerPageSelect:(l,p)=>o(p)}),[]);return{showPagination:e>10,perPage:t,page:r,onSetPage:i,onPerPageSelect:n,perPageOptions:fL}};import{Fragment as A_,createElement as Eo,useCallback as Ot,useContext as Rv,useMemo as Jn,useState as E_}from"react";import{useDispatch as jv,useSelector as D_}from"react-redux";import Xt from"react";import{Formik as hL}from"formik";import{object as PL}from"yup";import{Alert as CL,Form as yL,Modal as vL,ModalVariant as SL,ModalBoxBody as IL,ModalBoxFooter as bL,Button as mv,AlertActionCloseButton as xL,AlertVariant as kL}from"@patternfly/react-core";var TL=({additionalNtpSource:e,onClose:t,onAdditionalNtpSource:o})=>{let r={additionalNtpSource:e||""},s=a=>PL().shape({additionalNtpSource:nh.required(a("ai:Required field"))}),{t:i}=f(),n=(a,l)=>{if(l.setStatus({error:null}),o&&a.additionalNtpSource){let p=u=>l.setStatus({error:{title:"Failed to add NTP sources",message:u}});o(a.additionalNtpSource,p)}t()};return Xt.createElement(hL,{initialValues:r,initialTouched:{additionalNtpSource:!0},initialStatus:{error:null},validationSchema:s(i),onSubmit:n},({submitForm:a,status:l,setStatus:p,isSubmitting:u,isValid:c,dirty:d})=>Xt.createElement(Xt.Fragment,null,Xt.createElement(IL,null,Xt.createElement(yL,null,l.error&&Xt.createElement(CL,{variant:kL.danger,title:l.error.title,actionClose:Xt.createElement(xL,{onClose:()=>p({error:null})}),isInline:!0},l.error.message),Xt.createElement(ic,{name:"additionalNtpSource",label:i("ai:Additional NTP Sources"),helperText:i("ai:A comma separated list of IP or domain names of the NTP pools or servers. Additional NTP sources are added to all hosts to ensure all hosts clocks are synchronized with a valid NTP server. It may take a few minutes for the new NTP sources to sync."),isRequired:!0}))),Xt.createElement(bL,null,Xt.createElement(mv,{key:"submit",onClick:a,isDisabled:u||!c||!d,isLoading:u},i(u?"ai:Adding...":"ai:Add")),Xt.createElement(mv,{key:"cancel",variant:"link",onClick:t},i("ai:Cancel")))))},fv=({additionalNtpSource:e,isOpen:t,onClose:o,onAdditionalNtpSource:r})=>Xt.createElement(vL,{"aria-label":"Add NTP sources",title:"Add NTP sources",isOpen:t,onClose:o,variant:SL.small,hasNoBodyWrapper:!0},Xt.createElement(TL,{additionalNtpSource:e,onClose:o,onAdditionalNtpSource:r}));import{saveAs as gv}from"file-saver";var hv=async(e,t)=>{try{if(!t.clusterId)throw new Error(`Cannot download logs for host ${t.id}. Missing clusterId field value in host.`);if(oe){let{data:o}=await M.getPresignedForClusterFiles({clusterId:t.clusterId,fileName:"logs",hostId:t.id,logsType:"host"});gv(o.url)}else{let{data:o,fileName:r}=await re.downloadLogs(t.clusterId,t.id);gv(o,r)}}catch(o){x(o,r=>{e({title:"Could not download host logs.",message:D(r)})})}},Cv=async(e,t,o,r)=>{try{let s={additionalNtpSource:o},{data:i}=await re.update(t.id,t.tags,s);e(qe(i))}catch(s){x(s,()=>r(D(s)))}},yv=e=>!!e.find(t=>(O(t.inventory||"")||{}).systemVendor?.virtual);import{createElement as jd,useMemo as XM}from"react";import{ConnectedIcon as jM}from"@patternfly/react-icons";import ie from"react";import{Checkbox as vv,Pagination as wL,PaginationVariant as DL}from"@patternfly/react-core";import{Table as EL,TableHeader as AL,TableBody as FL,SortByDirection as VL,RowWrapper as NL,InnerScrollContainer as HL}from"@patternfly/react-table";import OL from"lodash/xor";import LL from"classnames";var ML=({rowData:e})=>e?.key,Sv=ie.memo(({rows:e,cells:t,onCollapse:o,className:r,sortBy:s,onSort:i,rowWrapper:n,testId:a,actionResolver:l})=>{let p=ie.useCallback(c=>l?.(c.obj),[l]),u={canCollapseAll:!1};return ie.createElement(HL,null,ie.createElement(EL,{rows:e,cells:t,onCollapse:o,"aria-label":"Hosts table",className:LL(r,"hosts-table"),sortBy:s,onSort:i,rowWrapper:n,"data-testid":a,actionResolver:l?p:void 0,...u},ie.createElement(AL,null),ie.createElement(FL,{rowKey:ML})))});Sv.displayName="tableMemo";var _L=(e,t)=>e&&t?2:e||t?1:0,WL=e=>ie.createElement(NL,{...e,"data-testid":`host-row-${Number(e.rowProps?.rowIndex)}`}),$d=ie.createContext({selectedIDs:[],allIDs:[]}),zL=({onSelect:e,id:t})=>{let{selectedIDs:o}=ie.useContext($d),r=o?.includes(t);return ie.createElement(vv,{id:`select-${t}`,onChange:()=>e(!r),isChecked:r})},BL=({onSelect:e})=>{let{allIDs:t,selectedIDs:o}=ie.useContext($d),r=OL(t,o).length===0;return t.length?ie.createElement(vv,{id:"select-all",onChange:()=>e(!r),isChecked:r}):ie.createElement("div",null)},UL=({data:e,testId:t="hosts-table",className:o,content:r,ExpandComponent:s,getDataId:i,actionResolver:n,onSelect:a,children:l,selectedIDs:p,setSelectedIDs:u,perPage:c,page:d,onSetPage:m,onPerPageSelect:g,showPagination:h,perPageOptions:C,canSelectAll:I})=>{let S=ie.useMemo(()=>e.map(i),[e,i]);ie.useEffect(()=>{if(p&&u){let b=[];p.forEach(P=>{e.find(Ie=>i(Ie)===P)||b.push(P)}),b.length&&u(p.filter(P=>!b.includes(P)))}},[e,u,p,i]);let[y,v]=ie.useState({}),[w,E]=ie.useState({index:_L(!!a,!!s),direction:VL.asc}),F=ie.useRef(e);F.current!==e&&(F.current=e);let q=ie.useCallback(b=>{u?.(b?F.current.map(i):[])},[u,i]),[Z,ae]=ie.useMemo(()=>{let b=r;a&&(b=[{header:{title:I?ie.createElement(BL,{onSelect:q}):"",cellFormatters:[],props:{style:{width:"30px"}}},cell:k=>{let Ie=i(k),Hr=`select-${Ie}`;return{title:ie.createElement(zL,{id:Ie,onSelect:Qi=>a(k,Qi)}),props:{"data-testid":Hr}}}},...r]);let P=b.map(k=>k.header);return[b,P]},[r,a,i,q,I]),Y=ie.useMemo(()=>{let b=(e||[]).map(P=>{let k=i(P),Ie=Z.filter(Qi=>!!Qi.cell).map(Qi=>Qi.cell?.(P));return{isOpen:!!y[k],cells:Ie,key:`${k}-master`,obj:P,id:k}}).sort(ll(w,(P,k=1)=>s?P.cells?.[k-1]:P.cells?.[k])).slice((d-1)*c,d*c);return s&&(b=b.reduce((P,k,Ie)=>(P.push(k),s&&P.push({fullWidth:!0,cells:[{title:k.isOpen?ie.createElement(s,{obj:k.obj}):void 0}],key:`${k.id||""}-detail`,parent:Ie*2}),P),[])),b},[Z,s,i,e,y,w,d,c]),Re=ie.useMemo(()=>Y.length?Y:fh(l,ae.length),[Y,ae,l]),tt=ie.useCallback((b,P)=>{let k=Y[P].id;k&&v(Object.assign({},y,{[k]:!y[k]}))},[Y,y]),vt=ie.useCallback((b,P,k)=>{v({}),E({index:P,direction:k})},[]);return ie.createElement(ie.Fragment,null,ie.createElement($d.Provider,{value:{selectedIDs:p,allIDs:S}},ie.createElement(Sv,{rows:Re,cells:ae,onCollapse:s?tt:void 0,className:o,sortBy:w,onSort:vt,rowWrapper:WL,"data-testid":t,actionResolver:n})),h&&ie.createElement(wL,{variant:DL.bottom,itemCount:S.length,perPage:c,onPerPageSelect:g,page:d,onSetPage:m,perPageOptions:C}))},op=UL;import ce from"react";import{Grid as MM,GridItem as Av}from"@patternfly/react-core";import{Table as _M,TableHeader as WM,TableBody as zM,TableVariant as BM,RowWrapper as UM}from"@patternfly/react-table";import Iv from"react";var GL=(e,t)=>{switch(t){case"failure":return e("ai:Unreachable");case"success":return e("ai:Synced");default:return e("ai:Not available")}},$L=({validationsInfo:e,AdditionalNTPSourcesDialogToggleComponent:t})=>{let o=e.network?.find(i=>i.id==="ntp-synced"),r=[];t&&r.push(Iv.createElement(t,{key:"add-ntp-sources"}));let{t:s}=f();return Iv.createElement(Ai,{validation:o,failureActions:r,pendingActions:r,showSuccess:!0,showPending:!0},GL(s,o?.status))},bv=$L;import sp from"react";import{Grid as HM,GridItem as OM}from"@patternfly/react-core";import Ht from"react";import{TextContent as mM,Text as fM,TextVariants as gM,Popover as hM}from"@patternfly/react-core";import{Table as CM,TableHeader as yM,TableBody as vM,TableVariant as SM,RowWrapper as IM}from"@patternfly/react-table";import es from"react";import{Dropdown as qL,DropdownItem as YL,DropdownToggle as jL}from"@patternfly/react-core";import{CaretDownIcon as RL}from"@patternfly/react-icons";var xv=(e,t,o)=>e.id===t?nn(o).install:nn(o).none,KL=({host:e,disk:t,installationDiskId:o,isEditable:r,onDiskRole:s})=>{let{t:i}=f(),n=xv(t,o,i);return r&&t.id!==o&&s?es.createElement(XL,{host:e,disk:t,installationDiskId:o,onDiskRole:s}):es.createElement(es.Fragment,null,n)},XL=({host:e,disk:t,installationDiskId:o,onDiskRole:r})=>{let[s,i]=qo(!1),[n,a]=qo(!1),{t:l}=f(),p=[es.createElement(YL,{key:"install",id:"install",isDisabled:!t.installationEligibility?.eligible,description:!t.installationEligibility?.eligible&&l("ai:Disk is not eligible for installation")},nn(l).install)],u=es.useCallback(m=>{(async()=>{m?.currentTarget.id&&(a(!0),await r(e.id,t.id,m.currentTarget.id),a(!1)),i(!1)})()},[i,a,r,e.id,t.id]),c=xv(t,o,l),d=es.useMemo(()=>es.createElement(jL,{onToggle:m=>i(m),toggleIndicator:RL,isDisabled:n,className:"pf-c-button pf-m-link pf-m-inline"},c),[i,c,n]);return es.createElement(qL,{onSelect:u,dropdownItems:p,toggle:d,isOpen:s,isPlain:!0})},kv=KL;import Ir from"react";import{Alert as JL,AlertVariant as ZL,Button as QL,ButtonVariant as eM,List as tM,ListItem as oM,Popover as rM}from"@patternfly/react-core";var sM=({disk:e})=>{if(!e.installationEligibility?.eligible){let t=e.installationEligibility?.notEligibleReasons?.length||0;return Ir.createElement(rM,{headerContent:Ir.createElement("div",null,"Disk limitations"),bodyContent:Ir.createElement(iM,{...e.installationEligibility}),minWidth:"30rem",maxWidth:"50rem"},Ir.createElement(QL,{variant:eM.link,isInline:!0},t))}return null},Tv=sM,iM=({eligible:e,notEligibleReasons:t})=>{let o=[],{t:r}=f();return e||o.push(Ir.createElement(JL,{key:"install-eligibility",variant:ZL.warning,title:r("ai:Disk is not eligible for installation"),isInline:!0},t&&Ir.createElement(tM,null,t.map(s=>Ir.createElement(oM,{key:s},s))))),Ir.createElement(Ir.Fragment,null,o)};import{ExclamationTriangleIcon as bM}from"@patternfly/react-icons";import{global_warning_color_100 as xM}from"@patternfly/react-tokens/dist/js/global_warning_color_100";import Pv from"react";import{Checkbox as nM,Tooltip as aM}from"@patternfly/react-core";var rp=(e,t)=>e===t,Kn=(e,t)=>Mo(e.skipFormattingDisks?e.skipFormattingDisks:"").split(",").filter(o=>o===t).length>0,wv=(e,t)=>Mo(e.disksToBeFormatted?e.disksToBeFormatted:"").split(",").filter(o=>o===t).length>0,lM=(e,t,o)=>rp(t,o)?Kn(e,t):!1,pM=(e,t,o)=>(rp(t,o)||wv(e,t))&&!Kn(e,t),uM=(e,t,o)=>rp(t,o)?!lM(e,t,o):!wv(e,t),cM=(e,t,o,r)=>{r&&r(e,t,o)},dM=({host:e,diskId:t,installationDiskId:o,index:r,updateDiskSkipFormatting:s})=>Pv.createElement(aM,{hidden:!rp(t,o),content:"Installation disks are always being formatted"},Pv.createElement(nM,{id:`select-formatted-${e.id}-${r}`,isChecked:pM(e,t,o),isDisabled:uM(e,t,o),onChange:i=>cM(i,e.id,t,s)})),Dv=dM;var kM=[{title:"Name"},{title:"Role"},{title:"Limitations"},{title:"Format?"},{title:"Drive type"},{title:"Size"},{title:"Serial"},{title:"Model"},{title:"WWN"}],TM=({rowData:e})=>e?.key,PM=e=>Ht.createElement(IM,{...e,"data-testid":`disk-row-${e.row?.key||""}`}),wM=()=>Ht.createElement(mM,null,Ht.createElement(fM,{component:gM.p},"This bootable disk will skip formatting")),DM=({canEditDisks:e,host:t,disks:o,installationDiskId:r,testId:s,onDiskRole:i,updateDiskSkipFormatting:n})=>{let a=!!e?.(t),l=[...o].sort((p,u)=>p.name?.localeCompare(u.name||"")||0).map((p,u)=>({cells:[{title:Ht.createElement(Ht.Fragment,null,Kn(t,p.id)&&Ht.createElement(hM,{bodyContent:Ht.createElement(wM,null),minWidth:"20rem",maxWidth:"30rem"},Ht.createElement(bM,{color:xM.value,size:"sm"}))," ",p.bootable?`${p.name||""} (bootable)`:p.name),props:{"data-testid":"disk-name"}},{title:Ht.createElement(kv,{host:t,disk:p,installationDiskId:r,isEditable:a,onDiskRole:i}),props:{"data-testid":"disk-role"}},{title:Ht.createElement(Tv,{disk:p}),props:{"data-testid":"disk-limitations"}},{title:Ht.createElement(Dv,{host:t,diskId:p.id,installationDiskId:r,index:u,updateDiskSkipFormatting:n}),props:{"data-testid":"disk-formatted"}},{title:p.driveType,props:{"data-testid":"drive-type"}},{title:Io(p.sizeBytes||0,2,"si"),props:{"data-testid":"disk-size"}},{title:p.serial,props:{"data-testid":"disk-serial"}},{title:p.model,props:{"data-testid":"disk-model"}},{title:p.wwn,props:{"data-testid":"disk-wwn"}}],key:p.path}));return Ht.createElement(CM,{"data-testid":s,rows:l,cells:kM,variant:SM.compact,"aria-label":"Host's disks table",borders:!1,rowWrapper:PM},Ht.createElement(yM,null),Ht.createElement(vM,{rowKey:TM}))},Ev=DM;import qd from"react";import{TextContent as EM,Text as AM,TextVariants as FM,GridItem as VM}from"@patternfly/react-core";var NM=({title:e,testId:t})=>qd.createElement(VM,null,qd.createElement(EM,null,qd.createElement(AM,{"data-testid":t,component:FM.h3},e))),Xn=NM;var LM=({host:e,canEditDisks:t,onDiskRole:o,updateDiskSkipFormatting:r})=>{let i=He(e).disks||[];return sp.createElement(HM,{hasGutter:!0},sp.createElement(Xn,{testId:"disks-section",title:`${i.length} Disk${i.length===1?"":"s"}`}),sp.createElement(OM,null,sp.createElement(Ev,{testId:"disks-table",canEditDisks:t,host:e,disks:i,installationDiskId:e.installationDiskId,onDiskRole:o,updateDiskSkipFormatting:r})))},ip=LM;var Yd=({children:e})=>ce.createElement(Av,{span:4},ce.createElement(It,null,e)),GM=[{title:"Name"},{title:"MAC address"},{title:"IPv4 address"},{title:"IPv6 address"},{title:"Speed"}],$M=({rowData:e})=>e?.name?.title,qM=e=>ce.createElement(UM,{...e,"data-testid":`nic-row:${e.row?.key}`}),YM=({interfaces:e,testId:t})=>{let o=e.sort((s,i)=>s.name?.localeCompare(i.name||"")||0).map(s=>({cells:[{title:s.name,props:{"data-testid":"nic-name"}},{title:s.macAddress,props:{"data-testid":"nic-mac"}},{title:(s.ipv4Addresses||[]).join(", "),props:{"data-testid":"nic-ipv4"}},{title:(s.ipv6Addresses||[]).join(", "),props:{"data-testid":"nic-ipv6"}},{title:s.speedMbps&&s.speedMbps>0?`${s.speedMbps} Mbps`:"N/A",props:{"data-testid":"nic-speed"}}],key:s.name})),{t:r}=f();return ce.createElement(_M,{"data-testid":t,rows:o,cells:GM,variant:BM.compact,"aria-label":r("ai:Host's network interfaces table"),borders:!1,rowWrapper:qM},ce.createElement(WM,null),ce.createElement(zM,{rowKey:$M}))},Ws=({host:e,canEditDisks:t,onDiskRole:o,AdditionalNTPSourcesDialogToggleComponent:r,hideNTPStatus:s=!1,updateDiskSkipFormatting:i})=>{let{t:n}=f(),{id:a,validationsInfo:l}=e,p=He(e),u=ce.useMemo(()=>O(l)||{},[l]),c=Ti(p),d=p.interfaces||[],m=p.bmcAddress;p.bmcV6address&&(m=m?`${m}, ${p.bmcV6address}`:p.bmcV6address),m=m||de;let g=_g(p,n),h=ce.useMemo(()=>ce.createElement(bv,{AdditionalNTPSourcesDialogToggleComponent:r,validationsInfo:u}),[r,u]);return ce.createElement(MM,{hasGutter:!0},ce.createElement(Xn,{testId:"host-details-section",title:"Host details"}),ce.createElement(Yd,null,ce.createElement(A,{testId:"uuid",title:"UUID",value:a}),ce.createElement(A,{testId:"manufacturer",title:n("ai:Manufacturer"),value:p.systemVendor?.manufacturer||de}),ce.createElement(A,{testId:"product",title:n("ai:Product"),value:p.systemVendor?.productName||de}),ce.createElement(A,{testId:"serial-number",title:"Serial number",value:c.serialNumber})),ce.createElement(Yd,null,ce.createElement(A,{testId:"memory-capacity",title:n("ai:Memory capacity"),value:c.memory.title}),ce.createElement(A,{testId:"cpu-model",title:n("ai:CPU model name"),value:p.cpu?.modelName||de}),ce.createElement(A,{testId:"cpu-cores-and-clock",title:n("ai:CPU cores and clock speed"),value:c.cpuSpeed}),ce.createElement(A,{testId:"cpu-arch",title:n("ai:CPU architecture"),value:p.cpu?.architecture||de})),ce.createElement(Yd,null,ce.createElement(A,{testId:"hw-type",title:"Hardware type",value:g}),ce.createElement(A,{testId:"bmc-address",title:"BMC address",value:m}),ce.createElement(A,{testId:"boot-mode",title:n("ai:Boot mode"),value:p.boot?.currentBootMode||de}),p.boot?.pxeInterface&&ce.createElement(A,{testId:"pxe-interface",title:n("ai:PXE interface"),value:p.boot?.pxeInterface}),ce.createElement(A,{isHidden:s,testId:"ntp-status",title:n("ai:NTP status"),value:h})),ce.createElement(ip,{host:e,onDiskRole:o,canEditDisks:t,updateDiskSkipFormatting:i}),ce.createElement(Xn,{testId:"nics-section",title:`${d.length} NIC${d.length===1?"":"s"}`}),ce.createElement(Av,null,ce.createElement(YM,{interfaces:d,testId:"nics-table"})))};var RM=e=>e.id,Fv=({setDiscoveryHintModalOpen:e,isSNO:t=!1})=>{let{t:o}=f();return jd(bo,{icon:jM,title:o("ai:Waiting for host...",{count:+t}),content:o("ai:Hosts may take a few minutes to appear here after booting."),secondaryActions:e&&[jd(gy,{key:"hosts-not-showing",isSNO:t,setDiscoveryHintModalOpen:e})]})};var KM=({hosts:e,skipDisabled:t,...o})=>{let r=XM(()=>(e||[]).filter(s=>!t||s.status!=="disabled"),[e,t]);return jd(op,{getDataId:RM,data:r,...o})},ts=KM;import Rd from"react";import{Modal as JM,ModalVariant as ZM,Button as Vv,ButtonVariant as Nv}from"@patternfly/react-core";var QM=({isOpen:e,hostname:t,onClose:o,onReset:r})=>Rd.createElement(JM,{title:"Reset Host",isOpen:e,onClose:o,variant:ZM.small,actions:[Rd.createElement(Vv,{"data-testid":"reset-host-submit",key:"confirm",variant:Nv.danger,onClick:r},"Reset"),Rd.createElement(Vv,{key:"cancel",variant:Nv.link,onClick:o},"Cancel")]},"Are you sure you want to reset host",` ${t||""}`," ?"),Hv=QM;import Kd from"react";import{Modal as e_,ModalVariant as t_,Button as Ov,ButtonVariant as Lv}from"@patternfly/react-core";var o_=({isOpen:e,hostname:t,onClose:o,onDelete:r})=>Kd.createElement(e_,{title:"Delete Host",isOpen:e,onClose:o,variant:t_.small,actions:[Kd.createElement(Ov,{"data-testid":"delete-host-submit",key:"confirm",variant:Lv.danger,onClick:r},"Delete"),Kd.createElement(Ov,{key:"cancel",variant:Lv.link,onClick:o},"Cancel")]},"Are you sure you want to delete host",` ${t||""}`," ?"),Mv=o_;var Do=async(e,t,o)=>{try{let{data:r}=await Ml.list(e);t(r)}catch(r){x(r,()=>{o("Failed to load events")})}};import zv from"react";import{Modal as f_,ModalVariant as g_}from"@patternfly/react-core";import Jt from"react";import{object as m_}from"yup";import{Button as _v,ButtonVariant as r_,ButtonType as s_,Form as i_,ModalBoxBody as n_,ModalBoxFooter as a_,AlertVariant as l_,Alert as p_,AlertActionCloseButton as u_}from"@patternfly/react-core";import{Formik as c_}from"formik";var d_=({onUpdateDay2ApiVip:e,onClose:t,currentApiVip:o})=>{let{t:r}=f(),s=Jt.useRef();Jt.useEffect(()=>{s.current?.focus(),s.current?.select()},[]);let i={apiVip:o},n=Jt.useMemo(()=>m_().shape({apiVip:ah.required(r("ai:Required field"))}),[r]);return Jt.createElement(c_,{initialValues:i,validationSchema:n,initialStatus:{error:null},onSubmit:async(a,l)=>{if(a.apiVip){let p=u=>{let c={error:{title:"Failed to update API IP",message:u}};l.setStatus(c)};await e(a.apiVip,p),t()}}},({handleSubmit:a,status:l,setStatus:p,isSubmitting:u,isValid:c,dirty:d})=>{let{error:m}=l;return Jt.createElement(i_,{onSubmit:a},Jt.createElement(n_,null,Jt.createElement(wn,null,m&&Jt.createElement(p_,{variant:l_.danger,title:m.title,actionClose:Jt.createElement(u_,{onClose:()=>p({error:null})}),isInline:!0},m.message),Jt.createElement(St,{label:"Set the IP or domain used to reach the cluster",name:"apiVip",ref:s,isRequired:!0}))),Jt.createElement(a_,null,Jt.createElement(_v,{key:"submit",type:s_.submit,isDisabled:u||!c||!d},"Update"),Jt.createElement(_v,{key:"cancel",variant:r_.link,onClick:t},"Cancel")))})},Wv=d_;var h_=({isOpen:e,...t})=>zv.createElement(f_,{"aria-label":"Update cluster hostname",title:"Update cluster hostname",isOpen:e,variant:g_.small,hasNoBodyWrapper:!0},zv.createElement(Wv,{...t})),Bv=h_;import{sortable as T_}from"@patternfly/react-table";import Yv from"react";var Xd="new",Uv=(e,t,o,r)=>{if(e===Xd&&!t)return"operators";if(t&&!t.isDataComplete)return t.view===xe.YAML?"static-ip-yaml-view":"static-ip-network-wide-configurations";switch(o){case"ready":return"review";case"pending-for-input":case"adding-hosts":case"insufficient":return C_(r);default:return"cluster-details"}},C_=e=>{let t=y_(e),o="host-discovery",r;for(let s of t)if(r=Uh(s,Ye,o),r!==void 0)break;return r||o},y_=e=>{let t=[];return e?.forEach(o=>{let r=O(o.validationsInfo)||{};Object.keys(r).forEach(s=>{let i=n=>{n.status==="failure"&&t.push(n.id)};r[s].forEach(i)})}),t},Gv=()=>({cluster:{groups:[],validationIds:[]},host:{allowedStatuses:[],groups:[],validationIds:[]},softValidationIds:[]}),Jd=Gv(),v_=Gv(),S_={cluster:{groups:[],validationIds:["pull-secret-set","dns-domain-defined"]},host:{allowedStatuses:[],groups:[],validationIds:[]},softValidationIds:[]},I_={cluster:{groups:[],validationIds:["sufficient-masters-count","lso-requirements-satisfied","odf-requirements-satisfied","lvm-requirements-satisfied","cnv-requirements-satisfied"]},host:{allowedStatuses:["known","disabled"],groups:["hardware"],validationIds:["connected","media-connected","lso-requirements-satisfied","odf-requirements-satisfied","lvm-requirements-satisfied","cnv-requirements-satisfied"]},softValidationIds:["no-skip-installation-disk","no-skip-missing-disk"]},b_={cluster:{groups:[],validationIds:["sufficient-masters-count"]},host:{allowedStatuses:["known","disabled"],groups:["hardware"],validationIds:["connected","media-connected","no-skip-installation-disk","no-skip-missing-disk"]},softValidationIds:[]},x_={cluster:{groups:["network"],validationIds:[]},host:{allowedStatuses:["known","disabled"],groups:["network"],validationIds:[]},softValidationIds:["ntp-synced","container-images-available"]},k_={cluster:{groups:[],validationIds:["all-hosts-are-ready-to-install"]},host:{allowedStatuses:["known","disabled"],groups:[],validationIds:[]},softValidationIds:[]},Ye={"cluster-details":S_,"static-ip-yaml-view":Jd,"static-ip-network-wide-configurations":Jd,"static-ip-host-configurations":Jd,operators:v_,"host-discovery":I_,storage:b_,networking:x_,review:k_},$v=Bh(Ye),os=({cluster:e})=>Yr("cluster-details",Ye,e,e.hosts)==="ready",np=({cluster:e})=>Yr("host-discovery",Ye,e,e.hosts)==="ready",ap=({cluster:e})=>Yr("storage",Ye,e,e.hosts)==="ready",qv=({cluster:e})=>Yr("operators",Ye,e,e.hosts)==="ready",lp=({cluster:e})=>Yr("networking",Ye,e,e.hosts)==="ready",zs=e=>e.startsWith("static-ip");var P_=500,w_=e=>{let t=Fn("host-discovery",Ye,e.host),o=ki[t],r=An(e.validationsInfo,"host-discovery",Ye),s=Cl(r,"host-discovery",Ye)?"Some validations failed":void 0;return Yv.createElement(Vs,{...e,zIndex:e.isWithinModal?P_:void 0,status:{...o,sublabel:s},validationsInfo:r,AdditionalNTPSourcesDialogToggleComponent:Po})},Vi=({onEditHostname:e,isWithinModal:t})=>({header:{title:"Status",props:{id:"col-header-hwstatus"},transforms:[T_]},cell:o=>{let r=O(o.validationsInfo)||{};return{title:Yv.createElement(w_,{host:o,onEditHostname:e?()=>e(o):void 0,validationsInfo:r,isWithinModal:t}),props:{"data-testid":"host-hw-status"},sortableValue:status}}});var rs=e=>{let{addAlert:t}=N(),{eventsDialog:o,editHostDialog:r,deleteHostDialog:s,resetHostDialog:i,massUpdateHostnameDialog:n,massDeleteHostDialog:a}=se(),{resetCluster:l}=Rv(jr),{isViewerMode:p}=D_(R),u=jv(),c=Jn(()=>({onDeleteHost:b=>{let P=He(b);s.open({hostId:b.id,hostname:b?.requestedHostname||P?.hostname})},onInstallHost:async b=>{let P=b.id;try{let{data:k}=await mt.install(b);l?l():u(Xr(k))}catch(k){x(k,()=>t({title:`Failed to enable host ${P}`,message:D(k)}))}}}),[u,l,t,s]),d=Ot(b=>{let{id:P,requestedHostname:k}=b,Ie=He(b),Hr=k||Ie?.hostname||P;o.open({hostId:P,hostname:Hr})},[o]),m=Ot(b=>{let P=He(b);r.open({host:b,inventory:P})},[r]),g=Ot(b=>{let P=He(b),k=b?.requestedHostname||P?.hostname||"";i.open({hostId:b.id,hostname:k})},[i]),h=Ot(b=>{hv(t,b)},[t]),C=Ot(async(b,P,k)=>{try{if(!P)throw new Error(`Cannot update disk role in host ${b}
|
|
25
|
+
Missing diskId`);let Ie=re.findHost(e.hosts,b);if(!Ie)throw new Error(`No host found with id:${b}`);let{data:Hr}=await mt.updateDiskRole(Ie,P,k);l?l():u(Xr(Hr))}catch(Ie){x(Ie,()=>t({title:"Failed to set disk role",message:D(Ie)}))}},[u,l,t,e.hosts]),I=Ot(async(b,P)=>{try{let k=re.findHost(e.hosts,b);if(!k)throw new Error(`No host found with id:${b}`);let{data:Ie}=await mt.updateHostODF(k,P);l?await l():u(Xr(Ie))}catch(k){x(k,()=>t({title:"Failed to update ODF status",message:Ge(k)}))}},[e.hosts,l,u,t]),S=Ot(async(b,P)=>{try{let{data:k}=await re.update(e.id,e.tags,{apiVipDnsName:b});u(qe(k))}catch(k){x(k,()=>P(D(k)))}},[e.id,e.tags,u]),y=Jn(()=>async(...b)=>await Cv(u,e,...b),[e,u]),v=Ot(async(b,P,k)=>{try{if(!e.id)throw new Error(`Failed to update disks skip formatting state in host ${P}
|
|
26
26
|
Missing cluster id`);if(!k)throw new Error(`Failed to update disks skip formatting state in host ${P}
|
|
27
27
|
Missing disk id`);let Ie=re.findHost(e.hosts,P);if(!Ie)throw new Error(`No host found with id:${P}`);let{data:Hr}=await mt.updateFormattingDisks(Ie,k,!b);l?l():u(Xr(Hr))}catch(Ie){x(Ie,()=>t({title:"Failed to set disks skip formatting",message:D(Ie)}))}},[u,t,e,l]),w=Jn(()=>({canEditRole:b=>!p&&Hg(e.status,b.status,le(e)),canInstallHost:b=>!p&&Ya(e,b.status),canEditDisks:b=>!p&&Lg(e.status,b.status),canEnable:b=>!p&&Ag(e.status,b.status),canDisable:b=>!p&&Fg(e.status,b.status),canDelete:b=>!p&&Vg(e.status,b.status),canEditHost:b=>!p&&qa(e.status,b.status),canReset:b=>!p&&Ng(e.status,b.status),canEditHostname:()=>!p&&Og(e.status)}),[e,p]),E=Ot(()=>{(async P=>{if(P)try{let k=re.findHost(e.hosts,P);if(!k)throw new Error(`No host found with id:${P}`);let{data:Ie}=await mt.reset(k);l?l():u(Xr(Ie))}catch(k){x(k,()=>t({title:`Failed to reset host ${P}`,message:D(k)}))}})(i.data?.hostId),i.close()},[t,e.hosts,u,l,i]),F=Ot(()=>{(async P=>{if(P)try{let k=re.findHost(e.hosts,P);if(!k)throw new Error(`No host found with id:${P}`);await mt.delete(k),l?l():u(Jr())}catch(k){x(k,()=>t({title:`Failed to delete host ${P}`,message:D(k)}))}})(s.data?.hostId),s.close()},[s,e.hosts,l,u,t]),q=Ot(async(b,P)=>{try{if(!b.clusterId)throw new Error(`Failed to edit role in host: ${b.id}.
|
|
28
|
-
Missing cluster_id`);let{data:k}=await mt.updateRole(b,P);l?l():u(Xr(k))}catch(k){x(k,()=>t({title:"Failed to set role",message:D(k)}))}},[t,u,l]),Z=Jn(()=>pv({...w,onEditRole:q,onDiskRole:C,onExcludedODF:I,onEditHost:m,onHostReset:g,onDownloadHostLogs:h,onViewHostEvents:d,canDownloadHostLogs:dc,...c}),[w,c,q,C,m,g,h,I,d]),[ae,Y]=E_([]),je=Ot((b,P)=>{Y(P?[...ae,b.id]:ae.filter(k=>k!==b.id))},[ae]),tt=Ot(()=>{if(ae.length===1){let b=e.hosts?.find(P=>P.id===ae[0]);return b&&m(b)}return n.open({hostIDs:ae,cluster:e})},[ae,n,e,m]),vt=Ot(()=>a.open({hosts:(e.hosts||[]).filter(b=>ae.includes(b.id)),onDelete:b=>mt.delete(b)}),[e.hosts,ae,a]);return{onDiskRole:C,onEditHost:m,actionChecks:w,onEditRole:q,actionResolver:Z,onReset:E,onDelete:F,onAdditionalNtpSource:y,onUpdateDay2ApiVip:S,onSelect:p?void 0:je,selectedHostIDs:ae,setSelectedHostIDs:Y,onMassChangeHostname:tt,onMassDeleteHost:vt,updateDiskSkipFormatting:v}},ss=({cluster:e,onDelete:t,onReset:o,onAdditionalNtpSource:r,onUpdateDay2ApiVip:s})=>{let i=Yv(),{resetCluster:n}=jv(jr),{t:a}=f(),{eventsDialog:l,editHostDialog:p,deleteHostDialog:u,resetHostDialog:c,additionalNTPSourcesDialog:d,UpdateDay2ApiVipDialog:m,massUpdateHostnameDialog:g,massDeleteHostDialog:h}=se(),C=Jn(()=>[Jo(a),Vi({isWithinModal:!0})],[a]),I=Zo(h.data?.hosts?.length||0);return Eo(A_,null,l.isOpen&&Eo(kn,{isOpen:!0,title:`Host Events${l.isOpen?`: ${l.data?.hostname}`:""}`,entityKind:"host",cluster:e,hostId:l.data?.hostId,onClose:l.close,onFetchEvents:Do}),c.isOpen&&Eo(Nv,{isOpen:!0,hostname:c.data?.hostname,onClose:c.close,onReset:o}),u.isOpen&&Eo(Lv,{isOpen:!0,hostname:u.data?.hostname,onClose:u.close,onDelete:t}),p.isOpen&&Eo(Bc,{isOpen:!0,host:p.data?.host,inventory:p.data?.inventory,usedHostnames:e?.hosts?.map(S=>S.requestedHostname).filter(S=>S),onClose:p.close,onSave:async S=>{let y=re.findHost(e.hosts,S.hostId);if(!y)throw new Error(`No host found with id:${S.hostId}`);let{data:v}=await mt.updateHostName(y,S.hostname);n?n():i(Xr(v)),p.close()},onFormSaveError:S=>{let y;return x(S,()=>y=D(S)),y}}),d.isOpen&&Eo(mv,{isOpen:!0,additionalNtpSource:e.additionalNtpSource,onClose:d.close,onAdditionalNtpSource:r}),m.isOpen&&Eo(zv,{isOpen:!0,onClose:m.close,onUpdateDay2ApiVip:s,currentApiVip:e.apiVipDnsName}),g.isOpen&&Eo(Rc,{isOpen:!0,onClose:g.close,hosts:g.data?.cluster?.hosts||[],selectedHostIDs:g.data?.hostIDs||[],onChangeHostname:(S,y)=>mt.updateHostName(S,y),canChangeHostname:()=>[!0,void 0]}),h.isOpen&&Eo(Xc,{isOpen:!0,onClose:h.close,hosts:h.data?.hosts||[],onDelete:h.data?.onDelete},Eo(ts,{hosts:h.data?.hosts||[],content:C,...I},Eo("div",null,"No hosts selected"))))};import Jv from"react";import{ConnectedIcon as L_}from"@patternfly/react-icons";import{pluralize as M_}from"humanize-plus";import Xv from"react";import br from"react";import{Button as Rv,ButtonVariant as Kv,Modal as F_}from"@patternfly/react-core";import{InfoCircleIcon as V_}from"@patternfly/react-icons";var N_=({linkText:e,infoCircleSize:t="sm",modalTitle:o,modalVariant:r="medium",children:s})=>{let[i,n]=br.useState(!1),a=br.useCallback(()=>n(!1),[]),l=br.useCallback(()=>n(!0),[]);return br.createElement(br.Fragment,null,br.createElement(Rv,{variant:Kv.link,onClick:l,isInline:!0},br.createElement(V_,{size:t})," ",e),br.createElement(F_,{title:o,isOpen:i,actions:[br.createElement(Rv,{key:"close",variant:Kv.primary,onClick:a},"Close")],onClose:a,variant:r},s))},pp=N_;import{pluralize as H_}from"humanize-plus";var O_=({isSingleNode:e=!1})=>Xv.createElement(pp,{linkText:`${H_(+e,"Host")} not showing up?`,modalTitle:"Troubleshooting Host Discovery Issues",modalVariant:"large"},Xv.createElement(my,null)),up=O_;var __=({isSingleNode:e=!1})=>Jv.createElement(bo,{icon:L_,title:`Waiting for ${M_(+e,"host")}...`,content:"Hosts may take a few minutes to appear here after booting.",secondaryActions:[Jv.createElement(up,{key:"hosts-not-showing"})]}),cp=__;import Zd from"react";import{AlertActionLink as W_}from"@patternfly/react-core";var Zv=()=>{let{UpdateDay2ApiVipDialog:{open:e}}=se();return Zd.createElement(Zd.Fragment,null,"Check your DNS and network configuration, or"," ",Zd.createElement(W_,{onClick:()=>e(),isInline:!0},"set the IP or domain used to reach the cluster."))};import Qd from"react";var Qv=Qd.createContext(void 0),dp=({canEditDisks:e,onDiskRole:t,updateDiskSkipFormatting:o,children:r})=>{let s={canEditDisks:e,onDiskRole:t,updateDiskSkipFormatting:o};return Qd.createElement(Qv.Provider,{value:s},r)},mp=()=>{let e=Qd.useContext(Qv);if(e===void 0)throw new Error("useHostTableDetailContext must be used within a HostsTableDetailContextProvider");return e};function z_({obj:e}){let{onDiskRole:t,canEditDisks:o,updateDiskSkipFormatting:r}=mp();return Hi(Ws,{host:e,AdditionalNTPSourcesDialogToggleComponent:Po,hideNTPStatus:!0,onDiskRole:t,canEditDisks:o,updateDiskSkipFormatting:r})}var B_=({cluster:e,skipDisabled:t})=>{let{onEditHost:o,onEditRole:r,actionChecks:s,onDiskRole:i,actionResolver:n,updateDiskSkipFormatting:a,...l}=rs(e),{t:p}=f(),u=U_(()=>[Jo(p,o,void 0,s.canEditHostname),Zr(p,s.canEditRole,r,io(e)),sv(p,Po,o,Zv),Zl,Ql,ep,Fi,Qr(e)],[p,o,s,r,e]),c=e.hosts||[],d=Zo(c.length);return Hi(G_,null,Hi(dp,{canEditDisks:s.canEditDisks,onDiskRole:i,updateDiskSkipFormatting:a},Hi(ts,{hosts:c,skipDisabled:t,ExpandComponent:z_,content:u,actionResolver:n,...d},Hi(cp,{isSingleNode:le(e)}))),Hi(ss,{cluster:e,...l}))},Ni=B_;import Zn from"react";import{ToolbarContent as $_,Toolbar as q_,ActionGroup as Y_}from"@patternfly/react-core";var j_=({children:e,validationSection:t})=>Zn.createElement(Zn.Fragment,null,t,Zn.createElement(Y_,null,Zn.createElement(q_,{id:"cluster-toolbar",className:"cluster-toolbar"},Zn.createElement($_,{className:"cluster-toolbar__content"},e)))),em=j_;import U from"react";import{GridItem as um,TextContent as NW,Text as HW}from"@patternfly/react-core";import aW from"swr";import xr from"react";import{Severity as pW}from"@sentry/browser";import is from"react";var R_=e=>e.sort((t,o)=>t.label.localeCompare(o.label,void 0,{numeric:!0})).reverse(),K_=["production","maintenance"];function lo(){let[e,t]=is.useState([]),[o,r]=is.useState(),s=is.useCallback(p=>e.find(({value:u})=>new RegExp(`^${u}(\\..+)?$`).test(p||"")),[e]),i=is.useCallback(async()=>{try{let{data:p}=await Hl.list(),u=Object.keys(p).map(c=>{let d=p[c],m=d.displayName;return{label:`OpenShift ${m}`,value:c,version:m,default:Boolean(d.default),supportLevel:d.supportLevel,cpuArchitectures:d.cpuArchitectures}});t(R_(u))}catch(p){x(p,u=>{r({title:"Failed to retrieve list of supported OpenShift versions.",message:D(u)})})}},[]),n=is.useCallback(p=>s(p)?.value||p,[s]),a=is.useCallback(p=>{let u=s(p);return K_.includes(u?.supportLevel||"")},[s]),l=is.useCallback(p=>s(p)?.cpuArchitectures??[],[s]);return is.useEffect(()=>{i()},[i]),{error:o,loading:!o&&e.length===0,versions:e,normalizeClusterVersion:n,isSupportedOpenShiftVersion:a,getCpuArchitectures:l}}import X_ from"react";import J_ from"swr";function Z_(e){let t=e.filter(r=>!Yf.includes(r)),o=Array.from(new Set(t));if(t.length===1){let[r]=o;return So({platform:{type:r}})?r:void 0}}function ns(e){let{addAlert:t,alerts:o}=N(),r=M.makeSupportedPlatformsBaseURI(e),s=()=>M.getSupportedPlatforms(e).then(p=>p.data),{data:i,error:n}=J_(r,s,{refreshInterval:bs,errorRetryCount:0,revalidateOnFocus:!1}),a=!n&&!i,l=a||!i?void 0:Z_(i);return X_.useEffect(()=>{if(n){let p=`Failed to retrieve supported platforms (clusterId: ${e})`;if(o.find(u=>u.title===p))return;x(n,()=>t({title:p,message:D(n)}))}},[n,t,e,o]),{isPlatformIntegrationSupported:l!==void 0,supportedPlatformIntegration:l||"no-active-integrations",isLoading:a,error:n}}import tm from"react";function fp(){let[e,t]=tm.useState(),{addAlert:o}=N(),r=tm.useCallback(async()=>{try{let{data:s}=await Nl.list();t(s)}catch(s){t([]),x(s,()=>o({title:"Failed to retrieve managed domains",message:D(s)}))}},[o]);return tm.useEffect(()=>{e||r()},[]),e}import om from"react";function gp(e){let[t,o]=om.useState(),{addAlert:r}=N(),s=om.useCallback(async()=>{try{let{data:i}=await M.list(),n=i.filter(a=>a.id!==e).map(a=>`${a.name||""}.${a.baseDnsDomain||""}`);o(n)}catch(i){o([]),x(i,()=>r({title:"Failed to retrieve names of existing clusters.",message:D(i)}))}},[r,e]);return om.useEffect(()=>{s()},[]),{usedClusterNames:t}}import hp from"react";function Cp(e,t){let[o,r]=hp.useState(),[s,i]=hp.useState(""),n=hp.useCallback(async()=>{try{let a=await it.getInfraEnvId(e,t);r(a)}catch(a){i(Ge(a))}},[e,t]);return hp.useEffect(()=>{e&&!o&&n()},[e,n,o]),{infraEnvId:o,error:s}}import rm from"react";function Oi(){let[e,t]=rm.useState(),{addAlert:o}=N(),r=rm.useCallback(async()=>{try{if(oe){let i=(await oe.post("/api/accounts_mgmt/v1/access_token"))?.request?.response;t(i||"")}else t("")}catch(s){x(s,i=>{t(""),o({title:"Failed to retrieve pull secret",message:D(i)})})}},[o]);return rm.useEffect(()=>{e||r()},[]),e}import sm from"react";var{addAlert:Q_}=qr.actions,eW=e=>{let[t,o]=sm.useState(),[r,s]=sm.useState("");return sm.useEffect(()=>{(async()=>{try{let{data:n}=await M.getPreflightRequirements(e);o(n)}catch(n){s(Ge(n)),x(n,()=>Q_({title:"Failed to retrieve preflight cluster requirements",message:D(n)}))}})()},[o,s,e]),{preflightRequirements:t,error:r,isLoading:!r&&!t}},Bs=eW;var im="Virtualization",nm="OpenShift Data Foundation Logical Volume Manager",eS=(e,t)=>!!t.find(r=>r.value===e)?.cpuArchitectures?.includes(L.ARM),yp="This option is not editable after the draft cluster is created",tS=(e,t,o)=>!e.useContainerNativeVirtualization&&e.useOdfLogicalVolumeManager&&o!=="supported"?`Currently, you can not install ${im} operator at the same time as ${nm} operator.`:void 0,oS=(e,t,o)=>{let r=e.useContainerNativeVirtualization;if(r&&e.useOdfLogicalVolumeManager)return`${nm} must be installed when ${im} operator is also installed`;if(r&&o!=="supported")return`Currently, you can not install ${nm} operator at the same time as ${im} operator.`},tW=(e,t)=>e?yp:t?"":"Single-Node OpenShift is not supported in this OpenShift version",oW=(e,t,o)=>{if(e)return yp;if(!eS(t,o))return"arm64 is not supported in this OpenShift version"},rW=(e,t)=>{if(!!e){if(zo(e)&&le(e))return"OpenShift Data Foundation is not available when using Single Node OpenShift or ARM CPU architecture.";if(zo(e))return"OpenShift Data Foundation is not available when ARM CPU architecture is selected.";if(le(e))return"OpenShift Data Foundation is not available when deploying a Single Node OpenShift.";if(!t)return"The installer cannot currently enable OpenShift Data Foundation with the selected OpenShift version, but it can be enabled later through the OpenShift Console once the installation is complete."}},sW=(e,t)=>{if(!!e&&!t)return"OpenShift Data Foundation Logical Volume Manager is enabled only for OpenShift 4.11 and above."},iW=e=>{if(!!e&&zo(e))return"OpenShift Virtualization is not available when ARM CPU architecture is selected."},nW=e=>{if(!!e&&le(e))return"Network management selection is not supported for Single-Node OpenShift"},rS=(e,t,o,r,s)=>{switch(e){case"SNO":return tW(t,s);case"ARM64_ARCHITECTURE":return oW(t,o,r);case"CNV":return iW(t);case"ODF":return rW(t,s);case"LVM":return sW(t,s);case"NETWORK_TYPE_SELECTION":return nW(t);case"ARM64_ARCHITECTURE_WITH_CLUSTER_MANAGED_NETWORKING":return"Network management selection is not supported for ARM architecture with this version of OpenShift.";default:return}},sS=(e,t,o,r)=>t==="ARM64_ARCHITECTURE"?eS(e,r):o!=="unsupported";var iS=e=>{try{let t={};for(let{openshiftVersion:o,features:r}of e)if(!(!o||!r)){t[o]={};for(let{featureId:s,supportLevel:i}of r)!s||!i||(t[o][s]=i)}return t}catch(t){return Lo(t,"Failed to parse feature support levels",pW.Warning),{}}},nS=(e,t)=>{let o=Object.keys(t).find(r=>new RegExp(`^${r}(\\..*)?$`).test(e));if(!!o)return t[o]},aS=(e,t,o)=>{let r=iS(t),s=nS(e,r);return s&&s[o]!=="unsupported"},lW=({cluster:e,children:t,loadingUi:o})=>{let{loading:r,versions:s}=lo(),i=()=>zn.list().then(C=>C.data),{data:n,error:a}=aW(zn.makeBaseURI(),i,{errorRetryCount:0,revalidateOnFocus:!1}),l=!n&&!a||r,p=xr.useMemo(()=>!n||a?{}:iS(n),[a,n]),u=xr.useCallback(C=>nS(C,p),[p]),c=xr.useCallback((C,I)=>{let S=u(C);return S?S[I]:void 0},[u]),d=xr.useCallback((C,I)=>{let S=c(C,I);return sS(C,I,S,s)},[c,s]),m=xr.useCallback((C,I)=>{let S=d(C,I);return rS(I,e,C,s,S)},[d,s,e]),g=xr.useCallback((C,I)=>!!m(C,I),[m]),h=xr.useMemo(()=>({getVersionSupportLevelsMap:u,getFeatureSupportLevel:c,isFeatureDisabled:g,getFeatureDisabledReason:m,isFeatureSupported:d}),[u,c,g,m,d]);return xr.useEffect(()=>{a&&x(a)},[a]),xr.createElement(yg,{value:h},l?o:t)},Ao=lW;import{CheckCircleIcon as fW,InfoCircleIcon as uS}from"@patternfly/react-icons";import Le from"react";import{global_success_color_100 as gW}from"@patternfly/react-tokens";import{Text as hW,TextList as cS,TextListItem as pm,TextContent as CW}from"@patternfly/react-core";var vp=(e,t,o)=>{if(!e.openshiftVersion)throw o?o("ai:cluster doesn't contain the openshift_version field"):"cluster doesn't contain the openshift_version field";if(!e.featureUsage)throw o?o("ai:cluster doesn't contain the feature_usage field"):"ai:cluster doesn't contain the feature_usage field";let r={},s=O(e.featureUsage);if(s===void 0)throw o?o("ai:Error parsing cluster feature_usage field"):"Error parsing cluster feature_usage field";let i=Object.values(s).map(a=>a.id),n=t.getVersionSupportLevelsMap(e.openshiftVersion);if(!n)throw o?o("ai:No support level data for version {{openshiftVersion}}",{openshiftVersion:e.openshiftVersion}):`No support level data for version ${e.openshiftVersion}`;for(let a of i)if(a in n){let l=n[a];if(l==="supported"||l==="unsupported"&&a!=="CLUSTER_MANAGED_NETWORKING_WITH_VMS")continue;r[a]=n[a]}return r};import{Button as uW,ButtonVariant as cW}from"@patternfly/react-core";import lm from"react";import{ErrorBoundary as dW}from"react-error-boundary";import am from"react";var lS=am.createContext({captureException:()=>{}}),pS=({exceptionReporter:e,children:t})=>am.createElement(lS.Provider,{value:{captureException:e}},t),Sp=()=>am.useContext(lS);var mW=({title:e})=>({resetErrorBoundary:o})=>{let r="There was an internal error",s=[lm.createElement(uW,{onClick:o,variant:cW.link,isInline:!0,key:"reset-error-boundary"},"try again")];return lm.createElement(_,{...{content:r,primaryAction:s,title:e}})},Li=({children:e,...t})=>{let{captureException:o}=Sp(),r=s=>{o(s,t.title)};return lm.createElement(dW,{FallbackComponent:mW(t),onError:r},e)};var yW=e=>{switch(e){case"SNO":return"Install single node OpenShift (SNO)";case"VIP_AUTO_ALLOC":return"Allocate IPs via DHCP server";case"ARM64_ARCHITECTURE":return"Use ARM architecture for the cluster";default:return e}},vW=e=>e==="dev-preview"?"Developer Preview Features":Le.createElement(ot,{href:sn},"Technology Preview Features"),SW=e=>{let t={"tech-preview":[],"dev-preview":[]};for(let[s,i]of Object.entries(e))!Fa(i)||t[i].push(s);let o;if(t["dev-preview"].length)o="dev-preview";else if(t["tech-preview"].length)o="tech-preview";else return null;let r=t[o].map(s=>Le.createElement(pm,{key:s},yW(s)));return Le.createElement(Le.Fragment,null,Le.createElement(pm,null,vW(o),Le.createElement(cS,null,r)))},IW=({clusterFeatureSupportLevels:e,showVersionWarning:t})=>Le.createElement(CW,null,t&&Le.createElement(hW,null,Le.createElement(uS,{size:"sm",color:"var(--pf-global--info-color--100)"}),"\xA0The installed OpenShift version is not production-ready"),Object.keys(e).length>0&&Le.createElement(Le.Fragment,null,Le.createElement(uS,{size:"sm",color:"var(--pf-global--info-color--100)"}),"\xA0Your cluster will be subject to support limitations because it includes:",Le.createElement(cS,null,SW(e),e.CLUSTER_MANAGED_NETWORKING_WITH_VMS==="unsupported"&&Le.createElement(pm,null,"Cluster-managed networking with some or all discovered hosts as virtual machines")))),bW=()=>Le.createElement(Le.Fragment,null,Le.createElement(fW,{color:gW.value}),"\xA0Your installed cluster will be fully supported"),xW=e=>`Cluster support level: ${e?"Full":"Limited"}`,kW=({cluster:e})=>{let{t}=f(),o=be(),{isSupportedOpenShiftVersion:r}=lo(),{limitedClusterFeatures:s,hasSupportedVersion:i,isFullySupported:n}=Le.useMemo(()=>{let a=vp(e,o,t),l=r(e.openshiftVersion);return{limitedClusterFeatures:a,hasSupportedVersion:l,isFullySupported:l&&Object.keys(a||{}).length===0}},[e,o,t,r]);return s?Le.createElement(A,{title:xW(n),value:n?Le.createElement(bW,null):Le.createElement(IW,{clusterFeatureSupportLevels:s,showVersionWarning:!i}),testId:"feature-support-levels"}):null},TW=({...e})=>Le.createElement(Li,{title:"Failed to load feature support levels review"},Le.createElement(kW,{...e})),Qn=TW;import Us from"react";import{ExclamationTriangleIcon as PW}from"@patternfly/react-icons";import{global_warning_color_100 as wW}from"@patternfly/react-tokens/dist/js/global_warning_color_100";import{Popover as DW,Text as dS,TextContent as EW,TextVariants as AW}from"@patternfly/react-core";var FW=({version:e})=>{let{t}=f(),o=Us.createElement(EW,null,Us.createElement(dS,{component:AW.p},t("ai:Please note that this version is not production-ready.")));return Us.createElement(dS,{component:"p"},e," \xA0",Us.createElement(DW,{bodyContent:o},Us.createElement(PW,{color:wW.value,size:"sm"})))},VW=({cluster:e})=>{let{isSupportedOpenShiftVersion:t}=lo(),{t:o}=f(),{openshiftVersion:r}=e,s=t(r);return Us.createElement(A,{title:o("ai:OpenShift version"),value:s?r:Us.createElement(FW,{version:r||""}),testId:"openshift-version"})},Ip=VW;var OW=({isMultiArchSupported:e})=>{let t;return e?t="The original cluster hosts CPU architecture. You can add hosts that are using either x86 or arm64 CPU architecture to this cluster.":t="The original cluster hosts CPU architecture.",U.createElement(U.Fragment,null,"CPU architecture ",U.createElement(W,{bodyContent:U.createElement("p",null,t)}))},LW=e=>{let t;return e===Co?t="Software-Defined Networking (SDN)":t="Open Virtual Network (OVN)",t},MW=e=>{let t;return e?t="User-Managed Networking":t="Cluster-managed networking",t},_W=e=>{let t=null;switch(e){case"all":t=U.createElement(U.Fragment,null,"Enabled on control plane nodes",U.createElement("br",null),"Enabled on workers");break;case"masters":t=U.createElement(U.Fragment,null,"Enabled on control plane nodes");break;case"workers":t=U.createElement(U.Fragment,null,"Enabled on workers");break}return t},WW=({cluster:e,externalMode:t=!1})=>{let{t:o}=f(),r=hi(e),s=be(),i=Boolean(e.cpuArchitecture==="multi"||e.openshiftVersion&&s.getFeatureSupportLevel(e.openshiftVersion,"MULTIARCH_RELEASE_IMAGE")==="supported");return U.createElement(U.Fragment,null,!t&&U.createElement(um,null,U.createElement(NW,null,U.createElement(HW,{component:"h2"},o("ai:Cluster Details")))),U.createElement(um,{md:6,"data-testid":"cluster-details"},U.createElement(It,null,t?void 0:U.createElement(Ip,{cluster:e}),U.createElement(A,{title:"Base domain",value:e.baseDnsDomain,testId:"base-dns-domain"}),U.createElement(A,{title:U.createElement(OW,{isMultiArchSupported:i}),value:e.cpuArchitecture,testId:"cpu-architecture"}),U.createElement(A,{title:"API IP",value:e.apiVip,isHidden:!e.apiVip,testId:"api-vip"}),U.createElement(A,{title:"Ingress IP",value:e.ingressVip,isHidden:!e.ingressVip,testId:"ingress-vip"}),U.createElement(A,{title:"Network management type",value:MW(e.userManagedNetworking),testId:"network-management-type"}),U.createElement(A,{title:"Networking Type",value:LW(e.networkType),testId:"networking-type"}))),U.createElement(um,{md:6},U.createElement(It,null,U.createElement(A,{title:"Cluster network CIDR (IPv4)",value:lc(e,"clusterNetworks"),testId:"cluster-network-cidr-ipv4"}),U.createElement(A,{title:"Cluster network host prefix (IPv4)",value:wg(e),testId:"host-prefix-ipv4"}),r?U.createElement(U.Fragment,null,U.createElement(A,{title:"Cluster network CIDR (IPv6)",value:pc(e,"clusterNetworks"),testId:"cluster-network-cidr-ipv6"}),U.createElement(A,{title:"Cluster network host prefix (IPv6)",value:Dg(e),testId:"host-prefix-ipv6"})):void 0,U.createElement(A,{title:"Service network CIDR (IPv4)",value:lc(e,"serviceNetworks"),testId:"service-network-cidr-ipv4"}),r?U.createElement(A,{title:"Service network CIDR (IPv6)",value:pc(e,"serviceNetworks"),testId:"service-network-cidr-ipv6"}):void 0,U.createElement(A,{title:"Disk encryption",value:_W(e.diskEncryption?.enableOn),isHidden:e.diskEncryption?.enableOn==="none",testId:"disk-encryption"}),U.createElement(Qn,{cluster:e}))))},bp=WW;import as from"react";import ft from"react";import{Alert as dm,GridItem as $W}from"@patternfly/react-core";import zW from"lodash/pick";import cm,{useContext as BW,useEffect as UW}from"react";var GW=(e,t)=>{let o;switch(t.type){case"request":o={status:"loading",data:{}};break;case"success":o={status:"succeeded",data:t.data};break;case"failure":o={status:"failed",data:t.data};break;default:o=e;break}return o},mS=cm.createContext({}),Mi=({children:e,errorUI:t,loadingUI:o})=>{let[r,s]=cm.useReducer(GW,{status:"idle",data:{}});UW(()=>{let l=!0;return(async()=>{try{l&&s({type:"request"});let{data:u}=await M.getDefaultConfig();l&&s({type:"success",data:u})}catch{l&&s({type:"failure",data:{}})}})(),()=>{l=!1}},[]);let i=l=>{let p={ui:o,value:l.data};switch(l.status){case"idle":case"loading":break;case"failed":p={...p,ui:t};break;case"succeeded":p={...p,ui:e};break}return p},{ui:n,value:a}=i(r);return cm.createElement(mS.Provider,{value:a},n)},_i=e=>zW(BW(mS),e);import{ExternalLinkAltIcon as qW}from"@patternfly/react-icons";var YW=({cluster:e,showAddHostsInfo:t,showKubeConfig:o})=>{let r=be(),{inactiveDeletionHours:s}=_i(["inactiveDeletionHours"]),i=Math.round((s||0)/24),n=ty(i,e.installCompletedAt),a=Boolean(t&&oe&&e.status==="installed"&&(!le(e)||e.openshiftVersion&&r.isFeatureSupported(e.openshiftVersion,"SINGLE_NODE_EXPANSION"))),l=o&&n>0&&dn(e.status);return ft.createElement(ft.Fragment,null,ft.createElement(ee,{condition:l},ft.createElement($W,null,ft.createElement(_n,{status:e.status,clusterId:e.id,id:Xo("button-download-kubeconfig")}))),ft.createElement(ee,{condition:typeof s=="number"&&dn(e.status)},ft.createElement(dm,{variant:"info",isInline:!0,title:n>0?`Download and save your kubeconfig file in a safe place. This file will be automatically deleted from Assisted Installer's service in ${n} days.`:`Kubeconfig file was automatically deleted ${i} days after installation.`})),ft.createElement(ee,{condition:a},ft.createElement(dm,{variant:"info",isInline:!0,"data-testid":"alert-add-hosts",title:ft.createElement("p",null,So(e)?'Add new hosts by using the platform auto-scale feature or manually generating a new Discovery ISO under the "Add hosts" tab on ':`Add new hosts by generating a new Discovery ISO under your cluster's "Add hosts" tab on `,ft.createElement("a",{href:Nu,target:"_blank",rel:"noopener noreferrer"},"console.redhat.com/openshift ",ft.createElement(qW,null)),".")})),ft.createElement(ee,{condition:So(e)},ft.createElement(dm,{variant:"warning",isInline:!0,"data-testid":"alert-modify-platform-config",title:ft.createElement("p",null,"Modify your platform configuration to access your platform's features directly in OpenShift."," ",ft.createElement("a",{href:Is,target:"_blank",rel:"noopener noreferrer"},"Learn more about configuration ",ft.createElement("i",{className:"fas fa-external-link-alt"})))})))},fS=YW;import{Grid as jW}from"@patternfly/react-core";var Wi=e=>{let[t,o]=as.useState(),[r,s]=as.useState(""),i=e?.id,n=e?.status,a=gi(e?.monitoredOperators),l=Wr(e),p=l.filter(m=>m.status==="failed"),u=as.useMemo(()=>a.find(m=>m.name==="console"),[a]),c=as.useCallback(()=>{(async()=>{if(s(""),!!i)try{let g=await M.getCredentials(i);o(g.data)}catch(g){s(Ge(g))}})()},[i]),d=u?.status;return as.useEffect(()=>{(!d&&n==="installed"||d==="available")&&c()},[n,d,c]),{credentials:t,credentialsError:r,olmOperators:l,failedOlmOperators:p,consoleOperator:u,fetchCredentials:c}},RW=({cluster:e,clusterVarieties:t,showAddHostsInfo:o=!0,showKubeConfig:r=!0})=>{let{credentials:s,credentialsError:i,consoleOperator:n,fetchCredentials:a}=t,l=n?.status==="available"||!n&&e.status==="installed";return as.createElement(jW,{hasGutter:!0},l&&as.createElement(id,{cluster:e,credentials:s,error:!!i,retry:a,idPrefix:Xo("cluster-creds"),credentialsError:i}),as.createElement(fS,{cluster:e,showAddHostsInfo:o,showKubeConfig:r}))},zi=RW;import{Grid as Nz,GridItem as xp}from"@patternfly/react-core";import nt from"react";import{CheckCircleIcon as oz,ExclamationCircleIcon as rz,InProgressIcon as sz}from"@patternfly/react-icons";import{global_danger_color_100 as iz}from"@patternfly/react-tokens/dist/esm/global_danger_color_100";import{global_success_color_100 as nz}from"@patternfly/react-tokens/dist/esm/global_success_color_100";import ea from"react";import{Stack as QW,StackItem as hS,TextContent as ez}from"@patternfly/react-core";import KW from"react";import{IconSize as kr}from"@patternfly/react-icons";var XW=e=>{switch(e){case kr.sm:return"0.3em";case kr.md:return"1.5em";case kr.lg:return"2em";case kr.xl:return"3em";default:return"1em"}},JW=e=>{switch(e){case kr.sm:return"-0.3em";case kr.md:return"-1.5em";case kr.lg:return"-2em";case kr.xl:return"-3em";default:return"-1em"}},ZW=({children:e,iconSize:t=kr.sm})=>{let o={padding:`${XW(t)}`,borderRadius:"50%",border:"2px solid",borderColor:"#D2D2D2",boxSizing:"content-box",verticalAlign:`${JW(t)}`};return KW.cloneElement(e,{style:o})},gS=ZW;var tz=({icon:e,children:t})=>ea.createElement(QW,null,ea.createElement(hS,null,ea.createElement(gS,null,e)),ea.createElement(hS,null,ea.createElement(ez,null,t))),ls=tz;var mm=({hosts:e,hostRole:t})=>{let{t:o}=f(),r=t==="master"?o("ai:Control Plane",{count:e.length}):o("ai:Worker",{count:e.length});if(e.some(n=>["cancelled","error"].includes(n.status))){let n=e.filter(a=>a.status==="error").length;return nt.createElement(ls,{icon:nt.createElement(rz,{color:iz.value})},nt.createElement(nt.Fragment,null,r,nt.createElement("br",null),nt.createElement("small",null,n,"/",t==="master"?o("ai:{{count}} control plane node failed",{count:e.length}):o("ai:{{count}} worker failed",{count:e.length}))))}let s=e.filter(n=>["installed","added-to-existing-cluster"].includes(n.status)),i=e.filter(n=>["preparing-for-installation","preparing-successful","pending-for-input","installing","installing-in-progress","installing-pending-user-action","resetting-pending-user-action","resetting"].includes(n.status));return i.length>0?nt.createElement(ls,{icon:nt.createElement(sz,null)},nt.createElement(nt.Fragment,null,r,nt.createElement("br",null),nt.createElement("small",null,t==="master"?o("ai:Installing {{count}} control plane node",{count:i.length}):o("ai:Installing {{count}} worker",{count:i.length})))):nt.createElement(ls,{icon:nt.createElement(oz,{color:nz.value})},nt.createElement(nt.Fragment,null,r,nt.createElement("br",null),nt.createElement("small",null,t==="master"?o("ai:{{count}} control plane node installed",{count:s.length}):o("ai:{{count}} worker installed",{count:s.length}))))};import Ye from"react";import{Button as CS,ButtonVariant as yS,Popover as az,Text as lz,TextContent as pz}from"@patternfly/react-core";import{CheckCircleIcon as vS,ExclamationCircleIcon as uz,InProgressIcon as cz,PendingIcon as dz}from"@patternfly/react-icons";import{global_success_color_100 as SS}from"@patternfly/react-tokens/dist/esm/global_success_color_100";import{global_danger_color_100 as mz}from"@patternfly/react-tokens/dist/esm/global_danger_color_100";import fz from"lodash/capitalize";var gz=(e=[])=>e.length?e.filter(t=>t.operatorType==="builtin").every(t=>t.status==="available"):!1,hz=e=>{let t,o;if(gz(e.monitoredOperators))t=Ye.createElement(vS,{color:SS.value}),o="completed";else switch(e.status){case"finalizing":t=Ye.createElement(cz,null),o="finalizing";break;case"error":case"cancelled":t=Ye.createElement(uz,{color:mz.value}),o="failed";break;case"installed":case"adding-hosts":t=Ye.createElement(vS,{color:SS.value}),o="completed";break;default:t=Ye.createElement(dz,null),o="pending"}return{finalizingIcon:t,initializationStatus:o}},IS=({cluster:e,onFetchEvents:t,fallbackEventsURL:o})=>{let[r,s]=Ye.useState(!1),{finalizingIcon:i,initializationStatus:n}=hz(e),a=()=>s(!1),{t:l}=f();return Ye.createElement(Ye.Fragment,null,Ye.createElement(kn,{title:l("ai:Cluster Events"),isOpen:r,onClose:a,hostId:void 0,cluster:e,entityKind:"cluster",onFetchEvents:t,fallbackEventsURL:o}),Ye.createElement(ls,{icon:i},Ye.createElement(Ye.Fragment,null,["finalizing","pending"].includes(n)?Ye.createElement(az,{zIndex:300,headerContent:Ye.createElement(Ye.Fragment,null,l("ai:Initialization")),bodyContent:Ye.createElement(pz,null,Ye.createElement(lz,null,l("ai:This stage may take a while to finish. To view detailed information, click the events log link below."))),footerContent:Ye.createElement(CS,{variant:yS.link,isInline:!0,onClick:()=>s(!0)},l("ai:Open Events Log"))},Ye.createElement(CS,{variant:yS.link,isInline:!0},l("ai:Initialization"))):l("ai:Initialization"),Ye.createElement("small",null,fz(n)))))};import Lt from"react";import{Button as Cz,ButtonVariant as yz,List as vz,ListItem as Sz,Popover as Iz}from"@patternfly/react-core";import{CheckCircleIcon as bz,ExclamationCircleIcon as xz,InProgressIcon as kz,PendingIcon as Tz}from"@patternfly/react-icons";import{global_danger_color_100 as Pz,global_success_color_100 as wz}from"@patternfly/react-tokens";import{pluralize as Dz}from"humanize-plus";function bS(e){let t=e.map(o=>o.status||"pending");return t.includes("failed")?"failed":t.includes("progressing")?"progressing":t.includes("pending")?"pending":"available"}var xS=e=>`${e} ${Dz(e,"operator")}`;function Ez(e,t){let o=e.filter(i=>i.status==="failed").length,r=bS(e),s=xS(e.length);switch(r){case"available":return t("ai:{{operatorsCountString}} installed",{operatorsCountString:s});case"failed":return e.length>1?`${o}/${s} failed`:`${xS(o)} failed`;case"progressing":return t("ai:Installing {{operatorsCountString}}",{operatorsCountString:s});default:return t("ai:Pending - {{operatorsCountString}}",{operatorsCountString:s})}}function Az(e){switch(e){case"available":return Lt.createElement(bz,{color:wz.value});case"failed":return Lt.createElement(xz,{color:Pz.value});case"progressing":return Lt.createElement(kz,null);default:return Lt.createElement(Tz,null)}}var Fz=({operators:e,children:t})=>{let{t:o}=f();return Lt.createElement(Iz,{headerContent:Lt.createElement("div",null,o("ai:Operators")),bodyContent:Lt.createElement(vz,{className:"operators-progress-item__operators-list"},e.map(r=>{let s=r.status??"pending";r.status==="available"&&(s="installed");let i=r.name&&an(o)[r.name];return Lt.createElement(Sz,{key:r.name,title:r.statusInfo},i," ",s)})),minWidth:"30rem",maxWidth:"50rem"},t)},Vz=({operators:e})=>{let{t}=f(),o=Az(bS(e)),r=Ez(e,t);return Lt.createElement(ls,{icon:o},Lt.createElement(Lt.Fragment,null,Lt.createElement(Fz,{operators:e},Lt.createElement(Cz,{variant:yz.link,isInline:!0,"data-testid":"operators-progress-item"},t("ai:Operators"))),Lt.createElement("small",null,r)))},kS=Vz;import Mt from"react";var Hz=({cluster:e,minimizedView:t=!1,onFetchEvents:o,fallbackEventsURL:r})=>{let s=zr(e.hosts),i=Wr(e),n=s.filter(l=>l.role&&l.role==="master"),a=s.filter(l=>l.role&&l.role==="worker");return Mt.createElement(Mt.Fragment,null,Mt.createElement(ee,{condition:!t},Mt.createElement(Nz,{hasGutter:!0},Mt.createElement(xp,{span:3},Mt.createElement(mm,{hosts:n,hostRole:"master"})),Mt.createElement(ee,{condition:a.length>0},Mt.createElement(xp,{span:3},Mt.createElement(mm,{hosts:a,hostRole:"worker"}))),Mt.createElement(xp,{span:3},Mt.createElement(IS,{cluster:e,onFetchEvents:o,fallbackEventsURL:r})),Mt.createElement(ee,{condition:i.length>0},Mt.createElement(xp,{span:3},Mt.createElement(kS,{operators:i}))))))},TS=Hz;import Je from"react";import{Stack as DS,StackItem as Bi}from"@patternfly/react-core";import ne from"react";import{Alert as fm,AlertActionLink as kp,Text as Oz,TextContent as Lz}from"@patternfly/react-core";import{pluralize as Mz}from"humanize-plus";var _z=(e,t)=>{let o="";for(let r=0;r<e.length;r++){let s=e[r].name||"";r>0&&(r===e.length-1?o+=" and ":o+=", "),o+=`${s&&an(t)[s]} (${s&&s.toUpperCase()})`}return o},Wz=(e,t,o,r)=>r==="worker"?oe?ne.createElement(ne.Fragment,null,"Error information for each host can be found in the host inventory table. To retry adding failed hosts, navigate to the clusters list inside OpenShift Cluster Manager, click your cluster name, and select the ",ne.createElement("b",null,"Add hosts")," tab."):ne.createElement(ne.Fragment,null,"Error information for each host can be found in the host inventory table. To retry adding failed hosts, press the ",ne.createElement("b",null,"Add hosts")," button."):ne.createElement(ne.Fragment,null,e,"/",t," ",Mz(t,r)," ",o," Due to this, the cluster will be degraded. Please check the installation log for more information."),ta=({cluster:e,failedHosts:t,totalHosts:o,title:r,hostsType:s,failedOperators:i=[],message:n})=>{let{addAlert:a}=N(),{t:l}=f();return ne.createElement(ne.Fragment,null,ne.createElement(fm,{isInline:!0,variant:"warning",title:r,actionLinks:ne.createElement(ne.Fragment,null,ne.createElement(kp,{id:"cluster-installation-logs-button",onClick:()=>_s(a,e.id),isDisabled:!Es(e)},"Download installation logs"))},ne.createElement(ee,{condition:t!==0},ne.createElement("p",null,Wz(t,o,n,s))),ne.createElement(ee,{condition:i?.length>0},ne.createElement("p",null,_z(i,l)," failed to install. Due to this, the cluster will be degraded, but you can try to install the operator from the Operator Hub. Please check the installation log for more information."))))},PS=({cluster:e,failedHosts:t,totalHosts:o,isCriticalNumberOfWorkersFailed:r})=>{let{addAlert:s}=N(),{resetClusterDialog:i}=se(),n=p=>`cluster-install-error-${p}`,a,l;return e.highAvailabilityMode==="None"||t>0?(a="Control plane was not installed",l=`${t}/${o} control plane nodes failed to install. Please check the installation logs for more information.`):r?(a="Critical number of workers were not installed",l="Only one worker was able to be installed. Please check the installation logs for more information."):(a="Initialization failed",l=ne.createElement(Lz,null,ne.createElement(Oz,{component:"p"},xo(e.statusInfo),ne.createElement("br",null),"Reset the installation process to return to the configuration and try again. Some hosts may need to be re-registered by rebooting into the Discovery ISO."))),ne.createElement(ne.Fragment,null,ne.createElement(fm,{isInline:!0,variant:"danger",title:a,actionLinks:ne.createElement(ne.Fragment,null,ne.createElement(kp,{id:"button-reset-cluster",onClick:()=>i.open({cluster:e})},"Reset Cluster"),ne.createElement(kp,{id:"cluster-installation-logs-button",onClick:()=>_s(s,e.id),isDisabled:!Es(e)},"Download installation logs"),ne.createElement(kp,{onClick:()=>window.open(Fu(),"_blank"),id:n("button-report-bug")},"Report a bug"))},l))},wS=()=>ne.createElement(ne.Fragment,null,ne.createElement(fm,{isInline:!0,variant:"success",title:"Installation completed successfully"}," "));var ES=(e,t)=>{let o=e.filter(i=>i.role&&i.role===t),r=o.filter(i=>["cancelled","error"].includes(i.status)),s=o.filter(i=>["installing-pending-user-action"].includes(i.status));return[o.length,r.length,s.length]},zz=e=>e.filter(t=>t.status&&t.status==="failed"),AS=(e,t,o)=>{let[r,s,i]=ES(e,"master"),[n,a,l]=ES(e,"worker"),p=zz(o);return["error","cancelled"].includes(t.status)?Je.createElement(DS,null,Je.createElement(Bi,null,Je.createElement(PS,{cluster:t,totalHosts:r,failedHosts:s,isCriticalNumberOfWorkersFailed:a===1}))):Je.createElement(DS,{hasGutter:!0},Je.createElement(ee,{condition:t.status==="installed"},Je.createElement(Bi,null,Je.createElement(wS,null))),Je.createElement(ee,{condition:a>0},Je.createElement(Bi,null,Je.createElement(ta,{cluster:t,totalHosts:n,failedHosts:a,title:`Could not install ${a} worker hosts`,hostsType:"worker",message:"failed to install."}))),Je.createElement(ee,{condition:p.length>0},Je.createElement(Bi,null,Je.createElement(ta,{cluster:t,totalHosts:r,failedHosts:s,title:"Some operators failed to install",failedOperators:p,message:"failed to install."}))),Je.createElement(ee,{condition:i>0},Je.createElement(Bi,null,Je.createElement(ta,{cluster:t,totalHosts:r,failedHosts:s,title:"Some hosts are pending user action",failedOperators:p,message:"are pending user action."}))),Je.createElement(ee,{condition:l>0},Je.createElement(Bi,null,Je.createElement(ta,{cluster:t,totalHosts:n,failedHosts:a,title:"Some hosts are pending user action",message:"are pending user action."}))))};var Gz=({cluster:e})=>{let{addAlert:t}=N(),{resetClusterDialog:o,cancelInstallationDialog:r}=se(),s=Wi(e),{credentials:i,credentialsError:n}=s,a=be(),l=e.openshiftVersion&&a.isFeatureSupported(e.openshiftVersion,"SINGLE_NODE_EXPANSION"),p=(!le(e)||l)&&e.status==="installed"&&!oe;return te.createElement(Bz,{hasGutter:!0},te.createElement(gm,null,te.createElement(Uz,{hasGutter:!0},te.createElement(Gs,null,te.createElement(VS,null,te.createElement(NS,{component:"h2"},"Installation progress"))),te.createElement(Gs,{span:6},te.createElement(Mn,{cluster:e,totalPercentage:e.progress?.totalPercentage||0})),te.createElement(Gs,{span:6,rowSpan:4}),te.createElement(Gs,{span:6},te.createElement(TS,{cluster:e,onFetchEvents:Do})),te.createElement(Gs,{span:6},AS(zr(e.hosts),e,Wr(e))),te.createElement(Gs,{span:6},te.createElement(zi,{cluster:e,clusterVarieties:s})),te.createElement(Gs,null,te.createElement(VS,null,te.createElement(NS,{component:"h2"},"Host Inventory")),te.createElement(Ni,{cluster:e,skipDisabled:!0})),te.createElement(bp,{cluster:e}))),te.createElement(gm,null,te.createElement(gr,null)),te.createElement(gm,null,te.createElement(em,null,Yl(e)&&te.createElement(ht,{id:Xo("button-cancel-installation"),variant:Tp.danger,onClick:()=>r.open({clusterId:e.id})},"Abort Installation"),e.status==="error"&&te.createElement(ht,{id:Xo("button-reset-cluster"),onClick:()=>o.open({cluster:e})},"Reset Cluster"),["finalizing","installed"].includes(e.status)&&te.createElement(RC,{isDisabled:!i||!!n,cluster:e,consoleUrl:i?.consoleUrl,id:Xo("button-launch-console")}),p&&te.createElement(ht,{variant:Tp.primary,component:u=>te.createElement(FS,{to:`${ue}/clusters/${e.id}`,...u}),id:Xo("button-add-hosts"),onClick:async()=>{try{let{data:u}=await M.allowAddHosts(e.id);$e(u)}catch(u){x(u)}}},"Add hosts"),!To()&&te.createElement(ht,{variant:Tp.link,component:u=>te.createElement(FS,{to:`${ue}/clusters`,...u}),id:Xo("button-back-to-all-clusters")},"Back to all clusters"),te.createElement(xc,null,te.createElement(ht,{id:"cluster-installation-logs-button",variant:Tp.link,onClick:()=>_s(t,e.id),isDisabled:!Es(e)},"Download Installation Logs"),te.createElement(Gr,{cluster:e,onFetchEvents:Do})))))},hm=Gz;import bt from"react";import{Card as jz,Title as Rz,CardBody as MS,CardHeader as Kz,CardExpandableContent as Xz,Grid as Jz,GridItem as Zz}from"@patternfly/react-core";import{Flex as $z,FlexItem as Pp,Button as HS,ButtonVariant as OS}from"@patternfly/react-core";import Tr from"react";var qz=e=>`cluster-detail-${e}`,Yz=({cluster:e})=>{let{addAlert:t}=N(),{cancelInstallationDialog:o}=se();return Tr.createElement($z,{className:"assisted-ui-vertical-margin",spaceItems:{default:"spaceItemsSm"},direction:{default:"row"},justifyContent:{default:"justifyContentFlexStart"}},Tr.createElement(Pp,null,Tr.createElement(HS,{"data-testid":"cluster-installation-abort-button",variant:OS.danger,onClick:()=>o.open({clusterId:e.id}),isDisabled:!Yl(e)},"Abort Installation")),Tr.createElement(Pp,null,Tr.createElement(_n,{status:e.status,clusterId:e.id,"data-testid":qz("button-download-kubeconfig")})),Tr.createElement(Pp,null,Tr.createElement(Gr,{cluster:e,onFetchEvents:Do})),Tr.createElement(Pp,null,Tr.createElement(HS,{"data-testid":"cluster-installation-logs-button",variant:OS.link,onClick:()=>_s(t,e.id),isDisabled:!Es(e)},"Download Installation Logs")))},LS=Yz;var Qz=({cluster:e})=>{let[t,o]=bt.useState(e.status!=="installed"),r=Wi(e);return bt.createElement(jz,{"data-testid":"ai-cluster-details-card",isExpanded:t},bt.createElement(Kz,{onExpand:()=>o(!t),toggleButtonProps:{"data-testid":"toggle-ai-cluster-details","aria-label":"AI Cluster Details","aria-labelledby":"titleId toggle-button","aria-expanded":t}},bt.createElement(Rz,{headingLevel:"h1",size:"lg",className:"card-title"},"Installation progress"),!t&&bt.createElement("div",{className:"pf-u-ml-md"},bt.createElement(jl,{status:e.status}))),bt.createElement(MS,null,bt.createElement(Mn,{cluster:e,minimizedView:!t,totalPercentage:e.progress?.totalPercentage||0}),bt.createElement(LS,{cluster:e})),bt.createElement(Xz,null,bt.createElement(MS,null,bt.createElement(Jz,{hasGutter:!0},bt.createElement(zi,{cluster:e,clusterVarieties:r,showAddHostsInfo:!1,showKubeConfig:!1}),bt.createElement(Zz,null,bt.createElement(Ni,{cluster:e,skipDisabled:!0}))))))},Cm=Qz;import $ from"react";import{Provider as xq}from"react-redux";import{Link as kq}from"react-router-dom";import{Button as Tq,ButtonVariant as Pq,Card as Qm,CardBody as ef,CardHeader as tf,Title as of}from"@patternfly/react-core";import ym from"react";import{useSelector as e0,useDispatch as _S}from"react-redux";var t0=(e,t)=>e===Q.ERROR?t:![Q.LOADING,Q.RELOADING].includes(e),oa=e=>{let t=_S();return ym.useCallback(()=>t(Yn(e)),[e,t])},wp=e=>{let{isReloadScheduled:t,uiState:o,data:r,errorDetail:s}=e0(jn),i=_S(),n=oa(e),a=!!r;return ym.useEffect(()=>{t&&t0(o,a)&&n(),i(Nd())},[n,i,t,a,o]),ym.useEffect(()=>{n();let l=window.setInterval(()=>i(Jr()),bs);return()=>{clearInterval(l),i(Nd()),i(Gy())}},[i,n]),{cluster:r,uiState:o,errorDetail:s}};import Oo from"react";import Z2 from"classnames";import Fe from"react";import{useDispatch as HB,useSelector as CI}from"react-redux";import{Formik as OB,useFormikContext as LB}from"formik";import{Form as MB,Grid as yI,GridItem as Dm,Text as _B,TextContent as WB}from"@patternfly/react-core";import WS from"react";var zS=WS.createContext(null),ke=()=>{let e=WS.useContext(zS);if(!e)throw new Error("useClusterWizardContext must be used within ClusterWizardContextProvider");return e},BS=zS;import ps from"react";import{useHistory as n0}from"react-router-dom";import{Alert as a0,AlertGroup as l0,AlertVariant as p0}from"@patternfly/react-core";import o0 from"react";import{Alert as r0,AlertVariant as s0}from"@patternfly/react-core";var i0={vsphere:"vSphere",nutanix:"Nutanix"},US={vsphere:Is,nutanix:Ru},GS=({clusterId:e,platformType:t})=>{let{isPlatformIntegrationSupported:o,supportedPlatformIntegration:r}=ns(e);if(!(o&&!So({platform:{type:t}})))return null;let i=i0[r];return o0.createElement(r0,{title:`Discover the full potential of ${i} integration`,variant:s0.info,isInline:!0,"data-testid":"discover-platform-integration-hosts"},`Since all of your hosts originated from the ${i} platform, you now have the option to integrate with it.`)};var u0="Provided cluster configuration is not valid",c0=({cluster:e,errorFields:t=[],alertTitle:o,alertContent:r})=>{let{currentStepId:s}=ke(),i=e&&Pg(e),{t:n}=f(),a=r;return a===void 0&&(a=`The following fields are invalid or missing:
|
|
29
|
-
${t.map(l=>zu(n)[l]||l).join(", ")}.`),ps.createElement(l0,null,!!t.length&&ps.createElement(a0,{variant:p0.danger,title:o||u0,isInline:!0},a),s==="host-discovery"&&e&&ps.createElement(GS,{clusterId:e.id,platformType:e.platform?.type||"none"}),e&&ps.createElement(Oc,{currentStepId:s,clusterStatus:e.status,hosts:e?.hosts||[],validationsInfo:i,wizardStepsValidationsMap:qe}))},d0=({cluster:e,additionalActions:t,errorFields:o,alertTitle:r,alertContent:s,onCancel:i,...n})=>{let{alerts:a}=N(),l=n0(),p=ps.useCallback(()=>l.push(`${ue}/clusters/`),[l]),u=a.length?ps.createElement(gr,null):void 0;return ps.createElement($r,{alerts:u,errors:ps.createElement(c0,{cluster:e,errorFields:o,alertTitle:r,alertContent:s}),onCancel:i||p,leftExtraActions:t,cluster:e,onFetchEvents:Do,...n})},_t=d0;import Ep from"react";import{WizardNav as qS}from"@patternfly/react-core";var ra={"cluster-details":"Cluster details",operators:"Operators","host-discovery":"Host discovery","static-ip-yaml-view":"Static network configurations","static-ip-network-wide-configurations":"Network-wide configurations","static-ip-host-configurations":"Host specific configurations",storage:"Storage",networking:"Networking",review:"Review and create"},$S=["cluster-details","operators","host-discovery","storage","networking","review"],Dp=["static-ip-network-wide-configurations","static-ip-host-configurations"];var m0=(e,t)=>{if(!t)return!0;switch(e){case"cluster-details":return!t.validationsInfo||os({cluster:t});case"static-ip-yaml-view":case"static-ip-host-configurations":case"static-ip-network-wide-configurations":return os({cluster:t});case"host-discovery":return np({cluster:t});case"storage":return ap({cluster:t});case"networking":return lp({cluster:t});default:return!0}},f0=({cluster:e})=>{let t=ke(),o=a=>!t.wizardStepIds.slice(a).includes(t.currentStepId),r=(a,l)=>l==="cluster-details"?!1:o(a),s=(a,l)=>Ep.createElement(fl,{step:a,key:l,content:ra[l],onNavItemClick:()=>t.setCurrentStepId(l),isCurrent:t.currentStepId===l,isDisabled:r(a,l),isValid:()=>m0(l,e)}),i=a=>Ep.createElement(fl,{step:a,isExpandable:!0,content:"Static network configurations",key:"static-network-configuration-form-view",isCurrent:zs(t.currentStepId),isDisabled:o(a)},Ep.createElement(qS,{returnList:!0},Dp.map((l,p)=>s(a+p,l))));return Ep.createElement(qS,null,(()=>{let a=[],l=0;for(;l<t.wizardStepIds.length;){let p=t.wizardStepIds[l];p!=="static-ip-network-wide-configurations"?(a.push(s(l,p)),l+=1):(a.push(i(l)),l+=2)}return a})())},xt=f0;import{Fragment as x0,createElement as Ap}from"react";import{createElement as vm,useCallback as I0,useMemo as S0}from"react";import{sortable as C0}from"@patternfly/react-table";import g0 from"react";var h0=e=>{let t=Fn("networking",qe,e.host),o=ki[t],r=An(e.validationsInfo,"networking",qe),s=Cl(r,"networking",qe)?"Some validations failed":void 0;return g0.createElement(Vs,{...e,status:{...o,sublabel:s},validationsInfo:r,AdditionalNTPSourcesDialogToggleComponent:Po})},YS=h0;var y0=e=>({header:{title:"Status",transforms:[C0]},cell:t=>{let o=e?()=>e(t):void 0,r=O(t.validationsInfo)||{};return{title:vm(YS,{host:t,onEditHostname:o,validationsInfo:r}),props:{"data-testid":"nic-status"},sortableValue:status}}}),v0=({cluster:e,AdditionalNTPSourcesDialogToggleComponent:t,onEditHost:o,onEditRole:r,canEditRole:s,canEditHostname:i,actionResolver:n,children:a,onSelect:l,selectedIDs:p})=>{let{t:u}=f(),c=S0(()=>[Jo(u,o,void 0,i),Zr(u,s,r,io(e)),y0(o),iv(e),nv(e),av(e),lv(e),Qr(e)],[u,o,r,i,s,e]),d=e.hosts||[],m=Zo(d.length),g=I0(({obj:h})=>vm(Ws,{host:h,AdditionalNTPSourcesDialogToggleComponent:t}),[t]);return vm(ts,{testId:"networking-host-table",hosts:d,ExpandComponent:g,content:c,actionResolver:n,onSelect:l,selectedIDs:p,...m},a)},jS=v0;var b0=({cluster:e})=>{let{actionChecks:t,onEditHost:o,actionResolver:r,...s}=rs(e);return Ap(x0,null,Ap(jS,{cluster:e,AdditionalNTPSourcesDialogToggleComponent:Po,onEditHost:o,canEditHostname:t.canEditHostname,actionResolver:r},Ap(Av,{isSNO:le(e)})),Ap(ss,{cluster:e,...s}))},RS=b0;import sa from"react";function Pr(e,t){let[o,r]=sa.useState(),[s,i]=sa.useState(""),{infraEnvId:n,error:a}=Cp(e,t),l=sa.useCallback(async()=>{try{if(n){let{data:u}=await Ae.get(n);r(u)}}catch(u){i(Ge(u))}},[n]),p=sa.useCallback(async u=>{if(!n)throw"updateInfraEnv should not be called before infra env was loaded";Ae.abortLastGetRequest();let{data:c}=await Ae.update(n,u);return r(c),c},[n]);return sa.useEffect(()=>{a?i(a):o||l()},[l,o,n,a]),{infraEnv:o,error:s,isLoading:!o&&!s,updateInfraEnv:p}}import{array as P0,lazy as k0,object as T0}from"yup";var KS=(e,t)=>{let o=le(e),r=hi(e);return{apiVip:e.apiVip||"",ingressVip:e.ingressVip||"",sshPublicKey:e.sshPublicKey||"",vipDhcpAllocation:e.vipDhcpAllocation,managedNetworkingType:e.userManagedNetworking?"userManaged":"clusterManaged",networkType:e.networkType||$g(o,r),machineNetworks:e.machineNetworks||[],stackType:r?wt:yo,clusterNetworks:e.clusterNetworks||(r?t.clusterNetworksDualstack:t.clusterNetworksIpv4),serviceNetworks:e.serviceNetworks||(r?t.serviceNetworksDualstack:t.serviceNetworksIpv4)}},XS=(e,t)=>k0(o=>T0().shape({apiVip:Cc(t,o,e.apiVip),ingressVip:Cc(t,o,e.ingressVip),sshPublicKey:el,machineNetworks:o.managedNetworkingType==="userManaged"?P0():lh.when("stackType",{is:yo,then:sl,otherwise:o.machineNetworks&&o.machineNetworks?.length>=2&&rl("machine networks")}),clusterNetworks:ph.when("stackType",{is:yo,then:sl,otherwise:o.clusterNetworks&&o.clusterNetworks?.length>=2&&rl("cluster network")}),serviceNetworks:uh.when("stackType",{is:yo,then:sl,otherwise:o.serviceNetworks&&o.serviceNetworks?.length>=2&&rl("service network")})}));import Qe from"react";import{useFormikContext as kB}from"formik";import{useSelector as TB}from"react-redux";import{Alert as PB,AlertVariant as wB,Grid as DB,Tooltip as EB}from"@patternfly/react-core";import fe from"react";import{useSelector as F0}from"react-redux";import{useFormikContext as V0}from"formik";import{Spinner as N0,Alert as H0,AlertVariant as O0,Tooltip as L0}from"@patternfly/react-core";import{createElement as eI,forwardRef as A0}from"react";import{useSelector as JS}from"react-redux";import{Checkbox as w0,Radio as D0}from"@patternfly/react-core";function us(e){return function(o){let{isViewerMode:r}=JS(R),s=o.isDisabled||r;return eI(e,{...o,isDisabled:s})}}function E0(e){return A0(function(o,r){let{isViewerMode:s}=JS(R),i=o.isDisabled||s;return eI(e,{ref:r,...o,isDisabled:i})})}var Be=us(St),$s=us(on),po=us(Lr),Fp=us(li),Sm=us(Re),ZS=us(sc),Vp=us(w0),Im=us(D0),QS=E0(ws);var tI=({vipName:e,cluster:t,validationErrorMessage:o})=>{let{vipDhcpAllocation:r}=t,s=Ds(t);return r&&t[e]?fe.createElement(fe.Fragment,null,t[e]):r&&o?fe.createElement(H0,{variant:O0.danger,title:"The DHCP server failed to allocate the IP",isInline:!0},o):r&&s?fe.createElement(fe.Fragment,null,fe.createElement(N0,{size:"md"}),fe.createElement("i",null," This IP is being allocated by the DHCP server")):fe.createElement("i",null,"This IP will be allocated by the DHCP server")},oI=(e,t,o)=>o?t&&e?"This IP was allocated by the DHCP server.":"":"Make sure that the VIP is unique and not used by any other device on your network.",M0=e=>{let t=O(e)||{},o=["VIP IP allocation from DHCP server has been timed out","IP allocation from the DHCP server timed out."];return(t.network||[]).reduce((r,s)=>(["api-vip-defined","ingress-vip-defined"].includes(s.id)&&(r[s.id]=s.status==="failure"&&o.find(i=>s.message.match(i))?s.message:void 0),r),{})},rI=({cluster:e,isVipDhcpAllocationDisabled:t})=>{let{values:o,setFieldValue:r}=V0(),{isViewerMode:s}=F0(R),i=`Provide an endpoint for users, both human and machine, to interact with and configure the platform. If needed, contact your IT manager for more information. ${oI(e.apiVip,e.vipDhcpAllocation,o.vipDhcpAllocation)}`,n=`Provide an endpoint for application traffic flowing in from outside the cluster. If needed, contact your IT manager for more information. ${oI(e.ingressVip,e.vipDhcpAllocation,o.vipDhcpAllocation)}`,{"api-vip-defined":a,"ingress-vip-defined":l}=fe.useMemo(()=>M0(e.validationsInfo),[e.validationsInfo]),p=o.networkType===Co;fe.useEffect(()=>{!s&&!p&&r("vipDhcpAllocation",!1)},[p,s,r]);let u=fe.useCallback(c=>{r("apiVip",c?"":e.apiVip),r("ingressVip",c?"":e.ingressVip)},[e.apiVip,e.ingressVip,r]);return fe.createElement(fe.Fragment,null,!t&&fe.createElement(po,{onChange:u,label:fe.createElement(fe.Fragment,null,fe.createElement(L0,{hidden:p,content:"A cluster with OVN networking type cannot use 'allocate IPs via DHCP server'"},fe.createElement("span",null,"Allocate IPs via DHCP server")),fe.createElement(so,{featureId:"VIP_AUTO_ALLOC",openshiftVersion:e.openshiftVersion})),name:"vipDhcpAllocation",isDisabled:!p}),o.vipDhcpAllocation?fe.createElement(fe.Fragment,null,fe.createElement(nl,{label:"API IP",name:"apiVip",helperText:i,value:o.apiVip||"",isValid:!a,isRequired:!0},fe.createElement(tI,{vipName:"apiVip",cluster:e,validationErrorMessage:a})),fe.createElement(nl,{label:"Ingress IP",name:"ingressVip",helperText:n,value:o.ingressVip||"",isValid:!l,isRequired:!0},fe.createElement(tI,{vipName:"ingressVip",cluster:e,validationErrorMessage:l}))):fe.createElement(fe.Fragment,null,fe.createElement(Be,{label:"API IP",name:"apiVip",helperText:i,isRequired:!0}),fe.createElement(Be,{name:"ingressVip",label:"Ingress IP",helperText:n,isRequired:!0})))};import MSe from"react";import{Alert as WSe,AlertActionLink as zSe,AlertVariant as BSe,Popover as USe}from"@patternfly/react-core";import Qo from"react";import{List as _0,ListItem as Np,Text as W0,TextContent as z0}from"@patternfly/react-core";import{Trans as B0}from"react-i18next";var bm=({shouldDisplayLoadBalancersBullet:e=!1})=>{let{t}=f();return Qo.createElement(z0,null,Qo.createElement(W0,{component:"p"},Qo.createElement(B0,{t},"ai:Please refer to the"," ",Qo.createElement(ot,{href:Du},"OpenShift networking documentation")," ","to configure your cluster's networking, including:")),Qo.createElement(_0,null,Qo.createElement(Np,null,t("ai:DHCP or static IP Addresses")),Qo.createElement(ee,{condition:e},Qo.createElement(Np,null,t("ai:Load balancers"))),Qo.createElement(Np,null,t("ai:Network ports")),Qo.createElement(Np,null,t("ai:DNS"))))};import xm from"react";import{FormGroup as $0}from"@patternfly/react-core";import sI from"react";import{Tooltip as U0}from"@patternfly/react-core";var G0=({tooltipProps:e,...t})=>sI.createElement(U0,{...e},sI.createElement(Re,{...t})),Ui=G0;var km="managedNetworkingType",Tm=({disabled:e=!1,tooltip:t})=>{let o={hidden:!t||!e,content:t,position:"top"},{t:r}=f();return xm.createElement($0,{label:r("ai:Network Management"),fieldId:T(km,"radio"),isInline:!0},xm.createElement(Ui,{tooltipProps:o,name:km,isDisabled:e,value:"clusterManaged",label:r("ai:Cluster-Managed Networking")}),xm.createElement(Ui,{tooltipProps:o,name:km,isDisabled:e,value:"userManaged",label:r("ai:User-Managed Networking")}))};import fIe from"react";import{useFormikContext as hIe}from"formik";import{Spinner as yIe,Alert as vIe,AlertVariant as SIe}from"@patternfly/react-core";import Ze from"react";import{useSelector as q0}from"react-redux";import{ButtonVariant as Y0,FormGroup as j0,Tooltip as R0}from"@patternfly/react-core";import{useFormikContext as K0}from"formik";import{Address6 as X0}from"ip-address";var J0=(e,t,o,r)=>e&&t&&(r.machineNetworks&&r.machineNetworks[1].cidr!==o||r.clusterNetworks&&r.clusterNetworks[1].cidr!==e[1].cidr||r.clusterNetworks&&r.clusterNetworks[1].hostPrefix!==e[1].hostPrefix||r.serviceNetworks&&r.serviceNetworks[1].cidr!==t[1].cidr),iI=({clusterId:e,isDualStackSelectable:t,hostSubnets:o})=>{let{setFieldValue:r,values:s,validateForm:i}=K0(),[n,a]=Ze.useState(!1),l=_i(["clusterNetworksDualstack","clusterNetworksIpv4","serviceNetworksDualstack","serviceNetworksIpv4"]),p=o.filter(C=>X0.isValid(C.subnet)),u=p.length>=1?p[0].subnet:qt,{isViewerMode:c}=q0(R),d=!c&&!t&&s.stackType===wt,m=Ze.useCallback(()=>{r("stackType",yo),s.machineNetworks&&s.machineNetworks?.length>=2&&r("machineNetworks",s.machineNetworks.slice(0,1)),s.clusterNetworks&&s.clusterNetworks?.length>=2&&r("clusterNetworks",s.clusterNetworks.slice(0,1)),s.serviceNetworks&&s.serviceNetworks?.length>=2&&r("serviceNetworks",s.serviceNetworks.slice(0,1)),i()},[r,i,s.clusterNetworks,s.machineNetworks,s.serviceNetworks]),g=()=>{r("stackType",wt),r("vipDhcpAllocation",!1),s.networkType===Co&&r("networkType",Ts),s.machineNetworks&&s.machineNetworks?.length<2&&r("machineNetworks",[...s.machineNetworks,{cidr:u,clusterId:e}],!1),s.clusterNetworks&&s.clusterNetworks?.length<2&&r("clusterNetworks",[...s.clusterNetworks,l.clusterNetworksDualstack?.length?l.clusterNetworksDualstack[1]:{cidr:"",hostPrefix:"",clusterId:e}],!1),s.serviceNetworks&&s.serviceNetworks?.length<2&&r("serviceNetworks",[...s.serviceNetworks,l.serviceNetworksDualstack?.length?l.serviceNetworksDualstack[1]:{cidr:"",clusterId:e}],!1)},h=C=>{C.target.value===wt?g():J0(l.clusterNetworksDualstack||[],l.serviceNetworksDualstack||[],u,s)?a(!0):m()};return Ze.useEffect(()=>{d&&m()},[d,m]),Ze.createElement(R0,{content:"Dual-stack is only available when your hosts are using IPV4 together with IPV6.",hidden:t,position:"top-start"},Ze.createElement(Ze.Fragment,null,Ze.createElement(j0,{label:"Networking stack type",fieldId:T("stackType","radio"),isInline:!0,onChange:h},Ze.createElement(Sm,{name:"stackType",value:yo,isDisabled:!t,label:Ze.createElement(Ze.Fragment,null,"IPv4"," ",Ze.createElement(W,{noVerticalAlign:!0,bodyContent:"Select this when your hosts are using only IPv4."}))}),Ze.createElement(Sm,{name:"stackType",value:wt,isDisabled:!t,label:Ze.createElement(Ze.Fragment,null,"Dual-stack"," ",Ze.createElement(W,{noVerticalAlign:!0,bodyContent:"Select dual-stack when your hosts are using IPV4 together with IPV6."}))})),n&&Ze.createElement(Fs,{title:"Change stack type?",titleIconVariant:"warning",confirmationButtonText:"Change",confirmationButtonVariant:Y0.primary,content:Ze.createElement(Ze.Fragment,null,Ze.createElement("p",null,"All data and configuration done for 'Dual-stack' will be lost.")),onClose:()=>{a(!1),g()},onConfirm:()=>{a(!1),m()}})))};import wr,{useEffect as Z0}from"react";import{useSelector as Q0}from"react-redux";import{Alert as eB,AlertVariant as tB,FormGroup as oB,Stack as rB,StackItem as nI}from"@patternfly/react-core";import{FieldArray as sB,useFormikContext as iB}from"formik";import{Address4 as nB,Address6 as aB}from"ip-address";var aI=(e,t)=>e.humanized.localeCompare(t.humanized),lB=e=>e.map((t,o)=>({label:t.humanized,value:t.subnet,isDisabled:!1,id:`form-input-hostSubnet-field-option-${o}`})),pB=e=>({label:`Please select a subnet. (${e} available)`,value:qt,isDisabled:!0,id:"form-input-hostSubnet-field-option-no-subnet-selected"}),uB={label:"No subnets are currently available",value:qt,id:"form-input-hostSubnet-field-option-no-subnet-available"},cB=(e,t,o,r)=>{Z0(()=>{e&&t("machineNetworks",[{cidr:o,clusterId:r}],!0)},[e,o,r,t])},lI=({clusterId:e,hostSubnets:t,isRequired:o=!1,isDisabled:r})=>{let{values:s,errors:i,setFieldValue:n}=iB(),a=s.stackType===wt,{isViewerMode:l}=Q0(R),p=t.filter(h=>nB.isValid(h.subnet)).sort(aI),u=t.filter(h=>aB.isValid(h.subnet)).sort(aI),c=p.length>=1?p[0].subnet:qt,d=(s.machineNetworks??[]).length===0;cB(!l&&d,n,c,e);let g=wr.useMemo(()=>h=>h.length===0?[uB]:[pB(h.length)].concat(lB(h)),[]);return wr.createElement(oB,{label:"Machine network",labelInfo:a&&"Primary",fieldId:"machine-networks",isRequired:!0},wr.createElement(sB,{name:"machineNetworks"},()=>wr.createElement(rB,null,a?s.machineNetworks?.map((h,C)=>{let I=C===1?u:p;return wr.createElement(nI,{key:C},wr.createElement($s,{name:`machineNetworks.${C}.cidr`,options:g(I),isRequired:o,isDisabled:r}))}):wr.createElement(nI,null,wr.createElement($s,{name:"machineNetworks.0.cidr",options:g(p),isRequired:o,isDisabled:r})))),typeof i.machineNetworks=="string"&&wr.createElement(eB,{variant:tB.warning,title:i.machineNetworks,isInline:!0}))};import Wt from"react";import{Alert as pI,AlertVariant as uI,FormGroup as cI,StackItem as Pm,TextInputTypes as dB,Grid as mB,Stack as fB}from"@patternfly/react-core";import{FieldArray as dI,useFormikContext as gB}from"formik";var mI=(e,t)=>t?` (${e===0?"IPv4":"IPv6"})`:"",hB="The subnet prefix length to assign to each individual node. For example, if Cluster Network Host Prefix is set to 23, then each node is assigned a /23 subnet out of the given cidr (clusterNetworkCIDR), which allows for 510 (2^(32 - 23) - 2) pod IPs addresses. If you are required to provide access to nodes from an external network, configure load balancers and routers to manage the traffic.",CB="The subnet prefix length to assign to each individual node. For example, if Cluster Network Host Prefix is set to 116, then each node is assigned a /116 subnet out of the given cidr (clusterNetworkCIDR), which allows for 4,094 (2^(128 - 116) - 2) pod IPs addresses. If you are required to provide access to nodes from an external network, configure load balancers and routers to manage the traffic.",yB="IP address block from which Pod IPs are allocated. This block must not overlap with existing physical networks. These IP addresses are used for the Pod network, and if you need to access the Pods from an external network, configure load balancers and routers to manage the traffic.",vB="The IP address pool to use for service IP addresses. You can enter only one IP address pool. If you need to access the services from an external network, configure load balancers and routers to manage the traffic.",SB=()=>{let{setFieldValue:e,values:t,errors:o}=gB(),r=t.stackType===wt,s=l=>parseInt((t.clusterNetworks&&t.clusterNetworks[l].cidr||"").split("/")[1])||1,i=(l,p)=>{isNaN(parseInt(l.target.value))&&e(`clusterNetworks.${p}.hostPrefix`,s(p))},n=l=>r?!!l:!1,a=l=>n(l)?CB:hB;return Wt.createElement(mB,{hasGutter:!0,className:"pf-u-ml-lg"},Wt.createElement(dI,{name:"clusterNetworks"},()=>Wt.createElement(cI,{fieldId:"clusterNetworks",labelInfo:r&&"Primary"},t.clusterNetworks?.map((l,p)=>{let u=mI(p,r);return Wt.createElement(fB,{key:p},Wt.createElement(Pm,{className:"network-field-group pf-u-pb-md"},Wt.createElement(Be,{name:`clusterNetworks.${p}.cidr`,label:`Cluster network CIDR${u}`,helperText:yB,isRequired:!0,labelInfo:p===0&&r?"Primary":""})),Wt.createElement(Pm,{className:"network-field-group pf-u-pb-md"},Wt.createElement(Be,{name:`clusterNetworks.${p}.hostPrefix`,label:`Cluster network host prefix${u}`,type:dB.number,min:s(p),max:n(p)?za.IPv6:za.IPv4,onBlur:c=>i(c,p),helperText:a(p),isRequired:!0})))}))),typeof o.clusterNetworks=="string"&&Wt.createElement(pI,{variant:uI.warning,title:o.clusterNetworks,isInline:!0}),Wt.createElement(dI,{name:"serviceNetworks"},()=>Wt.createElement(cI,{fieldId:"serviceNetworks",labelInfo:r&&"Primary"},t.serviceNetworks?.map((l,p)=>Wt.createElement(Pm,{key:p,className:"network-field-group pf-u-pb-md"},Wt.createElement(Be,{name:`serviceNetworks.${p}.cidr`,label:`Service network CIDR${mI(p,r)}`,helperText:vB,isRequired:!0,labelInfo:p===0&&r?"Primary":""}))))),typeof o.serviceNetworks=="string"&&Wt.createElement(pI,{variant:uI.warning,title:o.serviceNetworks,isInline:!0}))},fI=SB;import zt from"react";import{Split as IB,SplitItem as wm,Tooltip as bB,FormGroup as xB}from"@patternfly/react-core";var ia="networkType",gI=({isDisabled:e=!1,isSDNSelectable:t})=>{let{t:o}=f();return zt.createElement(xB,{fieldId:ia,label:"Network type"},zt.createElement(IB,{hasGutter:!0},zt.createElement(wm,null,zt.createElement(bB,{hidden:t,content:o("ai:Software-Defined Networking (SDN) cannot be selected for SNO clusters or when IPv6 is detected.")},zt.createElement(Re,{id:ia,name:ia,isDisabled:e||!t,value:Co,label:zt.createElement(zt.Fragment,null,o("ai:Software-Defined Networking (SDN)")," ",zt.createElement(W,{noVerticalAlign:!0,bodyContent:"The classic bullet-proof networking type"}))}))),zt.createElement(wm,null),zt.createElement(wm,null,zt.createElement(Re,{id:ia,name:ia,isDisabled:e,value:Ts,label:zt.createElement(zt.Fragment,null,o("ai:Open Virtual Networking (OVN)")," ",zt.createElement(W,{noVerticalAlign:!0,bodyContent:"The next generation networking type, select this when you're using new features and telco features"}))}))))};var AB=Qe.createElement(PB,{title:"Your cluster will be subject to support limitations",variant:wB.info,isInline:!0,"data-testid":"networking-vms-alert"},"Some or all of your discovered hosts are virtual machines, so selecting the cluster-managed networking option will limit your installed cluster's support."),FB=(e,t)=>!(Bg(e.serviceNetworks||[],t.serviceNetworksIpv4||[])&&Ug(e.clusterNetworks||[],t.clusterNetworksIpv4||[])),VB=(e,t,o,r)=>e?{isNetworkManagementDisabled:!0,networkManagementDisabledReason:"Network management selection is not supported with dual-stack"}:t&&o===L.ARM&&!r.isFeatureSupported(t,"ARM64_ARCHITECTURE_WITH_CLUSTER_MANAGED_NETWORKING")?{isNetworkManagementDisabled:!0,networkManagementDisabledReason:r.getFeatureDisabledReason(t,"ARM64_ARCHITECTURE_WITH_CLUSTER_MANAGED_NETWORKING")}:!!t&&r.isFeatureDisabled(t,"NETWORK_TYPE_SELECTION")?{isNetworkManagementDisabled:!0,networkManagementDisabledReason:r.getFeatureDisabledReason(t,"NETWORK_TYPE_SELECTION")}:{isNetworkManagementDisabled:!1,networkManagementDisabledReason:void 0},NB=({cluster:e,hostSubnets:t,isVipDhcpAllocationDisabled:o,defaultNetworkSettings:r,hideManagedNetworking:s})=>{let{t:i}=f(),n=be(),{setFieldValue:a,values:l,validateField:p}=kB(),u=Qe.useMemo(()=>vp(e,n,i),[e,n,i]),c=le(e),d=!c,m=l.managedNetworkingType==="userManaged",g=l.stackType===wt,{isViewerMode:h}=TB(R),C=!h&&g&&!m,I=Qe.useMemo(()=>qg(t),[t]),S=Qe.useMemo(()=>Gg(c,g),[c,g]),[y,v]=Qe.useState(g||FB(e,r));Qe.useEffect(()=>{m?(a("vipDhcpAllocation",!1),a("ingressVip","",!1),a("apiVip","",!1),d&&a("machineNetworks",[],!1)):l.vipDhcpAllocation||(p("ingressVip"),p("apiVip"))},[d,m,l.vipDhcpAllocation,a,p]);let w=Qe.useCallback(q=>{v(q),q||(a("clusterNetworks",g?r.clusterNetworksDualstack:r.clusterNetworksIpv4,!0),a("serviceNetworks",g?r.serviceNetworksDualstack:r.serviceNetworksIpv4,!0))},[a,g,r.clusterNetworksDualstack,r.clusterNetworksIpv4,r.serviceNetworksDualstack,r.serviceNetworksIpv4]);Qe.useEffect(()=>{C&&w(!0)},[C,w]);let{isNetworkManagementDisabled:E,networkManagementDisabledReason:F}=Qe.useMemo(()=>VB(g,e.openshiftVersion,e.cpuArchitecture,n),[e.cpuArchitecture,e.openshiftVersion,n,g]);return Qe.createElement(DB,{hasGutter:!0},!s&&Qe.createElement(Tm,{disabled:h||E,tooltip:F}),m&&Qe.createElement(bm,{shouldDisplayLoadBalancersBullet:d}),!m&&!!u&&u.CLUSTER_MANAGED_NETWORKING_WITH_VMS==="unsupported"&&AB,(c||!m)&&Qe.createElement(iI,{clusterId:e.id,isDualStackSelectable:I,hostSubnets:t}),Qe.createElement(gI,{isDisabled:h,isSDNSelectable:S}),!(m&&d)&&Qe.createElement(lI,{clusterId:e.id,hostSubnets:t,isRequired:!m,isDisabled:e.vipDhcpAllocation&&e.apiVip===void 0&&e.ingressVip===void 0||!1}),!m&&Qe.createElement(rI,{cluster:e,isVipDhcpAllocationDisabled:o}),Qe.createElement(EB,{content:"Advanced networking properties must be configured in dual-stack",hidden:!g,position:"top-start"},Qe.createElement(Vp,{id:"useAdvancedNetworking",label:"Use advanced networking",description:"Configure advanced networking properties (e.g. CIDR ranges).",isChecked:y,onChange:w,isDisabled:g})),y&&Qe.createElement(fI,null))},hI=NB;var zB=({cluster:e,hostSubnets:t,defaultNetworkSettings:o,infraEnv:r})=>{let{alerts:s}=N(),i=ke(),{isViewerMode:n}=CI(R),{errors:a,touched:l,isSubmitting:p,isValid:u,setFieldValue:c,values:d}=LB(),m=ho(),g=ro(a,l),h=Fe.useMemo(()=>e.platform?.type==="nutanix",[]);Fe.useEffect(()=>{h&&d.vipDhcpAllocation&&c("vipDhcpAllocation",!1)},[h,c,d.vipDhcpAllocation]);let C=Fe.createElement(_t,{cluster:e,errorFields:g,isSubmitting:p,isNextDisabled:p||m||!!s.length||!u||!lp({cluster:e}),onNext:()=>i.moveNext(),onBack:()=>i.moveBack()});return Fe.createElement(ye,{navigation:Fe.createElement(xt,{cluster:e}),footer:C},Fe.createElement(MB,null,Fe.createElement(yI,{hasGutter:!0},Fe.createElement(Dm,null,Fe.createElement(Ke,null,"Networking")),Fe.createElement(Dm,{span:12,lg:10,xl:9,xl2:7},Fe.createElement(yI,{hasGutter:!0},Fe.createElement(hI,{cluster:e,hostSubnets:t,defaultNetworkSettings:o,isVipDhcpAllocationDisabled:h}),Fe.createElement(ud,{clusterSshKey:e.sshPublicKey,imageSshKey:r?.sshAuthorizedKey,isDisabled:n}))),Fe.createElement(Dm,null,Fe.createElement(WB,null,Fe.createElement(_B,{component:"h2"},"Host inventory")),Fe.createElement(RS,{cluster:e})))))},BB=({cluster:e})=>{let{infraEnv:t,error:o,isLoading:r}=Pr(e.id,L.USE_DAY1_ARCHITECTURE),s=_i(["clusterNetworksDualstack","clusterNetworksIpv4","serviceNetworksDualstack","serviceNetworksIpv4"]),{addAlert:i,clearAlerts:n,alerts:a}=N(),l=HB(),{isViewerMode:p}=CI(R),u=Fe.useMemo(()=>zg(e),[e]),c=Fe.useMemo(()=>KS(e,s),[]),d=Fe.useMemo(()=>XS(c,u),[u,c]);Fe.useEffect(()=>{if(o){let h=`Failed to retrieve infra env (clusterId: ${e.id})`;if(a.find(C=>C.title===h))return;Lo(o,h),i({title:h,message:o})}},[o]);let m=async h=>{n();try{let C=!le(e),I=h.managedNetworkingType==="userManaged",S={apiVip:h.apiVip,ingressVip:h.ingressVip,sshPublicKey:h.sshPublicKey,vipDhcpAllocation:h.vipDhcpAllocation,networkType:h.networkType,machineNetworks:h.machineNetworks,clusterNetworks:h.clusterNetworks,serviceNetworks:h.serviceNetworks,userManagedNetworking:I};S.userManagedNetworking?(delete S.apiVip,delete S.ingressVip,C&&delete S.machineNetworks):h.vipDhcpAllocation?(delete S.apiVip,delete S.ingressVip):h.stackType===yo&&(S.machineNetworks=[]);let{data:y}=await re.update(e.id,e.tags,S);l(Uy(y))}catch(C){x(C,()=>i({title:"Failed to update the cluster",message:D(C)}))}};return r?Fe.createElement(z,null):Fe.createElement(OB,{initialValues:c,validationSchema:d,onSubmit:p?()=>Promise.resolve():m,validateOnMount:!0},Fe.createElement(zB,{cluster:e,hostSubnets:u,defaultNetworkSettings:s,infraEnv:t}))},vI=BB;import er from"react";import{useDispatch as YB,useSelector as jB}from"react-redux";import{ActionListItem as RB,Button as KB,ButtonVariant as XB,Grid as JB,GridItem as II}from"@patternfly/react-core";import Ve from"react";import{ExclamationTriangleIcon as UB}from"@patternfly/react-icons";import{global_warning_color_100 as GB}from"@patternfly/react-tokens";var $B=({platformType:e})=>{let t=e?US[e]:"";return Ve.createElement("p",null,Ve.createElement(UB,{color:GB.value,size:"sm"})," You will need to modify your platform configuration after cluster installation is completed."," ",Ve.createElement("a",{href:t,target:"_blank",rel:"noopener noreferrer","data-ouia-component-id":"vm-integration-kb-page"},"Learn more ",Ve.createElement("i",{className:"fas fa-external-link-alt"})))},qB=({cluster:e})=>{let t=ke(),{t:o}=f();return Ve.createElement(It,null,Ve.createElement(A,{title:"Cluster address",value:`${e.name||""}.${e.baseDnsDomain||""}`,testId:"cluster-address"}),Ve.createElement(Ip,{cluster:e}),Ve.createElement(A,{title:o("ai:Stack type"),value:hi(e)?"Dual-stack":"IPv4",testId:"stack-type"}),Ve.createElement(A,{title:"CPU architecture",value:e.cpuArchitecture,testId:"cpu-architecture"}),e.machineNetworks?.length&&Ve.createElement(A,{title:"Cluster network CIDR",value:Ve.createElement(Ve.Fragment,null,e.clusterNetworks?.map(r=>Ve.createElement("span",{key:r.cidr},r.cidr,Ve.createElement("br",null)))),testId:"network-cidr"}),Ve.createElement(A,{title:"Cluster summary",testId:"cluster-summary",value:Ve.createElement(Qc,{hosts:e.hosts})}),Ve.createElement(A,{title:"Cluster validations",value:Ve.createElement(ed,{validationsInfo:e.validationsInfo,setCurrentStepId:r=>t.setCurrentStepId(r),wizardStepNames:ra,wizardStepsValidationsMap:qe}),testId:"cluster-validations"}),Ve.createElement(A,{title:"Host validations",value:Ve.createElement(td,{hosts:e.hosts,setCurrentStepId:r=>t.setCurrentStepId(r),wizardStepNames:ra,allClusterWizardSoftValidationIds:Gv,wizardStepsValidationsMap:qe}),testId:"host-validations"}),Ve.createElement(ee,{condition:So(e)},Ve.createElement(A,{title:"Platform integration",value:Ve.createElement($B,{platformType:e.platform?.type}),testId:"platform-integration"})),Ve.createElement(Qn,{cluster:e}))},SI=qB;var ZB=({cluster:e})=>{let{addAlert:t}=N(),o=ke(),{isViewerMode:r}=jB(R),[s,i]=qo(!1),n=YB(),a=async()=>{i(!0);try{let{data:p}=await re.install(e.id,e.tags);n($e(p)),i(!1)}catch(p){x(p,()=>t({title:"Failed to start cluster installation",message:D(p)})),i(!1)}},l=er.createElement(_t,{cluster:e,onBack:()=>o.moveBack(),isSubmitting:s,submittingText:"Starting installation...",additionalActions:er.createElement(RB,null,er.createElement(KB,{variant:XB.primary,name:"install",onClick:a,isDisabled:r||s||e.status!=="ready"},"Install cluster"))});return er.createElement(ye,{navigation:er.createElement(xt,{cluster:e}),footer:l},er.createElement(JB,{hasGutter:!0},er.createElement(II,null,er.createElement(Ke,null,"Review and create")),er.createElement(II,null,er.createElement(SI,{cluster:e}))))},bI=ZB;import ds from"react";import ZU from"lodash/omit";import{useHistory as QU}from"react-router-dom";import{useDispatch as eG}from"react-redux";import uo from"react";import{useSelector as YU}from"react-redux";import{useLocation as jU}from"react-router-dom";import{Grid as RU,GridItem as UI}from"@patternfly/react-core";import KU from"lodash/isUndefined";import{Formik as XU}from"formik";import{Fragment as GU,createElement as gt,useEffect as qU,useRef as $U}from"react";import{Form as zU}from"@patternfly/react-core";import{useFormikContext as BU}from"formik";import{Fragment as iU,createElement as cs,useCallback as aU,useEffect as lU,useRef as nU}from"react";import{FormGroup as QB,Tooltip as eU}from"@patternfly/react-core";import{useField as tU,useFormikContext as oU}from"formik";var rU=e=>cs(iU,null,"Use arm64 CPU architecture"," ",cs(W,{noVerticalAlign:!0,bodyContent:cs("p",null,"Check this option if you want to use the arm64 CPU architecture instead of the default x86_64 CPU architecture. Please note that some features will not be available.")}),cs(so,{featureId:"ARM64_ARCHITECTURE",openshiftVersion:e})),sU=({versions:e})=>{let{values:{openshiftVersion:t}}=oU(),[{name:o,value:r},,{setValue:s}]=tU("cpuArchitecture"),i=be(),n=!!e.find(c=>i.isFeatureSupported(c.value,"ARM64_ARCHITECTURE")),a=nU(t),l=T(o,"input"),p=aU(c=>s(c?L.ARM:L.x86),[s]);if(lU(()=>{a.current!==t&&!i.isFeatureSupported(t,"ARM64_ARCHITECTURE")&&p(!1),a.current=t},[t,p,i]),!n)return null;let u=i.getFeatureDisabledReason(t,"ARM64_ARCHITECTURE");return cs(QB,{isInline:!0,fieldId:l},cs(eU,{hidden:!u,content:u},cs(Vp,{id:l,name:o,isDisabled:i.isFeatureDisabled(t,"ARM64_ARCHITECTURE"),label:rU(t),"aria-describedby":`${l}-helper`,description:cs(j,{fieldId:l},"Make sure all the hosts are using arm64 CPU architecture."),isChecked:zo({cpuArchitecture:r}),onChange:p,className:"with-tooltip"})))},xI=sU;import Hp from"react";import{FormGroup as pU}from"@patternfly/react-core";import{useField as uU}from"formik";var kI=({clusterExists:e})=>{let t="hostsNetworkConfigurationType",o=ke(),[{value:r},,]=uU(t),s={hidden:!e,content:yp,position:"top"};return Hp.useEffect(()=>{e||o.onUpdateHostNetworkConfigType(r)},[r,e]),Hp.createElement(pU,{label:"Hosts' network configuration",fieldId:T(t,"radio"),isInline:!0},Hp.createElement(Ui,{name:t,isDisabled:e,value:De.DHCP,label:"DHCP only",tooltipProps:s}),Hp.createElement(Ui,{name:t,isDisabled:e,value:De.STATIC,label:"Static IP, bridges, and bonds",tooltipProps:s}))};import at from"react";import NI from"lodash/isEqual";import{Alert as SU,AlertVariant as IU,FlexItem as bU,FormGroup as xU,Stack as kU,StackItem as Em}from"@patternfly/react-core";import Te from"react";import{ExternalLinkAltIcon as DI}from"@patternfly/react-icons";import{Flex as fU,FlexItem as EI,Stack as AI,StackItem as FI,Text as gU,TextVariants as hU,TextContent as CU}from"@patternfly/react-core";import Dr from"react";import{FieldArray as cU,useFormikContext as dU}from"formik";import{Stack as mU,StackItem as TI,TextInputTypes as PI}from"@patternfly/react-core";var wI=({isDisabled:e=!1})=>{let{values:t}=dU(),{t:o}=f();return Dr.createElement(cU,{name:"diskEncryptionTangServers"},({remove:r,push:s})=>Dr.createElement(mU,{hasGutter:!0},t.diskEncryptionTangServers.map((i,n)=>Dr.createElement(TI,{key:n},Dr.createElement(pn,{hideRemoveButton:n===0||e,onRemove:()=>r(n)},Dr.createElement("div",null,Dr.createElement(St,{type:PI.url,name:`diskEncryptionTangServers.${n}.url`,helperText:'Must start with "http://" or "https://". Optionally, end with ":<port>"',label:"Server URL",isRequired:!0,isDisabled:e}),"\u2009",Dr.createElement(St,{type:PI.text,name:`diskEncryptionTangServers.${n}.thumbprint`,label:"Server Thumbprint",isRequired:!0,isDisabled:e})))," ")),!e&&Dr.createElement(TI,null,Dr.createElement(ac,{onAdd:()=>s({url:"",thumbprint:""}),isInline:!0},o("ai:Add another Tang server")))))};var yU=()=>{let{t:e}=f();return Te.createElement(Te.Fragment,null,"TPM v2"," ",Te.createElement(W,{component:"a",minWidth:"22rem",bodyContent:Te.createElement("p",null,e("ai:TPM v2 stores passphrases in a secure cryptoprocessor contained within as server."),"\xA0",Te.createElement("a",{href:Wa,target:"_blank",rel:"noopener noreferrer"},e("ai:Learn more")," ",Te.createElement(DI,null)))}))},vU=()=>{let{t:e}=f();return Te.createElement(Te.Fragment,null,"Tang"," ",Te.createElement(W,{component:"a",minWidth:"25rem",bodyContent:Te.createElement("p",null,e("ai:Tang server component that enable network-bound disk encryption (NBDE).")," \xA0",Te.createElement("a",{href:Wa,target:"_blank",rel:"noopener noreferrer"},e("ai:Learn more")," ",Te.createElement(DI,null)))}))},VI=({diskEncryptionMode:e,isDisabled:t})=>{let{t:o}=f();return Te.createElement(AI,null,Te.createElement(FI,null,Te.createElement(fU,null,Te.createElement(EI,{spacer:{default:"spacer3xl"}},Te.createElement(Re,{isDisabled:t,name:"diskEncryptionMode",label:Te.createElement(yU,null),id:"TPMV2-button",value:"tpmv2"})),Te.createElement(EI,{spacer:{default:"spacer3xl"}},Te.createElement(Re,{isDisabled:t,name:"diskEncryptionMode",label:Te.createElement(vU,null),id:"tang-button",value:"tang"})))),e==="tang"&&Te.createElement(AI,null,"\xA0",Te.createElement(FI,null,Te.createElement(CU,null,Te.createElement(gU,{component:hU.h6},o("ai:Tang servers")))),"\xA0",Te.createElement(wI,{isDisabled:t})))};import{useFormikContext as TU}from"formik";var PU=e=>{if(!e||e.length===0)return!1;let t={url:"",thumbprint:""};return e.find(o=>!NI(o,t)&&!NI(o,{}))!==void 0},wU=({values:e,isSNO:t=!1,isDisabled:o=!1})=>{let{enableDiskEncryptionOnMasters:r,enableDiskEncryptionOnWorkers:s,diskEncryptionMode:i,diskEncryptionTangServers:n}=e,a=r||s,{setFieldValue:l,setFieldTouched:p}=TU();at.useEffect(()=>{!s&&!r&&(i!=="tpmv2"&&l("diskEncryptionMode","tpmv2"),PU(n)&&(p("diskEncryptionTangServers",!1,!1),l("diskEncryptionTangServers",[{}],!1)))},[r,s,i,n,p,l]),at.useEffect(()=>{t&&l("enableDiskEncryptionOnWorkers",!1)},[t,l]);let{t:u}=f(),c=u("ai:This option is not editable after the draft cluster is created"),d={hidden:!o,content:c};return at.createElement(xU,{label:"Encryption of installation disks"},at.createElement(kU,{hasGutter:!0},at.createElement(Em,null,at.createElement(li,{tooltipProps:d,name:"enableDiskEncryptionOnMasters",label:u(t?"ai:Control plane node, worker":"ai:Control plane nodes"),isDisabled:o})),at.createElement(ee,{condition:!t},at.createElement(Em,null,at.createElement(li,{tooltipProps:d,name:"enableDiskEncryptionOnWorkers",isDisabled:o,label:u("ai:Workers")}))),at.createElement(ee,{condition:r||s&&!t},at.createElement(Em,null,at.createElement(VI,{diskEncryptionMode:i,isDisabled:o})))),a&&at.createElement(SU,{variant:IU.warning,isInline:!0,title:at.createElement(bU,null,i==="tpmv2"&&at.createElement(at.Fragment,null,"To use this encryption method, enable TPMv2 encryption in the BIOS of each selected host."),i==="tang"&&at.createElement(at.Fragment,null,"The use of Tang encryption mode to encrypt your disks is only supported for bare metal or vSphere installations on user-provisioned infrastructure."))}))},HI=wU;import kt from"react";import Fo from"react";import{DropdownItem as DU,DropdownToggle as EU,Dropdown as AU,HelperText as FU,FormGroup as VU}from"@patternfly/react-core";import{CaretDownIcon as NU}from"@patternfly/react-icons";import{useField as HU}from"formik";var OI=({name:e,defaultValue:t,items:o,isDisabled:r,versions:s,getHelperText:i,showReleasesLink:n})=>{let[a,,{setValue:l}]=HU(e),[p,u]=Fo.useState(!1),[c,d]=Fo.useState(t),{t:m}=f(),[g,h]=Fo.useState(i(s,t,m)),C=T(e,"input"),I=o.map(({value:v,label:w})=>Fo.createElement(DU,{key:v,id:v},w)),S=Fo.useCallback(v=>{let w=v?.currentTarget.innerText?v?.currentTarget.innerText:t;d(w||""),l(v?.currentTarget.id),h(i(s,w,m)),u(!1)},[d,h,u,t,i,m,s,l]),y=Fo.useMemo(()=>Fo.createElement(EU,{onToggle:v=>u(!r&&v),toggleIndicator:NU,isDisabled:r,isText:!0,className:"pf-u-w-100"},c),[u,c,r]);return Fo.createElement(VU,{fieldId:C,label:m("ai:OpenShift version"),isRequired:!0},Fo.createElement(AU,{...a,name:e,id:C,onSelect:S,dropdownItems:I,toggle:y,isOpen:p,className:"pf-u-w-100"}),Fo.createElement(FU,{style:{display:"inherit"}},g),n&&Fo.createElement(ot,{href:`${window.location.origin}/${ju}`},m("ai:Learn more about OpenShift releases")))};import{ExclamationCircleIcon as OU,ExclamationTriangleIcon as LI,ExternalLinkAltIcon as LU}from"@patternfly/react-icons";import{global_warning_color_100 as MI,global_danger_color_100 as MU}from"@patternfly/react-tokens";var _I=()=>{let{t:e}=f();return kt.createElement("a",{href:Ma,target:"_blank",rel:"noopener noreferrer"},e("ai:Learn more")," ",kt.createElement(LU,null))},_U=(e,t,o)=>{if(!e.length)return kt.createElement(kt.Fragment,null,kt.createElement(OU,{color:MU.value,size:"sm"}),"\xA0 ",o("ai:No release image is available."));let r=null;return e.find(i=>i.label===t)?.supportLevel!=="production"?r=kt.createElement(kt.Fragment,null,kt.createElement(LI,{color:MI.value,size:"sm"}),"\xA0",o("ai:Please note that this version is not production-ready."),"\xA0",kt.createElement(_I,null)):t&&t in El.versions&&Al(El.versions[t])<=30&&(r=kt.createElement(kt.Fragment,null,kt.createElement(LI,{color:MI.value,size:"sm"}),"\xA0",o("ai:Full support for this version ends on {{openshiftversion}} and won't be available as an installation option afterwards.",{openshiftversion:El.versions[t]}),"\xA0",kt.createElement(_I,null))),r},WU=({versions:e})=>{let{t}=f(),o=kt.useMemo(()=>e.filter(s=>s.supportLevel!=="maintenance").map(s=>({label:s.supportLevel==="beta"?s.label+" - "+t("ai:Developer preview release"):s.label,value:s.value})),[e,t]),r=e.find(s=>s.default)?.label||e[0]?.label||"";return kt.createElement(OI,{name:"openshiftVersion",defaultValue:r,items:o,isDisabled:e.length===0,versions:e,getHelperText:_U,showReleasesLink:oe!==void 0})},WI=WU;var zI=({name:e,baseDnsDomain:t})=>gt(GU,null,"All DNS records must be subdomains of this base and include the cluster name. This cannot be changed after cluster installation. The full cluster address will be: ",gt("br",null),gt("strong",null,e||"[Cluster Name]",".",t||"[example.com]")),BI=({managedDomains:e=[],toggleRedHatDnsService:t,isBaseDnsDomainDisabled:o,versions:r,isPullSecretSet:s,defaultPullSecret:i,forceOpenshiftVersion:n,isOcm:a,clusterExists:l})=>{let{values:p}=BU(),{name:u,baseDnsDomain:c,highAvailabilityMode:d,useRedHatDnsService:m}=p,g=$U();qU(()=>{g.current?.focus()},[]);let{t:h}=f();return gt(zU,{id:"wizard-cluster-details__form"},gt(QS,{ref:g,label:"Cluster name",name:"name",placeholder:a?"":"Enter cluster name",isRequired:!0,richValidationMessages:m?Kg(h):Rg(h)}),!!e.length&&t&>(po,{name:"useRedHatDnsService",label:"Use a temporary 60-day domain",helperText:"A base domain will be provided for temporary, non-production clusters.",onChange:t}),m?gt($s,{label:"Base domain",name:"baseDnsDomain",helperText:gt(zI,{name:u,baseDnsDomain:c}),options:e.map(C=>({label:`${C.domain||""} (${C.provider||""})`,value:C.domain})),isRequired:!0}):gt(Be,{label:"Base domain",name:"baseDnsDomain",helperText:gt(zI,{name:u,baseDnsDomain:c}),placeholder:"example.com",isDisabled:o||m,isRequired:!0}),n?gt(al,{name:"openshiftVersion",label:"OpenShift version",isRequired:!0},"OpenShift ",n," ",UU(n,r)):gt(WI,{versions:r}),gt(ad,{versions:r,highAvailabilityMode:d}),!s&>(xd,{isOcm:a,defaultPullSecret:i}),gt(xI,{versions:r}),gt(kI,{clusterExists:l}),gt(HI,{values:p,isDisabled:s,isSNO:le({highAvailabilityMode:d})}))};function UU(e,t){return t.find(r=>r.version===e)?.supportLevel==="beta"?"- Developer preview release":""}var JU=e=>{let{cluster:t,infraEnv:o,pullSecret:r,managedDomains:s,ocpVersions:i,usedClusterNames:n=[],moveNext:a,handleClusterUpdate:l,handleClusterCreate:p,navigation:u}=e,{search:c}=jU(),{isViewerMode:d}=YU(R),m=be(),g=uo.useCallback(async y=>{let v=Gn.getClusterCreateParams(y);t?await l(t.id,v):await p(v)},[t,p,l]),h=(y,v,w)=>d||!y&&!KU(w)&&os({cluster:w})?a:v,C=uo.useMemo(()=>Gn.getClusterDetailsInitialValues({infraEnv:o,cluster:t,pullSecret:r,managedDomains:s,ocpVersions:i,urlSearchParams:c}),[o,t,r,s,i,c]),{t:I}=f(),S=BC({usedClusterNames:n,featureSupportLevels:m,pullSecretSet:t?.pullSecretSet,ocpVersions:i,isOcm:!0,t:I});return uo.createElement(XU,{initialValues:C,validate:ni(S),onSubmit:g},({submitForm:y,isSubmitting:v,isValid:w,dirty:E,setFieldValue:F,errors:q,touched:Z})=>{let ae=ro(q,Z),je=uo.createElement(uo.Fragment,null,uo.createElement(RU,{hasGutter:!0},uo.createElement(UI,null,uo.createElement(Ke,null,"Cluster details")),uo.createElement(UI,{span:12,lg:10,xl:9,xl2:7},uo.createElement(BI,{toggleRedHatDnsService:vt=>F("baseDnsDomain",vt?s.map(b=>b.domain)[0]:""),versions:i,forceOpenshiftVersion:t?.openshiftVersion,isPullSecretSet:!!t?.pullSecretSet,defaultPullSecret:r,isOcm:!!oe,managedDomains:s,clusterExists:!!t})))),tt=uo.createElement(_t,{cluster:t,errorFields:ae,isSubmitting:v,isNextDisabled:!(!v&&w&&(E||t&&os({cluster:t}))),onNext:h(E,y,t)});return uo.createElement(ye,{navigation:u,footer:tt},je)})},Am=JU;var tG=({cluster:e,infraEnv:t})=>{let o=ke(),r=fp(),{addAlert:s,clearAlerts:i}=N(),n=QU(),a=eG(),{usedClusterNames:l}=gp(e?.id||""),p=Oi(),{error:u,loading:c,versions:d}=lo();ds.useEffect(()=>{u&&s(u)},[u,s]);let m=ds.useCallback(async(C,I)=>{i();let S=ZU(I,["highAvailabilityMode","pullSecret","openshiftVersion"]);try{let{data:y}=await re.update(C,e?.tags,S);a($e(y)),os({cluster:y})&&o.moveNext()}catch(y){x(y,()=>s({title:"Failed to update the cluster",message:D(y)}))}},[i,e?.tags,a,o,s]),g=ds.useCallback(async C=>{i();try{let I=await re.create(C);n.push(`${ue}/clusters/${I.id}`,Xd)}catch(I){x(I,()=>s({title:"Failed to create new cluster",message:D(I)}))}},[s,i,n]);return p===void 0||!r||c||!l?ds.createElement(ye,{navigation:ds.createElement(xt,{cluster:e})},ds.createElement(z,null)):ds.createElement(Am,{cluster:e,pullSecret:p,managedDomains:r,ocpVersions:d,usedClusterNames:l,moveNext:()=>o.moveNext(),handleClusterUpdate:m,handleClusterCreate:g,navigation:ds.createElement(xt,{cluster:e}),infraEnv:t})},Op=tG;import js from"react";import{useDispatch as WG,useSelector as zG}from"react-redux";import{Formik as BG,useFormikContext as UG}from"formik";import he from"react";import{useSelector as AG}from"react-redux";import{Text as tb,TextContent as Fm,Button as FG,Stack as VG,StackItem as Ys,Split as NG,SplitItem as HG}from"@patternfly/react-core";import{useFormikContext as OG}from"formik";import Zt from"react";import{Stack as oG,StackItem as GI}from"@patternfly/react-core";import{useSelector as rG}from"react-redux";var sG=({obj:e})=>Zt.createElement(Ws,{key:e.id,host:e,AdditionalNTPSourcesDialogToggleComponent:Po}),iG=({cluster:e})=>{let{onEditHost:t,actionChecks:o,onEditRole:r,actionResolver:s,onSelect:i,selectedHostIDs:n,setSelectedHostIDs:a,onMassChangeHostname:l,onMassDeleteHost:p,...u}=rs(e),{isViewerMode:c}=rG(R),d=le(e),{t:m}=f(),g=Zt.useMemo(()=>[Jo(m,t,void 0,o.canEditHostname),Zr(m,o.canEditRole,r,io(e)),Vi({onEditHostname:t}),Zl,Ql,ep,Fi,Qr(e)],[m,t,o.canEditHostname,o.canEditRole,r,e]),h=e.hosts||[],C=Zo(h.length),I=h.map(y=>y.id),S=!(c||d);return Zt.createElement(Zt.Fragment,null,Zt.createElement(oG,{hasGutter:!0},S&&Zt.createElement(GI,null,Zt.createElement(Gc,{selectedIDs:n||[],itemIDs:I,setSelectedIDs:a,actions:[Zt.createElement($c,{key:"hostname",onChangeHostname:l}),Zt.createElement(qc,{key:"delete",onDeleteHost:p})],...C})),Zt.createElement(GI,null,Zt.createElement(ts,{testId:"hosts-discovery-table",hosts:h,content:g,actionResolver:s,ExpandComponent:sG,onSelect:S?i:void 0,selectedIDs:n,setSelectedIDs:a,...C},Zt.createElement(cp,{isSingleNode:d})))),Zt.createElement(ss,{cluster:e,...u}))},$I=iG;import Er from"react";import{Button as dG,ButtonVariant as mG,Modal as fG,ModalVariant as gG}from"@patternfly/react-core";import{pluralize as qI}from"humanize-plus";import na from"react";import{useDispatch as nG}from"react-redux";import aG from"axios";var lG=({cluster:e,onCancel:t,onSuccess:o,cpuArchitecture:r})=>{let{infraEnv:s,error:i}=Pr(e.id,r),n=na.useRef(),a=nG();na.useEffect(()=>(n.current=aG.CancelToken.source(),()=>n.current?.cancel("Image generation cancelled by user.")),[]);let l=()=>{a(Jr()),t()},p=async(u,c)=>{if(e.id&&s?.id)try{let{updatedCluster:d}=await $l.update(e.id,e.tags,s.id,u);await o(),a($e(d))}catch(d){x(d,()=>{c.setStatus({error:{title:"Failed to download the discovery Image",message:D(d)}})})}};return i?na.createElement(_,null):s?na.createElement(py,{onCancel:l,handleSubmit:p,sshPublicKey:s.sshAuthorizedKey,httpProxy:s.proxy?.httpProxy,httpsProxy:s.proxy?.httpsProxy,noProxy:s.proxy?.noProxy,imageType:s.type}):na.createElement(z,null)},Lp=lG;import pG from"react";var uG=({clusterName:e,isSNO:t,isoDownloadUrl:o,cpuArchitecture:r,...s})=>{let i=r===L.USE_DAY1_ARCHITECTURE?e:`${e}_${r}`;return pG.createElement(Vl,{fileName:`discovery_image_${i}.iso`,downloadUrl:o,isSNO:t,...s})},Mp=uG;import cG from"react";function aa(){return{getIsoImageUrl:cG.useCallback(async(t,o)=>{try{let r=await it.getInfraEnvId(t,o);if(!r)return{url:"",error:`Failed to retrieve the infraEnv for ${t}`};let{data:{url:s}}=await Ae.getImageUrl(r);return{url:s,error:s?"":"Failed to retrieve the image URL, the API returned an invalid URL"}}catch(r){return{url:"",error:Ge(r)}}},[])}}var YI=({ButtonComponent:e=dG,cluster:t,idPrefix:o})=>{let{discoveryImageDialog:r}=se(),{open:s}=r,i=le(t);return Er.createElement(e,{variant:mG.secondary,onClick:()=>s({cluster:t}),id:`${o}-button-download-discovery-iso`},"Add ",qI(+i,"host"))},Gi=()=>{let[e,t]=Er.useState(""),[o,r]=Er.useState(""),{discoveryImageDialog:s}=se(),{data:i,isOpen:n,close:a}=s,l=i?.cluster,{getIsoImageUrl:p}=aa(),u=Er.useCallback(async()=>{let{url:m,error:g}=await p(l.id,L.USE_DAY1_ARCHITECTURE);t(m),r(g)},[p,l?.id]),c=Er.useCallback(()=>{t("")},[]);if(!l)return null;let d=le(l);return Er.createElement(fG,{"aria-label":"Add hosts dialog",title:`Add ${qI(+d,"host")}`,isOpen:n,onClose:a,variant:gG.small,hasNoBodyWrapper:!0,id:"generate-discovery-iso-modal"},o&&Er.createElement(_,null),e?Er.createElement(Mp,{clusterName:l.name||"",isSNO:d,onClose:a,onReset:c,isoDownloadUrl:e,cpuArchitecture:L.USE_DAY1_ARCHITECTURE}):Er.createElement(Lp,{cluster:l,onCancel:a,onSuccess:u,cpuArchitecture:L.USE_DAY1_ARCHITECTURE}))};import tr from"react";import{Text as JI}from"@patternfly/react-core";import Qt from"react";import{List as hG,ListItem as _p,Text as jI,TextContent as RI}from"@patternfly/react-core";var CG="https://access.redhat.com/solutions/4885641",KI=e=>Io(e*1024*1024,2,"iec"),yG=({clusterId:e,isSingleNode:t,isAddingHosts:o})=>{let{preflightRequirements:r,error:s,isLoading:i}=Bs(e);if(i)return Qt.createElement(z,{content:"Loading hardware requirements ..."});if(s)return Qt.createElement(_,null);let n=r?.ocp?.master?.quantitative,a=n?.cpuCores||4,l=KI(n?.ramMib||16*1024),p=n?.diskSizeGb||100,u=`${a} CPU cores, ${l} RAM, and ${p} GB disk size.`,c=r?.ocp?.worker?.quantitative,d=c?.cpuCores||2,m=KI(c?.ramMib||16*1024),g=c?.diskSizeGb||100,h=`${d} CPU cores, ${m} RAM, and ${g} GB disk size.`;if(o)return Qt.createElement(RI,null,Qt.createElement(jI,{component:"p"},`Worker hosts must have at least ${h}`));let C;return t?C=Qt.createElement(RI,null,Qt.createElement(jI,{component:"p"},`One host is required with at least ${u}`)):C=Qt.createElement(hG,null,Qt.createElement(_p,null,`Control plane nodes: At least ${u}`),Qt.createElement(_p,null,`Workers: At least ${h}`),Qt.createElement(_p,null,"Also note that each host's disk write speed should meet the minimum requirements to run OpenShift.",Qt.createElement("br",null),Qt.createElement(ot,{href:CG},"Learn more")),Qt.createElement(_p,null,"Operators might require additional resources.")),C},XI=yG;var vG=({cluster:e})=>{let t=tr.useMemo(()=>Cv(e.hosts||[]),[e.hosts]),o=le(e);return tr.createElement(tr.Fragment,null,tr.createElement(JI,{component:"h3"},"Information and warnings"),tr.createElement(JI,{component:"p"},tr.createElement(pp,{linkText:"Minimum hardware requirements",modalTitle:"Minimum hardware requirements"},tr.createElement(XI,{clusterId:e.id,isSingleNode:o,isAddingHosts:ql(e)})),tr.createElement("span",{className:"pf-u-mr-md"},"\xA0"),tr.createElement(up,{isSingleNode:o})),t&&tr.createElement(Uc,null))},Wp=vG;import qs from"react";import Ar from"react";import{List as SG,ListItem as ZI,Title as IG}from"@patternfly/react-core";var bG=()=>Ar.createElement(Ar.Fragment,null,Ar.createElement(IG,{headingLevel:"h6"},"Requirements"),Ar.createElement(SG,null,Ar.createElement(ZI,null,"A network connection between vSphere and the installed OCP."),Ar.createElement(ZI,null,"Ensure clusterSet ",Ar.createElement("code",null,"disk.enableUUID")," is set to ",Ar.createElement("code",null,"true")," inside of vSphere")),Ar.createElement("a",{href:Is,target:"_blank",rel:"noopener noreferrer"},"Learn more about vSphere platform integration")),QI=bG;var xG="Enable platform integration to access features directly in OpenShift, like vSphere node auto-scaling and persistent storage or Nutanix node auto-scaling.",kG="Enable vSphere platform integration to access features directly inside OpenShift, like node auto-scaling and persistent storage. You'll need to set vSphere configuration after cluster installation is complete.",TG="Enable Nutanix platform integration to access features like node auto-scaling directly inside OpenShift.",PG="Platform integration is only applicable on non-SNO deployments and when all discovered hosts originated from the same platform.",wG={"no-active-integrations":xG,vsphere:kG,nutanix:TG},DG=({supportedPlatformIntegration:e})=>qs.createElement(qs.Fragment,null,qs.createElement("span",null,"Integrate with platform (vSphere/Nutanix)")," ",qs.createElement(W,{bodyContent:wG[e],footerContent:e==="vsphere"&&qs.createElement(QI,null),buttonOuiaId:"platform-integration-vSphere-popover"})),EG=({clusterId:e})=>{let{isPlatformIntegrationSupported:t,supportedPlatformIntegration:o}=ns(e);return qs.createElement(Fp,{tooltipProps:{hidden:t,content:PG},isDisabled:!t,name:"usePlatformIntegration",label:qs.createElement(DG,{supportedPlatformIntegration:o}),switchOuiaId:"platform-integration-vSphere-switch"})},eb=EG;var LG=()=>he.createElement(he.Fragment,null,he.createElement("span",null,"Run workloads on control plane nodes")," ",he.createElement(W,{bodyContent:he.createElement("p",null,"Enables your control plane nodes to be used for running applications.")})),MG='This toggle will be "On" and not editable when less than 5 hosts were discovered',_G=({cluster:e})=>{let t=_r("ASSISTED_INSTALLER_PLATFORM_INTEGRATION_FEATURE"),o=cn(e),{setFieldValue:r}=OG(),{isViewerMode:s}=AG(R);return he.useEffect(()=>{r("schedulableMasters",io(e))},[e,o,r]),he.createElement(VG,{hasGutter:!0},he.createElement(Ys,null,he.createElement(Ke,null,"Host discovery")),he.createElement(Ys,null,!s&&he.createElement(Fm,null,he.createElement(tb,{component:"p"},he.createElement(YI,{ButtonComponent:FG,cluster:e,idPrefix:"host-inventory"})))),t&&he.createElement(Ys,null,he.createElement(NG,{hasGutter:!0},he.createElement(HG,null,he.createElement(eb,{clusterId:e.id})))),he.createElement(Ys,null,he.createElement(Fp,{tooltipProps:{hidden:!o,content:MG},isDisabled:o,name:"schedulableMasters",label:he.createElement(LG,null)})),he.createElement(Ys,null,he.createElement(Fm,null,he.createElement(Wp,{cluster:e}))),he.createElement(Ys,null,he.createElement(Fm,null,he.createElement(tb,{component:"h3"},"Host Inventory"))),he.createElement(Ys,null,he.createElement($I,{cluster:e})))},ob=_G;var GG=({cluster:e})=>{let{alerts:t}=N(),{errors:o,touched:r,isSubmitting:s,isValid:i}=UG(),n=ke(),a=ho(),l=ro(o,r),p=!i||!!t.length||a||s||!np({cluster:e});return js.createElement(ye,{navigation:js.createElement(xt,{cluster:e}),footer:js.createElement(_t,{cluster:e,errorFields:l,isSubmitting:s,isNextDisabled:p,onNext:()=>n.moveNext(),onBack:()=>n.moveBack()})},js.createElement(ob,{cluster:e}))},$G=({cluster:e})=>{let t=WG(),{addAlert:o,clearAlerts:r}=N(),{isViewerMode:s}=zG(R),i=js.useMemo(()=>Yg(e),[]),{supportedPlatformIntegration:n}=ns(e.id);return js.createElement(BG,{initialValues:i,onSubmit:s?()=>Promise.resolve():async p=>{r();let u=p.usePlatformIntegration?n==="no-active-integrations"?void 0:n:void 0,c={};$n.setPlatform(c,u,e.userManagedNetworking),$n.setSchedulableMasters(c,p,e);try{let{data:d}=await re.update(e.id,e.tags,c);t($e(d))}catch(d){x(d,()=>o({title:"Failed to update the cluster",message:D(d)}))}}},js.createElement(GG,{cluster:e}))},rb=$G;import No from"react";import{StackItem as fb}from"@patternfly/react-core";import{Formik as h1,useFormikContext as C1}from"formik";import Vo from"react";import{Stack as m1,StackItem as db}from"@patternfly/react-core";import{Fragment as ZG,createElement as Rs}from"react";import{sortable as sb}from"@patternfly/react-table";import{Popover as qG,Text as YG,TextContent as jG,TextVariants as RG}from"@patternfly/react-core";import{ExclamationTriangleIcon as KG}from"@patternfly/react-icons";import{global_warning_color_100 as XG}from"@patternfly/react-tokens/dist/js/global_warning_color_100";var JG=()=>Rs(jG,null,Rs(YG,{component:RG.p},"Some bootable disks will skip formatting"));var ib={header:{title:"Number of disks",props:{id:"col-header-num-disks"},transforms:[sb]},cell:e=>{let o=He(e).disks||[];return{title:Rs(ZG,null," ",o.length," ",e.skipFormattingDisks&&Rs(qG,{bodyContent:Rs(JG,null),minWidth:"20rem",maxWidth:"30rem"},Rs(KG,{color:XG.value,size:"sm"}))),props:{"data-testid":"disk-number"},sortableValue:o.length}}},nb=e=>({header:{title:"ODF Usage",props:{id:"col-header-odf"},transforms:[sb]},cell:t=>{let o=t.role==="master"||t.suggestedRole==="master",r=e&&o;return{title:r?Rs("div",{style:{color:"var(--pf-global--disabled-color--100)"}},"Excluded for ODF"):"Use ODF",props:{"data-testid":"use-odf"},sortableValue:Number(r)}}});import{createElement as t1}from"react";var QG=e=>e.id,e1=({hosts:e,...t})=>t1(op,{getDataId:QG,data:e,...t},""),ab=e1;import{createElement as la}from"react";import{Stack as c1,StackItem as ub}from"@patternfly/react-core";import Ks from"react";import{Button as o1,ButtonVariant as r1,Popover as s1,Text as lb,TextContent as i1,TextVariants as n1}from"@patternfly/react-core";import{ExclamationTriangleIcon as a1}from"@patternfly/react-icons";import{global_warning_color_100 as l1}from"@patternfly/react-tokens/dist/js/global_warning_color_100";var p1=()=>Ks.createElement(i1,null,Ks.createElement(lb,{component:n1.p},"All non-installation disks will be used for local storage. To view available disks, expand each host row in the table")),u1=()=>Ks.createElement(lb,{component:"p"},Ks.createElement(s1,{bodyContent:Ks.createElement(p1,null),minWidth:"30rem"},Ks.createElement(o1,{variant:r1.link,isInline:!0},Ks.createElement(a1,{className:"status-icon",color:l1.value,size:"sm"}),"\xA0Format all non-installation disks"))),pb=u1;var d1=({cluster:e})=>{let t=Ga(e.monitoredOperators,_o)&&!ql(e),o=_y(e);return la(c1,{hasGutter:!0},t&&la(ub,null,la(pb,null)),la(ub,null,la(bd,{someDisksAreSkipFormatting:o})))},cb=d1;function f1({obj:e}){let{onDiskRole:t,canEditDisks:o,updateDiskSkipFormatting:r}=mp();return Vo.createElement(ip,{key:e.id,host:e,onDiskRole:t,canEditDisks:o,updateDiskSkipFormatting:r})}var g1=({cluster:e})=>{let{t}=f(),{onEditHost:o,actionChecks:r,onDiskRole:s,actionResolver:i,updateDiskSkipFormatting:n,...a}=rs(e),l=Vo.useMemo(()=>{let c=[Jo(t,o,void 0,r.canEditHostname),Zr(t,void 0,void 0,io(e)),Vi({}),Fi,ib];if(Ga(e.monitoredOperators,_o)){let d=!Tg(e);c.push(nb(d))}return c.push(Qr(e)),c},[r.canEditHostname,e,o,t]),p=e.hosts||[],u=Zo(p.length);return Vo.createElement(Vo.Fragment,null,Vo.createElement(m1,{hasGutter:!0},Vo.createElement(db,null,Vo.createElement(dp,{canEditDisks:r.canEditDisks,onDiskRole:s,updateDiskSkipFormatting:n},Vo.createElement(ab,{testId:"storage-table",hosts:p,content:l,actionResolver:i,ExpandComponent:f1,...u}))),Vo.createElement(db,null,Vo.createElement(cb,{cluster:e}))),Vo.createElement(ss,{cluster:e,...a}))},mb=g1;var y1=({cluster:e})=>{let{alerts:t}=N(),o=ke(),{isSubmitting:r,touched:s,errors:i}=C1(),n=ho(),a=ro(i,s),l=!ap({cluster:e})||n||!!t.length||r;return No.createElement(ye,{navigation:No.createElement(xt,{cluster:e}),footer:No.createElement(_t,{cluster:e,errorFields:a,isSubmitting:r,isNextDisabled:l,onNext:()=>o.moveNext(),onBack:()=>o.moveBack()})},No.createElement(fb,null,No.createElement(Ke,null,"Storage")),No.createElement(fb,null,No.createElement(mb,{cluster:e})),No.createElement(wu,null))},v1=({cluster:e})=>{let{clearAlerts:t}=N(),o=No.useMemo(()=>jg(),[]);return No.createElement(h1,{onSubmit:()=>{t()},initialValues:o},No.createElement(y1,{cluster:e}))},gb=v1;import Ri from"react";import{useSelector as C2}from"react-redux";import to from"react";import{Text as ax,TextContent as d2,TextVariants as lx,Alert as m2,AlertVariant as f2,Grid as g2}from"@patternfly/react-core";import eo from"react";import{Alert as S1,AlertVariant as I1,ButtonVariant as b1,Form as x1,FormGroup as k1}from"@patternfly/react-core";var T1=({initialView:e,confirmOnChangeView:t,onChangeView:o})=>{let r="select-static-ip-view",[s,i]=eo.useState(),[n,a]=eo.useState(e),l=(m,g)=>{let h=g.currentTarget.value;t?i(h):(a(h),o(h))},p=m=>{a(m),i(void 0),o(m)},u=()=>{i(void 0)},c=()=>n===xe.YAML?"YAML":"form",d=n===xe.FORM;return eo.createElement(eo.Fragment,null,eo.createElement(x1,{isHorizontal:!0},eo.createElement(k1,{fieldId:T(r,"radio"),isInline:!0,label:"Configure via :",className:"static-config-type-label"},eo.createElement(Im,{label:"Form view",name:r,"data-testid":"select-form-view",id:"select-form-view",value:xe.FORM,isChecked:d,onChange:l}),eo.createElement(Im,{label:"YAML view",name:r,"data-testid":"select-yaml-view",id:"select-yaml-view",value:xe.YAML,isChecked:!d,onChange:l}))),d&&eo.createElement(S1,{variant:I1.info,isInline:!0,title:"Form view supports basic configurations. Select YAML view for advanced configurations."}),s&&eo.createElement(Fs,{title:"Change configuration option?",titleIconVariant:"warning",confirmationButtonText:"Change",confirmationButtonVariant:b1.primary,content:eo.createElement(eo.Fragment,null,eo.createElement("p",null,`All data and configuration done in ${c()} view will be lost.`)),onClose:u,onConfirm:()=>p(s)}))},zp=T1;import P1 from"lodash/findLastIndex";import{Address4 as hb,Address6 as Cb}from"ip-address";var Vm=e=>!0,Nm=e=>e==="dualStack",yb=(e,t)=>t===B.ipv4?Vm(e):Nm(e),co=e=>e==="dualStack"?[B.ipv4,B.ipv6]:[B.ipv4],pa=e=>e===B.ipv4?"IPv4":"IPv6",Bp=(e,t)=>t===B.ipv4&&hb.isValid(e)?new hb(e):t===B.ipv6&&Cb.isValid(e)?new Cb(e):null;var Up=()=>({ipv4:"",ipv6:""}),ua=()=>({macAddress:"",ips:Up()}),Gp=()=>({machineNetwork:{ip:"",prefixLength:""},gateway:""}),Hm=()=>({networkYaml:"",macInterfaceMap:[{macAddress:"",logicalNicName:""}]}),ca=()=>({ipConfigs:{ipv4:Gp(),ipv6:Gp()},protocolType:"ipv4",useVlan:!1,vlanId:"",dns:""}),vb=()=>({hosts:[ua()]}),Sb=()=>({hosts:[Hm()]});var w1=e=>e.find(t=>!Vy(t.name)),Ib=e=>{let t=e.split(`
|
|
30
|
-
`),o=P1(t,s=>s.startsWith(wi));return{comments:t.slice(0,o+1).map(s=>s.slice(1)),nmstate:Py(e)}},D1=e=>{for(let t of e)if(ky(t))return t.vlan.id;return null},E1=(e,t)=>{let o=e[t];if(o===void 0)return"";if(!o.address||!o.address.length)throw`Nmstate yaml doesn't contain an address for protocol version ${t}`;return o.address[0].ip},A1=e=>{let t=e["dns-resolver"]?.config.server;if(!t||!t.length)throw"Nmstate YAML doesn't contain dns-resolver section";return t.join(",")},F1=(e,t)=>{let o=e.routes?.config;if(!o)throw"Nmstate yaml doesn't contain routes section";return o[Ty(t)]["next-hop-address"]},V1=(e,t,o)=>{let r=D1(e.interfaces),s=ca();s.dns=A1(e),s.protocolType=t,r&&(s.useVlan=!0,s.vlanId=r);for(let i of co(t)){s.ipConfigs[i].gateway=F1(e,i);let[n,a]=o[i].split("/");s.ipConfigs[i].machineNetwork={ip:n,prefixLength:parseInt(a)}}return s},N1=(e,t)=>{if(!e.macInterfaceMap||!e.networkYaml)throw"Static network config is missing information";let o=e.macInterfaceMap[0].macAddress;if(!o)throw"Static network config is missing mac address";let{nmstate:r}=Ib(e.networkYaml),s=w1(r.interfaces);if(!s)return null;let i={macAddress:o,ips:{ipv4:"",ipv6:""}};for(let n of co(t))i.ips[n]=E1(s,n);return i},da=e=>{if(!e.length)throw"Static network config is empty";let t=e[0];if(!t.macInterfaceMap||!t.networkYaml)throw"Static network config first host is missing fields";let{comments:o,nmstate:r}=Ib(t.networkYaml),s=_l(o);if(!s)return{networkWide:ca(),hosts:[]};let i=Ed(o),n=V1(r,s,i),a=[];for(let l of e){let p=N1(l,s);p&&a.push(p)}return{networkWide:n,hosts:a}};var $i=e=>{if(!e.staticNetworkConfig||!e.staticNetworkConfig.length)return;let t=O(e.staticNetworkConfig);if(!t)throw"Failed to parse static network config";if(!!t.length)return t},H1=e=>e.includes(Di)?xe.FORM:xe.YAML,O1=e=>{let t=e[0].networkYaml;if(!t)throw"Static Network Config doesn't contain a network yaml";let o=wy(t);return{view:H1(o),isDataComplete:!Ny(t),formViewProtocolType:_l(o)}},Xs=e=>{let t=$i(e);if(!(!t||!t[0]))return O1(t)},$p=e=>{let t=$i(e);if(!t)throw"Infra env doesn't contain static ip data";let o=da(t);if(!o)throw`Failed to get static ip form data from infra env ${e.id}`;return o},bb=e=>{let t=$p(e);return t.hosts.length?{hosts:t.hosts}:{hosts:[ua()]}},qp=e=>$p(e).networkWide,xb=e=>{let t=$i(e);if(!t)throw"Infra env doesn't contain static ip data";return{hosts:t}};import Ub from"react";import ms from"react";import{useSelector as L1}from"react-redux";import{Form as M1}from"@patternfly/react-core";import{Formik as _1,useFormikContext as W1,yupToFormErrors as z1}from"formik";import B1 from"lodash/isEqual";var U1=({onFormStateChange:e,getEmptyValues:t})=>{let o=ms.useMemo(()=>t(),[]),{isSubmitting:r,isValid:s,touched:i,errors:n,values:a}=W1(),l=ms.useMemo(()=>B1(a,o),[a,o]),p=ho();return ms.useEffect(()=>{e({isSubmitting:r,isAutoSaveRunning:p,isValid:s,touched:i,errors:n,isEmpty:l})},[r,s,p,i,n]),null},qi=({infraEnv:e,updateInfraEnv:t,getInitialValues:o,getUpdateParams:r,validationSchema:s,onFormStateChange:i,getEmptyValues:n,children:a,showEmptyValues:l})=>{let{clearAlerts:p,addAlert:u}=N(),{captureException:c}=Sp(),{isViewerMode:d}=L1(R),[m,g]=ms.useState();return ms.useEffect(()=>{g(l?n():o(e))},[]),m?ms.createElement(_1,{initialValues:m,onSubmit:d?()=>Promise.resolve():async S=>{p();try{let y=r(e,S);await t({staticNetworkConfig:y})}catch(y){c(y),u({title:D(y)})}},validate:S=>{try{return s.validateSync(S,{abortEarly:!1,context:{values:S}}),{}}catch(y){return z1(y)}},validateOnMount:!0,enableReinitialize:!0},ms.createElement(M1,null,a,ms.createElement(U1,{onFormStateChange:i,getEmptyValues:n}))):null};import{array as Nb,object as _m,string as Vb}from"yup";import{Address4 as G1,Address6 as Yp}from"ip-address";import{isInSubnet as $1}from"is-in-subnet";import{string as Yi}from"yup";var kb={ipv4:"127.0.0.0",ipv6:"::1"},Tb={ipv4:"0.0.0.0",ipv6:"0000::"},Js=e=>Yi().test("unique","Value must be unique",function(t){if(!this.options.context||!("values"in this.options.context))return this.createError({message:"Unexpected error: Yup test context should contain form values"});let o=e(this.options.context.values,this,t);return o?o.filter(r=>r===t).length===1:this.createError({message:"Unexpected error: Failed to get values to test uniqueness"})}),Om=(e,t)=>{try{return!(e===B.ipv4?new G1(t):new Yp(t)).parsedSubnet}catch{return!1}},Pb=(e,t)=>{try{if(t===B.ipv4)return e===kb.ipv4||e===Tb.ipv4;{let o=new Yp(e);return Db(new Yp(kb.ipv6),o)||Db(new Yp(Tb.ipv6),o)}}catch{return!1}},Lm=e=>{let t=e===B.ipv4?"IPv4":"IPv6";return Yi().test(e,`Value \${value} is not a valid ${t} address`,function(o){return o?Om(e,o):!0})},wb=e=>{let t=e===B.ipv4?"IPv4":"IPv6";return Yi().test(e,({value:o})=>{let r=o.split(","),s=r.filter(a=>!Om(e,a)),i=s.join(", ");return s.length===1?`Value ${i} is not a valid ${t} address`:s.length>1?`The values ${i} are not valid ${t} addresses`:`The following IP addresses are duplicated: ${ku(r).join(",")}`},function(o){if(!o)return!0;let r=o.split(",");return ku(r).length!==0?!1:r.every(i=>Om(e,i))})},Db=(e,t)=>JSON.stringify(e.toByteArray())===JSON.stringify(t.toByteArray()),Eb=e=>Yi().test("is-not-reserved-address",({value:t})=>{let o=t.split(",");return o.length===1?"Provided IP address is not a correct address for an interface.":`Provided IP addresses ${o.filter(s=>Pb(s,e)).join(", ")} are not correct addresses for an interface.`},function(t){return t?t.split(",").every(r=>!Pb(r,e)):!0}),Ab=(e,t)=>Yi().test("is-in-subnet",`IP Address is outside of the machine network ${t}`,function(o){if(!o)return!0;let r=Lm(e);try{r.validateSync(o)}catch(s){let i=s;return this.createError({message:i.message})}try{return $1(o,t)}catch{return!0}}),ma=(e,t)=>Yi().test("is-not-network-or-broadcast","The IP address must not match the network or broadcast address",o=>{let r=Bp(t,e);if(r){let s=r?.startAddress().correctForm(),i=r?.endAddress().correctForm();return!(o===s||o===i)}else return!1});var Mm="A value is required",q1=Vb().required(Mm),Y1=e=>{let t=[];for(let o of e.hosts)if(!!o.macInterfaceMap)for(let r of o.macInterfaceMap)r.macAddress&&t.push(r.macAddress);return t},j1=(e,t)=>{let o=t.parent,r=e.hosts.find(s=>s.macInterfaceMap&&s.macInterfaceMap.indexOf(o)>-1);if(!(!r||!r.macInterfaceMap))return r.macInterfaceMap.map(s=>s.logicalNicName?s.logicalNicName:"")},R1=Nb().of(_m().shape({macAddress:tl.required(Mm).concat(Js(Y1)),logicalNicName:Vb().required(Mm).concat(Js(j1)).max(15,"Interface name must be 15 characters at most.").matches(/^\S+$/,"Interface name can not contain spaces.")})),Fb=_m().shape({hosts:Nb().of(_m().shape({networkYaml:q1,macInterfaceMap:R1}))});import yt from"react";import{TextVariants as b$,TextContent as x$,Text as k$,FormGroup as Wb,Grid as T$}from"@patternfly/react-core";import{ExternalLinkAltIcon as P$}from"@patternfly/react-icons";import{Language as w$}from"@patternfly/react-code-editor";import{useField as zb}from"formik";import J from"react";import{useSelector as Hb}from"react-redux";import{Button as Ob,ButtonVariant as K1,Checkbox as X1,Divider as J1,ExpandableSection as Z1,ExpandableSectionToggle as Q1,Flex as Lb,FlexItem as jp,Grid as e$}from"@patternfly/react-core";import{MinusCircleIcon as t$}from"@patternfly/react-icons";import{FieldArray as o$,useField as r$}from"formik";import Wm from"lodash/cloneDeep";var zm="hosts",s$=({onRemove:e,showRemoveButton:t,dataTestId:o})=>J.createElement(Ob,{"aria-label":"remove host",style:{visibility:t?"visible":"hidden"},variant:"plain"},J.createElement(t$,{onClick:e,"data-testid":o})),Bm=e=>`Host ${e+1}`,i$=({fieldName:e,hostIdx:t,onRemove:o,onToggleExpand:r,isExpanded:s,isDisabled:i,CollapsedHostComponent:n,ExpandedHostComponent:a,enableRemoveHost:l})=>{let[p,u]=J.useState(!1),c=m=>{i||u(l?m:!1)},d=tn(e,t);return J.createElement(e$,{onMouseEnter:()=>c(!0),onMouseLeave:()=>c(!1),hasGutter:!0},J.createElement(Lb,null,J.createElement(jp,null,J.createElement(Q1,{isExpanded:s,onToggle:r,direction:"down","data-testid":`toggle-host-${t}`},Bm(t))),!i&&t>0&&J.createElement(jp,{align:{default:"alignRight"}},J.createElement(s$,{onRemove:o,showRemoveButton:p,dataTestId:`remove-host-${t}`}))),s?J.createElement(Z1,{isDetached:!0,key:t,isExpanded:!0},J.createElement(a,{fieldName:d,hostIdx:t,isDisabled:i})):J.createElement(n,{fieldName:d,hostIdx:t,isDisabled:i}))},Mb=e=>{let t={};for(let o=0;o<e;++o)t[o]=!1;return t},n$=e=>{let t=Mb(e);return e===1&&(t[0]=!0),t},a$=({push:e,remove:t,enableCopyAboveConfiguration:o,emptyHostData:r,...s})=>{let[i,{error:n}]=r$({name:zm}),{isViewerMode:a}=Hb(R),l=!Hb(Ms)&&!a,[p,u]=J.useState(n$(i.value.length)),[c,d]=J.useState(!1),[m,g]=J.useState(null);if(i.value===void 0)return J.createElement(z,null);let h=()=>{let C;c?C=Wm(i.value[i.value.length-1]):C=Wm(r);let I=Mb(i.value.length+1);I[i.value.length]=!0,u(I),e(C)};return J.createElement(J.Fragment,null,i.value.map((C,I)=>{let S=y=>{let v=Wm(p);v[I]=y,u(v)};return J.createElement(J.Fragment,{key:I},J.createElement(i$,{hostIdx:I,onToggleExpand:S,isExpanded:p[I],isDisabled:a,onRemove:()=>g(I),fieldName:zm,emptyHostData:r,enableRemoveHost:i.value.length>1,...s}),J.createElement(J1,null))}),l&&J.createElement(Lb,null,J.createElement(jp,null,J.createElement(Ob,{variant:"secondary",onClick:h,"data-testid":"add-host",isDisabled:!!n},"Add another host configuration")),o&&J.createElement(jp,{alignSelf:{default:"alignSelfCenter"}},J.createElement(X1,{label:"Copy the above configuration",isChecked:c,onChange:d,"aria-label":"copy host configuration",name:"copy-host-configuration",id:"copy-host-configuration","data-testid":"copy-host-configuration"}))),m&&J.createElement(Fs,{title:`Delete ${Bm(m)}?`,titleIconVariant:"warning",confirmationButtonText:"Delete",confirmationButtonVariant:K1.danger,content:J.createElement(J.Fragment,null,J.createElement("p",null,`All the network configurations of ${Bm(m)} will be lost`)),onClose:()=>g(null),onConfirm:()=>{t(m),g(null)}}))},l$=({...e})=>{let t=J.useCallback(o=>J.createElement(a$,{...Object.assign(e,o)}),[]);return J.createElement(o$,{name:zm,render:t})},Rp=l$;import{Flex as p$,FlexItem as Um,Label as Gm,StackItem as u$,TextContent as c$,TextVariants as d$,Text as m$}from"@patternfly/react-core";import{InfoCircleIcon as f$}from"@patternfly/react-icons";import Tt from"react";var g$=({title:e,macAddress:t,mappingValue:o,numInterfaces:r,hasError:s,hostIdx:i})=>Tt.createElement(Tt.Fragment,null,Tt.createElement(u$,{"data-testid":`collapsed-host-${i}`},Tt.createElement(p$,null,Tt.createElement(Um,null,Tt.createElement(c$,null,Tt.createElement(m$,{component:d$.small},e))),s&&Tt.createElement(Gm,{variant:"outline",color:"red",icon:Tt.createElement(f$,null),"data-testid":"host-errors-label"},"Missing Information"),!s&&Tt.createElement(Tt.Fragment,null,Tt.createElement(Um,null,Tt.createElement(Gm,{variant:"outline","data-testid":"first-mapping-label"},`${t} -> ${o}`)," "),r>1&&Tt.createElement(Um,null,Tt.createElement(Gm,{variant:"outline","data-testid":"remaining-mapping-label"},`${r-1} left`)))))),Kp=g$;import Bt from"react";import{GridItem as $m,Grid as qm,Button as h$}from"@patternfly/react-core";import{FieldArray as C$}from"formik";import{PlusCircleIcon as y$}from"@patternfly/react-icons";import{useSelector as v$}from"react-redux";var S$=({onPush:e})=>Bt.createElement(h$,{icon:Bt.createElement(y$,null),isInline:!0,onClick:()=>e({macAddress:"",logicalNicName:""}),"data-testid":"add-mapping",variant:"link"},"Add another MAC to interface name mapping"),I$=({fieldName:e,onRemove:t,mapIdx:o,enableRemove:r,hostIdx:s})=>Bt.createElement(pn,{hideRemoveButton:!r,onRemove:t},Bt.createElement(qm,{hasGutter:!0},Bt.createElement($m,{span:6},Bt.createElement(Be,{label:"MAC address",isRequired:!0,name:`${e}.macAddress`,"data-testid":`mac-address-${s}-${o}`})),Bt.createElement($m,{span:6},Bt.createElement(Be,{label:"Interface name",isRequired:!0,name:`${e}.logicalNicName`,"data-testid":`interface-name-${s}-${o}`})))),_b=({fieldName:e,macInterfaceMap:t,hostIdx:o})=>{let{isViewerMode:r}=v$(R);return Bt.createElement(qm,{className:"mac-ip-mapping"},Bt.createElement($m,{span:6},Bt.createElement(C$,{name:e,validateOnChange:!1,render:({push:s,remove:i})=>Bt.createElement(qm,{hasGutter:!0},t.map((n,a)=>Bt.createElement(I$,{key:tn(e,a),fieldName:tn(e,a),onRemove:()=>i(a),mapIdx:a,enableRemove:!r&&a>0,hostIdx:o})),!r&&Bt.createElement(S$,{onPush:s}))})))};var D$=({fieldName:e,hostIdx:t})=>{let o=`${e}.macInterfaceMap`,[r,{error:s}]=zb({name:o}),i=r.value?r.value:[],n=!!s,a="",l="";return i.length?(a=i[0].macAddress||"",l=i[0].logicalNicName||""):n=!0,yt.createElement(Kp,{title:"MAC to Interface name mapping",numInterfaces:i.length,macAddress:a,mappingValue:l,hostIdx:t,hasError:n})},E$=({fieldName:e,hostIdx:t})=>{let o=`${e}.macInterfaceMap`,[r]=zb({name:o}),s=r.value?r.value:[];return yt.createElement(yt.Fragment,null,yt.createElement(Wb,{label:"",fieldId:T("nmstateYaml","inputs")},yt.createElement(ZS,{language:w$.yaml,name:`${e}.networkYaml`,"data-testid":`yaml-${t}`})),yt.createElement(Wb,{label:yt.createElement(yt.Fragment,null,"MAC to interface name mapping"," ",yt.createElement(W,{bodyContent:"MAC address and interface name are needed in order to execute the above nmstate YAML on the right machine."})),fieldId:T("macNicMaping","inputs")},yt.createElement(_b,{fieldName:o,macInterfaceMap:s,hostIdx:t})))},Bb=()=>{let e=Hm();return yt.createElement(T$,{hasGutter:!0},yt.createElement(x$,null,yt.createElement(k$,{component:b$.small},"Upload, drag and drop, or copy and paste a YAML file that contains NMState into the editor for network configurations. Each host also needs the MAC to interface name mapping."," ",yt.createElement("a",{href:Mu,target:"_blank",rel:"noopener noreferrer"},"Learn more about NMState ",yt.createElement(P$,null)))),yt.createElement(Rp,{ExpandedHostComponent:E$,CollapsedHostComponent:D$,emptyHostData:e,enableCopyAboveConfiguration:!0}))};var fa=({...e})=>{let t={...e,validationSchema:Fb,getInitialValues:o=>xb(o),getUpdateParams:(o,r)=>r.hosts,getEmptyValues:()=>Sb()};return Ub.createElement(qi,{...t},Ub.createElement(Bb,null))};import Ca from"react";import ji from"react";import{FormGroup as A$,Grid as F$}from"@patternfly/react-core";import{useField as V$}from"formik";var N$=e=>({fieldName:o,hostIdx:r})=>ji.createElement(F$,{hasGutter:!0},ji.createElement(Be,{name:`${o}.macAddress`,label:"MAC Address",isRequired:!0,"data-testid":`mac-address-${r}`}),co(e).map(s=>ji.createElement(A$,{label:`IP address (${pa(s)})`,fieldId:T(`${o}.ips.${s}`,"input"),key:s},ji.createElement(Be,{name:`${o}.ips.${s}`,isRequired:!0,"data-testid":`${s}-address-${r}`})," "))),H$=e=>({fieldName:o,hostIdx:r})=>{let[{value:s},{error:i}]=V$({name:o}),a=co(e).map(l=>s.ips[l]).join(", ");return ji.createElement(Kp,{title:"MAC to IP mapping",numInterfaces:1,macAddress:s.macAddress,mappingValue:a,hostIdx:r,hasError:!!i})},Gb=({protocolType:e})=>{let t=ua(),o=H$(e),r=N$(e);return ji.createElement(Rp,{CollapsedHostComponent:o,ExpandedHostComponent:r,emptyHostData:t})};import{array as R$,object as Rm,string as Zb}from"yup";import{boolean as B$,lazy as z$,mixed as U$,number as Xb,object as ha,string as G$}from"yup";var or=e=>`${e.ip}/${e.prefixLength}`;var O$="A value is required",$b="Must be a number",L$=/^\d+$/,qb=1,ga={ipv4:32,ipv6:128},Yb=1,Xp=4094,jb=e=>isNaN(e)?null:e,Jp=(e,t)=>Ab(e,or(t)),M$=(e,t)=>ma(e,or(t)),_$=e=>ha().shape({ip:Ym(e),prefixLength:Xb().required("Prefix length is required").min(1,"Prefix length must be more than or equal to 1").max(ga[e],`Prefix length must be less than or equal to ${ga[e]}`).nullable().transform(jb)}),Ym=(e,t=!1)=>(t?wb:Lm)(e).required(O$).concat(Eb(e)),Rb=(e,t)=>ha().shape({machineNetwork:_$(e),gateway:Ym(e).concat(Jp(e,t.machineNetwork)).concat(M$(e,t.machineNetwork))}),Kb=z$(e=>{let t=ha().shape({ipv4:Rb(B.ipv4,e.ipConfigs.ipv4),ipv6:yb(e.protocolType,B.ipv6)?Rb(B.ipv6,e.ipConfigs.ipv6):ha()});return ha().shape({useVlan:B$(),vlanId:U$().when("useVlan",{is:!0,then:Xb().required($b).min(1,"Must be more than or equal to 1").max(Xp,`Must be less than or equal to ${Xp}`).test("not-number",$b,()=>W$(e.vlanId)).nullable().transform(jb)}),protocolType:G$(),dns:Ym(B.ipv4,!0),ipConfigs:t})}),W$=e=>new RegExp(L$).test((e||"").toString());var jm="A value is required",$$=e=>e.hosts.map(t=>t.ips.ipv4),q$=e=>e.hosts.map(t=>t.ips.ipv6),Y$=e=>e.hosts.map(t=>t.macAddress),j$=e=>Rm().shape({macAddress:tl.required(jm).concat(Js(Y$)),ips:Rm().shape({ipv4:Vm(e.protocolType)?Jp(B.ipv4,e.ipConfigs.ipv4.machineNetwork).required(jm).concat(Js($$)).concat(ma(B.ipv4,or(e.ipConfigs.ipv4.machineNetwork))):Zb(),ipv6:Nm(e.protocolType)?Jp(B.ipv6,e.ipConfigs.ipv6.machineNetwork).required(jm).concat(Js(q$)).concat(ma(B.ipv6,or(e.ipConfigs.ipv6.machineNetwork))):Zb()})}),Jb=e=>Rm().shape({hosts:R$().of(j$(e))});import{dump as K$}from"js-yaml";var Km="eth0",X$=(e,t)=>{let o=e.ipConfigs[t].machineNetwork;if(o.prefixLength==="")throw"Machine network prefix length not configured";return o.prefixLength},J$=(e,t)=>`${t.map(r=>`${wi}${r}`).join(`
|
|
28
|
+
Missing cluster_id`);let{data:k}=await mt.updateRole(b,P);l?l():u(Xr(k))}catch(k){x(k,()=>t({title:"Failed to set role",message:D(k)}))}},[t,u,l]),Z=Jn(()=>uv({...w,onEditRole:q,onDiskRole:C,onExcludedODF:I,onEditHost:m,onHostReset:g,onDownloadHostLogs:h,onViewHostEvents:d,canDownloadHostLogs:dc,...c}),[w,c,q,C,m,g,h,I,d]),[ae,Y]=E_([]),Re=Ot((b,P)=>{Y(P?[...ae,b.id]:ae.filter(k=>k!==b.id))},[ae]),tt=Ot(()=>{if(ae.length===1){let b=e.hosts?.find(P=>P.id===ae[0]);return b&&m(b)}return n.open({hostIDs:ae,cluster:e})},[ae,n,e,m]),vt=Ot(()=>a.open({hosts:(e.hosts||[]).filter(b=>ae.includes(b.id)),onDelete:b=>mt.delete(b)}),[e.hosts,ae,a]);return{onDiskRole:C,onEditHost:m,actionChecks:w,onEditRole:q,actionResolver:Z,onReset:E,onDelete:F,onAdditionalNtpSource:y,onUpdateDay2ApiVip:S,onSelect:p?void 0:Re,selectedHostIDs:ae,setSelectedHostIDs:Y,onMassChangeHostname:tt,onMassDeleteHost:vt,updateDiskSkipFormatting:v}},ss=({cluster:e,onDelete:t,onReset:o,onAdditionalNtpSource:r,onUpdateDay2ApiVip:s})=>{let i=jv(),{resetCluster:n}=Rv(jr),{t:a}=f(),{eventsDialog:l,editHostDialog:p,deleteHostDialog:u,resetHostDialog:c,additionalNTPSourcesDialog:d,UpdateDay2ApiVipDialog:m,massUpdateHostnameDialog:g,massDeleteHostDialog:h}=se(),C=Jn(()=>[Jo(a),Vi({isWithinModal:!0})],[a]),I=Zo(h.data?.hosts?.length||0);return Eo(A_,null,l.isOpen&&Eo(kn,{isOpen:!0,title:`Host Events${l.isOpen?`: ${l.data?.hostname}`:""}`,entityKind:"host",cluster:e,hostId:l.data?.hostId,onClose:l.close,onFetchEvents:Do}),c.isOpen&&Eo(Hv,{isOpen:!0,hostname:c.data?.hostname,onClose:c.close,onReset:o}),u.isOpen&&Eo(Mv,{isOpen:!0,hostname:u.data?.hostname,onClose:u.close,onDelete:t}),p.isOpen&&Eo(Bc,{isOpen:!0,host:p.data?.host,inventory:p.data?.inventory,usedHostnames:e?.hosts?.map(S=>S.requestedHostname).filter(S=>S),onClose:p.close,onSave:async S=>{let y=re.findHost(e.hosts,S.hostId);if(!y)throw new Error(`No host found with id:${S.hostId}`);let{data:v}=await mt.updateHostName(y,S.hostname);n?n():i(Xr(v)),p.close()},onFormSaveError:S=>{let y;return x(S,()=>y=D(S)),y}}),d.isOpen&&Eo(fv,{isOpen:!0,additionalNtpSource:e.additionalNtpSource,onClose:d.close,onAdditionalNtpSource:r}),m.isOpen&&Eo(Bv,{isOpen:!0,onClose:m.close,onUpdateDay2ApiVip:s,currentApiVip:e.apiVipDnsName}),g.isOpen&&Eo(Rc,{isOpen:!0,onClose:g.close,hosts:g.data?.cluster?.hosts||[],selectedHostIDs:g.data?.hostIDs||[],onChangeHostname:(S,y)=>mt.updateHostName(S,y),canChangeHostname:()=>[!0,void 0]}),h.isOpen&&Eo(Xc,{isOpen:!0,onClose:h.close,hosts:h.data?.hosts||[],onDelete:h.data?.onDelete},Eo(ts,{hosts:h.data?.hosts||[],content:C,...I},Eo("div",null,"No hosts selected"))))};import Zv from"react";import{ConnectedIcon as L_}from"@patternfly/react-icons";import{pluralize as M_}from"humanize-plus";import Jv from"react";import br from"react";import{Button as Kv,ButtonVariant as Xv,Modal as F_}from"@patternfly/react-core";import{InfoCircleIcon as V_}from"@patternfly/react-icons";var N_=({linkText:e,infoCircleSize:t="sm",modalTitle:o,modalVariant:r="medium",children:s})=>{let[i,n]=br.useState(!1),a=br.useCallback(()=>n(!1),[]),l=br.useCallback(()=>n(!0),[]);return br.createElement(br.Fragment,null,br.createElement(Kv,{variant:Xv.link,onClick:l,isInline:!0},br.createElement(V_,{size:t})," ",e),br.createElement(F_,{title:o,isOpen:i,actions:[br.createElement(Kv,{key:"close",variant:Xv.primary,onClick:a},"Close")],onClose:a,variant:r},s))},pp=N_;import{pluralize as H_}from"humanize-plus";var O_=({isSingleNode:e=!1})=>Jv.createElement(pp,{linkText:`${H_(+e,"Host")} not showing up?`,modalTitle:"Troubleshooting Host Discovery Issues",modalVariant:"large"},Jv.createElement(fy,null)),up=O_;var __=({isSingleNode:e=!1})=>Zv.createElement(bo,{icon:L_,title:`Waiting for ${M_(+e,"host")}...`,content:"Hosts may take a few minutes to appear here after booting.",secondaryActions:[Zv.createElement(up,{key:"hosts-not-showing"})]}),cp=__;import Zd from"react";import{AlertActionLink as W_}from"@patternfly/react-core";var Qv=()=>{let{UpdateDay2ApiVipDialog:{open:e}}=se();return Zd.createElement(Zd.Fragment,null,"Check your DNS and network configuration, or"," ",Zd.createElement(W_,{onClick:()=>e(),isInline:!0},"set the IP or domain used to reach the cluster."))};import Qd from"react";var eS=Qd.createContext(void 0),dp=({canEditDisks:e,onDiskRole:t,updateDiskSkipFormatting:o,children:r})=>{let s={canEditDisks:e,onDiskRole:t,updateDiskSkipFormatting:o};return Qd.createElement(eS.Provider,{value:s},r)},mp=()=>{let e=Qd.useContext(eS);if(e===void 0)throw new Error("useHostTableDetailContext must be used within a HostsTableDetailContextProvider");return e};function z_({obj:e}){let{onDiskRole:t,canEditDisks:o,updateDiskSkipFormatting:r}=mp();return Hi(Ws,{host:e,AdditionalNTPSourcesDialogToggleComponent:Po,hideNTPStatus:!0,onDiskRole:t,canEditDisks:o,updateDiskSkipFormatting:r})}var B_=({cluster:e,skipDisabled:t})=>{let{onEditHost:o,onEditRole:r,actionChecks:s,onDiskRole:i,actionResolver:n,updateDiskSkipFormatting:a,...l}=rs(e),{t:p}=f(),u=U_(()=>[Jo(p,o,void 0,s.canEditHostname),Zr(p,s.canEditRole,r,io(e)),iv(p,Po,o,Qv),Zl,Ql,ep,Fi,Qr(e)],[p,o,s,r,e]),c=e.hosts||[],d=Zo(c.length);return Hi(G_,null,Hi(dp,{canEditDisks:s.canEditDisks,onDiskRole:i,updateDiskSkipFormatting:a},Hi(ts,{hosts:c,skipDisabled:t,ExpandComponent:z_,content:u,actionResolver:n,...d},Hi(cp,{isSingleNode:le(e)}))),Hi(ss,{cluster:e,...l}))},Ni=B_;import Zn from"react";import{ToolbarContent as $_,Toolbar as q_,ActionGroup as Y_}from"@patternfly/react-core";var j_=({children:e,validationSection:t})=>Zn.createElement(Zn.Fragment,null,t,Zn.createElement(Y_,null,Zn.createElement(q_,{id:"cluster-toolbar",className:"cluster-toolbar"},Zn.createElement($_,{className:"cluster-toolbar__content"},e)))),em=j_;import U from"react";import{GridItem as um,TextContent as NW,Text as HW}from"@patternfly/react-core";import aW from"swr";import xr from"react";import{Severity as pW}from"@sentry/browser";import is from"react";var R_=e=>e.sort((t,o)=>t.label.localeCompare(o.label,void 0,{numeric:!0})).reverse(),K_=["production","maintenance"];function lo(){let[e,t]=is.useState([]),[o,r]=is.useState(),s=is.useCallback(p=>e.find(({value:u})=>new RegExp(`^${u}(\\..+)?$`).test(p||"")),[e]),i=is.useCallback(async()=>{try{let{data:p}=await Hl.list(),u=Object.keys(p).map(c=>{let d=p[c],m=d.displayName;return{label:`OpenShift ${m}`,value:c,version:m,default:Boolean(d.default),supportLevel:d.supportLevel,cpuArchitectures:d.cpuArchitectures}});t(R_(u))}catch(p){x(p,u=>{r({title:"Failed to retrieve list of supported OpenShift versions.",message:D(u)})})}},[]),n=is.useCallback(p=>s(p)?.value||p,[s]),a=is.useCallback(p=>{let u=s(p);return K_.includes(u?.supportLevel||"")},[s]),l=is.useCallback(p=>s(p)?.cpuArchitectures??[],[s]);return is.useEffect(()=>{i()},[i]),{error:o,loading:!o&&e.length===0,versions:e,normalizeClusterVersion:n,isSupportedOpenShiftVersion:a,getCpuArchitectures:l}}import X_ from"react";import J_ from"swr";function Z_(e){let t=e.filter(r=>!Yf.includes(r)),o=Array.from(new Set(t));if(t.length===1){let[r]=o;return So({platform:{type:r}})?r:void 0}}function ns(e){let{addAlert:t,alerts:o}=N(),r=M.makeSupportedPlatformsBaseURI(e),s=()=>M.getSupportedPlatforms(e).then(p=>p.data),{data:i,error:n}=J_(r,s,{refreshInterval:bs,errorRetryCount:0,revalidateOnFocus:!1}),a=!n&&!i,l=a||!i?void 0:Z_(i);return X_.useEffect(()=>{if(n){let p=`Failed to retrieve supported platforms (clusterId: ${e})`;if(o.find(u=>u.title===p))return;x(n,()=>t({title:p,message:D(n)}))}},[n,t,e,o]),{isPlatformIntegrationSupported:l!==void 0,supportedPlatformIntegration:l||"no-active-integrations",isLoading:a,error:n}}import tm from"react";function fp(){let[e,t]=tm.useState(),{addAlert:o}=N(),r=tm.useCallback(async()=>{try{let{data:s}=await Nl.list();t(s)}catch(s){t([]),x(s,()=>o({title:"Failed to retrieve managed domains",message:D(s)}))}},[o]);return tm.useEffect(()=>{e||r()},[]),e}import om from"react";function gp(e){let[t,o]=om.useState(),{addAlert:r}=N(),s=om.useCallback(async()=>{try{let{data:i}=await M.list(),n=i.filter(a=>a.id!==e).map(a=>`${a.name||""}.${a.baseDnsDomain||""}`);o(n)}catch(i){o([]),x(i,()=>r({title:"Failed to retrieve names of existing clusters.",message:D(i)}))}},[r,e]);return om.useEffect(()=>{s()},[]),{usedClusterNames:t}}import hp from"react";function Cp(e,t){let[o,r]=hp.useState(),[s,i]=hp.useState(""),n=hp.useCallback(async()=>{try{let a=await it.getInfraEnvId(e,t);r(a)}catch(a){i(Ge(a))}},[e,t]);return hp.useEffect(()=>{e&&!o&&n()},[e,n,o]),{infraEnvId:o,error:s}}import rm from"react";function Oi(){let[e,t]=rm.useState(),{addAlert:o}=N(),r=rm.useCallback(async()=>{try{if(oe){let i=(await oe.post("/api/accounts_mgmt/v1/access_token"))?.request?.response;t(i||"")}else t("")}catch(s){x(s,i=>{t(""),o({title:"Failed to retrieve pull secret",message:D(i)})})}},[o]);return rm.useEffect(()=>{e||r()},[]),e}import sm from"react";var{addAlert:Q_}=qr.actions,eW=e=>{let[t,o]=sm.useState(),[r,s]=sm.useState("");return sm.useEffect(()=>{(async()=>{try{let{data:n}=await M.getPreflightRequirements(e);o(n)}catch(n){s(Ge(n)),x(n,()=>Q_({title:"Failed to retrieve preflight cluster requirements",message:D(n)}))}})()},[o,s,e]),{preflightRequirements:t,error:r,isLoading:!r&&!t}},Bs=eW;var im="Virtualization",nm="OpenShift Data Foundation Logical Volume Manager",tS=(e,t)=>!!t.find(r=>r.value===e)?.cpuArchitectures?.includes(L.ARM),yp="This option is not editable after the draft cluster is created",oS=(e,t,o)=>!e.useContainerNativeVirtualization&&e.useOdfLogicalVolumeManager&&o!=="supported"?`Currently, you can not install ${im} operator at the same time as ${nm} operator.`:void 0,rS=(e,t,o)=>{let r=e.useContainerNativeVirtualization;if(r&&e.useOdfLogicalVolumeManager)return`${nm} must be installed when ${im} operator is also installed`;if(r&&o!=="supported")return`Currently, you can not install ${nm} operator at the same time as ${im} operator.`},tW=(e,t)=>e?yp:t?"":"Single-Node OpenShift is not supported in this OpenShift version",oW=(e,t,o)=>{if(e)return yp;if(!tS(t,o))return"arm64 is not supported in this OpenShift version"},rW=(e,t)=>{if(!!e){if(zo(e)&&le(e))return"OpenShift Data Foundation is not available when using Single Node OpenShift or ARM CPU architecture.";if(zo(e))return"OpenShift Data Foundation is not available when ARM CPU architecture is selected.";if(le(e))return"OpenShift Data Foundation is not available when deploying a Single Node OpenShift.";if(!t)return"The installer cannot currently enable OpenShift Data Foundation with the selected OpenShift version, but it can be enabled later through the OpenShift Console once the installation is complete."}},sW=(e,t)=>{if(!!e&&!t)return"OpenShift Data Foundation Logical Volume Manager is enabled only for OpenShift 4.11 and above."},iW=e=>{if(!!e&&zo(e))return"OpenShift Virtualization is not available when ARM CPU architecture is selected."},nW=e=>{if(!!e&&le(e))return"Network management selection is not supported for Single-Node OpenShift"},sS=(e,t,o,r,s)=>{switch(e){case"SNO":return tW(t,s);case"ARM64_ARCHITECTURE":return oW(t,o,r);case"CNV":return iW(t);case"ODF":return rW(t,s);case"LVM":return sW(t,s);case"NETWORK_TYPE_SELECTION":return nW(t);case"ARM64_ARCHITECTURE_WITH_CLUSTER_MANAGED_NETWORKING":return"Network management selection is not supported for ARM architecture with this version of OpenShift.";default:return}},iS=(e,t,o,r)=>t==="ARM64_ARCHITECTURE"?tS(e,r):o!=="unsupported";var nS=e=>{try{let t={};for(let{openshiftVersion:o,features:r}of e)if(!(!o||!r)){t[o]={};for(let{featureId:s,supportLevel:i}of r)!s||!i||(t[o][s]=i)}return t}catch(t){return Lo(t,"Failed to parse feature support levels",pW.Warning),{}}},aS=(e,t)=>{let o=Object.keys(t).find(r=>new RegExp(`^${r}(\\..*)?$`).test(e));if(!!o)return t[o]},lS=(e,t,o)=>{let r=nS(t),s=aS(e,r);return s&&s[o]!=="unsupported"},lW=({cluster:e,children:t,loadingUi:o})=>{let{loading:r,versions:s}=lo(),i=()=>zn.list().then(C=>C.data),{data:n,error:a}=aW(zn.makeBaseURI(),i,{errorRetryCount:0,revalidateOnFocus:!1}),l=!n&&!a||r,p=xr.useMemo(()=>!n||a?{}:nS(n),[a,n]),u=xr.useCallback(C=>aS(C,p),[p]),c=xr.useCallback((C,I)=>{let S=u(C);return S?S[I]:void 0},[u]),d=xr.useCallback((C,I)=>{let S=c(C,I);return iS(C,I,S,s)},[c,s]),m=xr.useCallback((C,I)=>{let S=d(C,I);return sS(I,e,C,s,S)},[d,s,e]),g=xr.useCallback((C,I)=>!!m(C,I),[m]),h=xr.useMemo(()=>({getVersionSupportLevelsMap:u,getFeatureSupportLevel:c,isFeatureDisabled:g,getFeatureDisabledReason:m,isFeatureSupported:d}),[u,c,g,m,d]);return xr.useEffect(()=>{a&&x(a)},[a]),xr.createElement(yg,{value:h},l?o:t)},Ao=lW;import{CheckCircleIcon as fW,InfoCircleIcon as cS}from"@patternfly/react-icons";import Le from"react";import{global_success_color_100 as gW}from"@patternfly/react-tokens";import{Text as hW,TextList as dS,TextListItem as pm,TextContent as CW}from"@patternfly/react-core";var vp=(e,t,o)=>{if(!e.openshiftVersion)throw o?o("ai:cluster doesn't contain the openshift_version field"):"cluster doesn't contain the openshift_version field";if(!e.featureUsage)throw o?o("ai:cluster doesn't contain the feature_usage field"):"ai:cluster doesn't contain the feature_usage field";let r={},s=O(e.featureUsage);if(s===void 0)throw o?o("ai:Error parsing cluster feature_usage field"):"Error parsing cluster feature_usage field";let i=Object.values(s).map(a=>a.id),n=t.getVersionSupportLevelsMap(e.openshiftVersion);if(!n)throw o?o("ai:No support level data for version {{openshiftVersion}}",{openshiftVersion:e.openshiftVersion}):`No support level data for version ${e.openshiftVersion}`;for(let a of i)if(a in n){let l=n[a];if(l==="supported"||l==="unsupported"&&a!=="CLUSTER_MANAGED_NETWORKING_WITH_VMS")continue;r[a]=n[a]}return r};import{Button as uW,ButtonVariant as cW}from"@patternfly/react-core";import lm from"react";import{ErrorBoundary as dW}from"react-error-boundary";import am from"react";var pS=am.createContext({captureException:()=>{}}),uS=({exceptionReporter:e,children:t})=>am.createElement(pS.Provider,{value:{captureException:e}},t),Sp=()=>am.useContext(pS);var mW=({title:e})=>({resetErrorBoundary:o})=>{let r="There was an internal error",s=[lm.createElement(uW,{onClick:o,variant:cW.link,isInline:!0,key:"reset-error-boundary"},"try again")];return lm.createElement(_,{...{content:r,primaryAction:s,title:e}})},Li=({children:e,...t})=>{let{captureException:o}=Sp(),r=s=>{o(s,t.title)};return lm.createElement(dW,{FallbackComponent:mW(t),onError:r},e)};var yW=e=>{switch(e){case"SNO":return"Install single node OpenShift (SNO)";case"VIP_AUTO_ALLOC":return"Allocate IPs via DHCP server";case"ARM64_ARCHITECTURE":return"Use ARM architecture for the cluster";default:return e}},vW=e=>e==="dev-preview"?"Developer Preview Features":Le.createElement(ot,{href:sn},"Technology Preview Features"),SW=e=>{let t={"tech-preview":[],"dev-preview":[]};for(let[s,i]of Object.entries(e))!Fa(i)||t[i].push(s);let o;if(t["dev-preview"].length)o="dev-preview";else if(t["tech-preview"].length)o="tech-preview";else return null;let r=t[o].map(s=>Le.createElement(pm,{key:s},yW(s)));return Le.createElement(Le.Fragment,null,Le.createElement(pm,null,vW(o),Le.createElement(dS,null,r)))},IW=({clusterFeatureSupportLevels:e,showVersionWarning:t})=>Le.createElement(CW,null,t&&Le.createElement(hW,null,Le.createElement(cS,{size:"sm",color:"var(--pf-global--info-color--100)"}),"\xA0The installed OpenShift version is not production-ready"),Object.keys(e).length>0&&Le.createElement(Le.Fragment,null,Le.createElement(cS,{size:"sm",color:"var(--pf-global--info-color--100)"}),"\xA0Your cluster will be subject to support limitations because it includes:",Le.createElement(dS,null,SW(e),e.CLUSTER_MANAGED_NETWORKING_WITH_VMS==="unsupported"&&Le.createElement(pm,null,"Cluster-managed networking with some or all discovered hosts as virtual machines")))),bW=()=>Le.createElement(Le.Fragment,null,Le.createElement(fW,{color:gW.value}),"\xA0Your installed cluster will be fully supported"),xW=e=>`Cluster support level: ${e?"Full":"Limited"}`,kW=({cluster:e})=>{let{t}=f(),o=be(),{isSupportedOpenShiftVersion:r}=lo(),{limitedClusterFeatures:s,hasSupportedVersion:i,isFullySupported:n}=Le.useMemo(()=>{let a=vp(e,o,t),l=r(e.openshiftVersion);return{limitedClusterFeatures:a,hasSupportedVersion:l,isFullySupported:l&&Object.keys(a||{}).length===0}},[e,o,t,r]);return s?Le.createElement(A,{title:xW(n),value:n?Le.createElement(bW,null):Le.createElement(IW,{clusterFeatureSupportLevels:s,showVersionWarning:!i}),testId:"feature-support-levels"}):null},TW=({...e})=>Le.createElement(Li,{title:"Failed to load feature support levels review"},Le.createElement(kW,{...e})),Qn=TW;import Us from"react";import{ExclamationTriangleIcon as PW}from"@patternfly/react-icons";import{global_warning_color_100 as wW}from"@patternfly/react-tokens/dist/js/global_warning_color_100";import{Popover as DW,Text as mS,TextContent as EW,TextVariants as AW}from"@patternfly/react-core";var FW=({version:e})=>{let{t}=f(),o=Us.createElement(EW,null,Us.createElement(mS,{component:AW.p},t("ai:Please note that this version is not production-ready.")));return Us.createElement(mS,{component:"p"},e," \xA0",Us.createElement(DW,{bodyContent:o},Us.createElement(PW,{color:wW.value,size:"sm"})))},VW=({cluster:e})=>{let{isSupportedOpenShiftVersion:t}=lo(),{t:o}=f(),{openshiftVersion:r}=e,s=t(r);return Us.createElement(A,{title:o("ai:OpenShift version"),value:s?r:Us.createElement(FW,{version:r||""}),testId:"openshift-version"})},Ip=VW;var OW=({isMultiArchSupported:e})=>{let t;return e?t="The original cluster hosts CPU architecture. You can add hosts that are using either x86 or arm64 CPU architecture to this cluster.":t="The original cluster hosts CPU architecture.",U.createElement(U.Fragment,null,"CPU architecture ",U.createElement(W,{bodyContent:U.createElement("p",null,t)}))},LW=e=>{let t;return e===Co?t="Software-Defined Networking (SDN)":t="Open Virtual Network (OVN)",t},MW=e=>{let t;return e?t="User-Managed Networking":t="Cluster-managed networking",t},_W=e=>{let t=null;switch(e){case"all":t=U.createElement(U.Fragment,null,"Enabled on control plane nodes",U.createElement("br",null),"Enabled on workers");break;case"masters":t=U.createElement(U.Fragment,null,"Enabled on control plane nodes");break;case"workers":t=U.createElement(U.Fragment,null,"Enabled on workers");break}return t},WW=({cluster:e,externalMode:t=!1})=>{let{t:o}=f(),r=hi(e),s=be(),i=Boolean(e.cpuArchitecture==="multi"||e.openshiftVersion&&s.getFeatureSupportLevel(e.openshiftVersion,"MULTIARCH_RELEASE_IMAGE")==="supported");return U.createElement(U.Fragment,null,!t&&U.createElement(um,null,U.createElement(NW,null,U.createElement(HW,{component:"h2"},o("ai:Cluster Details")))),U.createElement(um,{md:6,"data-testid":"cluster-details"},U.createElement(It,null,t?void 0:U.createElement(Ip,{cluster:e}),U.createElement(A,{title:"Base domain",value:e.baseDnsDomain,testId:"base-dns-domain"}),U.createElement(A,{title:U.createElement(OW,{isMultiArchSupported:i}),value:e.cpuArchitecture,testId:"cpu-architecture"}),U.createElement(A,{title:"API IP",value:e.apiVip,isHidden:!e.apiVip,testId:"api-vip"}),U.createElement(A,{title:"Ingress IP",value:e.ingressVip,isHidden:!e.ingressVip,testId:"ingress-vip"}),U.createElement(A,{title:"Network management type",value:MW(e.userManagedNetworking),testId:"network-management-type"}),U.createElement(A,{title:"Networking Type",value:LW(e.networkType),testId:"networking-type"}))),U.createElement(um,{md:6},U.createElement(It,null,U.createElement(A,{title:"Cluster network CIDR (IPv4)",value:lc(e,"clusterNetworks"),testId:"cluster-network-cidr-ipv4"}),U.createElement(A,{title:"Cluster network host prefix (IPv4)",value:wg(e),testId:"host-prefix-ipv4"}),r?U.createElement(U.Fragment,null,U.createElement(A,{title:"Cluster network CIDR (IPv6)",value:pc(e,"clusterNetworks"),testId:"cluster-network-cidr-ipv6"}),U.createElement(A,{title:"Cluster network host prefix (IPv6)",value:Dg(e),testId:"host-prefix-ipv6"})):void 0,U.createElement(A,{title:"Service network CIDR (IPv4)",value:lc(e,"serviceNetworks"),testId:"service-network-cidr-ipv4"}),r?U.createElement(A,{title:"Service network CIDR (IPv6)",value:pc(e,"serviceNetworks"),testId:"service-network-cidr-ipv6"}):void 0,U.createElement(A,{title:"Disk encryption",value:_W(e.diskEncryption?.enableOn),isHidden:e.diskEncryption?.enableOn==="none",testId:"disk-encryption"}),U.createElement(Qn,{cluster:e}))))},bp=WW;import as from"react";import ft from"react";import{Alert as dm,GridItem as $W}from"@patternfly/react-core";import zW from"lodash/pick";import cm,{useContext as BW,useEffect as UW}from"react";var GW=(e,t)=>{let o;switch(t.type){case"request":o={status:"loading",data:{}};break;case"success":o={status:"succeeded",data:t.data};break;case"failure":o={status:"failed",data:t.data};break;default:o=e;break}return o},fS=cm.createContext({}),Mi=({children:e,errorUI:t,loadingUI:o})=>{let[r,s]=cm.useReducer(GW,{status:"idle",data:{}});UW(()=>{let l=!0;return(async()=>{try{l&&s({type:"request"});let{data:u}=await M.getDefaultConfig();l&&s({type:"success",data:u})}catch{l&&s({type:"failure",data:{}})}})(),()=>{l=!1}},[]);let i=l=>{let p={ui:o,value:l.data};switch(l.status){case"idle":case"loading":break;case"failed":p={...p,ui:t};break;case"succeeded":p={...p,ui:e};break}return p},{ui:n,value:a}=i(r);return cm.createElement(fS.Provider,{value:a},n)},_i=e=>zW(BW(fS),e);import{ExternalLinkAltIcon as qW}from"@patternfly/react-icons";var YW=({cluster:e,showAddHostsInfo:t,showKubeConfig:o})=>{let r=be(),{inactiveDeletionHours:s}=_i(["inactiveDeletionHours"]),i=Math.round((s||0)/24),n=oy(i,e.installCompletedAt),a=Boolean(t&&oe&&e.status==="installed"&&(!le(e)||e.openshiftVersion&&r.isFeatureSupported(e.openshiftVersion,"SINGLE_NODE_EXPANSION"))),l=o&&n>0&&dn(e.status);return ft.createElement(ft.Fragment,null,ft.createElement(ee,{condition:l},ft.createElement($W,null,ft.createElement(_n,{status:e.status,clusterId:e.id,id:Xo("button-download-kubeconfig")}))),ft.createElement(ee,{condition:typeof s=="number"&&dn(e.status)},ft.createElement(dm,{variant:"info",isInline:!0,title:n>0?`Download and save your kubeconfig file in a safe place. This file will be automatically deleted from Assisted Installer's service in ${n} days.`:`Kubeconfig file was automatically deleted ${i} days after installation.`})),ft.createElement(ee,{condition:a},ft.createElement(dm,{variant:"info",isInline:!0,"data-testid":"alert-add-hosts",title:ft.createElement("p",null,So(e)?'Add new hosts by using the platform auto-scale feature or manually generating a new Discovery ISO under the "Add hosts" tab on ':`Add new hosts by generating a new Discovery ISO under your cluster's "Add hosts" tab on `,ft.createElement("a",{href:Nu,target:"_blank",rel:"noopener noreferrer"},"console.redhat.com/openshift ",ft.createElement(qW,null)),".")})),ft.createElement(ee,{condition:So(e)},ft.createElement(dm,{variant:"warning",isInline:!0,"data-testid":"alert-modify-platform-config",title:ft.createElement("p",null,"Modify your platform configuration to access your platform's features directly in OpenShift."," ",ft.createElement("a",{href:Is,target:"_blank",rel:"noopener noreferrer"},"Learn more about configuration ",ft.createElement("i",{className:"fas fa-external-link-alt"})))})))},gS=YW;import{Grid as jW}from"@patternfly/react-core";var Wi=e=>{let[t,o]=as.useState(),[r,s]=as.useState(""),i=e?.id,n=e?.status,a=gi(e?.monitoredOperators),l=Wr(e),p=l.filter(m=>m.status==="failed"),u=as.useMemo(()=>a.find(m=>m.name==="console"),[a]),c=as.useCallback(()=>{(async()=>{if(s(""),!!i)try{let g=await M.getCredentials(i);o(g.data)}catch(g){s(Ge(g))}})()},[i]),d=u?.status;return as.useEffect(()=>{(!d&&n==="installed"||d==="available")&&c()},[n,d,c]),{credentials:t,credentialsError:r,olmOperators:l,failedOlmOperators:p,consoleOperator:u,fetchCredentials:c}},RW=({cluster:e,clusterVarieties:t,showAddHostsInfo:o=!0,showKubeConfig:r=!0})=>{let{credentials:s,credentialsError:i,consoleOperator:n,fetchCredentials:a}=t,l=n?.status==="available"||!n&&e.status==="installed";return as.createElement(jW,{hasGutter:!0},l&&as.createElement(id,{cluster:e,credentials:s,error:!!i,retry:a,idPrefix:Xo("cluster-creds"),credentialsError:i}),as.createElement(gS,{cluster:e,showAddHostsInfo:o,showKubeConfig:r}))},zi=RW;import{Grid as Nz,GridItem as xp}from"@patternfly/react-core";import nt from"react";import{CheckCircleIcon as oz,ExclamationCircleIcon as rz,InProgressIcon as sz}from"@patternfly/react-icons";import{global_danger_color_100 as iz}from"@patternfly/react-tokens/dist/esm/global_danger_color_100";import{global_success_color_100 as nz}from"@patternfly/react-tokens/dist/esm/global_success_color_100";import ea from"react";import{Stack as QW,StackItem as CS,TextContent as ez}from"@patternfly/react-core";import KW from"react";import{IconSize as kr}from"@patternfly/react-icons";var XW=e=>{switch(e){case kr.sm:return"0.3em";case kr.md:return"1.5em";case kr.lg:return"2em";case kr.xl:return"3em";default:return"1em"}},JW=e=>{switch(e){case kr.sm:return"-0.3em";case kr.md:return"-1.5em";case kr.lg:return"-2em";case kr.xl:return"-3em";default:return"-1em"}},ZW=({children:e,iconSize:t=kr.sm})=>{let o={padding:`${XW(t)}`,borderRadius:"50%",border:"2px solid",borderColor:"#D2D2D2",boxSizing:"content-box",verticalAlign:`${JW(t)}`};return KW.cloneElement(e,{style:o})},hS=ZW;var tz=({icon:e,children:t})=>ea.createElement(QW,null,ea.createElement(CS,null,ea.createElement(hS,null,e)),ea.createElement(CS,null,ea.createElement(ez,null,t))),ls=tz;var mm=({hosts:e,hostRole:t})=>{let{t:o}=f(),r=t==="master"?o("ai:Control Plane",{count:e.length}):o("ai:Worker",{count:e.length});if(e.some(n=>["cancelled","error"].includes(n.status))){let n=e.filter(a=>a.status==="error").length;return nt.createElement(ls,{icon:nt.createElement(rz,{color:iz.value})},nt.createElement(nt.Fragment,null,r,nt.createElement("br",null),nt.createElement("small",null,n,"/",t==="master"?o("ai:{{count}} control plane node failed",{count:e.length}):o("ai:{{count}} worker failed",{count:e.length}))))}let s=e.filter(n=>["installed","added-to-existing-cluster"].includes(n.status)),i=e.filter(n=>["preparing-for-installation","preparing-successful","pending-for-input","installing","installing-in-progress","installing-pending-user-action","resetting-pending-user-action","resetting"].includes(n.status));return i.length>0?nt.createElement(ls,{icon:nt.createElement(sz,null)},nt.createElement(nt.Fragment,null,r,nt.createElement("br",null),nt.createElement("small",null,t==="master"?o("ai:Installing {{count}} control plane node",{count:i.length}):o("ai:Installing {{count}} worker",{count:i.length})))):nt.createElement(ls,{icon:nt.createElement(oz,{color:nz.value})},nt.createElement(nt.Fragment,null,r,nt.createElement("br",null),nt.createElement("small",null,t==="master"?o("ai:{{count}} control plane node installed",{count:s.length}):o("ai:{{count}} worker installed",{count:s.length}))))};import je from"react";import{Button as yS,ButtonVariant as vS,Popover as az,Text as lz,TextContent as pz}from"@patternfly/react-core";import{CheckCircleIcon as SS,ExclamationCircleIcon as uz,InProgressIcon as cz,PendingIcon as dz}from"@patternfly/react-icons";import{global_success_color_100 as IS}from"@patternfly/react-tokens/dist/esm/global_success_color_100";import{global_danger_color_100 as mz}from"@patternfly/react-tokens/dist/esm/global_danger_color_100";import fz from"lodash/capitalize";var gz=(e=[])=>e.length?e.filter(t=>t.operatorType==="builtin").every(t=>t.status==="available"):!1,hz=e=>{let t,o;if(gz(e.monitoredOperators))t=je.createElement(SS,{color:IS.value}),o="completed";else switch(e.status){case"finalizing":t=je.createElement(cz,null),o="finalizing";break;case"error":case"cancelled":t=je.createElement(uz,{color:mz.value}),o="failed";break;case"installed":case"adding-hosts":t=je.createElement(SS,{color:IS.value}),o="completed";break;default:t=je.createElement(dz,null),o="pending"}return{finalizingIcon:t,initializationStatus:o}},bS=({cluster:e,onFetchEvents:t,fallbackEventsURL:o})=>{let[r,s]=je.useState(!1),{finalizingIcon:i,initializationStatus:n}=hz(e),a=()=>s(!1),{t:l}=f();return je.createElement(je.Fragment,null,je.createElement(kn,{title:l("ai:Cluster Events"),isOpen:r,onClose:a,hostId:void 0,cluster:e,entityKind:"cluster",onFetchEvents:t,fallbackEventsURL:o}),je.createElement(ls,{icon:i},je.createElement(je.Fragment,null,["finalizing","pending"].includes(n)?je.createElement(az,{zIndex:300,headerContent:je.createElement(je.Fragment,null,l("ai:Initialization")),bodyContent:je.createElement(pz,null,je.createElement(lz,null,l("ai:This stage may take a while to finish. To view detailed information, click the events log link below."))),footerContent:je.createElement(yS,{variant:vS.link,isInline:!0,onClick:()=>s(!0)},l("ai:Open Events Log"))},je.createElement(yS,{variant:vS.link,isInline:!0},l("ai:Initialization"))):l("ai:Initialization"),je.createElement("small",null,fz(n)))))};import Lt from"react";import{Button as Cz,ButtonVariant as yz,List as vz,ListItem as Sz,Popover as Iz}from"@patternfly/react-core";import{CheckCircleIcon as bz,ExclamationCircleIcon as xz,InProgressIcon as kz,PendingIcon as Tz}from"@patternfly/react-icons";import{global_danger_color_100 as Pz,global_success_color_100 as wz}from"@patternfly/react-tokens";import{pluralize as Dz}from"humanize-plus";function xS(e){let t=e.map(o=>o.status||"pending");return t.includes("failed")?"failed":t.includes("progressing")?"progressing":t.includes("pending")?"pending":"available"}var kS=e=>`${e} ${Dz(e,"operator")}`;function Ez(e,t){let o=e.filter(i=>i.status==="failed").length,r=xS(e),s=kS(e.length);switch(r){case"available":return t("ai:{{operatorsCountString}} installed",{operatorsCountString:s});case"failed":return e.length>1?`${o}/${s} failed`:`${kS(o)} failed`;case"progressing":return t("ai:Installing {{operatorsCountString}}",{operatorsCountString:s});default:return t("ai:Pending - {{operatorsCountString}}",{operatorsCountString:s})}}function Az(e){switch(e){case"available":return Lt.createElement(bz,{color:wz.value});case"failed":return Lt.createElement(xz,{color:Pz.value});case"progressing":return Lt.createElement(kz,null);default:return Lt.createElement(Tz,null)}}var Fz=({operators:e,children:t})=>{let{t:o}=f();return Lt.createElement(Iz,{headerContent:Lt.createElement("div",null,o("ai:Operators")),bodyContent:Lt.createElement(vz,{className:"operators-progress-item__operators-list"},e.map(r=>{let s=r.status??"pending";r.status==="available"&&(s="installed");let i=r.name&&an(o)[r.name];return Lt.createElement(Sz,{key:r.name,title:r.statusInfo},i," ",s)})),minWidth:"30rem",maxWidth:"50rem"},t)},Vz=({operators:e})=>{let{t}=f(),o=Az(xS(e)),r=Ez(e,t);return Lt.createElement(ls,{icon:o},Lt.createElement(Lt.Fragment,null,Lt.createElement(Fz,{operators:e},Lt.createElement(Cz,{variant:yz.link,isInline:!0,"data-testid":"operators-progress-item"},t("ai:Operators"))),Lt.createElement("small",null,r)))},TS=Vz;import Mt from"react";var Hz=({cluster:e,minimizedView:t=!1,onFetchEvents:o,fallbackEventsURL:r})=>{let s=zr(e.hosts),i=Wr(e),n=s.filter(l=>l.role&&l.role==="master"),a=s.filter(l=>l.role&&l.role==="worker");return Mt.createElement(Mt.Fragment,null,Mt.createElement(ee,{condition:!t},Mt.createElement(Nz,{hasGutter:!0},Mt.createElement(xp,{span:3},Mt.createElement(mm,{hosts:n,hostRole:"master"})),Mt.createElement(ee,{condition:a.length>0},Mt.createElement(xp,{span:3},Mt.createElement(mm,{hosts:a,hostRole:"worker"}))),Mt.createElement(xp,{span:3},Mt.createElement(bS,{cluster:e,onFetchEvents:o,fallbackEventsURL:r})),Mt.createElement(ee,{condition:i.length>0},Mt.createElement(xp,{span:3},Mt.createElement(TS,{operators:i}))))))},PS=Hz;import Je from"react";import{Stack as ES,StackItem as Bi}from"@patternfly/react-core";import ne from"react";import{Alert as fm,AlertActionLink as kp,Text as Oz,TextContent as Lz}from"@patternfly/react-core";import{pluralize as Mz}from"humanize-plus";var _z=(e,t)=>{let o="";for(let r=0;r<e.length;r++){let s=e[r].name||"";r>0&&(r===e.length-1?o+=" and ":o+=", "),o+=`${s&&an(t)[s]} (${s&&s.toUpperCase()})`}return o},Wz=(e,t,o,r)=>r==="worker"?oe?ne.createElement(ne.Fragment,null,"Error information for each host can be found in the host inventory table. To retry adding failed hosts, navigate to the clusters list inside OpenShift Cluster Manager, click your cluster name, and select the ",ne.createElement("b",null,"Add hosts")," tab."):ne.createElement(ne.Fragment,null,"Error information for each host can be found in the host inventory table. To retry adding failed hosts, press the ",ne.createElement("b",null,"Add hosts")," button."):ne.createElement(ne.Fragment,null,e,"/",t," ",Mz(t,r)," ",o," Due to this, the cluster will be degraded. Please check the installation log for more information."),ta=({cluster:e,failedHosts:t,totalHosts:o,title:r,hostsType:s,failedOperators:i=[],message:n})=>{let{addAlert:a}=N(),{t:l}=f();return ne.createElement(ne.Fragment,null,ne.createElement(fm,{isInline:!0,variant:"warning",title:r,actionLinks:ne.createElement(ne.Fragment,null,ne.createElement(kp,{id:"cluster-installation-logs-button",onClick:()=>_s(a,e.id),isDisabled:!Es(e)},"Download installation logs"))},ne.createElement(ee,{condition:t!==0},ne.createElement("p",null,Wz(t,o,n,s))),ne.createElement(ee,{condition:i?.length>0},ne.createElement("p",null,_z(i,l)," failed to install. Due to this, the cluster will be degraded, but you can try to install the operator from the Operator Hub. Please check the installation log for more information."))))},wS=({cluster:e,failedHosts:t,totalHosts:o,isCriticalNumberOfWorkersFailed:r})=>{let{addAlert:s}=N(),{resetClusterDialog:i}=se(),n=p=>`cluster-install-error-${p}`,a,l;return e.highAvailabilityMode==="None"||t>0?(a="Control plane was not installed",l=`${t}/${o} control plane nodes failed to install. Please check the installation logs for more information.`):r?(a="Critical number of workers were not installed",l="Only one worker was able to be installed. Please check the installation logs for more information."):(a="Initialization failed",l=ne.createElement(Lz,null,ne.createElement(Oz,{component:"p"},xo(e.statusInfo),ne.createElement("br",null),"Reset the installation process to return to the configuration and try again. Some hosts may need to be re-registered by rebooting into the Discovery ISO."))),ne.createElement(ne.Fragment,null,ne.createElement(fm,{isInline:!0,variant:"danger",title:a,actionLinks:ne.createElement(ne.Fragment,null,ne.createElement(kp,{id:"button-reset-cluster",onClick:()=>i.open({cluster:e})},"Reset Cluster"),ne.createElement(kp,{id:"cluster-installation-logs-button",onClick:()=>_s(s,e.id),isDisabled:!Es(e)},"Download installation logs"),ne.createElement(kp,{onClick:()=>window.open(Fu(),"_blank"),id:n("button-report-bug")},"Report a bug"))},l))},DS=()=>ne.createElement(ne.Fragment,null,ne.createElement(fm,{isInline:!0,variant:"success",title:"Installation completed successfully"}," "));var AS=(e,t)=>{let o=e.filter(i=>i.role&&i.role===t),r=o.filter(i=>["cancelled","error"].includes(i.status)),s=o.filter(i=>["installing-pending-user-action"].includes(i.status));return[o.length,r.length,s.length]},zz=e=>e.filter(t=>t.status&&t.status==="failed"),FS=(e,t,o)=>{let[r,s,i]=AS(e,"master"),[n,a,l]=AS(e,"worker"),p=zz(o);return["error","cancelled"].includes(t.status)?Je.createElement(ES,null,Je.createElement(Bi,null,Je.createElement(wS,{cluster:t,totalHosts:r,failedHosts:s,isCriticalNumberOfWorkersFailed:a===1}))):Je.createElement(ES,{hasGutter:!0},Je.createElement(ee,{condition:t.status==="installed"},Je.createElement(Bi,null,Je.createElement(DS,null))),Je.createElement(ee,{condition:a>0},Je.createElement(Bi,null,Je.createElement(ta,{cluster:t,totalHosts:n,failedHosts:a,title:`Could not install ${a} worker hosts`,hostsType:"worker",message:"failed to install."}))),Je.createElement(ee,{condition:p.length>0},Je.createElement(Bi,null,Je.createElement(ta,{cluster:t,totalHosts:r,failedHosts:s,title:"Some operators failed to install",failedOperators:p,message:"failed to install."}))),Je.createElement(ee,{condition:i>0},Je.createElement(Bi,null,Je.createElement(ta,{cluster:t,totalHosts:r,failedHosts:s,title:"Some hosts are pending user action",failedOperators:p,message:"are pending user action."}))),Je.createElement(ee,{condition:l>0},Je.createElement(Bi,null,Je.createElement(ta,{cluster:t,totalHosts:n,failedHosts:a,title:"Some hosts are pending user action",message:"are pending user action."}))))};var Gz=({cluster:e})=>{let{addAlert:t}=N(),{resetClusterDialog:o,cancelInstallationDialog:r}=se(),s=Wi(e),{credentials:i,credentialsError:n}=s,a=be(),l=e.openshiftVersion&&a.isFeatureSupported(e.openshiftVersion,"SINGLE_NODE_EXPANSION"),p=(!le(e)||l)&&e.status==="installed"&&!oe;return te.createElement(Bz,{hasGutter:!0},te.createElement(gm,null,te.createElement(Uz,{hasGutter:!0},te.createElement(Gs,null,te.createElement(NS,null,te.createElement(HS,{component:"h2"},"Installation progress"))),te.createElement(Gs,{span:6},te.createElement(Mn,{cluster:e,totalPercentage:e.progress?.totalPercentage||0})),te.createElement(Gs,{span:6,rowSpan:4}),te.createElement(Gs,{span:6},te.createElement(PS,{cluster:e,onFetchEvents:Do})),te.createElement(Gs,{span:6},FS(zr(e.hosts),e,Wr(e))),te.createElement(Gs,{span:6},te.createElement(zi,{cluster:e,clusterVarieties:s})),te.createElement(Gs,null,te.createElement(NS,null,te.createElement(HS,{component:"h2"},"Host Inventory")),te.createElement(Ni,{cluster:e,skipDisabled:!0})),te.createElement(bp,{cluster:e}))),te.createElement(gm,null,te.createElement(gr,null)),te.createElement(gm,null,te.createElement(em,null,Yl(e)&&te.createElement(ht,{id:Xo("button-cancel-installation"),variant:Tp.danger,onClick:()=>r.open({clusterId:e.id})},"Abort Installation"),e.status==="error"&&te.createElement(ht,{id:Xo("button-reset-cluster"),onClick:()=>o.open({cluster:e})},"Reset Cluster"),["finalizing","installed"].includes(e.status)&&te.createElement(RC,{isDisabled:!i||!!n,cluster:e,consoleUrl:i?.consoleUrl,id:Xo("button-launch-console")}),p&&te.createElement(ht,{variant:Tp.primary,component:u=>te.createElement(VS,{to:`${ue}/clusters/${e.id}`,...u}),id:Xo("button-add-hosts"),onClick:async()=>{try{let{data:u}=await M.allowAddHosts(e.id);qe(u)}catch(u){x(u)}}},"Add hosts"),!To()&&te.createElement(ht,{variant:Tp.link,component:u=>te.createElement(VS,{to:`${ue}/clusters`,...u}),id:Xo("button-back-to-all-clusters")},"Back to all clusters"),te.createElement(xc,null,te.createElement(ht,{id:"cluster-installation-logs-button",variant:Tp.link,onClick:()=>_s(t,e.id),isDisabled:!Es(e)},"Download Installation Logs"),te.createElement(Gr,{cluster:e,onFetchEvents:Do})))))},hm=Gz;import bt from"react";import{Card as jz,Title as Rz,CardBody as _S,CardHeader as Kz,CardExpandableContent as Xz,Grid as Jz,GridItem as Zz}from"@patternfly/react-core";import{Flex as $z,FlexItem as Pp,Button as OS,ButtonVariant as LS}from"@patternfly/react-core";import Tr from"react";var qz=e=>`cluster-detail-${e}`,Yz=({cluster:e})=>{let{addAlert:t}=N(),{cancelInstallationDialog:o}=se();return Tr.createElement($z,{className:"assisted-ui-vertical-margin",spaceItems:{default:"spaceItemsSm"},direction:{default:"row"},justifyContent:{default:"justifyContentFlexStart"}},Tr.createElement(Pp,null,Tr.createElement(OS,{"data-testid":"cluster-installation-abort-button",variant:LS.danger,onClick:()=>o.open({clusterId:e.id}),isDisabled:!Yl(e)},"Abort Installation")),Tr.createElement(Pp,null,Tr.createElement(_n,{status:e.status,clusterId:e.id,"data-testid":qz("button-download-kubeconfig")})),Tr.createElement(Pp,null,Tr.createElement(Gr,{cluster:e,onFetchEvents:Do})),Tr.createElement(Pp,null,Tr.createElement(OS,{"data-testid":"cluster-installation-logs-button",variant:LS.link,onClick:()=>_s(t,e.id),isDisabled:!Es(e)},"Download Installation Logs")))},MS=Yz;var Qz=({cluster:e})=>{let[t,o]=bt.useState(e.status!=="installed"),r=Wi(e);return bt.createElement(jz,{"data-testid":"ai-cluster-details-card",isExpanded:t},bt.createElement(Kz,{onExpand:()=>o(!t),toggleButtonProps:{"data-testid":"toggle-ai-cluster-details","aria-label":"AI Cluster Details","aria-labelledby":"titleId toggle-button","aria-expanded":t}},bt.createElement(Rz,{headingLevel:"h1",size:"lg",className:"card-title"},"Installation progress"),!t&&bt.createElement("div",{className:"pf-u-ml-md"},bt.createElement(jl,{status:e.status}))),bt.createElement(_S,null,bt.createElement(Mn,{cluster:e,minimizedView:!t,totalPercentage:e.progress?.totalPercentage||0}),bt.createElement(MS,{cluster:e})),bt.createElement(Xz,null,bt.createElement(_S,null,bt.createElement(Jz,{hasGutter:!0},bt.createElement(zi,{cluster:e,clusterVarieties:r,showAddHostsInfo:!1,showKubeConfig:!1}),bt.createElement(Zz,null,bt.createElement(Ni,{cluster:e,skipDisabled:!0}))))))},Cm=Qz;import $ from"react";import{Provider as xq}from"react-redux";import{Link as kq}from"react-router-dom";import{Button as Tq,ButtonVariant as Pq,Card as Qm,CardBody as ef,CardHeader as tf,Title as of}from"@patternfly/react-core";import ym from"react";import{useSelector as e0,useDispatch as WS}from"react-redux";var t0=(e,t)=>e===Q.ERROR?t:![Q.LOADING,Q.RELOADING].includes(e),oa=e=>{let t=WS();return ym.useCallback(()=>t(Yn(e)),[e,t])},wp=e=>{let{isReloadScheduled:t,uiState:o,data:r,errorDetail:s}=e0(jn),i=WS(),n=oa(e),a=!!r;return ym.useEffect(()=>{t&&t0(o,a)&&n(),i(Nd())},[n,i,t,a,o]),ym.useEffect(()=>{n();let l=window.setInterval(()=>i(Jr()),bs);return()=>{clearInterval(l),i(Nd()),i($y())}},[i,n]),{cluster:r,uiState:o,errorDetail:s}};import Oo from"react";import Z2 from"classnames";import Fe from"react";import{useDispatch as HB,useSelector as yI}from"react-redux";import{Formik as OB,useFormikContext as LB}from"formik";import{Form as MB,Grid as vI,GridItem as Dm,Text as _B,TextContent as WB}from"@patternfly/react-core";import zS from"react";var BS=zS.createContext(null),ke=()=>{let e=zS.useContext(BS);if(!e)throw new Error("useClusterWizardContext must be used within ClusterWizardContextProvider");return e},US=BS;import ps from"react";import{useHistory as n0}from"react-router-dom";import{Alert as a0,AlertGroup as l0,AlertVariant as p0}from"@patternfly/react-core";import o0 from"react";import{Alert as r0,AlertVariant as s0}from"@patternfly/react-core";var i0={vsphere:"vSphere",nutanix:"Nutanix"},GS={vsphere:Is,nutanix:Ru},$S=({clusterId:e,platformType:t})=>{let{isPlatformIntegrationSupported:o,supportedPlatformIntegration:r}=ns(e);if(!(o&&!So({platform:{type:t}})))return null;let i=i0[r];return o0.createElement(r0,{title:`Discover the full potential of ${i} integration`,variant:s0.info,isInline:!0,"data-testid":"discover-platform-integration-hosts"},`Since all of your hosts originated from the ${i} platform, you now have the option to integrate with it.`)};var u0="Provided cluster configuration is not valid",c0=({cluster:e,errorFields:t=[],alertTitle:o,alertContent:r})=>{let{currentStepId:s}=ke(),i=e&&Pg(e),{t:n}=f(),a=r;return a===void 0&&(a=`The following fields are invalid or missing:
|
|
29
|
+
${t.map(l=>zu(n)[l]||l).join(", ")}.`),ps.createElement(l0,null,!!t.length&&ps.createElement(a0,{variant:p0.danger,title:o||u0,isInline:!0},a),s==="host-discovery"&&e&&ps.createElement($S,{clusterId:e.id,platformType:e.platform?.type||"none"}),e&&ps.createElement(Oc,{currentStepId:s,clusterStatus:e.status,hosts:e?.hosts||[],validationsInfo:i,wizardStepsValidationsMap:Ye}))},d0=({cluster:e,additionalActions:t,errorFields:o,alertTitle:r,alertContent:s,onCancel:i,...n})=>{let{alerts:a}=N(),l=n0(),p=ps.useCallback(()=>l.push(`${ue}/clusters/`),[l]),u=a.length?ps.createElement(gr,null):void 0;return ps.createElement($r,{alerts:u,errors:ps.createElement(c0,{cluster:e,errorFields:o,alertTitle:r,alertContent:s}),onCancel:i||p,leftExtraActions:t,cluster:e,onFetchEvents:Do,...n})},_t=d0;import Ep from"react";import{WizardNav as YS}from"@patternfly/react-core";var ra={"cluster-details":"Cluster details",operators:"Operators","host-discovery":"Host discovery","static-ip-yaml-view":"Static network configurations","static-ip-network-wide-configurations":"Network-wide configurations","static-ip-host-configurations":"Host specific configurations",storage:"Storage",networking:"Networking",review:"Review and create"},qS=["cluster-details","operators","host-discovery","storage","networking","review"],Dp=["static-ip-network-wide-configurations","static-ip-host-configurations"];var m0=(e,t)=>{if(!t)return!0;switch(e){case"cluster-details":return!t.validationsInfo||os({cluster:t});case"static-ip-yaml-view":case"static-ip-host-configurations":case"static-ip-network-wide-configurations":return os({cluster:t});case"host-discovery":return np({cluster:t});case"storage":return ap({cluster:t});case"networking":return lp({cluster:t});default:return!0}},f0=({cluster:e})=>{let t=ke(),o=a=>!t.wizardStepIds.slice(a).includes(t.currentStepId),r=(a,l)=>l==="cluster-details"?!1:o(a),s=(a,l)=>Ep.createElement(fl,{step:a,key:l,content:ra[l],onNavItemClick:()=>t.setCurrentStepId(l),isCurrent:t.currentStepId===l,isDisabled:r(a,l),isValid:()=>m0(l,e)}),i=a=>Ep.createElement(fl,{step:a,isExpandable:!0,content:"Static network configurations",key:"static-network-configuration-form-view",isCurrent:zs(t.currentStepId),isDisabled:o(a)},Ep.createElement(YS,{returnList:!0},Dp.map((l,p)=>s(a+p,l))));return Ep.createElement(YS,null,(()=>{let a=[],l=0;for(;l<t.wizardStepIds.length;){let p=t.wizardStepIds[l];p!=="static-ip-network-wide-configurations"?(a.push(s(l,p)),l+=1):(a.push(i(l)),l+=2)}return a})())},xt=f0;import{Fragment as x0,createElement as Ap}from"react";import{createElement as vm,useCallback as I0,useMemo as S0}from"react";import{sortable as C0}from"@patternfly/react-table";import g0 from"react";var h0=e=>{let t=Fn("networking",Ye,e.host),o=ki[t],r=An(e.validationsInfo,"networking",Ye),s=Cl(r,"networking",Ye)?"Some validations failed":void 0;return g0.createElement(Vs,{...e,status:{...o,sublabel:s},validationsInfo:r,AdditionalNTPSourcesDialogToggleComponent:Po})},jS=h0;var y0=e=>({header:{title:"Status",transforms:[C0]},cell:t=>{let o=e?()=>e(t):void 0,r=O(t.validationsInfo)||{};return{title:vm(jS,{host:t,onEditHostname:o,validationsInfo:r}),props:{"data-testid":"nic-status"},sortableValue:status}}}),v0=({cluster:e,AdditionalNTPSourcesDialogToggleComponent:t,onEditHost:o,onEditRole:r,canEditRole:s,canEditHostname:i,actionResolver:n,children:a,onSelect:l,selectedIDs:p})=>{let{t:u}=f(),c=S0(()=>[Jo(u,o,void 0,i),Zr(u,s,r,io(e)),y0(o),nv(e),av(e),lv(e),pv(e),Qr(e)],[u,o,r,i,s,e]),d=e.hosts||[],m=Zo(d.length),g=I0(({obj:h})=>vm(Ws,{host:h,AdditionalNTPSourcesDialogToggleComponent:t}),[t]);return vm(ts,{testId:"networking-host-table",hosts:d,ExpandComponent:g,content:c,actionResolver:n,onSelect:l,selectedIDs:p,...m},a)},RS=v0;var b0=({cluster:e})=>{let{actionChecks:t,onEditHost:o,actionResolver:r,...s}=rs(e);return Ap(x0,null,Ap(RS,{cluster:e,AdditionalNTPSourcesDialogToggleComponent:Po,onEditHost:o,canEditHostname:t.canEditHostname,actionResolver:r},Ap(Fv,{isSNO:le(e)})),Ap(ss,{cluster:e,...s}))},KS=b0;import sa from"react";function Pr(e,t){let[o,r]=sa.useState(),[s,i]=sa.useState(""),{infraEnvId:n,error:a}=Cp(e,t),l=sa.useCallback(async()=>{try{if(n){let{data:u}=await Ae.get(n);r(u)}}catch(u){i(Ge(u))}},[n]),p=sa.useCallback(async u=>{if(!n)throw"updateInfraEnv should not be called before infra env was loaded";Ae.abortLastGetRequest();let{data:c}=await Ae.update(n,u);return r(c),c},[n]);return sa.useEffect(()=>{a?i(a):o||l()},[l,o,n,a]),{infraEnv:o,error:s,isLoading:!o&&!s,updateInfraEnv:p}}import{array as P0,lazy as k0,object as T0}from"yup";var XS=(e,t)=>{let o=le(e),r=hi(e);return{apiVip:e.apiVip||"",ingressVip:e.ingressVip||"",sshPublicKey:e.sshPublicKey||"",vipDhcpAllocation:e.vipDhcpAllocation,managedNetworkingType:e.userManagedNetworking?"userManaged":"clusterManaged",networkType:e.networkType||$g(o,r),machineNetworks:e.machineNetworks||[],stackType:r?wt:yo,clusterNetworks:e.clusterNetworks||(r?t.clusterNetworksDualstack:t.clusterNetworksIpv4),serviceNetworks:e.serviceNetworks||(r?t.serviceNetworksDualstack:t.serviceNetworksIpv4)}},JS=(e,t)=>k0(o=>T0().shape({apiVip:Cc(t,o,e.apiVip),ingressVip:Cc(t,o,e.ingressVip),sshPublicKey:el,machineNetworks:o.managedNetworkingType==="userManaged"?P0():lh.when("stackType",{is:yo,then:sl,otherwise:o.machineNetworks&&o.machineNetworks?.length>=2&&rl("machine networks")}),clusterNetworks:ph.when("stackType",{is:yo,then:sl,otherwise:o.clusterNetworks&&o.clusterNetworks?.length>=2&&rl("cluster network")}),serviceNetworks:uh.when("stackType",{is:yo,then:sl,otherwise:o.serviceNetworks&&o.serviceNetworks?.length>=2&&rl("service network")})}));import Qe from"react";import{useFormikContext as kB}from"formik";import{useSelector as TB}from"react-redux";import{Alert as PB,AlertVariant as wB,Grid as DB,Tooltip as EB}from"@patternfly/react-core";import fe from"react";import{useSelector as F0}from"react-redux";import{useFormikContext as V0}from"formik";import{Spinner as N0,Alert as H0,AlertVariant as O0,Tooltip as L0}from"@patternfly/react-core";import{createElement as tI,forwardRef as A0}from"react";import{useSelector as ZS}from"react-redux";import{Checkbox as w0,Radio as D0}from"@patternfly/react-core";function us(e){return function(o){let{isViewerMode:r}=ZS(R),s=o.isDisabled||r;return tI(e,{...o,isDisabled:s})}}function E0(e){return A0(function(o,r){let{isViewerMode:s}=ZS(R),i=o.isDisabled||s;return tI(e,{ref:r,...o,isDisabled:i})})}var Be=us(St),$s=us(on),po=us(Lr),Fp=us(li),Sm=us(Ke),QS=us(sc),Vp=us(w0),Im=us(D0),eI=E0(ws);var oI=({vipName:e,cluster:t,validationErrorMessage:o})=>{let{vipDhcpAllocation:r}=t,s=Ds(t);return r&&t[e]?fe.createElement(fe.Fragment,null,t[e]):r&&o?fe.createElement(H0,{variant:O0.danger,title:"The DHCP server failed to allocate the IP",isInline:!0},o):r&&s?fe.createElement(fe.Fragment,null,fe.createElement(N0,{size:"md"}),fe.createElement("i",null," This IP is being allocated by the DHCP server")):fe.createElement("i",null,"This IP will be allocated by the DHCP server")},rI=(e,t,o)=>o?t&&e?"This IP was allocated by the DHCP server.":"":"Make sure that the VIP is unique and not used by any other device on your network.",M0=e=>{let t=O(e)||{},o=["VIP IP allocation from DHCP server has been timed out","IP allocation from the DHCP server timed out."];return(t.network||[]).reduce((r,s)=>(["api-vip-defined","ingress-vip-defined"].includes(s.id)&&(r[s.id]=s.status==="failure"&&o.find(i=>s.message.match(i))?s.message:void 0),r),{})},sI=({cluster:e,isVipDhcpAllocationDisabled:t})=>{let{values:o,setFieldValue:r}=V0(),{isViewerMode:s}=F0(R),i=`Provide an endpoint for users, both human and machine, to interact with and configure the platform. If needed, contact your IT manager for more information. ${rI(e.apiVip,e.vipDhcpAllocation,o.vipDhcpAllocation)}`,n=`Provide an endpoint for application traffic flowing in from outside the cluster. If needed, contact your IT manager for more information. ${rI(e.ingressVip,e.vipDhcpAllocation,o.vipDhcpAllocation)}`,{"api-vip-defined":a,"ingress-vip-defined":l}=fe.useMemo(()=>M0(e.validationsInfo),[e.validationsInfo]),p=o.networkType===Co;fe.useEffect(()=>{!s&&!p&&r("vipDhcpAllocation",!1)},[p,s,r]);let u=fe.useCallback(c=>{r("apiVip",c?"":e.apiVip),r("ingressVip",c?"":e.ingressVip)},[e.apiVip,e.ingressVip,r]);return fe.createElement(fe.Fragment,null,!t&&fe.createElement(po,{onChange:u,label:fe.createElement(fe.Fragment,null,fe.createElement(L0,{hidden:p,content:"A cluster with OVN networking type cannot use 'allocate IPs via DHCP server'"},fe.createElement("span",null,"Allocate IPs via DHCP server")),fe.createElement(so,{featureId:"VIP_AUTO_ALLOC",openshiftVersion:e.openshiftVersion})),name:"vipDhcpAllocation",isDisabled:!p}),o.vipDhcpAllocation?fe.createElement(fe.Fragment,null,fe.createElement(nl,{label:"API IP",name:"apiVip",helperText:i,value:o.apiVip||"",isValid:!a,isRequired:!0},fe.createElement(oI,{vipName:"apiVip",cluster:e,validationErrorMessage:a})),fe.createElement(nl,{label:"Ingress IP",name:"ingressVip",helperText:n,value:o.ingressVip||"",isValid:!l,isRequired:!0},fe.createElement(oI,{vipName:"ingressVip",cluster:e,validationErrorMessage:l}))):fe.createElement(fe.Fragment,null,fe.createElement(Be,{label:"API IP",name:"apiVip",helperText:i,isRequired:!0}),fe.createElement(Be,{name:"ingressVip",label:"Ingress IP",helperText:n,isRequired:!0})))};import MSe from"react";import{Alert as WSe,AlertActionLink as zSe,AlertVariant as BSe,Popover as USe}from"@patternfly/react-core";import Qo from"react";import{List as _0,ListItem as Np,Text as W0,TextContent as z0}from"@patternfly/react-core";import{Trans as B0}from"react-i18next";var bm=({shouldDisplayLoadBalancersBullet:e=!1})=>{let{t}=f();return Qo.createElement(z0,null,Qo.createElement(W0,{component:"p"},Qo.createElement(B0,{t},"ai:Please refer to the"," ",Qo.createElement(ot,{href:Du},"OpenShift networking documentation")," ","to configure your cluster's networking, including:")),Qo.createElement(_0,null,Qo.createElement(Np,null,t("ai:DHCP or static IP Addresses")),Qo.createElement(ee,{condition:e},Qo.createElement(Np,null,t("ai:Load balancers"))),Qo.createElement(Np,null,t("ai:Network ports")),Qo.createElement(Np,null,t("ai:DNS"))))};import xm from"react";import{FormGroup as $0}from"@patternfly/react-core";import iI from"react";import{Tooltip as U0}from"@patternfly/react-core";var G0=({tooltipProps:e,...t})=>iI.createElement(U0,{...e},iI.createElement(Ke,{...t})),Ui=G0;var km="managedNetworkingType",Tm=({disabled:e=!1,tooltip:t})=>{let o={hidden:!t||!e,content:t,position:"top"},{t:r}=f();return xm.createElement($0,{label:r("ai:Network Management"),fieldId:T(km,"radio"),isInline:!0},xm.createElement(Ui,{tooltipProps:o,name:km,isDisabled:e,value:"clusterManaged",label:r("ai:Cluster-Managed Networking")}),xm.createElement(Ui,{tooltipProps:o,name:km,isDisabled:e,value:"userManaged",label:r("ai:User-Managed Networking")}))};import fIe from"react";import{useFormikContext as hIe}from"formik";import{Spinner as yIe,Alert as vIe,AlertVariant as SIe}from"@patternfly/react-core";import Ze from"react";import{useSelector as q0}from"react-redux";import{ButtonVariant as Y0,FormGroup as j0,Tooltip as R0}from"@patternfly/react-core";import{useFormikContext as K0}from"formik";import{Address6 as X0}from"ip-address";var J0=(e,t,o,r)=>e&&t&&(r.machineNetworks&&r.machineNetworks[1].cidr!==o||r.clusterNetworks&&r.clusterNetworks[1].cidr!==e[1].cidr||r.clusterNetworks&&r.clusterNetworks[1].hostPrefix!==e[1].hostPrefix||r.serviceNetworks&&r.serviceNetworks[1].cidr!==t[1].cidr),nI=({clusterId:e,isDualStackSelectable:t,hostSubnets:o})=>{let{setFieldValue:r,values:s,validateForm:i}=K0(),[n,a]=Ze.useState(!1),l=_i(["clusterNetworksDualstack","clusterNetworksIpv4","serviceNetworksDualstack","serviceNetworksIpv4"]),p=o.filter(C=>X0.isValid(C.subnet)),u=p.length>=1?p[0].subnet:qt,{isViewerMode:c}=q0(R),d=!c&&!t&&s.stackType===wt,m=Ze.useCallback(()=>{r("stackType",yo),s.machineNetworks&&s.machineNetworks?.length>=2&&r("machineNetworks",s.machineNetworks.slice(0,1)),s.clusterNetworks&&s.clusterNetworks?.length>=2&&r("clusterNetworks",s.clusterNetworks.slice(0,1)),s.serviceNetworks&&s.serviceNetworks?.length>=2&&r("serviceNetworks",s.serviceNetworks.slice(0,1)),i()},[r,i,s.clusterNetworks,s.machineNetworks,s.serviceNetworks]),g=()=>{r("stackType",wt),r("vipDhcpAllocation",!1),s.networkType===Co&&r("networkType",Ts),s.machineNetworks&&s.machineNetworks?.length<2&&r("machineNetworks",[...s.machineNetworks,{cidr:u,clusterId:e}],!1),s.clusterNetworks&&s.clusterNetworks?.length<2&&r("clusterNetworks",[...s.clusterNetworks,l.clusterNetworksDualstack?.length?l.clusterNetworksDualstack[1]:{cidr:"",hostPrefix:"",clusterId:e}],!1),s.serviceNetworks&&s.serviceNetworks?.length<2&&r("serviceNetworks",[...s.serviceNetworks,l.serviceNetworksDualstack?.length?l.serviceNetworksDualstack[1]:{cidr:"",clusterId:e}],!1)},h=C=>{C.target.value===wt?g():J0(l.clusterNetworksDualstack||[],l.serviceNetworksDualstack||[],u,s)?a(!0):m()};return Ze.useEffect(()=>{d&&m()},[d,m]),Ze.createElement(R0,{content:"Dual-stack is only available when your hosts are using IPV4 together with IPV6.",hidden:t,position:"top-start"},Ze.createElement(Ze.Fragment,null,Ze.createElement(j0,{label:"Networking stack type",fieldId:T("stackType","radio"),isInline:!0,onChange:h},Ze.createElement(Sm,{name:"stackType",value:yo,isDisabled:!t,label:Ze.createElement(Ze.Fragment,null,"IPv4"," ",Ze.createElement(W,{noVerticalAlign:!0,bodyContent:"Select this when your hosts are using only IPv4."}))}),Ze.createElement(Sm,{name:"stackType",value:wt,isDisabled:!t,label:Ze.createElement(Ze.Fragment,null,"Dual-stack"," ",Ze.createElement(W,{noVerticalAlign:!0,bodyContent:"Select dual-stack when your hosts are using IPV4 together with IPV6."}))})),n&&Ze.createElement(Fs,{title:"Change stack type?",titleIconVariant:"warning",confirmationButtonText:"Change",confirmationButtonVariant:Y0.primary,content:Ze.createElement(Ze.Fragment,null,Ze.createElement("p",null,"All data and configuration done for 'Dual-stack' will be lost.")),onClose:()=>{a(!1),g()},onConfirm:()=>{a(!1),m()}})))};import wr,{useEffect as Z0}from"react";import{useSelector as Q0}from"react-redux";import{Alert as eB,AlertVariant as tB,FormGroup as oB,Stack as rB,StackItem as aI}from"@patternfly/react-core";import{FieldArray as sB,useFormikContext as iB}from"formik";import{Address4 as nB,Address6 as aB}from"ip-address";var lI=(e,t)=>e.humanized.localeCompare(t.humanized),lB=e=>e.map((t,o)=>({label:t.humanized,value:t.subnet,isDisabled:!1,id:`form-input-hostSubnet-field-option-${o}`})),pB=e=>({label:`Please select a subnet. (${e} available)`,value:qt,isDisabled:!0,id:"form-input-hostSubnet-field-option-no-subnet-selected"}),uB={label:"No subnets are currently available",value:qt,id:"form-input-hostSubnet-field-option-no-subnet-available"},cB=(e,t,o,r)=>{Z0(()=>{e&&t("machineNetworks",[{cidr:o,clusterId:r}],!0)},[e,o,r,t])},pI=({clusterId:e,hostSubnets:t,isRequired:o=!1,isDisabled:r})=>{let{values:s,errors:i,setFieldValue:n}=iB(),a=s.stackType===wt,{isViewerMode:l}=Q0(R),p=t.filter(h=>nB.isValid(h.subnet)).sort(lI),u=t.filter(h=>aB.isValid(h.subnet)).sort(lI),c=p.length>=1?p[0].subnet:qt,d=(s.machineNetworks??[]).length===0;cB(!l&&d,n,c,e);let g=wr.useMemo(()=>h=>h.length===0?[uB]:[pB(h.length)].concat(lB(h)),[]);return wr.createElement(oB,{label:"Machine network",labelInfo:a&&"Primary",fieldId:"machine-networks",isRequired:!0},wr.createElement(sB,{name:"machineNetworks"},()=>wr.createElement(rB,null,a?s.machineNetworks?.map((h,C)=>{let I=C===1?u:p;return wr.createElement(aI,{key:C},wr.createElement($s,{name:`machineNetworks.${C}.cidr`,options:g(I),isRequired:o,isDisabled:r}))}):wr.createElement(aI,null,wr.createElement($s,{name:"machineNetworks.0.cidr",options:g(p),isRequired:o,isDisabled:r})))),typeof i.machineNetworks=="string"&&wr.createElement(eB,{variant:tB.warning,title:i.machineNetworks,isInline:!0}))};import Wt from"react";import{Alert as uI,AlertVariant as cI,FormGroup as dI,StackItem as Pm,TextInputTypes as dB,Grid as mB,Stack as fB}from"@patternfly/react-core";import{FieldArray as mI,useFormikContext as gB}from"formik";var fI=(e,t)=>t?` (${e===0?"IPv4":"IPv6"})`:"",hB="The subnet prefix length to assign to each individual node. For example, if Cluster Network Host Prefix is set to 23, then each node is assigned a /23 subnet out of the given cidr (clusterNetworkCIDR), which allows for 510 (2^(32 - 23) - 2) pod IPs addresses. If you are required to provide access to nodes from an external network, configure load balancers and routers to manage the traffic.",CB="The subnet prefix length to assign to each individual node. For example, if Cluster Network Host Prefix is set to 116, then each node is assigned a /116 subnet out of the given cidr (clusterNetworkCIDR), which allows for 4,094 (2^(128 - 116) - 2) pod IPs addresses. If you are required to provide access to nodes from an external network, configure load balancers and routers to manage the traffic.",yB="IP address block from which Pod IPs are allocated. This block must not overlap with existing physical networks. These IP addresses are used for the Pod network, and if you need to access the Pods from an external network, configure load balancers and routers to manage the traffic.",vB="The IP address pool to use for service IP addresses. You can enter only one IP address pool. If you need to access the services from an external network, configure load balancers and routers to manage the traffic.",SB=()=>{let{setFieldValue:e,values:t,errors:o}=gB(),r=t.stackType===wt,s=l=>parseInt((t.clusterNetworks&&t.clusterNetworks[l].cidr||"").split("/")[1])||1,i=(l,p)=>{isNaN(parseInt(l.target.value))&&e(`clusterNetworks.${p}.hostPrefix`,s(p))},n=l=>r?!!l:!1,a=l=>n(l)?CB:hB;return Wt.createElement(mB,{hasGutter:!0,className:"pf-u-ml-lg"},Wt.createElement(mI,{name:"clusterNetworks"},()=>Wt.createElement(dI,{fieldId:"clusterNetworks",labelInfo:r&&"Primary"},t.clusterNetworks?.map((l,p)=>{let u=fI(p,r);return Wt.createElement(fB,{key:p},Wt.createElement(Pm,{className:"network-field-group pf-u-pb-md"},Wt.createElement(Be,{name:`clusterNetworks.${p}.cidr`,label:`Cluster network CIDR${u}`,helperText:yB,isRequired:!0,labelInfo:p===0&&r?"Primary":""})),Wt.createElement(Pm,{className:"network-field-group pf-u-pb-md"},Wt.createElement(Be,{name:`clusterNetworks.${p}.hostPrefix`,label:`Cluster network host prefix${u}`,type:dB.number,min:s(p),max:n(p)?za.IPv6:za.IPv4,onBlur:c=>i(c,p),helperText:a(p),isRequired:!0})))}))),typeof o.clusterNetworks=="string"&&Wt.createElement(uI,{variant:cI.warning,title:o.clusterNetworks,isInline:!0}),Wt.createElement(mI,{name:"serviceNetworks"},()=>Wt.createElement(dI,{fieldId:"serviceNetworks",labelInfo:r&&"Primary"},t.serviceNetworks?.map((l,p)=>Wt.createElement(Pm,{key:p,className:"network-field-group pf-u-pb-md"},Wt.createElement(Be,{name:`serviceNetworks.${p}.cidr`,label:`Service network CIDR${fI(p,r)}`,helperText:vB,isRequired:!0,labelInfo:p===0&&r?"Primary":""}))))),typeof o.serviceNetworks=="string"&&Wt.createElement(uI,{variant:cI.warning,title:o.serviceNetworks,isInline:!0}))},gI=SB;import zt from"react";import{Split as IB,SplitItem as wm,Tooltip as bB,FormGroup as xB}from"@patternfly/react-core";var ia="networkType",hI=({isDisabled:e=!1,isSDNSelectable:t})=>{let{t:o}=f();return zt.createElement(xB,{fieldId:ia,label:"Network type"},zt.createElement(IB,{hasGutter:!0},zt.createElement(wm,null,zt.createElement(bB,{hidden:t,content:o("ai:Software-Defined Networking (SDN) cannot be selected for SNO clusters or when IPv6 is detected.")},zt.createElement(Ke,{id:ia,name:ia,isDisabled:e||!t,value:Co,label:zt.createElement(zt.Fragment,null,o("ai:Software-Defined Networking (SDN)")," ",zt.createElement(W,{noVerticalAlign:!0,bodyContent:"The classic bullet-proof networking type"}))}))),zt.createElement(wm,null),zt.createElement(wm,null,zt.createElement(Ke,{id:ia,name:ia,isDisabled:e,value:Ts,label:zt.createElement(zt.Fragment,null,o("ai:Open Virtual Networking (OVN)")," ",zt.createElement(W,{noVerticalAlign:!0,bodyContent:"The next generation networking type, select this when you're using new features and telco features"}))}))))};var AB=Qe.createElement(PB,{title:"Your cluster will be subject to support limitations",variant:wB.info,isInline:!0,"data-testid":"networking-vms-alert"},"Some or all of your discovered hosts are virtual machines, so selecting the cluster-managed networking option will limit your installed cluster's support."),FB=(e,t)=>!(Bg(e.serviceNetworks||[],t.serviceNetworksIpv4||[])&&Ug(e.clusterNetworks||[],t.clusterNetworksIpv4||[])),VB=(e,t,o,r)=>e?{isNetworkManagementDisabled:!0,networkManagementDisabledReason:"Network management selection is not supported with dual-stack"}:t&&o===L.ARM&&!r.isFeatureSupported(t,"ARM64_ARCHITECTURE_WITH_CLUSTER_MANAGED_NETWORKING")?{isNetworkManagementDisabled:!0,networkManagementDisabledReason:r.getFeatureDisabledReason(t,"ARM64_ARCHITECTURE_WITH_CLUSTER_MANAGED_NETWORKING")}:!!t&&r.isFeatureDisabled(t,"NETWORK_TYPE_SELECTION")?{isNetworkManagementDisabled:!0,networkManagementDisabledReason:r.getFeatureDisabledReason(t,"NETWORK_TYPE_SELECTION")}:{isNetworkManagementDisabled:!1,networkManagementDisabledReason:void 0},NB=({cluster:e,hostSubnets:t,isVipDhcpAllocationDisabled:o,defaultNetworkSettings:r,hideManagedNetworking:s})=>{let{t:i}=f(),n=be(),{setFieldValue:a,values:l,validateField:p}=kB(),u=Qe.useMemo(()=>vp(e,n,i),[e,n,i]),c=le(e),d=!c,m=l.managedNetworkingType==="userManaged",g=l.stackType===wt,{isViewerMode:h}=TB(R),C=!h&&g&&!m,I=Qe.useMemo(()=>qg(t),[t]),S=Qe.useMemo(()=>Gg(c,g),[c,g]),[y,v]=Qe.useState(g||FB(e,r));Qe.useEffect(()=>{m?(a("vipDhcpAllocation",!1),a("ingressVip","",!1),a("apiVip","",!1),d&&a("machineNetworks",[],!1)):l.vipDhcpAllocation||(p("ingressVip"),p("apiVip"))},[d,m,l.vipDhcpAllocation,a,p]);let w=Qe.useCallback(q=>{v(q),q||(a("clusterNetworks",g?r.clusterNetworksDualstack:r.clusterNetworksIpv4,!0),a("serviceNetworks",g?r.serviceNetworksDualstack:r.serviceNetworksIpv4,!0))},[a,g,r.clusterNetworksDualstack,r.clusterNetworksIpv4,r.serviceNetworksDualstack,r.serviceNetworksIpv4]);Qe.useEffect(()=>{C&&w(!0)},[C,w]);let{isNetworkManagementDisabled:E,networkManagementDisabledReason:F}=Qe.useMemo(()=>VB(g,e.openshiftVersion,e.cpuArchitecture,n),[e.cpuArchitecture,e.openshiftVersion,n,g]);return Qe.createElement(DB,{hasGutter:!0},!s&&Qe.createElement(Tm,{disabled:h||E,tooltip:F}),m&&Qe.createElement(bm,{shouldDisplayLoadBalancersBullet:d}),!m&&!!u&&u.CLUSTER_MANAGED_NETWORKING_WITH_VMS==="unsupported"&&AB,(c||!m)&&Qe.createElement(nI,{clusterId:e.id,isDualStackSelectable:I,hostSubnets:t}),Qe.createElement(hI,{isDisabled:h,isSDNSelectable:S}),!(m&&d)&&Qe.createElement(pI,{clusterId:e.id,hostSubnets:t,isRequired:!m,isDisabled:e.vipDhcpAllocation&&e.apiVip===void 0&&e.ingressVip===void 0||!1}),!m&&Qe.createElement(sI,{cluster:e,isVipDhcpAllocationDisabled:o}),Qe.createElement(EB,{content:"Advanced networking properties must be configured in dual-stack",hidden:!g,position:"top-start"},Qe.createElement(Vp,{id:"useAdvancedNetworking",label:"Use advanced networking",description:"Configure advanced networking properties (e.g. CIDR ranges).",isChecked:y,onChange:w,isDisabled:g})),y&&Qe.createElement(gI,null))},CI=NB;var zB=({cluster:e,hostSubnets:t,defaultNetworkSettings:o,infraEnv:r})=>{let{alerts:s}=N(),i=ke(),{isViewerMode:n}=yI(R),{errors:a,touched:l,isSubmitting:p,isValid:u,setFieldValue:c,values:d}=LB(),m=ho(),g=ro(a,l),h=Fe.useMemo(()=>e.platform?.type==="nutanix",[]);Fe.useEffect(()=>{h&&d.vipDhcpAllocation&&c("vipDhcpAllocation",!1)},[h,c,d.vipDhcpAllocation]);let C=Fe.createElement(_t,{cluster:e,errorFields:g,isSubmitting:p,isNextDisabled:p||m||!!s.length||!u||!lp({cluster:e}),onNext:()=>i.moveNext(),onBack:()=>i.moveBack()});return Fe.createElement(ye,{navigation:Fe.createElement(xt,{cluster:e}),footer:C},Fe.createElement(MB,null,Fe.createElement(vI,{hasGutter:!0},Fe.createElement(Dm,null,Fe.createElement(Xe,null,"Networking")),Fe.createElement(Dm,{span:12,lg:10,xl:9,xl2:7},Fe.createElement(vI,{hasGutter:!0},Fe.createElement(CI,{cluster:e,hostSubnets:t,defaultNetworkSettings:o,isVipDhcpAllocationDisabled:h}),Fe.createElement(ud,{clusterSshKey:e.sshPublicKey,imageSshKey:r?.sshAuthorizedKey,isDisabled:n}))),Fe.createElement(Dm,null,Fe.createElement(WB,null,Fe.createElement(_B,{component:"h2"},"Host inventory")),Fe.createElement(KS,{cluster:e})))))},BB=({cluster:e})=>{let{infraEnv:t,error:o,isLoading:r}=Pr(e.id,L.USE_DAY1_ARCHITECTURE),s=_i(["clusterNetworksDualstack","clusterNetworksIpv4","serviceNetworksDualstack","serviceNetworksIpv4"]),{addAlert:i,clearAlerts:n,alerts:a}=N(),l=HB(),{isViewerMode:p}=yI(R),u=Fe.useMemo(()=>zg(e),[e]),c=Fe.useMemo(()=>XS(e,s),[]),d=Fe.useMemo(()=>JS(c,u),[u,c]);Fe.useEffect(()=>{if(o){let h=`Failed to retrieve infra env (clusterId: ${e.id})`;if(a.find(C=>C.title===h))return;Lo(o,h),i({title:h,message:o})}},[o]);let m=async h=>{n();try{let C=!le(e),I=h.managedNetworkingType==="userManaged",S={apiVip:h.apiVip,ingressVip:h.ingressVip,sshPublicKey:h.sshPublicKey,vipDhcpAllocation:h.vipDhcpAllocation,networkType:h.networkType,machineNetworks:h.machineNetworks,clusterNetworks:h.clusterNetworks,serviceNetworks:h.serviceNetworks,userManagedNetworking:I};S.userManagedNetworking?(delete S.apiVip,delete S.ingressVip,C&&delete S.machineNetworks):h.vipDhcpAllocation?(delete S.apiVip,delete S.ingressVip):h.stackType===yo&&(S.machineNetworks=[]);let{data:y}=await re.update(e.id,e.tags,S);l(Gy(y))}catch(C){x(C,()=>i({title:"Failed to update the cluster",message:D(C)}))}};return r?Fe.createElement(z,null):Fe.createElement(OB,{initialValues:c,validationSchema:d,onSubmit:p?()=>Promise.resolve():m,validateOnMount:!0},Fe.createElement(zB,{cluster:e,hostSubnets:u,defaultNetworkSettings:s,infraEnv:t}))},SI=BB;import er from"react";import{useDispatch as YB,useSelector as jB}from"react-redux";import{ActionListItem as RB,Button as KB,ButtonVariant as XB,Grid as JB,GridItem as bI}from"@patternfly/react-core";import Ve from"react";import{ExclamationTriangleIcon as UB}from"@patternfly/react-icons";import{global_warning_color_100 as GB}from"@patternfly/react-tokens";var $B=({platformType:e})=>{let t=e?GS[e]:"";return Ve.createElement("p",null,Ve.createElement(UB,{color:GB.value,size:"sm"})," You will need to modify your platform configuration after cluster installation is completed."," ",Ve.createElement("a",{href:t,target:"_blank",rel:"noopener noreferrer","data-ouia-component-id":"vm-integration-kb-page"},"Learn more ",Ve.createElement("i",{className:"fas fa-external-link-alt"})))},qB=({cluster:e})=>{let t=ke(),{t:o}=f();return Ve.createElement(It,null,Ve.createElement(A,{title:"Cluster address",value:`${e.name||""}.${e.baseDnsDomain||""}`,testId:"cluster-address"}),Ve.createElement(Ip,{cluster:e}),Ve.createElement(A,{title:o("ai:Stack type"),value:hi(e)?"Dual-stack":"IPv4",testId:"stack-type"}),Ve.createElement(A,{title:"CPU architecture",value:e.cpuArchitecture,testId:"cpu-architecture"}),e.machineNetworks?.length&&Ve.createElement(A,{title:"Cluster network CIDR",value:Ve.createElement(Ve.Fragment,null,e.clusterNetworks?.map(r=>Ve.createElement("span",{key:r.cidr},r.cidr,Ve.createElement("br",null)))),testId:"network-cidr"}),Ve.createElement(A,{title:"Cluster summary",testId:"cluster-summary",value:Ve.createElement(Qc,{hosts:e.hosts})}),Ve.createElement(A,{title:"Cluster validations",value:Ve.createElement(ed,{validationsInfo:e.validationsInfo,setCurrentStepId:r=>t.setCurrentStepId(r),wizardStepNames:ra,wizardStepsValidationsMap:Ye}),testId:"cluster-validations"}),Ve.createElement(A,{title:"Host validations",value:Ve.createElement(td,{hosts:e.hosts,setCurrentStepId:r=>t.setCurrentStepId(r),wizardStepNames:ra,allClusterWizardSoftValidationIds:$v,wizardStepsValidationsMap:Ye}),testId:"host-validations"}),Ve.createElement(ee,{condition:So(e)},Ve.createElement(A,{title:"Platform integration",value:Ve.createElement($B,{platformType:e.platform?.type}),testId:"platform-integration"})),Ve.createElement(Qn,{cluster:e}))},II=qB;var ZB=({cluster:e})=>{let{addAlert:t}=N(),o=ke(),{isViewerMode:r}=jB(R),[s,i]=qo(!1),n=YB(),a=async()=>{i(!0);try{let{data:p}=await re.install(e.id,e.tags);n(qe(p)),i(!1)}catch(p){x(p,()=>t({title:"Failed to start cluster installation",message:D(p)})),i(!1)}},l=er.createElement(_t,{cluster:e,onBack:()=>o.moveBack(),isSubmitting:s,submittingText:"Starting installation...",additionalActions:er.createElement(RB,null,er.createElement(KB,{variant:XB.primary,name:"install",onClick:a,isDisabled:r||s||e.status!=="ready"},"Install cluster"))});return er.createElement(ye,{navigation:er.createElement(xt,{cluster:e}),footer:l},er.createElement(JB,{hasGutter:!0},er.createElement(bI,null,er.createElement(Xe,null,"Review and create")),er.createElement(bI,null,er.createElement(II,{cluster:e}))))},xI=ZB;import ds from"react";import ZU from"lodash/omit";import{useHistory as QU}from"react-router-dom";import{useDispatch as eG}from"react-redux";import uo from"react";import{useSelector as YU}from"react-redux";import{useLocation as jU}from"react-router-dom";import{Grid as RU,GridItem as GI}from"@patternfly/react-core";import KU from"lodash/isUndefined";import{Formik as XU}from"formik";import{Fragment as GU,createElement as gt,useEffect as qU,useRef as $U}from"react";import{Form as zU}from"@patternfly/react-core";import{useFormikContext as BU}from"formik";import{Fragment as iU,createElement as cs,useCallback as aU,useEffect as lU,useRef as nU}from"react";import{FormGroup as QB,Tooltip as eU}from"@patternfly/react-core";import{useField as tU,useFormikContext as oU}from"formik";var rU=e=>cs(iU,null,"Use arm64 CPU architecture"," ",cs(W,{noVerticalAlign:!0,bodyContent:cs("p",null,"Check this option if you want to use the arm64 CPU architecture instead of the default x86_64 CPU architecture. Please note that some features will not be available.")}),cs(so,{featureId:"ARM64_ARCHITECTURE",openshiftVersion:e})),sU=({versions:e})=>{let{values:{openshiftVersion:t}}=oU(),[{name:o,value:r},,{setValue:s}]=tU("cpuArchitecture"),i=be(),n=!!e.find(c=>i.isFeatureSupported(c.value,"ARM64_ARCHITECTURE")),a=nU(t),l=T(o,"input"),p=aU(c=>s(c?L.ARM:L.x86),[s]);if(lU(()=>{a.current!==t&&!i.isFeatureSupported(t,"ARM64_ARCHITECTURE")&&p(!1),a.current=t},[t,p,i]),!n)return null;let u=i.getFeatureDisabledReason(t,"ARM64_ARCHITECTURE");return cs(QB,{isInline:!0,fieldId:l},cs(eU,{hidden:!u,content:u},cs(Vp,{id:l,name:o,isDisabled:i.isFeatureDisabled(t,"ARM64_ARCHITECTURE"),label:rU(t),"aria-describedby":`${l}-helper`,description:cs(j,{fieldId:l},"Make sure all the hosts are using arm64 CPU architecture."),isChecked:zo({cpuArchitecture:r}),onChange:p,className:"with-tooltip"})))},kI=sU;import Hp from"react";import{FormGroup as pU}from"@patternfly/react-core";import{useField as uU}from"formik";var TI=({clusterExists:e})=>{let t="hostsNetworkConfigurationType",o=ke(),[{value:r},,]=uU(t),s={hidden:!e,content:yp,position:"top"};return Hp.useEffect(()=>{e||o.onUpdateHostNetworkConfigType(r)},[r,e]),Hp.createElement(pU,{label:"Hosts' network configuration",fieldId:T(t,"radio"),isInline:!0},Hp.createElement(Ui,{name:t,isDisabled:e,value:De.DHCP,label:"DHCP only",tooltipProps:s}),Hp.createElement(Ui,{name:t,isDisabled:e,value:De.STATIC,label:"Static IP, bridges, and bonds",tooltipProps:s}))};import at from"react";import HI from"lodash/isEqual";import{Alert as SU,AlertVariant as IU,FlexItem as bU,FormGroup as xU,Stack as kU,StackItem as Em}from"@patternfly/react-core";import Te from"react";import{ExternalLinkAltIcon as EI}from"@patternfly/react-icons";import{Flex as fU,FlexItem as AI,Stack as FI,StackItem as VI,Text as gU,TextVariants as hU,TextContent as CU}from"@patternfly/react-core";import Dr from"react";import{FieldArray as cU,useFormikContext as dU}from"formik";import{Stack as mU,StackItem as PI,TextInputTypes as wI}from"@patternfly/react-core";var DI=({isDisabled:e=!1})=>{let{values:t}=dU(),{t:o}=f();return Dr.createElement(cU,{name:"diskEncryptionTangServers"},({remove:r,push:s})=>Dr.createElement(mU,{hasGutter:!0},t.diskEncryptionTangServers.map((i,n)=>Dr.createElement(PI,{key:n},Dr.createElement(pn,{hideRemoveButton:n===0||e,onRemove:()=>r(n)},Dr.createElement("div",null,Dr.createElement(St,{type:wI.url,name:`diskEncryptionTangServers.${n}.url`,helperText:'Must start with "http://" or "https://". Optionally, end with ":<port>"',label:"Server URL",isRequired:!0,isDisabled:e}),"\u2009",Dr.createElement(St,{type:wI.text,name:`diskEncryptionTangServers.${n}.thumbprint`,label:"Server Thumbprint",isRequired:!0,isDisabled:e})))," ")),!e&&Dr.createElement(PI,null,Dr.createElement(ac,{onAdd:()=>s({url:"",thumbprint:""}),isInline:!0},o("ai:Add another Tang server")))))};var yU=()=>{let{t:e}=f();return Te.createElement(Te.Fragment,null,"TPM v2"," ",Te.createElement(W,{component:"a",minWidth:"22rem",bodyContent:Te.createElement("p",null,e("ai:TPM v2 stores passphrases in a secure cryptoprocessor contained within as server."),"\xA0",Te.createElement("a",{href:Wa,target:"_blank",rel:"noopener noreferrer"},e("ai:Learn more")," ",Te.createElement(EI,null)))}))},vU=()=>{let{t:e}=f();return Te.createElement(Te.Fragment,null,"Tang"," ",Te.createElement(W,{component:"a",minWidth:"25rem",bodyContent:Te.createElement("p",null,e("ai:Tang server component that enable network-bound disk encryption (NBDE).")," \xA0",Te.createElement("a",{href:Wa,target:"_blank",rel:"noopener noreferrer"},e("ai:Learn more")," ",Te.createElement(EI,null)))}))},NI=({diskEncryptionMode:e,isDisabled:t})=>{let{t:o}=f();return Te.createElement(FI,null,Te.createElement(VI,null,Te.createElement(fU,null,Te.createElement(AI,{spacer:{default:"spacer3xl"}},Te.createElement(Ke,{isDisabled:t,name:"diskEncryptionMode",label:Te.createElement(yU,null),id:"TPMV2-button",value:"tpmv2"})),Te.createElement(AI,{spacer:{default:"spacer3xl"}},Te.createElement(Ke,{isDisabled:t,name:"diskEncryptionMode",label:Te.createElement(vU,null),id:"tang-button",value:"tang"})))),e==="tang"&&Te.createElement(FI,null,"\xA0",Te.createElement(VI,null,Te.createElement(CU,null,Te.createElement(gU,{component:hU.h6},o("ai:Tang servers")))),"\xA0",Te.createElement(DI,{isDisabled:t})))};import{useFormikContext as TU}from"formik";var PU=e=>{if(!e||e.length===0)return!1;let t={url:"",thumbprint:""};return e.find(o=>!HI(o,t)&&!HI(o,{}))!==void 0},wU=({values:e,isSNO:t=!1,isDisabled:o=!1})=>{let{enableDiskEncryptionOnMasters:r,enableDiskEncryptionOnWorkers:s,diskEncryptionMode:i,diskEncryptionTangServers:n}=e,a=r||s,{setFieldValue:l,setFieldTouched:p}=TU();at.useEffect(()=>{!s&&!r&&(i!=="tpmv2"&&l("diskEncryptionMode","tpmv2"),PU(n)&&(p("diskEncryptionTangServers",!1,!1),l("diskEncryptionTangServers",[{}],!1)))},[r,s,i,n,p,l]),at.useEffect(()=>{t&&l("enableDiskEncryptionOnWorkers",!1)},[t,l]);let{t:u}=f(),c=u("ai:This option is not editable after the draft cluster is created"),d={hidden:!o,content:c};return at.createElement(xU,{label:"Encryption of installation disks"},at.createElement(kU,{hasGutter:!0},at.createElement(Em,null,at.createElement(li,{tooltipProps:d,name:"enableDiskEncryptionOnMasters",label:u(t?"ai:Control plane node, worker":"ai:Control plane nodes"),isDisabled:o})),at.createElement(ee,{condition:!t},at.createElement(Em,null,at.createElement(li,{tooltipProps:d,name:"enableDiskEncryptionOnWorkers",isDisabled:o,label:u("ai:Workers")}))),at.createElement(ee,{condition:r||s&&!t},at.createElement(Em,null,at.createElement(NI,{diskEncryptionMode:i,isDisabled:o})))),a&&at.createElement(SU,{variant:IU.warning,isInline:!0,title:at.createElement(bU,null,i==="tpmv2"&&at.createElement(at.Fragment,null,"To use this encryption method, enable TPMv2 encryption in the BIOS of each selected host."),i==="tang"&&at.createElement(at.Fragment,null,"The use of Tang encryption mode to encrypt your disks is only supported for bare metal or vSphere installations on user-provisioned infrastructure."))}))},OI=wU;import kt from"react";import Fo from"react";import{DropdownItem as DU,DropdownToggle as EU,Dropdown as AU,HelperText as FU,FormGroup as VU}from"@patternfly/react-core";import{CaretDownIcon as NU}from"@patternfly/react-icons";import{useField as HU}from"formik";var LI=({name:e,defaultValue:t,items:o,isDisabled:r,versions:s,getHelperText:i,showReleasesLink:n})=>{let[a,,{setValue:l}]=HU(e),[p,u]=Fo.useState(!1),[c,d]=Fo.useState(t),{t:m}=f(),[g,h]=Fo.useState(i(s,t,m)),C=T(e,"input"),I=o.map(({value:v,label:w})=>Fo.createElement(DU,{key:v,id:v},w)),S=Fo.useCallback(v=>{let w=v?.currentTarget.innerText?v?.currentTarget.innerText:t;d(w||""),l(v?.currentTarget.id),h(i(s,w,m)),u(!1)},[d,h,u,t,i,m,s,l]),y=Fo.useMemo(()=>Fo.createElement(EU,{onToggle:v=>u(!r&&v),toggleIndicator:NU,isDisabled:r,isText:!0,className:"pf-u-w-100"},c),[u,c,r]);return Fo.createElement(VU,{fieldId:C,label:m("ai:OpenShift version"),isRequired:!0},Fo.createElement(AU,{...a,name:e,id:C,onSelect:S,dropdownItems:I,toggle:y,isOpen:p,className:"pf-u-w-100"}),Fo.createElement(FU,{style:{display:"inherit"}},g),n&&Fo.createElement(ot,{href:`${window.location.origin}/${ju}`},m("ai:Learn more about OpenShift releases")))};import{ExclamationCircleIcon as OU,ExclamationTriangleIcon as MI,ExternalLinkAltIcon as LU}from"@patternfly/react-icons";import{global_warning_color_100 as _I,global_danger_color_100 as MU}from"@patternfly/react-tokens";var WI=()=>{let{t:e}=f();return kt.createElement("a",{href:Ma,target:"_blank",rel:"noopener noreferrer"},e("ai:Learn more")," ",kt.createElement(LU,null))},_U=(e,t,o)=>{if(!e.length)return kt.createElement(kt.Fragment,null,kt.createElement(OU,{color:MU.value,size:"sm"}),"\xA0 ",o("ai:No release image is available."));let r=null;return e.find(i=>i.label===t)?.supportLevel!=="production"?r=kt.createElement(kt.Fragment,null,kt.createElement(MI,{color:_I.value,size:"sm"}),"\xA0",o("ai:Please note that this version is not production-ready."),"\xA0",kt.createElement(WI,null)):t&&t in El.versions&&Al(El.versions[t])<=30&&(r=kt.createElement(kt.Fragment,null,kt.createElement(MI,{color:_I.value,size:"sm"}),"\xA0",o("ai:Full support for this version ends on {{openshiftversion}} and won't be available as an installation option afterwards.",{openshiftversion:El.versions[t]}),"\xA0",kt.createElement(WI,null))),r},WU=({versions:e})=>{let{t}=f(),o=kt.useMemo(()=>e.filter(s=>s.supportLevel!=="maintenance").map(s=>({label:s.supportLevel==="beta"?s.label+" - "+t("ai:Developer preview release"):s.label,value:s.value})),[e,t]),r=e.find(s=>s.default)?.label||e[0]?.label||"";return kt.createElement(LI,{name:"openshiftVersion",defaultValue:r,items:o,isDisabled:e.length===0,versions:e,getHelperText:_U,showReleasesLink:oe!==void 0})},zI=WU;var BI=({name:e,baseDnsDomain:t})=>gt(GU,null,"All DNS records must be subdomains of this base and include the cluster name. This cannot be changed after cluster installation. The full cluster address will be: ",gt("br",null),gt("strong",null,e||"[Cluster Name]",".",t||"[example.com]")),UI=({managedDomains:e=[],toggleRedHatDnsService:t,isBaseDnsDomainDisabled:o,versions:r,isPullSecretSet:s,defaultPullSecret:i,forceOpenshiftVersion:n,isOcm:a,clusterExists:l})=>{let{values:p}=BU(),{name:u,baseDnsDomain:c,highAvailabilityMode:d,useRedHatDnsService:m}=p,g=$U();qU(()=>{g.current?.focus()},[]);let{t:h}=f();return gt(zU,{id:"wizard-cluster-details__form"},gt(eI,{ref:g,label:"Cluster name",name:"name",placeholder:a?"":"Enter cluster name",isRequired:!0,richValidationMessages:m?Kg(h):Rg(h)}),!!e.length&&t&>(po,{name:"useRedHatDnsService",label:"Use a temporary 60-day domain",helperText:"A base domain will be provided for temporary, non-production clusters.",onChange:t}),m?gt($s,{label:"Base domain",name:"baseDnsDomain",helperText:gt(BI,{name:u,baseDnsDomain:c}),options:e.map(C=>({label:`${C.domain||""} (${C.provider||""})`,value:C.domain})),isRequired:!0}):gt(Be,{label:"Base domain",name:"baseDnsDomain",helperText:gt(BI,{name:u,baseDnsDomain:c}),placeholder:"example.com",isDisabled:o||m,isRequired:!0}),n?gt(al,{name:"openshiftVersion",label:"OpenShift version",isRequired:!0},"OpenShift ",n," ",UU(n,r)):gt(zI,{versions:r}),gt(ad,{versions:r,highAvailabilityMode:d}),!s&>(xd,{isOcm:a,defaultPullSecret:i}),gt(kI,{versions:r}),gt(TI,{clusterExists:l}),gt(OI,{values:p,isDisabled:s,isSNO:le({highAvailabilityMode:d})}))};function UU(e,t){return t.find(r=>r.version===e)?.supportLevel==="beta"?"- Developer preview release":""}var JU=e=>{let{cluster:t,infraEnv:o,pullSecret:r,managedDomains:s,ocpVersions:i,usedClusterNames:n=[],moveNext:a,handleClusterUpdate:l,handleClusterCreate:p,navigation:u}=e,{search:c}=jU(),{isViewerMode:d}=YU(R),m=be(),g=uo.useCallback(async y=>{let v=Gn.getClusterCreateParams(y);t?await l(t.id,v):await p(v)},[t,p,l]),h=(y,v,w)=>d||!y&&!KU(w)&&os({cluster:w})?a:v,C=uo.useMemo(()=>Gn.getClusterDetailsInitialValues({infraEnv:o,cluster:t,pullSecret:r,managedDomains:s,ocpVersions:i,urlSearchParams:c}),[o,t,r,s,i,c]),{t:I}=f(),S=BC({usedClusterNames:n,featureSupportLevels:m,pullSecretSet:t?.pullSecretSet,ocpVersions:i,isOcm:!0,t:I});return uo.createElement(XU,{initialValues:C,validate:ni(S),onSubmit:g},({submitForm:y,isSubmitting:v,isValid:w,dirty:E,setFieldValue:F,errors:q,touched:Z})=>{let ae=ro(q,Z),Re=uo.createElement(uo.Fragment,null,uo.createElement(RU,{hasGutter:!0},uo.createElement(GI,null,uo.createElement(Xe,null,"Cluster details")),uo.createElement(GI,{span:12,lg:10,xl:9,xl2:7},uo.createElement(UI,{toggleRedHatDnsService:vt=>F("baseDnsDomain",vt?s.map(b=>b.domain)[0]:""),versions:i,forceOpenshiftVersion:t?.openshiftVersion,isPullSecretSet:!!t?.pullSecretSet,defaultPullSecret:r,isOcm:!!oe,managedDomains:s,clusterExists:!!t})))),tt=uo.createElement(_t,{cluster:t,errorFields:ae,isSubmitting:v,isNextDisabled:!(!v&&w&&(E||t&&os({cluster:t}))),onNext:h(E,y,t)});return uo.createElement(ye,{navigation:u,footer:tt},Re)})},Am=JU;var tG=({cluster:e,infraEnv:t})=>{let o=ke(),r=fp(),{addAlert:s,clearAlerts:i}=N(),n=QU(),a=eG(),{usedClusterNames:l}=gp(e?.id||""),p=Oi(),{error:u,loading:c,versions:d}=lo();ds.useEffect(()=>{u&&s(u)},[u,s]);let m=ds.useCallback(async(C,I)=>{i();let S=ZU(I,["highAvailabilityMode","pullSecret","openshiftVersion"]);try{let{data:y}=await re.update(C,e?.tags,S);a(qe(y)),os({cluster:y})&&o.moveNext()}catch(y){x(y,()=>s({title:"Failed to update the cluster",message:D(y)}))}},[i,e?.tags,a,o,s]),g=ds.useCallback(async C=>{i();try{let I=await re.create(C);n.push(`${ue}/clusters/${I.id}`,Xd)}catch(I){x(I,()=>s({title:"Failed to create new cluster",message:D(I)}))}},[s,i,n]);return p===void 0||!r||c||!l?ds.createElement(ye,{navigation:ds.createElement(xt,{cluster:e})},ds.createElement(z,null)):ds.createElement(Am,{cluster:e,pullSecret:p,managedDomains:r,ocpVersions:d,usedClusterNames:l,moveNext:()=>o.moveNext(),handleClusterUpdate:m,handleClusterCreate:g,navigation:ds.createElement(xt,{cluster:e}),infraEnv:t})},Op=tG;import js from"react";import{useDispatch as WG,useSelector as zG}from"react-redux";import{Formik as BG,useFormikContext as UG}from"formik";import he from"react";import{useSelector as AG}from"react-redux";import{Text as ob,TextContent as Fm,Button as FG,Stack as VG,StackItem as Ys,Split as NG,SplitItem as HG}from"@patternfly/react-core";import{useFormikContext as OG}from"formik";import Zt from"react";import{Stack as oG,StackItem as $I}from"@patternfly/react-core";import{useSelector as rG}from"react-redux";var sG=({obj:e})=>Zt.createElement(Ws,{key:e.id,host:e,AdditionalNTPSourcesDialogToggleComponent:Po}),iG=({cluster:e})=>{let{onEditHost:t,actionChecks:o,onEditRole:r,actionResolver:s,onSelect:i,selectedHostIDs:n,setSelectedHostIDs:a,onMassChangeHostname:l,onMassDeleteHost:p,...u}=rs(e),{isViewerMode:c}=rG(R),d=le(e),{t:m}=f(),g=Zt.useMemo(()=>[Jo(m,t,void 0,o.canEditHostname),Zr(m,o.canEditRole,r,io(e)),Vi({onEditHostname:t}),Zl,Ql,ep,Fi,Qr(e)],[m,t,o.canEditHostname,o.canEditRole,r,e]),h=e.hosts||[],C=Zo(h.length),I=h.map(y=>y.id),S=!(c||d);return Zt.createElement(Zt.Fragment,null,Zt.createElement(oG,{hasGutter:!0},S&&Zt.createElement($I,null,Zt.createElement(Gc,{selectedIDs:n||[],itemIDs:I,setSelectedIDs:a,actions:[Zt.createElement($c,{key:"hostname",onChangeHostname:l}),Zt.createElement(qc,{key:"delete",onDeleteHost:p})],...C})),Zt.createElement($I,null,Zt.createElement(ts,{testId:"hosts-discovery-table",hosts:h,content:g,actionResolver:s,ExpandComponent:sG,onSelect:S?i:void 0,selectedIDs:n,setSelectedIDs:a,...C},Zt.createElement(cp,{isSingleNode:d})))),Zt.createElement(ss,{cluster:e,...u}))},qI=iG;import Er from"react";import{Button as dG,ButtonVariant as mG,Modal as fG,ModalVariant as gG}from"@patternfly/react-core";import{pluralize as YI}from"humanize-plus";import na from"react";import{useDispatch as nG}from"react-redux";import aG from"axios";var lG=({cluster:e,onCancel:t,onSuccess:o,cpuArchitecture:r})=>{let{infraEnv:s,error:i}=Pr(e.id,r),n=na.useRef(),a=nG();na.useEffect(()=>(n.current=aG.CancelToken.source(),()=>n.current?.cancel("Image generation cancelled by user.")),[]);let l=()=>{a(Jr()),t()},p=async(u,c)=>{if(e.id&&s?.id)try{let{updatedCluster:d}=await $l.update(e.id,e.tags,s.id,u);await o(),a(qe(d))}catch(d){x(d,()=>{c.setStatus({error:{title:"Failed to download the discovery Image",message:D(d)}})})}};return i?na.createElement(_,null):s?na.createElement(uy,{onCancel:l,handleSubmit:p,sshPublicKey:s.sshAuthorizedKey,httpProxy:s.proxy?.httpProxy,httpsProxy:s.proxy?.httpsProxy,noProxy:s.proxy?.noProxy,imageType:s.type}):na.createElement(z,null)},Lp=lG;import pG from"react";var uG=({clusterName:e,isSNO:t,isoDownloadUrl:o,cpuArchitecture:r,...s})=>{let i=r===L.USE_DAY1_ARCHITECTURE?e:`${e}_${r}`;return pG.createElement(Vl,{fileName:`discovery_image_${i}.iso`,downloadUrl:o,isSNO:t,...s})},Mp=uG;import cG from"react";function aa(){return{getIsoImageUrl:cG.useCallback(async(t,o)=>{try{let r=await it.getInfraEnvId(t,o);if(!r)return{url:"",error:`Failed to retrieve the infraEnv for ${t}`};let{data:{url:s}}=await Ae.getImageUrl(r);return{url:s,error:s?"":"Failed to retrieve the image URL, the API returned an invalid URL"}}catch(r){return{url:"",error:Ge(r)}}},[])}}var jI=({ButtonComponent:e=dG,cluster:t,idPrefix:o})=>{let{discoveryImageDialog:r}=se(),{open:s}=r,i=le(t);return Er.createElement(e,{variant:mG.secondary,onClick:()=>s({cluster:t}),id:`${o}-button-download-discovery-iso`},"Add ",YI(+i,"host"))},Gi=()=>{let[e,t]=Er.useState(""),[o,r]=Er.useState(""),{discoveryImageDialog:s}=se(),{data:i,isOpen:n,close:a}=s,l=i?.cluster,{getIsoImageUrl:p}=aa(),u=Er.useCallback(async()=>{let{url:m,error:g}=await p(l.id,L.USE_DAY1_ARCHITECTURE);t(m),r(g)},[p,l?.id]),c=Er.useCallback(()=>{t("")},[]);if(!l)return null;let d=le(l);return Er.createElement(fG,{"aria-label":"Add hosts dialog",title:`Add ${YI(+d,"host")}`,isOpen:n,onClose:a,variant:gG.small,hasNoBodyWrapper:!0,id:"generate-discovery-iso-modal"},o&&Er.createElement(_,null),e?Er.createElement(Mp,{clusterName:l.name||"",isSNO:d,onClose:a,onReset:c,isoDownloadUrl:e,cpuArchitecture:L.USE_DAY1_ARCHITECTURE}):Er.createElement(Lp,{cluster:l,onCancel:a,onSuccess:u,cpuArchitecture:L.USE_DAY1_ARCHITECTURE}))};import tr from"react";import{Text as ZI}from"@patternfly/react-core";import Qt from"react";import{List as hG,ListItem as _p,Text as RI,TextContent as KI}from"@patternfly/react-core";var CG="https://access.redhat.com/solutions/4885641",XI=e=>Io(e*1024*1024,2,"iec"),yG=({clusterId:e,isSingleNode:t,isAddingHosts:o})=>{let{preflightRequirements:r,error:s,isLoading:i}=Bs(e);if(i)return Qt.createElement(z,{content:"Loading hardware requirements ..."});if(s)return Qt.createElement(_,null);let n=r?.ocp?.master?.quantitative,a=n?.cpuCores||4,l=XI(n?.ramMib||16*1024),p=n?.diskSizeGb||100,u=`${a} CPU cores, ${l} RAM, and ${p} GB disk size.`,c=r?.ocp?.worker?.quantitative,d=c?.cpuCores||2,m=XI(c?.ramMib||16*1024),g=c?.diskSizeGb||100,h=`${d} CPU cores, ${m} RAM, and ${g} GB disk size.`;if(o)return Qt.createElement(KI,null,Qt.createElement(RI,{component:"p"},`Worker hosts must have at least ${h}`));let C;return t?C=Qt.createElement(KI,null,Qt.createElement(RI,{component:"p"},`One host is required with at least ${u}`)):C=Qt.createElement(hG,null,Qt.createElement(_p,null,`Control plane nodes: At least ${u}`),Qt.createElement(_p,null,`Workers: At least ${h}`),Qt.createElement(_p,null,"Also note that each host's disk write speed should meet the minimum requirements to run OpenShift.",Qt.createElement("br",null),Qt.createElement(ot,{href:CG},"Learn more")),Qt.createElement(_p,null,"Operators might require additional resources.")),C},JI=yG;var vG=({cluster:e})=>{let t=tr.useMemo(()=>yv(e.hosts||[]),[e.hosts]),o=le(e);return tr.createElement(tr.Fragment,null,tr.createElement(ZI,{component:"h3"},"Information and warnings"),tr.createElement(ZI,{component:"p"},tr.createElement(pp,{linkText:"Minimum hardware requirements",modalTitle:"Minimum hardware requirements"},tr.createElement(JI,{clusterId:e.id,isSingleNode:o,isAddingHosts:ql(e)})),tr.createElement("span",{className:"pf-u-mr-md"},"\xA0"),tr.createElement(up,{isSingleNode:o})),t&&tr.createElement(Uc,null))},Wp=vG;import qs from"react";import Ar from"react";import{List as SG,ListItem as QI,Title as IG}from"@patternfly/react-core";var bG=()=>Ar.createElement(Ar.Fragment,null,Ar.createElement(IG,{headingLevel:"h6"},"Requirements"),Ar.createElement(SG,null,Ar.createElement(QI,null,"A network connection between vSphere and the installed OCP."),Ar.createElement(QI,null,"Ensure clusterSet ",Ar.createElement("code",null,"disk.enableUUID")," is set to ",Ar.createElement("code",null,"true")," inside of vSphere")),Ar.createElement("a",{href:Is,target:"_blank",rel:"noopener noreferrer"},"Learn more about vSphere platform integration")),eb=bG;var xG="Enable platform integration to access features directly in OpenShift, like vSphere node auto-scaling and persistent storage or Nutanix node auto-scaling.",kG="Enable vSphere platform integration to access features directly inside OpenShift, like node auto-scaling and persistent storage. You'll need to set vSphere configuration after cluster installation is complete.",TG="Enable Nutanix platform integration to access features like node auto-scaling directly inside OpenShift.",PG="Platform integration is only applicable on non-SNO deployments and when all discovered hosts originated from the same platform.",wG={"no-active-integrations":xG,vsphere:kG,nutanix:TG},DG=({supportedPlatformIntegration:e})=>qs.createElement(qs.Fragment,null,qs.createElement("span",null,"Integrate with platform (vSphere/Nutanix)")," ",qs.createElement(W,{bodyContent:wG[e],footerContent:e==="vsphere"&&qs.createElement(eb,null),buttonOuiaId:"platform-integration-vSphere-popover"})),EG=({clusterId:e})=>{let{isPlatformIntegrationSupported:t,supportedPlatformIntegration:o}=ns(e);return qs.createElement(Fp,{tooltipProps:{hidden:t,content:PG},isDisabled:!t,name:"usePlatformIntegration",label:qs.createElement(DG,{supportedPlatformIntegration:o}),switchOuiaId:"platform-integration-vSphere-switch"})},tb=EG;var LG=()=>he.createElement(he.Fragment,null,he.createElement("span",null,"Run workloads on control plane nodes")," ",he.createElement(W,{bodyContent:he.createElement("p",null,"Enables your control plane nodes to be used for running applications.")})),MG='This toggle will be "On" and not editable when less than 5 hosts were discovered',_G=({cluster:e})=>{let t=_r("ASSISTED_INSTALLER_PLATFORM_INTEGRATION_FEATURE"),o=cn(e),{setFieldValue:r}=OG(),{isViewerMode:s}=AG(R);return he.useEffect(()=>{r("schedulableMasters",io(e))},[e,o,r]),he.createElement(VG,{hasGutter:!0},he.createElement(Ys,null,he.createElement(Xe,null,"Host discovery")),he.createElement(Ys,null,!s&&he.createElement(Fm,null,he.createElement(ob,{component:"p"},he.createElement(jI,{ButtonComponent:FG,cluster:e,idPrefix:"host-inventory"})))),t&&he.createElement(Ys,null,he.createElement(NG,{hasGutter:!0},he.createElement(HG,null,he.createElement(tb,{clusterId:e.id})))),he.createElement(Ys,null,he.createElement(Fp,{tooltipProps:{hidden:!o,content:MG},isDisabled:o,name:"schedulableMasters",label:he.createElement(LG,null)})),he.createElement(Ys,null,he.createElement(Fm,null,he.createElement(Wp,{cluster:e}))),he.createElement(Ys,null,he.createElement(Fm,null,he.createElement(ob,{component:"h3"},"Host Inventory"))),he.createElement(Ys,null,he.createElement(qI,{cluster:e})))},rb=_G;var GG=({cluster:e})=>{let{alerts:t}=N(),{errors:o,touched:r,isSubmitting:s,isValid:i}=UG(),n=ke(),a=ho(),l=ro(o,r),p=!i||!!t.length||a||s||!np({cluster:e});return js.createElement(ye,{navigation:js.createElement(xt,{cluster:e}),footer:js.createElement(_t,{cluster:e,errorFields:l,isSubmitting:s,isNextDisabled:p,onNext:()=>n.moveNext(),onBack:()=>n.moveBack()})},js.createElement(rb,{cluster:e}))},$G=({cluster:e})=>{let t=WG(),{addAlert:o,clearAlerts:r}=N(),{isViewerMode:s}=zG(R),i=js.useMemo(()=>Yg(e),[]),{supportedPlatformIntegration:n}=ns(e.id);return js.createElement(BG,{initialValues:i,onSubmit:s?()=>Promise.resolve():async p=>{r();let u=p.usePlatformIntegration?n==="no-active-integrations"?void 0:n:void 0,c={};$n.setPlatform(c,u,e.userManagedNetworking),$n.setSchedulableMasters(c,p,e);try{let{data:d}=await re.update(e.id,e.tags,c);t(qe(d))}catch(d){x(d,()=>o({title:"Failed to update the cluster",message:D(d)}))}}},js.createElement(GG,{cluster:e}))},sb=$G;import No from"react";import{StackItem as gb}from"@patternfly/react-core";import{Formik as h1,useFormikContext as C1}from"formik";import Vo from"react";import{Stack as m1,StackItem as mb}from"@patternfly/react-core";import{Fragment as ZG,createElement as Rs}from"react";import{sortable as ib}from"@patternfly/react-table";import{Popover as qG,Text as YG,TextContent as jG,TextVariants as RG}from"@patternfly/react-core";import{ExclamationTriangleIcon as KG}from"@patternfly/react-icons";import{global_warning_color_100 as XG}from"@patternfly/react-tokens/dist/js/global_warning_color_100";var JG=()=>Rs(jG,null,Rs(YG,{component:RG.p},"Some bootable disks will skip formatting"));var nb={header:{title:"Number of disks",props:{id:"col-header-num-disks"},transforms:[ib]},cell:e=>{let o=He(e).disks||[];return{title:Rs(ZG,null," ",o.length," ",e.skipFormattingDisks&&Rs(qG,{bodyContent:Rs(JG,null),minWidth:"20rem",maxWidth:"30rem"},Rs(KG,{color:XG.value,size:"sm"}))),props:{"data-testid":"disk-number"},sortableValue:o.length}}},ab=e=>({header:{title:"ODF Usage",props:{id:"col-header-odf"},transforms:[ib]},cell:t=>{let o=t.role==="master"||t.suggestedRole==="master",r=e&&o;return{title:r?Rs("div",{style:{color:"var(--pf-global--disabled-color--100)"}},"Excluded for ODF"):"Use ODF",props:{"data-testid":"use-odf"},sortableValue:Number(r)}}});import{createElement as t1}from"react";var QG=e=>e.id,e1=({hosts:e,...t})=>t1(op,{getDataId:QG,data:e,...t},""),lb=e1;import{createElement as la}from"react";import{Stack as c1,StackItem as cb}from"@patternfly/react-core";import Ks from"react";import{Button as o1,ButtonVariant as r1,Popover as s1,Text as pb,TextContent as i1,TextVariants as n1}from"@patternfly/react-core";import{ExclamationTriangleIcon as a1}from"@patternfly/react-icons";import{global_warning_color_100 as l1}from"@patternfly/react-tokens/dist/js/global_warning_color_100";var p1=()=>Ks.createElement(i1,null,Ks.createElement(pb,{component:n1.p},"All non-installation disks will be used for local storage. To view available disks, expand each host row in the table")),u1=()=>Ks.createElement(pb,{component:"p"},Ks.createElement(s1,{bodyContent:Ks.createElement(p1,null),minWidth:"30rem"},Ks.createElement(o1,{variant:r1.link,isInline:!0},Ks.createElement(a1,{className:"status-icon",color:l1.value,size:"sm"}),"\xA0Format all non-installation disks"))),ub=u1;var d1=({cluster:e})=>{let t=Ga(e.monitoredOperators,_o)&&!ql(e),o=Wy(e);return la(c1,{hasGutter:!0},t&&la(cb,null,la(ub,null)),la(cb,null,la(bd,{someDisksAreSkipFormatting:o})))},db=d1;function f1({obj:e}){let{onDiskRole:t,canEditDisks:o,updateDiskSkipFormatting:r}=mp();return Vo.createElement(ip,{key:e.id,host:e,onDiskRole:t,canEditDisks:o,updateDiskSkipFormatting:r})}var g1=({cluster:e})=>{let{t}=f(),{onEditHost:o,actionChecks:r,onDiskRole:s,actionResolver:i,updateDiskSkipFormatting:n,...a}=rs(e),l=Vo.useMemo(()=>{let c=[Jo(t,o,void 0,r.canEditHostname),Zr(t,void 0,void 0,io(e)),Vi({}),Fi,nb];if(Ga(e.monitoredOperators,_o)){let d=!Tg(e);c.push(ab(d))}return c.push(Qr(e)),c},[r.canEditHostname,e,o,t]),p=e.hosts||[],u=Zo(p.length);return Vo.createElement(Vo.Fragment,null,Vo.createElement(m1,{hasGutter:!0},Vo.createElement(mb,null,Vo.createElement(dp,{canEditDisks:r.canEditDisks,onDiskRole:s,updateDiskSkipFormatting:n},Vo.createElement(lb,{testId:"storage-table",hosts:p,content:l,actionResolver:i,ExpandComponent:f1,...u}))),Vo.createElement(mb,null,Vo.createElement(db,{cluster:e}))),Vo.createElement(ss,{cluster:e,...a}))},fb=g1;var y1=({cluster:e})=>{let{alerts:t}=N(),o=ke(),{isSubmitting:r,touched:s,errors:i}=C1(),n=ho(),a=ro(i,s),l=!ap({cluster:e})||n||!!t.length||r;return No.createElement(ye,{navigation:No.createElement(xt,{cluster:e}),footer:No.createElement(_t,{cluster:e,errorFields:a,isSubmitting:r,isNextDisabled:l,onNext:()=>o.moveNext(),onBack:()=>o.moveBack()})},No.createElement(gb,null,No.createElement(Xe,null,"Storage")),No.createElement(gb,null,No.createElement(fb,{cluster:e})),No.createElement(wu,null))},v1=({cluster:e})=>{let{clearAlerts:t}=N(),o=No.useMemo(()=>jg(),[]);return No.createElement(h1,{onSubmit:()=>{t()},initialValues:o},No.createElement(y1,{cluster:e}))},hb=v1;import Ri from"react";import{useSelector as C2}from"react-redux";import to from"react";import{Text as lx,TextContent as d2,TextVariants as px,Alert as m2,AlertVariant as f2,Grid as g2}from"@patternfly/react-core";import eo from"react";import{Alert as S1,AlertVariant as I1,ButtonVariant as b1,Form as x1,FormGroup as k1}from"@patternfly/react-core";var T1=({initialView:e,confirmOnChangeView:t,onChangeView:o})=>{let r="select-static-ip-view",[s,i]=eo.useState(),[n,a]=eo.useState(e),l=(m,g)=>{let h=g.currentTarget.value;t?i(h):(a(h),o(h))},p=m=>{a(m),i(void 0),o(m)},u=()=>{i(void 0)},c=()=>n===xe.YAML?"YAML":"form",d=n===xe.FORM;return eo.createElement(eo.Fragment,null,eo.createElement(x1,{isHorizontal:!0},eo.createElement(k1,{fieldId:T(r,"radio"),isInline:!0,label:"Configure via :",className:"static-config-type-label"},eo.createElement(Im,{label:"Form view",name:r,"data-testid":"select-form-view",id:"select-form-view",value:xe.FORM,isChecked:d,onChange:l}),eo.createElement(Im,{label:"YAML view",name:r,"data-testid":"select-yaml-view",id:"select-yaml-view",value:xe.YAML,isChecked:!d,onChange:l}))),d&&eo.createElement(S1,{variant:I1.info,isInline:!0,title:"Form view supports basic configurations. Select YAML view for advanced configurations."}),s&&eo.createElement(Fs,{title:"Change configuration option?",titleIconVariant:"warning",confirmationButtonText:"Change",confirmationButtonVariant:b1.primary,content:eo.createElement(eo.Fragment,null,eo.createElement("p",null,`All data and configuration done in ${c()} view will be lost.`)),onClose:u,onConfirm:()=>p(s)}))},zp=T1;import P1 from"lodash/findLastIndex";import{Address4 as Cb,Address6 as yb}from"ip-address";var Vm=e=>!0,Nm=e=>e==="dualStack",vb=(e,t)=>t===B.ipv4?Vm(e):Nm(e),co=e=>e==="dualStack"?[B.ipv4,B.ipv6]:[B.ipv4],pa=e=>e===B.ipv4?"IPv4":"IPv6",Bp=(e,t)=>t===B.ipv4&&Cb.isValid(e)?new Cb(e):t===B.ipv6&&yb.isValid(e)?new yb(e):null;var Up=()=>({ipv4:"",ipv6:""}),ua=()=>({macAddress:"",ips:Up()}),Gp=()=>({machineNetwork:{ip:"",prefixLength:""},gateway:""}),Hm=()=>({networkYaml:"",macInterfaceMap:[{macAddress:"",logicalNicName:""}]}),ca=()=>({ipConfigs:{ipv4:Gp(),ipv6:Gp()},protocolType:"ipv4",useVlan:!1,vlanId:"",dns:""}),Sb=()=>({hosts:[ua()]}),Ib=()=>({hosts:[Hm()]});var w1=e=>e.find(t=>!Ny(t.name)),bb=e=>{let t=e.split(`
|
|
30
|
+
`),o=P1(t,s=>s.startsWith(wi));return{comments:t.slice(0,o+1).map(s=>s.slice(1)),nmstate:wy(e)}},D1=e=>{for(let t of e)if(Ty(t))return t.vlan.id;return null},E1=(e,t)=>{let o=e[t];if(o===void 0)return"";if(!o.address||!o.address.length)throw`Nmstate yaml doesn't contain an address for protocol version ${t}`;return o.address[0].ip},A1=e=>{let t=e["dns-resolver"]?.config.server;if(!t||!t.length)throw"Nmstate YAML doesn't contain dns-resolver section";return t.join(",")},F1=(e,t)=>{let o=e.routes?.config;if(!o)throw"Nmstate yaml doesn't contain routes section";return o[Py(t)]["next-hop-address"]},V1=(e,t,o)=>{let r=D1(e.interfaces),s=ca();s.dns=A1(e),s.protocolType=t,r&&(s.useVlan=!0,s.vlanId=r);for(let i of co(t)){s.ipConfigs[i].gateway=F1(e,i);let[n,a]=o[i].split("/");s.ipConfigs[i].machineNetwork={ip:n,prefixLength:parseInt(a)}}return s},N1=(e,t)=>{if(!e.macInterfaceMap||!e.networkYaml)throw"Static network config is missing information";let o=e.macInterfaceMap[0].macAddress;if(!o)throw"Static network config is missing mac address";let{nmstate:r}=bb(e.networkYaml),s=w1(r.interfaces);if(!s)return null;let i={macAddress:o,ips:{ipv4:"",ipv6:""}};for(let n of co(t))i.ips[n]=E1(s,n);return i},da=e=>{if(!e.length)throw"Static network config is empty";let t=e[0];if(!t.macInterfaceMap||!t.networkYaml)throw"Static network config first host is missing fields";let{comments:o,nmstate:r}=bb(t.networkYaml),s=_l(o);if(!s)return{networkWide:ca(),hosts:[]};let i=Ed(o),n=V1(r,s,i),a=[];for(let l of e){let p=N1(l,s);p&&a.push(p)}return{networkWide:n,hosts:a}};var $i=e=>{if(!e.staticNetworkConfig||!e.staticNetworkConfig.length)return;let t=O(e.staticNetworkConfig);if(!t)throw"Failed to parse static network config";if(!!t.length)return t},H1=e=>e.includes(Di)?xe.FORM:xe.YAML,O1=e=>{let t=e[0].networkYaml;if(!t)throw"Static Network Config doesn't contain a network yaml";let o=Dy(t);return{view:H1(o),isDataComplete:!Hy(t),formViewProtocolType:_l(o)}},Xs=e=>{let t=$i(e);if(!(!t||!t[0]))return O1(t)},$p=e=>{let t=$i(e);if(!t)throw"Infra env doesn't contain static ip data";let o=da(t);if(!o)throw`Failed to get static ip form data from infra env ${e.id}`;return o},xb=e=>{let t=$p(e);return t.hosts.length?{hosts:t.hosts}:{hosts:[ua()]}},qp=e=>$p(e).networkWide,kb=e=>{let t=$i(e);if(!t)throw"Infra env doesn't contain static ip data";return{hosts:t}};import Gb from"react";import ms from"react";import{useSelector as L1}from"react-redux";import{Form as M1}from"@patternfly/react-core";import{Formik as _1,useFormikContext as W1,yupToFormErrors as z1}from"formik";import B1 from"lodash/isEqual";var U1=({onFormStateChange:e,getEmptyValues:t})=>{let o=ms.useMemo(()=>t(),[]),{isSubmitting:r,isValid:s,touched:i,errors:n,values:a}=W1(),l=ms.useMemo(()=>B1(a,o),[a,o]),p=ho();return ms.useEffect(()=>{e({isSubmitting:r,isAutoSaveRunning:p,isValid:s,touched:i,errors:n,isEmpty:l})},[r,s,p,i,n]),null},qi=({infraEnv:e,updateInfraEnv:t,getInitialValues:o,getUpdateParams:r,validationSchema:s,onFormStateChange:i,getEmptyValues:n,children:a,showEmptyValues:l})=>{let{clearAlerts:p,addAlert:u}=N(),{captureException:c}=Sp(),{isViewerMode:d}=L1(R),[m,g]=ms.useState();return ms.useEffect(()=>{g(l?n():o(e))},[]),m?ms.createElement(_1,{initialValues:m,onSubmit:d?()=>Promise.resolve():async S=>{p();try{let y=r(e,S);await t({staticNetworkConfig:y})}catch(y){c(y),u({title:D(y)})}},validate:S=>{try{return s.validateSync(S,{abortEarly:!1,context:{values:S}}),{}}catch(y){return z1(y)}},validateOnMount:!0,enableReinitialize:!0},ms.createElement(M1,null,a,ms.createElement(U1,{onFormStateChange:i,getEmptyValues:n}))):null};import{array as Hb,object as _m,string as Nb}from"yup";import{Address4 as G1,Address6 as Yp}from"ip-address";import{isInSubnet as $1}from"is-in-subnet";import{string as Yi}from"yup";var Tb={ipv4:"127.0.0.0",ipv6:"::1"},Pb={ipv4:"0.0.0.0",ipv6:"0000::"},Js=e=>Yi().test("unique","Value must be unique",function(t){if(!this.options.context||!("values"in this.options.context))return this.createError({message:"Unexpected error: Yup test context should contain form values"});let o=e(this.options.context.values,this,t);return o?o.filter(r=>r===t).length===1:this.createError({message:"Unexpected error: Failed to get values to test uniqueness"})}),Om=(e,t)=>{try{return!(e===B.ipv4?new G1(t):new Yp(t)).parsedSubnet}catch{return!1}},wb=(e,t)=>{try{if(t===B.ipv4)return e===Tb.ipv4||e===Pb.ipv4;{let o=new Yp(e);return Eb(new Yp(Tb.ipv6),o)||Eb(new Yp(Pb.ipv6),o)}}catch{return!1}},Lm=e=>{let t=e===B.ipv4?"IPv4":"IPv6";return Yi().test(e,`Value \${value} is not a valid ${t} address`,function(o){return o?Om(e,o):!0})},Db=e=>{let t=e===B.ipv4?"IPv4":"IPv6";return Yi().test(e,({value:o})=>{let r=o.split(","),s=r.filter(a=>!Om(e,a)),i=s.join(", ");return s.length===1?`Value ${i} is not a valid ${t} address`:s.length>1?`The values ${i} are not valid ${t} addresses`:`The following IP addresses are duplicated: ${ku(r).join(",")}`},function(o){if(!o)return!0;let r=o.split(",");return ku(r).length!==0?!1:r.every(i=>Om(e,i))})},Eb=(e,t)=>JSON.stringify(e.toByteArray())===JSON.stringify(t.toByteArray()),Ab=e=>Yi().test("is-not-reserved-address",({value:t})=>{let o=t.split(",");return o.length===1?"Provided IP address is not a correct address for an interface.":`Provided IP addresses ${o.filter(s=>wb(s,e)).join(", ")} are not correct addresses for an interface.`},function(t){return t?t.split(",").every(r=>!wb(r,e)):!0}),Fb=(e,t)=>Yi().test("is-in-subnet",`IP Address is outside of the machine network ${t}`,function(o){if(!o)return!0;let r=Lm(e);try{r.validateSync(o)}catch(s){let i=s;return this.createError({message:i.message})}try{return $1(o,t)}catch{return!0}}),ma=(e,t)=>Yi().test("is-not-network-or-broadcast","The IP address must not match the network or broadcast address",o=>{let r=Bp(t,e);if(r){let s=r?.startAddress().correctForm(),i=r?.endAddress().correctForm();return!(o===s||o===i)}else return!1});var Mm="A value is required",q1=Nb().required(Mm),Y1=e=>{let t=[];for(let o of e.hosts)if(!!o.macInterfaceMap)for(let r of o.macInterfaceMap)r.macAddress&&t.push(r.macAddress);return t},j1=(e,t)=>{let o=t.parent,r=e.hosts.find(s=>s.macInterfaceMap&&s.macInterfaceMap.indexOf(o)>-1);if(!(!r||!r.macInterfaceMap))return r.macInterfaceMap.map(s=>s.logicalNicName?s.logicalNicName:"")},R1=Hb().of(_m().shape({macAddress:tl.required(Mm).concat(Js(Y1)),logicalNicName:Nb().required(Mm).concat(Js(j1)).max(15,"Interface name must be 15 characters at most.").matches(/^\S+$/,"Interface name can not contain spaces.")})),Vb=_m().shape({hosts:Hb().of(_m().shape({networkYaml:q1,macInterfaceMap:R1}))});import yt from"react";import{TextVariants as b$,TextContent as x$,Text as k$,FormGroup as zb,Grid as T$}from"@patternfly/react-core";import{ExternalLinkAltIcon as P$}from"@patternfly/react-icons";import{Language as w$}from"@patternfly/react-code-editor";import{useField as Bb}from"formik";import J from"react";import{useSelector as Ob}from"react-redux";import{Button as Lb,ButtonVariant as K1,Checkbox as X1,Divider as J1,ExpandableSection as Z1,ExpandableSectionToggle as Q1,Flex as Mb,FlexItem as jp,Grid as e$}from"@patternfly/react-core";import{MinusCircleIcon as t$}from"@patternfly/react-icons";import{FieldArray as o$,useField as r$}from"formik";import Wm from"lodash/cloneDeep";var zm="hosts",s$=({onRemove:e,showRemoveButton:t,dataTestId:o})=>J.createElement(Lb,{"aria-label":"remove host",style:{visibility:t?"visible":"hidden"},variant:"plain"},J.createElement(t$,{onClick:e,"data-testid":o})),Bm=e=>`Host ${e+1}`,i$=({fieldName:e,hostIdx:t,onRemove:o,onToggleExpand:r,isExpanded:s,isDisabled:i,CollapsedHostComponent:n,ExpandedHostComponent:a,enableRemoveHost:l})=>{let[p,u]=J.useState(!1),c=m=>{i||u(l?m:!1)},d=tn(e,t);return J.createElement(e$,{onMouseEnter:()=>c(!0),onMouseLeave:()=>c(!1),hasGutter:!0},J.createElement(Mb,null,J.createElement(jp,null,J.createElement(Q1,{isExpanded:s,onToggle:r,direction:"down","data-testid":`toggle-host-${t}`},Bm(t))),!i&&t>0&&J.createElement(jp,{align:{default:"alignRight"}},J.createElement(s$,{onRemove:o,showRemoveButton:p,dataTestId:`remove-host-${t}`}))),s?J.createElement(Z1,{isDetached:!0,key:t,isExpanded:!0},J.createElement(a,{fieldName:d,hostIdx:t,isDisabled:i})):J.createElement(n,{fieldName:d,hostIdx:t,isDisabled:i}))},_b=e=>{let t={};for(let o=0;o<e;++o)t[o]=!1;return t},n$=e=>{let t=_b(e);return e===1&&(t[0]=!0),t},a$=({push:e,remove:t,enableCopyAboveConfiguration:o,emptyHostData:r,...s})=>{let[i,{error:n}]=r$({name:zm}),{isViewerMode:a}=Ob(R),l=!Ob(Ms)&&!a,[p,u]=J.useState(n$(i.value.length)),[c,d]=J.useState(!1),[m,g]=J.useState(null);if(i.value===void 0)return J.createElement(z,null);let h=()=>{let C;c?C=Wm(i.value[i.value.length-1]):C=Wm(r);let I=_b(i.value.length+1);I[i.value.length]=!0,u(I),e(C)};return J.createElement(J.Fragment,null,i.value.map((C,I)=>{let S=y=>{let v=Wm(p);v[I]=y,u(v)};return J.createElement(J.Fragment,{key:I},J.createElement(i$,{hostIdx:I,onToggleExpand:S,isExpanded:p[I],isDisabled:a,onRemove:()=>g(I),fieldName:zm,emptyHostData:r,enableRemoveHost:i.value.length>1,...s}),J.createElement(J1,null))}),l&&J.createElement(Mb,null,J.createElement(jp,null,J.createElement(Lb,{variant:"secondary",onClick:h,"data-testid":"add-host",isDisabled:!!n},"Add another host configuration")),o&&J.createElement(jp,{alignSelf:{default:"alignSelfCenter"}},J.createElement(X1,{label:"Copy the above configuration",isChecked:c,onChange:d,"aria-label":"copy host configuration",name:"copy-host-configuration",id:"copy-host-configuration","data-testid":"copy-host-configuration"}))),m&&J.createElement(Fs,{title:`Delete ${Bm(m)}?`,titleIconVariant:"warning",confirmationButtonText:"Delete",confirmationButtonVariant:K1.danger,content:J.createElement(J.Fragment,null,J.createElement("p",null,`All the network configurations of ${Bm(m)} will be lost`)),onClose:()=>g(null),onConfirm:()=>{t(m),g(null)}}))},l$=({...e})=>{let t=J.useCallback(o=>J.createElement(a$,{...Object.assign(e,o)}),[]);return J.createElement(o$,{name:zm,render:t})},Rp=l$;import{Flex as p$,FlexItem as Um,Label as Gm,StackItem as u$,TextContent as c$,TextVariants as d$,Text as m$}from"@patternfly/react-core";import{InfoCircleIcon as f$}from"@patternfly/react-icons";import Tt from"react";var g$=({title:e,macAddress:t,mappingValue:o,numInterfaces:r,hasError:s,hostIdx:i})=>Tt.createElement(Tt.Fragment,null,Tt.createElement(u$,{"data-testid":`collapsed-host-${i}`},Tt.createElement(p$,null,Tt.createElement(Um,null,Tt.createElement(c$,null,Tt.createElement(m$,{component:d$.small},e))),s&&Tt.createElement(Gm,{variant:"outline",color:"red",icon:Tt.createElement(f$,null),"data-testid":"host-errors-label"},"Missing Information"),!s&&Tt.createElement(Tt.Fragment,null,Tt.createElement(Um,null,Tt.createElement(Gm,{variant:"outline","data-testid":"first-mapping-label"},`${t} -> ${o}`)," "),r>1&&Tt.createElement(Um,null,Tt.createElement(Gm,{variant:"outline","data-testid":"remaining-mapping-label"},`${r-1} left`)))))),Kp=g$;import Bt from"react";import{GridItem as $m,Grid as qm,Button as h$}from"@patternfly/react-core";import{FieldArray as C$}from"formik";import{PlusCircleIcon as y$}from"@patternfly/react-icons";import{useSelector as v$}from"react-redux";var S$=({onPush:e})=>Bt.createElement(h$,{icon:Bt.createElement(y$,null),isInline:!0,onClick:()=>e({macAddress:"",logicalNicName:""}),"data-testid":"add-mapping",variant:"link"},"Add another MAC to interface name mapping"),I$=({fieldName:e,onRemove:t,mapIdx:o,enableRemove:r,hostIdx:s})=>Bt.createElement(pn,{hideRemoveButton:!r,onRemove:t},Bt.createElement(qm,{hasGutter:!0},Bt.createElement($m,{span:6},Bt.createElement(Be,{label:"MAC address",isRequired:!0,name:`${e}.macAddress`,"data-testid":`mac-address-${s}-${o}`})),Bt.createElement($m,{span:6},Bt.createElement(Be,{label:"Interface name",isRequired:!0,name:`${e}.logicalNicName`,"data-testid":`interface-name-${s}-${o}`})))),Wb=({fieldName:e,macInterfaceMap:t,hostIdx:o})=>{let{isViewerMode:r}=v$(R);return Bt.createElement(qm,{className:"mac-ip-mapping"},Bt.createElement($m,{span:6},Bt.createElement(C$,{name:e,validateOnChange:!1,render:({push:s,remove:i})=>Bt.createElement(qm,{hasGutter:!0},t.map((n,a)=>Bt.createElement(I$,{key:tn(e,a),fieldName:tn(e,a),onRemove:()=>i(a),mapIdx:a,enableRemove:!r&&a>0,hostIdx:o})),!r&&Bt.createElement(S$,{onPush:s}))})))};var D$=({fieldName:e,hostIdx:t})=>{let o=`${e}.macInterfaceMap`,[r,{error:s}]=Bb({name:o}),i=r.value?r.value:[],n=!!s,a="",l="";return i.length?(a=i[0].macAddress||"",l=i[0].logicalNicName||""):n=!0,yt.createElement(Kp,{title:"MAC to Interface name mapping",numInterfaces:i.length,macAddress:a,mappingValue:l,hostIdx:t,hasError:n})},E$=({fieldName:e,hostIdx:t})=>{let o=`${e}.macInterfaceMap`,[r]=Bb({name:o}),s=r.value?r.value:[];return yt.createElement(yt.Fragment,null,yt.createElement(zb,{label:"",fieldId:T("nmstateYaml","inputs")},yt.createElement(QS,{language:w$.yaml,name:`${e}.networkYaml`,"data-testid":`yaml-${t}`})),yt.createElement(zb,{label:yt.createElement(yt.Fragment,null,"MAC to interface name mapping"," ",yt.createElement(W,{bodyContent:"MAC address and interface name are needed in order to execute the above nmstate YAML on the right machine."})),fieldId:T("macNicMaping","inputs")},yt.createElement(Wb,{fieldName:o,macInterfaceMap:s,hostIdx:t})))},Ub=()=>{let e=Hm();return yt.createElement(T$,{hasGutter:!0},yt.createElement(x$,null,yt.createElement(k$,{component:b$.small},"Upload, drag and drop, or copy and paste a YAML file that contains NMState into the editor for network configurations. Each host also needs the MAC to interface name mapping."," ",yt.createElement("a",{href:Mu,target:"_blank",rel:"noopener noreferrer"},"Learn more about NMState ",yt.createElement(P$,null)))),yt.createElement(Rp,{ExpandedHostComponent:E$,CollapsedHostComponent:D$,emptyHostData:e,enableCopyAboveConfiguration:!0}))};var fa=({...e})=>{let t={...e,validationSchema:Vb,getInitialValues:o=>kb(o),getUpdateParams:(o,r)=>r.hosts,getEmptyValues:()=>Ib()};return Gb.createElement(qi,{...t},Gb.createElement(Ub,null))};import Ca from"react";import ji from"react";import{FormGroup as A$,Grid as F$}from"@patternfly/react-core";import{useField as V$}from"formik";var N$=e=>({fieldName:o,hostIdx:r})=>ji.createElement(F$,{hasGutter:!0},ji.createElement(Be,{name:`${o}.macAddress`,label:"MAC Address",isRequired:!0,"data-testid":`mac-address-${r}`}),co(e).map(s=>ji.createElement(A$,{label:`IP address (${pa(s)})`,fieldId:T(`${o}.ips.${s}`,"input"),key:s},ji.createElement(Be,{name:`${o}.ips.${s}`,isRequired:!0,"data-testid":`${s}-address-${r}`})," "))),H$=e=>({fieldName:o,hostIdx:r})=>{let[{value:s},{error:i}]=V$({name:o}),a=co(e).map(l=>s.ips[l]).join(", ");return ji.createElement(Kp,{title:"MAC to IP mapping",numInterfaces:1,macAddress:s.macAddress,mappingValue:a,hostIdx:r,hasError:!!i})},$b=({protocolType:e})=>{let t=ua(),o=H$(e),r=N$(e);return ji.createElement(Rp,{CollapsedHostComponent:o,ExpandedHostComponent:r,emptyHostData:t})};import{array as R$,object as Rm,string as Qb}from"yup";import{boolean as B$,lazy as z$,mixed as U$,number as Jb,object as ha,string as G$}from"yup";var or=e=>`${e.ip}/${e.prefixLength}`;var O$="A value is required",qb="Must be a number",L$=/^\d+$/,Yb=1,ga={ipv4:32,ipv6:128},jb=1,Xp=4094,Rb=e=>isNaN(e)?null:e,Jp=(e,t)=>Fb(e,or(t)),M$=(e,t)=>ma(e,or(t)),_$=e=>ha().shape({ip:Ym(e),prefixLength:Jb().required("Prefix length is required").min(1,"Prefix length must be more than or equal to 1").max(ga[e],`Prefix length must be less than or equal to ${ga[e]}`).nullable().transform(Rb)}),Ym=(e,t=!1)=>(t?Db:Lm)(e).required(O$).concat(Ab(e)),Kb=(e,t)=>ha().shape({machineNetwork:_$(e),gateway:Ym(e).concat(Jp(e,t.machineNetwork)).concat(M$(e,t.machineNetwork))}),Xb=z$(e=>{let t=ha().shape({ipv4:Kb(B.ipv4,e.ipConfigs.ipv4),ipv6:vb(e.protocolType,B.ipv6)?Kb(B.ipv6,e.ipConfigs.ipv6):ha()});return ha().shape({useVlan:B$(),vlanId:U$().when("useVlan",{is:!0,then:Jb().required(qb).min(1,"Must be more than or equal to 1").max(Xp,`Must be less than or equal to ${Xp}`).test("not-number",qb,()=>W$(e.vlanId)).nullable().transform(Rb)}),protocolType:G$(),dns:Ym(B.ipv4,!0),ipConfigs:t})}),W$=e=>new RegExp(L$).test((e||"").toString());var jm="A value is required",$$=e=>e.hosts.map(t=>t.ips.ipv4),q$=e=>e.hosts.map(t=>t.ips.ipv6),Y$=e=>e.hosts.map(t=>t.macAddress),j$=e=>Rm().shape({macAddress:tl.required(jm).concat(Js(Y$)),ips:Rm().shape({ipv4:Vm(e.protocolType)?Jp(B.ipv4,e.ipConfigs.ipv4.machineNetwork).required(jm).concat(Js($$)).concat(ma(B.ipv4,or(e.ipConfigs.ipv4.machineNetwork))):Qb(),ipv6:Nm(e.protocolType)?Jp(B.ipv6,e.ipConfigs.ipv6.machineNetwork).required(jm).concat(Js(q$)).concat(ma(B.ipv6,or(e.ipConfigs.ipv6.machineNetwork))):Qb()})}),Zb=e=>Rm().shape({hosts:R$().of(j$(e))});import{dump as K$}from"js-yaml";var Km="eth0",X$=(e,t)=>{let o=e.ipConfigs[t].machineNetwork;if(o.prefixLength==="")throw"Machine network prefix length not configured";return o.prefixLength},J$=(e,t)=>`${t.map(r=>`${wi}${r}`).join(`
|
|
31
31
|
`)}
|
|
32
|
-
${K$(e,{noRefs:!0})}`,Z$=(e,t)=>{let o=[],r=[],s=
|
|
33
|
-
Discovery ISO in the 'Host discovery' step and boot your new hosts from it.`}),px=({infraEnv:e,updateInfraEnv:t,onFormStateChange:o})=>{let r=ke(),[s,i]=to.useState(!1),[n,a]=to.useState(!1),l=to.useCallback(g=>{r.onUpdateStaticIpView(g),a(!0)},[]),p=to.useMemo(()=>Xs(e),[]);if(!p)return null;let c={onFormStateChange:g=>{let h=r.currentStepId==="static-ip-host-configurations"||!g.isEmpty;i(h),o(g)},infraEnv:e,updateInfraEnv:t,showEmptyValues:n},m=(()=>{switch(r.currentStepId){case"static-ip-yaml-view":return to.createElement(fa,{...c});case"static-ip-host-configurations":return to.createElement(Zp,{...c});case"static-ip-network-wide-configurations":return to.createElement(Qp,{...c});default:throw`Unexpected wizard step id ${r.currentStepId} when entering static ip page`}})();return m?to.createElement(g2,{hasGutter:!0},to.createElement(d2,null,to.createElement(ax,{component:lx.h2},"Static network configurations"),to.createElement(ax,{component:lx.small},"Network configuration can be done using either the form view or YAML view. Configurations done in this step are for discovering hosts.")),to.createElement(zp,{initialView:p.view,confirmOnChangeView:s,onChangeView:l}),p.isDataComplete&&h2,m):null};var y2=()=>({isValid:!0,isSubmitting:!1,isAutoSaveRunning:!1,errors:{},touched:{},isEmpty:!0}),v2=({cluster:e,infraEnv:t,updateInfraEnv:o})=>{let r=ke(),{isViewerMode:s}=C2(R),{alerts:i}=N(),[n,a]=Ri.useState(y2()),l=d=>{s||a(d)},p=n.isAutoSaveRunning||!n.isValid||!!i.length||n.isSubmitting,u=ro(n.errors,n.touched),c=Ri.createElement(_t,{cluster:e,alertTitle:"Static IP configuration contains missing or invalid fields",alertContent:null,errorFields:u,isSubmitting:n.isSubmitting,onNext:()=>r.moveNext(),onBack:()=>r.moveBack(),isNextDisabled:p});return Ri.createElement(ye,{navigation:Ri.createElement(xt,{cluster:e}),footer:c},Ri.createElement(Li,{title:"Failed to load Static IP step"},Ri.createElement(px,{...{infraEnv:t,updateInfraEnv:o,onFormStateChange:l}})))},ux=v2;import Zs from"react";import{useDispatch as Y2}from"react-redux";import{Formik as j2,useFormikContext as R2}from"formik";import Fr from"react";import{useSelector as $2}from"react-redux";import{Stack as q2,StackItem as tu}from"@patternfly/react-core";import Ut,{useState as x2}from"react";import{FormGroup as k2,Tooltip as T2}from"@patternfly/react-core";import{ExternalLinkAltIcon as P2}from"@patternfly/react-icons";import{useFormikContext as w2}from"formik";import Ho from"react";import{useSelector as S2}from"react-redux";import{List as I2,ListItem as eu}from"@patternfly/react-core";var b2=({clusterId:e})=>{let{preflightRequirements:t,error:o,isLoading:r}=Bs(e),s=S2(Ms);if(r)return Ho.createElement(z,{content:"Loading hardware requirements ..."});if(o)return Ho.createElement(_,null);let i=t?.operators?.find(l=>l.operatorName===Mr),n=i?.requirements?.worker?.quantitative,a=i?.requirements?.master?.quantitative;return Ho.createElement(Ho.Fragment,null,Ho.createElement(I2,null,Ho.createElement(eu,null,"Enabled CPU virtualization support in BIOS (Intel-VT / AMD-V) on all nodes"),Ho.createElement(ee,{condition:!s},Ho.createElement(eu,null,"Each worker node requires an additional ",n?.ramMib||360," MiB of memory ",n?.diskSizeGb?",":" and"," ",n?.cpuCores||2," CPUs",n?.diskSizeGb?` and ${n?.diskSizeGb} storage space`:"")),Ho.createElement(eu,null,"Each control plane node requires an additional ",a?.ramMib||150," MiB of memory ",a?.diskSizeGb?",":" and"," ",a?.cpuCores||4," ","CPUs",a?.diskSizeGb?` and ${a?.diskSizeGb} storage space`:""),Ho.createElement(ee,{condition:!s},Ho.createElement(eu,null,"OpenShift Data Foundation (recommended for full functionality) or another persistent storage service"))))},cx=b2;var dx="useContainerNativeVirtualization",D2=({clusterId:e})=>Ut.createElement(Ut.Fragment,null,"Install OpenShift Virtualization"," ",Ut.createElement(W,{component:"a",headerContent:"Additional Requirements",bodyContent:Ut.createElement(cx,{clusterId:e})})),E2=()=>Ut.createElement(Ut.Fragment,null,"Run virtual machines alongside containers on one platform."," ",Ut.createElement("a",{href:Ou,target:"_blank",rel:"noopener noreferrer"},"Learn more"," ",Ut.createElement(P2,null))),A2=({clusterId:e,openshiftVersion:t})=>{let o=T(dx,"input"),r=be(),{values:s}=w2(),[i,n]=x2();return Ut.useEffect(()=>{let a;if(t&&(a=r.getFeatureDisabledReason(t,"CNV"),!a)){let l=r.getFeatureSupportLevel(t,"LVM");a=tS(s,t,l)}n(a)},[s,t,r]),Ut.createElement(k2,{isInline:!0,fieldId:o},Ut.createElement(T2,{hidden:!i,content:i},Ut.createElement(po,{name:dx,label:Ut.createElement(D2,{clusterId:e}),helperText:Ut.createElement(E2,null),isDisabled:!!i})))},mx=A2;import Gt from"react";import{FormGroup as F2,Tooltip as V2}from"@patternfly/react-core";import{ExternalLinkAltIcon as fx}from"@patternfly/react-icons";var gx="useOpenShiftDataFoundation",N2=()=>Gt.createElement(Gt.Fragment,null,"Install OpenShift Data Foundation"," ",Gt.createElement(W,{component:"a",headerContent:"Additional Requirements",bodyContent:Gt.createElement("a",{href:Au,target:"_blank",rel:"noopener noreferrer"},"Learn more about the requirements for OpenShift Data Foundation ",Gt.createElement(fx,null),".")})),H2=()=>Gt.createElement(Gt.Fragment,null,"Persistent software-defined storage for hybrid applications."," ",Gt.createElement("a",{href:Lu,target:"_blank",rel:"noopener noreferrer"},"Learn more"," ",Gt.createElement(fx,null))),O2=({openshiftVersion:e})=>{let t=be(),o=T(gx,"input"),r=e?t.getFeatureDisabledReason(e,"ODF"):void 0;return Gt.createElement(F2,{isInline:!0,fieldId:o},Gt.createElement(V2,{hidden:!r,content:r},Gt.createElement(po,{name:gx,label:Gt.createElement(N2,null),isDisabled:!!r,helperText:Gt.createElement(H2,null)})))},hx=O2;import rr,{useState as _2}from"react";import{FormGroup as W2,Tooltip as z2}from"@patternfly/react-core";import{useFormikContext as B2}from"formik";import va from"react";import{List as L2,ListItem as Cx}from"@patternfly/react-core";var M2=({clusterId:e})=>{let{preflightRequirements:t,error:o,isLoading:r}=Bs(e);if(r)return va.createElement(z,{content:"Loading hardware requirements ..."});if(o)return va.createElement(_,null);let s=t?.operators?.find(a=>a.operatorName===Wo),{qualitative:i=[],quantitative:n}=s?.requirements?.master;return va.createElement(L2,null,n&&va.createElement(Cx,null,"The host node requires an additional ",n.ramMib," MiB of memory"," ",n.diskSizeGb?",":" and"," ",n.cpuCores," CPUs",n?.diskSizeGb?` and ${n?.diskSizeGb} storage space`:""),i.map((a,l)=>va.createElement(Cx,{key:l},a)))},yx=M2;var vx="useOdfLogicalVolumeManager",U2=e=>rr.createElement(rr.Fragment,null,"Install OpenShift Data Foundation Logical Volume Manager"," ",rr.createElement(W,{component:"a",headerContent:"Additional Requirements",bodyContent:rr.createElement(yx,{clusterId:e.clusterId})}),rr.createElement(so,{featureId:"LVM",openshiftVersion:e.openshiftVersion})),G2=({clusterId:e,openshiftVersion:t})=>{let o=T(vx,"input"),r=be(),{values:s}=B2(),[i,n]=_2();return rr.useEffect(()=>{let a;if(t&&(a=r.getFeatureDisabledReason(t,"LVM"),!a)){let l=r.getFeatureSupportLevel(t,"LVM");a=oS(s,t,l)}n(a)},[s,t,r]),rr.createElement(W2,{isInline:!0,fieldId:o},rr.createElement(z2,{hidden:!i,content:i},rr.createElement(po,{name:vx,label:rr.createElement(U2,{clusterId:e,openshiftVersion:t}),helperText:"Storage virtualization that offers a more flexible approach for disk space management.",isDisabled:!!i})))},Sx=G2;var Ix=e=>{let t=$2(Ms),o=_r("ASSISTED_INSTALLER_OCS_FEATURE")&&!t,r=_r("ASSISTED_INSTALLER_CNV_FEATURE");return Fr.createElement(q2,{hasGutter:!0},Fr.createElement(tu,null,Fr.createElement(Ke,null,"Operators")),r&&Fr.createElement(tu,null,Fr.createElement(mx,{...e})),o&&Fr.createElement(tu,null,Fr.createElement(hx,{openshiftVersion:e.openshiftVersion})),t&&Fr.createElement(tu,null,Fr.createElement(Sx,{...e})))};var K2=e=>{let t=o=>!!e.find(r=>o.includes(r.name||""));return{useOpenShiftDataFoundation:t([_o]),useOdfLogicalVolumeManager:t([Wo]),useContainerNativeVirtualization:t([Mr])}},X2=({cluster:e})=>{let{alerts:t}=N(),o=ke(),r=ho(),{errors:s,touched:i,isSubmitting:n,isValid:a}=R2(),l=r||!a||!!t.length||n||!$v({cluster:e});return Zs.createElement(ye,{navigation:Zs.createElement(xt,{cluster:e}),footer:Zs.createElement(_t,{cluster:e,errorFields:ro(s,i),isSubmitting:n,isNextDisabled:l,onNext:()=>o.moveNext(),onBack:()=>o.moveBack()})},Zs.createElement(Ix,{clusterId:e.id,openshiftVersion:e.openshiftVersion}))},J2=({cluster:e})=>{let t=Y2(),{addAlert:o,clearAlerts:r}=N(),s=gi(e.monitoredOperators),i=Zs.useMemo(()=>K2(s),[]);return Zs.createElement(j2,{initialValues:i,onSubmit:async(a,{setFieldValue:l})=>{r();let p=qn.getOLMOperators(a,e);try{let{data:u}=await re.update(e.id,e.tags,{olmOperators:p}),c=qn.syncOperators(p,u.monitoredOperators);Object.keys(c).forEach(d=>{l(d,!0)}),t($e(u))}catch(u){x(u,()=>o({title:"Failed to update the cluster",message:Ge(u)}))}}},Zs.createElement(X2,{cluster:e}))},bx=J2;var Q2=({cluster:e,infraEnv:t,updateInfraEnv:o})=>{let{currentStepId:r}=ke(),s=Oo.useCallback(()=>{switch(r){case"host-discovery":return Oo.createElement(rb,{cluster:e});case"networking":return Oo.createElement(vI,{cluster:e});case"review":return Oo.createElement(bI,{cluster:e});case"operators":return Oo.createElement(bx,{cluster:e});case"storage":return Oo.createElement(gb,{cluster:e});case"static-ip-host-configurations":case"static-ip-network-wide-configurations":case"static-ip-yaml-view":return Oo.createElement(ux,{cluster:e,infraEnv:t,updateInfraEnv:o});case"cluster-details":default:return Oo.createElement(Op,{cluster:e,infraEnv:t})}},[r,e,t,o]);return r?Oo.createElement(Li,null,Oo.createElement("div",{className:Z2("pf-c-wizard","cluster-wizard")},s())):Oo.createElement(z,null)},ou=Q2;import Vr from"react";import{useDispatch as eq}from"react-redux";import{Button as xx,Modal as tq,ModalVariant as oq,ButtonVariant as kx,Text as rq,TextContent as sq}from"@patternfly/react-core";var iq=()=>{let e=eq(),[t,o]=Vr.useState(!1),[r,s]=Vr.useState(null),{cancelInstallationDialog:i}=se(),{data:n,isOpen:a,close:l}=i,p=n?.clusterId;if(!p)return null;let u=async()=>{o(!0);try{s(null);let{data:d}=await M.cancel(p);e($e(d)),l()}catch(d){x(d,()=>{s({title:"Failed to abort cluster installation",message:D(d)})})}o(!1)},c=()=>t?Vr.createElement(z,{content:"Aborting cluster installation..."}):r?Vr.createElement(_,{title:r.title,content:r.message}):Vr.createElement(sq,null,Vr.createElement(rq,{component:"p"},"This will abort cluster installation. Are you sure you want to proceed?"));return Vr.createElement(tq,{title:"Abort Cluster Installation",isOpen:a,variant:oq.small,actions:[Vr.createElement(xx,{key:"submit",variant:kx.danger,onClick:u,isDisabled:t},"Abort Installation"),Vr.createElement(xx,{key:"cancel",variant:kx.link,onClick:l,isDisabled:t},"Cancel")],onClose:l},c())},ru=iq;import Pt from"react";import{useDispatch as nq}from"react-redux";import{Button as Tx,Modal as aq,ModalVariant as lq,ButtonVariant as Px,Text as su,TextContent as pq}from"@patternfly/react-core";import{ExclamationTriangleIcon as uq}from"@patternfly/react-icons";import{global_warning_color_100 as cq}from"@patternfly/react-tokens";var dq=()=>{let e=nq(),[t,o]=Pt.useState(!1),[r,s]=Pt.useState(null),{resetClusterDialog:i}=se(),{data:n,isOpen:a,close:l}=i,p=n?.cluster;if(!p)return null;let u=()=>{o(!1),s(null),l()},c=async()=>{o(!0);try{s(null);let{data:h}=await M.reset(p.id);e($e(h)),l()}catch(h){x(h,()=>{s({title:"Failed to reset cluster installation",message:D(h)})})}o(!1)},d=`${Math.round(Ly(p)/((p.hosts?.length||0)+1)*100)} `,m=()=>t?Pt.createElement(z,{content:"Resetting cluster installation..."}):r?Pt.createElement(_,{title:r.title,content:r.message}):Pt.createElement(pq,null,Pt.createElement(su,{component:"p"},"This will reset the installation and return to the cluster configuration. Some hosts may need to be re-registered by rebooting into the Discovery ISO."),Pt.createElement(su,{component:"p"},Pt.createElement("strong",null,"Download the installation logs")," to troubleshoot or report a bug.",Pt.createElement("br",null),"Currently, ",d,"% of the installation logs were collected and are ready for download."),Pt.createElement(su,{component:"p"},Pt.createElement(uq,{className:"status-icon",color:cq.value,size:"sm"})," ","Logs won't be available after the installation is reset."),Pt.createElement(su,{component:"p"},"Are you sure you want to reset the cluster?")),g=[Pt.createElement(Tx,{key:"reset",variant:Px.danger,onClick:c,isDisabled:t},"Reset Cluster")];return g.push(Pt.createElement(Tx,{key:"cancel",variant:Px.link,onClick:u,isDisabled:t},"Cancel")),Pt.createElement(aq,{title:"Reset Cluster Installation",isOpen:a,variant:lq.small,actions:g,onClose:u},m())},iu=dq;import wx from"react";import{Button as mq,ButtonVariant as fq,Modal as gq,ModalVariant as hq}from"@patternfly/react-core";var Cq=()=>wx.createElement(gq,{title:"Unable to fetch the latest data",isOpen:!0,variant:hq.small,showClose:!1,titleIconVariant:"danger",actions:[wx.createElement(mq,{key:"refresh",variant:fq.primary,onClick:()=>window.location.reload()},"Refresh page")]},"There was an error fetching the latest data from the API. We'll try again, but if the data does not update in a few minutes, try refreshing the page."),nu=Cq;import yq from"react";var Ki=({children:e})=>yq.createElement(pS,{...{exceptionReporter:(o,r,s)=>{vs(o)?x(o):Lo(o,r,s)}}},e);import Qs from"react";import{useLocation as Sq}from"react-router-dom";import Iq from"lodash/isEqual";import{useDispatch as vq}from"react-redux";function Zm(){let e=vq();return(t,o)=>{if(!t)return;let r=Bd(t);o&&(r={...r,...Kl(o||{})}),e($y(r))}}var Sa=e=>{let t=[...$S];return e===xe.YAML?t.splice(1,0,"static-ip-yaml-view"):e===xe.FORM&&t.splice(1,0,...Dp),t},bq=({children:e,cluster:t,infraEnv:o,permissions:r})=>{let[s,i]=Qs.useState(),[n,a]=Qs.useState(),{state:l}=Sq(),p=Zm();Qs.useEffect(()=>{let c=o?Xs(o):void 0,d=Bv(l,c,t?.status,t?.hosts),m=Sa(c?.view);i(d),a(m),p(t,r)},[]);let u=Qs.useMemo(()=>{if(!n||!s)return null;let c=()=>{let m=o?Xs(o):void 0;if(!m)throw`Wizard step is currently ${s}, but no static ip info is defined`;let g=Sa(m.view);Iq(g,n)||a(g)},d=m=>{zs(s)&&!zs(m)&&c(),i(m)};return{moveBack(){let m=n.indexOf(s),g=n[m-1];g==="static-ip-host-configurations"&&(g="static-ip-network-wide-configurations"),d(g)},moveNext(){let m=n.indexOf(s);d(n[m+1])},onUpdateStaticIpView(m){a(Sa(m)),m===xe.YAML?i("static-ip-yaml-view"):i("static-ip-network-wide-configurations")},onUpdateHostNetworkConfigType(m){m===De.STATIC?a(Sa(xe.FORM)):a(Sa())},wizardStepIds:n,currentStepId:s,setCurrentStepId:d}},[n,s,o]);return u?Qs.createElement(Qs.Fragment,null,Qs.createElement(BS.Provider,{value:u},e)):null},Xi=bq;var Dx=()=>{let e=[];return To()||e.push($.createElement(Tq,{key:"cancel",variant:Pq.secondary,component:t=>$.createElement(kq,{to:Ud,...t})},"Back")),e},rf=()=>$.createElement(Qm,{"data-testid":"ai-cluster-details-card"},$.createElement(tf,null,$.createElement(of,{headingLevel:"h1",size:"lg",className:"card-title"},"Loading additional details")),$.createElement(ef,null,$.createElement(z,null))),wq=({clusterId:e})=>{let t=oa(e);return $.createElement(Qm,{"data-testid":"ai-cluster-details-card"},$.createElement(tf,null,$.createElement(of,{headingLevel:"h1",size:"lg",className:"card-title"},"Loading additional details")),$.createElement(ef,null,$.createElement(_,{title:"Failed to fetch the cluster",fetchData:t,actions:Dx()})))},Dq=()=>$.createElement(Qm,{"data-testid":"ai-cluster-details-card"},$.createElement(tf,null,$.createElement(of,{headingLevel:"h1",size:"lg",className:"card-title"},"Loading additional details")),$.createElement(ef,null,$.createElement(_,{title:"Failed to retrieve the default configuration",actions:Dx()}))),Eq=({aiClusterId:e,allEnabledFeatures:t,permissions:o})=>{let{cluster:r,uiState:s}=wp(e),{infraEnv:i,isLoading:n,error:a,updateInfraEnv:l}=Pr(e,L.USE_DAY1_ARCHITECTURE);if(s===Q.LOADING||n)return $.createElement(rf,null);if(s===Q.ERROR&&!r||a)return $.createElement(wq,{clusterId:e});if(!r||!i||r.status==="adding-hosts")return null;let p=["insufficient","ready","pending-for-input"].includes(r.status),u=$.createElement(Xi,{cluster:r,infraEnv:i,permissions:o},p?$.createElement(ou,{cluster:r,infraEnv:i,updateInfraEnv:l}):$.createElement(Cm,{cluster:r})),c=s===Q.ERROR;return $.createElement(Ps,{features:t},$.createElement($o,null,$.createElement(Ki,null,$.createElement(Ei,null,$.createElement(Mi,{loadingUI:$.createElement(rf,null),errorUI:$.createElement(Dq,null)},$.createElement(Ao,{loadingUi:$.createElement(rf,null),cluster:r},u),c&&$.createElement(nu,null),$.createElement(ru,null),$.createElement(iu,null),$.createElement(Gi,null))))))},Aq=e=>$.createElement(xq,{store:Sr},$.createElement(Eq,{...e})),Fq=Aq;import ei from"react";import{Provider as Vq}from"react-redux";import{useSelector as Nq}from"react-redux";import{Grid as Hq}from"@patternfly/react-core";var Oq=({allEnabledFeatures:e})=>{let{data:t}=Nq(jn);return!t||t.status==="adding-hosts"?null:ei.createElement(Ps,{features:e},ei.createElement(Ao,{loadingUi:ei.createElement("div",null),cluster:t},ei.createElement(Hq,{className:"pf-u-mt-md"},ei.createElement(bp,{cluster:t,externalMode:!0}))))},Lq=e=>ei.createElement(Vq,{store:Sr},ei.createElement(Oq,{...e})),Mq=Lq;import _e from"react";import{useDispatch as IY,useSelector as _x}from"react-redux";import{Button as bY,ButtonVariant as xY,PageSectionVariants as Ia,TextContent as kY,Text as TY,PageSection as ba}from"@patternfly/react-core";import{AddCircleOIcon as PY}from"@patternfly/react-icons";import lt from"react";import{Table as nY,TableHeader as aY,TableBody as lY,RowWrapper as pY,SortByDirection as uY,cellWidth as Nx,breakWord as Hx,sortable as cY}from"@patternfly/react-table";import{createElement as sf}from"react";import{Modal as _q,Button as Ex,ModalVariant as Wq}from"@patternfly/react-core";var zq=({name:e,onClose:t,onDelete:o})=>sf(_q,{title:"Delete cluster",isOpen:!0,onClose:t,variant:Wq.small,actions:[sf(Ex,{"data-testid":"delete-cluster-submit",key:"confirm",variant:"danger",onClick:o},"Delete"),sf(Ex,{key:"cancel",variant:"link",onClick:t},"Cancel")]},"Are you sure you want to delete cluster ",e," ?"),Ax=zq;import et from"react";import{useDispatch as Bq,useSelector as Uq}from"react-redux";import{useHistory as Gq}from"react-router-dom";import{Toolbar as $q,ToolbarItem as qq,ToolbarContent as Yq,ToolbarFilter as jq,InputGroup as Rq,Select as Kq,SelectOption as Xq,TextInput as Jq,ButtonVariant as Fx,Spinner as Zq,ToolbarGroup as Qq,Tooltip as eY}from"@patternfly/react-core";import{FilterIcon as tY,SyncIcon as oY}from"@patternfly/react-icons";import rY from"lodash/omit";var sY=e=>Array.from(new Set(Object.values(rY(dr(e),"adding-hosts")))),iY=({searchString:e,setSearchString:t,filters:o,setFilters:r})=>{let[s,i]=et.useState(!1),n=Gq(),a=Uq(Rn),l=Bq(),p=et.useCallback(()=>l(Hs()),[l]),u=()=>{r({status:[]})},c=t,d=(y,v,w)=>{r({...o,[y]:v?[...o[y],w]:o[y].filter(E=>E!==w)})},m=()=>i(!s),g=(y,v)=>{d("status",y.target.checked,v)},h=(y,v)=>{y?r({...o,[y]:o[y].filter(w=>w!==v)}):u()},C=y=>{r({...o,[y]:[]})},I=et.createElement(et.Fragment,null,et.createElement(tY,null)," Status"),{t:S}=f();return et.createElement($q,{id:"clusters-list-toolbar",className:"pf-m-toggle-group-container",collapseListedFiltersBreakpoint:"xl",clearAllFilters:u},et.createElement(Yq,null,et.createElement(qq,null,et.createElement(Rq,null,et.createElement(Jq,{name:"search-string",id:"search-string",type:"search","aria-label":"string to be searched in cluster names or ids",onChange:c,value:e,placeholder:"Filter by Name, ID or Base domain",title:"Filter by Name, ID or Base domain"}))),et.createElement(jq,{chips:o.status,deleteChip:h,deleteChipGroup:C,categoryName:"status"},et.createElement(Kq,{variant:"checkbox","aria-label":"status",onToggle:m,onSelect:g,selections:o.status,isOpen:s,placeholderText:I,toggleId:"cluster-list-filter-status"},sY(S).map(y=>et.createElement(Xq,{key:y,value:y,inputId:`cluster-list-filter-status-${y}`})))),et.createElement(ht,{variant:Fx.primary,onClick:()=>n.push(`${ue}/clusters/~new`),id:"button-create-new-cluster","data-ouia-id":"button-create-new-cluster"},"Create Cluster"),a===Q.RELOADING&&et.createElement(Zq,{size:"lg"}),et.createElement(Qq,{alignment:{lg:"alignRight"}},et.createElement(ht,{variant:Fx.plain,onClick:()=>p(),isDisabled:a===Q.RELOADING},et.createElement(eY,{content:"Refresh"},et.createElement(oY,null))))))},Vx=iY;var dY=({rowData:e})=>e?.props.id,Ox="assisted-installer-cluster-list-filters",sr={transforms:[cY],cellTransforms:[],formatters:[],cellFormatters:[],props:{}},mY=[{title:"Name",dataLabel:"Name",...sr,transforms:sr?.transforms?.concat(Nx(20)),cellTransforms:sr?.cellTransforms?.concat(Hx)},{title:"Base domain",dataLabel:"Base domain",...sr,transforms:sr?.transforms?.concat(Nx(40)),cellTransforms:sr?.cellTransforms?.concat(Hx)},{title:"Version",dataLabel:"Version",...sr},{title:"Status",dataLabel:"Status",...sr},{title:"Hosts",dataLabel:"Hosts",...sr},{title:"Created at",dataLabel:"Created at",...sr}],fY=e=>e.cells?.[3],gY=e=>lt.createElement(pY,{...e,"data-testid":`cluster-row-${e.row?.props?.name}`,id:`cluster-row-${e.row?.props?.name}`}),hY=({rows:e,deleteCluster:t})=>{let[o,r]=lt.useState(),[s,i]=lt.useState({index:0,direction:uY.asc}),[n,a]=lt.useState(""),[l,p]=lt.useState({status:[]}),{t:u}=f();lt.useEffect(()=>{let h=window.sessionStorage.getItem(Ox);if(h)try{let C=JSON.parse(h);C.filters&&p(C.filters),C.sortBy&&i(C.sortBy),C.searchString&&a(C.searchString)}catch(C){console.info("Failed to restore clusters filter: ",C)}},[]),lt.useEffect(()=>{window.sessionStorage.setItem(Ox,JSON.stringify({filters:l,sortBy:s,searchString:n}))},[l,s,n]);let c=lt.useCallback(h=>[{title:"Delete",id:`button-delete-${h.props.name}`,isDisabled:Wd(h).sortableValue===dr(u).installing,onClick:(C,I,S)=>{r({id:S.props.id,name:S.props.name})}}],[r]),d=lt.useCallback((h,C,I)=>{i({index:C,direction:I})},[i]),m=lt.useCallback(h=>{let C=[h.props.name,h.props.id,h.props.baseDnsDomain].map(S=>(S||"").toLowerCase());if(n&&!C.find(S=>S.includes(n.toLowerCase())))return!1;let I=fY(h)?.sortableValue;return!(l.status.length>0&&I&&!l.status.includes(I))},[n,l]),g=lt.useMemo(()=>e.filter(m).sort(ll(s,(h,C=0)=>h.cells?.[C])),[e,s,m]);return lt.createElement(lt.Fragment,null,lt.createElement(Vx,{searchString:n,setSearchString:a,filters:l,setFilters:p}),lt.createElement(nY,{rows:g,cells:mY,actionResolver:c,"aria-label":"Clusters table",sortBy:s,onSort:d,rowWrapper:gY,"data-testid":"clusters-table"},lt.createElement(aY,null),lt.createElement(lY,{rowKey:dY})),o&<.createElement(Ax,{name:o.name,onClose:()=>r(void 0),onDelete:()=>{t(o.id),r(void 0)}}))},Lx=hY;import fs from"react";import{PageSectionVariants as CY,Breadcrumb as yY,BreadcrumbItem as au,PageSection as vY}from"@patternfly/react-core";import{Link as Mx}from"react-router-dom";var SY=({clusterName:e,isHidden:t=To()})=>t?null:fs.createElement(vY,{variant:CY.light},(e||oe)&&fs.createElement(yY,null,fs.createElement(au,null,fs.createElement(Mx,{to:"/"},"Clusters")),e?fs.createElement(au,null,fs.createElement(Mx,{to:`${ue}/clusters`},"Assisted Clusters")):fs.createElement(au,{isActive:!0},"Assisted Clusters"),e&&fs.createElement(au,{isActive:!0},e))),ti=SY;var wY=({history:e})=>{let{LOADING:t,EMPTY:o,ERROR:r,RELOADING:s}=Q,{addAlert:i}=N(),{t:n}=f(),a=_x(zd(n)),l=_x(Rn),p=_e.useRef(l);l!==s&&(p.current=l);let u=IY(),c=_e.useCallback(async m=>{try{await re.remove(m),u(by(m))}catch(g){x(g,()=>i({title:"Cluster could not be deleted",message:D(g)}))}},[u,i]),d=_e.useCallback(()=>u(Hs()),[u]);switch(_e.useEffect(()=>{d()},[d]),p.current){case t:return _e.createElement(ba,{variant:Ia.light,isFilled:!0},_e.createElement(z,null));case r:return _e.createElement(ba,{variant:Ia.light,isFilled:!0},_e.createElement(_,{title:"Failed to fetch clusters.",fetchData:d}));case o:return _e.createElement(ba,{variant:Ia.light,isFilled:!0},_e.createElement(bo,{icon:PY,title:"Create new assisted cluster",content:"There are no clusters yet. This wizard is going to guide you through the OpenShift cluster deployment.",primaryAction:_e.createElement(bY,{variant:xY.primary,onClick:()=>e.push(`${ue}/clusters/~new`),id:"empty-state-new-cluster-button","data-ouia-id":"button-create-new-cluster"},"Create New Cluster")}));default:return _e.createElement(_e.Fragment,null,_e.createElement(ti,null),_e.createElement(ba,{variant:Ia.light},_e.createElement(kY,null,_e.createElement(TY,{component:"h1"},"Assisted Clusters"))),_e.createElement(ba,{variant:Ia.light,isFilled:!0},_e.createElement(gr,null),_e.createElement(Lx,{rows:a,deleteCluster:m=>void c(m)})))}},DY=e=>_e.createElement($o,null,_e.createElement(wY,{...e})),nf=DY;import $t from"react";import{PageSectionVariants as Ux,TextContent as WY,Text as zY,PageSection as Gx}from"@patternfly/react-core";import EY from"classnames";import Wx from"react";var AY=()=>Wx.createElement("div",{className:EY("pf-c-wizard","cluster-wizard")},Wx.createElement(Op,null)),zx=AY;import{PageSection as FY,PageSectionVariants as VY}from"@patternfly/react-core";import Bx from"react";var NY=()=>Bx.createElement(FY,{variant:VY.light,isFilled:!0},Bx.createElement(z,null)),oi=NY;import lu from"react";import{Button as HY,ButtonVariant as OY,PageSection as LY,PageSectionVariants as MY}from"@patternfly/react-core";import{Link as _Y}from"react-router-dom";var pu=()=>To()?[]:[lu.createElement(HY,{key:"cancel",variant:OY.secondary,component:e=>lu.createElement(_Y,{to:`${ue}/clusters`,...e})},"Back")],uu=()=>lu.createElement(LY,{variant:MY.light,isFilled:!0},lu.createElement(_,{title:"Failed to retrieve the default configuration",actions:pu()}));var BY=()=>$t.createElement($o,null,$t.createElement(Ki,null,$t.createElement(Mi,{loadingUI:$t.createElement(oi,null),errorUI:$t.createElement(uu,null)},$t.createElement(Ao,{loadingUi:$t.createElement(oi,null)},$t.createElement(ti,{clusterName:"New cluster"}),$t.createElement(Gx,{variant:Ux.light},$t.createElement(WY,null,$t.createElement(zY,{component:"h1",className:"pf-u-display-inline"},"Install OpenShift with the Assisted Installer"))),$t.createElement(Gx,{variant:Ux.light,isFilled:!0},$t.createElement(Xi,null,$t.createElement(zx,null))))))),xa=BY;import G from"react";import{Redirect as Ck}from"react-router-dom";import{PageSection as Ji,PageSectionVariants as Zi,Text as yk,TextContent as vk}from"@patternfly/react-core";import Ue from"react";import{ButtonVariant as L4,Card as M4,CardBody as _4,CardFooter as W4,CardTitle as z4,Grid as B4,Stack as U4,StackItem as hk,Title as G4,Toolbar as $4,ToolbarContent as q4}from"@patternfly/react-core";import fo from"react";import{Text as A4,TextContent as F4,Alert as V4,AlertVariant as N4,Stack as H4,StackItem as pf}from"@patternfly/react-core";import gs from"react";import $x from"react";var qx=$x.createContext(null),mo=()=>{let e=$x.useContext(qx);if(!e)throw new Error("useDay2WizardContext must be used within Day2WizardContextProvider");return e},Yx=qx;var jx={"cluster-details":"Cluster details","static-ip-yaml-view":"Static network configurations","static-ip-network-wide-configurations":"Network-wide configurations","static-ip-host-configurations":"Host specific configurations","generate-iso":"Generate discovery ISO","download-iso":"Download discovery ISO"},Rx=["cluster-details","generate-iso","download-iso"],cu=["static-ip-network-wide-configurations","static-ip-host-configurations"];var du=e=>{let t=[...Rx];return e===xe.YAML?t.splice(1,0,"static-ip-yaml-view"):e===xe.FORM&&t.splice(1,0,...cu),t},Kx=(e,t)=>{let o=e.indexOf(t);return e[o+1]},UY=({children:e})=>{let[t,o]=gs.useState("cluster-details"),[r,s]=gs.useState(L.x86),[i,n]=gs.useState(""),[a,l]=gs.useState(du()),p=gs.useMemo(()=>!a||!t?null:{moveBack(){let u=a.indexOf(t),c=a[u-1];c==="static-ip-host-configurations"&&(c="static-ip-network-wide-configurations"),o(c)},moveNext(){o(Kx(a,t))},onUpdateStaticIpView(u){l(du(u)),u===xe.YAML?o("static-ip-yaml-view"):o("static-ip-network-wide-configurations")},onUpdateHostNetworkConfigType(u){let c;u===De.STATIC?c=du(xe.FORM):c=du(),l(c),o(Kx(c,t))},wizardStepIds:a,currentStepId:t,setCurrentStepId:o,selectedIsoUrl:i,setSelectedIsoUrl:n,selectedCpuArchitecture:r,setSelectedCpuArchitecture:s},[a,t,i,r]);return p?gs.createElement(gs.Fragment,null,gs.createElement(Yx.Provider,{value:p},e)):null},Xx=UY;import GY from"react";import{Button as $Y,ButtonVariant as qY}from"@patternfly/react-core";var YY=({cluster:e})=>{let{day2DiscoveryImageDialog:t}=se(),{open:o}=t;return GY.createElement($Y,{variant:qY.secondary,onClick:()=>o({cluster:e}),id:"bare-metal-inventory-add-host-button-download-discovery-iso"},"Add hosts")},Jx=YY;import nr from"react";import{Modal as k4,ModalVariant as T4,WizardHeader as P4}from"@patternfly/react-core";import w4 from"classnames";import{Grid as l4,GridItem as lf}from"@patternfly/react-core";import{Form as p4,Formik as u4}from"formik";import pt from"react";import Nr from"react";import{FormGroup as jY,Flex as RY,FlexItem as KY,TextContent as XY,Text as JY,TextVariants as ZY}from"@patternfly/react-core";var Zx="cpuArchitecture",QY=({canSelectCpuArchitecture:e,day1CpuArchitecture:t,openshiftVersion:o})=>{let{t:r}=f();return e?Nr.createElement(jY,{isInline:!0,fieldId:T(Zx,"radio"),label:Nr.createElement(XY,null,Nr.createElement(JY,{component:ZY.h4},r("ai:CPU architecture"),Nr.createElement(so,{featureId:"MULTIARCH_RELEASE_IMAGE",openshiftVersion:o})))},Nr.createElement(RY,null,ii.map(s=>Nr.createElement(KY,{key:s},Nr.createElement(Re,{key:s,id:`cpu-arch_${s}`,name:Zx,label:s,value:s,"data-testid":`cpu-arch_${s}`}))))):Nr.createElement(It,null,Nr.createElement(A,{title:r("ai:CPU architecture"),value:t,testId:"cpu-architecture"}))},Qx=QY;import mu from"react";import{WizardNav as ek,WizardNavItem as tk}from"@patternfly/react-core";var e4=()=>{let e=mo(),t=n=>!e.wizardStepIds.slice(n).includes(e.currentStepId),o=(n,a)=>a==="cluster-details"?!1:t(n),r=(n,a)=>mu.createElement(tk,{step:n,key:a,content:jx[a],onNavItemClick:()=>e.setCurrentStepId(a),isCurrent:e.currentStepId===a,isDisabled:o(n,a)}),s=n=>mu.createElement(tk,{step:n,isExpandable:!0,content:"Static network configurations",key:"static-network-configuration-form-view",isCurrent:zs(e.currentStepId),isDisabled:t(n)},mu.createElement(ek,{returnList:!0},cu.map((a,l)=>r(n+l,a))));return mu.createElement(ek,null,(()=>{let n=[],a=0;for(;a<e.wizardStepIds.length;){let l=e.wizardStepIds[a];l==="static-ip-network-wide-configurations"?(n.push(s(a)),a+=2):(n.push(r(a,l)),a+=1)}return n})())},ir=e4;import hs from"react";import{Flex as t4,FlexItem as ok,FormGroup as o4,TextContent as r4,TextVariants as s4,Text as i4}from"@patternfly/react-core";import{useFormikContext as n4}from"formik";var af="hostsNetworkConfigurationType",a4=()=>{let{setFieldValue:e}=n4(),t=o=>{e("hostsNetworkConfigurationType",o.target.value)};return hs.createElement(o4,{label:hs.createElement(r4,null,hs.createElement(i4,{component:s4.h4},"Hosts' network configuration")),fieldId:T(af,"radio"),isInline:!0,onChange:t},hs.createElement(t4,null,hs.createElement(ok,{key:De.DHCP},hs.createElement(Re,{name:af,value:De.DHCP,label:"DHCP only"})),hs.createElement(ok,{key:De.STATIC},hs.createElement(Re,{name:af,value:De.STATIC,label:"Static IP, bridges, and bonds"}))))},rk=a4;var sk=e=>{switch(e){case go.x86:case go.MULTI:return L.x86;case go.ARM:return L.ARM;default:throw new Error(`Unknown OCM CPU architecture: ${e}`)}},ik=e=>{switch(e){case L.ARM:case go.ARM:return L.ARM;case L.DAY1_CLUSTER_USES_MULTI:case go.MULTI:case L.x86:case go.x86:default:return L.x86}};var c4=async(e,t)=>{try{let o=await it.getInfraEnv(e,t);return{cpuArchitecture:t,hostsNetworkConfigurationType:o.staticNetworkConfig?De.STATIC:De.DHCP}}catch(o){return x(o),null}},d4=()=>{let{day2DiscoveryImageDialog:e}=se(),{close:t,data:{cluster:o}}=e,r=mo(),[s,i]=pt.useState(),[n,a]=pt.useState(!1),l=$a(o),p=ik(o.cpuArchitecture);pt.useEffect(()=>{(async()=>{let d=await c4(o.id,p);i(d)})()},[o.id,p]);let u=pt.useCallback(async c=>{try{a(!0),c.hostsNetworkConfigurationType===De.DHCP&&await it.updateAllInfraEnvsToDhcp(o.id),r.setSelectedCpuArchitecture(c.cpuArchitecture),r.onUpdateHostNetworkConfigType(c.hostsNetworkConfigurationType)}catch(d){x(d)}finally{a(!1)}},[o.id,r]);return s===void 0?pt.createElement(z,null):s===null?pt.createElement(_,{content:"Failed to load associated data for the Day2 cluster"}):pt.createElement(u4,{initialValues:s,onSubmit:u},({submitForm:c})=>pt.createElement(ye,{navigation:pt.createElement(ir,null),footer:pt.createElement($r,{onNext:()=>{c()},onBack:()=>r.moveBack(),isBackDisabled:r.currentStepId==="cluster-details",isNextDisabled:r.currentStepId==="download-iso",onCancel:t,isSubmitting:n})},pt.createElement(p4,{id:"day2-wizard-cluster-details__form"},pt.createElement(l4,{hasGutter:!0},pt.createElement(lf,null,pt.createElement(Ke,null,"Cluster details")),pt.createElement(lf,{span:12,lg:10,xl:9,xl2:7},pt.createElement(Qx,{canSelectCpuArchitecture:l,day1CpuArchitecture:p,openshiftVersion:o.openshiftVersion})),pt.createElement(lf,null,pt.createElement(rk,null))))))},nk=d4;import ri from"react";import{Stack as m4,StackItem as ak}from"@patternfly/react-core";var f4=()=>{let{day2DiscoveryImageDialog:e}=se(),{close:t,data:o}=e,r=o.cluster,s=mo();return ri.createElement(ye,{navigation:ri.createElement(ir,null)},ri.createElement(m4,{hasGutter:!0},ri.createElement(ak,null,ri.createElement(Ke,null,"Download Discovery ISO")),ri.createElement(ak,null,ri.createElement(Mp,{onClose:t,onReset:()=>s.moveBack(),clusterName:r?.name||"cluster",isSNO:le(r),isoDownloadUrl:s.selectedIsoUrl,cpuArchitecture:s.selectedCpuArchitecture}))))},lk=f4;import Cs from"react";import{Stack as g4,StackItem as pk}from"@patternfly/react-core";var h4=()=>{let{day2DiscoveryImageDialog:e}=se(),{close:t,data:o}=e,r=o.cluster,s=mo(),{getIsoImageUrl:i}=aa(),n=Cs.useCallback(async()=>{let a=await i(r.id,s.selectedCpuArchitecture);a.error||(s.setSelectedIsoUrl(a.url),s.moveNext())},[r?.id,s,i]);return Cs.createElement(ye,{navigation:Cs.createElement(ir,null)},Cs.createElement(g4,{hasGutter:!0},Cs.createElement(pk,null,Cs.createElement(Ke,null,"Generate Discovery ISO")),Cs.createElement(pk,null,Cs.createElement(Lp,{cluster:r,cpuArchitecture:s.selectedCpuArchitecture,onCancel:t,onSuccess:n}))))},uk=h4;import Ee from"react";import{Grid as C4,TextContent as y4,Text as ck,TextVariants as dk,PageSection as v4,PageSectionVariants as S4,Button as I4,ButtonVariant as b4}from"@patternfly/react-core";var x4=()=>{let{day2DiscoveryImageDialog:e}=se(),t=mo(),[o,r]=Ee.useState(void 0),[s,i]=Ee.useState(!1),[n,a]=Ee.useState(!1),[l,p]=Ee.useState(!1),[u,c]=Ee.useState(Hy()),[d,m]=Ee.useState(),{data:{cluster:g}}=e,h=t.selectedCpuArchitecture,C=Ee.useCallback(()=>{t.setCurrentStepId("cluster-details"),t.onUpdateHostNetworkConfigType(De.DHCP)},[t]);Ee.useEffect(()=>{(async()=>{let F;try{F=await it.getInfraEnv(g.id,h)}catch{i(!0),r(void 0);return}F.staticNetworkConfig||(F=await it.setDummyStaticConfigToInfraEnv(F.id));let q=Xs(F);q?(r(F),c(q)):i(!0)})()},[g.id,h]);let I=Ee.useCallback(E=>{t.onUpdateStaticIpView(E),p(!0)},[]);if(s)return Ee.createElement(v4,{variant:S4.light,isFilled:!0},Ee.createElement(_,{title:"Cannot load the Static IP configuration for this cluster",content:"For non-multi-architecture clusters, make sure you select the Day1 cpu architecture",actions:[Ee.createElement(I4,{key:"restart-wizard",variant:b4.primary,onClick:C},"Back to Wizard")]}));if(!o)return Ee.createElement(z,null);let y={infraEnv:o,onFormStateChange:E=>{let F=t.currentStepId==="static-ip-host-configurations"||!E.isEmpty;a(F),m(E)},updateInfraEnv:async E=>{let F=await it.syncStaticIpConfigs(g.id,o.id,E.staticNetworkConfig);return r(F),F},showEmptyValues:l},w=(()=>{if(u.view===xe.YAML&&!l)return Ee.createElement(fa,{...y});switch(t.currentStepId){case"static-ip-yaml-view":return Ee.createElement(fa,{...y});case"static-ip-host-configurations":return Ee.createElement(Zp,{...y});case"static-ip-network-wide-configurations":return Ee.createElement(Qp,{...y});default:throw`Unexpected wizard step id ${t.currentStepId} when entering static ip page`}})();return w?Ee.createElement(ye,{navigation:Ee.createElement(ir,null),footer:Ee.createElement($r,{onNext:()=>t.moveNext(),onBack:()=>t.moveBack(),isNextDisabled:!d?.isValid||d.isAutoSaveRunning,onCancel:e.close,isSubmitting:d?.isSubmitting})},Ee.createElement(C4,{hasGutter:!0},Ee.createElement(y4,null,Ee.createElement(ck,{component:dk.h2},"Static network configurations"),Ee.createElement(ck,{component:dk.small},"Network configuration can be done using either the form view or YAML view. Configurations done in this step are for discovering hosts.")),Ee.createElement(zp,{initialView:u.view,confirmOnChangeView:n,onChangeView:I}),w)):null},mk=x4;var D4=(e,t)=>{switch(e){case"cluster-details":return nr.createElement(nk,null);case"generate-iso":return nr.createElement(uk,null);case"download-iso":return nr.createElement(lk,null);case"static-ip-network-wide-configurations":case"static-ip-host-configurations":case"static-ip-yaml-view":return nr.createElement(mk,null);default:return nr.createElement(ye,{navigation:nr.createElement(ir,null),footer:nr.createElement($r,{onNext:()=>t.moveNext(),onBack:()=>t.moveBack(),isBackDisabled:t.currentStepId==="cluster-details",isNextDisabled:t.currentStepId==="download-iso",onCancel:close})},"Step ",e)}},E4=()=>{let{day2DiscoveryImageDialog:e}=se(),{isOpen:t,close:o}=e,r=mo();return nr.createElement(k4,{isOpen:t,variant:T4.large,showClose:!1,hasNoBodyWrapper:!0},nr.createElement("div",{className:w4("pf-c-wizard","cluster-wizard")},nr.createElement(P4,{title:"Add hosts",description:"Choose the settings for adding a new host",onClose:o}),D4(r.currentStepId,r)))},fk=E4;var O4=({cluster:e})=>{if(!e)return null;let t=!$a(e)&&zo(e);return fo.createElement(H4,{hasGutter:!0},fo.createElement(pf,null,fo.createElement(F4,null,fo.createElement(A4,{component:"p"},fo.createElement(Xx,null,fo.createElement(Jx,{cluster:e}),fo.createElement(fk,null))),fo.createElement(Wp,{cluster:e}))),t&&fo.createElement(pf,null,fo.createElement(V4,{title:"Only hosts that have arm64 cpu architecture can be added to this cluster.",variant:N4.info,"data-testid":"arm-architecture-alert",isInline:!0})),fo.createElement(pf,null,fo.createElement(Ni,{cluster:e})))},gk=O4;var{addAlert:Y4}=qr.actions,fu=()=>{let{cluster:e,resetCluster:t}=Ue.useContext(jr),[o,r]=Ue.useState(!1),s=Wi(e),i=Ue.useCallback(async()=>{r(!0);try{if(!e||!t||!e.hosts)return;let n=e.hosts.filter(a=>Ya(e,a.status));await mt.installAll(n),await t()}catch(n){x(n,()=>Y4({title:"Failed to start hosts installation.",message:D(n)}))}finally{setTimeout(()=>{r(!1)},1e4)}},[e,t]);return!e||!t?null:Ue.createElement(Ei,null,Ue.createElement(M4,null,Ue.createElement(z4,null,Ue.createElement(G4,{headingLevel:"h2",size:"lg",className:"card-title"},"Host Discovery")),Ue.createElement(_4,null,Ue.createElement(U4,{hasGutter:!0},Ue.createElement(hk,null,Ue.createElement(B4,{hasGutter:!0},Ue.createElement(zi,{cluster:e,clusterVarieties:s}))),Ue.createElement(hk,null,Ue.createElement(gk,{cluster:e})))),Ue.createElement(W4,null,Ue.createElement(gr,null),Ue.createElement($4,{id:"cluster-toolbar"},Ue.createElement(q4,null,Ue.createElement(ht,{variant:L4.primary,name:"install",onClick:()=>void i(),isDisabled:o||Ra(e)===0},"Install ready hosts"),Ue.createElement(Gr,{cluster:e,onFetchEvents:Do}))))),Ue.createElement(Gi,null))};var j4=({match:e})=>{let{clusterId:t}=e.params,o=oa(t),{cluster:r,uiState:s,errorDetail:i}=wp(t),{infraEnv:n,isLoading:a,error:l,updateInfraEnv:p}=Pr(t,L.USE_DAY1_ARCHITECTURE),u=(c,d)=>c.status==="adding-hosts"?G.createElement(Il,{cluster:c,resetCluster:Jr},G.createElement(fu,null)):["preparing-for-installation","installing","installing-pending-user-action","finalizing","installed","error","cancelled"].includes(c.status)?G.createElement(G.Fragment,null,G.createElement(ti,{clusterName:c.name}),G.createElement(Ji,{variant:Zi.light},G.createElement(vk,null,G.createElement(yk,{component:"h1"},c.name))),G.createElement(Ji,{variant:Zi.light,isFilled:!0},G.createElement(hm,{cluster:c}))):G.createElement(G.Fragment,null,G.createElement(ti,{clusterName:c.name}),G.createElement(Ji,{variant:Zi.light},G.createElement(vk,null,G.createElement(yk,{component:"h1",className:"pf-u-display-inline"},"Install OpenShift with the Assisted Installer"))),G.createElement(Ji,{variant:Zi.light},G.createElement(Xi,{cluster:c,infraEnv:d},G.createElement(ou,{cluster:c,infraEnv:d,updateInfraEnv:p}))));if(s===Q.LOADING||a)return G.createElement(oi,null);if(s===Q.ERROR&&!r)return Number(i?.code)===404?G.createElement(Ck,{to:`${ue}/clusters`}):G.createElement(Ji,{variant:Zi.light,isFilled:!0},G.createElement(_,{title:"Failed to fetch the cluster",fetchData:Number(i?.code)===401?()=>window.location.reload():o,actions:pu()}));if(l)return G.createElement(Ji,{variant:Zi.light,isFilled:!0},G.createElement(_,{title:"Cluster not found",actions:pu(),content:"Check to make sure the cluster-ID is valid. Otherwise, the cluster may have been deleted."}));if(r&&n){let c=s===Q.ERROR;return G.createElement($o,null,G.createElement(Ki,null,G.createElement(Ei,null,G.createElement(Mi,{loadingUI:G.createElement(oi,null),errorUI:G.createElement(uu,null)},G.createElement(Ao,{loadingUi:G.createElement(oi,null),cluster:r},u(r,n),c&&G.createElement(nu,null),G.createElement(ru,null),G.createElement(iu,null),G.createElement(Gi,null))))))}return G.createElement(Ck,{to:"/clusters"})},gu=j4;import uf from"react";var hu=({children:e})=>uf.createElement(uf.Fragment,null,e,uf.createElement("div",{"data-testid":"assisted-ui-lib-version",hidden:!0},Gu()));import oo from"react";import{Provider as X4}from"react-redux";import{Switch as xk,Route as ka,Redirect as kk}from"react-router-dom";import ar from"react";import{Redirect as R4}from"react-router-dom";import{PageSectionVariants as Sk,PageSection as Ik}from"@patternfly/react-core";var K4=()=>{let[e,t]=ar.useState(""),[o,r]=ar.useState(),s=ar.useCallback(async()=>{try{let{data:i}=await M.list();r(i),t("")}catch(i){x(i,()=>t("Failed to fetch cluster."))}},[r]);return ar.useEffect(()=>{s()},[s]),e?ar.createElement(Ik,{variant:Sk.light,isFilled:!0},ar.createElement(_,{title:"Failed to fetch cluster.",fetchData:s})):o?o.length===0?ar.createElement(xa,null):(o.length>1&&console.warn("More than one cluster found!",o),ar.createElement(R4,{to:`${ue}/clusters/${o[0].id}`})):ar.createElement(Ik,{variant:Sk.light,isFilled:!0},ar.createElement(z,null))},bk=K4;var V0e=({allEnabledFeatures:e})=>oo.createElement(X4,{store:Sr},oo.createElement(J4,{features:e})),J4=({features:e,children:t})=>oo.createElement(Ps,{features:e},oo.createElement(hu,null),To()?oo.createElement(xk,null,oo.createElement(ka,{path:`${ue}/clusters/:clusterId`,component:gu}),oo.createElement(ka,{path:`${ue}/clusters`,component:bk}),t,oo.createElement(kk,{to:`${ue}/clusters`})):oo.createElement(xk,null,oo.createElement(ka,{path:`${ue}/clusters/~new`,component:xa}),oo.createElement(ka,{path:`${ue}/clusters/:clusterId`,component:gu}),oo.createElement(ka,{path:`${ue}/clusters`,component:nf}),t,oo.createElement(kk,{to:`${ue}/clusters`})));var cf=e=>{let t="",o="";try{if(e.api?.url)o="api",t=new URL(e.api.url).hostname;else if(e.console?.url){o="console";let r=new URL(e.console.url).hostname,s=".apps.";t="api."+r.substring(r.indexOf(s)+s.length)}}catch{}return{apiVipDnsname:t,errorType:t?"":o}},Ta={getOpenshiftClusterId(e){return e&&e.external_id},async fetchCluster(e,t,o,r){let s=Ta.getOpenshiftClusterId(e);if(!s)return;let i=await Ta.getDay2ClusterId(s);if(i)return Ta.fetchClusterById(i);let a=e.cpu_architecture===go.MULTI||r.canSelectCpuArchitecture?ii:[sk(e.cpu_architecture)];return Ta.createCluster(s,e.display_name||e.name||s,cf(e).apiVipDnsname,t,o,a)},async fetchClusterById(e){let{data:t}=await M.get(e);return t},async getDay2ClusterId(e){let{data:t}=await M.listByOpenshiftId(e),o=t.filter(r=>r.kind==="AddHostsCluster");if(o.length>0)return o[0].id},async createCluster(e,t,o,r,s,i){let{data:n}=await M.registerAddHosts({openshiftClusterId:e,name:`scale-up-${t}`,apiVipDnsname:o,openshiftVersion:s}),a=i.map(l=>it.create({name:`${n.name||""}_infra-env-${l}`,pullSecret:r,clusterId:n.id,openshiftVersion:s,cpuArchitecture:l}));return await Promise.all(a),n},completeAiClusterWithOcmCluster:(e,t,o)=>!t||!e?e:{...e,openshiftVersion:t.openshift_version,cpuArchitecture:t.cpu_architecture,canSelectCpuArch:o.canSelectCpuArchitecture}},ys=Ta;var Z4=e=>aS(e.openshift_version,e.aiSupportLevels||[],"SINGLE_NODE_EXPANSION"),q0e=({cluster:e})=>{if(!e.canEdit||!ys.getOpenshiftClusterId(e))return!1;let t=(e.metrics?.nodes?.total||0)>1;return e.state==="ready"&&e.product?.id==="OCP-AssistedInstall"&&(t||Z4(e))};import yu from"react";import{Provider as e6}from"react-redux";import Ce from"react";import{Button as Cu,EmptyStateVariant as Q4}from"@patternfly/react-core";var Tk=({cluster:e,extraInfo:t,isVisible:o})=>{let[r,s]=Ce.useState(),[i,n]=qo(void 0),a=Oi(),{normalizeClusterVersion:l}=lo(),p=Ce.useCallback(()=>{s(void 0),n(void 0)},[n]);Ce.useEffect(()=>{!o&&i&&n(void 0);let c=ys.getOpenshiftClusterId(e);if(o&&i===void 0&&e&&c&&a){n(null);let d=l(e.openshift_version);if(!d){s(Ce.createElement(Ce.Fragment,null,"Unsupported OpenShift cluster version: ",e.openshift_version||"N/A",".",Ce.createElement("br",null),"Check your connection and"," ",Ce.createElement(Cu,{variant:"link",isInline:!0,onClick:p},"try again"),"."));return}let{apiVipDnsname:m,errorType:g}=cf(e);if(g){let C=g==="console"?`Cluster Console URL is not valid (${e.console?.url||""})`:`Cluster API URL is not valid (${e.api?.url||""})`;s(Ce.createElement(Ce.Fragment,null,C,", you can"," ",Ce.createElement(Cu,{variant:"link",isInline:!0,onClick:p},"try again"),"."));return}if(!m){s(Ce.createElement(Ce.Fragment,null,"Neither API nor Console URL has been reported by the cluster yet."));return}(async()=>{try{let C=await ys.fetchCluster(e,a,d,t);n(ys.completeAiClusterWithOcmCluster(C,e,t))}catch(C){if(x(C),vs(C)){let I=C.config.url?.includes("/import");s(Ce.createElement(Ce.Fragment,null,I?"Failed to create wrapping cluster for adding new hosts.":"Failed to fetch cluster for adding new hosts.",Ce.createElement("br",null),"Check your connection and"," ",Ce.createElement(Cu,{variant:"link",isInline:!0,onClick:p},"try again"),"."))}return}})()}},[e,t,a,i,n,o,l,p]);let u=Ce.useCallback(async()=>{if(!!i?.id)try{let c=await ys.fetchClusterById(i.id);n(ys.completeAiClusterWithOcmCluster(c,e,t))}catch(c){x(c),s(Ce.createElement(Ce.Fragment,null,"Failed to reload cluster data.",Ce.createElement("br",null),"Check your connection and"," ",Ce.createElement(Cu,{variant:"link",isInline:!0,onClick:p},"try again"),"."))}},[i?.id,p,e,t,n]);return Ce.useEffect(()=>{let c=setTimeout(()=>{(async()=>{await u()})()},bs);return()=>clearTimeout(c)},[u]),r?Ce.createElement(_,{variant:Q4.large,content:r,title:"Failed to prepare the cluster for adding hosts."}):i?Ce.createElement(Il,{cluster:i,resetCluster:u,ocpConsoleUrl:e?.console?.url},Ce.createElement(Ao,{loadingUi:Ce.createElement(z,null),cluster:i},Ce.createElement(fu,null))):Ce.createElement(z,{content:"Preparing cluster for adding hosts..."})};var t6=e=>yu.createElement(e6,{store:Sr},yu.createElement(hu,null),yu.createElement($o,null,yu.createElement(Tk,{...e}))),o6=t6;export{ac as AddButton,fu as AddHosts,ic as AdditionalNTPSourcesField,gr as Alerts,Kf as Api,Fq as AssistedInstallerDetailCard,Mq as AssistedInstallerExtraDetailCard,hu as AssistedUILibVersion,V0e as AssistedUiRouter,Lr as CheckboxField,hm as ClusterDetail,Am as ClusterDetailsForm,Pc as ClusterEventsList,Tc as ClusterEventsToolbar,Cm as ClusterInstallationProgressCard,gu as ClusterPage,Ld as ClusterStatus,jl as ClusterStatusIcon,em as ClusterToolbar,nf as Clusters,sc as CodeField,Jy as Config,Fs as ConfirmationModal,lg as Constants,A as DetailItem,It as DetailList,Qu as DeveloperPreview,bo as EmptyState,_ as ErrorState,yn as EventsList,kn as EventsModal,bh as EventsModalButton,ot as ExternalLink,Za as FORBIDDEN_HOSTNAMES,fg as Features,wu as FormikAutoSave,nl as FormikStaticField,wn as GridGap,j as HelperText,o6 as HostsClusterDetailTab,sl as IPv4ValidationSchema,St as InputField,c5 as LabelField,mD as LabelValue,z as LoadingState,Dn as ModalProgress,HT as MultiSelectField,xa as NewClusterPage,HP as NumberInputField,Fw as PencilEditField,W as PopoverIcon,ln as PreviewBadgePosition,ct as PrismCode,Ua as PullSecretField,Xu as PullSecretInfo,Re as RadioField,Eh as Reducers,pn as RemovableField,ee as RenderIf,ws as RichInputField,J4 as Router,on as SelectField,Xy as Selectors,Wy as Services,Th as SimpleDropdown,rc as SingleNodeCheckbox,mh as StaticField,al as StaticTextField,Ry as Store,li as SwitchField,ec as TechnologyPreview,ur as TextAreaField,MT as TextAreaSecretField,ht as ToolbarButton,xc as ToolbarSecondaryGroup,KD as ToolbarText,tE as ToolbarrProgress,Pu as UploadField,$r as WizardFooter,fl as WizardNavItem,z8 as acmClusterNameValidationMessages,Jf as allSubnetsIPv4,Jg as bmcAddressValidationMessages,Z8 as bmcAddressValidationSchema,W9 as breakWord,q0e as canAddHost,Yt as clusterNameValidationMessages,ph as clusterNetworksValidationSchema,ah as day2ApiVipValidationSchema,yc as dnsNameValidationSchema,_s as downloadClusterInstallationLogs,rl as dualStackValidationSchema,gh as fitContent,Xo as getClusterDetailId,upe as getClusterMemoryAmount,ppe as getClustervCPUCount,fh as getColSpanRow,pl as getDateTimeCell,Xf as getDefaultOpenShiftVersion,ku as getDuplicates,T as getFieldId,tn as getFormikArrayItemFieldName,ro as getFormikErrorFields,Aj as getFormikObjectItemFieldName,jt as getHumanizedDateTime,w9 as getHumanizedTime,KO as getMasterCount,ni as getRichTextValidation,XO as getWorkerCount,sD as hostPrefixValidationSchema,rD as hostSubnetValidationSchema,Br as hostnameValidationMessages,vc as httpProxyValidationSchema,sh as ipBlockValidationSchema,rh as ipValidationSchema,Fj as labelsToArray,Xg as locationValidationMessages,Q8 as locationValidationSchema,tl as macAddressValidationSchema,lh as machineNetworksValidationSchema,Ja as nameValidationMessages,th as nameValidationSchema,hh as noPadding,ih as noProxyValidationSchema,z9 as nowrap,nh as ntpSourceValidationSchema,Rg as ocmClusterNameValidationMessages,Ej as parseStringLabels,oh as pullSecretValidationSchema,kg as removeProtocolFromURL,ol as richNameValidationSchema,ll as rowSorter,uh as serviceNetworkValidationSchema,el as sshPublicKeyValidationSchema,O as stringToJSON,xo as toSentence,Mo as trimCommaSeparatedList,Ss as trimSshPublicKey,B9 as truncate,Kg as uniqueOcmClusterNameValidationMessages,ho as useFormikAutoSave,eD as vipRangeValidationSchema,Cc as vipValidationSchema,U9 as wrappable};
|
|
32
|
+
${K$(e,{noRefs:!0})}`,Z$=(e,t)=>{let o=[],r=[],s=Fy(e.dns),i={};for(let a of co(e.protocolType)){let l=t[a],p="";if(l)p=Km,i[a]=Bn(l,X$(e,a));else{let u={[a]:Bn(Un[a].ip,Un[a].prefixLength)};p=Wl(a),o.push(Ad(p,u,e))}r.push(Vy(a,e.ipConfigs[a].gateway,e.useVlan&&e.vlanId?Dd(p,e.vlanId):p))}return Object.keys(i).length>0&&o.unshift(Ad(Km,i,e)),{interfaces:o,"dns-resolver":s,routes:{config:r}}},ex=(e,t)=>{let o=[Di];for(let i of co(e.protocolType))o.push(`${wd(i)} ${or(e.ipConfigs[i].machineNetwork)}`);let r=t?t.ips:Up(),s=Z$(e,r);return J$(s,o)},tx=e=>{let t=[];if(e.hosts.length===0)t=[{networkYaml:ex(e.networkWide),macInterfaceMap:Vd()}];else for(let o of e.hosts)t.push({networkYaml:ex(e.networkWide,o),macInterfaceMap:[{macAddress:o.macAddress,logicalNicName:Km}]});return t},ox=(e,t)=>{let o=$i(e);if(!o)throw"Infra env doesn't contain static ip values";let s=da(o).networkWide;return tx({networkWide:s,hosts:t})},Q$=(e,t)=>{for(let o of t){let r=Up();for(let s of co(e.protocolType))r[s]=o.ips[s];o.ips=r}},rx=(e,t)=>{let o=$i(e);if(!o)throw"Infra env doesn't contain static ip values";let r=da(o);return Q$(t,r.hosts),t.vlanId!==""&&(t.vlanId=Number(t.vlanId)),tx({networkWide:t,hosts:r.hosts})};var Zp=({infraEnv:e,...t})=>{let[o,r]=Ca.useState(),[s,i]=Ca.useState();return Ca.useEffect(()=>{let n=qp(e);r(n.protocolType),n&&i({infraEnv:e,validationSchema:Zb(n),getInitialValues:a=>xb(a),getUpdateParams:(a,l)=>ox(a,l.hosts),getEmptyValues:()=>Sb(),...t})},[]),!s||!o?null:Ca.createElement(qi,{...s},Ca.createElement($b,{protocolType:o}))};import ya from"react";import me from"react";import{Text as sx,TextVariants as ix,Grid as e2,FormGroup as nx,TextInputTypes as t2,Alert as o2,AlertVariant as r2,TextContent as s2,Flex as i2,FlexItem as Xm}from"@patternfly/react-core";import{useField as Jm,useFormikContext as n2}from"formik";var a2=me.createElement(o2,{variant:r2.warning,isInline:!0,"data-testid":"hosts-configured-alert",title:"If you edit the values and click Next, the earlier configurations will be replaced with the new values for all of the hosts."}),l2=({fieldName:e,protocolVersion:t})=>{let[{value:o}]=Jm(e),r=`${e}.ip`,s=`${e}.prefixLength`,i=pr({name:r}),n=pr({name:s}),a=i||n,l=me.useMemo(()=>{if(a)return"";let p=or(o);return mc(Bp(p,t))},[o,t,a]);return me.createElement(nx,{labelIcon:me.createElement(W,{noVerticalAlign:!0,bodyContent:"The range of IP addresses of the hosts."}),label:"Machine Network",fieldId:T(`${e}`,"input"),isRequired:!0,helperTextInvalid:a,validated:a?"error":"default",helperText:l,className:"machine-network"},me.createElement(i2,null,me.createElement(Xm,{spacer:{default:"spacerSm"}},me.createElement(Be,{name:`${e}.ip`,isRequired:!0,"data-testid":`${t}-machine-network-ip`,showErrorMessage:!1})),me.createElement(Xm,{spacer:{default:"spacerSm"}},"/"),me.createElement(Xm,null,me.createElement(Be,{name:`${e}.prefixLength`,isRequired:!0,"data-testid":`${t}-machine-network-prefix-length`,type:t2.number,showErrorMessage:!1,min:Yb,max:t===B.ipv4?ga.ipv4:ga.ipv6}))))},p2=({protocolVersion:e,fieldName:t})=>me.createElement(e2,{hasGutter:!0},me.createElement(l2,{fieldName:`${t}.machineNetwork`,protocolVersion:e}),me.createElement(Be,{isRequired:!0,label:"Default gateway",labelIcon:me.createElement(W,{noVerticalAlign:!0,bodyContent:"An IP address to where any IP packet should be forwarded in case there is no other routing rule configured for a destination IP."}),name:`${t}.gateway`,"data-testid":`${e}-gateway`})),u2=[{label:pa(B.ipv4),value:"ipv4"},{label:"Dual Stack",value:"dualStack"}],c2=()=>{let e="protocolType",[{value:t},,{setValue:o}]=Jm(e),[,,{setValue:r}]=Jm("ipConfigs.ipv6");return me.createElement($s,{label:"Internet protocol version",options:u2,name:e,callFormikOnChange:!1,onChange:i=>{let n=i.currentTarget.value;n!==t&&(r(Gp()),o(n))},"data-testid":"select-protocol-version"})},ax=({hosts:e})=>{let{values:t,setFieldValue:o}=n2();return me.createElement(me.Fragment,null,me.createElement(s2,null,me.createElement(sx,{component:ix.h3},"Network-wide configurations"),me.createElement(sx,{component:ix.small},"The following configurations are applicable to all the hosts.")),e.length>0&&a2,me.createElement(c2,null),me.createElement(po,{label:me.createElement(me.Fragment,null,"Use VLAN ",me.createElement(W,{noVerticalAlign:!0,bodyContent:"If the hosts are in a sub network, enter the VLAN ID."})),name:"useVlan","data-testid":"use-vlan",onChange:()=>o("vlanId","")}),t.useVlan&&me.createElement("div",{className:"vlan-id"},me.createElement(Be,{label:"VLAN ID",name:"vlanId",isRequired:!0,"data-testid":"vlan-id",min:jb,max:Xp})),me.createElement(Be,{isRequired:!0,label:"DNS",name:"dns","data-testid":"dns"}),co(t.protocolType).map(r=>me.createElement(nx,{key:r,label:pa(r),fieldId:T(`ip-configs-${r}`,"input")},me.createElement(p2,{fieldName:`ipConfigs.${r}`,protocolVersion:r}))))};var Qp=({infraEnv:e,...t})=>{let[o,r]=ya.useState(),[s,i]=ya.useState();return ya.useEffect(()=>{let n=$p(e).hosts;i(n),!!n&&r({infraEnv:e,...t,validationSchema:Xb,getInitialValues:a=>qp(a),getUpdateParams:(a,l)=>rx(a,l),getEmptyValues:()=>ca()})},[]),!s||!o?null:ya.createElement(qi,{...o},ya.createElement(ax,{hosts:s}))};var h2=to.createElement(m2,{variant:f2.warning,isInline:!0,"data-testid":"regenerate-iso-alert",title:`To add new hosts that will use the new or edited configurations, you'll need to regenerate the
|
|
33
|
+
Discovery ISO in the 'Host discovery' step and boot your new hosts from it.`}),ux=({infraEnv:e,updateInfraEnv:t,onFormStateChange:o})=>{let r=ke(),[s,i]=to.useState(!1),[n,a]=to.useState(!1),l=to.useCallback(g=>{r.onUpdateStaticIpView(g),a(!0)},[]),p=to.useMemo(()=>Xs(e),[]);if(!p)return null;let c={onFormStateChange:g=>{let h=r.currentStepId==="static-ip-host-configurations"||!g.isEmpty;i(h),o(g)},infraEnv:e,updateInfraEnv:t,showEmptyValues:n},m=(()=>{switch(r.currentStepId){case"static-ip-yaml-view":return to.createElement(fa,{...c});case"static-ip-host-configurations":return to.createElement(Zp,{...c});case"static-ip-network-wide-configurations":return to.createElement(Qp,{...c});default:throw`Unexpected wizard step id ${r.currentStepId} when entering static ip page`}})();return m?to.createElement(g2,{hasGutter:!0},to.createElement(d2,null,to.createElement(lx,{component:px.h2},"Static network configurations"),to.createElement(lx,{component:px.small},"Network configuration can be done using either the form view or YAML view. Configurations done in this step are for discovering hosts.")),to.createElement(zp,{initialView:p.view,confirmOnChangeView:s,onChangeView:l}),p.isDataComplete&&h2,m):null};var y2=()=>({isValid:!0,isSubmitting:!1,isAutoSaveRunning:!1,errors:{},touched:{},isEmpty:!0}),v2=({cluster:e,infraEnv:t,updateInfraEnv:o})=>{let r=ke(),{isViewerMode:s}=C2(R),{alerts:i}=N(),[n,a]=Ri.useState(y2()),l=d=>{s||a(d)},p=n.isAutoSaveRunning||!n.isValid||!!i.length||n.isSubmitting,u=ro(n.errors,n.touched),c=Ri.createElement(_t,{cluster:e,alertTitle:"Static IP configuration contains missing or invalid fields",alertContent:null,errorFields:u,isSubmitting:n.isSubmitting,onNext:()=>r.moveNext(),onBack:()=>r.moveBack(),isNextDisabled:p});return Ri.createElement(ye,{navigation:Ri.createElement(xt,{cluster:e}),footer:c},Ri.createElement(Li,{title:"Failed to load Static IP step"},Ri.createElement(ux,{...{infraEnv:t,updateInfraEnv:o,onFormStateChange:l}})))},cx=v2;import Zs from"react";import{useDispatch as Y2}from"react-redux";import{Formik as j2,useFormikContext as R2}from"formik";import Fr from"react";import{useSelector as $2}from"react-redux";import{Stack as q2,StackItem as tu}from"@patternfly/react-core";import Ut,{useState as x2}from"react";import{FormGroup as k2,Tooltip as T2}from"@patternfly/react-core";import{ExternalLinkAltIcon as P2}from"@patternfly/react-icons";import{useFormikContext as w2}from"formik";import Ho from"react";import{useSelector as S2}from"react-redux";import{List as I2,ListItem as eu}from"@patternfly/react-core";var b2=({clusterId:e})=>{let{preflightRequirements:t,error:o,isLoading:r}=Bs(e),s=S2(Ms);if(r)return Ho.createElement(z,{content:"Loading hardware requirements ..."});if(o)return Ho.createElement(_,null);let i=t?.operators?.find(l=>l.operatorName===Mr),n=i?.requirements?.worker?.quantitative,a=i?.requirements?.master?.quantitative;return Ho.createElement(Ho.Fragment,null,Ho.createElement(I2,null,Ho.createElement(eu,null,"Enabled CPU virtualization support in BIOS (Intel-VT / AMD-V) on all nodes"),Ho.createElement(ee,{condition:!s},Ho.createElement(eu,null,"Each worker node requires an additional ",n?.ramMib||360," MiB of memory ",n?.diskSizeGb?",":" and"," ",n?.cpuCores||2," CPUs",n?.diskSizeGb?` and ${n?.diskSizeGb} storage space`:"")),Ho.createElement(eu,null,"Each control plane node requires an additional ",a?.ramMib||150," MiB of memory ",a?.diskSizeGb?",":" and"," ",a?.cpuCores||4," ","CPUs",a?.diskSizeGb?` and ${a?.diskSizeGb} storage space`:""),Ho.createElement(ee,{condition:!s},Ho.createElement(eu,null,"OpenShift Data Foundation (recommended for full functionality) or another persistent storage service"))))},dx=b2;var mx="useContainerNativeVirtualization",D2=({clusterId:e})=>Ut.createElement(Ut.Fragment,null,"Install OpenShift Virtualization"," ",Ut.createElement(W,{component:"a",headerContent:"Additional Requirements",bodyContent:Ut.createElement(dx,{clusterId:e})})),E2=()=>Ut.createElement(Ut.Fragment,null,"Run virtual machines alongside containers on one platform."," ",Ut.createElement("a",{href:Ou,target:"_blank",rel:"noopener noreferrer"},"Learn more"," ",Ut.createElement(P2,null))),A2=({clusterId:e,openshiftVersion:t})=>{let o=T(mx,"input"),r=be(),{values:s}=w2(),[i,n]=x2();return Ut.useEffect(()=>{let a;if(t&&(a=r.getFeatureDisabledReason(t,"CNV"),!a)){let l=r.getFeatureSupportLevel(t,"LVM");a=oS(s,t,l)}n(a)},[s,t,r]),Ut.createElement(k2,{isInline:!0,fieldId:o},Ut.createElement(T2,{hidden:!i,content:i},Ut.createElement(po,{name:mx,label:Ut.createElement(D2,{clusterId:e}),helperText:Ut.createElement(E2,null),isDisabled:!!i})))},fx=A2;import Gt from"react";import{FormGroup as F2,Tooltip as V2}from"@patternfly/react-core";import{ExternalLinkAltIcon as gx}from"@patternfly/react-icons";var hx="useOpenShiftDataFoundation",N2=()=>Gt.createElement(Gt.Fragment,null,"Install OpenShift Data Foundation"," ",Gt.createElement(W,{component:"a",headerContent:"Additional Requirements",bodyContent:Gt.createElement("a",{href:Au,target:"_blank",rel:"noopener noreferrer"},"Learn more about the requirements for OpenShift Data Foundation ",Gt.createElement(gx,null),".")})),H2=()=>Gt.createElement(Gt.Fragment,null,"Persistent software-defined storage for hybrid applications."," ",Gt.createElement("a",{href:Lu,target:"_blank",rel:"noopener noreferrer"},"Learn more"," ",Gt.createElement(gx,null))),O2=({openshiftVersion:e})=>{let t=be(),o=T(hx,"input"),r=e?t.getFeatureDisabledReason(e,"ODF"):void 0;return Gt.createElement(F2,{isInline:!0,fieldId:o},Gt.createElement(V2,{hidden:!r,content:r},Gt.createElement(po,{name:hx,label:Gt.createElement(N2,null),isDisabled:!!r,helperText:Gt.createElement(H2,null)})))},Cx=O2;import rr,{useState as _2}from"react";import{FormGroup as W2,Tooltip as z2}from"@patternfly/react-core";import{useFormikContext as B2}from"formik";import va from"react";import{List as L2,ListItem as yx}from"@patternfly/react-core";var M2=({clusterId:e})=>{let{preflightRequirements:t,error:o,isLoading:r}=Bs(e);if(r)return va.createElement(z,{content:"Loading hardware requirements ..."});if(o)return va.createElement(_,null);let s=t?.operators?.find(a=>a.operatorName===Wo),{qualitative:i=[],quantitative:n}=s?.requirements?.master;return va.createElement(L2,null,n&&va.createElement(yx,null,"The host node requires an additional ",n.ramMib," MiB of memory"," ",n.diskSizeGb?",":" and"," ",n.cpuCores," CPUs",n?.diskSizeGb?` and ${n?.diskSizeGb} storage space`:""),i.map((a,l)=>va.createElement(yx,{key:l},a)))},vx=M2;var Sx="useOdfLogicalVolumeManager",U2=e=>rr.createElement(rr.Fragment,null,"Install OpenShift Data Foundation Logical Volume Manager"," ",rr.createElement(W,{component:"a",headerContent:"Additional Requirements",bodyContent:rr.createElement(vx,{clusterId:e.clusterId})}),rr.createElement(so,{featureId:"LVM",openshiftVersion:e.openshiftVersion})),G2=({clusterId:e,openshiftVersion:t})=>{let o=T(Sx,"input"),r=be(),{values:s}=B2(),[i,n]=_2();return rr.useEffect(()=>{let a;if(t&&(a=r.getFeatureDisabledReason(t,"LVM"),!a)){let l=r.getFeatureSupportLevel(t,"LVM");a=rS(s,t,l)}n(a)},[s,t,r]),rr.createElement(W2,{isInline:!0,fieldId:o},rr.createElement(z2,{hidden:!i,content:i},rr.createElement(po,{name:Sx,label:rr.createElement(U2,{clusterId:e,openshiftVersion:t}),helperText:"Storage virtualization that offers a more flexible approach for disk space management.",isDisabled:!!i})))},Ix=G2;var bx=e=>{let t=$2(Ms),o=_r("ASSISTED_INSTALLER_OCS_FEATURE")&&!t,r=_r("ASSISTED_INSTALLER_CNV_FEATURE");return Fr.createElement(q2,{hasGutter:!0},Fr.createElement(tu,null,Fr.createElement(Xe,null,"Operators")),r&&Fr.createElement(tu,null,Fr.createElement(fx,{...e})),o&&Fr.createElement(tu,null,Fr.createElement(Cx,{openshiftVersion:e.openshiftVersion})),t&&Fr.createElement(tu,null,Fr.createElement(Ix,{...e})))};var K2=e=>{let t=o=>!!e.find(r=>o.includes(r.name||""));return{useOpenShiftDataFoundation:t([_o]),useOdfLogicalVolumeManager:t([Wo]),useContainerNativeVirtualization:t([Mr])}},X2=({cluster:e})=>{let{alerts:t}=N(),o=ke(),r=ho(),{errors:s,touched:i,isSubmitting:n,isValid:a}=R2(),l=r||!a||!!t.length||n||!qv({cluster:e});return Zs.createElement(ye,{navigation:Zs.createElement(xt,{cluster:e}),footer:Zs.createElement(_t,{cluster:e,errorFields:ro(s,i),isSubmitting:n,isNextDisabled:l,onNext:()=>o.moveNext(),onBack:()=>o.moveBack()})},Zs.createElement(bx,{clusterId:e.id,openshiftVersion:e.openshiftVersion}))},J2=({cluster:e})=>{let t=Y2(),{addAlert:o,clearAlerts:r}=N(),s=gi(e.monitoredOperators),i=Zs.useMemo(()=>K2(s),[]);return Zs.createElement(j2,{initialValues:i,onSubmit:async(a,{setFieldValue:l})=>{r();let p=qn.getOLMOperators(a,e);try{let{data:u}=await re.update(e.id,e.tags,{olmOperators:p}),c=qn.syncOperators(p,u.monitoredOperators);Object.keys(c).forEach(d=>{l(d,!0)}),t(qe(u))}catch(u){x(u,()=>o({title:"Failed to update the cluster",message:Ge(u)}))}}},Zs.createElement(X2,{cluster:e}))},xx=J2;var Q2=({cluster:e,infraEnv:t,updateInfraEnv:o})=>{let{currentStepId:r}=ke(),s=Oo.useCallback(()=>{switch(r){case"host-discovery":return Oo.createElement(sb,{cluster:e});case"networking":return Oo.createElement(SI,{cluster:e});case"review":return Oo.createElement(xI,{cluster:e});case"operators":return Oo.createElement(xx,{cluster:e});case"storage":return Oo.createElement(hb,{cluster:e});case"static-ip-host-configurations":case"static-ip-network-wide-configurations":case"static-ip-yaml-view":return Oo.createElement(cx,{cluster:e,infraEnv:t,updateInfraEnv:o});case"cluster-details":default:return Oo.createElement(Op,{cluster:e,infraEnv:t})}},[r,e,t,o]);return r?Oo.createElement(Li,null,Oo.createElement("div",{className:Z2("pf-c-wizard","cluster-wizard")},s())):Oo.createElement(z,null)},ou=Q2;import Vr from"react";import{useDispatch as eq}from"react-redux";import{Button as kx,Modal as tq,ModalVariant as oq,ButtonVariant as Tx,Text as rq,TextContent as sq}from"@patternfly/react-core";var iq=()=>{let e=eq(),[t,o]=Vr.useState(!1),[r,s]=Vr.useState(null),{cancelInstallationDialog:i}=se(),{data:n,isOpen:a,close:l}=i,p=n?.clusterId;if(!p)return null;let u=async()=>{o(!0);try{s(null);let{data:d}=await M.cancel(p);e(qe(d)),l()}catch(d){x(d,()=>{s({title:"Failed to abort cluster installation",message:D(d)})})}o(!1)},c=()=>t?Vr.createElement(z,{content:"Aborting cluster installation..."}):r?Vr.createElement(_,{title:r.title,content:r.message}):Vr.createElement(sq,null,Vr.createElement(rq,{component:"p"},"This will abort cluster installation. Are you sure you want to proceed?"));return Vr.createElement(tq,{title:"Abort Cluster Installation",isOpen:a,variant:oq.small,actions:[Vr.createElement(kx,{key:"submit",variant:Tx.danger,onClick:u,isDisabled:t},"Abort Installation"),Vr.createElement(kx,{key:"cancel",variant:Tx.link,onClick:l,isDisabled:t},"Cancel")],onClose:l},c())},ru=iq;import Pt from"react";import{useDispatch as nq}from"react-redux";import{Button as Px,Modal as aq,ModalVariant as lq,ButtonVariant as wx,Text as su,TextContent as pq}from"@patternfly/react-core";import{ExclamationTriangleIcon as uq}from"@patternfly/react-icons";import{global_warning_color_100 as cq}from"@patternfly/react-tokens";var dq=()=>{let e=nq(),[t,o]=Pt.useState(!1),[r,s]=Pt.useState(null),{resetClusterDialog:i}=se(),{data:n,isOpen:a,close:l}=i,p=n?.cluster;if(!p)return null;let u=()=>{o(!1),s(null),l()},c=async()=>{o(!0);try{s(null);let{data:h}=await M.reset(p.id);e(qe(h)),l()}catch(h){x(h,()=>{s({title:"Failed to reset cluster installation",message:D(h)})})}o(!1)},d=`${Math.round(My(p)/((p.hosts?.length||0)+1)*100)} `,m=()=>t?Pt.createElement(z,{content:"Resetting cluster installation..."}):r?Pt.createElement(_,{title:r.title,content:r.message}):Pt.createElement(pq,null,Pt.createElement(su,{component:"p"},"This will reset the installation and return to the cluster configuration. Some hosts may need to be re-registered by rebooting into the Discovery ISO."),Pt.createElement(su,{component:"p"},Pt.createElement("strong",null,"Download the installation logs")," to troubleshoot or report a bug.",Pt.createElement("br",null),"Currently, ",d,"% of the installation logs were collected and are ready for download."),Pt.createElement(su,{component:"p"},Pt.createElement(uq,{className:"status-icon",color:cq.value,size:"sm"})," ","Logs won't be available after the installation is reset."),Pt.createElement(su,{component:"p"},"Are you sure you want to reset the cluster?")),g=[Pt.createElement(Px,{key:"reset",variant:wx.danger,onClick:c,isDisabled:t},"Reset Cluster")];return g.push(Pt.createElement(Px,{key:"cancel",variant:wx.link,onClick:u,isDisabled:t},"Cancel")),Pt.createElement(aq,{title:"Reset Cluster Installation",isOpen:a,variant:lq.small,actions:g,onClose:u},m())},iu=dq;import Dx from"react";import{Button as mq,ButtonVariant as fq,Modal as gq,ModalVariant as hq}from"@patternfly/react-core";var Cq=()=>Dx.createElement(gq,{title:"Unable to fetch the latest data",isOpen:!0,variant:hq.small,showClose:!1,titleIconVariant:"danger",actions:[Dx.createElement(mq,{key:"refresh",variant:fq.primary,onClick:()=>window.location.reload()},"Refresh page")]},"There was an error fetching the latest data from the API. We'll try again, but if the data does not update in a few minutes, try refreshing the page."),nu=Cq;import yq from"react";var Ki=({children:e})=>yq.createElement(uS,{...{exceptionReporter:(o,r,s)=>{vs(o)?x(o):Lo(o,r,s)}}},e);import Qs from"react";import{useLocation as Sq}from"react-router-dom";import Iq from"lodash/isEqual";import{useDispatch as vq}from"react-redux";function Zm(){let e=vq();return(t,o)=>{if(!t)return;let r=Bd(t);o&&(r={...r,...Kl(o||{})}),e(qy(r))}}var Sa=e=>{let t=[...qS];return e===xe.YAML?t.splice(1,0,"static-ip-yaml-view"):e===xe.FORM&&t.splice(1,0,...Dp),t},bq=({children:e,cluster:t,infraEnv:o,permissions:r})=>{let[s,i]=Qs.useState(),[n,a]=Qs.useState(),{state:l}=Sq(),p=Zm();Qs.useEffect(()=>{let c=o?Xs(o):void 0,d=Uv(l,c,t?.status,t?.hosts),m=Sa(c?.view);i(d),a(m),p(t,r)},[]);let u=Qs.useMemo(()=>{if(!n||!s)return null;let c=()=>{let m=o?Xs(o):void 0;if(!m)throw`Wizard step is currently ${s}, but no static ip info is defined`;let g=Sa(m.view);Iq(g,n)||a(g)},d=m=>{zs(s)&&!zs(m)&&c(),i(m)};return{moveBack(){let m=n.indexOf(s),g=n[m-1];g==="static-ip-host-configurations"&&(g="static-ip-network-wide-configurations"),d(g)},moveNext(){let m=n.indexOf(s);d(n[m+1])},onUpdateStaticIpView(m){a(Sa(m)),m===xe.YAML?i("static-ip-yaml-view"):i("static-ip-network-wide-configurations")},onUpdateHostNetworkConfigType(m){m===De.STATIC?a(Sa(xe.FORM)):a(Sa())},wizardStepIds:n,currentStepId:s,setCurrentStepId:d}},[n,s,o]);return u?Qs.createElement(Qs.Fragment,null,Qs.createElement(US.Provider,{value:u},e)):null},Xi=bq;var Ex=()=>{let e=[];return To()||e.push($.createElement(Tq,{key:"cancel",variant:Pq.secondary,component:t=>$.createElement(kq,{to:Ud,...t})},"Back")),e},rf=()=>$.createElement(Qm,{"data-testid":"ai-cluster-details-card"},$.createElement(tf,null,$.createElement(of,{headingLevel:"h1",size:"lg",className:"card-title"},"Loading additional details")),$.createElement(ef,null,$.createElement(z,null))),wq=({clusterId:e})=>{let t=oa(e);return $.createElement(Qm,{"data-testid":"ai-cluster-details-card"},$.createElement(tf,null,$.createElement(of,{headingLevel:"h1",size:"lg",className:"card-title"},"Loading additional details")),$.createElement(ef,null,$.createElement(_,{title:"Failed to fetch the cluster",fetchData:t,actions:Ex()})))},Dq=()=>$.createElement(Qm,{"data-testid":"ai-cluster-details-card"},$.createElement(tf,null,$.createElement(of,{headingLevel:"h1",size:"lg",className:"card-title"},"Loading additional details")),$.createElement(ef,null,$.createElement(_,{title:"Failed to retrieve the default configuration",actions:Ex()}))),Eq=({aiClusterId:e,allEnabledFeatures:t,permissions:o})=>{let{cluster:r,uiState:s}=wp(e),{infraEnv:i,isLoading:n,error:a,updateInfraEnv:l}=Pr(e,L.USE_DAY1_ARCHITECTURE);if(s===Q.LOADING||n)return $.createElement(rf,null);if(s===Q.ERROR&&!r||a)return $.createElement(wq,{clusterId:e});if(!r||!i||r.status==="adding-hosts")return null;let p=["insufficient","ready","pending-for-input"].includes(r.status),u=$.createElement(Xi,{cluster:r,infraEnv:i,permissions:o},p?$.createElement(ou,{cluster:r,infraEnv:i,updateInfraEnv:l}):$.createElement(Cm,{cluster:r})),c=s===Q.ERROR;return $.createElement(Ps,{features:t},$.createElement($o,null,$.createElement(Ki,null,$.createElement(Ei,null,$.createElement(Mi,{loadingUI:$.createElement(rf,null),errorUI:$.createElement(Dq,null)},$.createElement(Ao,{loadingUi:$.createElement(rf,null),cluster:r},u),c&&$.createElement(nu,null),$.createElement(ru,null),$.createElement(iu,null),$.createElement(Gi,null))))))},Aq=e=>$.createElement(xq,{store:Sr},$.createElement(Eq,{...e})),Fq=Aq;import ei from"react";import{Provider as Vq}from"react-redux";import{useSelector as Nq}from"react-redux";import{Grid as Hq}from"@patternfly/react-core";var Oq=({allEnabledFeatures:e})=>{let{data:t}=Nq(jn);return!t||t.status==="adding-hosts"?null:ei.createElement(Ps,{features:e},ei.createElement(Ao,{loadingUi:ei.createElement("div",null),cluster:t},ei.createElement(Hq,{className:"pf-u-mt-md"},ei.createElement(bp,{cluster:t,externalMode:!0}))))},Lq=e=>ei.createElement(Vq,{store:Sr},ei.createElement(Oq,{...e})),Mq=Lq;import _e from"react";import{useDispatch as IY,useSelector as Wx}from"react-redux";import{Button as bY,ButtonVariant as xY,PageSectionVariants as Ia,TextContent as kY,Text as TY,PageSection as ba}from"@patternfly/react-core";import{AddCircleOIcon as PY}from"@patternfly/react-icons";import lt from"react";import{Table as nY,TableHeader as aY,TableBody as lY,RowWrapper as pY,SortByDirection as uY,cellWidth as Hx,breakWord as Ox,sortable as cY}from"@patternfly/react-table";import{createElement as sf}from"react";import{Modal as _q,Button as Ax,ModalVariant as Wq}from"@patternfly/react-core";var zq=({name:e,onClose:t,onDelete:o})=>sf(_q,{title:"Delete cluster",isOpen:!0,onClose:t,variant:Wq.small,actions:[sf(Ax,{"data-testid":"delete-cluster-submit",key:"confirm",variant:"danger",onClick:o},"Delete"),sf(Ax,{key:"cancel",variant:"link",onClick:t},"Cancel")]},"Are you sure you want to delete cluster ",e," ?"),Fx=zq;import et from"react";import{useDispatch as Bq,useSelector as Uq}from"react-redux";import{useHistory as Gq}from"react-router-dom";import{Toolbar as $q,ToolbarItem as qq,ToolbarContent as Yq,ToolbarFilter as jq,InputGroup as Rq,Select as Kq,SelectOption as Xq,TextInput as Jq,ButtonVariant as Vx,Spinner as Zq,ToolbarGroup as Qq,Tooltip as eY}from"@patternfly/react-core";import{FilterIcon as tY,SyncIcon as oY}from"@patternfly/react-icons";import rY from"lodash/omit";var sY=e=>Array.from(new Set(Object.values(rY(dr(e),"adding-hosts")))),iY=({searchString:e,setSearchString:t,filters:o,setFilters:r})=>{let[s,i]=et.useState(!1),n=Gq(),a=Uq(Rn),l=Bq(),p=et.useCallback(()=>l(Hs()),[l]),u=()=>{r({status:[]})},c=t,d=(y,v,w)=>{r({...o,[y]:v?[...o[y],w]:o[y].filter(E=>E!==w)})},m=()=>i(!s),g=(y,v)=>{d("status",y.target.checked,v)},h=(y,v)=>{y?r({...o,[y]:o[y].filter(w=>w!==v)}):u()},C=y=>{r({...o,[y]:[]})},I=et.createElement(et.Fragment,null,et.createElement(tY,null)," Status"),{t:S}=f();return et.createElement($q,{id:"clusters-list-toolbar",className:"pf-m-toggle-group-container",collapseListedFiltersBreakpoint:"xl",clearAllFilters:u},et.createElement(Yq,null,et.createElement(qq,null,et.createElement(Rq,null,et.createElement(Jq,{name:"search-string",id:"search-string",type:"search","aria-label":"string to be searched in cluster names or ids",onChange:c,value:e,placeholder:"Filter by Name, ID or Base domain",title:"Filter by Name, ID or Base domain"}))),et.createElement(jq,{chips:o.status,deleteChip:h,deleteChipGroup:C,categoryName:"status"},et.createElement(Kq,{variant:"checkbox","aria-label":"status",onToggle:m,onSelect:g,selections:o.status,isOpen:s,placeholderText:I,toggleId:"cluster-list-filter-status"},sY(S).map(y=>et.createElement(Xq,{key:y,value:y,inputId:`cluster-list-filter-status-${y}`})))),et.createElement(ht,{variant:Vx.primary,onClick:()=>n.push(`${ue}/clusters/~new`),id:"button-create-new-cluster","data-ouia-id":"button-create-new-cluster"},"Create Cluster"),a===Q.RELOADING&&et.createElement(Zq,{size:"lg"}),et.createElement(Qq,{alignment:{lg:"alignRight"}},et.createElement(ht,{variant:Vx.plain,onClick:()=>p(),isDisabled:a===Q.RELOADING},et.createElement(eY,{content:"Refresh"},et.createElement(oY,null))))))},Nx=iY;var dY=({rowData:e})=>e?.props.id,Lx="assisted-installer-cluster-list-filters",sr={transforms:[cY],cellTransforms:[],formatters:[],cellFormatters:[],props:{}},mY=[{title:"Name",dataLabel:"Name",...sr,transforms:sr?.transforms?.concat(Hx(20)),cellTransforms:sr?.cellTransforms?.concat(Ox)},{title:"Base domain",dataLabel:"Base domain",...sr,transforms:sr?.transforms?.concat(Hx(40)),cellTransforms:sr?.cellTransforms?.concat(Ox)},{title:"Version",dataLabel:"Version",...sr},{title:"Status",dataLabel:"Status",...sr},{title:"Hosts",dataLabel:"Hosts",...sr},{title:"Created at",dataLabel:"Created at",...sr}],fY=e=>e.cells?.[3],gY=e=>lt.createElement(pY,{...e,"data-testid":`cluster-row-${e.row?.props?.name}`,id:`cluster-row-${e.row?.props?.name}`}),hY=({rows:e,deleteCluster:t})=>{let[o,r]=lt.useState(),[s,i]=lt.useState({index:0,direction:uY.asc}),[n,a]=lt.useState(""),[l,p]=lt.useState({status:[]}),{t:u}=f();lt.useEffect(()=>{let h=window.sessionStorage.getItem(Lx);if(h)try{let C=JSON.parse(h);C.filters&&p(C.filters),C.sortBy&&i(C.sortBy),C.searchString&&a(C.searchString)}catch(C){console.info("Failed to restore clusters filter: ",C)}},[]),lt.useEffect(()=>{window.sessionStorage.setItem(Lx,JSON.stringify({filters:l,sortBy:s,searchString:n}))},[l,s,n]);let c=lt.useCallback(h=>[{title:"Delete",id:`button-delete-${h.props.name}`,isDisabled:Wd(h).sortableValue===dr(u).installing,onClick:(C,I,S)=>{r({id:S.props.id,name:S.props.name})}}],[r]),d=lt.useCallback((h,C,I)=>{i({index:C,direction:I})},[i]),m=lt.useCallback(h=>{let C=[h.props.name,h.props.id,h.props.baseDnsDomain].map(S=>(S||"").toLowerCase());if(n&&!C.find(S=>S.includes(n.toLowerCase())))return!1;let I=fY(h)?.sortableValue;return!(l.status.length>0&&I&&!l.status.includes(I))},[n,l]),g=lt.useMemo(()=>e.filter(m).sort(ll(s,(h,C=0)=>h.cells?.[C])),[e,s,m]);return lt.createElement(lt.Fragment,null,lt.createElement(Nx,{searchString:n,setSearchString:a,filters:l,setFilters:p}),lt.createElement(nY,{rows:g,cells:mY,actionResolver:c,"aria-label":"Clusters table",sortBy:s,onSort:d,rowWrapper:gY,"data-testid":"clusters-table"},lt.createElement(aY,null),lt.createElement(lY,{rowKey:dY})),o&<.createElement(Fx,{name:o.name,onClose:()=>r(void 0),onDelete:()=>{t(o.id),r(void 0)}}))},Mx=hY;import fs from"react";import{PageSectionVariants as CY,Breadcrumb as yY,BreadcrumbItem as au,PageSection as vY}from"@patternfly/react-core";import{Link as _x}from"react-router-dom";var SY=({clusterName:e,isHidden:t=To()})=>t?null:fs.createElement(vY,{variant:CY.light},(e||oe)&&fs.createElement(yY,null,fs.createElement(au,null,fs.createElement(_x,{to:"/"},"Clusters")),e?fs.createElement(au,null,fs.createElement(_x,{to:`${ue}/clusters`},"Assisted Clusters")):fs.createElement(au,{isActive:!0},"Assisted Clusters"),e&&fs.createElement(au,{isActive:!0},e))),ti=SY;var wY=({history:e})=>{let{LOADING:t,EMPTY:o,ERROR:r,RELOADING:s}=Q,{addAlert:i}=N(),{t:n}=f(),a=Wx(zd(n)),l=Wx(Rn),p=_e.useRef(l);l!==s&&(p.current=l);let u=IY(),c=_e.useCallback(async m=>{try{await re.remove(m),u(xy(m))}catch(g){x(g,()=>i({title:"Cluster could not be deleted",message:D(g)}))}},[u,i]),d=_e.useCallback(()=>u(Hs()),[u]);switch(_e.useEffect(()=>{d()},[d]),p.current){case t:return _e.createElement(ba,{variant:Ia.light,isFilled:!0},_e.createElement(z,null));case r:return _e.createElement(ba,{variant:Ia.light,isFilled:!0},_e.createElement(_,{title:"Failed to fetch clusters.",fetchData:d}));case o:return _e.createElement(ba,{variant:Ia.light,isFilled:!0},_e.createElement(bo,{icon:PY,title:"Create new assisted cluster",content:"There are no clusters yet. This wizard is going to guide you through the OpenShift cluster deployment.",primaryAction:_e.createElement(bY,{variant:xY.primary,onClick:()=>e.push(`${ue}/clusters/~new`),id:"empty-state-new-cluster-button","data-ouia-id":"button-create-new-cluster"},"Create New Cluster")}));default:return _e.createElement(_e.Fragment,null,_e.createElement(ti,null),_e.createElement(ba,{variant:Ia.light},_e.createElement(kY,null,_e.createElement(TY,{component:"h1"},"Assisted Clusters"))),_e.createElement(ba,{variant:Ia.light,isFilled:!0},_e.createElement(gr,null),_e.createElement(Mx,{rows:a,deleteCluster:m=>void c(m)})))}},DY=e=>_e.createElement($o,null,_e.createElement(wY,{...e})),nf=DY;import $t from"react";import{PageSectionVariants as Gx,TextContent as WY,Text as zY,PageSection as $x}from"@patternfly/react-core";import EY from"classnames";import zx from"react";var AY=()=>zx.createElement("div",{className:EY("pf-c-wizard","cluster-wizard")},zx.createElement(Op,null)),Bx=AY;import{PageSection as FY,PageSectionVariants as VY}from"@patternfly/react-core";import Ux from"react";var NY=()=>Ux.createElement(FY,{variant:VY.light,isFilled:!0},Ux.createElement(z,null)),oi=NY;import lu from"react";import{Button as HY,ButtonVariant as OY,PageSection as LY,PageSectionVariants as MY}from"@patternfly/react-core";import{Link as _Y}from"react-router-dom";var pu=()=>To()?[]:[lu.createElement(HY,{key:"cancel",variant:OY.secondary,component:e=>lu.createElement(_Y,{to:`${ue}/clusters`,...e})},"Back")],uu=()=>lu.createElement(LY,{variant:MY.light,isFilled:!0},lu.createElement(_,{title:"Failed to retrieve the default configuration",actions:pu()}));var BY=()=>$t.createElement($o,null,$t.createElement(Ki,null,$t.createElement(Mi,{loadingUI:$t.createElement(oi,null),errorUI:$t.createElement(uu,null)},$t.createElement(Ao,{loadingUi:$t.createElement(oi,null)},$t.createElement(ti,{clusterName:"New cluster"}),$t.createElement($x,{variant:Gx.light},$t.createElement(WY,null,$t.createElement(zY,{component:"h1",className:"pf-u-display-inline"},"Install OpenShift with the Assisted Installer"))),$t.createElement($x,{variant:Gx.light,isFilled:!0},$t.createElement(Xi,null,$t.createElement(Bx,null))))))),xa=BY;import G from"react";import{Redirect as yk}from"react-router-dom";import{PageSection as Ji,PageSectionVariants as Zi,Text as vk,TextContent as Sk}from"@patternfly/react-core";import Ue from"react";import{ButtonVariant as L4,Card as M4,CardBody as _4,CardFooter as W4,CardTitle as z4,Grid as B4,Stack as U4,StackItem as Ck,Title as G4,Toolbar as $4,ToolbarContent as q4}from"@patternfly/react-core";import fo from"react";import{Text as A4,TextContent as F4,Alert as V4,AlertVariant as N4,Stack as H4,StackItem as pf}from"@patternfly/react-core";import gs from"react";import qx from"react";var Yx=qx.createContext(null),mo=()=>{let e=qx.useContext(Yx);if(!e)throw new Error("useDay2WizardContext must be used within Day2WizardContextProvider");return e},jx=Yx;var Rx={"cluster-details":"Cluster details","static-ip-yaml-view":"Static network configurations","static-ip-network-wide-configurations":"Network-wide configurations","static-ip-host-configurations":"Host specific configurations","generate-iso":"Generate discovery ISO","download-iso":"Download discovery ISO"},Kx=["cluster-details","generate-iso","download-iso"],cu=["static-ip-network-wide-configurations","static-ip-host-configurations"];var du=e=>{let t=[...Kx];return e===xe.YAML?t.splice(1,0,"static-ip-yaml-view"):e===xe.FORM&&t.splice(1,0,...cu),t},Xx=(e,t)=>{let o=e.indexOf(t);return e[o+1]},UY=({children:e})=>{let[t,o]=gs.useState("cluster-details"),[r,s]=gs.useState(L.x86),[i,n]=gs.useState(""),[a,l]=gs.useState(du()),p=gs.useMemo(()=>!a||!t?null:{moveBack(){let u=a.indexOf(t),c=a[u-1];c==="static-ip-host-configurations"&&(c="static-ip-network-wide-configurations"),o(c)},moveNext(){o(Xx(a,t))},onUpdateStaticIpView(u){l(du(u)),u===xe.YAML?o("static-ip-yaml-view"):o("static-ip-network-wide-configurations")},onUpdateHostNetworkConfigType(u){let c;u===De.STATIC?c=du(xe.FORM):c=du(),l(c),o(Xx(c,t))},wizardStepIds:a,currentStepId:t,setCurrentStepId:o,selectedIsoUrl:i,setSelectedIsoUrl:n,selectedCpuArchitecture:r,setSelectedCpuArchitecture:s},[a,t,i,r]);return p?gs.createElement(gs.Fragment,null,gs.createElement(jx.Provider,{value:p},e)):null},Jx=UY;import GY from"react";import{Button as $Y,ButtonVariant as qY}from"@patternfly/react-core";var YY=({cluster:e})=>{let{day2DiscoveryImageDialog:t}=se(),{open:o}=t;return GY.createElement($Y,{variant:qY.secondary,onClick:()=>o({cluster:e}),id:"bare-metal-inventory-add-host-button-download-discovery-iso"},"Add hosts")},Zx=YY;import nr from"react";import{Modal as k4,ModalVariant as T4,WizardHeader as P4}from"@patternfly/react-core";import w4 from"classnames";import{Grid as l4,GridItem as lf}from"@patternfly/react-core";import{Form as p4,Formik as u4}from"formik";import pt from"react";import Nr from"react";import{FormGroup as jY,Flex as RY,FlexItem as KY,TextContent as XY,Text as JY,TextVariants as ZY}from"@patternfly/react-core";var Qx="cpuArchitecture",QY=({canSelectCpuArchitecture:e,day1CpuArchitecture:t,openshiftVersion:o})=>{let{t:r}=f();return e?Nr.createElement(jY,{isInline:!0,fieldId:T(Qx,"radio"),label:Nr.createElement(XY,null,Nr.createElement(JY,{component:ZY.h4},r("ai:CPU architecture"),Nr.createElement(so,{featureId:"MULTIARCH_RELEASE_IMAGE",openshiftVersion:o})))},Nr.createElement(RY,null,ii.map(s=>Nr.createElement(KY,{key:s},Nr.createElement(Ke,{key:s,id:`cpu-arch_${s}`,name:Qx,label:s,value:s,"data-testid":`cpu-arch_${s}`}))))):Nr.createElement(It,null,Nr.createElement(A,{title:r("ai:CPU architecture"),value:t,testId:"cpu-architecture"}))},ek=QY;import mu from"react";import{WizardNav as tk,WizardNavItem as ok}from"@patternfly/react-core";var e4=()=>{let e=mo(),t=n=>!e.wizardStepIds.slice(n).includes(e.currentStepId),o=(n,a)=>a==="cluster-details"?!1:t(n),r=(n,a)=>mu.createElement(ok,{step:n,key:a,content:Rx[a],onNavItemClick:()=>e.setCurrentStepId(a),isCurrent:e.currentStepId===a,isDisabled:o(n,a)}),s=n=>mu.createElement(ok,{step:n,isExpandable:!0,content:"Static network configurations",key:"static-network-configuration-form-view",isCurrent:zs(e.currentStepId),isDisabled:t(n)},mu.createElement(tk,{returnList:!0},cu.map((a,l)=>r(n+l,a))));return mu.createElement(tk,null,(()=>{let n=[],a=0;for(;a<e.wizardStepIds.length;){let l=e.wizardStepIds[a];l==="static-ip-network-wide-configurations"?(n.push(s(a)),a+=2):(n.push(r(a,l)),a+=1)}return n})())},ir=e4;import hs from"react";import{Flex as t4,FlexItem as rk,FormGroup as o4,TextContent as r4,TextVariants as s4,Text as i4}from"@patternfly/react-core";import{useFormikContext as n4}from"formik";var af="hostsNetworkConfigurationType",a4=()=>{let{setFieldValue:e}=n4(),t=o=>{e("hostsNetworkConfigurationType",o.target.value)};return hs.createElement(o4,{label:hs.createElement(r4,null,hs.createElement(i4,{component:s4.h4},"Hosts' network configuration")),fieldId:T(af,"radio"),isInline:!0,onChange:t},hs.createElement(t4,null,hs.createElement(rk,{key:De.DHCP},hs.createElement(Ke,{name:af,value:De.DHCP,label:"DHCP only"})),hs.createElement(rk,{key:De.STATIC},hs.createElement(Ke,{name:af,value:De.STATIC,label:"Static IP, bridges, and bonds"}))))},sk=a4;var ik=e=>{switch(e){case go.x86:case go.MULTI:return L.x86;case go.ARM:return L.ARM;default:throw new Error(`Unknown OCM CPU architecture: ${e}`)}},nk=e=>{switch(e){case L.ARM:case go.ARM:return L.ARM;case L.DAY1_CLUSTER_USES_MULTI:case go.MULTI:case L.x86:case go.x86:default:return L.x86}};var c4=async(e,t)=>{try{let o=await it.getInfraEnv(e,t);return{cpuArchitecture:t,hostsNetworkConfigurationType:o.staticNetworkConfig?De.STATIC:De.DHCP}}catch(o){return x(o),null}},d4=()=>{let{day2DiscoveryImageDialog:e}=se(),{close:t,data:{cluster:o}}=e,r=mo(),[s,i]=pt.useState(),[n,a]=pt.useState(!1),l=$a(o),p=nk(o.cpuArchitecture);pt.useEffect(()=>{(async()=>{let d=await c4(o.id,p);i(d)})()},[o.id,p]);let u=pt.useCallback(async c=>{try{a(!0),c.hostsNetworkConfigurationType===De.DHCP&&await it.updateAllInfraEnvsToDhcp(o.id),r.setSelectedCpuArchitecture(c.cpuArchitecture),r.onUpdateHostNetworkConfigType(c.hostsNetworkConfigurationType)}catch(d){x(d)}finally{a(!1)}},[o.id,r]);return s===void 0?pt.createElement(z,null):s===null?pt.createElement(_,{content:"Failed to load associated data for the Day2 cluster"}):pt.createElement(u4,{initialValues:s,onSubmit:u},({submitForm:c})=>pt.createElement(ye,{navigation:pt.createElement(ir,null),footer:pt.createElement($r,{onNext:()=>{c()},onBack:()=>r.moveBack(),isBackDisabled:r.currentStepId==="cluster-details",isNextDisabled:r.currentStepId==="download-iso",onCancel:t,isSubmitting:n})},pt.createElement(p4,{id:"day2-wizard-cluster-details__form"},pt.createElement(l4,{hasGutter:!0},pt.createElement(lf,null,pt.createElement(Xe,null,"Cluster details")),pt.createElement(lf,{span:12,lg:10,xl:9,xl2:7},pt.createElement(ek,{canSelectCpuArchitecture:l,day1CpuArchitecture:p,openshiftVersion:o.openshiftVersion})),pt.createElement(lf,null,pt.createElement(sk,null))))))},ak=d4;import ri from"react";import{Stack as m4,StackItem as lk}from"@patternfly/react-core";var f4=()=>{let{day2DiscoveryImageDialog:e}=se(),{close:t,data:o}=e,r=o.cluster,s=mo();return ri.createElement(ye,{navigation:ri.createElement(ir,null)},ri.createElement(m4,{hasGutter:!0},ri.createElement(lk,null,ri.createElement(Xe,null,"Download Discovery ISO")),ri.createElement(lk,null,ri.createElement(Mp,{onClose:t,onReset:()=>s.moveBack(),clusterName:r?.name||"cluster",isSNO:le(r),isoDownloadUrl:s.selectedIsoUrl,cpuArchitecture:s.selectedCpuArchitecture}))))},pk=f4;import Cs from"react";import{Stack as g4,StackItem as uk}from"@patternfly/react-core";var h4=()=>{let{day2DiscoveryImageDialog:e}=se(),{close:t,data:o}=e,r=o.cluster,s=mo(),{getIsoImageUrl:i}=aa(),n=Cs.useCallback(async()=>{let a=await i(r.id,s.selectedCpuArchitecture);a.error||(s.setSelectedIsoUrl(a.url),s.moveNext())},[r?.id,s,i]);return Cs.createElement(ye,{navigation:Cs.createElement(ir,null)},Cs.createElement(g4,{hasGutter:!0},Cs.createElement(uk,null,Cs.createElement(Xe,null,"Generate Discovery ISO")),Cs.createElement(uk,null,Cs.createElement(Lp,{cluster:r,cpuArchitecture:s.selectedCpuArchitecture,onCancel:t,onSuccess:n}))))},ck=h4;import Ee from"react";import{Grid as C4,TextContent as y4,Text as dk,TextVariants as mk,PageSection as v4,PageSectionVariants as S4,Button as I4,ButtonVariant as b4}from"@patternfly/react-core";var x4=()=>{let{day2DiscoveryImageDialog:e}=se(),t=mo(),[o,r]=Ee.useState(void 0),[s,i]=Ee.useState(!1),[n,a]=Ee.useState(!1),[l,p]=Ee.useState(!1),[u,c]=Ee.useState(Oy()),[d,m]=Ee.useState(),{data:{cluster:g}}=e,h=t.selectedCpuArchitecture,C=Ee.useCallback(()=>{t.setCurrentStepId("cluster-details"),t.onUpdateHostNetworkConfigType(De.DHCP)},[t]);Ee.useEffect(()=>{(async()=>{let F;try{F=await it.getInfraEnv(g.id,h)}catch{i(!0),r(void 0);return}F.staticNetworkConfig||(F=await it.setDummyStaticConfigToInfraEnv(F.id));let q=Xs(F);q?(r(F),c(q)):i(!0)})()},[g.id,h]);let I=Ee.useCallback(E=>{t.onUpdateStaticIpView(E),p(!0)},[]);if(s)return Ee.createElement(v4,{variant:S4.light,isFilled:!0},Ee.createElement(_,{title:"Cannot load the Static IP configuration for this cluster",content:"For non-multi-architecture clusters, make sure you select the Day1 cpu architecture",actions:[Ee.createElement(I4,{key:"restart-wizard",variant:b4.primary,onClick:C},"Back to Wizard")]}));if(!o)return Ee.createElement(z,null);let y={infraEnv:o,onFormStateChange:E=>{let F=t.currentStepId==="static-ip-host-configurations"||!E.isEmpty;a(F),m(E)},updateInfraEnv:async E=>{let F=await it.syncStaticIpConfigs(g.id,o.id,E.staticNetworkConfig);return r(F),F},showEmptyValues:l},w=(()=>{if(u.view===xe.YAML&&!l)return Ee.createElement(fa,{...y});switch(t.currentStepId){case"static-ip-yaml-view":return Ee.createElement(fa,{...y});case"static-ip-host-configurations":return Ee.createElement(Zp,{...y});case"static-ip-network-wide-configurations":return Ee.createElement(Qp,{...y});default:throw`Unexpected wizard step id ${t.currentStepId} when entering static ip page`}})();return w?Ee.createElement(ye,{navigation:Ee.createElement(ir,null),footer:Ee.createElement($r,{onNext:()=>t.moveNext(),onBack:()=>t.moveBack(),isNextDisabled:!d?.isValid||d.isAutoSaveRunning,onCancel:e.close,isSubmitting:d?.isSubmitting})},Ee.createElement(C4,{hasGutter:!0},Ee.createElement(y4,null,Ee.createElement(dk,{component:mk.h2},"Static network configurations"),Ee.createElement(dk,{component:mk.small},"Network configuration can be done using either the form view or YAML view. Configurations done in this step are for discovering hosts.")),Ee.createElement(zp,{initialView:u.view,confirmOnChangeView:n,onChangeView:I}),w)):null},fk=x4;var D4=(e,t)=>{switch(e){case"cluster-details":return nr.createElement(ak,null);case"generate-iso":return nr.createElement(ck,null);case"download-iso":return nr.createElement(pk,null);case"static-ip-network-wide-configurations":case"static-ip-host-configurations":case"static-ip-yaml-view":return nr.createElement(fk,null);default:return nr.createElement(ye,{navigation:nr.createElement(ir,null),footer:nr.createElement($r,{onNext:()=>t.moveNext(),onBack:()=>t.moveBack(),isBackDisabled:t.currentStepId==="cluster-details",isNextDisabled:t.currentStepId==="download-iso",onCancel:close})},"Step ",e)}},E4=()=>{let{day2DiscoveryImageDialog:e}=se(),{isOpen:t,close:o}=e,r=mo();return nr.createElement(k4,{isOpen:t,variant:T4.large,showClose:!1,hasNoBodyWrapper:!0},nr.createElement("div",{className:w4("pf-c-wizard","cluster-wizard")},nr.createElement(P4,{title:"Add hosts",description:"Choose the settings for adding a new host",onClose:o}),D4(r.currentStepId,r)))},gk=E4;var O4=({cluster:e})=>{if(!e)return null;let t=!$a(e)&&zo(e);return fo.createElement(H4,{hasGutter:!0},fo.createElement(pf,null,fo.createElement(F4,null,fo.createElement(A4,{component:"p"},fo.createElement(Jx,null,fo.createElement(Zx,{cluster:e}),fo.createElement(gk,null))),fo.createElement(Wp,{cluster:e}))),t&&fo.createElement(pf,null,fo.createElement(V4,{title:"Only hosts that have arm64 cpu architecture can be added to this cluster.",variant:N4.info,"data-testid":"arm-architecture-alert",isInline:!0})),fo.createElement(pf,null,fo.createElement(Ni,{cluster:e})))},hk=O4;var{addAlert:Y4}=qr.actions,fu=()=>{let{cluster:e,resetCluster:t}=Ue.useContext(jr),[o,r]=Ue.useState(!1),s=Wi(e),i=Ue.useCallback(async()=>{r(!0);try{if(!e||!t||!e.hosts)return;let n=e.hosts.filter(a=>Ya(e,a.status));await mt.installAll(n),await t()}catch(n){x(n,()=>Y4({title:"Failed to start hosts installation.",message:D(n)}))}finally{setTimeout(()=>{r(!1)},1e4)}},[e,t]);return!e||!t?null:Ue.createElement(Ei,null,Ue.createElement(M4,null,Ue.createElement(z4,null,Ue.createElement(G4,{headingLevel:"h2",size:"lg",className:"card-title"},"Host Discovery")),Ue.createElement(_4,null,Ue.createElement(U4,{hasGutter:!0},Ue.createElement(Ck,null,Ue.createElement(B4,{hasGutter:!0},Ue.createElement(zi,{cluster:e,clusterVarieties:s}))),Ue.createElement(Ck,null,Ue.createElement(hk,{cluster:e})))),Ue.createElement(W4,null,Ue.createElement(gr,null),Ue.createElement($4,{id:"cluster-toolbar"},Ue.createElement(q4,null,Ue.createElement(ht,{variant:L4.primary,name:"install",onClick:()=>void i(),isDisabled:o||Ra(e)===0},"Install ready hosts"),Ue.createElement(Gr,{cluster:e,onFetchEvents:Do}))))),Ue.createElement(Gi,null))};var j4=({match:e})=>{let{clusterId:t}=e.params,o=oa(t),{cluster:r,uiState:s,errorDetail:i}=wp(t),{infraEnv:n,isLoading:a,error:l,updateInfraEnv:p}=Pr(t,L.USE_DAY1_ARCHITECTURE),u=(c,d)=>c.status==="adding-hosts"?G.createElement(Il,{cluster:c,resetCluster:Jr},G.createElement(fu,null)):["preparing-for-installation","installing","installing-pending-user-action","finalizing","installed","error","cancelled"].includes(c.status)?G.createElement(G.Fragment,null,G.createElement(ti,{clusterName:c.name}),G.createElement(Ji,{variant:Zi.light},G.createElement(Sk,null,G.createElement(vk,{component:"h1"},c.name))),G.createElement(Ji,{variant:Zi.light,isFilled:!0},G.createElement(hm,{cluster:c}))):G.createElement(G.Fragment,null,G.createElement(ti,{clusterName:c.name}),G.createElement(Ji,{variant:Zi.light},G.createElement(Sk,null,G.createElement(vk,{component:"h1",className:"pf-u-display-inline"},"Install OpenShift with the Assisted Installer"))),G.createElement(Ji,{variant:Zi.light},G.createElement(Xi,{cluster:c,infraEnv:d},G.createElement(ou,{cluster:c,infraEnv:d,updateInfraEnv:p}))));if(s===Q.LOADING||a)return G.createElement(oi,null);if(s===Q.ERROR&&!r)return Number(i?.code)===404?G.createElement(yk,{to:`${ue}/clusters`}):G.createElement(Ji,{variant:Zi.light,isFilled:!0},G.createElement(_,{title:"Failed to fetch the cluster",fetchData:Number(i?.code)===401?()=>window.location.reload():o,actions:pu()}));if(l)return G.createElement(Ji,{variant:Zi.light,isFilled:!0},G.createElement(_,{title:"Cluster not found",actions:pu(),content:"Check to make sure the cluster-ID is valid. Otherwise, the cluster may have been deleted."}));if(r&&n){let c=s===Q.ERROR;return G.createElement($o,null,G.createElement(Ki,null,G.createElement(Ei,null,G.createElement(Mi,{loadingUI:G.createElement(oi,null),errorUI:G.createElement(uu,null)},G.createElement(Ao,{loadingUi:G.createElement(oi,null),cluster:r},u(r,n),c&&G.createElement(nu,null),G.createElement(ru,null),G.createElement(iu,null),G.createElement(Gi,null))))))}return G.createElement(yk,{to:"/clusters"})},gu=j4;import uf from"react";var hu=({children:e})=>uf.createElement(uf.Fragment,null,e,uf.createElement("div",{"data-testid":"assisted-ui-lib-version",hidden:!0},Gu()));import oo from"react";import{Provider as X4}from"react-redux";import{Switch as kk,Route as ka,Redirect as Tk}from"react-router-dom";import ar from"react";import{Redirect as R4}from"react-router-dom";import{PageSectionVariants as Ik,PageSection as bk}from"@patternfly/react-core";var K4=()=>{let[e,t]=ar.useState(""),[o,r]=ar.useState(),s=ar.useCallback(async()=>{try{let{data:i}=await M.list();r(i),t("")}catch(i){x(i,()=>t("Failed to fetch cluster."))}},[r]);return ar.useEffect(()=>{s()},[s]),e?ar.createElement(bk,{variant:Ik.light,isFilled:!0},ar.createElement(_,{title:"Failed to fetch cluster.",fetchData:s})):o?o.length===0?ar.createElement(xa,null):(o.length>1&&console.warn("More than one cluster found!",o),ar.createElement(R4,{to:`${ue}/clusters/${o[0].id}`})):ar.createElement(bk,{variant:Ik.light,isFilled:!0},ar.createElement(z,null))},xk=K4;var V0e=({allEnabledFeatures:e})=>oo.createElement(X4,{store:Sr},oo.createElement(J4,{features:e})),J4=({features:e,children:t})=>oo.createElement(Ps,{features:e},oo.createElement(hu,null),To()?oo.createElement(kk,null,oo.createElement(ka,{path:`${ue}/clusters/:clusterId`,component:gu}),oo.createElement(ka,{path:`${ue}/clusters`,component:xk}),t,oo.createElement(Tk,{to:`${ue}/clusters`})):oo.createElement(kk,null,oo.createElement(ka,{path:`${ue}/clusters/~new`,component:xa}),oo.createElement(ka,{path:`${ue}/clusters/:clusterId`,component:gu}),oo.createElement(ka,{path:`${ue}/clusters`,component:nf}),t,oo.createElement(Tk,{to:`${ue}/clusters`})));var cf=e=>{let t="",o="";try{if(e.api?.url)o="api",t=new URL(e.api.url).hostname;else if(e.console?.url){o="console";let r=new URL(e.console.url).hostname,s=".apps.";t="api."+r.substring(r.indexOf(s)+s.length)}}catch{}return{apiVipDnsname:t,errorType:t?"":o}},Ta={getOpenshiftClusterId(e){return e&&e.external_id},async fetchCluster(e,t,o,r){let s=Ta.getOpenshiftClusterId(e);if(!s)return;let i=await Ta.getDay2ClusterId(s);if(i)return Ta.fetchClusterById(i);let a=e.cpu_architecture===go.MULTI||r.canSelectCpuArchitecture?ii:[ik(e.cpu_architecture)];return Ta.createCluster(s,e.display_name||e.name||s,cf(e).apiVipDnsname,t,o,a)},async fetchClusterById(e){let{data:t}=await M.get(e);return t},async getDay2ClusterId(e){let{data:t}=await M.listByOpenshiftId(e),o=t.filter(r=>r.kind==="AddHostsCluster");if(o.length>0)return o[0].id},async createCluster(e,t,o,r,s,i){let{data:n}=await M.registerAddHosts({openshiftClusterId:e,name:`scale-up-${t}`,apiVipDnsname:o,openshiftVersion:s}),a=i.map(l=>it.create({name:`${n.name||""}_infra-env-${l}`,pullSecret:r,clusterId:n.id,openshiftVersion:s,cpuArchitecture:l}));return await Promise.all(a),n},completeAiClusterWithOcmCluster:(e,t,o)=>!t||!e?e:{...e,openshiftVersion:t.openshift_version,cpuArchitecture:t.cpu_architecture,canSelectCpuArch:o.canSelectCpuArchitecture}},ys=Ta;var Z4=e=>lS(e.openshift_version,e.aiSupportLevels||[],"SINGLE_NODE_EXPANSION"),q0e=({cluster:e})=>{if(!e.canEdit||!ys.getOpenshiftClusterId(e))return!1;let t=(e.metrics?.nodes?.total||0)>1;return e.state==="ready"&&e.product?.id==="OCP-AssistedInstall"&&(t||Z4(e))};import yu from"react";import{Provider as e6}from"react-redux";import Ce from"react";import{Button as Cu,EmptyStateVariant as Q4}from"@patternfly/react-core";var Pk=({cluster:e,extraInfo:t,isVisible:o})=>{let[r,s]=Ce.useState(),[i,n]=qo(void 0),a=Oi(),{normalizeClusterVersion:l}=lo(),p=Ce.useCallback(()=>{s(void 0),n(void 0)},[n]);Ce.useEffect(()=>{!o&&i&&n(void 0);let c=ys.getOpenshiftClusterId(e);if(o&&i===void 0&&e&&c&&a){n(null);let d=l(e.openshift_version);if(!d){s(Ce.createElement(Ce.Fragment,null,"Unsupported OpenShift cluster version: ",e.openshift_version||"N/A",".",Ce.createElement("br",null),"Check your connection and"," ",Ce.createElement(Cu,{variant:"link",isInline:!0,onClick:p},"try again"),"."));return}let{apiVipDnsname:m,errorType:g}=cf(e);if(g){let C=g==="console"?`Cluster Console URL is not valid (${e.console?.url||""})`:`Cluster API URL is not valid (${e.api?.url||""})`;s(Ce.createElement(Ce.Fragment,null,C,", you can"," ",Ce.createElement(Cu,{variant:"link",isInline:!0,onClick:p},"try again"),"."));return}if(!m){s(Ce.createElement(Ce.Fragment,null,"Neither API nor Console URL has been reported by the cluster yet."));return}(async()=>{try{let C=await ys.fetchCluster(e,a,d,t);n(ys.completeAiClusterWithOcmCluster(C,e,t))}catch(C){if(x(C),vs(C)){let I=C.config.url?.includes("/import");s(Ce.createElement(Ce.Fragment,null,I?"Failed to create wrapping cluster for adding new hosts.":"Failed to fetch cluster for adding new hosts.",Ce.createElement("br",null),"Check your connection and"," ",Ce.createElement(Cu,{variant:"link",isInline:!0,onClick:p},"try again"),"."))}return}})()}},[e,t,a,i,n,o,l,p]);let u=Ce.useCallback(async()=>{if(!!i?.id)try{let c=await ys.fetchClusterById(i.id);n(ys.completeAiClusterWithOcmCluster(c,e,t))}catch(c){x(c),s(Ce.createElement(Ce.Fragment,null,"Failed to reload cluster data.",Ce.createElement("br",null),"Check your connection and"," ",Ce.createElement(Cu,{variant:"link",isInline:!0,onClick:p},"try again"),"."))}},[i?.id,p,e,t,n]);return Ce.useEffect(()=>{let c=setTimeout(()=>{(async()=>{await u()})()},bs);return()=>clearTimeout(c)},[u]),r?Ce.createElement(_,{variant:Q4.large,content:r,title:"Failed to prepare the cluster for adding hosts."}):i?Ce.createElement(Il,{cluster:i,resetCluster:u,ocpConsoleUrl:e?.console?.url},Ce.createElement(Ao,{loadingUi:Ce.createElement(z,null),cluster:i},Ce.createElement(fu,null))):Ce.createElement(z,{content:"Preparing cluster for adding hosts..."})};var t6=e=>yu.createElement(e6,{store:Sr},yu.createElement(hu,null),yu.createElement($o,null,yu.createElement(Pk,{...e}))),o6=t6;export{ac as AddButton,fu as AddHosts,ic as AdditionalNTPSourcesField,gr as Alerts,Kf as Api,Fq as AssistedInstallerDetailCard,Mq as AssistedInstallerExtraDetailCard,hu as AssistedUILibVersion,V0e as AssistedUiRouter,Lr as CheckboxField,hm as ClusterDetail,Am as ClusterDetailsForm,Pc as ClusterEventsList,Tc as ClusterEventsToolbar,Cm as ClusterInstallationProgressCard,gu as ClusterPage,Ld as ClusterStatus,jl as ClusterStatusIcon,em as ClusterToolbar,nf as Clusters,sc as CodeField,Zy as Config,Fs as ConfirmationModal,lg as Constants,A as DetailItem,It as DetailList,Qu as DeveloperPreview,bo as EmptyState,_ as ErrorState,yn as EventsList,kn as EventsModal,bh as EventsModalButton,ot as ExternalLink,Za as FORBIDDEN_HOSTNAMES,fg as Features,wu as FormikAutoSave,nl as FormikStaticField,wn as GridGap,j as HelperText,o6 as HostsClusterDetailTab,sl as IPv4ValidationSchema,St as InputField,c5 as LabelField,fD as LabelValue,z as LoadingState,Dn as ModalProgress,OT as MultiSelectField,xa as NewClusterPage,OP as NumberInputField,Vw as PencilEditField,W as PopoverIcon,ln as PreviewBadgePosition,ct as PrismCode,Ua as PullSecretField,Xu as PullSecretInfo,Ke as RadioField,Eh as Reducers,pn as RemovableField,ee as RenderIf,ws as RichInputField,J4 as Router,on as SelectField,Jy as Selectors,zy as Services,Th as SimpleDropdown,rc as SingleNodeCheckbox,mh as StaticField,al as StaticTextField,Ky as Store,li as SwitchField,ec as TechnologyPreview,ur as TextAreaField,_T as TextAreaSecretField,ht as ToolbarButton,xc as ToolbarSecondaryGroup,XD as ToolbarText,oE as ToolbarrProgress,Pu as UploadField,$r as WizardFooter,fl as WizardNavItem,z8 as acmClusterNameValidationMessages,Jf as allSubnetsIPv4,Jg as bmcAddressValidationMessages,Z8 as bmcAddressValidationSchema,W9 as breakWord,q0e as canAddHost,Yt as clusterNameValidationMessages,ph as clusterNetworksValidationSchema,ah as day2ApiVipValidationSchema,yc as dnsNameValidationSchema,_s as downloadClusterInstallationLogs,rl as dualStackValidationSchema,gh as fitContent,Xo as getClusterDetailId,upe as getClusterMemoryAmount,ppe as getClustervCPUCount,fh as getColSpanRow,pl as getDateTimeCell,Xf as getDefaultOpenShiftVersion,ku as getDuplicates,T as getFieldId,tn as getFormikArrayItemFieldName,ro as getFormikErrorFields,Aj as getFormikObjectItemFieldName,jt as getHumanizedDateTime,w9 as getHumanizedTime,KO as getMasterCount,ni as getRichTextValidation,XO as getWorkerCount,iD as hostPrefixValidationSchema,sD as hostSubnetValidationSchema,Br as hostnameValidationMessages,vc as httpProxyValidationSchema,sh as ipBlockValidationSchema,rh as ipValidationSchema,Fj as labelsToArray,Xg as locationValidationMessages,Q8 as locationValidationSchema,tl as macAddressValidationSchema,lh as machineNetworksValidationSchema,Ja as nameValidationMessages,th as nameValidationSchema,hh as noPadding,ih as noProxyValidationSchema,z9 as nowrap,nh as ntpSourceValidationSchema,Rg as ocmClusterNameValidationMessages,Ej as parseStringLabels,oh as pullSecretValidationSchema,kg as removeProtocolFromURL,ol as richNameValidationSchema,ll as rowSorter,uh as serviceNetworkValidationSchema,el as sshPublicKeyValidationSchema,O as stringToJSON,xo as toSentence,Mo as trimCommaSeparatedList,Ss as trimSshPublicKey,B9 as truncate,Kg as uniqueOcmClusterNameValidationMessages,ho as useFormikAutoSave,tD as vipRangeValidationSchema,Cc as vipValidationSchema,U9 as wrappable};
|
|
34
34
|
//# sourceMappingURL=index.js.map
|