From 15ba6744cced8b50bc7325f60476a2fdf212f631 Mon Sep 17 00:00:00 2001 From: Bob Mader Date: Mon, 22 Sep 2025 16:12:24 -0500 Subject: [PATCH 1/5] draft work in progress --- taxonomy/README.md | 69 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 taxonomy/README.md diff --git a/taxonomy/README.md b/taxonomy/README.md new file mode 100644 index 0000000..f7448bf --- /dev/null +++ b/taxonomy/README.md @@ -0,0 +1,69 @@ +# Taxonomy of DCM + +This taxonomy of DCM achieves three key goals. First, it defines the top-level domains that distinguish the functions and roles of the DCM architecture. Next, it defines a specific vocabulary with the intent of enabling precision and clarity by eliminating ambiguity. Finally, an "anti-vocabulary" defines a list of ambiguous phrases and "weasel words" to avoid and recommends more specific terms to use instead. + +## Top-level architectural domains + +The taxonomy defines the functional areas enabled by the DCM architectural as five top-level domains. Each domain maps a set of DCM services and resources defined by the architecture to the different roles and teams across an organization that experience them. + +The top-level domains are defined as follows: + +1. **Developer Experience** - This domain focuses on the unified interface that developers and application owners use to interact with DCM. It includes the self-service catalog, templates, and all user-facing documentation. This is where the DCM abstractions are consumed. Multi-tenancy is experienced at this level. +2. **Control Plane** - This is the central nervous system of DCM. It provides the unified API and maintains the DCM data model including the inventory of resources. It also enforces authentication and role-based access control. +3. **Orchestration & Automation** - This domain contains the code and workflows for provisioning and managing resources. It provides the engines that execute commands from the control plane to interact with the underlying Composable Infrastructure. +4. **Composable Infrastructure** - This domain represents the physical and virtual assets in the data center. It includes the compute, storage, and networking resources that are managed by the automation domain. +5. **Governance & FinOps** - This domain is a set of overarching requirements that ensure that DCM operations are secure, compliant, and cost-effective. It encompasses policy management, real-time metrics, and cost allocation. + +Everything in the DCM architecture exists under one of these domains. + +How these domains are connected can be easily understood using a layer cake analogy. + +![Layer cake analogy drawing described below](./images/layer_cake.png) + +Each layer of cake represents a domain that interacts only with the domains directly above and below it. For example, the architecture prohibits a direct connection from the Developer Experience domain to the Orchestration & Automation domain, Instead, Developer Experience must always use the Control Plane to request and manage resources available from the lower domains. + +The exception to this rule is the Governance & FinOps domain. It is the frosting of our cake and it touches all the layers. This aligns with the overarching functions of the Governance & FinOps domain requiring observability at every level of the architecture. + +## Vocabulary + +DCM is a complex technology architecture stretching from the depths of bare metal on data center floor up to the high-level abstractions required to achieve secure multi-tenancy in the service of cloud consuming application owners and developers. + +The vocabulary we use to define this architecture demands precision and clarity. By allowing a term to have a distinct, contextual definition within each architectural domain, we can eliminating ambiguity even when using the same words. + +For example, the "resource" a developer requests for their application is a logical entity, for example, a "Web App Service." However, the "resource" that the Infrastructure Operations team manages is a physical asset like a specific VM with a particular IP address. By providing distinct definitions for the same term in each domain, we confusion as we navigate through the architectural domains. + +When adding new terms to the vocabulary, take care to map the terms to the roles and functions relevant to each applicable domain. + +### Multi-tenant + +DCM multi-tenancy is experienced at the Developer Experience domain and enforced by the Control Plane. + +The Orchestration & Automation and Composable Infrastructure domains operate in "privileged mode” to implement the isolation and confinement required for multi-tenancy. + +The Governance & FinOps domain has access to the tenant-wide scope required to implement policy management, monitoring and billing. + +### User + +In the absence of further context, a "User" is the human consumer of cloud computing resources and services experiencing DCM from the Developer Experience domain. Of course, other humans "use" DCM within the other domains, so consider using Developer or Application Owner instead. + +To avoid confusion, avoid using "User" when referring to humans acting within the the other DCM domains. Consider more specific persona alternative terms such as Platform Engineer, Infrastructure Operations, Risk and Compliance Manager, etc. + +### Workload placement + +Workload placement policies are managed within the Governance & FinOps domain and enforced within the Control Plane domain. + +## Anti-vocabulary + +FIXME: explain what is anti-vocabulary. + +### Realize + +To realize can mean to bring something into existence, to make something intangible less so, to achieve a goal, or even just to understand as in "Ah, now I realize what's going on." Given all these meanings, avoid using this word. Consider more precise words like provision as in a VM, install as in a software package, fulfill as in a request, etc. + +### Tangible + +Nothing in the DCM architecture is intangible. Tangible and intangible are weasel words that sound important but don't add any clarity or meaning. Avoid using these words. + +### Widgets + +Widget are things, but what things exactly? Rather than saying widgets, find the precise word for the resource or service for the thing you are talking about. From 8c371655ad533f82075a212efd90fd9e67eb50a3 Mon Sep 17 00:00:00 2001 From: Bob Mader Date: Mon, 22 Sep 2025 16:12:56 -0500 Subject: [PATCH 2/5] mmm, delicious cake --- taxonomy/images/layer_cake.png | Bin 0 -> 33480 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 taxonomy/images/layer_cake.png diff --git a/taxonomy/images/layer_cake.png b/taxonomy/images/layer_cake.png new file mode 100644 index 0000000000000000000000000000000000000000..e036d4c1481afbe380fa1119ebc701f43c56b6db GIT binary patch literal 33480 zcmYhi2RPO58$W)GY}tELWQEMkj1Wrp%+5SkM)uw_$tEPSg~;Bk>||#bib7|*A1EtmA`oaF;BPe!7QBLYBL5G5 z;JPRqxFHZ!B&fe=pV{|i;6)nu`}*!$&erbF&7VC*Jb(WDww;rMo29wS)7#F^Y_k4H z(jpMdhzAO?+Fse)t^V4{&zt@P-fW3_fk@Cr%MY1}4`Q47l^I;m)};8*rYiTbcGIZ# zJA$c_KX-kp-imK**AxHzldYv~cBob+$XwX`!524X+1ZhB?wWh)TfsXR;)JhCl#wr} zO!02yMco@=TJcs>4!ZIExA(Kasb_VBqse}CzukUZ2JCD#T{EoE#SdY|30W4Cv*8PZ zUzm|-xU{mwn4S2_WAHy5lY1eG#F(YHaY6s|>60O1?(#AqbUKaKsOVbW#cnqd zp-JGyzv()}hvDI2x6AE+Thk6UXX;Ero)@S8+%9=k`E8zH%Bm6R*oJ9EB_?7cgoK3N zS8=AOd~5NZ*z{1-wM9ci+xEwlCDz(=KSakly1~hb8+n~U4z{DIsTuU?w<01cHrDd$ z^~(OJjMB4bHJuJBg`|^{lhoAI_cS$0U%q@v5HNyNkBE#cXlkNWDSXz)+nSn6dDvQ1 zke`o6NJxl7K%k(ag4fmE9bZX9O>HJ4!O!nvNMb!j&cr11+vbjgMF3NgbRu)qgX|}) zq<48(kmi-9?Iv_oRPW+p zi&f)~YU_?Zb6447prg->W;fNNOm&2oM~H(nMoCFoGwtr_N&5uj9(=&&edYSPb-~tD zmFcL{$2+zxk_F z3pMG*-EqJj#Z^^G{{B+W+}vjSNc<~JT4Rony$+6!y0veObaWuTOiXAzc@iHHft5T- zu2lzC|GvKdrmc<9W+YqI&rhz0Mre8>7;|SJm2E6v%zIhc*~o(cwaLB~Y_0r<;U#|QrK;_BEXS(Gq|bNdljFHyt+}8eM6$y;2Q%}% zGqByzvB?}~3Y%8-L&r=O91EXfIkxPG083>Lk2={2C2*tk)w$cDq&>K%<9lPqW$US0 z#WueI?jvk1&WCy#0{lB^uU|Xuin~ecYH4+&>=txz;9mdbl}aJRfz`Csg73qdf`VkC z&Wk-E*YJs%m=a&TB8PB4l#FM_v4mWC*NO8Og0Fc&?4Qlkr%xNa_lpdS90jAN-3hK= zANe%j=eG`~eWh|!1UVA~7O}FnX65AklvmPC3IRJ)@wKDl-iHq#mdEntA>cVQ*rM#1 zWl@I+_x$%ur+%I!ndkt{Oin>TV?2lx#YtjO%H%ehK}$jX}VEp}vXcV%};Aiqn> zP1|2PMx=8oJb3UxQ6@Gqv7fuDB_uPG_U+rZ?;Q^`OUUovzpvjO&^jAJNlk5=S}d@d znUV1cPtC(a7!JWNCN>cBinID@k8RPB#Z=W2bNAbbO+Cw@v&WV=vTC8VM0+?#5f2as z^~j9z(R3_4t$2p@`rlb9XX$hGRZA~Ng&g!J>YYm`17>TUq8uE0bmyI;jHsv{9Wk-l zfp<~n1DudCma#8E>Rr*dQdHniGL}^li(NzAG$?1mUP}9M5&o}4cyDYK|_&00;LNNLA1cgv2NcAF*1peO= zgc$LV~fHXh2^!&O zSX;BBV_-b^iqmxs{QV8fT3jSKN``K4Z_oM%dumEbeqmwwaLx^!uDfG2v@4YS79zqt zUZ{@@JDr+kDij;C;cUoK(02NM{``5SY4M$xZ|MDedch{w- zzrUco9Qi0ELs&=G$45MxR#ps+R47CbfWF%CWL+)1p6Z4@=8D%QLHsh|>BiGamw;Y( zi7y%OJ}h|OK0k@JnpQ+brc8Qgfm<+GiyqtYE@^gzUGM17Q1-s}tTq%6BL z?>NekhF#=EPhxTa=H7$nVPRoC*42%Gon!@KY3a=3ISege%BDkQz}zsy3?`xXjiO<{ zKaq;sXH!!qmvG2?GWQ5Y7p#lYq1SSKeyLJ%GpBD9Q)p#pDB;YHmWxZ(uJ!@`xBo7} z>jDOt<`Up2W7U02^O!s^TFsl( zSFfzxnCNA98Bn#G|0g3aFE1=pZ8R6z2nn56T#Q3OK>_J3#eG|)@Js#{;Dr!%pga~b zgdY{4`TT^$fMmD0x#a;ywZh|ApvD3+42+KUm+F+w2#d$o)Z76avlz}4b}v#Sww5zU z2$MGxKL&@++%>O^&@534P{zB-dnq!v^oyB3bIv#2WX2Z z(f;+9kO;PMlS|S6fbPC=;hUQ{dSUhSxXm3OmIaNxPotSCZKJ@oKD92RjbgSSp)287e0PUqb?r3P^PM+2IfoeLQ)r z6|#IsJD)_iK$|NG(5t>7EhS}E>T8-;HV-KilX}GkW|!q(8w&2n6R}Z=1W7#lAUq~kp-(XO#c#ayWbs41Vev;V3IMI*~+^tkU}AFDCI(@oZs z(f4Rupx7hC7l54r&-Q`wBCA`3`?ZRPP_DyeyX$YU} zMJ#q4RTkMb8hDu4-^FIz7C&5P`g2iaY776`KL~jo9Gswg%pJfd5`etavi40!vanfa zy>5@ksJdW4xEvo{1;v{3C{E7q6GtnIn5<@(R8}fN=H3w$ob6)>S(f4>^wxBh<>mRw3zfpnogEu8sc#R45X-YRe|`p-_>M%E)iMmx za7+-+j*TsE-y{iJfNkPZS#7WkpNK}S6RqxM1qyDx24rye@G!Ts>fs%Ea_Zyjx_yDp z6Znk!%yWVN*kEDo+H773LUj?5D7 z!QtVE58oOKl)a7C!0lb%9rQVDvALw=r%LQ7k(;(W7^JU}SA>lJc#JHhV7t!m}_S_J{iQ zwY3@JlNeoja1%Re+# z65vC$-xw`P|75&5?8orMt?OAcj(I|sF>ct>uft}|KD}|J_Z~bR;&J^g#ba})R-G@xjvjr)jYw*x#TGo<$m$&`nig_lwK)N5OG(QF4s*7K>$tQ^ zC&vYv-!?aUD!`XdZ^f*2>#$`vd+TZ^;++@OG&%3)n`L|xv5`~Dk z<`RdOfo9WJGvU>MlWDH&?l*x-j?YWfPKGgCqm~si zIYsa8KC0&SIHcSjmig6PwBfvF@!R{O7r**bTU#7a@k%z=-wd%k@x~%?{u1q-@d;aE zu(_G1{*_p4NQn4tTiOzBamVH>V={E&YDg7K*<38#>ZQ{dv!lIY#F_`oTH3IB!A|7UA=?N!AM+*0pYgU za7h>u$;7;uvBT4L)Zq}gQ8D`YwZd&WEQGsz!%i-ZV6<_G_8XupP?_}Ko1sBAlF-uH zA4=A@Et=${^U|63#WNKkrn;977&5Uu^vd6HuGAT(53Y4Ma!VL$TQx>{6*m`eq3 z$FC#mrX5^F3l4AnH7EeZkl%rUG9u24aj#!9YHMq!>l8BhUWr0PtUg}XQ9k#=h9omGuq1l$pvmy8ix99rx|;|8-=GG{iwf#bx`` zCrY4tkMncC?YTPqii(O__ES?wJ4J|^nUp!ZzxcB+ITYV>*OA4i@iqRa7ZZ4{Job%v z9dS9QbBRxjKnAc-P_^sFNps)--9;6PhKL@Oa$ZYurGn}{GLo!PXdV9!72)Lx0a0IR z#A&r|F6c8z#jWjJrPlZ2#sa`l2Z+oZTGab|D_osv`N6TfpA~8OgM@O)w~iMvJ%|2& zDVQ`hsvUEq*z^Jdj<3jRykOvZuEKZQYCA zeI@p0(BcW{5=peeOv)v`(B)H>>sOadLv1_uMu@lJW$z{Lpf{U*dcQ?`G7>(wj|ghm zoc&G4x+FmFU3*QHlJG?_2_*!R0IQy4_)S&HwJxU6ih#tvqHul2Ms(GX5M+~x9=nGT zt%##H8d!k9Zv27O~wwM=Yc=!EE77V#pl7ANHzbsWNwwo`MtF8g56Dnq88T zZ`Tj!NpFWLe@~31qN^77A(mB_{II!*A7~r`$lj+a<4-d#Q0-|{!2NgoJB@xflZ5Nv zE7Q1ytN?2N@4@+JuQ!{wLLD4~ZO;eg=ua+G{4Rg6-jF_{54bR4@emzJf{1&SdXC0- z5%?s^Bwyf6+PMn%#?5biG_#~aCYNL{MJ}lq7Z*LBaCbUlf+DfCeV;hB_W9`O*t8pl z(jrn|_wSHG|3jIUJts-lT*FYd@bR9Q&r)ZV+E=w=A%BkQO)KUPzw?s+Nk@Tyo?w z^aY#xNjVTqh0EOTOp=id|B*x@rg@B}!;q|2cl$-u?CV4suHJqo|0w()Y2^V#cIHB~ zS2e^`zivGUOJ`IE_2hj56y+7=l^tgPvn6I;QZtVOW)Yb{x@ZR`C5wLxd$KzV-p38U z9vC~|cl>J5fo&L*3Q8$=G<2?SI2Y{k;k(uqW?bfwOvr`wnWNln*~_%LmZ$z|El#Bh&-G2_>w6j-;pu`V-QBB2U zyB!d3+iQ@KcQ)Wsi{m@WK{>5 zI;Qy^nJkWJJ$hRJYfoQ~gl}|9Sc#_^3u&~mB7a0g1Xv^xRR=?-8x+3Byn8Qxn^C6* z7jmY)S7)wYNBzxCCHCP3w_^sGpnS->!mH0)x6U@7BZAJ3BFE=^C^~cswqEOhz*Og% ziq6i>#SswL+uf&Nk@O2E(;fb=<{!5{C+sn2PgSbyNa|V=cg%8tTHtJTA?W1pZlU+< zBP4kg#!kQzr$YueWLZb>1+SPcBbuFV*6fkTw*&bUB&TkF#T%Z77P_{B;|~akh*p-X zOnP&g{oQ<+6t^ubS63uBpT*|lbdjl#Wn@VEx3Zd4WZ0x@$|B# zW?&F~>~Ttpyz2Ud#nhKr|MO&i=Hpgh zIfi{z{k7$R9X*T9U}_~i8JCRG43{U$W7$0`Y|bkx6Hl81`f8pg?Ph(e_p{Lap3XJ8 zfGVNmUO(OFIlYLIxLJpr-c=om9A2*Gl2Baxd<#NJ#Tt3E7quQ8jVdY(jQgf5HdCD0Ub?l5pOMf84F5 zFLm>MI_{zg02+3{Kj$0PVY4st?ot>273We1QPIDz{{uB6b$<`$d+|SKQO4EuZ|u0L z7TcuVjoX9i7)1F+O2bWq`oDWK#Dz_2yM2bRbiHhG@|yWOa1+Epqxi(DeX^`78}Z6| zp|zo(D%&a-Q_4dKv;9P;wY5?gzjF;-(p=xy$&TAlG!lC@UMsB?^11x8uhq!BjGcci zw^}>uHud_R7!j!u_Wot{RqWYOg>S>J{d4wMGYzqc)OFw)OsX&{)i0Fn* z+3f{yjQ&9n!M+9_drWgxQ~<1J0Ki?^NKO(~9_!K_wl!i!E)90?Q7|>T6aO09*Wmp86BntG|pL?fU*cWveZ+Nw@e!#wPZ6U3lBq zjqq~6Kr?N@=POO$)iofJ7>HD*+mXuOZT`;T*If1O?)q!zlm;E-T*>pEhZ(%cn@x%s zeJZkL|6QDHtz&Zl)9)NPA9p7uBU8(mA!$dx>^}|)e7|7t%Leu7kM<@joqffr_PnZ( zbk6iMiNi0MMt%HEcO2$Pfq8P!! zFRl2%;m`tDD8HoN(m?Sx9_kc8Zl+q#Y@YXTyrpqsIZhyFkMw-~bmPMU?+@ot&LZ zsld?7$LO`@Y7DjLJIOxCS~csxkb2mEg9ihvAB_QKuJk=*+V%;bJH$N-#~i+Xe$=Qn zViGbjW*?k?>FVVhSFr4ulWtx^<_w+gW6u-wwx}zmkAlMQHr2(=UTOhyqiQ~CdnGT8 zwsW%@>AA14k57jCW9hS#|Cf4ww^F7Tnrf5m&b@x*I?+nK0#+#YH}W0-={@|Nlk?&) z<>pNfu=iX1SAKFT9JW{Wjeo4n;I;4noVI3|#pK!gSN-?C_u-T-jgdoGpuq!j_RIEkmxw}-pO&(e4JItJv4wgYX1ORZQ0O_rYb zV>`E;`DZ7En@yxr0nsFgtVm%tCMg|54(#p{R~k2d-+n3vi{Kug#;tVl70Gm5O)j>t zQC&F@Mqu}|7%rm)pHbSg@9mOz@Qq=x$#?Ai{ZTC5PCi=M9NA+-Fgl4MEH>=doF5FJ z6Uem0f7W^`^fSoCK^Y#9Ql#pXH9J84?n>jCZ=cJ;P4&3t6b4b(7Qed@rw_iW<&z1k z#}TM6FXj=A49My4ed(W2MKH;*FeccI&G~ptt&?ZE-$N-)bgLtivjrMCoyh(D+UL(} z3e?;5C7kniMkG(ftLop&S$eJ2 zIltdG#n^SB-py3HdhjeIV`Pi+HjZak49@e=>$j0X63(K(EQfjc*4uI&uP7}onFHs@ z`xNUYF26jpb&)mAt>#N&MiTln)T6~rQQGhY@AD7eAX_uUk^1I4zqb;KD@i|PVbLYo z`^7{4?^*ND9EsM)AL_@v83fpF*oxdMY5B8#vjJ27NUEap3(BQI{!J$hJp;R#fD-?e z##ke%wT6_01iA*#f3&oGfzi>fyG>dLBRSIap9d|jX0_e$a;8aOt&W^pIsrROtRUzk zX3p8RiU^F`YF_v=J-=UeO_9mA8tSZ==I&zobboJ^;;(vg`Vqd4-nr4`HIA^chdlmY zv*n=IcT5=bET}9c#S6ZYym+e<;t8G7$DQHO#9UwexdM^}5legfnEOYLi|3Zcp8i9;0k_r=r)lE$fx7u0?c4_Dih>Y}`3|jm5Y7f{64D?w*23!1@U9jeZZ9i%nmiEyhHq2HN zQAajng8MwA3Ij@=HN!`4GSueFWAOVm1UZU1OHA|*(GIe1j1W7eTz6okOHY_Yq!#tIS6;X=5vijo;7bZf ziY2f`;=BCPrg$BAX`rBZ+vekOL}bMHxGTnRpktq&X!L%Px4e^?P2+=W2OSoKQZF&0N6HJ*qPN&4^-hY@Ny|I=N`yQPOYJO~w8W{KyWlZuZ#t5n;=yR)G;iE1;6Vv!b4sqa^ zkv=Kg!lymD4S(lwjzZZPh6qW8uCGa%BJv}#u_iCXE<2g5+oqIomhSaC?U8`aZ+$0O z&|>3{^)s;fm!-hzlH8r2yg~0omw#^sD-p%lUSZ0049@$L!nB1UqvY;W`7epp%>2Yx z2kPzapXcatAXwT?3Xl{$Fcl(?!-a2m9G)Fv3;|V9@0{Q=Wl<srfSgEWTCM$_T(csSq!#U3zIBgx&Ss7lOcSM?{0nFuYk(>EtW5zQ#;L&6?65(dX z?-Ju}(#JE4MSMcN$&C`KGYdJMdp?%-TavKBH_pf+uDC#W1Tj%CV$D54k@)sCnydw& zdvvS^#Aew9Q#- zyj-|@c<6cfk{%04>Fxosg?mV;P?xyhMfmOk>GJp{j>PONIpb^eA*!v2r+?9=X4LjH zDaq*RLpXB3;?5kkeH@z|bfvvv>lsukWKrogO4Z@phW){Cc|2-rx&3DTV+0=)+A%SU z{TFcbOgYFh@YLYEJYx8{q(2C% zsU>SRdDIVmxZ>E$oB9k#{)d@ui}RZe<7l&i)2p2WIDY40yL)T`S=<8S)m|3ktRf~c zhQEeGR|}7?;btZ;J8-uj`JuJ=N$%bg6!<+url#xu<{puk&pw;`^mzIm5iJT4iPJvo z(yn7@kI41_)HgS&ml7tJi8rl%PEPUjC(+ju8LzHilgmjbNkuu7*|PTR9>`-r6$S?} z3M|k6y~D-K;~G*qh#w~Bdnz4Qov~W@4de+9NENTy8*=*CVARmKVNB&QV+>Si^06>V zt?DJ?2uQ$tqtjR|YrS0rOjIhSmcM_Z{W>*;fv~VFaM>J_wc(4^dy&_O!zjnXE*Z4v zN-8Xk+QCXqwL!&{*?j$it)ruoT$iEWzsczrgIUWve2Sij(l&gFqVOqVlh<+x!_3@1 zLA5^Bq-t;7gSEm23uNkG*4T{KHMl3FtgIjT{ynko5F)SQH|hCB@8dGznGbf@cz6lP zfJUT3RNaFU7#(8Kw2=Z&0SSc6)13w;aJLKngHh5K&_V)gGTs8^6 zy`&J#D8GJrd5Q4J)AV5DiIa4xhv>V;qOr!P)SML)+6= z8P?uT4NJUG7OB~=dFD+fCm)*h;{Em6Szi+34u%y^4=@}#sql1!u!vU6tNSj(CMt!$ z`o;_T$0jG^L2@9cXzjk_VPhjhxSSr~9-nOm$k^F^LLkE5FwhPYb8(N#+t&3CSr~TkMAYNVhiXh&DR;hf)+2HY{nP<}Qyz`PwBD!Roijf6uhsCB(Zgfyk@g!$ZL1Dn1=W z#mCFp+VZQYNXvq9s#{?g-PgxmTwEO7-Y#?FWxRWUwLA=Q5Yd@y>HouKTvLp)Y7s5AS1l8@(+!SdcJL>VTCLN&8yT) ztc(n2c`hje1aa(rub+ihRyI3X)un7aK!Mo2ynXI5r!PN|Yp)$oM8)Wd%kYe`p`q1* zq4oNFak*qHgG9YWe?rBJPru&#KBv5GT+Ba{naw3$lqnVyJ2?Bh8_fCr`*$`TBEM}}TiMe7Ar-$Mwv`9AF>z@l0r%yY5jSIo&;XSZ%k<2P%tnSq9987+1yR3yl!HLP zg*SQjGRtOCw0rFHK?}{bkByC;#tsC?z`eI_-;UJwNw4TITOAr&GL`&Y|F-q`PqXjl z&&F`)cAYox-qAU?{tK3uS)u_#OF)!QjLwHvg%R&ah|0#;K5Gc$PFce5f4K)feS(`5 z+^)aA;)>*BBs0X`yqWvnqDa#N^=!5h>-k4tIe2(5121a{IMk=^RZJleq-4`~jav|A z?(XDLQXgIRi%45rKk^F+ecu%pqXYWeg-I*pBlIZK8XbsBHxPIW}ShsJqm3&)csn|HlnpGgQ)M(WEP0$0|8^KkhwQR@H{o zO-V_upUf)|5EW&D2@lp}YDtBBpV04HZD)TNoffxyhO<=sjuxIo28c{E%dUx`2cNm$ zdkF=N+S1L%1;?h8UyDDU{_JR{_qCM7H~>y#%MB%oF8b)+MKG%?s@|YLUQewH_AiWKHD`fq3Jt2{-(0~?lMCd+GW6P(!B#h)? zRB%rzSv#>sDAbU^WA3}U-UZ;2=bjTZpix2941_XBTF^NvBzESpC9R(F@&iWBllJZ&{{UYJvZbHIK;T+g zw}r#&VG$8|4Gr{=VD=7MFvgA3Gxev*&rikG0GGZ?a2&T4@?o8NsFNNK7NJ2$TmJC_ zty4_2p83=NMVT^TTVxA*Mmggh0|p`5CuPU(7Wujk5Y!`{SnCk$fHL|#cZ%D%xa?so z-9BASO+JW&mxz+-35aZ+)gNpG-n>zM9}+&f;xED7yG?HIWv&dYcg3}$1>P3kWaH-U z?;xWDc=+;#HPlho4I}d5&F~qzc*RiX_DLNx?eM#Be~b}I8UN@YSz=$Gz)BDAz>h&a zv+*Nze(6h`L`JEuo@4pAI0?tQ*|JMB+bVmS6coa@Ziyv;$+nl;r{5;&2QEJ~H)s6v zibOCleigfRyb?dHLrtB79Dd+;QEbF>%WDGxb-eE*1df# z+}$w^d0nogFGi*4j73GV;DeT;e{!EQ%S4`v=icXy;EjB}ZmEm~d~ zRs^f*idyn$KYAo>XynmnW!;y?2{_F{8JjmwK=WaBs}?}~>A_7H6SkV~_MmPjjrA0-T z@=_MZ*L05=`FeZDWq@wP!$ql}k7?KzZwdrNM6m8{eH973jq;m*c*?6+wG+t`U+QUv z^-#r5>mxInypFMPLZ@te=lh`#AFSR9xpffA1vGwTao~e%ZCz@{y)#H&DAVq zVI3*gBrod0BA$hvhfAe8squ>DBlA`@K0+cU!HR-m_4TTcOPcmpBHJ^Bd1g#@Tk+Q1 zBFpPQ9q18iP-%I^Yu2OIeyVwEuG-s;77{(KiEMZUcwcDW3&@w21I;^7=plaTw5=zS z0D_A$V*C=)RxKmTD_CUNaHJZV91CZcBQL!o^WpMMWe$4oFSM zclV7(U2PXRCDtYRfRiznEiN!oOXT3Z2ns!JU-m3#s|0eBAW&?pprSb}tgg7C!lv5~ zjXLbuqNYo$#Obc^&~x!)`oDuZxvW%hYu78XOxHa1WyXmJP(F*R%hrKGiKqglMA_TU zazI&to`$rJXj8GUSyfjz<)>@@GzVOdf5Xbm+`)t@?CfQsP)nktw@^G968Ug@_UEfg zg|^6ZO^S8YWn7bvkJyS%l}=9Smt%tv>eR@aBVj-bd5uImmP`o(0|oH#_ff#Ds1_c9 zMRzhxpE1^XDa zlZzCoSXSCxww0A(hlhJBQt0WYTe^{!;IYvYg1c*6PJ%n*+9+8Huf18MpEs1K3um%B155$6LvhY(hfR)zuneJ_po7 znJnLbFrdr~QB(e$M@VSqJ7pd?3Oa`4lTlL}H;VStUk->4;1G`n6|M4Kn0DzvrXc0i zN1tR%Jf~@GeZDu5+ZGgsvp-@_$!8M6biQoRT;(kO{VzKN{V*3P9K5NiiIA%Z(g0QX zCreYdx8OW=b^l(d5WU|aLX3}(vcQ&bakpNi)>DLs@2L5{rhwL9;+^X3`gQAURYSuX zE$eWBJx#xgF2GJ1h-EixvwNXmzR(^Y4`Cp*btYLP=1=$74i%uttLgUl$p|24YtZiB z-=W5x{~D)ItsmCX5(>Np)xiP2EN_lmZU?DAHm6@# zCa0z>p>-7VKgHy>R})mypV7<~)4)k7rBg~|lz;T-(yB0JC^Ls?6mf?^`@WmQ_;joA8mrd%C*UYigd&Oj}yKAsAUKf6#2BHZdiq zL)|F~SsMFud%JI7pg7p<8rCmHYALBB1OlJ3VI9K?{HjPnDA??yLfPeE-AS{V(atpa3nCY87Hfe?(_;}wW3Lhf{NFxg*a{U zaL{1s<*%=i7D$}Q3wLI%Uqpo-Qx1;H!~VvGL4&f=kX*i;V??0gB)W&1dQ)_3ZlO7Oe8PO(*WMUa)&FY^I*|o^z)AJdjOy%f zVqpt|B+;M1VD!+MNBo&;5*(~c=!R{W4rGD6f&$LmoVe?%0wETbyOAesG%2$wNvkV0 zxj<0awBd25u0F~<(EU+Rh+i2Xk>o0>vDp?VeUy196lI?E^(qY=oy5Gn@R|4Kyy6ng z`P!ZZrKQ)~&!1-2ripSxCPRgqwMs0}(S?*8zhSGia+{@{obUb&>dHPBJRbG=uU`rE zYprjdoxaQcJY!9wSN^39Af#CPV;<1cx8KR4dRYOS?>=mxhFoS|hYPvp0&HwV@X<(N zhc^U01c#>Q5lXc6(CdVgR64*|fKQ9ZIlmG7p6e|1 zrW4@wBq32HVPp(RPse$bS9Aa6qm=3UFZb_G#-~Yp{lB*W2=_Z z!A$JWHtmZw8EY|LyZ@G@_D3tLat5te?#7LBMR)fw)tlS%_%Ug#l)&47{+G*&Iw&f# zLlec4JeeW%*^N-z+0h97e`j0NuVu$0Az_J1NO1XtMQkL`(q0)Wmrr-bmOLq2K+^@W zrJ;Rrou5WeL}%!Lg9%DvHn~t+U`Y)K>s=O*Hr2IbSXe?R8-`*Rc%A;dwHQT5#@9QI zja3`I$)%J2KfVL>PtfUtc)DtnAp}(}7Dv0K>0eH;X<0bEo+q4&vWGy%(8HB;(`X1V=Pm zUb!WG`ZZ(VuBA~X{P>ppLq(`+NH!&hvOmHXzqmnS^4uBef;KW9_ziN>^I%f|9x89L zC<{N_RKhX}ccp4482<~WZ|A}zIn9zk@5chjP&+#2Z2oSIRF_F%VPnf6v$69FG;1&% zr~+vKZyMSIG&GA>sgw`r?Vy^jY>uy$yO@7b_1d$zb~cIvbxo7>-}2V<#BRf1*NLFW z0P8U>9ZcFWEv1KVo|==Kp2YLDpQF$BHb7}XArdx|_UgAr)!P|A29B^J%5=;ju%L^j zrOTR8!A(Xl&@Dspe`o_VKq7K?c5;$N^(g=hj|~km|5FU7344a=f!m^_BVc9K^Re;q zdeHkOK%*0{#U8oUeKhn)32-(2p^c3ww>1D4T~69HY(7*V9ULyYW$-A)q&;H`V<^qCg?BE9)09QzfP65EfiUpum7m2pE$}zo#&bMS1q$+(#SmtIw_^TH zUpegr{6@FkMF5p%zfL|0PE7pxK)@1(2P3)Dj!NPfZ8H4Eyx;X8zFl1#KXJvf@bb>y zD(nS@2SqvvF~K^7lc6#>?4-p-Zfexh1||9Yr}~{kzuQ7WJu4eFepi}5RKR1_fSOb) zPenzL`Vy8LYXbxFk(KyPyB#h+xVE9VPl&h;Vb)%2d^(7gEHmvWU@ceJ)N2i2yQ2jP zqF?t&$%*%`6mMS&!1~aek9r*BkeD_tm9@2W!NC^IBH_Ci!JR+6INi)NB}hr9YRJ0Y z)i};Og@uPN17WB6W|QEx*yJ%;v?YuUgDEUHtii#NgLNyAl5Sns`iM~?0wA`f+6$ng z*{l^I%mz~l%TK(yK-@4ing;^+!vA5uty1*4U_m1k%BDc_)*5xIiaD%A5lW90WX z8ch}q^o6>3SXooy>#VrXPK1-^qjhvVP#LQp$W<-=B3&-v3E4$oTt+?aJ5-qjB5zy2 zfl3!tHvk!rmHX3nlzM5x;ur^_l@j2hJoxnDh@0TcJ!&msvd2i=?r!Oz3qrm8ji^XCm-l?ba@`D6U89SaYk3HP*xqf%y-R5pZ*D5LbgvpAUFlmzT@$qFJeBwZwRT(e##L%p<>>p7T6mK$U>%M+kOW_z^&|-cn zeP3GFyz;W}^CAi-R@MYZi%GY(w-s$Rcth{n?X=W7XFgvRfi<5Jf(Qq4?F>QB+?)>- zxomNdkbe#r%h;pv%q};pk5965h>?Mx>`^uQ&$p)p1e@Zc=or1a zIR%a4#-&|qo!aK6{)MV@AnRd4(g6jMw_Kw@@YBwJnVhsFJ{^Q=DqlczXRw%_mNulT zOY+7IF;4~j36{Z)57dtR!4@Aiq&Vz=Nd#(D05MNB6!N9D%OzYt~%q z2P!{N5w{c7lro5u_i>4daQDC+%U*B$nbm5c@z3B+Z7DT+a`v@sKsP&g#hYnc)-fg8 z3otvO#(e-(9>aMCYCTG0106u0VyH}YU;ney1Gw;T*N?dfL{wA%m_IKm*KWa{Q?ZHu zWO*!vTx*InblaZ>2rL}*yxa5(LmtST;J%~o03Zu1WZnPN4S|_1O9;16UI&M*d`%BJ zV_=`}8)x{po{_^Gt4fD@Nl@Ymsx!0zSg5vsNM2g{3n-KGZY|uKd#7V#>}3X)N6y#N zfrO%5h)s~m4V+1~(5K~o@#7EBlMsZ3^Y%uQg~MUwV8B!KPy*=2H+!~cP)&f&=n@0p z&z_3dx!z~3cdps1_n+B+Hb$;nKj|f=z6DGJla_Y`10jp;JZ`Jc#OKiz4;=_X&YoyZrjvPN$aBy$VbQUTnxu>IXS}TE`^8zGB0dqR#_0-nb5w#LPdea^c2PBJgr8iV1f% zrdKr4`1`Flho=j?(K0e33V*Y(d9GUcOA*NAS9@V}bax5^ki$Ta9DMx_S~wd=_UfCE zPR)jfafJ|i16Ce5_(n0w91c*aQZEc(WN_Q0++9M04YmDu8@GX9#pRxVH&_fKmdJ$h z)*DD8=r{Ryb0Ni0yag0G;}(587wh!_Th3iclg}ysG5>e4!7Sz@0znF`JE(6g0t^cwY5K10G7`b=>~J03*Y}|#JcP^BW^BoI z1u$QB=pfJ&4!<=HDhk@-_&?qR9mElhCljYXd z9_5#9ReOoCnS5q|@x5-i0RQUStDTFfiZaD%h$ob46dL-Ux(5}WTl;jQSnFecch~yV z)1jwe;jYfj^{~5@hGucYLu0CKoi}seKx+J+e{Kmn8dgXVAbI|A=7NQ_#VAlXsK+>< zc4Y}^8F)`|VtL<&EzP_F5)38$gOMf-w*Ocl*K5=@3V&I1@IsYA2O|Y7W^j`E7MVt$ zoW-(0$#igNmJL@&^_uB|aZz=39yN*%q(c2&+NOT-X{({?8lVTM72)q!mP_Jis98PJ z6eIIJ{E=3uC^L~LB`B=%4ZeuVrr*-KVU9#1r?#LO9G{ws9vLx01nqBl%kZfrL(j1w{{uHHQ~ZS;q9ffV=p#warE)=752~=-1*hpeb%@2%%6ED z%j&TrT26lrih)qkc6oZoH^Tb5)D@b7_i>5WdZh6&tALMDIg@^ZLHY%^<7Ke*pGAx*QS2?Zi3-S@zak@1Fy}_N|e0G>S0(#U2k|D57a9k_&&7S#J~v1IPf$y z|KftySMUJ)f2~1CWu+4)W>mFfR^_bxm9c|;s4}?w|Mc|M0ab0!|2IfCNJzJoNVjx% zi6DrSl!P>>lr+)^(n?7QNFzu|gLHR?bchlH@|$x%-{-l1T;s?-Yp*qH<~^^Oy*AuF zB&0e|o(z2q8<^aZNr7COmsRpwFBF4-mJwDPhb&yjw5-q5-G+Cqp&}Ir<*`-eHwrgg zC}ARo3>NymEjg!SW7gEP zfQehbq|%3Z^BK%r1rwBVWTTv}RMrc{#8Or^X&`8{^K!7u+F?9KkSUW+r` z`3J(nyP*ajfr(08v$x#*G>2s^ZL4!|u)Zyz_xVMwE<$ZWD1-E>-2cWz$l~*-Pt;Hh zhoYyC<`_N{?h$PSARQ5<4j{03c`YtmqU4zmEC)gmyI6h4&u#}D(hP0WrC=ZvjdPys zFjEA_x{$N|9~vU?KX0>i>kJGLk2Lcz^er7@zc!ucD;@<6N_=fg~kYa7Q z&VcaAo131fX!kn~7JA7kC^`!=KX!v$L}YBR>2=_{K7RDh5H@L$Yb2S99#AK(wHeZ! zoQ~>s?0}l4r@a%%I*4-iB*Ghq+@X&-D|f081RNI395l-VOGiY;E5xcfZf0poLL~&E zzz^@yqd!}R224EK|HT6{K71S`o6e}iIU%S>6;q@?`uxIkwDRuuo&T$Jg6dy|dZR;w zM7|}%j}49K7XPx5YrC33ty-(TPzos}PBMzpULv=>^F;=G==8^|vVHN7vZ?88x;idA zJdf>uDWsvoe0=X__B$6B8%hdYkROKq^a;GzwfXLyYwb6&*S}L_9-_0L71haS&#N^@^|@^mo_{wdyS}D`sj|#10}aONKhO^1Zc0&+7T5*l?c2s* zB~lIvaG~0dz^l_0q=0oj-{kozj8DI`8vJSee@!@T29T8p2Cg|AF#fJ3qQQbWqCtoc zgg+Rb^Cn=`-0~3wtX^R~pei8j4?C`ph@=`5{)Pxtm_?2~7Uj}cM`#urGa3?vod*dm z)CJyjbky|x_#vaBA_~mawrU8Ft{h}#LQa~`Oo<~E;E(*ahh7~*j3BEAfo}6e7G%cA z0@_Oa@d6+>utK0JLyWhCm7j4}-UNOUAq$>-{gUQ!IIb59c8~+U z$J^Q(5194dJTFUAdpylspTjthN3iOeZD)>DToj1e2c59o7J>~0i0nEMY^X)ShNyb6 z(rf7fE|orh>l-d&JH@5 z+_8Ao|FlOv;r%K8IY(Cbo;m;w5Y7nX3*`e47qARjIXR&kaQ4zEGfTQW6dwTwlfXdH z54Q_dqo5}cAgiWFlp0=>TH^!cK|mUCpy{+_&=6BPnLUYKE1nF3ed4+6mFf^`VIX$|g{|uG7@)D(IQweq@Yr-dG@HYxDfM zDhv?d>T|^_E*^`T=VSPYL6-BxmJagq@!`GO{bNokFgwddA!q}h6G3oby8HB>-{ICT zPspKpMb>4L$+!f|wJHB}fwX5s>~N+ldRH4bZG5~=Rr}lSuC6R?2M zM8y(<3fyzTTS~Qn-kp+~8k(7zE-adq`4{t*R_)avLZjY_37sDQMpvqyIFYy?Is{p@ z{zJGVc%fX&I3V;v5soYe^YzgWyk5+?ypIVf?%FIuROSW-Yznx4ZqNv@vq1EsabSN> z`$q3IIfV5tP#P;xRkXD&?>+T}QVWPM&=>hnXgtF6y>(zU#CJ3R2CWFF^GX@UrfXqEsPi)cM)exW)H3O!qQ zp)K=wWMT4h#jwP% zYE*idye{#lEjwTygOWA~2@bQ>D8>4vmg)TJPl*ZXg{BXlt>!^w#l00M?5G+fdtB3d zR)koQXDQ-Z4bcB5p;ZiWt^O)v#GxGWtpppJ)4;>$yvF-+HG-f7I)9(-`pD)pei3`% z)Y{!m)!G`FQO+mFLl(_Pqc4VPc?n%+ulofe-b5#{`r^1yG=H4;C-y(|W>l zsmSMZ-Ji5+0dIq*MHH`~r3PD}L5Dc3=^npVVcR)W@9)8WD^8sqm<9?5h{-b%H`%<_ z(fGcJ9Y?=m@|TdOU+)4ju+U58wRsBWFkSKN-hj8bK#7|H8@j<$0kvxMg9(}Pz4LgQ`t^|Xkl(Q6d51#ZI&5Y71E{}^& zqho&1#nTF8CO`fc??XqdOpkSOv3@C5P(b)j+_c1Z@#5;We*{1o5?39gM-zTX&dPW7 z^$+A-T-br|Gzs03^!h^j=MO6npM}Pnpa8WidGIM~{4yEw0nTF-JW_#(?oatFOx)a5 z*Vl5kj{EDh$-R~HFQy34&h^C0N+oV3SuwoNUz@KdGj5UWm{Ea@X=`UE^{dE3W()fF z`OhpZo9Vwr>ZNVEclDbdiDEO+R0?39&~n(4l(Dh1%j)Y>8fYc-R>q~JMFj+y!&ikl zgfW?p3L!c;IsAGj+K`+zsoWT7BEN{yy1CwJxalK4KOiHHps8HJB^AI98?imwx^R0K zDYk$*`0)_~jPvf@0HAjoJT z?AteCvPQ{@kJuzWr+e#t85V`IXwj>r*VjSk>j?~d)7i_Ea=H%_7!s_qTl_IyFP_P4 zyRSc-RV+P_do)o-ox>w*wV^2>M62j~ja496U2ohV)Pu$7put#EqeP$l^FjC{P0iYe zR2=@YxjYeNS%Hej5eF~qQF@Gry88PC;LNCYOYC_KcH!HrOP-W)MA3pa2lpE* zJX>3lD9FTQxQ4o0gDzqHTtb^p9e*82hvr5`s_E$0k{a!k&(3i}Ork0+jh;WTvpap+ zDA6DMh%k*oB|UQ2W&=DQc%eArXf8cv6gxMnR3QL1No z*Wpydx;otQ`+4)#MR4lWWbNO24eE9KQJpO=K|$~DmFNP(nXMzatnmCx#6p7?=X0j& zf}@3X;rUIH3v4ivDG|5v!$Ue~w*B!_gTd#U`S>Jl>z`e@xW1G67*3)f;?8`q*z|1iN*@fk`m3q*^KCLN(mLNuu7at;Qi(P}zl;Y{fg0)9A3VkX65DYr zUHIOu34)SOPIRlh}-ErM)cIV1gV zahX)W=_$_nGRj6^Lkmd+qk!OtO=@Z7pfF#@epC6tCKA(45+*dntP(|1=;=8?>6mqV zX9zjn8eWLOA?Z+@H@h|d6mQy6E$r27Xs(!9R}OuIP2WMG7;6H-=4ldG;SLz z@|D2b)vbzGP9LTqw*ZJsjLxrG-U9X2xV zo_5(>Q!{dSVumU?rxsxIg14#3fJXAMf|%YgSu3A69kC*D^9MdTDG8Lmy=yZ%c1t)6 zRMG#25FI_VzMGGKY(8c%aG<9rWh~puCJsFs>}=Y)O%cwciTwMQ7|P4R%9b8!T3Y_| zD;~H^9bt5}51LjuNhl)Z)xTS}74|y4graax?J4G2>*p^AG}YAts8)t{g)(RZSosZS zNBfBs#6m>5{RJ)lgfuh~gqRle$x`U4ocA1p`$<);Ky2bbAXhY;(dYW6%kf}j(XTbT z)P!p&Om!j%`eMGT$lraRFH=mjCL}!f@QF8S`HT))F_VjrPd|&9?7LM^U1r$h?T6Ou)o`-nVa)D?#sNb%Fx}alkbP z7%luv`0FS_JQAp=(ElJbtlNxl03_Cc`CV&yb$Q0F?AnQWA9UDt&bJ=w=s^28ZFxz} z%EsS64CS1WAcM$p6&+^vY@Za?2N2&&5;SuiMJf`&2p!>1N$vqA?yoKxIKc|8|-r$RQNPguHWPu|IiZhWVB9-~;gzB!nWh}AY}=5n}V zOs~V|%{^g4t#8yQFxKvRH$usC>0aL^?=yUiAd`?BLg=l)|M*t-xfnj}{7R*!Osxzt zAD`|WkMC!K0@ye-;L!984#SK;9_rt(uD`%NJ@B1bsQ^b$9lGC(QAzjDnIF!H)zLQl zbHT|rE#29#*nv6Qkw_utNlE;0(~Rz}rD3y=C}&cq!pC!g+XaM`6|<&KV=V7gDL$)- zKk-&$`GTr(FJ*P2~HWQE@~)W*PXL8tWe%3+EA14Xm}^fI&o_cPk+ z1g|FBNdQi&1qUn=6YA>!*q%#59J z5Pp%;rLsC`gI2Tk4#y%?*Ju2&Yy`^P_F%1#lR{t{rKL%*-J82Lz1cobGwX$6|5<_t zJRLF;8XA>&%qe^=?~C$NLT1(uS&o=65w0sKdBQf6VRf%V^Ycj(mV9;hEm7(4PTZd} zg;P|{*ME6lELLMv818MCW)VF!v9VC3*PycV$ZTgd^hmsj(kZ#;09{ z(tQ%@cv|HiHU`=Gj)NjXK`Izu#fb;stG46bD*=axG$EfvY!82EMyiXt3E`A?$l9}-O+ z_lYv3mTtv|2k1Z8T(&sGh8?b3{5hklN@M^coJKru93LPNs7CKrFnX->%h zt~UMLQM5G<`oABmeOM@b9mjDI#Dp|8ob*$tg66EY)skeC?(V;rHwSp3&E}cU)dOYb zVr{)@WE7Nk5pVsFz`$;CKP|7ZV9Ejda%HAasl%yoWJQkDp@mq2pI-Qxt+ezsN6SqedlpOUFwOuzkjFv z`NNeQ{53|RpsucV+RXMR5DIOxM{v#OYOxD)vh~kom@VowR^PvWK!d*hROVmIx7`;@ zu-qJv2!y@$^=mzPpML!)EvXkB8@u8y_2u{ZpHBhuZ5<&BHkLiuX@0NKO*P32)0Hrv zaT{5V*!bVj^YJ&O%XybSDd~Qm*j0%RC(s3$2P2by4#_&z&Bp1Y6j6H3SN!;46$T{0 zfgrJ?qV(8E6pS7Fi8o)UYI8iuo``XwK-#VA#kUoZGtO0}f4n6(ah7z{EI$n<(__Sr zJ45-T2PiOO48cyvHqX#8S7%E77SdwnEv3Cd?1 z*uSe+7y4nBKPkJcF8H4kyYzm}#&Wp-vRMIW5F{x!Pm_k4^D#ahU`KDTXA@ z1eo7h!alOJ%5(D&(27?r-Twt%X%WSZwCquYOcZF`M`uj43ca} zs_c!rb!jdpYK5^uuBLFn!9lUfPO{(n?lDDdW5PkA;Rk_ceUr;^@-rwJ zUhZ=` z^u_9xr4PJlmzXk8?(fqsmI{-v#D+|+r?2nynUW`Mrdw{IDdq#>VzJj(lnN&mpW zW^E$IEy-`4DV%4+Qm?6Qv*5>mvA#uHil&YTOT0$|%!ehPt@8^4eS@>4XHUHLvFFvJ z3yzLM&9&-g)C2`TfbWxXT9?hG2!t>m5y1gw0}3C_(NVvF{gN#PS298WW&gGrbN?S? zE5o36B#-jt2Acwjwb19F?vHHwh_z#T-eCT>d$)c!I{Z!f5Zx$Rzp}!cqRtOb$M8IT zdeC-8rC67K^)8iX`t4&-j36Fvi;B*~sg8lOdjpb&TFlb%)mN>v_%g#uq z1l2M61c|jHa)-IB^zctP;T#8%mnDvR4FJ1^48BvNHGZ!iQi+LO^-0!05!W-imoDbQ{mT!4t zd$GT8zv}EbM04m8ziY-j{!VthXtkCkg{(~LGs#0&W6b6y9@zzx2nWuT2j|U%^52o@ zdE;d?257-M5xymV@int{evL<9!nO*i}A`84WYAZwdxWNC=P zYJIAce!Wr)AqzQqfLNvwlBCrxo|Gv59{Y)!D;O#&xN!6;z>rrPpAT^*mw3+Y zxY3>zi>J=n*@|>1m@*HDOm$4rfRcl#7KY!IL2WOAi%f2(h+5Z)N~LSir)IkSQ0F8y z>$vG6=oiu`?kWy%gYPBTzx^enS6=Oyj}n$TPlH~mfj-19k_V3o6VAi8TA!to_guuk znH2hb&rAXcE1c;Z@P(tSalZIn)A+@4oElbzYb{zWQzhXrF-2ST<-oprlRM@c7866e zzHz_NY>Y;o#Sb?>Opc^>*snaV(ywW4DJ1WkJ#5&A-bHsARY{m+*w7PxVe0$ePzak4 zy(|fu{u-CuJj$9=yY3Zk$%}$C!hv-_{-;$^Q5(|MO-gBqNw@^D<{%M-onlswR)%NW zb_rxBOn#7_Ubb$^s{46E#?$C?51c}!8yI$0q$h4(-x~d zNe%+_A4L3ewHIb|Su4*ZK0(7}%3wA5CzQQ;nUTY$gByR&&{6g-)PZCZUw#~B$mAWt zr>Vfxjo^R?!(drPUZlELZn(F5IS?UCwwtw$0ej3g^k}cj3c(SeEdmY^r1LLXW#qHq z-O!NhmPKu29ch+JD$|+%@rXc%URCDT*#;q|+{xi5;kcO%ywOJ{WjV*H!(B7aO++>> z1IcA%%VPfSBA&KIOe|y;YGFPh(AT zuUL0-c{lq8|CINZDj*Y8)e@8vAUq2T2Jwj<^xRG~e=ji@2s=U_ed@a7%|0#q3g8iv z14=g#iw~3SkgYO-3xGTgj<;EX1lQ8?lPuTLo6t}oR|{_5y}hX|Q~jAm@_f_%Q=*;c z=cqh6%*@PEQJ?x*Uy+8?2O%WN5@jQ0^QrQ1Ny1`+yX|ZY>hX>l9fK_hYoMjUy#hgP zvb%VDs|xl;+ofMU(JtJ-V0E+g(*Sz~#(?blO49RiF<@~~5>WxEJ?#;i%Iaj~BVHx*RzbUXjRR?$j%0Ta+dBHrp8S z!?qB@2stl|l!E^Lx*L_`@KpJC{TITwq*YXifR4%(q+=Fc+jf|6%;)kz+~TxfuH~D{ z)%AE#^2FQ_B_dMI@x=H9E!sR7qQK9$3y@d>b`*`S1Xy)!dgIai)6KzcrJ+gB$LH4V z1brqhcD$n9$ROX0xb?1JWEB@)S`W!@*XpJJ@DDvxF9IL26JT6oNe2-1aNv|p&UW*#4Y{N#ZYg~O&jNm8R2+HsC0bLlHS2cw;!fjeRnLgI}-_Ftzx z3AFy^O(1N$(9g~rh>F?S%d>NFCY5y$Htu|*XlPp6Mc-`=7JlY;k0h%)eg!-8U3lDq z5I^_T0EosL2>IG<5zhOw^gBC?EBcj$JrLU;PcBz?p&^Cg?*}RJcQ^*3zZo69Z|fjV z?d;7iNgy=F*6$5S?Oe7%$>jCBCqrIp!=Xia6M-e_hQvC7iq?Y}9>S-mezfJGgcjVL zVQlKq){dBB{WIw0CatgEg_a6(-RG3+uDjTzjH<4$njgxfN9sR7ulYvceb&79`zMHe z0x7+}8)q))aQDScdUg0hVPb!`DYgo1=F_yE=poX~kylj;;T@VvNLz<=>w9JD`4kxv z#cc!W&!#KnR+4u^f|?SAyObtt@{IsBTG1vl;T=25KkB`Qs4?T?j{v0&kBkICq-{H|6GUSt z>{xzppz53U0{2mZsn&>Hcb1-~EVBgyVCUpOGy)`pjxOnHm=2gt2S^%-DgcbKTti+Q zcEGfNn!D}lBP}Due9yrT()XtRL(1jJtGi}yY-=wPYqPQptq;ex`tfw9dI*WBVkz7# zano^7D+&vze<)ZYLHJv#|M}76SDfHd4iE6O=6}KMTxH+BdDU4ZT0Y}fq0`i?gj%ae z*sK4M)52o!c7{<#`$u~tc1ohzb3niWPU9#Gbe*+YTX2(N1r20J#R%Tl7-osOa+W1P zeWz|HpGWiXVZsNYke6~I(`v7RnrcXhcwm*dn|`b5J=*VHUJj~WJ>8FS^Hz%e*nvUE zCdyEKrwZ7Ih`0f>g|^W*G{EY&7|nc4zf*3*^?!6EVtsFGpTxnQ{aUTD7)vh0 zpV|+Ar7Dj$Imtv_C4Twv-+}-6oVS1HF&hIWWg8&_zu+0G~6S$0)tsPo|}-!z8bBF+Yvu@E{r1< z94t$Izp|#Y?~n_-?RqE4nesp)NM~fZf=m3;QUdEC2ug8))j6%9VuKq%PiAO%pn$ET zvr?lKV}%D#z%tzCEi99QcMH(DQ+h%JKrxLRNUSfU&3Sp|CXSp;?Z-pb2S`=Q9n%@x zQ!C4@zSFg(w;+v;gVF-1uKEn3le_Ue)9Sh9M{7@VlLHmUqCYaIt9SiK40G8{FAMS| zX#uPcwPL!pwWXC)M>0hC-OS)+Y(9{K7^eO7DbDl-GrXtCt*8Ssznn@}Rs$+GAu1t0 zKJ-u`u(B}NQ13sdM~(uLT-_Q;fb|bjqeE}Yqa`xqR=`Mar@Q{$Mpt5tJ-ff%@K1!G zOywz4B&G~;Bn1hnDCN|SJ2C95K%;9>?)fvw0LG^>-xw`m)Qi(W4F*4c5>y(n>hJiXS>D`b+QSZJF`kHLjPCSWC^K z7$DmzJVd+qa8h15N$k`+ zQ%6Df^gP*&j)~sg%Tz&2iw=D6bdA0J<2*{MN(2XCX5lk#xCEC7xj=ii9Kq(-Pon~m zQ$rEaoL9TJv>0A(LW%Sw(es}V4#aM^A$GRuWrJhcU_9`>QG9pGg!CU8SFv2G`1GGJ z*eCQx@!OQhO+c!Ltik*4cP2c97}SaxN@Q{U*Q2m#hF^+M_uKO45?az#Nn_FOGw2E574drIhFXeqT zhhkQko~eNW0pKeTULoG<92#DPBA2hqJIl51@MH| zuV^Kh9o_TRrqRMyY_^r`1(pTt|~{lz8} za5vP!%EdHp&OL>nX9>Xm=k6$`@s96E7V0hF>m+_nOnM>ns=lUzNqFkwHJNFfmp41& z29vkYtPP5?E&`lmM&|?M&7nZFwY3FJVAvrc7f>o{hp+;F(N$cQbg}mufw>TNfO8+~ z)IuK&2K4%1rqjkZ^t@34YS;ikgjRiSCr5acM&9h0yO*cR9#eDJ`Y{^k3V6XAhv4Xv zp~k_kDw{{3u|qY5R}$DXz<&U+-dni*m4iwHc%(DS3=9^V=2j z`Kwo4izgkiYDXJC{Wlkcb|I&Rf@Q%%G)uz7&6vRe0~D^w6}NOO1x2@~r)Bl)fP+7i zae*gFJ#8sn&|PXxmC5fgLQpMgBI(R5IqmA>H6)KDl8_p+3Ro{%{jl}I$$c$#C5*q| z`rki>9!o>XhAyb2zL@$PzV!$~%f-ny)Tu&sXWr)L^Mg#IG1}VQSv*or6!)lQ4I1#N zNzMrxNR+M`))Yt%Od`1>hc|fOb=VeSV^PY_h1oHsZ1(+Q}gMF}(d_l$hwH!09&_i!_)pEivMY-}e50!q8;3UGx ztwO8uTYVT;w!3{>SIIZ+>FDv}diF|2P;-^M=&-}eo1!w~OFjN^FHiD=LPFmO@JL8U ze~S|_?w^C03lh$e)#)*Ogx2Gocp{Aw6si>hiakE*tztp_gIuB*Bxq1imo{w}`) zbz6t!`gI+ufuzWOSCt$c#2&z7-#a6dT~6}Dp#BaNrAp--)w9`tsn|E)`~O#1mF?Y+j{D~)R%eGxUKD`{Viclz80)6Moc!<4 zew?O+WX%fu)}OB^uLs7*1soO|ty+JA$Cn0PGANz0?9el7D&J=2CSDaWtEMAMX6_&$ zqb~c1qORVzaGlpow%`PKQv2(C=iZc*2*lb9%@YYsi;?cr9P&fq z1O2lv-hYyggvKF1n94qZBAM$lSOKHBN}t7Sxh(SXQin__B_+zH_A1ceX)HWVfWOqY z5u07ew)7lhU6-EU;$QG#(7?D!#O*KgO84bH+pf67Np%8m+3?%H=G!K2GEJ8BbF znG0`^%h20iEYDin~cM!LBTB95~A zFo@Yvd|E|4`?x!pz?>su%X$c`g!7LBN&5XstskF9E*77(N=7LCKJ~+IT0{!?eqomT zxL=yfA6G)+WU3w&$NN7YlpRbL%fkOc!RDwVE9U5st z#X}W7J~_F`Yz?F6L#n!U=G4f10Itvp6un_HC^L#OklhxxvqAlera?{>-Tz*8K85F{ zx6lvjkLNB}?xs%(w)Oo2HP2|&^HX10ckmgKLC#u#*xk)aPsWc-TBS^m@Gf^p3FW!N zIPZ?+PQ9#_R0Ki~IFtCHwbqcLODo)u%eJY1^phnYn!Q|3I5L_INo0HwY5C$OsoO{4 z&6ACfZf{ZlyP>!4mh6mQA4a3bo@Mvy-gf!3duThA8yilu+1#H zWBI=nZ7)v0`bF6RI+FNVM%#urCps9UHX{|7Hto~>ruPdulLk1vgPMSGc)vDZaMf2V#KQWL01$|^%|n4d;ap-`$*JZ9!$Z2Vi?uAP|3eIYjZ#rxSZCFS6iX=aNT z^V&V$ps&yYq%7}3Sn@aqFyJiPDwBSGN$cjFMeLb0qffWlg9hB3X6bxiVzseJIa5w=@cU>ADwBk-Ff`=Y^~~E@-?Ha8S1iWM9NZD)imBOYQG1#rjgw^ETolrsx9mZo-cD z!kC|8BZ+wIJ&lSr>ei8La-|Tl_QiiYF4;61IrQbXYniXlvw*(w&GSOCpIU+|@gDWI zB4fPVHRl~&w+dp5#b%u^+SPa}6JF-OeHrhUea8iHHIU85bldG zLVn)f)OR;7Xp2yj#v23Pp|*a>wF@unyBSC?%PyAdeY$pDW}gkWmoIhI`#PWKzUKA8 zQ|3nQw#0zWHLc!yfqSADqQVyvJ%>l`6}Oa=U3Hl1LqF$&U2b=-BpgZ+o-Q>-qISKG zR+`*!jaA~P43nodG^&r(va@xo=wIyqE}Sr~(-DT6lTX$wC?GcN5Hddet%cg_?@6p= zWALnjNgK}1Z!wdX`yMcU221&jIQUiPqAJs@lruSU6|rPZ57g?W2$egY`McfBBrJ6& z26()_?i>_KJ~?a&TWk5!*}Qa>q$V>cAtgG;wCgI0%vYI!u(uXmI}vl1sqPH-k}CT+ zsUTJ%vgM<Me`=6ZMP)SW+sg=av426^Nd!frH82>Td$)&on@F?vM$&SWb&1t?>!TYpnYFg*KA+$x`Rc0Da!Uv zQ><8{WXDQgVw&V0AFchi8)^x!R6v-^jeGld39 z6(cRS+bc~t{-_SOs)p@_9WO;CFCRxg>|XR}$X?yfhdgq*}d4w--)d}O4oJ1 zHFdrvN9v`hpdz{`?uz?f>Jkf_MlkVHnB^}qLS+gu^5N@V)2E}{Sv$6Je`0PUygU9B z!eKG#u3s&jS1i|{_{y|KY@Ew{CWm0}b5R=bCEJiuYW7!bTuE9yDM*%#)e4ifm+Cxn0cF+W+8arzV@xHr|3;Av^fNh)!P|LyXd-s(E?rt>B0(B3sH);g=7BY1Cyv zbdjjOjL#s9R7yyFBjn4es0@#hWPIp4DrM(zP&4Zi2$5o^;`uj`HCKjJl67Cs!GSZ_ z0*g=hO2Vv0RNm1&mG*D6OovXrfp zp5C95f3)rIE`8#X`~hZDT^%>&lb-nRCh-#ElgH(;D%sjT%C54Ux(Y7Jn&Eh-IzHHC zr~|bB>j@f1ozZYN#alj2PG&Gp4Ghb?GAxgkgP*`%%Hg#+(*Ms6vOY8hxp=01Db3bq zBf>Dvg%3>r8$$|D8hnP5D|+r1LV_K#${pU#mfROZb@+jMw%R|Zjhpfv%hFf7R+%!!4EEa$tBz^r`+98yM;;l1ot#cb`ifc4P6hqLT0_IU zNN{07#I(gkzTHYoDbSWVA?(}p1x|icI>O;BAc&Zh5D_l)UaSh`h{ymQA+hOhtOwAA zO9VCCx!N8LDGB1eHEjmc081pKTX$9DW%Sq*dD@!!b*S&iJ$$PcjGac1Jwg>CYlsV8 zlmIA3u%Z(Qc4sr0VlK~(EZY4y@LkT(XRBC+rdSoC=uCo5Ks3k5&B8+2HVuvIIP`kM zf#KT+667|VJSm5=QoeT-PoC}wt7HcgG5@{Yr5N-!8h`hxh0hyoqi~tgM7YM}3R@zf z9Q7R(mw9ZSihH(yc~G+h$yVdo22Ix4NFr_kR#+34lT-SJVCfCF5!&M&aN+Wkak!F1 z5I~0R;toM}VAnHfP$*@z*)9Ae ztMryRxMBp7p09!qCCknEM}WJCA|UBOcm~IMjO*V|Qw|n$@z@f}KI9&Q5s_}WYD(O`GA!~m8SxG(iLNcF;<5S6+ZdO(B?UJ>IBya>t-i$V$h(F zFJGlbjfx=alqk&7@d*{oNe=-Wjl0?48M_c><(YKwK2lq`p`nK28AVQR&i85EK$uAP zq{vl%`1iN)Nt=(tQCV73Xp(M&gLZ1*!u`E-ROf=N=S ztkZ@BV=%EWonq49I(@7}xv3PmA~3mJ(rg)>vFUZr>uDjst4q=h4+F@8%{S6>Ok-q$ wv%&7Xqb-w*_zgGo^1~-2Cer`+PnK^`yxy)!-!uL|garSoC}_%mku?kaf6Zo*+yDRo literal 0 HcmV?d00001 From f14ef9fbe84c6b4236c81df5d0dadf2f53e12c61 Mon Sep 17 00:00:00 2001 From: Bob Mader Date: Fri, 26 Sep 2025 13:22:09 -0500 Subject: [PATCH 3/5] add some more terms --- taxonomy/README.md | 68 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 57 insertions(+), 11 deletions(-) diff --git a/taxonomy/README.md b/taxonomy/README.md index f7448bf..41197cb 100644 --- a/taxonomy/README.md +++ b/taxonomy/README.md @@ -8,11 +8,11 @@ The taxonomy defines the functional areas enabled by the DCM architectural as fi The top-level domains are defined as follows: -1. **Developer Experience** - This domain focuses on the unified interface that developers and application owners use to interact with DCM. It includes the self-service catalog, templates, and all user-facing documentation. This is where the DCM abstractions are consumed. Multi-tenancy is experienced at this level. -2. **Control Plane** - This is the central nervous system of DCM. It provides the unified API and maintains the DCM data model including the inventory of resources. It also enforces authentication and role-based access control. -3. **Orchestration & Automation** - This domain contains the code and workflows for provisioning and managing resources. It provides the engines that execute commands from the control plane to interact with the underlying Composable Infrastructure. -4. **Composable Infrastructure** - This domain represents the physical and virtual assets in the data center. It includes the compute, storage, and networking resources that are managed by the automation domain. -5. **Governance & FinOps** - This domain is a set of overarching requirements that ensure that DCM operations are secure, compliant, and cost-effective. It encompasses policy management, real-time metrics, and cost allocation. +1. **Developer Experience** - This domain delivers the Unified interface that Developers and Application Owners use to request and manage Services from DCM. It includes the Service Catalog listing the available Services. Multi-tenancy is experienced at this level. +2. **Control Plane** - This is the central nervous system of DCM. It maintains the Unified API and Data Model including the inventory of Fulfilled Services. It also enforces authentication and role-based access control. +3. **Orchestration & Automation** - This domain contains the code and workflows for provisioning and managing the Resources required to Fulfill Sefvice request. It provides the engines that execute requests from the Control Plane and translates those into API calls supported by specific Infrastructure Platforms hosted under the Composable Infrastructure domain. +4. **Composable Infrastructure** - This domain represents the physical and virtual assets in the data center. This is where the basic compute, storage and networking Resources are provisioned. +5. **Governance & FinOps** - This domain is the set of overarching requirements that ensure DCM operations are secure, compliant, and cost-effective. It encompasses policy management, real-time metrics, and cost allocation. Everything in the DCM architecture exists under one of these domains. @@ -30,10 +30,28 @@ DCM is a complex technology architecture stretching from the depths of bare meta The vocabulary we use to define this architecture demands precision and clarity. By allowing a term to have a distinct, contextual definition within each architectural domain, we can eliminating ambiguity even when using the same words. -For example, the "resource" a developer requests for their application is a logical entity, for example, a "Web App Service." However, the "resource" that the Infrastructure Operations team manages is a physical asset like a specific VM with a particular IP address. By providing distinct definitions for the same term in each domain, we confusion as we navigate through the architectural domains. +For example, the "resource" a developer requests for their application is a logical entity, for example, a "Web App Service." However, the "resource" that the Infrastructure Operations team manages is a physical asset like a specific VM with a particular IP address. By providing distinct definitions for the same term in each domain, we avoid confusion as we navigate through the architectural domains. When adding new terms to the vocabulary, take care to map the terms to the roles and functions relevant to each applicable domain. +### Application + +An Application is a defined collection of Services used to deploy a self-contained software solution designed to meet a specific business purpose. An Application is full-stack product typically including a front-end user interface, business logic, data storage, and potentially network interfaces to other Applications. + +### Data Model + +The Data Model defines the scope of Unified data within the Control Plane. The Data Model includes static data as well as event data such as the history of Fulfilled Service requests and time series data such as Workload usage metrics. Data Model does not mean database, but rather is a broader term meaning the scope of any data supporting the DCM architecture. While static data may be stored using a traditional database service, data from Service requests is better sent to an event logging service and usage metrics would be more suitably captured and stored in a time series data platform. + +The Data Model also includes code, for example, the YAML data that defines the Resources and other parameters of Service Catalog item. Any data that is maintained as code would be managed and stored using Git repositories. + +Dynamic data also falls under the scope of the Data Model. For example, the state of a provisioned Resource is data, but it is not stored, per se. Dynamic data may be queried using the Unified API. + +### Infrastructure Platform + +Infrastructure Platforms refer to the Data Center infrastructure and platforms that provide Resources within the Composable Infrastructure domain. An Infrastructure Platform may be physical hardware or a software platform, for example, bare metal servers, network gear, storage arrays, virtualization platforms, Kubernetes clusters, etc. Each Infrastructure Platform defines the physical and/or virtual Resources it supports, such as compute, storage, network, VM instances, Kubernetes cluster objects, etc. + +An Infrastructure Platform provides an API used by a Service Provider to provision, decommission, make state changes to and enable discovery of the Resources it supports. Infrastructure Platforms must also expose event logging and metrics collection to the Governance & FinOps domain required to support monitoring, observability and billing. + ### Multi-tenant DCM multi-tenancy is experienced at the Developer Experience domain and enforced by the Control Plane. @@ -42,19 +60,47 @@ The Orchestration & Automation and Composable Infrastructure domains operate in The Governance & FinOps domain has access to the tenant-wide scope required to implement policy management, monitoring and billing. +### Placement + +Workload Placement policies are managed within the Governance & FinOps domain and enforced within the Control Plane domain. + +### Region + +A Region is a large, geographically distinct area that hosts Resources. It can be a single Data Center or a group of Data Centers in close proximity. Regions should be designed as physically and logically independent from other Regions. This design is crucial for disaster recovery and business continuity, so a failure in one region doesn't affect another. + +### Service + +In the absence of further context, a Service is the specific capability defined by a Service Catalog item within the Developer Experience domain. Services provide the underlying Resources that Applications rely on. They are often designed to be reusable for multiple Applications. A Service could simply define a single underlying Resource, but more capable Services will define a configuration of many connected Resources. Compound Services may be defined by composing a number of simple Services under a single Service Catalog item. + +Take care not confuse Services as defined above with what Service Providers deliver within the Composable Infrastructure domain. Contrary to what the name implies, Service Providers define and provision Resources, not Services. If you must, you could say Service Providers manage Infrastructure Services. Likewise, other services should also be disambiguated, for example, DNS service, database service, room service, etc. + +### Service Provider + +Service Providers support provisioning and management of Resources required to Fulfill Service requests from the Control Plane in a way that is agnostic to the implementations of different Infrastructure Platforms. Service Providers implement the Naturalization required to translate Unified API requests from the Control Plane into an Infrastructure Platform’s native API and the Denaturalization required to translate native API responses into responses that comply with the Unified API. + +Service Providers will typically be implemented to support a single specific Infrastructure Platform. However, a Service Provider could also be implemented to support a class of Infrastructure Platforms, for example, one Service Provider supporting a number of different virtualization platforms. + ### User -In the absence of further context, a "User" is the human consumer of cloud computing resources and services experiencing DCM from the Developer Experience domain. Of course, other humans "use" DCM within the other domains, so consider using Developer or Application Owner instead. +In the absence of further context, a User is the human consumer of cloud computing resources and services experiencing DCM from the Developer Experience domain. Of course, other humans "use" DCM within the other domains, so consider using Developer or Application Owner instead. + +To avoid confusion, avoid using User when referring to humans acting within the the other DCM domains. Consider more specific persona alternative terms such as Platform Engineer, Infrastructure Operations, Policy Owner, Risk and Compliance Manager, etc. + +### Workload -To avoid confusion, avoid using "User" when referring to humans acting within the the other DCM domains. Consider more specific persona alternative terms such as Platform Engineer, Infrastructure Operations, Risk and Compliance Manager, etc. +A Workload is a running instance of a Service that has been Fulfilled at the request of a User in the Developer Experience domain. A Workload is composed of the provisioned Resources required by the Service. The State and usage of the Workload's Resources are monitored by tools in the Governance & FinOps domain to enable observability and billing for Services. -### Workload placement +### Zone -Workload placement policies are managed within the Governance & FinOps domain and enforced within the Control Plane domain. +Also known as an Availability Zone, a Zone is an isolated group of Resources within a Region. Each Region consists of one or more Zones. A Zone is a separate physical facility with its own power, cooling, and networking, ensuring that a problem in one Zone, like a power outage or a localized fire, doesn't impact other Zones in the same Region. By deploying Resources across multiple Zones within a single Region, high availability and fault tolerance can be achieved for Services and Applications. Zones are defined by Infrastructure Platforms and can be namespaces, clusters or anything that results in its Resources being isolated as spelled out above. ## Anti-vocabulary -FIXME: explain what is anti-vocabulary. +The goal of the anti-vocabulary is to encourage clarity and discipline in technical communication by pointing out ambiguous terms to avoid while explaining the concrete reasons and offering clear alternatives to consider instead. + +### Data Center + +The term Data Center isn't relevant from a DCM architecture perspective. It is simply a building that provides the roof over an arbitrary collection of physical infrastructure. Consider using the more architecturally meaningful terms Region and Zone. ### Realize From bfc80dfa4838f2b88ba5d08c802f75826aa065a1 Mon Sep 17 00:00:00 2001 From: Bob Mader Date: Thu, 6 Nov 2025 13:27:29 -0600 Subject: [PATCH 4/5] refactor domains based on Adam's draw.io picture make Value the "zero domain" --- taxonomy/README.md | 29 +++++++++++++++-------------- taxonomy/images/layer_cake.png | Bin 33480 -> 30361 bytes 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/taxonomy/README.md b/taxonomy/README.md index 41197cb..f97c822 100644 --- a/taxonomy/README.md +++ b/taxonomy/README.md @@ -1,17 +1,18 @@ # Taxonomy of DCM -This taxonomy of DCM achieves three key goals. First, it defines the top-level domains that distinguish the functions and roles of the DCM architecture. Next, it defines a specific vocabulary with the intent of enabling precision and clarity by eliminating ambiguity. Finally, an "anti-vocabulary" defines a list of ambiguous phrases and "weasel words" to avoid and recommends more specific terms to use instead. +This taxonomy of DCM achieves three key goals. First, it defines the top-level domains that distinguish the functions and roles of the DCM architecture. Next, it defines a specific vocabulary with the intent of enabling precision and clarity by eliminating ambiguity. Finally, an "anti-vocabulary" defines a list of ambiguous phrases and "weasel words" to avoid and recommends more specific terms to use instead. ## Top-level architectural domains -The taxonomy defines the functional areas enabled by the DCM architectural as five top-level domains. Each domain maps a set of DCM services and resources defined by the architecture to the different roles and teams across an organization that experience them. +The taxonomy defines the functional areas enabled by the DCM architectural as six top-level domains. Each domain maps a set of DCM capabilities defined by the architecture to the different roles and teams across an organization that experience them. The top-level domains are defined as follows: -1. **Developer Experience** - This domain delivers the Unified interface that Developers and Application Owners use to request and manage Services from DCM. It includes the Service Catalog listing the available Services. Multi-tenancy is experienced at this level. +0. **Value** - The "zero domain" recognizes the business value achieved through the abstract capabilities enabled by the end-to-end architecture, for example, improved security and compliance, accelerated software deployments and cost saving thanks to reduced operational toil. +1. **Application** - This domain delivers the Unified interface that Developers and Application Owners use to request and manage Services from DCM. It includes the Service Catalog listing the available Services. Multi-tenancy is experienced at this level. 2. **Control Plane** - This is the central nervous system of DCM. It maintains the Unified API and Data Model including the inventory of Fulfilled Services. It also enforces authentication and role-based access control. -3. **Orchestration & Automation** - This domain contains the code and workflows for provisioning and managing the Resources required to Fulfill Sefvice request. It provides the engines that execute requests from the Control Plane and translates those into API calls supported by specific Infrastructure Platforms hosted under the Composable Infrastructure domain. -4. **Composable Infrastructure** - This domain represents the physical and virtual assets in the data center. This is where the basic compute, storage and networking Resources are provisioned. +3. **Resource** - This domain contains the code and workflows for provisioning and managing the Resources required to Fulfill Service request. It provides the engines that execute requests from the Control Plane and translates those into API calls supported by specific Infrastructure Platforms hosted under the Data Center domain. +4. **Data Center** - This domain represents the physical and virtual composable infrastructure in the data center. This is where the basic compute, storage and networking resources are provisioned. 5. **Governance & FinOps** - This domain is the set of overarching requirements that ensure DCM operations are secure, compliant, and cost-effective. It encompasses policy management, real-time metrics, and cost allocation. Everything in the DCM architecture exists under one of these domains. @@ -20,13 +21,13 @@ How these domains are connected can be easily understood using a layer cake anal ![Layer cake analogy drawing described below](./images/layer_cake.png) -Each layer of cake represents a domain that interacts only with the domains directly above and below it. For example, the architecture prohibits a direct connection from the Developer Experience domain to the Orchestration & Automation domain, Instead, Developer Experience must always use the Control Plane to request and manage resources available from the lower domains. +Each layer of cake represents a domain that interacts only with the domains directly above and below it. For example, the architecture prohibits a direct connection from the Application domain to the Resource domain, Instead, capabilities under the Application domain must always use the Control Plane to request and manage resources available from the lower domains. The exception to this rule is the Governance & FinOps domain. It is the frosting of our cake and it touches all the layers. This aligns with the overarching functions of the Governance & FinOps domain requiring observability at every level of the architecture. ## Vocabulary -DCM is a complex technology architecture stretching from the depths of bare metal on data center floor up to the high-level abstractions required to achieve secure multi-tenancy in the service of cloud consuming application owners and developers. +DCM is a complex technology architecture stretching from the depths of bare metal on the data center floor up to the high-level abstractions required to achieve secure multi-tenancy in the service of cloud consuming application owners and developers. The vocabulary we use to define this architecture demands precision and clarity. By allowing a term to have a distinct, contextual definition within each architectural domain, we can eliminating ambiguity even when using the same words. @@ -48,15 +49,15 @@ Dynamic data also falls under the scope of the Data Model. For example, the stat ### Infrastructure Platform -Infrastructure Platforms refer to the Data Center infrastructure and platforms that provide Resources within the Composable Infrastructure domain. An Infrastructure Platform may be physical hardware or a software platform, for example, bare metal servers, network gear, storage arrays, virtualization platforms, Kubernetes clusters, etc. Each Infrastructure Platform defines the physical and/or virtual Resources it supports, such as compute, storage, network, VM instances, Kubernetes cluster objects, etc. +Infrastructure Platforms refer to the Data Center infrastructure and platforms that provide Resources within the Data Center domain. An Infrastructure Platform may be physical hardware or a software platform, for example, bare metal servers, network gear, storage arrays, virtualization platforms, Kubernetes clusters, etc. Each Infrastructure Platform defines the physical and/or virtual Resources it supports, such as compute, storage, network, VM instances, Kubernetes cluster objects, etc. An Infrastructure Platform provides an API used by a Service Provider to provision, decommission, make state changes to and enable discovery of the Resources it supports. Infrastructure Platforms must also expose event logging and metrics collection to the Governance & FinOps domain required to support monitoring, observability and billing. ### Multi-tenant -DCM multi-tenancy is experienced at the Developer Experience domain and enforced by the Control Plane. +DCM multi-tenancy is experienced at the Application domain and enforced by the Control Plane. -The Orchestration & Automation and Composable Infrastructure domains operate in "privileged mode” to implement the isolation and confinement required for multi-tenancy. +The Resource and Data Center domains operate in "privileged mode" to implement the isolation and confinement required for multi-tenancy. The Governance & FinOps domain has access to the tenant-wide scope required to implement policy management, monitoring and billing. @@ -70,9 +71,9 @@ A Region is a large, geographically distinct area that hosts Resources. It can b ### Service -In the absence of further context, a Service is the specific capability defined by a Service Catalog item within the Developer Experience domain. Services provide the underlying Resources that Applications rely on. They are often designed to be reusable for multiple Applications. A Service could simply define a single underlying Resource, but more capable Services will define a configuration of many connected Resources. Compound Services may be defined by composing a number of simple Services under a single Service Catalog item. +In the absence of further context, a Service is the specific capability defined by a Service Catalog item within the Application domain. Services provide the underlying Resources that Applications rely on. They are often designed to be reusable for multiple Applications. A Service could simply define a single underlying Resource, but more capable Services will define a configuration of many connected Resources. Compound Services may be defined by composing a number of simple Services under a single Service Catalog item. -Take care not confuse Services as defined above with what Service Providers deliver within the Composable Infrastructure domain. Contrary to what the name implies, Service Providers define and provision Resources, not Services. If you must, you could say Service Providers manage Infrastructure Services. Likewise, other services should also be disambiguated, for example, DNS service, database service, room service, etc. +Take care not confuse Services as defined above with what Service Providers deliver within the Data Center domain. Contrary to what the name implies, Service Providers define and provision Resources, not Services. If you must, you could say Service Providers manage Infrastructure Services. Likewise, other services should also be disambiguated, for example, DNS service, database service, room service, etc. ### Service Provider @@ -82,13 +83,13 @@ Service Providers will typically be implemented to support a single specific Inf ### User -In the absence of further context, a User is the human consumer of cloud computing resources and services experiencing DCM from the Developer Experience domain. Of course, other humans "use" DCM within the other domains, so consider using Developer or Application Owner instead. +In the absence of further context, a User is the human consumer of cloud computing resources and services experiencing DCM from the Application domain. Of course, other humans "use" DCM within the other domains, so consider using Developer or Application Owner instead. To avoid confusion, avoid using User when referring to humans acting within the the other DCM domains. Consider more specific persona alternative terms such as Platform Engineer, Infrastructure Operations, Policy Owner, Risk and Compliance Manager, etc. ### Workload -A Workload is a running instance of a Service that has been Fulfilled at the request of a User in the Developer Experience domain. A Workload is composed of the provisioned Resources required by the Service. The State and usage of the Workload's Resources are monitored by tools in the Governance & FinOps domain to enable observability and billing for Services. +A Workload is a running instance of a Service that has been Fulfilled at the request of a User in the Application domain. A Workload is composed of the provisioned Resources required by the Service. The State and usage of the Workload's Resources are monitored by tools in the Governance & FinOps domain to enable observability and billing for Services. ### Zone diff --git a/taxonomy/images/layer_cake.png b/taxonomy/images/layer_cake.png index e036d4c1481afbe380fa1119ebc701f43c56b6db..99ea3797ea2899209fba8352c47c5c9706fe12b8 100644 GIT binary patch literal 30361 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 TNF0G{Wf2eMRAmdLO#=T9RJs&x literal 33480 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 From 457df4c4f2179d35c4bad0130b8386d1c7bade29 Mon Sep 17 00:00:00 2001 From: Bob Mader Date: Fri, 7 Nov 2025 14:53:13 -0600 Subject: [PATCH 5/5] fix term definitions --- taxonomy/README.md | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/taxonomy/README.md b/taxonomy/README.md index f97c822..e09b3c6 100644 --- a/taxonomy/README.md +++ b/taxonomy/README.md @@ -10,8 +10,8 @@ The top-level domains are defined as follows: 0. **Value** - The "zero domain" recognizes the business value achieved through the abstract capabilities enabled by the end-to-end architecture, for example, improved security and compliance, accelerated software deployments and cost saving thanks to reduced operational toil. 1. **Application** - This domain delivers the Unified interface that Developers and Application Owners use to request and manage Services from DCM. It includes the Service Catalog listing the available Services. Multi-tenancy is experienced at this level. -2. **Control Plane** - This is the central nervous system of DCM. It maintains the Unified API and Data Model including the inventory of Fulfilled Services. It also enforces authentication and role-based access control. -3. **Resource** - This domain contains the code and workflows for provisioning and managing the Resources required to Fulfill Service request. It provides the engines that execute requests from the Control Plane and translates those into API calls supported by specific Infrastructure Platforms hosted under the Data Center domain. +2. **Control Plane** - This is the central nervous system of DCM. It maintains the Unified API and Data Model including the inventory of Fulfilled Services. It also implements the authentication and role-based access control required to enforce multi-tenancy. +3. **Resource** - This domain contains the code and workflows for provisioning and managing the resources required to Fulfill Service request. It provides the engines that execute requests from the Control Plane and translates those into API calls supported by specific Infrastructure Platforms hosted under the Data Center domain. 4. **Data Center** - This domain represents the physical and virtual composable infrastructure in the data center. This is where the basic compute, storage and networking resources are provisioned. 5. **Governance & FinOps** - This domain is the set of overarching requirements that ensure DCM operations are secure, compliant, and cost-effective. It encompasses policy management, real-time metrics, and cost allocation. @@ -37,21 +37,21 @@ When adding new terms to the vocabulary, take care to map the terms to the roles ### Application -An Application is a defined collection of Services used to deploy a self-contained software solution designed to meet a specific business purpose. An Application is full-stack product typically including a front-end user interface, business logic, data storage, and potentially network interfaces to other Applications. +An Application is a defined collection of Services configured to deploy a self-contained software solution designed to meet a specific business purpose. An Application is full-stack product typically including a front-end user interface, business logic, data storage, and potentially network interfaces to other Applications. ### Data Model -The Data Model defines the scope of Unified data within the Control Plane. The Data Model includes static data as well as event data such as the history of Fulfilled Service requests and time series data such as Workload usage metrics. Data Model does not mean database, but rather is a broader term meaning the scope of any data supporting the DCM architecture. While static data may be stored using a traditional database service, data from Service requests is better sent to an event logging service and usage metrics would be more suitably captured and stored in a time series data platform. +The Data Model defines the scope of Unified Data within the Control Plane. The Data Model includes static data as well as event data such as the history of Fulfilled Service requests and time series data such as Workload usage metrics. Data Model does not mean database, but rather is a broader term meaning the scope of any data supporting the DCM architecture. While Static Data may be stored using a traditional database service, Event Data from Service requests could be better sent to a logging service and Usage Metrics Data might be more suitably captured and stored using a time series data platform. -The Data Model also includes code, for example, the YAML data that defines the Resources and other parameters of Service Catalog item. Any data that is maintained as code would be managed and stored using Git repositories. +Code may also be considered in the scope of the Data Model such as the Infrastructure-as-Code used to define Compound Services and should be managed using GitOps practices. -Dynamic data also falls under the scope of the Data Model. For example, the state of a provisioned Resource is data, but it is not stored, per se. Dynamic data may be queried using the Unified API. +Dynamic Data also falls under the scope of the Data Model, for example, the current state of a provisioned resource. Dynamic Data can be directly queried using the Unified API and it may also be cached. ### Infrastructure Platform -Infrastructure Platforms refer to the Data Center infrastructure and platforms that provide Resources within the Data Center domain. An Infrastructure Platform may be physical hardware or a software platform, for example, bare metal servers, network gear, storage arrays, virtualization platforms, Kubernetes clusters, etc. Each Infrastructure Platform defines the physical and/or virtual Resources it supports, such as compute, storage, network, VM instances, Kubernetes cluster objects, etc. +Infrastructure Platforms refer to the Data Center infrastructure and platforms that provide resources within the Data Center domain. An Infrastructure Platform may be physical hardware or a software platform, for example, bare metal servers, network gear, storage arrays, virtualization platforms, Kubernetes clusters, etc. Each Infrastructure Platform defines the physical and/or virtual resources it supports, such as compute, storage, network, VM instances, Kubernetes cluster objects, etc. -An Infrastructure Platform provides an API used by a Service Provider to provision, decommission, make state changes to and enable discovery of the Resources it supports. Infrastructure Platforms must also expose event logging and metrics collection to the Governance & FinOps domain required to support monitoring, observability and billing. +An Infrastructure Platform provides an API used by a Service Provider to provision, decommission, make state changes to and enable discovery of the resources it supports. Infrastructure Platforms must also expose event logging and metrics collection to the Governance & FinOps domain required to support monitoring, observability and billing. ### Multi-tenant @@ -67,33 +67,35 @@ Workload Placement policies are managed within the Governance & FinOps domain an ### Region -A Region is a large, geographically distinct area that hosts Resources. It can be a single Data Center or a group of Data Centers in close proximity. Regions should be designed as physically and logically independent from other Regions. This design is crucial for disaster recovery and business continuity, so a failure in one region doesn't affect another. +A Region is a large, geographically distinct area that hosts resources. It can be a single Data Center or a group of Data Centers in close proximity. Regions should be designed as physically and logically independent from other Regions. This design is crucial for disaster recovery and business continuity, so a failure in one region doesn't affect another. ### Service -In the absence of further context, a Service is the specific capability defined by a Service Catalog item within the Application domain. Services provide the underlying Resources that Applications rely on. They are often designed to be reusable for multiple Applications. A Service could simply define a single underlying Resource, but more capable Services will define a configuration of many connected Resources. Compound Services may be defined by composing a number of simple Services under a single Service Catalog item. +A Service is the specific capability supported by a Service Catalog item within the Application domain. Services provide the underlying resources that Applications rely on. -Take care not confuse Services as defined above with what Service Providers deliver within the Data Center domain. Contrary to what the name implies, Service Providers define and provision Resources, not Services. If you must, you could say Service Providers manage Infrastructure Services. Likewise, other services should also be disambiguated, for example, DNS service, database service, room service, etc. +Service Catalog items supporting Atomic Services are defined by Service Providers and tightly coupled to a provided resource. Compound Services can be defined to provides a configuration of any combination of Atomic Services making it possible for a single Service Catalog item to provide arbitrarily complex Application environments. ### Service Provider -Service Providers support provisioning and management of Resources required to Fulfill Service requests from the Control Plane in a way that is agnostic to the implementations of different Infrastructure Platforms. Service Providers implement the Naturalization required to translate Unified API requests from the Control Plane into an Infrastructure Platform’s native API and the Denaturalization required to translate native API responses into responses that comply with the Unified API. +Service Providers support provisioning and management of resources required to Fulfill Service requests from the Control Plane in a way that is agnostic to the implementations of different Infrastructure Platforms. Service Providers implement the Naturalization required to translate Unified API requests from the Control Plane into an Infrastructure Platform's native API and the Denaturalization required to translate native API responses into responses that comply with the Unified API. Service Providers will typically be implemented to support a single specific Infrastructure Platform. However, a Service Provider could also be implemented to support a class of Infrastructure Platforms, for example, one Service Provider supporting a number of different virtualization platforms. +To support Fulfillment of Service requests requiring any resources they provide, Service Providers define the Service Catalog items for those resources to be exposed by the Control Plane. + ### User -In the absence of further context, a User is the human consumer of cloud computing resources and services experiencing DCM from the Application domain. Of course, other humans "use" DCM within the other domains, so consider using Developer or Application Owner instead. +In the absence of further context, the User is the human consumer of cloud computing Services experiencing DCM within the Application domain using the APIs (or Web UI) of the Control Plane. Of course, other humans "use" DCM within the other domains, so consider more specific terms like Developer or Application Owner instead. -To avoid confusion, avoid using User when referring to humans acting within the the other DCM domains. Consider more specific persona alternative terms such as Platform Engineer, Infrastructure Operations, Policy Owner, Risk and Compliance Manager, etc. +To avoid confusion, refrain from saying User when referring to humans acting within the the other DCM domains. Consider more specific persona alternative terms such as Platform Engineer, Infrastructure Operations, Policy Owner, Risk and Compliance Manager, etc. ### Workload -A Workload is a running instance of a Service that has been Fulfilled at the request of a User in the Application domain. A Workload is composed of the provisioned Resources required by the Service. The State and usage of the Workload's Resources are monitored by tools in the Governance & FinOps domain to enable observability and billing for Services. +A Workload is a running instance of a Service that has been Fulfilled at the request of a User in the Application domain. A Workload is composed of the provisioned resources required by the Service. The State and usage of the Workload's resources are monitored by tools in the Governance & FinOps domain to enable observability and billing for Services. ### Zone -Also known as an Availability Zone, a Zone is an isolated group of Resources within a Region. Each Region consists of one or more Zones. A Zone is a separate physical facility with its own power, cooling, and networking, ensuring that a problem in one Zone, like a power outage or a localized fire, doesn't impact other Zones in the same Region. By deploying Resources across multiple Zones within a single Region, high availability and fault tolerance can be achieved for Services and Applications. Zones are defined by Infrastructure Platforms and can be namespaces, clusters or anything that results in its Resources being isolated as spelled out above. +Also known as an Availability Zone, a Zone is an isolated group of resources within a Region. Each Region consists of one or more Zones. A Zone is a separate physical facility with its own power, cooling, and networking, ensuring that a problem in one Zone, like a power outage or a localized fire, doesn't impact other Zones in the same Region. By deploying resources across multiple Zones within a single Region, high availability and fault tolerance can be achieved for Services and Applications. Zones are defined by Infrastructure Platforms and can be namespaces, clusters or anything that results in its resources being isolated as spelled out above. ## Anti-vocabulary @@ -101,7 +103,7 @@ The goal of the anti-vocabulary is to encourage clarity and discipline in techni ### Data Center -The term Data Center isn't relevant from a DCM architecture perspective. It is simply a building that provides the roof over an arbitrary collection of physical infrastructure. Consider using the more architecturally meaningful terms Region and Zone. +The term Data Center is somewhat irrelevant from a DCM architecture perspective. It is simply a building that provides the roof over an arbitrary collection of physical infrastructure. Consider using the more architecturally meaningful terms Region and Zone. ### Realize