diff --git a/mkdocs.yml b/mkdocs.yml index f2499ff..189356b 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -87,7 +87,7 @@ extra: link: https://id.linkedin.com/in/yuyu-billing-068374264 analytics: provider: google - property: G-KE6QVLXCJP + property: G-MHL1SCTT37 copyright: Copyright © 2022 - Yuyu Team diff --git a/site/404.html b/site/404.html index 2e7cea3..61e871d 100644 --- a/site/404.html +++ b/site/404.html @@ -47,8 +47,8 @@ - - + + @@ -135,6 +135,39 @@ + + +
diff --git a/site/architecture/index.html b/site/architecture/index.html index de9e1b6..cff993e 100644 --- a/site/architecture/index.html +++ b/site/architecture/index.html @@ -47,8 +47,8 @@ - - + + @@ -140,6 +140,39 @@ + + +
diff --git a/site/assets/javascripts/bundle.51198bba.min.js b/site/assets/javascripts/bundle.51198bba.min.js deleted file mode 100644 index 31bd041..0000000 --- a/site/assets/javascripts/bundle.51198bba.min.js +++ /dev/null @@ -1,29 +0,0 @@ -"use strict";(()=>{var Ri=Object.create;var gr=Object.defineProperty;var ki=Object.getOwnPropertyDescriptor;var Hi=Object.getOwnPropertyNames,Ht=Object.getOwnPropertySymbols,Pi=Object.getPrototypeOf,yr=Object.prototype.hasOwnProperty,on=Object.prototype.propertyIsEnumerable;var nn=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))yr.call(t,r)&&nn(e,r,t[r]);if(Ht)for(var r of Ht(t))on.call(t,r)&&nn(e,r,t[r]);return e};var an=(e,t)=>{var r={};for(var n in e)yr.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&Ht)for(var n of Ht(e))t.indexOf(n)<0&&on.call(e,n)&&(r[n]=e[n]);return r};var Pt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var $i=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Hi(t))!yr.call(e,o)&&o!==r&&gr(e,o,{get:()=>t[o],enumerable:!(n=ki(t,o))||n.enumerable});return e};var yt=(e,t,r)=>(r=e!=null?Ri(Pi(e)):{},$i(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var cn=Pt((xr,sn)=>{(function(e,t){typeof xr=="object"&&typeof sn!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(xr,function(){"use strict";function e(r){var n=!0,o=!1,i=null,s={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function a(T){return!!(T&&T!==document&&T.nodeName!=="HTML"&&T.nodeName!=="BODY"&&"classList"in T&&"contains"in T.classList)}function c(T){var Qe=T.type,De=T.tagName;return!!(De==="INPUT"&&s[Qe]&&!T.readOnly||De==="TEXTAREA"&&!T.readOnly||T.isContentEditable)}function f(T){T.classList.contains("focus-visible")||(T.classList.add("focus-visible"),T.setAttribute("data-focus-visible-added",""))}function u(T){T.hasAttribute("data-focus-visible-added")&&(T.classList.remove("focus-visible"),T.removeAttribute("data-focus-visible-added"))}function p(T){T.metaKey||T.altKey||T.ctrlKey||(a(r.activeElement)&&f(r.activeElement),n=!0)}function m(T){n=!1}function d(T){a(T.target)&&(n||c(T.target))&&f(T.target)}function h(T){a(T.target)&&(T.target.classList.contains("focus-visible")||T.target.hasAttribute("data-focus-visible-added"))&&(o=!0,window.clearTimeout(i),i=window.setTimeout(function(){o=!1},100),u(T.target))}function v(T){document.visibilityState==="hidden"&&(o&&(n=!0),G())}function G(){document.addEventListener("mousemove",N),document.addEventListener("mousedown",N),document.addEventListener("mouseup",N),document.addEventListener("pointermove",N),document.addEventListener("pointerdown",N),document.addEventListener("pointerup",N),document.addEventListener("touchmove",N),document.addEventListener("touchstart",N),document.addEventListener("touchend",N)}function oe(){document.removeEventListener("mousemove",N),document.removeEventListener("mousedown",N),document.removeEventListener("mouseup",N),document.removeEventListener("pointermove",N),document.removeEventListener("pointerdown",N),document.removeEventListener("pointerup",N),document.removeEventListener("touchmove",N),document.removeEventListener("touchstart",N),document.removeEventListener("touchend",N)}function N(T){T.target.nodeName&&T.target.nodeName.toLowerCase()==="html"||(n=!1,oe())}document.addEventListener("keydown",p,!0),document.addEventListener("mousedown",m,!0),document.addEventListener("pointerdown",m,!0),document.addEventListener("touchstart",m,!0),document.addEventListener("visibilitychange",v,!0),G(),r.addEventListener("focus",d,!0),r.addEventListener("blur",h,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var fn=Pt(Er=>{(function(e){var t=function(){try{return!!Symbol.iterator}catch(f){return!1}},r=t(),n=function(f){var u={next:function(){var p=f.shift();return{done:p===void 0,value:p}}};return r&&(u[Symbol.iterator]=function(){return u}),u},o=function(f){return encodeURIComponent(f).replace(/%20/g,"+")},i=function(f){return decodeURIComponent(String(f).replace(/\+/g," "))},s=function(){var f=function(p){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var m=typeof p;if(m!=="undefined")if(m==="string")p!==""&&this._fromString(p);else if(p instanceof f){var d=this;p.forEach(function(oe,N){d.append(N,oe)})}else if(p!==null&&m==="object")if(Object.prototype.toString.call(p)==="[object Array]")for(var h=0;hd[0]?1:0}),f._entries&&(f._entries={});for(var p=0;p1?i(d[1]):"")}})})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Er);(function(e){var t=function(){try{var o=new e.URL("b","http://a");return o.pathname="c d",o.href==="http://a/c%20d"&&o.searchParams}catch(i){return!1}},r=function(){var o=e.URL,i=function(c,f){typeof c!="string"&&(c=String(c)),f&&typeof f!="string"&&(f=String(f));var u=document,p;if(f&&(e.location===void 0||f!==e.location.href)){f=f.toLowerCase(),u=document.implementation.createHTMLDocument(""),p=u.createElement("base"),p.href=f,u.head.appendChild(p);try{if(p.href.indexOf(f)!==0)throw new Error(p.href)}catch(T){throw new Error("URL unable to set base "+f+" due to "+T)}}var m=u.createElement("a");m.href=c,p&&(u.body.appendChild(m),m.href=m.href);var d=u.createElement("input");if(d.type="url",d.value=c,m.protocol===":"||!/:/.test(m.href)||!d.checkValidity()&&!f)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:m});var h=new e.URLSearchParams(this.search),v=!0,G=!0,oe=this;["append","delete","set"].forEach(function(T){var Qe=h[T];h[T]=function(){Qe.apply(h,arguments),v&&(G=!1,oe.search=h.toString(),G=!0)}}),Object.defineProperty(this,"searchParams",{value:h,enumerable:!0});var N=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==N&&(N=this.search,G&&(v=!1,this.searchParams._fromString(this.search),v=!0))}})},s=i.prototype,a=function(c){Object.defineProperty(s,c,{get:function(){return this._anchorElement[c]},set:function(f){this._anchorElement[c]=f},enumerable:!0})};["hash","host","hostname","port","protocol"].forEach(function(c){a(c)}),Object.defineProperty(s,"search",{get:function(){return this._anchorElement.search},set:function(c){this._anchorElement.search=c,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(s,{toString:{get:function(){var c=this;return function(){return c.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(c){this._anchorElement.href=c,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(c){this._anchorElement.pathname=c},enumerable:!0},origin:{get:function(){var c={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],f=this._anchorElement.port!=c&&this._anchorElement.port!=="";return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(f?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(c){},enumerable:!0},username:{get:function(){return""},set:function(c){},enumerable:!0}}),i.createObjectURL=function(c){return o.createObjectURL.apply(o,arguments)},i.revokeObjectURL=function(c){return o.revokeObjectURL.apply(o,arguments)},e.URL=i};if(t()||r(),e.location!==void 0&&!("origin"in e.location)){var n=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:n,enumerable:!0})}catch(o){setInterval(function(){e.location.origin=n()},100)}}})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Er)});var Kr=Pt((Mt,qr)=>{/*! - * clipboard.js v2.0.11 - * https://clipboardjs.com/ - * - * Licensed MIT © Zeno Rocha - */(function(t,r){typeof Mt=="object"&&typeof qr=="object"?qr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Mt=="object"?Mt.ClipboardJS=r():t.ClipboardJS=r()})(Mt,function(){return function(){var e={686:function(n,o,i){"use strict";i.d(o,{default:function(){return Ci}});var s=i(279),a=i.n(s),c=i(370),f=i.n(c),u=i(817),p=i.n(u);function m(j){try{return document.execCommand(j)}catch(O){return!1}}var d=function(O){var E=p()(O);return m("cut"),E},h=d;function v(j){var O=document.documentElement.getAttribute("dir")==="rtl",E=document.createElement("textarea");E.style.fontSize="12pt",E.style.border="0",E.style.padding="0",E.style.margin="0",E.style.position="absolute",E.style[O?"right":"left"]="-9999px";var H=window.pageYOffset||document.documentElement.scrollTop;return E.style.top="".concat(H,"px"),E.setAttribute("readonly",""),E.value=j,E}var G=function(O,E){var H=v(O);E.container.appendChild(H);var I=p()(H);return m("copy"),H.remove(),I},oe=function(O){var E=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},H="";return typeof O=="string"?H=G(O,E):O instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(O==null?void 0:O.type)?H=G(O.value,E):(H=p()(O),m("copy")),H},N=oe;function T(j){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?T=function(E){return typeof E}:T=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},T(j)}var Qe=function(){var O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},E=O.action,H=E===void 0?"copy":E,I=O.container,q=O.target,Me=O.text;if(H!=="copy"&&H!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(q!==void 0)if(q&&T(q)==="object"&&q.nodeType===1){if(H==="copy"&&q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(H==="cut"&&(q.hasAttribute("readonly")||q.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(Me)return N(Me,{container:I});if(q)return H==="cut"?h(q):N(q,{container:I})},De=Qe;function $e(j){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?$e=function(E){return typeof E}:$e=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},$e(j)}function wi(j,O){if(!(j instanceof O))throw new TypeError("Cannot call a class as a function")}function rn(j,O){for(var E=0;E0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof I.action=="function"?I.action:this.defaultAction,this.target=typeof I.target=="function"?I.target:this.defaultTarget,this.text=typeof I.text=="function"?I.text:this.defaultText,this.container=$e(I.container)==="object"?I.container:document.body}},{key:"listenClick",value:function(I){var q=this;this.listener=f()(I,"click",function(Me){return q.onClick(Me)})}},{key:"onClick",value:function(I){var q=I.delegateTarget||I.currentTarget,Me=this.action(q)||"copy",kt=De({action:Me,container:this.container,target:this.target(q),text:this.text(q)});this.emit(kt?"success":"error",{action:Me,text:kt,trigger:q,clearSelection:function(){q&&q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(I){return vr("action",I)}},{key:"defaultTarget",value:function(I){var q=vr("target",I);if(q)return document.querySelector(q)}},{key:"defaultText",value:function(I){return vr("text",I)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(I){var q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return N(I,q)}},{key:"cut",value:function(I){return h(I)}},{key:"isSupported",value:function(){var I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],q=typeof I=="string"?[I]:I,Me=!!document.queryCommandSupported;return q.forEach(function(kt){Me=Me&&!!document.queryCommandSupported(kt)}),Me}}]),E}(a()),Ci=Ai},828:function(n){var o=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function s(a,c){for(;a&&a.nodeType!==o;){if(typeof a.matches=="function"&&a.matches(c))return a;a=a.parentNode}}n.exports=s},438:function(n,o,i){var s=i(828);function a(u,p,m,d,h){var v=f.apply(this,arguments);return u.addEventListener(m,v,h),{destroy:function(){u.removeEventListener(m,v,h)}}}function c(u,p,m,d,h){return typeof u.addEventListener=="function"?a.apply(null,arguments):typeof m=="function"?a.bind(null,document).apply(null,arguments):(typeof u=="string"&&(u=document.querySelectorAll(u)),Array.prototype.map.call(u,function(v){return a(v,p,m,d,h)}))}function f(u,p,m,d){return function(h){h.delegateTarget=s(h.target,p),h.delegateTarget&&d.call(u,h)}}n.exports=c},879:function(n,o){o.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},o.nodeList=function(i){var s=Object.prototype.toString.call(i);return i!==void 0&&(s==="[object NodeList]"||s==="[object HTMLCollection]")&&"length"in i&&(i.length===0||o.node(i[0]))},o.string=function(i){return typeof i=="string"||i instanceof String},o.fn=function(i){var s=Object.prototype.toString.call(i);return s==="[object Function]"}},370:function(n,o,i){var s=i(879),a=i(438);function c(m,d,h){if(!m&&!d&&!h)throw new Error("Missing required arguments");if(!s.string(d))throw new TypeError("Second argument must be a String");if(!s.fn(h))throw new TypeError("Third argument must be a Function");if(s.node(m))return f(m,d,h);if(s.nodeList(m))return u(m,d,h);if(s.string(m))return p(m,d,h);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function f(m,d,h){return m.addEventListener(d,h),{destroy:function(){m.removeEventListener(d,h)}}}function u(m,d,h){return Array.prototype.forEach.call(m,function(v){v.addEventListener(d,h)}),{destroy:function(){Array.prototype.forEach.call(m,function(v){v.removeEventListener(d,h)})}}}function p(m,d,h){return a(document.body,m,d,h)}n.exports=c},817:function(n){function o(i){var s;if(i.nodeName==="SELECT")i.focus(),s=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var a=i.hasAttribute("readonly");a||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),a||i.removeAttribute("readonly"),s=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var c=window.getSelection(),f=document.createRange();f.selectNodeContents(i),c.removeAllRanges(),c.addRange(f),s=c.toString()}return s}n.exports=o},279:function(n){function o(){}o.prototype={on:function(i,s,a){var c=this.e||(this.e={});return(c[i]||(c[i]=[])).push({fn:s,ctx:a}),this},once:function(i,s,a){var c=this;function f(){c.off(i,f),s.apply(a,arguments)}return f._=s,this.on(i,f,a)},emit:function(i){var s=[].slice.call(arguments,1),a=((this.e||(this.e={}))[i]||[]).slice(),c=0,f=a.length;for(c;c{"use strict";/*! - * escape-html - * Copyright(c) 2012-2013 TJ Holowaychuk - * Copyright(c) 2015 Andreas Lubbe - * Copyright(c) 2015 Tiancheng "Timothy" Gu - * MIT Licensed - */var ns=/["'&<>]/;Go.exports=os;function os(e){var t=""+e,r=ns.exec(t);if(!r)return t;var n,o="",i=0,s=0;for(i=r.index;i0&&i[i.length-1])&&(f[0]===6||f[0]===2)){r=0;continue}if(f[0]===3&&(!i||f[1]>i[0]&&f[1]=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function W(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var n=r.call(e),o,i=[],s;try{for(;(t===void 0||t-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(a){s={error:a}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(s)throw s.error}}return i}function D(e,t,r){if(r||arguments.length===2)for(var n=0,o=t.length,i;n1||a(m,d)})})}function a(m,d){try{c(n[m](d))}catch(h){p(i[0][3],h)}}function c(m){m.value instanceof et?Promise.resolve(m.value.v).then(f,u):p(i[0][2],m)}function f(m){a("next",m)}function u(m){a("throw",m)}function p(m,d){m(d),i.shift(),i.length&&a(i[0][0],i[0][1])}}function ln(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof Ee=="function"?Ee(e):e[Symbol.iterator](),r={},n("next"),n("throw"),n("return"),r[Symbol.asyncIterator]=function(){return this},r);function n(i){r[i]=e[i]&&function(s){return new Promise(function(a,c){s=e[i](s),o(a,c,s.done,s.value)})}}function o(i,s,a,c){Promise.resolve(c).then(function(f){i({value:f,done:a})},s)}}function C(e){return typeof e=="function"}function at(e){var t=function(n){Error.call(n),n.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var It=at(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: -`+r.map(function(n,o){return o+1+") "+n.toString()}).join(` - `):"",this.name="UnsubscriptionError",this.errors=r}});function Ve(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Ie=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,n,o,i;if(!this.closed){this.closed=!0;var s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var a=Ee(s),c=a.next();!c.done;c=a.next()){var f=c.value;f.remove(this)}}catch(v){t={error:v}}finally{try{c&&!c.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}else s.remove(this);var u=this.initialTeardown;if(C(u))try{u()}catch(v){i=v instanceof It?v.errors:[v]}var p=this._finalizers;if(p){this._finalizers=null;try{for(var m=Ee(p),d=m.next();!d.done;d=m.next()){var h=d.value;try{mn(h)}catch(v){i=i!=null?i:[],v instanceof It?i=D(D([],W(i)),W(v.errors)):i.push(v)}}}catch(v){n={error:v}}finally{try{d&&!d.done&&(o=m.return)&&o.call(m)}finally{if(n)throw n.error}}}if(i)throw new It(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)mn(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Ve(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Ve(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Sr=Ie.EMPTY;function jt(e){return e instanceof Ie||e&&"closed"in e&&C(e.remove)&&C(e.add)&&C(e.unsubscribe)}function mn(e){C(e)?e():e.unsubscribe()}var Le={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var st={setTimeout:function(e,t){for(var r=[],n=2;n0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var n=this,o=this,i=o.hasError,s=o.isStopped,a=o.observers;return i||s?Sr:(this.currentObservers=null,a.push(r),new Ie(function(){n.currentObservers=null,Ve(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var n=this,o=n.hasError,i=n.thrownError,s=n.isStopped;o?r.error(i):s&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,n){return new En(r,n)},t}(F);var En=function(e){ie(t,e);function t(r,n){var o=e.call(this)||this;return o.destination=r,o.source=n,o}return t.prototype.next=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.next)===null||o===void 0||o.call(n,r)},t.prototype.error=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.error)===null||o===void 0||o.call(n,r)},t.prototype.complete=function(){var r,n;(n=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||n===void 0||n.call(r)},t.prototype._subscribe=function(r){var n,o;return(o=(n=this.source)===null||n===void 0?void 0:n.subscribe(r))!==null&&o!==void 0?o:Sr},t}(x);var Et={now:function(){return(Et.delegate||Date).now()},delegate:void 0};var wt=function(e){ie(t,e);function t(r,n,o){r===void 0&&(r=1/0),n===void 0&&(n=1/0),o===void 0&&(o=Et);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=n,i._timestampProvider=o,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=n===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,n),i}return t.prototype.next=function(r){var n=this,o=n.isStopped,i=n._buffer,s=n._infiniteTimeWindow,a=n._timestampProvider,c=n._windowTime;o||(i.push(r),!s&&i.push(a.now()+c)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var n=this._innerSubscribe(r),o=this,i=o._infiniteTimeWindow,s=o._buffer,a=s.slice(),c=0;c0?e.prototype.requestAsyncId.call(this,r,n,o):(r.actions.push(this),r._scheduled||(r._scheduled=ut.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,n,o){var i;if(o===void 0&&(o=0),o!=null?o>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,n,o);var s=r.actions;n!=null&&((i=s[s.length-1])===null||i===void 0?void 0:i.id)!==n&&(ut.cancelAnimationFrame(n),r._scheduled=void 0)},t}(Wt);var Tn=function(e){ie(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var n=this._scheduled;this._scheduled=void 0;var o=this.actions,i;r=r||o.shift();do if(i=r.execute(r.state,r.delay))break;while((r=o[0])&&r.id===n&&o.shift());if(this._active=!1,i){for(;(r=o[0])&&r.id===n&&o.shift();)r.unsubscribe();throw i}},t}(Dt);var Te=new Tn(Sn);var _=new F(function(e){return e.complete()});function Vt(e){return e&&C(e.schedule)}function Cr(e){return e[e.length-1]}function Ye(e){return C(Cr(e))?e.pop():void 0}function Oe(e){return Vt(Cr(e))?e.pop():void 0}function zt(e,t){return typeof Cr(e)=="number"?e.pop():t}var pt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Nt(e){return C(e==null?void 0:e.then)}function qt(e){return C(e[ft])}function Kt(e){return Symbol.asyncIterator&&C(e==null?void 0:e[Symbol.asyncIterator])}function Qt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Ni(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Yt=Ni();function Gt(e){return C(e==null?void 0:e[Yt])}function Bt(e){return pn(this,arguments,function(){var r,n,o,i;return $t(this,function(s){switch(s.label){case 0:r=e.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,et(r.read())];case 3:return n=s.sent(),o=n.value,i=n.done,i?[4,et(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,et(o)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function Jt(e){return C(e==null?void 0:e.getReader)}function U(e){if(e instanceof F)return e;if(e!=null){if(qt(e))return qi(e);if(pt(e))return Ki(e);if(Nt(e))return Qi(e);if(Kt(e))return On(e);if(Gt(e))return Yi(e);if(Jt(e))return Gi(e)}throw Qt(e)}function qi(e){return new F(function(t){var r=e[ft]();if(C(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Ki(e){return new F(function(t){for(var r=0;r=2;return function(n){return n.pipe(e?A(function(o,i){return e(o,i,n)}):de,ge(1),r?He(t):Vn(function(){return new Zt}))}}function zn(){for(var e=[],t=0;t=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new x}:t,n=e.resetOnError,o=n===void 0?!0:n,i=e.resetOnComplete,s=i===void 0?!0:i,a=e.resetOnRefCountZero,c=a===void 0?!0:a;return function(f){var u,p,m,d=0,h=!1,v=!1,G=function(){p==null||p.unsubscribe(),p=void 0},oe=function(){G(),u=m=void 0,h=v=!1},N=function(){var T=u;oe(),T==null||T.unsubscribe()};return y(function(T,Qe){d++,!v&&!h&&G();var De=m=m!=null?m:r();Qe.add(function(){d--,d===0&&!v&&!h&&(p=$r(N,c))}),De.subscribe(Qe),!u&&d>0&&(u=new rt({next:function($e){return De.next($e)},error:function($e){v=!0,G(),p=$r(oe,o,$e),De.error($e)},complete:function(){h=!0,G(),p=$r(oe,s),De.complete()}}),U(T).subscribe(u))})(f)}}function $r(e,t){for(var r=[],n=2;ne.next(document)),e}function K(e,t=document){return Array.from(t.querySelectorAll(e))}function z(e,t=document){let r=ce(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function ce(e,t=document){return t.querySelector(e)||void 0}function _e(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}function tr(e){return L(b(document.body,"focusin"),b(document.body,"focusout")).pipe(ke(1),l(()=>{let t=_e();return typeof t!="undefined"?e.contains(t):!1}),V(e===_e()),B())}function Xe(e){return{x:e.offsetLeft,y:e.offsetTop}}function Qn(e){return L(b(window,"load"),b(window,"resize")).pipe(Ce(0,Te),l(()=>Xe(e)),V(Xe(e)))}function rr(e){return{x:e.scrollLeft,y:e.scrollTop}}function dt(e){return L(b(e,"scroll"),b(window,"resize")).pipe(Ce(0,Te),l(()=>rr(e)),V(rr(e)))}var Gn=function(){if(typeof Map!="undefined")return Map;function e(t,r){var n=-1;return t.some(function(o,i){return o[0]===r?(n=i,!0):!1}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(r){var n=e(this.__entries__,r),o=this.__entries__[n];return o&&o[1]},t.prototype.set=function(r,n){var o=e(this.__entries__,r);~o?this.__entries__[o][1]=n:this.__entries__.push([r,n])},t.prototype.delete=function(r){var n=this.__entries__,o=e(n,r);~o&&n.splice(o,1)},t.prototype.has=function(r){return!!~e(this.__entries__,r)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(r,n){n===void 0&&(n=null);for(var o=0,i=this.__entries__;o0},e.prototype.connect_=function(){!Dr||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),ga?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!Dr||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(t){var r=t.propertyName,n=r===void 0?"":r,o=va.some(function(i){return!!~n.indexOf(i)});o&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),Bn=function(e,t){for(var r=0,n=Object.keys(t);r0},e}(),Xn=typeof WeakMap!="undefined"?new WeakMap:new Gn,Zn=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var r=ya.getInstance(),n=new Aa(t,r,this);Xn.set(this,n)}return e}();["observe","unobserve","disconnect"].forEach(function(e){Zn.prototype[e]=function(){var t;return(t=Xn.get(this))[e].apply(t,arguments)}});var Ca=function(){return typeof nr.ResizeObserver!="undefined"?nr.ResizeObserver:Zn}(),eo=Ca;var to=new x,Ra=$(()=>k(new eo(e=>{for(let t of e)to.next(t)}))).pipe(g(e=>L(ze,k(e)).pipe(R(()=>e.disconnect()))),J(1));function he(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ye(e){return Ra.pipe(S(t=>t.observe(e)),g(t=>to.pipe(A(({target:r})=>r===e),R(()=>t.unobserve(e)),l(()=>he(e)))),V(he(e)))}function bt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function ar(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var ro=new x,ka=$(()=>k(new IntersectionObserver(e=>{for(let t of e)ro.next(t)},{threshold:0}))).pipe(g(e=>L(ze,k(e)).pipe(R(()=>e.disconnect()))),J(1));function sr(e){return ka.pipe(S(t=>t.observe(e)),g(t=>ro.pipe(A(({target:r})=>r===e),R(()=>t.unobserve(e)),l(({isIntersecting:r})=>r))))}function no(e,t=16){return dt(e).pipe(l(({y:r})=>{let n=he(e),o=bt(e);return r>=o.height-n.height-t}),B())}var cr={drawer:z("[data-md-toggle=drawer]"),search:z("[data-md-toggle=search]")};function oo(e){return cr[e].checked}function Ke(e,t){cr[e].checked!==t&&cr[e].click()}function Ue(e){let t=cr[e];return b(t,"change").pipe(l(()=>t.checked),V(t.checked))}function Ha(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Pa(){return L(b(window,"compositionstart").pipe(l(()=>!0)),b(window,"compositionend").pipe(l(()=>!1))).pipe(V(!1))}function io(){let e=b(window,"keydown").pipe(A(t=>!(t.metaKey||t.ctrlKey)),l(t=>({mode:oo("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),A(({mode:t,type:r})=>{if(t==="global"){let n=_e();if(typeof n!="undefined")return!Ha(n,r)}return!0}),pe());return Pa().pipe(g(t=>t?_:e))}function le(){return new URL(location.href)}function ot(e){location.href=e.href}function ao(){return new x}function so(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)so(e,r)}function M(e,t,...r){let n=document.createElement(e);if(t)for(let o of Object.keys(t))typeof t[o]!="undefined"&&(typeof t[o]!="boolean"?n.setAttribute(o,t[o]):n.setAttribute(o,""));for(let o of r)so(n,o);return n}function fr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function co(){return location.hash.substring(1)}function Vr(e){let t=M("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function $a(e){return L(b(window,"hashchange"),e).pipe(l(co),V(co()),A(t=>t.length>0),J(1))}function fo(e){return $a(e).pipe(l(t=>ce(`[id="${t}"]`)),A(t=>typeof t!="undefined"))}function zr(e){let t=matchMedia(e);return er(r=>t.addListener(()=>r(t.matches))).pipe(V(t.matches))}function uo(){let e=matchMedia("print");return L(b(window,"beforeprint").pipe(l(()=>!0)),b(window,"afterprint").pipe(l(()=>!1))).pipe(V(e.matches))}function Nr(e,t){return e.pipe(g(r=>r?t():_))}function ur(e,t={credentials:"same-origin"}){return ue(fetch(`${e}`,t)).pipe(fe(()=>_),g(r=>r.status!==200?Tt(()=>new Error(r.statusText)):k(r)))}function We(e,t){return ur(e,t).pipe(g(r=>r.json()),J(1))}function po(e,t){let r=new DOMParser;return ur(e,t).pipe(g(n=>n.text()),l(n=>r.parseFromString(n,"text/xml")),J(1))}function pr(e){let t=M("script",{src:e});return $(()=>(document.head.appendChild(t),L(b(t,"load"),b(t,"error").pipe(g(()=>Tt(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(l(()=>{}),R(()=>document.head.removeChild(t)),ge(1))))}function lo(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function mo(){return L(b(window,"scroll",{passive:!0}),b(window,"resize",{passive:!0})).pipe(l(lo),V(lo()))}function ho(){return{width:innerWidth,height:innerHeight}}function bo(){return b(window,"resize",{passive:!0}).pipe(l(ho),V(ho()))}function vo(){return Q([mo(),bo()]).pipe(l(([e,t])=>({offset:e,size:t})),J(1))}function lr(e,{viewport$:t,header$:r}){let n=t.pipe(Z("size")),o=Q([n,r]).pipe(l(()=>Xe(e)));return Q([r,t,o]).pipe(l(([{height:i},{offset:s,size:a},{x:c,y:f}])=>({offset:{x:s.x-c,y:s.y-f+i},size:a})))}(()=>{function e(n,o){parent.postMessage(n,o||"*")}function t(...n){return n.reduce((o,i)=>o.then(()=>new Promise(s=>{let a=document.createElement("script");a.src=i,a.onload=s,document.body.appendChild(a)})),Promise.resolve())}var r=class extends EventTarget{constructor(n){super(),this.url=n,this.m=i=>{i.source===this.w&&(this.dispatchEvent(new MessageEvent("message",{data:i.data})),this.onmessage&&this.onmessage(i))},this.e=(i,s,a,c,f)=>{if(s===`${this.url}`){let u=new ErrorEvent("error",{message:i,filename:s,lineno:a,colno:c,error:f});this.dispatchEvent(u),this.onerror&&this.onerror(u)}};let o=document.createElement("iframe");o.hidden=!0,document.body.appendChild(this.iframe=o),this.w.document.open(),this.w.document.write(` - + + @@ -140,6 +140,39 @@ + + +
diff --git a/site/billing-settings/index.html b/site/billing-settings/index.html index 7b66063..819ac9c 100644 --- a/site/billing-settings/index.html +++ b/site/billing-settings/index.html @@ -47,8 +47,8 @@ - - + + @@ -140,6 +140,39 @@ + + +
diff --git a/site/contact/index.html b/site/contact/index.html index 7e8ebd4..8de1b43 100644 --- a/site/contact/index.html +++ b/site/contact/index.html @@ -47,8 +47,8 @@ - - + + @@ -140,6 +140,39 @@ + + +
diff --git a/site/cost/index.html b/site/cost/index.html index b83a50f..5e26900 100644 --- a/site/cost/index.html +++ b/site/cost/index.html @@ -47,8 +47,8 @@ - - + + @@ -140,6 +140,39 @@ + + +
diff --git a/site/demo/index.html b/site/demo/index.html index 6925573..d0f2612 100644 --- a/site/demo/index.html +++ b/site/demo/index.html @@ -47,8 +47,8 @@ - - + + @@ -140,6 +140,39 @@ + + +
diff --git a/site/email_configuration/index.html b/site/email_configuration/index.html index a48e601..2b28632 100644 --- a/site/email_configuration/index.html +++ b/site/email_configuration/index.html @@ -47,8 +47,8 @@ - - + + @@ -140,6 +140,39 @@ + + +
diff --git a/site/features/index.html b/site/features/index.html index 91ef493..66bb000 100644 --- a/site/features/index.html +++ b/site/features/index.html @@ -47,8 +47,8 @@ - - + + @@ -140,6 +140,39 @@ + + +
diff --git a/site/index.html b/site/index.html index 6a36720..6a61e80 100644 --- a/site/index.html +++ b/site/index.html @@ -47,8 +47,8 @@ - - + + @@ -150,6 +150,39 @@ + + +
diff --git a/site/installation/index.html b/site/installation/index.html index 1723c30..f3345fb 100644 --- a/site/installation/index.html +++ b/site/installation/index.html @@ -47,8 +47,8 @@ - - + + @@ -140,6 +140,39 @@ + + +
diff --git a/site/introduction/index.html b/site/introduction/index.html index fc531f1..f16ff23 100644 --- a/site/introduction/index.html +++ b/site/introduction/index.html @@ -47,8 +47,8 @@ - - + + @@ -140,6 +140,39 @@ + + +
diff --git a/site/invoice/index.html b/site/invoice/index.html index 48bbc1e..ac569b4 100644 --- a/site/invoice/index.html +++ b/site/invoice/index.html @@ -47,8 +47,8 @@ - - + + @@ -140,6 +140,39 @@ + + +
diff --git a/site/notification/index.html b/site/notification/index.html index 564b82b..d1fc55e 100644 --- a/site/notification/index.html +++ b/site/notification/index.html @@ -47,8 +47,8 @@ - - + + @@ -140,6 +140,39 @@ + + +
diff --git a/site/pre-installation/index.html b/site/pre-installation/index.html index 9b6c231..e0f7c15 100644 --- a/site/pre-installation/index.html +++ b/site/pre-installation/index.html @@ -47,8 +47,8 @@ - - + + @@ -140,6 +140,39 @@ + + +
diff --git a/site/prerequisites/index.html b/site/prerequisites/index.html index e72840c..e385fe5 100644 --- a/site/prerequisites/index.html +++ b/site/prerequisites/index.html @@ -47,8 +47,8 @@ - - + + @@ -140,6 +140,39 @@ + + +
diff --git a/site/preusages/index.html b/site/preusages/index.html index 47c13c3..9c493dc 100644 --- a/site/preusages/index.html +++ b/site/preusages/index.html @@ -47,8 +47,8 @@ - - + + @@ -140,6 +140,39 @@ + + +
diff --git a/site/price/index.html b/site/price/index.html index ed3147f..15debd1 100644 --- a/site/price/index.html +++ b/site/price/index.html @@ -47,8 +47,8 @@ - - + + @@ -140,6 +140,39 @@ + + +
diff --git a/site/search/search_index.json b/site/search/search_index.json index 815b923..afa112d 100644 --- a/site/search/search_index.json +++ b/site/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["trimmer","stopWordFilter"]},"docs":[{"location":"architecture/","title":"Architecture","text":""},{"location":"architecture/#yuyu-architecture","title":"Yuyu Architecture","text":""},{"location":"architecture/#yuyu-components","title":"Yuyu Components","text":"

Yuyu have two components for running bellow :

"},{"location":"architecture/#1-yuyu-server","title":"1. Yuyu Server","text":"

Yuyu server provide ability to manage openstack billing by listening to every openstack event. Yuyu server is a required component to use Yuyu Dashboard. There are 3 main component in Yuyu server: API, Cron, Event Monitor. More detail about Yuyu server at https://github.com/btechpt/yuyu

  • Yuyu API : Main component to communicate with Yuyu Dashboard.

  • Yuyu Cron : Provide invoice calculation and rolling capabilities that needed to run every month.

  • Yuyu Event Monitor : Monitor event from openstack to calculate billing spent.

"},{"location":"architecture/#2-yuyu-dashboard","title":"2. Yuyu Dashboard","text":"

Yuyu dashboard is a panel at openstack dashboard that is used to manage your openstack bills. More detail about Yuyu server at https://github.com/btechpt/yuyu_dashboard

"},{"location":"billing-overview/","title":"Billing overview","text":"

The billing overview page is displayed in graphical form for easy viewing of total resources, active resources, and prices charged. This page can be seeing in Admin > Billing > Billing Overview.

"},{"location":"billing-settings/","title":"Billing Invoices Settings","text":"

For company profile you can set on admin settings menu like bellow :

"},{"location":"contact/","title":"Contact","text":""},{"location":"contact/#we-like-to-create-things-with-fun-open-minded-people-feel-free-to-ask","title":"We like to create things with fun, open-minded people. Feel free to ask!","text":"

Contact : yuyubilling@gmail.com

"},{"location":"cost/","title":"Usages cost","text":"

The usage cost page will display your usage details.

"},{"location":"demo/","title":"Demo","text":"

Our resources is free, you can use for see how it work Yuyu Billing on openstack, please follow guide bellow :

"},{"location":"demo/#demo-access","title":"Demo access","text":"
  • https://demo.yuyu-billing.dev
"},{"location":"demo/#lab-credentials","title":"Lab Credentials","text":"
username : demo\npassword : nm*iW0vY505#\n
"},{"location":"email_configuration/","title":"Email activating","text":"

Besides from notification center, we can receive billing invoice using email, for configuration

  • Update local_settings.py configuration file
cd /var/yuyu/\nnano yuyu/local_settings.py\n

  • Running dataabase migration
python manage.py migrate\n
  • After we configure email, now we received information from email

"},{"location":"features/","title":"Features","text":""},{"location":"features/#admin-dashboard","title":"Admin Dashboard","text":""},{"location":"features/#1-price-configuration","title":"1. Price Configuration","text":"

You can set the price on your openstack feature on this page.

"},{"location":"features/#2-project-overview","title":"2. Project Overview","text":"

This page will display a summary of the usage of all projects on your openstack.

"},{"location":"features/#3-projects-invoice","title":"3. Projects Invoice","text":"

This page will show the total usage of openstack in each project every month.

"},{"location":"features/#4-billing-settings","title":"4. Billing settings","text":"

Here for disable or enable billing setting

"},{"location":"features/#project-dashboard","title":"Project Dashboard","text":""},{"location":"features/#1-overview","title":"1. Overview","text":"

Summary of the usage in a project.

"},{"location":"features/#2-invoice","title":"2. Invoice","text":"

Your total openstack usage price

"},{"location":"features/#3-usage-cost","title":"3. Usage Cost","text":"

Details of your openstack usage

"},{"location":"installation/","title":"Installation","text":""},{"location":"installation/#1-yuyu-api-event-monitor","title":"1. Yuyu API & Event Monitor","text":"
  1. Clone the latest source code and put it on any directory you want. Here i assume you put it on /var

cd /var\ngit clone https://github.com/btechpt/yuyu.git\ncd yuyu\n
2. Create virtualenv (Need activated)

virtualenv env --python=python3.8\nsource env/bin/activate\npip install -r requirements.txt\n
3. Update local_settings.py configuration file

cp yuyu/local_settings.py.sample yuyu/local_settings.py\nvi yuyu/local_settings.py\n

Bellow for configuration :

YUYU_NOTIFICATION_URL = \"rabbit://openstack:password@127.0.0.1:5672//\"\nYUYU_NOTIFICATION_TOPICS = [\"notifications\"]\n

You can get YUYU_NOTIFICATION_URL from neutron.conf, bellow if using kolla-ansible deployment.

cat /etc/kolla/neutron-server/neutron.conf | grep transport_url\n
4. Run database migration

python manage.py migrate\n
5. Yuyu API installation
./bin/setup_api.sh\nsystemctl enable yuyu_api\nsystemctl start yuyu_api\nsystemctl status yuyu_api\n
6. Yuyu Event Monitor installation

./bin/setup_event_monitor.sh\nsystemctl enable yuyu_event_monitor\nsystemctl start yuyu_event_monitor\nsystemctl status yuyu_event_monitor\n
7. Crontab installation

crontab -e\n

Add on the end file bellow :

1 0 1 * * /var/yuyu/bin/process_invoice.sh\n
8. Disable virtualenv

Last step for Yuyu API is need disabled virtualenv.

deactivate\n
"},{"location":"installation/#2-yuyu-dashboard","title":"2. Yuyu Dashboard","text":"
  1. Clone Repository

cd /var\ngit clone https://github.com/btechpt/yuyu_dashboard.git\ncd yuyu_dashboard\n
2. Setup Yuyu dashboard

./setup_yuyu.sh\n\n...\nEnter horizon location and press ENTER.\nexample: /var/www/html/horizon\n...\n
3. Install Yuyu Dashboard Depencencies

pip3 install -r requirements.txt\n
4. Add config settings on horizon local_settings.py

vi /var/www/html/horizon/openstack_dashboard/local/local_settings.py\n
YUYU_URL=\"http://yuyu_server_url:8182\"\nCURRENCIES = ('IDR',)\nDEFAULT_CURRENCY = \"IDR\"\n

For YUYU_URL you can use

YUYU_URL=\"http://127.0.0.1:8182\"\n
5. Restart Horizon
systemctl restart apache2\n
6. Restart memcached (If dashboard login view not proper)
systemctl restart memcached\n

"},{"location":"installation/#verify-installation","title":"Verify Installation","text":"

Access Dashboard, make sure Billing tab available in the navigation pane dashboard, next step need enabled billing & create pricing.

"},{"location":"introduction/","title":"Introduction","text":""},{"location":"introduction/#what-is-yuyu","title":"What is Yuyu ?","text":"

Yuyu is a plugin in openstack that makes it easy for you to manage your openstack bills.

"},{"location":"introduction/#what-does-yuyu-count","title":"What does yuyu count?","text":"

Yuyu can set a price for the following OpenStack feature bellow :

"},{"location":"introduction/#1-pricing","title":"1. Pricing","text":"

Yuyu can set a price for the following OpenStack feature.

"},{"location":"introduction/#2-instance-flavor","title":"2. Instance Flavor","text":"

You can set the price for each Flavor that you have. Each instance that uses a flavor will be counted for Billing. You still be charged for instance even if the instance is stopped unless you delete it.

"},{"location":"introduction/#3-volume","title":"3. Volume","text":"

You can set the price for each volume type per 1 GB. You will be charged for every allocation. The the space allocated will be rounded up before calculating the price. For example you have a volume of 2.3 GB, that volume will be counted as 3 GB.

"},{"location":"introduction/#4-floating-ip","title":"4. Floating IP","text":"

You can set the price for each Floating IP that you allocate.

"},{"location":"introduction/#5-router","title":"5. Router","text":"

You can set the price for each Floating IP you allocate that has an external gateway set. Only router that has an external gateway that will be counted, router without external gateway will not be Counted

"},{"location":"introduction/#6-snapshot","title":"6. Snapshot","text":"

You can set the price for each snapshot you take per 1 GB. Same with volume, the space allocated will be rounded up before calculating the price.

"},{"location":"introduction/#7-image","title":"7. Image","text":"

You can set the price for each image you create per 1 GB. Same with volume and Snapshot, the space allocated will be rounded up before calculating the price.

"},{"location":"invoice/","title":"Download invoices summary","text":"

For usages summary document pricing currently in Alpha version you can download by PDF document with step bellow :

  • Firstly go to Invoices menu, you can use standard user or admin. And choose for months.

  • And then download your document

"},{"location":"notification/","title":"Notification Center","text":""},{"location":"pre-installation/","title":"Pre-Installation","text":""},{"location":"pre-installation/#virtualenv","title":"Virtualenv","text":"

Make sure you installed virtualenv before installing Yuyu

pip3 install virtualenv\napt install python3.8\n
"},{"location":"pre-installation/#openstack-service-notification","title":"Openstack Service Notification","text":"

You need to enable notification for this openstack service if ceilometer and gnochi service not activated:

  • Nova (nova.conf)
  • Cinder (cinder.conf)
  • Neutron (neutron.conf)
  • Keystone (keystone.conf)
"},{"location":"pre-installation/#1-nova","title":"1. Nova","text":"

Open nova.conf configuration on your controller environment

sudo nano nova.conf\n

Add configuration below oslo_messaging_notifications

driver = messagingv2 \ntopics = notifications\n

And add configuration below on notifications

notify_on_state_change = vm_and_task_state\nnotification_format = unversioned\n

"},{"location":"pre-installation/#2-cinder","title":"2. Cinder","text":"

Open cinder.conf configuration on your controller environment

sudo nano cinder.conf\n

Add configuration below on oslo_messaging_notifications

driver = messagingv2 \ntopics = notifications\n

"},{"location":"pre-installation/#3-neutron","title":"3. Neutron","text":"

Open neutron.conf configuration on your controller environment

sudo nano neutron.conf\n

Add configuration below on oslo_messaging_notifications

driver = messagingv2 \ntopics = notifications\n

"},{"location":"pre-installation/#4-keystone","title":"4. Keystone","text":"

Open keystone.conf configuration on your controller environment

sudo nano keystone.conf\n

Add configuration below on oslo_messaging_notifications

driver = messagingv2 \ntopics = notifications\n

"},{"location":"prerequisites/","title":"Prerequisites","text":""},{"location":"prerequisites/#system-requirement","title":"System Requirement","text":"

Before installing Yuyu, let's assume we already have installed apps bellow :

  • Openstack
  • or Openstack with enabling ceilometer and gnochi service
  • Virtualenv
  • Linux environment with Systemd
"},{"location":"prerequisites/#openstack-deployment-support","title":"OpenStack deployment support","text":"

Until alpha version for openstack deployment support, we have tested on :

  • Openstack using Kolla-Ansible
  • Openstack using Devstack
  • Openstack using Manual deployment
"},{"location":"prerequisites/#openstack-version-support","title":"OpenStack version support","text":"

Currently we have tested several openstack version to support yuyu :

  • Ussuri => Working
  • Xena => Working
  • Yoga => Working
"},{"location":"prerequisites/#openstack-installation","title":"OpenStack Installation","text":"

For openstack you can follow our documentation, deploy openstack using koll-ansible bellow :

Openstack Install Guide

"},{"location":"preusages/","title":"Pre-Usages","text":"

Before yuyu calculates your openstack usage, there are a few things to do.

  1. Complete price configuration items. If the price configuration is not complete then the system will show a warning and billing cannot be activated. For it we can follow this guide.

  2. Enable billing. If billing is disabled, yuyu never calculate openstack usage. Billing can be enabled if the price configuration is completed. Can set with Tab Admin -> Billing -> Billing Setting & Click Enable

"},{"location":"price/","title":"How to create pricing","text":"

Pricing feature for openstack you can manage bellow detail :

  • Flavor
  • Volume
  • Snapshot
  • Floating IP
  • Router
  • Images
"},{"location":"price/#create-price","title":"Create price","text":"
  • Firstly you need access to admin user, then to billing menu and click to Price Configuration and you can choose your feature for example Flavor pricing.
  • Then create your custom pricing for hourly & monthly:
  • And you can see, success to create flavor pricing
"}]} \ No newline at end of file +{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"","title":"Home"},{"location":"architecture/","text":"Yuyu Architecture Yuyu Components Yuyu have two components for running bellow : 1. Yuyu Server Yuyu server provide ability to manage openstack billing by listening to every openstack event. Yuyu server is a required component to use Yuyu Dashboard. There are 3 main component in Yuyu server: API, Cron, Event Monitor. More detail about Yuyu server at https://github.com/btechpt/yuyu Yuyu API : Main component to communicate with Yuyu Dashboard. Yuyu Cron : Provide invoice calculation and rolling capabilities that needed to run every month. Yuyu Event Monitor : Monitor event from openstack to calculate billing spent. 2. Yuyu Dashboard Yuyu dashboard is a panel at openstack dashboard that is used to manage your openstack bills. More detail about Yuyu server at https://github.com/btechpt/yuyu_dashboard","title":"Architecture"},{"location":"architecture/#yuyu-architecture","text":"","title":"Yuyu Architecture"},{"location":"architecture/#yuyu-components","text":"Yuyu have two components for running bellow :","title":"Yuyu Components"},{"location":"architecture/#1-yuyu-server","text":"Yuyu server provide ability to manage openstack billing by listening to every openstack event. Yuyu server is a required component to use Yuyu Dashboard. There are 3 main component in Yuyu server: API, Cron, Event Monitor. More detail about Yuyu server at https://github.com/btechpt/yuyu Yuyu API : Main component to communicate with Yuyu Dashboard. Yuyu Cron : Provide invoice calculation and rolling capabilities that needed to run every month. Yuyu Event Monitor : Monitor event from openstack to calculate billing spent.","title":"1. Yuyu Server"},{"location":"architecture/#2-yuyu-dashboard","text":"Yuyu dashboard is a panel at openstack dashboard that is used to manage your openstack bills. More detail about Yuyu server at https://github.com/btechpt/yuyu_dashboard","title":"2. Yuyu Dashboard"},{"location":"billing-overview/","text":"Billing overview The billing overview page is displayed in graphical form for easy viewing of total resources, active resources, and prices charged. This page can be seeing in Admin > Billing > Billing Overview .","title":"Billing overview"},{"location":"billing-overview/#billing-overview","text":"The billing overview page is displayed in graphical form for easy viewing of total resources, active resources, and prices charged. This page can be seeing in Admin > Billing > Billing Overview .","title":"Billing overview"},{"location":"billing-settings/","text":"Billing Invoices Settings For company profile you can set on admin settings menu like bellow :","title":"Company Profile"},{"location":"billing-settings/#billing-invoices-settings","text":"For company profile you can set on admin settings menu like bellow :","title":"Billing Invoices Settings"},{"location":"contact/","text":"Contact We like to create things with fun, open-minded people. Feel free to ask! Contact : yuyubilling@gmail.com","title":"Contact"},{"location":"contact/#contact","text":"","title":"Contact"},{"location":"contact/#we-like-to-create-things-with-fun-open-minded-people-feel-free-to-ask","text":"Contact : yuyubilling@gmail.com","title":"We like to create things with fun, open-minded people. Feel free to ask!"},{"location":"cost/","text":"Usages cost The usage cost page will display your usage details.","title":"Usages cost"},{"location":"cost/#usages-cost","text":"The usage cost page will display your usage details.","title":"Usages cost"},{"location":"demo/","text":"Demo Our resources is free , you can use for see how it work Yuyu Billing on openstack , please follow guide bellow : Demo access https://demo.yuyu-billing.dev Lab Credentials username : demo password : nm*iW0vY505#","title":"Demo"},{"location":"demo/#demo","text":"Our resources is free , you can use for see how it work Yuyu Billing on openstack , please follow guide bellow :","title":"Demo"},{"location":"demo/#demo-access","text":"https://demo.yuyu-billing.dev","title":"Demo access"},{"location":"demo/#lab-credentials","text":"username : demo password : nm*iW0vY505#","title":"Lab Credentials"},{"location":"email_configuration/","text":"Email activating Besides from notification center, we can receive billing invoice using email, for configuration Update local_settings.py configuration file cd /var/yuyu/ nano yuyu/local_settings.py Running dataabase migration python manage.py migrate After we configure email, now we received information from email","title":"Email configuration"},{"location":"email_configuration/#email-activating","text":"Besides from notification center, we can receive billing invoice using email, for configuration Update local_settings.py configuration file cd /var/yuyu/ nano yuyu/local_settings.py Running dataabase migration python manage.py migrate After we configure email, now we received information from email","title":"Email activating"},{"location":"features/","text":"Admin Dashboard 1. Price Configuration You can set the price on your openstack feature on this page. 2. Project Overview This page will display a summary of the usage of all projects on your openstack. 3. Projects Invoice This page will show the total usage of openstack in each project every month. 4. Billing settings Here for disable or enable billing setting Project Dashboard 1. Overview Summary of the usage in a project. 2. Invoice Your total openstack usage price 3. Usage Cost Details of your openstack usage","title":"Features"},{"location":"features/#admin-dashboard","text":"","title":"Admin Dashboard"},{"location":"features/#1-price-configuration","text":"You can set the price on your openstack feature on this page.","title":"1. Price Configuration"},{"location":"features/#2-project-overview","text":"This page will display a summary of the usage of all projects on your openstack.","title":"2. Project Overview"},{"location":"features/#3-projects-invoice","text":"This page will show the total usage of openstack in each project every month.","title":"3. Projects Invoice"},{"location":"features/#4-billing-settings","text":"Here for disable or enable billing setting","title":"4. Billing settings"},{"location":"features/#project-dashboard","text":"","title":"Project Dashboard"},{"location":"features/#1-overview","text":"Summary of the usage in a project.","title":"1. Overview"},{"location":"features/#2-invoice","text":"Your total openstack usage price","title":"2. Invoice"},{"location":"features/#3-usage-cost","text":"Details of your openstack usage","title":"3. Usage Cost"},{"location":"installation/","text":"Installation 1. Yuyu API & Event Monitor Clone the latest source code and put it on any directory you want. Here i assume you put it on /var cd /var git clone https://github.com/btechpt/yuyu.git cd yuyu 2. Create virtualenv ( Need activated ) virtualenv env --python=python3.8 source env/bin/activate pip install -r requirements.txt 3. Update local_settings.py configuration file cp yuyu/local_settings.py.sample yuyu/local_settings.py vi yuyu/local_settings.py Bellow for configuration : YUYU_NOTIFICATION_URL = \"rabbit://openstack:password@127.0.0.1:5672//\" YUYU_NOTIFICATION_TOPICS = [\"notifications\"] You can get YUYU_NOTIFICATION_URL from neutron.conf, bellow if using kolla-ansible deployment. cat /etc/kolla/neutron-server/neutron.conf | grep transport_url 4. Run database migration python manage.py migrate 5. Yuyu API installation ./bin/setup_api.sh systemctl enable yuyu_api systemctl start yuyu_api systemctl status yuyu_api 6. Yuyu Event Monitor installation ./bin/setup_event_monitor.sh systemctl enable yuyu_event_monitor systemctl start yuyu_event_monitor systemctl status yuyu_event_monitor 7. Crontab installation crontab -e Add on the end file bellow : 1 0 1 * * /var/yuyu/bin/process_invoice.sh 8. Disable virtualenv Last step for Yuyu API is need disabled virtualenv. deactivate 2. Yuyu Dashboard Clone Repository cd /var git clone https://github.com/btechpt/yuyu_dashboard.git cd yuyu_dashboard 2. Setup Yuyu dashboard ./setup_yuyu.sh ... Enter horizon location and press ENTER. example: /var/www/html/horizon ... 3. Install Yuyu Dashboard Depencencies pip3 install -r requirements.txt 4. Add config settings on horizon local_settings.py vi /var/www/html/horizon/openstack_dashboard/local/local_settings.py YUYU_URL=\"http://yuyu_server_url:8182\" CURRENCIES = ('IDR',) DEFAULT_CURRENCY = \"IDR\" For YUYU_URL you can use YUYU_URL=\"http://127.0.0.1:8182\" 5. Restart Horizon systemctl restart apache2 6. Restart memcached (If dashboard login view not proper) systemctl restart memcached Verify Installation Access Dashboard, make sure Billing tab available in the navigation pane dashboard, next step need enabled billing & create pricing.","title":"Installation"},{"location":"installation/#installation","text":"","title":"Installation"},{"location":"installation/#1-yuyu-api-event-monitor","text":"Clone the latest source code and put it on any directory you want. Here i assume you put it on /var cd /var git clone https://github.com/btechpt/yuyu.git cd yuyu 2. Create virtualenv ( Need activated ) virtualenv env --python=python3.8 source env/bin/activate pip install -r requirements.txt 3. Update local_settings.py configuration file cp yuyu/local_settings.py.sample yuyu/local_settings.py vi yuyu/local_settings.py Bellow for configuration : YUYU_NOTIFICATION_URL = \"rabbit://openstack:password@127.0.0.1:5672//\" YUYU_NOTIFICATION_TOPICS = [\"notifications\"] You can get YUYU_NOTIFICATION_URL from neutron.conf, bellow if using kolla-ansible deployment. cat /etc/kolla/neutron-server/neutron.conf | grep transport_url 4. Run database migration python manage.py migrate 5. Yuyu API installation ./bin/setup_api.sh systemctl enable yuyu_api systemctl start yuyu_api systemctl status yuyu_api 6. Yuyu Event Monitor installation ./bin/setup_event_monitor.sh systemctl enable yuyu_event_monitor systemctl start yuyu_event_monitor systemctl status yuyu_event_monitor 7. Crontab installation crontab -e Add on the end file bellow : 1 0 1 * * /var/yuyu/bin/process_invoice.sh 8. Disable virtualenv Last step for Yuyu API is need disabled virtualenv. deactivate","title":"1. Yuyu API & Event Monitor"},{"location":"installation/#2-yuyu-dashboard","text":"Clone Repository cd /var git clone https://github.com/btechpt/yuyu_dashboard.git cd yuyu_dashboard 2. Setup Yuyu dashboard ./setup_yuyu.sh ... Enter horizon location and press ENTER. example: /var/www/html/horizon ... 3. Install Yuyu Dashboard Depencencies pip3 install -r requirements.txt 4. Add config settings on horizon local_settings.py vi /var/www/html/horizon/openstack_dashboard/local/local_settings.py YUYU_URL=\"http://yuyu_server_url:8182\" CURRENCIES = ('IDR',) DEFAULT_CURRENCY = \"IDR\" For YUYU_URL you can use YUYU_URL=\"http://127.0.0.1:8182\" 5. Restart Horizon systemctl restart apache2 6. Restart memcached (If dashboard login view not proper) systemctl restart memcached","title":"2. Yuyu Dashboard"},{"location":"installation/#verify-installation","text":"Access Dashboard, make sure Billing tab available in the navigation pane dashboard, next step need enabled billing & create pricing.","title":"Verify Installation"},{"location":"introduction/","text":"Introduction What is Yuyu ? Yuyu is a plugin in openstack that makes it easy for you to manage your openstack bills. What does yuyu count? Yuyu can set a price for the following OpenStack feature bellow : 1. Pricing Yuyu can set a price for the following OpenStack feature. 2. Instance Flavor You can set the price for each Flavor that you have. Each instance that uses a flavor will be counted for Billing. You still be charged for instance even if the instance is stopped unless you delete it. 3. Volume You can set the price for each volume type per 1 GB. You will be charged for every allocation. The the space allocated will be rounded up before calculating the price. For example you have a volume of 2.3 GB, that volume will be counted as 3 GB. 4. Floating IP You can set the price for each Floating IP that you allocate. 5. Router You can set the price for each Floating IP you allocate that has an external gateway set. Only router that has an external gateway that will be counted, router without external gateway will not be Counted 6. Snapshot You can set the price for each snapshot you take per 1 GB. Same with volume, the space allocated will be rounded up before calculating the price. 7. Image You can set the price for each image you create per 1 GB. Same with volume and Snapshot, the space allocated will be rounded up before calculating the price.","title":"Introduction"},{"location":"introduction/#introduction","text":"","title":"Introduction"},{"location":"introduction/#what-is-yuyu","text":"Yuyu is a plugin in openstack that makes it easy for you to manage your openstack bills.","title":"What is Yuyu ?"},{"location":"introduction/#what-does-yuyu-count","text":"Yuyu can set a price for the following OpenStack feature bellow :","title":"What does yuyu count?"},{"location":"introduction/#1-pricing","text":"Yuyu can set a price for the following OpenStack feature.","title":"1. Pricing"},{"location":"introduction/#2-instance-flavor","text":"You can set the price for each Flavor that you have. Each instance that uses a flavor will be counted for Billing. You still be charged for instance even if the instance is stopped unless you delete it.","title":"2. Instance Flavor"},{"location":"introduction/#3-volume","text":"You can set the price for each volume type per 1 GB. You will be charged for every allocation. The the space allocated will be rounded up before calculating the price. For example you have a volume of 2.3 GB, that volume will be counted as 3 GB.","title":"3. Volume"},{"location":"introduction/#4-floating-ip","text":"You can set the price for each Floating IP that you allocate.","title":"4. Floating IP"},{"location":"introduction/#5-router","text":"You can set the price for each Floating IP you allocate that has an external gateway set. Only router that has an external gateway that will be counted, router without external gateway will not be Counted","title":"5. Router"},{"location":"introduction/#6-snapshot","text":"You can set the price for each snapshot you take per 1 GB. Same with volume, the space allocated will be rounded up before calculating the price.","title":"6. Snapshot"},{"location":"introduction/#7-image","text":"You can set the price for each image you create per 1 GB. Same with volume and Snapshot, the space allocated will be rounded up before calculating the price.","title":"7. Image"},{"location":"invoice/","text":"Download invoices summary For usages summary document pricing currently in Alpha version you can download by PDF document with step bellow : Firstly go to Invoices menu, you can use standard user or admin. And choose for months. And then download your document","title":"Download invoice"},{"location":"invoice/#download-invoices-summary","text":"For usages summary document pricing currently in Alpha version you can download by PDF document with step bellow : Firstly go to Invoices menu, you can use standard user or admin. And choose for months. And then download your document","title":"Download invoices summary"},{"location":"notification/","text":"Notification Center","title":"Notification center"},{"location":"notification/#notification-center","text":"","title":"Notification Center"},{"location":"pre-installation/","text":"Pre-Installation Virtualenv Make sure you installed virtualenv before installing Yuyu pip3 install virtualenv apt install python3.8 Openstack Service Notification You need to enable notification for this openstack service if ceilometer and gnochi service not activated : Nova (nova.conf) Cinder (cinder.conf) Neutron (neutron.conf) Keystone (keystone.conf) 1. Nova Open nova.conf configuration on your controller environment sudo nano nova.conf Add configuration below oslo_messaging_notifications driver = messagingv2 topics = notifications And add configuration below on notifications notify_on_state_change = vm_and_task_state notification_format = unversioned 2. Cinder Open cinder.conf configuration on your controller environment sudo nano cinder.conf Add configuration below on oslo_messaging_notifications driver = messagingv2 topics = notifications 3. Neutron Open neutron.conf configuration on your controller environment sudo nano neutron.conf Add configuration below on oslo_messaging_notifications driver = messagingv2 topics = notifications 4. Keystone Open keystone.conf configuration on your controller environment sudo nano keystone.conf Add configuration below on oslo_messaging_notifications driver = messagingv2 topics = notifications","title":"Pre-Installation"},{"location":"pre-installation/#pre-installation","text":"","title":"Pre-Installation"},{"location":"pre-installation/#virtualenv","text":"Make sure you installed virtualenv before installing Yuyu pip3 install virtualenv apt install python3.8","title":"Virtualenv"},{"location":"pre-installation/#openstack-service-notification","text":"You need to enable notification for this openstack service if ceilometer and gnochi service not activated : Nova (nova.conf) Cinder (cinder.conf) Neutron (neutron.conf) Keystone (keystone.conf)","title":"Openstack Service Notification"},{"location":"pre-installation/#1-nova","text":"Open nova.conf configuration on your controller environment sudo nano nova.conf Add configuration below oslo_messaging_notifications driver = messagingv2 topics = notifications And add configuration below on notifications notify_on_state_change = vm_and_task_state notification_format = unversioned","title":"1. Nova"},{"location":"pre-installation/#2-cinder","text":"Open cinder.conf configuration on your controller environment sudo nano cinder.conf Add configuration below on oslo_messaging_notifications driver = messagingv2 topics = notifications","title":"2. Cinder"},{"location":"pre-installation/#3-neutron","text":"Open neutron.conf configuration on your controller environment sudo nano neutron.conf Add configuration below on oslo_messaging_notifications driver = messagingv2 topics = notifications","title":"3. Neutron"},{"location":"pre-installation/#4-keystone","text":"Open keystone.conf configuration on your controller environment sudo nano keystone.conf Add configuration below on oslo_messaging_notifications driver = messagingv2 topics = notifications","title":"4. Keystone"},{"location":"prerequisites/","text":"Prerequisites System Requirement Before installing Yuyu, let's assume we already have installed apps bellow : Openstack or Openstack with enabling ceilometer and gnochi service Virtualenv Linux environment with Systemd OpenStack deployment support Until alpha version for openstack deployment support, we have tested on : Openstack using Kolla-Ansible Openstack using Devstack Openstack using Manual deployment OpenStack version support Currently we have tested several openstack version to support yuyu : Ussuri => Working Xena => Working Yoga => Working OpenStack Installation For openstack you can follow our documentation, deploy openstack using koll-ansible bellow : Openstack Install Guide","title":"Pre-Requisites"},{"location":"prerequisites/#prerequisites","text":"","title":"Prerequisites"},{"location":"prerequisites/#system-requirement","text":"Before installing Yuyu, let's assume we already have installed apps bellow : Openstack or Openstack with enabling ceilometer and gnochi service Virtualenv Linux environment with Systemd","title":"System Requirement"},{"location":"prerequisites/#openstack-deployment-support","text":"Until alpha version for openstack deployment support, we have tested on : Openstack using Kolla-Ansible Openstack using Devstack Openstack using Manual deployment","title":"OpenStack deployment support"},{"location":"prerequisites/#openstack-version-support","text":"Currently we have tested several openstack version to support yuyu : Ussuri => Working Xena => Working Yoga => Working","title":"OpenStack version support"},{"location":"prerequisites/#openstack-installation","text":"For openstack you can follow our documentation, deploy openstack using koll-ansible bellow : Openstack Install Guide","title":"OpenStack Installation"},{"location":"preusages/","text":"Pre-Usages Before yuyu calculates your openstack usage, there are a few things to do. Complete price configuration items. If the price configuration is not complete then the system will show a warning and billing cannot be activated. For it we can follow this guide . Enable billing . If billing is disabled, yuyu never calculate openstack usage. Billing can be enabled if the price configuration is completed. Can set with Tab Admin -> Billing -> Billing Setting & Click Enable","title":"Pre-Usages"},{"location":"preusages/#pre-usages","text":"Before yuyu calculates your openstack usage, there are a few things to do. Complete price configuration items. If the price configuration is not complete then the system will show a warning and billing cannot be activated. For it we can follow this guide . Enable billing . If billing is disabled, yuyu never calculate openstack usage. Billing can be enabled if the price configuration is completed. Can set with Tab Admin -> Billing -> Billing Setting & Click Enable","title":"Pre-Usages"},{"location":"price/","text":"How to create pricing Pricing feature for openstack you can manage bellow detail : Flavor Volume Snapshot Floating IP Router Images Create price Firstly you need access to admin user, then to billing menu and click to Price Configuration and you can choose your feature for example Flavor pricing. Then create your custom pricing for hourly & monthly: And you can see, success to create flavor pricing","title":"Create price"},{"location":"price/#how-to-create-pricing","text":"Pricing feature for openstack you can manage bellow detail : Flavor Volume Snapshot Floating IP Router Images","title":"How to create pricing"},{"location":"price/#create-price","text":"Firstly you need access to admin user, then to billing menu and click to Price Configuration and you can choose your feature for example Flavor pricing. Then create your custom pricing for hourly & monthly: And you can see, success to create flavor pricing","title":"Create price"}]} \ No newline at end of file diff --git a/site/sitemap.xml b/site/sitemap.xml index 945f1dc..3ff64d5 100644 --- a/site/sitemap.xml +++ b/site/sitemap.xml @@ -2,87 +2,87 @@ None - 2023-04-11 + 2023-04-12 daily None - 2023-04-11 + 2023-04-12 daily None - 2023-04-11 + 2023-04-12 daily None - 2023-04-11 + 2023-04-12 daily None - 2023-04-11 + 2023-04-12 daily None - 2023-04-11 + 2023-04-12 daily None - 2023-04-11 + 2023-04-12 daily None - 2023-04-11 + 2023-04-12 daily None - 2023-04-11 + 2023-04-12 daily None - 2023-04-11 + 2023-04-12 daily None - 2023-04-11 + 2023-04-12 daily None - 2023-04-11 + 2023-04-12 daily None - 2023-04-11 + 2023-04-12 daily None - 2023-04-11 + 2023-04-12 daily None - 2023-04-11 + 2023-04-12 daily None - 2023-04-11 + 2023-04-12 daily None - 2023-04-11 + 2023-04-12 daily \ No newline at end of file diff --git a/site/sitemap.xml.gz b/site/sitemap.xml.gz index d9e7781..5512714 100644 Binary files a/site/sitemap.xml.gz and b/site/sitemap.xml.gz differ