<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 15 (filtered medium)">
<style><!--
/* Font Definitions */
@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;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:0in;
        margin-left:.5in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;
        mso-ligatures:none;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:121459117;
        mso-list-type:hybrid;
        mso-list-template-ids:72406254 -1079503936 134807577 134807579 134807567 134807577 134807579 134807567 134807577 134807579;}
@list l0:level1
        {mso-level-text:"%1\)";
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:.75in;
        text-indent:-.25in;}
@list l0:level2
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:1.25in;
        text-indent:-.25in;}
@list l0:level3
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        margin-left:1.75in;
        text-indent:-9.0pt;}
@list l0:level4
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:2.25in;
        text-indent:-.25in;}
@list l0:level5
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:2.75in;
        text-indent:-.25in;}
@list l0:level6
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        margin-left:3.25in;
        text-indent:-9.0pt;}
@list l0:level7
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:3.75in;
        text-indent:-.25in;}
@list l0:level8
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        margin-left:4.25in;
        text-indent:-.25in;}
@list l0:level9
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        margin-left:4.75in;
        text-indent:-9.0pt;}
@list l1
        {mso-list-id:365178025;
        mso-list-type:hybrid;
        mso-list-template-ids:2065077890 134807575 134807577 134807579 134807567 134807577 134807579 134807567 134807577 134807579;}
@list l1:level1
        {mso-level-number-format:alpha-lower;
        mso-level-text:"%1\)";
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l1:level2
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l1:level3
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l1:level4
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l1:level5
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l1:level6
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l1:level7
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l1:level8
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l1:level9
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l2
        {mso-list-id:1842770746;
        mso-list-type:hybrid;
        mso-list-template-ids:1319638798 134807575 134807577 134807579 134807567 134807577 134807579 134807567 134807577 134807579;}
@list l2:level1
        {mso-level-number-format:alpha-lower;
        mso-level-text:"%1\)";
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l2:level2
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l2:level3
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l2:level4
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l2:level5
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l2:level6
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l2:level7
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l2:level8
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l2:level9
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l3
        {mso-list-id:1898125308;
        mso-list-type:hybrid;
        mso-list-template-ids:1712231676 134807575 134807577 134807579 134807567 134807577 134807579 134807567 134807577 134807579;}
@list l3:level1
        {mso-level-number-format:alpha-lower;
        mso-level-text:"%1\)";
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l3:level2
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l3:level3
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l3:level4
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l3:level5
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l3:level6
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l3:level7
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l3:level8
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l3:level9
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
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-GB" link="#0563C1" vlink="#954F72" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">A long message, because it is an entire proposal that we should discuss this Friday:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">I think we finally have the Sunfish reference repo updated to recognize a new Agent registering itself with the Sunfish Service by sending an event with the appropriate eventID
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:Consolas;color:#1F2328">"MessageId": "Manager.1.0.AggregationSourceDiscovered"<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Next we need the Sunfish Service to extract the inventory of resources being managed / represented by the new Agent.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">The old write up “OFMF_server_and Agent_interactions_based_on_events” lists two options by which the Sunfish Service might accomplish this:<o:p></o:p></span></p>
<ol style="margin-top:0in" start="1" type="1">
<li class="MsoListParagraph" style="margin-left:.25in;mso-list:l0 level1 lfo1"><span lang="EN-US">Sunfish grabs a Snapshot synchronization from the agent<o:p></o:p></span></li><ol style="margin-top:0in" start="1" type="a">
<li class="MsoListParagraph" style="margin-left:.25in;mso-list:l0 level2 lfo1"><span lang="EN-US">Sunfish does an acknowledgement of some kind to the Agent, and the Agent sends a subsequent Event with a payload of Redfish Objects that the Agent wants the Sunfish
 Service to install into its resource tree.<o:p></o:p></span></li><li class="MsoListParagraph" style="margin-left:.25in;mso-list:l0 level2 lfo1"><span lang="EN-US">Sunfish unpacks the possibly lengthy Event payload and does the install of each object<o:p></o:p></span></li><li class="MsoListParagraph" style="margin-left:.25in;mso-list:l0 level2 lfo1"><span lang="EN-US">I have several questions about the details, but I’m not going to bring them up here.<o:p></o:p></span></li></ol>
<li class="MsoListParagraph" style="margin-left:.25in;mso-list:l0 level1 lfo1"><span lang="EN-US">Sunfish does Recursive Inspection to crawl-out the Redfish model of the Agent’s resources.<o:p></o:p></span></li><ol style="margin-top:0in" start="1" type="a">
<li class="MsoListParagraph" style="margin-left:.25in;mso-list:l0 level2 lfo1"><span lang="EN-US">Sunfish starts querying the Agent’s Redfish resources, and chasing down all linked resources until it has a copy of the Agent’s Redfish resource tree.<o:p></o:p></span></li></ol>
</ol>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Both options have similar burdens on the Agent to assign Redfish IDs and craft navigation links as required.  I’m not sure that either tactic saves the Agent or Sunfish much work.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">The two big differences:<o:p></o:p></span></p>
<ol style="margin-top:0in" start="1" type="a">
<li class="MsoListParagraph" style="margin-left:0in;mso-list:l2 level1 lfo3"><span lang="EN-US">Snapshot synchronization requires a deep dive into failure cases:  If Sunfish cannot parse one object in a 100 object payload, what do we do to recover?  Recursive
 Inspection can follow all the rules for single objects; we can apply different policies in Sunfish and not have to alter the Agent – Sunfish interface (it’s still just Redfish).  <o:p></o:p></span></li><li class="MsoListParagraph" style="margin-left:0in;mso-list:l2 level1 lfo3"><span lang="EN-US">Recursive Inspection lacks the atomic read feature:  if the Agent’s resources change state while Sunfish is issuing multiple GETs, Sunfish and the Agent may not
 end up in sync without additional policies to guarantee a ‘snapshot’ result.<o:p></o:p></span></li></ol>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">I’d like to propose that #2, Recursive Inspection is the easier technique to implement and is a more robust method when working with different agents and different fabrics.  The need to resolve non-atomic queries is present
 at runtime anyway, so we may need to solve that problem just once, for all fabrics and all agents and clients.  #1 will require additional ‘Events’ in the Sunfish – Agent interface. #2 may require we start tracking change events before Sunfish starts making
 queries.  The latter seems easier to do at the moment.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Regardless of which way we go on the above option for Agent inventory discovery by Sunfish, we need to get that block of code written and installed into the Sunfish reference.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">My proposal:<o:p></o:p></span></p>
<ol style="margin-top:0in" start="1" type="a">
<li class="MsoListParagraph" style="margin-left:0in;mso-list:l1 level1 lfo4"><span lang="EN-US">We use Recursive Inspection<o:p></o:p></span></li><li class="MsoListParagraph" style="margin-left:0in;mso-list:l1 level1 lfo4"><span lang="EN-US">We create a self-invoked task inside Sunfish upon receipt of the agent registration event<o:p></o:p></span></li><li class="MsoListParagraph" style="margin-left:0in;mso-list:l1 level1 lfo4"><span lang="EN-US">We write a Recursive Inspection routine that starts at the Fabrics Collection of the Agent, and finds all the endpoints of the fabric and all the related objects
<o:p></o:p></span></li><ol style="margin-top:0in" start="1" type="a">
<li class="MsoListParagraph" style="margin-left:0in;mso-list:l1 level2 lfo4"><span lang="EN-US">Agents tag each retrieved object as ‘clean’ and arm the notification event to Sunfish upon sending the object in the response
<o:p></o:p></span></li><li class="MsoListParagraph" style="margin-left:0in;mso-list:l1 level2 lfo4"><span lang="EN-US">Recursive Inspection creates Systems and Chassis and other collections as required to place all linked fabric endpoints<o:p></o:p></span></li><li class="MsoListParagraph" style="margin-left:0in;mso-list:l1 level2 lfo4"><span lang="EN-US">Recursive Inspection needs some mechanism to make new objects ‘not ready for use’ until all recursion is finished<o:p></o:p></span></li></ol>
<li class="MsoListParagraph" style="margin-left:0in;mso-list:l1 level1 lfo4"><span lang="EN-US">We test this Recursive Inspection process by launching it against a Swordfish Emulator that is sourcing a suitable default storage fabric mockup<o:p></o:p></span></li><ol style="margin-top:0in" start="1" type="a">
<li class="MsoListParagraph" style="margin-left:0in;mso-list:l1 level2 lfo4"><span lang="EN-US">We fire up little testbed which brings up a Sunfish emulator, a Swordfish emulator, and sends the Sunfish emulator an appropriately configured Event registering
 the Swordfish emulator as the new AggregationSource and triggering the Recursive Inspection
<o:p></o:p></span></li><li class="MsoListParagraph" style="margin-left:0in;mso-list:l1 level2 lfo4"><span lang="EN-US">All the GETS from Sunfish to Swordfish should work<o:p></o:p></span></li><li class="MsoListParagraph" style="margin-left:0in;mso-list:l1 level2 lfo4"><span lang="EN-US">The storage mockups should end up in the Sunfish resource tree<o:p></o:p></span></li></ol>
<li class="MsoListParagraph" style="margin-left:0in;mso-list:l1 level1 lfo4"><span lang="EN-US">We extend this testbed into an actual Swordfish Appliance Agent by creating the appropriate enhancements to a copy of the Swordfish Emulator<o:p></o:p></span></li><ol style="margin-top:0in" start="1" type="a">
<li class="MsoListParagraph" style="margin-left:0in;mso-list:l1 level2 lfo4"><span lang="EN-US">This will define the ‘architected rules’ that an existing Swordfish API hosted directly on a Swordfish storage appliance would have to follow to allow Sunfish to
 proxy all API and Events to the end clients.<o:p></o:p></span></li><li class="MsoListParagraph" style="margin-left:0in;mso-list:l1 level2 lfo4"><span lang="EN-US">This will define the role that a shim Swordfish Agent must serve when coupling Sunfish to a Swordfish Appliance API that isn’t strictly compliant to Sunfish requirements.<o:p></o:p></span></li></ol>
</ol>
<p class="MsoListParagraph" style="margin-left:1.5in;text-indent:-1.5in;mso-text-indent-alt:-9.0pt;mso-list:l1 level3 lfo4">
<![if !supportLists]><span lang="EN-US"><span style="mso-list:Ignore"><span style="font:7.0pt "Times New Roman"">                                                   
</span>i.<span style="font:7.0pt "Times New Roman"">     </span></span></span><![endif]><span lang="EN-US">IE, when the Swordfish API of an existing appliance cannot be modified to register with Sunfish and let Sunfish proxy the API to clients, we need a simple
 shim layer that fills in the gaps<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Once we have this Recursive Inspection block working, we can mockup multiple fabric Agents by using different fabric mockups on the Agent emulator.
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">The code for recursive crawl through of a fabric’s resources can be leveraged for use as a client-side resource discovery routine, with appropriate additions or subtractions to properly interpret the sought after resources
 (like FAM or NVMeoF or GPUs) or ignore irrelevant resources.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">If we can agree on this path forward, then we can negotiate who will write the Recursive Inspection block and build the Sunfish-Agent testbed pieces….<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Thoughts?<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">Russ<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"> <o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
</div>
</body>
</html>