<?xml version="1.0" encoding="utf-8"?>
<!-- 
     draft-rfcxml-general-template-standard-00
  
     This template includes examples of the most commonly used features of RFCXML with comments 
     explaining how to customise them. This template can be quickly turned into an I-D by editing 
     the examples provided. Look for [REPLACE], [REPLACE/DELETE], [CHECK] and edit accordingly.
     Note - 'DELETE' means delete the element or attribute, not just the contents.
     
     Documentation is at https://authors.ietf.org/en/templates-and-schemas
-->
<?xml-model href="rfc7991bis.rnc"?>  <!-- Required for schema validation and schema-aware editing -->
<!-- <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?> -->
<!-- This third-party XSLT can be enabled for direct transformations in XML processors, including most browsers -->


<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>

<rfc
  xmlns:xi="http://www.w3.org/2001/XInclude"
  category="std"
  ipr="trust200902"
  obsoletes=""
  updates=""
  submissionType="IETF"
  xml:lang="en"
  version="3"
  tocInclude="true"
  tocDepth="5"
  symRefs="true"
  sortRefs="true"
  consensus="true"
  docName="draft-warshavsky-private-features-metadata-02"
  >
  
   <front>
      <title abbrev="CDNI Private Features Metadata">CDNI Private Features Metadata</title>
      <author fullname="Arnon Warshavsky" initials="A." surname="Warshavsky">
         <organization>Qwilt</organization>
         <address>
            <postal>
               <street />
               <city />
               <region />
               <code />
               <country>Israel</country>
            </postal>
            <email>arnon@qwilt.com</email>
         </address>
      </author>
      <author initials="G." surname="Bichot" fullname="Guillaume Bichot">
         <organization>Broadpeak</organization>
         <address>
            <postal>
               <street />
               <city />
               <region />
               <code />
               <country>France</country>
            </postal>
            <email>guillaume.bichot@broadpeak.tv</email>
         </address>
      </author> 
      <author fullname="Glenn Goldstein" initials="G." surname="Goldstein">
         <organization>Lumen Technologies</organization>
         <address>
            <postal>
               <street />
               <city />
               <region />
               <code />
               <country>US</country>
            </postal>
            <email>glenng1215@gmail.com</email>
         </address>
      </author>
      <date />
      <workgroup>Content Delivery Networks Interconnection</workgroup>
      <abstract>
         <t>
         This specification defines a mechanism for downstream content delivery networks (dCDNs) to define private extensions to the metadata model that are mutually agreed upon between participating upstream content delivery networks (uCDNs) and dCDNs.
         </t>
      </abstract>
   </front>
<middle>
<section anchor="h.3znysh7">
  <name>Introduction</name>
  <t>There is a natural tension between standardization and differentiation - all CDNs and Open Caching systems are not identical, and not all content providers use the same methodologies for controlling access to their resources.</t>
  <t>While <xref target="RFC8006"/> provides the GenericMetadata object as the basis for extensibility, creating a formal structure for private features as a distinct MI object conveys the explicit understanding of the usage context. This document details a private features mechanism that allows for custom configuration metadata to be easily added, enabling rapid development of new features, and allowing companies to mutually agree on a feature that may not be of general interest to the industry.</t>
  <t>Through the CDNI Footprint &amp; Capabilities Interface <xref target="RFC8008"/>, dCDNs advertise their capabilities to uCDNs. This capabilities advertisement allows a dCDN to declare the private features that it supports.</t>
  <t>Examples of private features include:</t>
  <ul>
    <li>
      <t>Custom authentication schemes</t>
    </li>
  </ul>
  <ul>
    <li>
      <t>Definitions of custom scripts to be invoked on the CDN during request processing</t>
    </li>
  </ul>
</section><section anchor="requirements" title="Requirements">
<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in <xref target="RFC2119"/>.</t>
</section><section anchor="h.bwmxupti6qon">
  <name>MI.PrivateFeatureList</name>
  <t>The dCDN MAY gather a certain number of private features (i.e., not [yet] adopted in a standard or considered marginal) that it MAY want to expose to the content provider and/or the uCDN. Although private, the announcement, selection, and configuration of this private feature can be done through the CDNI interfaces.</t>
  <t>MI.PrivateFeatureList is a GenericMetadata configuration object used as a base generic object that permits the control of private features. </t>
  <t>Property: features</t>
  <ul>
    <li>
      <t>Description: The list of feature configuration objects.</t>
    </li>
    <li>
      <t>Type: Array of MI.PrivateFeature objects </t>
    </li>
    <li>
      <t>Mandatory-to-Specify: Yes</t>
    </li>
  </ul>
  <section anchor="h.npwenxomdhu3">
    <name>MI.PrivateFeature</name>
    <t>MI.PrivateFeature is a subobject of MI.PrivateFeatureList that defines a single private feature and contains the following properties:</t>
    <t>Property: feature-oid</t>
    <ul>
      <li>
        <t>Description: The feature organization ID is the owner/organization that has specified the feature, typically the name of the company or organization defining the private feature.</t>
      </li>
      <li>
        <t>Type:  String</t>
      </li>
      <li>
        <t>Mandatory-to-Specify: Yes</t>
      </li>
    </ul>
    <t>Property: feature-type</t>
    <ul>
      <li>
        <t>Description: Indicates the type/name of the private feature configuration object, driving the definition of feature-value.</t>
      </li>
      <li>
        <t>Type: String</t>
      </li>
      <li>
        <t>Mandatory-to-Specify: Yes</t>
      </li>
    </ul>
    <t>Property: feature-value</t>
    <ul>
      <li>
        <t>Description: The feature configuration object.</t>
      </li>
      <li>
        <t>Type: Object. Format and object type is defined by the value of the feature-type property above.</t>
      </li>
      <li>
        <t>Mandatory-to-Specify: Yes</t>
      </li>
    </ul>
    <t>Note that the private features exposed by the dCDN can be advertised through a dedicated FCI object.</t>
    <t>The following example illustrates the Broadpeak S4Streaming feature:</t>
    <figure>
      <sourcecode><![CDATA[{
  "generic-metadata-type": "MI.PrivateFeatureList",
  "generic-metadata-value": {
    "features": [
      {
        "feature-oid": "Broadpeak",
        "feature-type": "S4Streaming",
        "feature-value": {
          "footprint": {
            "footprint-type": "ipv4cidr",
            "footprint-value": [
              "192.0.2.0/24",
              "198.51.100.0/24"
            ]
          },
          "activation": "ON",
          "mode": "transparent",
          "policy": "bandwidth-max"
        }
      }
    ]
  }
}]]></sourcecode>
    </figure>
  </section>
</section><section anchor="h.qo3wo9uhm0s9">
  <name>Named Private Features</name>
  <t>Named private features provides an alternative for specifying private features inside the MI.PrivateFeatureList object, allowing them to be specified individually rather than as part of a group under the host match and path match inheritance/override hierarchy.A named private feature corresponding to a feature inside an MI.PrivateFeatureList object in the same generic metadata array, takes precedence and overrides the latter.</t>
  <section anchor="h.js8ejtkwa7nz">
    <name>MI.NamedPrivateFeatureType</name>
    <t>MI.NamedPrivateFeatureType is a structured string corresponding to the MI.PrivateFeature object by encoding its two identifier properties  feature-oid and feature-type into a string that can be incorporated into the extended definition of MI_payloadtype.</t>
    <t>Property: </t>
    <ul>
      <li>
        <t>Description: A string in the form of MI.PrivateFeature.&lt;org id&gt;.&lt;feature id&gt;where org-id consists of alphanumeric characters, and feature-id MAY also contain dots for additional internal namespacing within the feature name.</t>
      </li>
      <li>
        <t>Type:  String, of pattern: : ^MI\.PrivateFeature\.[a-z0-9A-Z]+(?:\.[a-z0-9A-Z]+){1,}$</t>
      </li>
    </ul>
  </section>
  <section anchor="h.eqah3hnke2lb">
    <name>MI.NamedPrivateFeatureValue</name>
    <t>The actual structure of the MI.NamedPrivateFeatureValue object is the one defined in the property feature-value of the object MI.PrivateFeature.</t>
    <ul>
      <li>
        <t>Type:  object</t>
      </li>
    </ul>
    <t>This following example illustrates the transformation from an MI.PrivateFeature object residing inside an MI.PrivateFeatureList,  into an MI.GenericMetadata object residing in a metadata array of a host or a path match.</t>
    <figure>
      <sourcecode><![CDATA[{
  "generic-metadata-type": "MI.PrivateFeatureList",
  "generic-metadata-value": {
    "features": [
      {
        "feature-oid": "ACME",
        "feature-type": "Hammer",
        "feature-value": {
          "enable": true
        }
      }
    ]
  }
}]]></sourcecode>
    </figure>
    <figure>
      <sourcecode><![CDATA[{
  "generic-metadata-type": "MI.PrivateFeature.ACME.Hammer",
  "generic-metadata-value": {
    "enable": true
  }
}]]></sourcecode>
    </figure>
  </section>
</section><section anchor="h.md8bmayuysh9">
  <name>FCI.PrivateFeatures</name>
  <t>While the MI objects introduced in this document allow a uCDN to configure private features with any required configuration metadata, FCI.PrivateFeatures enables a dCDN to advertise the set of private features that it supports.</t>
  <t>Property: features</t>
  <ul>
    <li>
      <t>Description: The list of supported private features.</t>
    </li>
    <li>
      <t>Type: Array of nested objects of FCI.PrivateFeature</t>
    </li>
  </ul>
  <t>Example:</t>
  <figure>
    <sourcecode><![CDATA[{
  "capabilities": [
    {
      "capability-type": "FCI.PrivateFeatures",
      "capability-value": {
        "features": [
          {
            "feature-oid": "Broadpeak",
            "feature-type": "S4Streaming"
                 }
        ]
      }
    }
  ]
}]]></sourcecode>
  </figure>
  <section anchor="h.h7q90y61rv1y">
    <name>FCI.PrivateFeature</name>
    <t>This subobject identifies a specific private feature in the FCI capabilities advertisement, and contains the following properties:</t>
    <t>Property: feature-oid</t>
    <ul>
      <li>
        <t>Description: The owner/organization that has specified the feature.</t>
      </li>
      <li>
        <t>Type:  String</t>
      </li>
      <li>
        <t>Mandatory-to-Specify: Yes</t>
      </li>
    </ul>
    <t>Property: feature-type</t>
    <ul>
      <li>
        <t>Description: Indicates the type/name of the private feature configuration object.</t>
      </li>
      <li>
        <t>Type: String</t>
      </li>
      <li>
        <t>Mandatory-to-Specify: Yes</t>
      </li>
    </ul>
  </section>
</section><section anchor="Security" title="Security Considerations">
            <t>
            The FCI and MI objects defined in the this document are transferred via the interfaces defined in CDNI <xref target="RFC8006"/> which describes how to secure these interfaces by protecting integrity and confidentiality while ensuring the authenticity of the dCDN and uCDN.
            </t>
        </section><section anchor="IANA" title="IANA Considerations">
            <section anchor="IANA.cdni.payload.types" title="CDNI Payload Types">
                <t>This document requests the registration of the following entries under the "CDNI Payload Types" registry hosted by IANA:
                </t>
                <table>
                    <name>CDNI Payload Types</name>
                    <thead>
                        <tr><td>Payload Type</td><td>Specification</td></tr>
                    </thead>
                    <tbody>
                        <tr><td>MI.PrivateFeatureList</td><td>RFCthis</td></tr>
                        <tr><td>MI.PrivateFeature</td><td>RFCthis</td></tr>
                        <tr><td>MI.NamedPrivateFeatureType</td><td>RFCthis</td></tr>
                        <tr><td>MI.NamedPrivateFeatureValue</td><td>RFCthis</td></tr>
                        <tr><td>FCI.PrivateFeatures</td><td>RFCthis</td></tr>
                        <tr><td>FCI.PrivateFeature</td><td>RFCthis</td></tr>
                    </tbody>
                 </table>
            </section>
</section><section anchor="Acknowledgements" title="Acknowledgements">
            <t>
                The authors would like to express their gratitude to the members of the Streaming Video Technology Alliance <xref target="SVTA"/> Open Caching Working Group for their contributions and guidance.
            </t>
            <t>Particulary the following people contribute in one or other way to the content of this draft:</t>  
                <ul>
                    <li>Chris Lemmons - Comcast</li>
                    <li>Pankaj Chaudhari - Disney Streaming Services</li>
                    <li>Will Power - Lumen</li>
                    <li>Rajeev RK - picoNETS</li>
                    <li>Shmuel Asafi - Qwilt</li>
                    <li>Yoav Gressel - Qwilt</li>
                    <li>Nir Sopher - Qwilt</li>
                    <li>Eric Klein - Sirius XM</li>
                    <li>Alfonso Siloniz - Telefonica</li>
                    <li>Ben Rosenblum - Vecima</li>
                </ul>
        </section>
   </middle>
   <back>
      <references title="Normative References">
         <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
         <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8006.xml"/>
         <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8008.xml"/>
      </references>
      <references title="Informative References">
         <reference anchor="SVTA" target="https://www.svta.org">
            <front>
               <title>Streaming Video Technology Alliance Home Page</title>
               <author><organization>SVTA</organization></author>
               <date />
            </front>
         </reference>
       </references>
   </back>
</rfc>
