nutanix-1.1.0.umd.min.cloud-credential.js 12 KB

12
  1. (("undefined"!==typeof self?self:this)["webpackChunknutanix_1_1_0"]=("undefined"!==typeof self?self:this)["webpackChunknutanix_1_1_0"]||[]).push([[916],{1210:function(e,t,a){"use strict";a.d(t,{Y:function(){return l}});var s=a(5250),i=a(4364);function r(e,t,a){return(t=o(t))in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e){var t=n(e,"string");return"symbol"==typeof t?t:t+""}function n(e,t){if("object"!=typeof e||!e)return e;var a=e[Symbol.toPrimitive];if(void 0!==a){var s=a.call(e,t||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}class l{constructor(e,t){r(this,"endpoint",""),r(this,"username",""),r(this,"password",""),r(this,"port",""),r(this,"insecure",!1),r(this,"clusterReferenceId",""),r(this,"credentialID",""),r(this,"endpoints",void 0),r(this,"$dispatch",void 0),t.nutanixcredentialConfig?(Object.keys(t.nutanixcredentialConfig).forEach((e=>{this[e]=t.nutanixcredentialConfig[e]})),this.credentialID=t.id):Object.keys(t).forEach((e=>{this[e]=t[e]})),this.$dispatch=e.dispatch}async testConnection(){const e=`/meta/proxy/${this.endpoint}:${this.port}`,t=`${e}/api/clustermgmt/v4.0/config/clusters`,a={Accept:"application/json","X-API-Auth-Header":"Basic "+btoa(this.username+":"+this.password)};try{const e=await this.$dispatch("management/request",{url:t,headers:a,method:"GET",redirectUnauthorized:!1},{root:!0});return 502===e._status?{error:"Could not proxy request - URL may not be in Rancher's allow list"}:e}catch(s){return i.error(s),{error:s}}}async getClusterList(e,t){return await this.getOptions({value:e,api:"/api/clustermgmt/v4.0/config/clusters",field:"data",filter:e=>e.config.hypervisorTypes.includes("AHV"),initial:t})}async getImages(e,t){return await this.getOptions({value:e,api:"/api/vmm/v4.0/content/images",field:"data",initial:t})}async getNetwork(e,t){return await this.getOptions({value:e,api:"/api/networking/v4.0/config/subnets",field:"data",mapper:async e=>{const t="OVERLAY"===e.subnetType?(await this.getVpc(e.vpcReference)).data:void 0;return{...e,baseName:e.name,name:"OVERLAY"===e.subnetType?`${e.name} (${t.name})`:e.name}},filter:e=>("OVERLAY"==e.subnetType||e.clusterReference==this.clusterReferenceId)&&!e.isExternal,initial:t})}async getVpc(e){return await this.makeComputeRequest(`/api/networking/v4.0/config/vpcs/${e}`)}async getStorageContainer(e,t){return await this.getOptions({value:e,api:"/api/clustermgmt/v4.0/config/storage-containers",field:"data",filter:e=>e.clusterExtId==this.clusterReferenceId,initial:t})}async getCategories(e,t){return await this.getOptions({value:e,api:"/api/prism/v4.0/config/categories",field:"data",mapper:e=>({...e,name:`${e.key}=${e.value}`}),filter:e=>"Project"!==e.key,initial:t})}async getProjectsName(e,t){return await this.getOptions({value:e,api:"/api/nutanix/v3/projects/list",field:"entities",mapper:e=>({...e,name:`${e.spec.name}`}),initial:t})}async constructTotalResponse(e,t,a){const s=Math.ceil(a/t),i=[];for(let r=1;r<s;r++){const t=await this.makeComputeRequest(`${e}?$page=${r}`);i.push(...t.data)}return i}async constructProjectTotalResponse(e,t,a){const s=Math.ceil(a/t),i=[];for(let r=1;r<s;r++){const t=await this.makeComputeRequest(`${e}?$page=${r}`,"POST");i.push(...t.entities)}return i}async getOptions(e){const{value:t,api:a,mapper:i,filter:r,initial:o,field:n}=e;let l;if(t.busy=!0,t.enabled=!0,t.selected=(0,s.isArray)(t.selected)?[]:"","/api/nutanix/v3/projects/list"===a){l=await this.makeComputeRequest(a,"POST");const e=l?.metadata?.total_matches??0,t=l?.entities?.length??0;if(t<e){const s=await this.constructProjectTotalResponse(a,t,e);l.entities=[...l.entities,...s]}}else{l=await this.makeComputeRequest(a);const e=l?.metadata?.totalAvailableResults??0,t=l?.data?.length??0;if(t<e){const s=await this.constructTotalResponse(a,t,e);l.data=[...l.data,...s]}}if(l&&l[n]){let e=l[n]||[];if(r&&(e=e.filter((e=>r(e)))),i&&(e=await Promise.all(e.map((async e=>await i(e))))),t.options.forEach((t=>{e.push(t)})),t.options=this.convertToOptions(e),t.busy=!1,t.options.length<e.length){const a=e.filter(((t,a)=>a!==e.findIndex((e=>t.name===e.name))));t.duplicates=a}if(o){const e=t.options.find((e=>e.value.name===o));e&&(t.selected=e.value)}}else t.options=[],t.selected=(0,s.isArray)(t.selected)?[]:null,t.busy=!1,t.enabled=!1}async makeComputeRequest(e,t="GET"){const a=`/meta/proxy/${this.endpoint}:${this.port}`,s=`${a}${e}`,r={Accept:"application/json","Content-Type":"application/json","X-API-Auth-Header":"Basic "+btoa(this.username+":"+this.password)};try{const e=await this.$dispatch("management/request",{url:s,headers:r,method:t,data:JSON.stringify({}),redirectUnauthorized:!1},{root:!0});return e}catch(o){i.error(o)}}convertToOptions(e){const t=e.filter(((t,a)=>a===e.findIndex((e=>t.name===e.name)))),a=(t||[]).sort(((e,t)=>e.name.localeCompare(t.name)));return a.map((e=>({label:e.name,value:e})))}}},3162:function(e,t,a){var s=a(5370);s.__esModule&&(s=s.default),"string"===typeof s&&(s=[[e.id,s,""]]),s.locals&&(e.exports=s.locals);var i=a(4825).A;i("e9daccc8",s,!0,{sourceMap:!1,shadowMode:!1})},5370:function(e,t,a){"use strict";a.r(t);var s=a(429),i=a.n(s),r=a(1214),o=a.n(r),n=o()(i());n.push([e.id,".allow-list-error[data-v-77bf4674]{display:flex}.allow-list-error[data-v-77bf4674]>:first-child{flex:1}.icon-spacer[data-v-77bf4674]{width:24px}.align-start[data-v-77bf4674]{align-self:flex-start}",""]),t["default"]=n},8962:function(e,t,a){"use strict";a.r(t),a.d(t,{default:function(){return V}});var s=a(9274);const i={class:"row"},r={class:"col span-6"},o={class:"col span-6"},n={class:"row"},l={class:"col span-6"},d={class:"col span-6"},c={class:"row"},u={class:"col span-6"},p=["disabled","loading"],h={key:0,class:"icon icon-lg icon-spinner icon-spin"},m={key:1,class:"icon-spacer"},v=["disabled"];function f(e,t,a,f,y,w){const g=(0,s.resolveComponent)("LabeledInput"),b=(0,s.resolveComponent)("Checkbox"),k=(0,s.resolveComponent)("Banner");return(0,s.openBlock)(),(0,s.createElementBlock)(s.Fragment,null,[(0,s.createElementVNode)("div",i,[(0,s.createElementVNode)("div",r,[(0,s.createVNode)(g,{value:a.value.decodedData.endpoint,disabled:1!==y.step,"label-key":"driver.nutanix.auth.fields.endpoint","placeholder-key":"driver.nutanix.auth.placeholders.endpoint",type:"text",mode:a.mode,"onUpdate:value":t[0]||(t[0]=e=>{a.value.setData("endpoint",e)})},null,8,["value","disabled","mode"])]),(0,s.createElementVNode)("div",o,[(0,s.createVNode)(g,{value:a.value.decodedData.port,disabled:1!==y.step,"label-key":"driver.nutanix.auth.fields.port","placeholder-key":"driver.nutanix.auth.placeholders.port",type:"text",mode:a.mode,"onUpdate:value":t[1]||(t[1]=e=>{a.value.setData("port",e)})},null,8,["value","disabled","mode"])])]),(0,s.createElementVNode)("div",n,[(0,s.createElementVNode)("div",l,[(0,s.createVNode)(g,{value:a.value.decodedData.username,disabled:1!==y.step,class:"mt-20","label-key":"driver.nutanix.auth.fields.username","placeholder-key":"driver.nutanix.auth.placeholders.username",type:"text",mode:a.mode,"onUpdate:value":t[2]||(t[2]=e=>{a.value.setData("username",e)})},null,8,["value","disabled","mode"])]),(0,s.createElementVNode)("div",d,[(0,s.createVNode)(g,{value:a.value.decodedData.password,disabled:1!==y.step,class:"mt-20","label-key":"driver.nutanix.auth.fields.password","placeholder-key":"driver.nutanix.auth.placeholders.password",type:"password",mode:a.mode,"onUpdate:value":t[3]||(t[3]=e=>{a.value.setData("password",e)})},null,8,["value","disabled","mode"])])]),(0,s.createElementVNode)("div",c,[(0,s.createElementVNode)("div",u,[(0,s.createVNode)(b,{class:"mt-20",value:a.value.decodedData.insecure,valueWhenTrue:!0,"label-key":"driver.nutanix.auth.fields.insecure","onUpdate:value":t[4]||(t[4]=e=>{a.value.setData("insecure",e)}),disabled:!0},null,8,["value"])])]),(0,s.createElementVNode)("button",{ref:"connect",class:"btn role-primary mt-20 align-start",disabled:1!==y.step||!w.canAuthenticate,loading:1!==y.step||!w.canAuthenticate,onClick:t[5]||(t[5]=e=>w.connect(e))},[y.busy?((0,s.openBlock)(),(0,s.createElementBlock)("i",h)):((0,s.openBlock)(),(0,s.createElementBlock)("span",m)),(0,s.createElementVNode)("span",null,(0,s.toDisplayString)(e.t("driver.nutanix.auth.actions.authenticate")),1),t[7]||(t[7]=(0,s.createElementVNode)("span",{class:"icon-spacer"},null,-1))],8,p),y.success?((0,s.openBlock)(),(0,s.createBlock)(k,{key:0,color:"success",closable:!1},{default:(0,s.withCtx)((()=>[(0,s.createTextVNode)((0,s.toDisplayString)(y.success),1)])),_:1})):(0,s.createCommentVNode)("",!0),y.error?((0,s.openBlock)(),(0,s.createBlock)(k,{key:1,class:"mt-20",color:"error"},{default:(0,s.withCtx)((()=>[(0,s.createTextVNode)((0,s.toDisplayString)(y.error),1)])),_:1})):(0,s.createCommentVNode)("",!0),y.errorAllowHost?((0,s.openBlock)(),(0,s.createBlock)(k,{key:2,color:"error",class:"allow-list-error"},{default:(0,s.withCtx)((()=>[(0,s.createElementVNode)("div",null,(0,s.toDisplayString)(e.t("driver.nutanix.auth.errors.notAllowed",{hostname:w.hostname})),1),(0,s.createElementVNode)("button",{disabled:y.allowBusy,class:"btn ml-10 role-primary",onClick:t[6]||(t[6]=(...e)=>w.addHostToAllowList&&w.addHostToAllowList(...e))},(0,s.toDisplayString)(e.t("driver.nutanix.auth.actions.addToAllowList")),9,v)])),_:1})):(0,s.createCommentVNode)("",!0)],64)}function y(e){const t=y.options,a=t.parser[t.strictMode?"strict":"loose"].exec(e);if(!a)throw new Error(`Cannot parse as uri: ${e}`);const s={};let i=14;while(i--)s[t.key[i]]=a[i]||"";return s.query={},s.queryStr.replace(t.q.parser,((e,a,i)=>(a&&(s[t.q.name][a]=i),""))),s}y.options={strictMode:!1,key:["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","queryStr","anchor"],q:{name:"query",parser:/(?:^|&)([^&=]*)=?([^&]*)/g},parser:{strict:/^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,loose:/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/}};var w=a(1210),g=a(5820),b=a(7677),k=a(8868),x=a(7676),D=a(4364),C={components:{Banner:g.A,LabeledInput:b.o,LabeledSelect:k.A,Checkbox:x.A},props:{mode:{type:String,required:!0},value:{type:Object,required:!0}},async fetch(){this.driver=await this.$store.dispatch("rancher/find",{type:"nodedriver",id:"nutanix"})},data(){return{step:1,busy:!1,errorAllowHost:!1,allowBusy:!1,driver:{},error:"",success:""}},computed:{hostname(){const e=y(this.value.decodedData.endpoint);return e?.host||""},canAuthenticate(){return!!this.value?.decodedData?.endpoint&&!!this.value?.decodedData?.username&&!!this.value?.decodedData?.password}},emits:["validationChanged"],methods:{test(){return!0},hostInAllowList(){if(!this.driver?.whitelistDomains)return!1;const e=y(this.value.decodedData.endpoint);return!e.host||(this.driver?.whitelistDomains||[]).includes(e.host)},async addHostToAllowList(){this["allowBusy"]=!0;const e=y(this.value.decodedData.endpoint);this.driver.whitelistDomains=this.driver.whitelistDomains||[],this.hostInAllowList()||this.driver.whitelistDomains.push(e.host);try{await this.driver.save(),this["error"]="",this.connect()}catch(t){D.error("Could not update driver",t),this["allowBusy"]=!1}},async connect(){if(this.disabled)return;this["error"]="",this["success"]="",this["errorAllowHost"]=!1;let e=!1;if(!this.value.decodedData.endpoint)return void(this["busy"]=!1);this.value.decodedData.port||this.value.setData("port",9440);const t=new w.Y(this.$store,{endpoint:this.value.decodedData.endpoint,username:this.value.decodedData.username,password:this.value.decodedData.password,port:this.value.decodedData.port,insecure:this.value.decodedData.insecure});this["allowBusy"]=!1,this["busy"]=!0;const a=await t.testConnection();a.error?(e=!1,502!==a.error._status||this.hostInAllowList()?401===a.error._status?this["error"]="Authentication Failed":404===a.error._status?this["error"]="API method not found. PC version 2024.3 or higher is required":this["error"]=a.error.message?a.error.message:"Something went wrong":this["errorAllowHost"]=!0):(e=!0,this["success"]=`Welcome ${this.value.decodedData.username}, connected to ${this.value.decodedData.endpoint}`),this["busy"]=!1,this.$emit("validationChanged",e)}}},A=(a(3162),a(7433));const $=(0,A.A)(C,[["render",f],["__scopeId","data-v-77bf4674"]]);var V=$}}]);
  2. //# sourceMappingURL=nutanix-1.1.0.umd.min.cloud-credential.js.map