<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<style type="text/css" style="display:none"><!--P{margin-top:0;margin-bottom:0;} .ms-cui-menu {background-color:#ffffff;border:1px rgb(171, 171, 171) solid;font-family:'Segoe UI WPC', 'Segoe UI', Tahoma, 'Microsoft Sans Serif', Verdana, sans-serif;font-size:11pt;color:rgb(51, 51, 51);} .ms-cui-menusection-title {display:none;} .ms-cui-ctl {vertical-align:text-top;text-decoration:none;color:rgb(51, 51, 51);} .ms-cui-ctl-on {background-color:rgb(223, 237, 250);opacity: 0.8;} .ms-cui-img-cont-float {display:inline-block;margin-top:2px} .ms-cui-smenu-inner {padding-top:0px;} .ms-owa-paste-option-icon {margin: 2px 4px 0px 4px;vertical-align:sub;padding-bottom: 2px;display:inline-block;} .ms-rtePasteFlyout-option:hover {background-color:rgb(223, 237, 250) !important;opacity:1 !important;} .ms-rtePasteFlyout-option {padding:8px 4px 8px 4px;outline:none;} .ms-cui-menusection {float:left; width:85px;height:24px;overflow:hidden}.wf {speak:none; font-weight:normal; font-variant:normal; text-transform:none; -webkit-font-smoothing:antialiased; vertical-align:middle; display:inline-block;}.wf-family-owa {font-family:'o365Icons'}@font-face {  font-family:'o365IconsIE8';  src:url('prem/15.0.913.23/resources/styles/office365icons.ie8.eot?#iefix') format('embedded-opentype'),         url('prem/15.0.913.23/resources/styles/office365icons.ie8.woff') format('woff'),         url('prem/15.0.913.23/resources/styles/office365icons.ie8.ttf') format('truetype');  font-weight:normal;  font-style:normal;}@font-face {  font-family:'o365IconsMouse';  src:url('prem/15.0.913.23/resources/styles/office365icons.mouse.eot?#iefix') format('embedded-opentype'),         url('prem/15.0.913.23/resources/styles/office365icons.mouse.woff') format('woff'),         url('prem/15.0.913.23/resources/styles/office365icons.mouse.ttf') format('truetype');  font-weight:normal;  font-style:normal;}.wf-family-owa {font-family:'o365IconsMouse'}.ie8 .wf-family-owa {font-family:'o365IconsIE8'}.ie8 .wf-owa-play-large:before {content:'\e254';}.notIE8 .wf-owa-play-large:before {content:'\e054';}.ie8 .wf-owa-play-large {color:#FFFFFF/*$WFWhiteColor*/;}.notIE8 .wf-owa-play-large {border-color:#FFFFFF/*$WFWhiteColor*/; width:1.4em; height:1.4em; border-width:.1em; border-style:solid; border-radius:.8em; text-align:center; box-sizing:border-box; -moz-box-sizing:border-box; padding:0.1em; color:#FFFFFF/*$WFWhiteColor*/;}.ie8 .wf-size-play-large {width:40px; height:40px; font-size:30px}.notIE8 .wf-size-play-large {width:40px; height:40px; font-size:30px}--></style>
</head>
<body dir="ltr">
<div style="font-size:12pt;color:#000000;background-color:#FFFFFF;font-family:Calibri,Arial,Helvetica,sans-serif;">
<p></p>
<div>Hi all,</div>
<div><br>
</div>
<div>I've been making steady progress on the pieces of the delegation PoC that I volunteered for.  Here's the usual design doc for reference.</div>
<div><br>
</div>
<div>https://docs.google.com/document/d/1ksDilJYXV-5AXWON8PLMedDKr9NpS8VbT0jIy_MIEtI/edit#</div>
<div><br>
</div>
<div>My main tasks were to spearhead the creation of a skeleton for this work and to work on the conversion of Datalog to LP.</div>
<div>- The skeleton has already been merged; you can find it in congress/policy_engines/vm_placement.py.</div>
<div>- The quite rough implementation of converting Datalog to LP can be found in review.</div>
<div><br>
</div>
<div>This note aims to give some details of the Datalog-to-LP conversion code so that others working on the PoC have the context for working on their pieces.  Here are the relevant patches.</div>
<div><br>
</div>
<div>https://review.openstack.org/#/c/155537/</div>
<div>https://review.openstack.org/#/c/157612/</div>
<div>https://review.openstack.org/#/c/170311/</div>
<div><br>
</div>
<div>The toplevel routine for converting Datalog to LP is vm_placement.py:ComputePlacementEngine.policy_to_lp().  It returns two things: a formula to optimize and a list of constraints that must be satisfied.</div>
<div><br>
</div>
<div>For example, the test in congress/tests/policy_engines/test_vmplacement.py:TestPolicyToLp.test_policy_to_lp starts with the following policy.</div>
<div><br>
</div>
<div>warning(id) :-</div>
<div>    nova:host(id, zone, memory_capacity),</div>
<div>    legacy:special_zone(zone),</div>
<div>    ceilometer:mem_consumption(id, avg),</div>
<div>    mul(0.75, memory_capacity, three_quarters_mem),</div>
<div>    lt(avg, three_quarters_mem)</div>
<div><br>
</div>
<div>and the following data</div>
<div><br>
</div>
<div>nova:host(123, 1, 10)</div>
<div>nova:host(456, 1, 10)</div>
<div>nova:server(789, "alice", 123)</div>
<div>nova:server(101, "bob", 123)</div>
<div>legacy:special_zone(1)</div>
<div>ceilometer:mem_consumption(123, 15)</div>
<div>ceilometer:mem_consumption(456, 20)</div>
<div><br>
</div>
<div>The call to policy_to_lp() returns (1) the optimization criteria, which aims to minimize the numer of warnings and (2) the set of hard constraints that must be satisfied.  The code returns the following.  (The syntax needs to be changed so that the VM
 placement engine utilizes the LP solver interface that we decide on.  So the main thing to take away from what follows is just seeing that we can take Datalog as input and output what is conceptually an LP program.)</div>
<div><br>
</div>
<div>1. the optimization criteria: (u'warning', 456) + (u'warning', 123)</div>
<div><br>
</div>
<div>Here the term (u'warning, 456) is an LP variable that is defined to be true exactly when warning(456) is true in the policy.  And we're using + in the usual LP way, meaning that we want to minimize the sum of those variables.  (These are the Yi in the
 google doc.)</div>
<div><br>
</div>
<div>2. the hard constraints:</div>
<div><br>
</div>
<div>First we're defining the (u'warning, 456) LP decision variables to be true exactly when warning(456) is true in the policy: when the host's memory usage is less than 75% of its capacity.</div>
<div><br>
</div>
<div>(u'warning', 456) = (u'lt', u'memUsage[456]', 7.5)</div>
<div>(u'warning', 123) = (u'lt', u'memUsage[123]', 7.5)</div>
<div><br>
</div>
<div>In this case (u'lt', u'memUsage[456]', 7.5) is equivalent to memUsage[456] < 7.5, where memUsage[456] is an LP decision variable.  (Just noticed that I'm using 2 different syntaxes to represent LP decision variables, but that's not a huge deal since the
 syntax is just a placeholder anyway.)</div>
<div><br>
</div>
<div>Second we're codifying the relationship between memory usage for guests and memory usage for hosts and the assignment of guests to hosts.  These are the domain specific axioms we discussed.</div>
<div><br>
</div>
<div>('hMemUse', 456) = ('assign', 789, 456) * ('gMemUse', 789) + ('assign', 101, 456) * ('gMemUse', 101)</div>
<div>('hMemUse', 123) = ('assign', 789, 123) * ('gMemUse', 789) + ('assign', 101, 123) * ('gMemUse', 101)</div>
<div><br>
</div>
<div>Here ('assign', 789, 456) is the LP decision variable that says guest 789 is assigned host 456.</div>
<div>('gMemUse', 789) is the memory usage of guest 789.</div>
<div><br>
</div>
<div>(I'm sure we're missing some hard constraints, but I think we've got the hardest ones worked out.)</div>
<div><br>
</div>
<div>I'm on vacation all week and will be back at work next Tuesday.  I'll try to check email, but I won't be checking into any code/bugs in depth.  I just wanted to let everyone know what I've been up to so I'm not holding anyone up working on their piece
 of the PoC.</div>
<div><br>
</div>
<div>Tim​<br>
</div>
<div><br>
</div>
<p><br>
</p>
</div>
</body>
</html>