<div dir="ltr">Hi Matt<div><br></div><div>> <span style="font-family:Calibri,sans-serif;font-size:14.6667px">Define variables+values in regular CRDs/Kustomize resources (rather than standalone transformer files)<br>We can do it only with default implementation of 'vars'</span></div><div><br></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6667px">> Use normal Kustomize layering to override variable definitions an arbitrary number of times (e.g. function, composite, type levels)</span><span style="font-family:Calibri,sans-serif;font-size:14.6667px"><br></span></div><div><font face="Calibri, sans-serif"><span style="font-size:14.6667px">Default vars can not be refined multiple times due to this piece of code [0] which is used  here [1]</span></font></div><div><font face="Calibri, sans-serif"><span style="font-size:14.6667px"><br></span></font></div><div><font face="Calibri, sans-serif"><span style="font-size:14.6667px">> </span></font><span style="font-family:Calibri,sans-serif;font-size:14.6667px">Wait till layering is fully rendered before doing variable substitution<br>This is actually how it's implemented for default 'vars' [1]. Unfortunately kustomize transformer plugins are executed at resource accumulation phase.</span></div><div><font face="Calibri, sans-serif"><span style="font-size:14.6667px">If resource is a directory new instance of KustTarget object is created [2] so there is no connection between parent and child plugins. Therefore we have 2 options:</span></font></div><div><font face="Calibri, sans-serif"><span style="font-size:14.6667px">1. put all variables at highest possible layer to avoid overrides</span></font></div><div><font face="Calibri, sans-serif"><span style="font-size:14.6667px">2. move common parts of functions to template without defined vars and include this template to child function which has defined variables. This actually leads to some portion of code duplication</span></font></div><div><br></div><div><font face="Calibri, sans-serif"><span style="font-size:14.6667px">> </span></font><span style="font-family:Calibri,sans-serif;font-size:14.6667px">Avoid deploying these variable catalog CRDs to the cluster, via e.g. via an “</span><a href="http://airshipit.org/no-deploy" target="_blank" style="font-family:Calibri,sans-serif;font-size:14.6667px">airshipit.org/no-deploy</a><span style="font-family:Calibri,sans-serif;font-size:14.6667px">” label<br>Not an issue and can be implemented as a part of document filtering.</span></div><div><font face="Calibri, sans-serif"><span style="font-size:14.6667px"><br></span></font></div><div><font face="Calibri, sans-serif"><span style="font-size:14.6667px"><br></span></font></div><div><font face="Calibri, sans-serif"><span style="font-size:14.6667px">[0] </span></font><a href="https://github.com/kubernetes-sigs/kustomize/blob/v3.2.0/pkg/types/var.go#L142">https://github.com/kubernetes-sigs/kustomize/blob/v3.2.0/pkg/types/var.go#L142</a><br>[1] <a href="https://github.com/kubernetes-sigs/kustomize/blob/v3.2.0/pkg/target/kusttarget.go#L243">https://github.com/kubernetes-sigs/kustomize/blob/v3.2.0/pkg/target/kusttarget.go#L243</a></div><div><span style="font-family:Calibri,sans-serif;font-size:14.6667px">[2] </span><a href="https://github.com/kubernetes-sigs/kustomize/blob/v3.2.0/pkg/target/kusttarget.go#L327">https://github.com/kubernetes-sigs/kustomize/blob/v3.2.0/pkg/target/kusttarget.go#L327</a></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Feb 12, 2020 at 10:04 PM MCEUEN, MATT <<a href="mailto:MM9745@att.com">MM9745@att.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">





<div lang="EN-US">
<div class="gmail-m_-8150606026214308584WordSection1">
<p class="MsoNormal">Team, I wanted to continue the discussion around Kustomize-based variable substitution from Monday’s SIG-YAML design call.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">There are two main Deckhand-like features we need out of Kustomize:  Layering and Substitution. 
<u></u><u></u></p>
<ul style="margin-top:0in" type="disc">
<li class="gmail-m_-8150606026214308584MsoListParagraph" style="margin-left:0in">Layering is something Kustomize does really well, via strategic merge. 
<u></u><u></u></li><li class="gmail-m_-8150606026214308584MsoListParagraph" style="margin-left:0in">Substitution is what's presenting some challenges, between custom plugins being unable to do late binding on variables (i.e., you only get one shot at a tree substitution using our
 VarReference plugin), and the fact that the Kustomize team is not really interested in enhancing variable capabilities overall.<u></u><u></u></li></ul>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">For one-shot-tree-substitution:  can we reframe the substitution problem as a layering problem?  If we:<u></u><u></u></p>
<ol style="margin-top:0in" start="1" type="1">
<li class="gmail-m_-8150606026214308584MsoListParagraph" style="margin-left:0in">Define variables+values in regular CRDs/Kustomize resources (rather than standalone transformer files)<u></u><u></u></li><li class="gmail-m_-8150606026214308584MsoListParagraph" style="margin-left:0in">Use normal Kustomize layering to override variable definitions an arbitrary number of times (e.g. function, composite, type levels)<u></u><u></u></li><li class="gmail-m_-8150606026214308584MsoListParagraph" style="margin-left:0in">Wait till layering is fully rendered before doing variable substitution<u></u><u></u></li><li class="gmail-m_-8150606026214308584MsoListParagraph" style="margin-left:0in">Avoid deploying these variable catalog CRDs to the cluster, via e.g. via an “<a href="http://airshipit.org/no-deploy" target="_blank">airshipit.org/no-deploy</a>” label<u></u><u></u></li></ol>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Then I think we would be able to accomplish multiple overrides for YAML tree variables, and recursive variable references, at the same time.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">#3 above then would require either a new plugin (Dmitry: does that sound possible?) or some kind of post-Kustomize step to fill in variables.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Am I missing anything?<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Thanks,<u></u><u></u></p>
<p class="MsoNormal">Matt<u></u><u></u></p>
</div>
</div>

_______________________________________________<br>
Airship-discuss mailing list<br>
<a href="mailto:Airship-discuss@lists.airshipit.org" target="_blank">Airship-discuss@lists.airshipit.org</a><br>
<a href="http://lists.airshipit.org/cgi-bin/mailman/listinfo/airship-discuss" rel="noreferrer" target="_blank">http://lists.airshipit.org/cgi-bin/mailman/listinfo/airship-discuss</a></blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div>Kind regards<div>Dmitry Ukov</div><div>Principal Deployment Engineer</div><div><div>Mirantis, Inc.</div></div><div><br></div></div></div></div>