<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 12 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
span.apple-style-span
        {mso-style-name:apple-style-span;}
span.hoenzb
        {mso-style-name:hoenzb;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:"Courier New";}
span.k
        {mso-style-name:k;}
span.nc
        {mso-style-name:nc;}
span.p
        {mso-style-name:p;}
span.n
        {mso-style-name:n;}
span.o
        {mso-style-name:o;}
span.sd
        {mso-style-name:sd;}
span.mi
        {mso-style-name:mi;}
span.bp
        {mso-style-name:bp;}
span.s
        {mso-style-name:s;}
span.nb
        {mso-style-name:nb;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.25in 1.0in 1.25in;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:596527121;
        mso-list-template-ids:-185816594;}
@list l0:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:.5in;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">Hi<o:p></o:p></p>
<p class="MsoNormal">I think we violate the DRY principal  quite heavily when we define the data constraints  in 3 different locations.<o:p></o:p></p>
<p class="MsoNormal">Here is an example:<span style="color:#1F497D"> (focusing on the ‘type’ field of ‘HealthMonitor’)</span><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><u><span style="color:#1F497D">1- </span>DB layer:<o:p></o:p></u></p>
<pre style="line-height:10.9pt"><span class="k"><b><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">class</span></b></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> </span><span class="nc"><b><span style="font-size:9.0pt;font-family:Consolas;color:#445588;border:none windowtext 1.0pt;padding:0in">HealthMonitor</span></b></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">(</span></span><span class="n"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">model_base</span></span><span class="o"><b><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">.</span></b></span><span class="n"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">BASEV2</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">,</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> <span class="n"><span style="border:none windowtext 1.0pt;padding:0in">models_v2</span></span><span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">.</span></b></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">HasId</span></span><span class="p"><span style="border:none windowtext 1.0pt;padding:0in">,</span></span> <span class="n"><span style="border:none windowtext 1.0pt;padding:0in">models_v2</span></span><span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">.</span></b></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">HasTenant</span></span><span class="p"><span style="border:none windowtext 1.0pt;padding:0in">):</span></span><o:p></o:p></span></pre>
<pre style="line-height:10.9pt"><span style="font-size:9.0pt;font-family:Consolas;color:#333333">    </span><span class="sd"><span style="font-size:9.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">"""Represents a v2 quantum loadbalancer healthmonitor."""</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"><o:p></o:p></span></pre>
<pre style="mso-line-height-alt:10.9pt"><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333">    </span></b><span class="nb"><b><span style="font-size:12.0pt;font-family:Consolas;color:#0086B3;border:none windowtext 1.0pt;padding:0in">type</span></b></span><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333"> <span class="o"><span style="border:none windowtext 1.0pt;padding:0in">=</span></span> <span class="n"><span style="border:none windowtext 1.0pt;padding:0in">sa</span></span><span class="o"><span style="border:none windowtext 1.0pt;padding:0in">.</span></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">Column</span></span><span class="p"><span style="border:none windowtext 1.0pt;padding:0in">(</span></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">sa</span></span><span class="o"><span style="border:none windowtext 1.0pt;padding:0in">.</span></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">Enum</span></span><span class="p"><span style="border:none windowtext 1.0pt;padding:0in">(</span></span></span></b><span class="s"><b><span style="font-size:12.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">"PING"</span></b></span><span class="p"><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">,</span></b></span><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333"> </span></b><span class="s"><b><span style="font-size:12.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">"TCP"</span></b></span><span class="p"><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">,</span></b></span><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333"> </span></b><span class="s"><b><span style="font-size:12.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">"HTTP"</span></b></span><span class="p"><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">,</span></b></span><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333"> </span></b><span class="s"><b><span style="font-size:12.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">"HTTPS"</span></b></span><span class="p"><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">,</span></b></span><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333"><o:p></o:p></span></b></pre>
<pre style="mso-line-height-alt:10.9pt"><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333">                             <span class="n"><span style="border:none windowtext 1.0pt;padding:0in">name</span></span><span class="o"><span style="border:none windowtext 1.0pt;padding:0in">=</span></span></span></b><span class="s"><b><span style="font-size:12.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">"healthmontiors_type"</span></b></span><span class="p"><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">),</span></b></span><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333"><o:p></o:p></span></b></pre>
<pre style="mso-line-height-alt:10.9pt"><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333">                     <span class="n"><span style="border:none windowtext 1.0pt;padding:0in">nullable</span></span><span class="o"><span style="border:none windowtext 1.0pt;padding:0in">=</span></span></span></b><span class="bp"><b><span style="font-size:12.0pt;font-family:Consolas;color:#999999;border:none windowtext 1.0pt;padding:0in">False</span></b></span><span class="p"><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">)</span></b></span><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333"><o:p></o:p></span></b></pre>
<pre style="line-height:10.9pt"><span style="font-size:9.0pt;font-family:Consolas;color:#333333">    <span class="n"><span style="border:none windowtext 1.0pt;padding:0in">delay</span></span> <span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">=</span></b></span> <span class="n"><span style="border:none windowtext 1.0pt;padding:0in">sa</span></span><span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">.</span></b></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">Column</span></span><span class="p"><span style="border:none windowtext 1.0pt;padding:0in">(</span></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">sa</span></span><span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">.</span></b></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">Integer</span></span><span class="p"><span style="border:none windowtext 1.0pt;padding:0in">,</span></span> <span class="n"><span style="border:none windowtext 1.0pt;padding:0in">nullable</span></span><span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">=</span></b></span></span><span class="bp"><span style="font-size:9.0pt;font-family:Consolas;color:#999999;border:none windowtext 1.0pt;padding:0in">False</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">)</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"><o:p></o:p></span></pre>
<pre style="line-height:10.9pt"><span style="font-size:9.0pt;font-family:Consolas;color:#333333">    <span class="n"><span style="border:none windowtext 1.0pt;padding:0in">timeout</span></span> <span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">=</span></b></span> <span class="n"><span style="border:none windowtext 1.0pt;padding:0in">sa</span></span><span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">.</span></b></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">Column</span></span><span class="p"><span style="border:none windowtext 1.0pt;padding:0in">(</span></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">sa</span></span><span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">.</span></b></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">Integer</span></span><span class="p"><span style="border:none windowtext 1.0pt;padding:0in">,</span></span> <span class="n"><span style="border:none windowtext 1.0pt;padding:0in">nullable</span></span><span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">=</span></b></span></span><span class="bp"><span style="font-size:9.0pt;font-family:Consolas;color:#999999;border:none windowtext 1.0pt;padding:0in">False</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">)</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"><o:p></o:p></span></pre>
<pre style="line-height:10.9pt"><span style="font-size:9.0pt;font-family:Consolas;color:#333333">    <span class="n"><span style="border:none windowtext 1.0pt;padding:0in">max_retries</span></span> <span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">=</span></b></span> <span class="n"><span style="border:none windowtext 1.0pt;padding:0in">sa</span></span><span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">.</span></b></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">Column</span></span><span class="p"><span style="border:none windowtext 1.0pt;padding:0in">(</span></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">sa</span></span><span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">.</span></b></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">Integer</span></span><span class="p"><span style="border:none windowtext 1.0pt;padding:0in">,</span></span> <span class="n"><span style="border:none windowtext 1.0pt;padding:0in">nullable</span></span><span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">=</span></b></span></span><span class="bp"><span style="font-size:9.0pt;font-family:Consolas;color:#999999;border:none windowtext 1.0pt;padding:0in">False</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">)</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"><o:p></o:p></span></pre>
<pre style="line-height:10.9pt"><span style="font-size:9.0pt;font-family:Consolas;color:#333333">    <span class="n"><span style="border:none windowtext 1.0pt;padding:0in">http_method</span></span> <span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">=</span></b></span> <span class="n"><span style="border:none windowtext 1.0pt;padding:0in">sa</span></span><span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">.</span></b></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">Column</span></span><span class="p"><span style="border:none windowtext 1.0pt;padding:0in">(</span></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">sa</span></span><span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">.</span></b></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">String</span></span><span class="p"><span style="border:none windowtext 1.0pt;padding:0in">(</span></span></span><span class="mi"><span style="font-size:9.0pt;font-family:Consolas;color:#009999;border:none windowtext 1.0pt;padding:0in">16</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">))</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"><o:p></o:p></span></pre>
<pre style="line-height:10.9pt"><span style="font-size:9.0pt;font-family:Consolas;color:#333333">    <span class="n"><span style="border:none windowtext 1.0pt;padding:0in">url_path</span></span> <span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">=</span></b></span> <span class="n"><span style="border:none windowtext 1.0pt;padding:0in">sa</span></span><span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">.</span></b></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">Column</span></span><span class="p"><span style="border:none windowtext 1.0pt;padding:0in">(</span></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">sa</span></span><span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">.</span></b></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">String</span></span><span class="p"><span style="border:none windowtext 1.0pt;padding:0in">(</span></span></span><span class="mi"><span style="font-size:9.0pt;font-family:Consolas;color:#009999;border:none windowtext 1.0pt;padding:0in">255</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">))</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"><o:p></o:p></span></pre>
<pre style="line-height:10.9pt"><span style="font-size:9.0pt;font-family:Consolas;color:#333333">    <span class="n"><span style="border:none windowtext 1.0pt;padding:0in">expected_codes</span></span> <span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">=</span></b></span> <span class="n"><span style="border:none windowtext 1.0pt;padding:0in">sa</span></span><span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">.</span></b></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">Column</span></span><span class="p"><span style="border:none windowtext 1.0pt;padding:0in">(</span></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">sa</span></span><span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">.</span></b></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">String</span></span><span class="p"><span style="border:none windowtext 1.0pt;padding:0in">(</span></span></span><span class="mi"><span style="font-size:9.0pt;font-family:Consolas;color:#009999;border:none windowtext 1.0pt;padding:0in">64</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">))</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"><o:p></o:p></span></pre>
<pre style="line-height:10.9pt"><span style="font-size:9.0pt;font-family:Consolas;color:#333333">    <span class="n"><span style="border:none windowtext 1.0pt;padding:0in">status</span></span> <span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">=</span></b></span> <span class="n"><span style="border:none windowtext 1.0pt;padding:0in">sa</span></span><span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">.</span></b></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">Column</span></span><span class="p"><span style="border:none windowtext 1.0pt;padding:0in">(</span></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">sa</span></span><span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">.</span></b></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">String</span></span><span class="p"><span style="border:none windowtext 1.0pt;padding:0in">(</span></span></span><span class="mi"><span style="font-size:9.0pt;font-family:Consolas;color:#009999;border:none windowtext 1.0pt;padding:0in">16</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">),</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> <span class="n"><span style="border:none windowtext 1.0pt;padding:0in">nullable</span></span><span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">=</span></b></span></span><span class="bp"><span style="font-size:9.0pt;font-family:Consolas;color:#999999;border:none windowtext 1.0pt;padding:0in">False</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">)</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"><o:p></o:p></span></pre>
<pre style="line-height:10.9pt"><span style="font-size:9.0pt;font-family:Consolas;color:#333333">    <span class="n"><span style="border:none windowtext 1.0pt;padding:0in">admin_state_up</span></span> <span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">=</span></b></span> <span class="n"><span style="border:none windowtext 1.0pt;padding:0in">sa</span></span><span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">.</span></b></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">Column</span></span><span class="p"><span style="border:none windowtext 1.0pt;padding:0in">(</span></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">sa</span></span><span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">.</span></b></span><span class="n"><span style="border:none windowtext 1.0pt;padding:0in">Boolean</span></span><span class="p"><span style="border:none windowtext 1.0pt;padding:0in">(),</span></span> <span class="n"><span style="border:none windowtext 1.0pt;padding:0in">nullable</span></span><span class="o"><b><span style="border:none windowtext 1.0pt;padding:0in">=</span></b></span></span><span class="bp"><span style="font-size:9.0pt;font-family:Consolas;color:#999999;border:none windowtext 1.0pt;padding:0in">False</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">)</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"><o:p></o:p></span></pre>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><u><span style="color:#1F497D">2- </span>API layer:<o:p></o:p></u></p>
<pre style="line-height:10.9pt"><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> </span><span class="s"><span style="font-size:9.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">'health_monitors'</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">:</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> <span class="p"><span style="border:none windowtext 1.0pt;padding:0in">{</span></span><o:p></o:p></span></pre>
<pre style="line-height:10.9pt"><span style="font-size:9.0pt;font-family:Consolas;color:#333333">        </span><span class="s"><span style="font-size:9.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">'id'</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">:</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> <span class="p"><span style="border:none windowtext 1.0pt;padding:0in">{</span></span></span><span class="s"><span style="font-size:9.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">'allow_post'</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">:</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> </span><span class="bp"><span style="font-size:9.0pt;font-family:Consolas;color:#999999;border:none windowtext 1.0pt;padding:0in">False</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">,</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> </span><span class="s"><span style="font-size:9.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">'allow_put'</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">:</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> </span><span class="bp"><span style="font-size:9.0pt;font-family:Consolas;color:#999999;border:none windowtext 1.0pt;padding:0in">False</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">,</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"><o:p></o:p></span></pre>
<pre style="line-height:10.9pt"><span style="font-size:9.0pt;font-family:Consolas;color:#333333">               </span><span class="s"><span style="font-size:9.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">'validate'</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">:</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> <span class="p"><span style="border:none windowtext 1.0pt;padding:0in">{</span></span></span><span class="s"><span style="font-size:9.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">'type:uuid'</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">:</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> </span><span class="bp"><span style="font-size:9.0pt;font-family:Consolas;color:#999999;border:none windowtext 1.0pt;padding:0in">None</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">},</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"><o:p></o:p></span></pre>
<pre style="line-height:10.9pt"><span style="font-size:9.0pt;font-family:Consolas;color:#333333">               </span><span class="s"><span style="font-size:9.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">'is_visible'</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">:</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> </span><span class="bp"><span style="font-size:9.0pt;font-family:Consolas;color:#999999;border:none windowtext 1.0pt;padding:0in">True</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">},</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"><o:p></o:p></span></pre>
<pre style="line-height:10.9pt"><span style="font-size:9.0pt;font-family:Consolas;color:#333333">        </span><span class="s"><span style="font-size:9.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">'tenant_id'</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">:</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> <span class="p"><span style="border:none windowtext 1.0pt;padding:0in">{</span></span></span><span class="s"><span style="font-size:9.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">'allow_post'</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">:</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> </span><span class="bp"><span style="font-size:9.0pt;font-family:Consolas;color:#999999;border:none windowtext 1.0pt;padding:0in">True</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">,</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> </span><span class="s"><span style="font-size:9.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">'allow_put'</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">:</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> </span><span class="bp"><span style="font-size:9.0pt;font-family:Consolas;color:#999999;border:none windowtext 1.0pt;padding:0in">False</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">,</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"><o:p></o:p></span></pre>
<pre style="line-height:10.9pt"><span style="font-size:9.0pt;font-family:Consolas;color:#333333">                      </span><span class="s"><span style="font-size:9.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">'validate'</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">:</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> <span class="p"><span style="border:none windowtext 1.0pt;padding:0in">{</span></span></span><span class="s"><span style="font-size:9.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">'type:string'</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">:</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> </span><span class="bp"><span style="font-size:9.0pt;font-family:Consolas;color:#999999;border:none windowtext 1.0pt;padding:0in">None</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">},</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"><o:p></o:p></span></pre>
<pre style="line-height:10.9pt"><span style="font-size:9.0pt;font-family:Consolas;color:#333333">                      </span><span class="s"><span style="font-size:9.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">'required_by_policy'</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">:</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> </span><span class="bp"><span style="font-size:9.0pt;font-family:Consolas;color:#999999;border:none windowtext 1.0pt;padding:0in">True</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">,</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"><o:p></o:p></span></pre>
<pre style="line-height:10.9pt"><span style="font-size:9.0pt;font-family:Consolas;color:#333333">                      </span><span class="s"><span style="font-size:9.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">'is_visible'</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">:</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> </span><span class="bp"><span style="font-size:9.0pt;font-family:Consolas;color:#999999;border:none windowtext 1.0pt;padding:0in">True</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">},</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"><o:p></o:p></span></pre>
<pre style="mso-line-height-alt:10.9pt"><span style="font-size:12.0pt;font-family:Consolas;color:#333333">        </span><span class="s"><b><span style="font-size:12.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">'type'</span></b></span><span class="p"><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">:</span></b></span><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333"> <span class="p"><span style="border:none windowtext 1.0pt;padding:0in">{</span></span></span></b><span class="s"><b><span style="font-size:12.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">'allow_post'</span></b></span><span class="p"><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">:</span></b></span><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333"> </span></b><span class="bp"><b><span style="font-size:12.0pt;font-family:Consolas;color:#999999;border:none windowtext 1.0pt;padding:0in">True</span></b></span><span class="p"><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">,</span></b></span><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333"> </span></b><span class="s"><b><span style="font-size:12.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">'allow_put'</span></b></span><span class="p"><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">:</span></b></span><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333"> </span></b><span class="bp"><b><span style="font-size:12.0pt;font-family:Consolas;color:#999999;border:none windowtext 1.0pt;padding:0in">False</span></b></span><span class="p"><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">,</span></b></span><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333"><o:p></o:p></span></b></pre>
<pre style="mso-line-height-alt:10.9pt"><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333">                 </span></b><span class="s"><b><span style="font-size:12.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">'validate'</span></b></span><span class="p"><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">:</span></b></span><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333"> <span class="p"><span style="border:none windowtext 1.0pt;padding:0in">{</span></span></span></b><span class="s"><b><span style="font-size:12.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">'type:values'</span></b></span><span class="p"><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">:</span></b></span><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333"> <span class="p"><span style="border:none windowtext 1.0pt;padding:0in">[</span></span></span></b><span class="s"><b><span style="font-size:12.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">'PING'</span></b></span><span class="p"><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">,</span></b></span><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333"> </span></b><span class="s"><b><span style="font-size:12.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">'TCP'</span></b></span><span class="p"><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">,</span></b></span><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333"> </span></b><span class="s"><b><span style="font-size:12.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">'HTTP'</span></b></span><span class="p"><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">,</span></b></span><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333"> </span></b><span class="s"><b><span style="font-size:12.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">'HTTPS'</span></b></span><span class="p"><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">]},</span></b></span><b><span style="font-size:12.0pt;font-family:Consolas;color:#333333"><o:p></o:p></span></b></pre>
<pre style="line-height:10.9pt"><span style="font-size:9.0pt;font-family:Consolas;color:#333333">                 </span><span class="s"><span style="font-size:9.0pt;font-family:Consolas;color:#DD1144;border:none windowtext 1.0pt;padding:0in">'is_visible'</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">:</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> </span><span class="bp"><span style="font-size:9.0pt;font-family:Consolas;color:#999999;border:none windowtext 1.0pt;padding:0in">True</span></span><span class="p"><span style="font-size:9.0pt;font-family:Consolas;color:#333333;border:none windowtext 1.0pt;padding:0in">},</span></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"><o:p></o:p></span></pre>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><u><span style="color:#1F497D">3- </span>The UI layer:<o:p></o:p></u></p>
<p class="MsoNormal">In the UI the developer will probably will define this ‘type’  field as a combo box and will hard code the<span style="color:#1F497D">
</span>possible values (there is no other way since there is no {API | Config file}<span style="color:#1F497D">
</span>to get the constraints of an entity)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><u>What can we do?<o:p></o:p></u></p>
<p class="MsoNormal"><span style="color:#1F497D">T</span>he idea is to be able to define the constraints once and consume those constraints in the layers mentioned above.<span style="color:#1F497D"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal">#option 1:  define a “config” file that will contain the constraints  in Quantum. The API layer and the DB layer will consume this configuration. The UI will have to get a copy of this file (since it a different project)<o:p></o:p></p>
<p class="MsoNormal">#option 2:  define a “config” file that will contain the constraints  in Quantum. The API layer and the DB layer will consume this configuration. The UI will consume it remotely through REST API.<o:p></o:p></p>
<p class="MsoNormal">#option 3: do nothing … and keep duplication the constraints
<span style="font-family:Wingdings">L</span><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">It is obvious that option 2 is much “cleaner” but it requires extending the REST API.<span style="color:#1F497D"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal">Please let me know what do you think.<o:p></o:p></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal">Thanks<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Avishay<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
</div>
</body>
</html>