{"id":1646,"date":"2023-03-21T21:41:31","date_gmt":"2023-03-21T21:41:31","guid":{"rendered":"https:\/\/community.5gasp.eu\/?page_id=1646"},"modified":"2023-03-21T21:41:31","modified_gmt":"2023-03-21T21:41:31","slug":"day-1-and-day-2-vnf-operations","status":"publish","type":"page","link":"https:\/\/community.5gasp.eu\/index.php\/day-1-and-day-2-vnf-operations\/","title":{"rendered":"Day-1 and Day-2 VNF Operations"},"content":{"rendered":"\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Day-1 vs Day-2<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Day-1 is when you provide the guidelines to include all necessary elements in the VNF package to allow the services to be automatically initialized.<\/li>\n\n\n\n<li>Day-2 operations are designed to provide maintenance, like reconfiguration of services and monitoring.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"514\" height=\"200\" src=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-19.png\" alt=\"\" class=\"wp-image-1649\" srcset=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-19.png 514w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-19-300x117.png 300w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-19-512x200.png 512w\" sizes=\"auto, (max-width: 514px) 100vw, 514px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Code Used<\/h3>\n\n\n\n<p>This tutorial uses code from previous tutorials:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>VNF developed in &#8220;Build your VNF from scratch&#8221;<\/li>\n\n\n\n<li>Juju Charm developed in &#8220;Introducing OSM primitives and Juju Charms&#8221;<\/li>\n<\/ul>\n\n\n\n<p>Both are available <a href=\"https:\/\/github.com\/5gasp\/tutorials\">here<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Code modifications<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Basic structure<\/h4>\n\n\n\n<p>The first step is to download the resources from the previous tutorials.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"937\" height=\"448\" src=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-20.png\" alt=\"\" class=\"wp-image-1650\" srcset=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-20.png 937w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-20-300x143.png 300w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-20-768x367.png 768w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-20-611x292.png 611w\" sizes=\"auto, (max-width: 937px) 100vw, 937px\" \/><\/figure>\n\n\n\n<p>Notice that you are recreating the content of <strong><code>mod\/operator<\/code><\/strong> and <strong><code>mod\/charms.osm<\/code><\/strong>. This is not entirely mandatory, but if you don`t do this you might encounter some problems later, since the content of theses two directories was added via a git submodule.<\/p>\n\n\n\n<p>After running these commands, you should have the following structure (using the <strong><code>tree<\/code><\/strong> command):<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"935\" height=\"239\" src=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-21.png\" alt=\"\" class=\"wp-image-1651\" srcset=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-21.png 935w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-21-300x77.png 300w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-21-768x196.png 768w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-21-611x156.png 611w\" sizes=\"auto, (max-width: 935px) 100vw, 935px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">VNF Descriptor<\/h4>\n\n\n\n<p>file: <strong><code>tutorial_vnf\/tutorial_vnfd.yaml<\/code><\/strong><\/p>\n\n\n\n<p>Add the following content:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"937\" height=\"686\" src=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-22.png\" alt=\"\" class=\"wp-image-1652\" srcset=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-22.png 937w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-22-300x220.png 300w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-22-768x562.png 768w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-22-478x350.png 478w\" sizes=\"auto, (max-width: 937px) 100vw, 937px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Day 1 and day 2 operations are configured inside the tag <strong><code>lcm-operations-configuration<\/code><\/strong>.<\/li>\n\n\n\n<li>You need to map the primitives inside the <strong><code>config-primitive<\/code><\/strong> tag, as well as reference the vnf <strong><code>id<\/code><\/strong>.<\/li>\n\n\n\n<li>You also need to add the execution environment, with the reference to the connection point.<\/li>\n\n\n\n<li>After that, you need to define that this will be a proxy charm and add the ssh configurations.<\/li>\n\n\n\n<li>Notice that the <strong><code>ssh-hostname<\/code><\/strong> value (<strong><code>&lt;rw_mgmt_ip><\/code><\/strong>) is the tag that the OSM uses to get the vnf ip.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Actions<\/h4>\n\n\n\n<p>file: <strong><code>tutorial_vnf\/charms\/prometheus_node_exporter\/actions.yaml<\/code><\/strong><\/p>\n\n\n\n<p>Add the following actions:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"938\" height=\"242\" src=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-23.png\" alt=\"\" class=\"wp-image-1653\" srcset=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-23.png 938w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-23-300x77.png 300w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-23-768x198.png 768w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-23-611x158.png 611w\" sizes=\"auto, (max-width: 938px) 100vw, 938px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>This actions will be defined laterin the charm file.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Charm<\/h4>\n\n\n\n<p>file: <code><strong>tutorial_vnf\/charms\/prometheus_node_exporter\/src\/charm.py<\/strong><\/code><\/p>\n\n\n\n<p>Add the following content inside the <strong><code>__init__<\/code><\/strong> function:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"939\" height=\"377\" src=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-24.png\" alt=\"\" class=\"wp-image-1654\" srcset=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-24.png 939w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-24-300x120.png 300w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-24-768x308.png 768w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-24-611x245.png 611w\" sizes=\"auto, (max-width: 939px) 100vw, 939px\" \/><\/figure>\n\n\n\n<p>This maps the actions to a python function.<\/p>\n\n\n\n<p>Now, we need to add the functions:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"938\" height=\"583\" src=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-25.png\" alt=\"\" class=\"wp-image-1655\" srcset=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-25.png 938w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-25-300x186.png 300w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-25-768x477.png 768w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-25-563x350.png 563w\" sizes=\"auto, (max-width: 938px) 100vw, 938px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>You will need to replace the <strong><code>event<\/code><\/strong> calls with a logger, because OSM doesn&#8217;t support it when calling an action on boot.<\/p>\n\n\n\n<p>For that, import the logging module:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"937\" height=\"101\" src=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-26.png\" alt=\"\" class=\"wp-image-1656\" srcset=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-26.png 937w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-26-300x32.png 300w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-26-768x83.png 768w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-26-611x66.png 611w\" sizes=\"auto, (max-width: 937px) 100vw, 937px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Then,replace the event calls:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"937\" height=\"104\" src=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-27.png\" alt=\"\" class=\"wp-image-1657\" srcset=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-27.png 937w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-27-300x33.png 300w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-27-768x85.png 768w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-27-611x68.png 611w\" sizes=\"auto, (max-width: 937px) 100vw, 937px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Next, you will need to install the python packages manually, through a function that runs <strong><code>ssh<\/code><\/strong> commands.<\/p>\n\n\n\n<p>This is because OSM doesn&#8217;t do it automatically.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"938\" height=\"619\" src=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-28.png\" alt=\"\" class=\"wp-image-1658\" srcset=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-28.png 938w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-28-300x198.png 300w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-28-768x507.png 768w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-28-530x350.png 530w\" sizes=\"auto, (max-width: 938px) 100vw, 938px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Notice that we are calling the function before importing the <strong><code>SSHProxyCharm<\/code><\/strong> class, otherwise it will fail.<\/p>\n\n\n\n<p>After that, and since we want to automatically start the prometheus exporter once the VNF starts, we need to call it inside the VNF <strong><code>on_start<\/code><\/strong> function:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"936\" height=\"134\" src=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-29.png\" alt=\"\" class=\"wp-image-1659\" srcset=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-29.png 936w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-29-300x43.png 300w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-29-768x110.png 768w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-29-611x87.png 611w\" sizes=\"auto, (max-width: 936px) 100vw, 936px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Deployment<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Onboarding VNF and NSpackages<\/h4>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"937\" height=\"135\" src=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-30.png\" alt=\"\" class=\"wp-image-1660\" srcset=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-30.png 937w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-30-300x43.png 300w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-30-768x111.png 768w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-30-611x88.png 611w\" sizes=\"auto, (max-width: 937px) 100vw, 937px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Don&#8217;t forget to replace the <strong><code>--hostname<\/code><\/strong> option with your OSM IP.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Deploying the Network Service<\/h4>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"938\" height=\"415\" src=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-31.png\" alt=\"\" class=\"wp-image-1661\" srcset=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-31.png 938w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-31-300x133.png 300w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-31-768x340.png 768w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-31-611x270.png 611w\" sizes=\"auto, (max-width: 938px) 100vw, 938px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Debug your charm<\/h4>\n\n\n\n<p>You can check your charm deployment, inside your OSM machine, to make sure it is working:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"934\" height=\"154\" src=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-32.png\" alt=\"\" class=\"wp-image-1662\" srcset=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-32.png 934w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-32-300x49.png 300w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-32-768x127.png 768w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-32-611x101.png 611w\" sizes=\"auto, (max-width: 934px) 100vw, 934px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>If everything goes accordingly, you should have this:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"939\" height=\"338\" src=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-33.png\" alt=\"\" class=\"wp-image-1663\" srcset=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-33.png 939w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-33-300x108.png 300w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-33-768x276.png 768w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-33-611x220.png 611w\" sizes=\"auto, (max-width: 939px) 100vw, 939px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Now, you can test if the charm performed the desired operations:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"939\" height=\"431\" src=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-34.png\" alt=\"\" class=\"wp-image-1664\" srcset=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-34.png 939w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-34-300x138.png 300w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-34-768x353.png 768w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-34-611x280.png 611w\" sizes=\"auto, (max-width: 939px) 100vw, 939px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>You can try to execute the primitives via the OSM UI, just go to <strong>Action > Exec primitive<\/strong>:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"936\" height=\"359\" src=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-35.png\" alt=\"\" class=\"wp-image-1665\" srcset=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-35.png 936w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-35-300x115.png 300w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-35-768x295.png 768w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-35-611x234.png 611w\" sizes=\"auto, (max-width: 936px) 100vw, 936px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>After stopping the prometheus, you shloud have this:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"934\" height=\"212\" src=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-36.png\" alt=\"\" class=\"wp-image-1666\" srcset=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-36.png 934w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-36-300x68.png 300w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-36-768x174.png 768w, https:\/\/community.5gasp.eu\/wp-content\/uploads\/2023\/03\/image-36-611x139.png 611w\" sizes=\"auto, (max-width: 934px) 100vw, 934px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Now, you can invoke the start primitive and run the <strong><code>curl<\/code><\/strong> command again to make sure it starts again successfully.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Materials<\/h2>\n\n\n\n<p>For a better description of the tutorial, you can check our video\u00a0<a href=\"https:\/\/www.youtube.com\/watch?v=ilFpib-HECY\">here<\/a>.<\/p>\n\n\n\n<p>You can also check a PDF version of this tutorial\u00a0<a href=\"https:\/\/community.5gasp.eu\/wp-content\/uploads\/2022\/04\/day1_day2.pdf\">here<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Day-1 vs Day-2 Code Used This tutorial uses code from previous tutorials: Both are available here. Code modifications Basic structure The first step is to download the resources from the previous tutorials. Notice that you are recreating the content of mod\/operator and mod\/charms.osm. This is not entirely mandatory, but if [\u2026]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"pg_page_styles":[],"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"ngg_post_thumbnail":0,"footnotes":""},"class_list":["post-1646","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/community.5gasp.eu\/index.php\/wp-json\/wp\/v2\/pages\/1646","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/community.5gasp.eu\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/community.5gasp.eu\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/community.5gasp.eu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/community.5gasp.eu\/index.php\/wp-json\/wp\/v2\/comments?post=1646"}],"version-history":[{"count":3,"href":"https:\/\/community.5gasp.eu\/index.php\/wp-json\/wp\/v2\/pages\/1646\/revisions"}],"predecessor-version":[{"id":1667,"href":"https:\/\/community.5gasp.eu\/index.php\/wp-json\/wp\/v2\/pages\/1646\/revisions\/1667"}],"wp:attachment":[{"href":"https:\/\/community.5gasp.eu\/index.php\/wp-json\/wp\/v2\/media?parent=1646"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}