Requirements that are kept in mind are :

  • Expose HW capability of various CPU architecture (Intel x86,  ARM etc...) in generic fashion.
  • Provide flexibility to expose CPU architecture and vendor specific features.
  • Support for multiple Clouds such as Openstack clouds, AWS Cloud,  Azure Cloud etc...
  • No hardcoding of HPA feature names OR attribute names in ONAP (other than Multi-Cloud plugin)
  • HPA Impact on the AAI Project
  • Please refer to HPA Requirement & Capability Specification

Following format is used to represent the HPACapability:

  • Data centers typically have flavors (openstack calls them flavors,  Azure calls them VM sizes and AWS calls them as Instance types). Each flavor is represented by hardware features.   When these are discovered by ONAP,  there are few ways to represent them in A&AI DB. 
    • Approach 1:
      • flavors as children to the cloud-region (Already existing)
      • Represent HPA capabilities under each flavor (HPA capabilities as children of each flavor)
    • Approach 2:
      • flavors as children to the cloud-region (Already existing). Also, represent HPA capabilities also children to the cloud-regions.
      • Then provide relationship between flavors and capabilities.
    • Approach 3:
      • Approach 1 +
      • Create another tree with capability to region+flavor list.
    • Which approach to follow?  Some guidance from A&AI team.  Requirement is this:
      • During VNF instantiation, OOF gets hold of hardware requirements and based on that requirements, it needs to find out the best cloud-region and flavor.
      • Would Approach 3 seem possible?
  • Each HPACapability is defined as 
    {HPACapability-id,HPAFeature, Schema Version, hardware-architecture, [List of HPAAttributes] - names and values}
  • HPAFeatureAttribute is <hpaAttributeKey, hpaAttributeValue>
  • Refer Supported HPA Capability Requirements(DRAFT) for more specific Capability names and values.

A&AI Schema Changes




Example: Run time view of A&AI graph instance


Current AAI Schema
<java-type name="CloudRegion">
    <xml-root-element name="cloud-region" />
    <java-attributes>
        <xml-element java-attribute="cloudOwner" name="cloud-owner" required="true" type="java.lang.String" xml-key="true">
            <xml-properties>
                <xml-property name="description" value="Identifies the vendor and cloud name. First part of composite key should be formatted as vendor-cloudname" />
            </xml-properties>
        </xml-element>
        <xml-element java-attribute="cloudRegionId" name="cloud-region-id" required="true" type="java.lang.String" xml-key="true">
            <xml-properties>
                <xml-property name="description" value="Identifier used by the vendor for the region. Second part of composite key" />
            </xml-properties>
        </xml-element>
        <xml-element java-attribute="cloudType" name="cloud-type" type="java.lang.String">
            <xml-properties>
                <xml-property name="description" value="Type of the cloud (e.g., openstack)" />
            </xml-properties>
        </xml-element>
        <xml-element java-attribute="ownerDefinedType" name="owner-defined-type" type="java.lang.String">
            <xml-properties>
                <xml-property name="description" value="Cloud-owner defined type indicator (e.g., dcp, lcp)" />
            </xml-properties>
        </xml-element>
        <xml-element java-attribute="cloudRegionVersion" name="cloud-region-version" type="java.lang.String">
            <xml-properties>
                <xml-property name="description" value="Software version employed at the site.  NOTE - THIS FIELD IS NOT KEPT UP TO DATE." />
            </xml-properties>
        </xml-element>
        <xml-element java-attribute="identityUrl" name="identity-url" type="java.lang.String">
            <xml-properties>
                <xml-property name="description" value="URL of the keystone identity service" />
            </xml-properties>
        </xml-element>
        <xml-element java-attribute="cloudZone" name="cloud-zone" type="java.lang.String">
            <xml-properties>
                <xml-property name="description" value="Zone where the cloud is homed.  NOTE - THIS FIELD IS NOT CORRECTLY POPULATED." />
            </xml-properties>
        </xml-element>
        <xml-element java-attribute="complexName" name="complex-name" type="java.lang.String">
            <xml-properties>
                <xml-property name="description" value="complex name for cloud-region instance.  NOTE - THIS FIELD IS NOT CORRECTLY POPULATED." />
            </xml-properties>
        </xml-element>
        <xml-element default-value="false" required="true" java-attribute="sriovAutomation" name="sriov-automation" type="java.lang.Boolean">
            <xml-properties>
                <xml-property name="defaultValue" value="false"/>
                <xml-property name="description" value="Whether the cloud region supports (true) or does not support (false) SR-IOV automation." />
            </xml-properties>
        </xml-element>
        <xml-element java-attribute="cloudExtraInfo" name="cloud-extra-info" type="java.lang.String">
            <xml-properties>
                <xml-property name="description" value="ESR inputs extra information about the VIM or Cloud which will be decoded by MultiVIM." />
            </xml-properties>
        </xml-element>
        <xml-element java-attribute="cloudEpaCaps" name="cloud-epa-caps" type="java.lang.String">
            <xml-properties>
                <xml-property name="description" value="MultiVIM will discover and expose EPA capabilities." />
            </xml-properties>
        </xml-element>
        <xml-element java-attribute="resourceVersion" name="resource-version" type="java.lang.String">
            <xml-properties>
                <xml-property name="description" value="Used for optimistic concurrency.  Must be empty on create, valid on update and delete." />
            </xml-properties>
        </xml-element>
        <xml-element java-attribute="volumeGroups" name="volume-groups" type="inventory.aai.onap.org.v11.VolumeGroups" />
        <xml-element java-attribute="tenants" name="tenants" type="inventory.aai.onap.org.v11.Tenants" />
        <xml-element java-attribute="flavors" name="flavors" type="inventory.aai.onap.org.v11.Flavors" />
        <xml-element java-attribute="groupAssignments" name="group-assignments" type="inventory.aai.onap.org.v11.GroupAssignments" />
        <xml-element java-attribute="snapshots" name="snapshots" type="inventory.aai.onap.org.v11.Snapshots" />
        <xml-element java-attribute="images" name="images" type="inventory.aai.onap.org.v11.Images" />
        <xml-element java-attribute="dvsSwitches" name="dvs-switches" type="inventory.aai.onap.org.v11.DvsSwitches" />
        <xml-element java-attribute="oamNetworks" name="oam-networks" type="inventory.aai.onap.org.v11.OamNetworks" />
        <xml-element java-attribute="availabilityZones" name="availability-zones" type="inventory.aai.onap.org.v11.AvailabilityZones" />
        <xml-element java-attribute="relationshipList" name="relationship-list" type="inventory.aai.onap.org.v11.RelationshipList" />
        <xml-element java-attribute="esrSystemInfoList" name="esr-system-info-list" type="inventory.aai.onap.org.v11.EsrSystemInfoList" />
        <xml-element container-type="java.util.ArrayList" java-attribute="vipIpv4AddressList" name="vip-ipv4-address-list" type="inventory.aai.onap.org.v11.VipIpv4AddressList" />
        <xml-element container-type="java.util.ArrayList" java-attribute="vipIpv6AddressList" name="vip-ipv6-address-list" type="inventory.aai.onap.org.v11.VipIpv6AddressList" />
    </java-attributes>
    <xml-properties>
        <xml-property name="description" value="cloud-region designates an installation of a cloud cluster or region or instantiation." />
        <xml-property name="indexedProps" value="cloud-owner,cloud-region-id,cloud-type,owner-defined-type" />
        <xml-property name="nameProps" value="owner-defined-type" />
        <xml-property name="container" value="cloud-regions" />
        <xml-property name="namespace" value="cloud-infrastructure" />
    </xml-properties>
</java-type>
Modified AAI Schema
<java-type name="Flavor">
    <xml-root-element name="flavor"/>
    <java-attributes>
        <xml-element java-attribute="flavorId" name="flavor-id" required="true" type="java.lang.String" xml-key="true">
            <xml-properties>
                <xml-property name="description" value="Flavor id, expected to be unique across cloud-region."/>
            </xml-properties>
        </xml-element>
        <xml-element java-attribute="flavorName" name="flavor-name" required="true" type="java.lang.String">
            <xml-properties>
                <xml-property name="description" value="Flavor name"/>
            </xml-properties>
        </xml-element>
        <xml-element java-attribute="flavorVcpus" name="flavor-vcpus" type="java.lang.Integer">
            <xml-properties>
                <xml-property name="description" value="Number of CPUs"/>
            </xml-properties>
        </xml-element>
        <xml-element java-attribute="flavorRam" name="flavor-ram" type="java.lang.Integer">
            <xml-properties>
                <xml-property name="description" value="Amount of memory"/>
            </xml-properties>
        </xml-element>
        <xml-element java-attribute="flavorDisk" name="flavor-disk" type="java.lang.Integer">
            <xml-properties>
                <xml-property name="description" value="Disk space"/>
            </xml-properties>
        </xml-element>
        <xml-element java-attribute="flavorEphemeral" name="flavor-ephemeral" type="java.lang.Integer">
            <xml-properties>
                <xml-property name="description" value="Amount of ephemeral disk space"/>
            </xml-properties>
        </xml-element>
        <xml-element java-attribute="flavorSwap" name="flavor-swap" type="java.lang.String">
            <xml-properties>
                <xml-property name="description" value="amount of swap space allocation"/>
            </xml-properties>
        </xml-element>
        <xml-element java-attribute="flavorIsPublic" name="flavor-is-public" type="java.lang.Boolean">
            <xml-properties>
                <xml-property name="description"
                              value="whether flavor is available to all users or private to the tenant it was created in."/>
            </xml-properties>
        </xml-element>
        <xml-element java-attribute="flavorSelflink" name="flavor-selflink" required="true" type="java.lang.String">
            <xml-properties>
                <xml-property name="description" value="URL to endpoint where AAI can get more details"/>
            </xml-properties>
        </xml-element>
        <xml-element java-attribute="flavorDisabled" name="flavor-disabled" type="java.lang.Boolean">
            <xml-properties>
                <xml-property name="description" value="Boolean as to whether this flavor is no longer enabled"/>
            </xml-properties>
        </xml-element>
        <xml-element java-attribute="hpaCapabilities" name="hpa-capabilities"
                     type="inventory.aai.onap.org.v13.HpaCapabilities">
            <xml-properties>
                <xml-property name="description" value="List of HPA Capabilities associated with this flavor"/>
            </xml-properties>
        </xml-element>
        <xml-element java-attribute="resourceVersion" name="resource-version" type="java.lang.String">
            <xml-properties>
                <xml-property name="description"
                              value="Used for optimistic concurrency.  Must be empty on create, valid on update and delete."/>
            </xml-properties>
        </xml-element>
        <xml-element java-attribute="relationshipList" name="relationship-list"
                     type="inventory.aai.onap.org.v13.RelationshipList"/>
    </java-attributes>
    <xml-properties>
        <xml-property name="description" value="Openstack flavor."/>
        <xml-property name="nameProps" value="flavor-name"/>
        <xml-property name="indexedProps" value="flavor-name,flavor-id"/>
        <xml-property name="dependentOn" value="cloud-region"/>
        <xml-property name="container" value="flavors"/>
    </xml-properties>
</java-type>

<java-type name="HpaCapabilities">
    <xml-properties>
        <xml-property name="description" value="Collection of HPA Capabilities"/>
    </xml-properties>
    <xml-root-element name="hpa-capabilities"/>
    <java-attributes>
        <xml-element container-type="java.util.ArrayList" java-attribute="hpaCapability" name="hpa-capability"
                     type="inventory.aai.onap.org.v13.HpaCapability"/>
    </java-attributes>
</java-type>

<java-type name="HpaCapability">
<xml-root-element name="hpa-capability"/>
<java-attributes>
    <xml-element java-attribute="hpaCapabilityId" name="hpa-capability-id" required="true" type="java.lang.String"
                 xml-key="true">
        <xml-properties>
            <xml-property name="description" value="UUID to uniquely identify a HPA capability"/>
        </xml-properties>
    </xml-element>
    <xml-element java-attribute="hpaFeature" name="hpa-feature" required="true" type="java.lang.String">
        <xml-properties>
            <xml-property name="description" value="Name of the HPACapability"/>
        </xml-properties>
    </xml-element>
    <xml-element java-attribute="version" name="hpa-version" type="java.lang.String">
        <xml-properties>
            <xml-property name="description" value="HPA schema version"/>
        </xml-properties>
    </xml-element>
    <xml-element java-attribute="hardwareArchitecture" name="hpa-hw-arch" type="java.lang.String">
        <xml-properties>
            <xml-property name="description" value="Hardware architecture"/>
        </xml-properties>
    </xml-element>
    <xml-element java-attribute="resourceVersion" name="resource-version" type="java.lang.String">
        <xml-properties>
            <xml-property name="description"
                          value="Used for optimistic concurrency.  Must be empty on create, valid on update and delete."/>
        </xml-properties>
    </xml-element>
    <xml-element java-attribute="relationshipList" name="relationship-list"
                 type="inventory.aai.onap.org.v13.RelationshipList"/>
    <xml-element container-type="java.util.ArrayList" java-attribute="hpaFeatureAttribute" name="hpa-feature-attribute"
                 type="inventory.aai.onap.org.v13.HpaFeatureAttribute"/>
</java-attributes>
<xml-properties>
    <xml-property name="description" value="Represents a HPA capability"/>
    <xml-property name="nameProps" value="hpa-feature"/>
    <xml-property name="indexedProps" value="hpa-feature,hpa-hw-arch,hpa-capability-id"/>
    <xml-property name="dependentOn" value="flavor"/>
    <xml-property name="container" value="hpa-capabilities"/>
</xml-properties>
</java-type>

<java-type name="HpaFeatureAttribute">
<xml-root-element name="hpa-feature-attribute"/>
<java-attributes>
    <xml-element java-attribute="hpaAttributeKey" name="hpa-attr-key" type="java.lang.String">
        <xml-properties>
            <xml-property name="description" value="name of the specific HPA attribute"/>
        </xml-properties>
    </xml-element>
    <xml-element java-attribute="hpaAttributeValue" name="hpa-attr-value" type="java.lang.String">
        <xml-properties>
            <xml-property name="description"
                          value="JSON string specifying the value, unit and type of the specific HPA attribute"/>
        </xml-properties>
    </xml-element>
    <xml-element java-attribute="resourceVersion" name="resource-version" type="java.lang.String">
        <xml-properties>
            <xml-property name="description"
                          value="Used for optimistic concurrency.  Must be empty on create, valid on update and delete."/>
        </xml-properties>
    </xml-element>
    <xml-element java-attribute="relationshipList" name="relationship-list"
                 type="inventory.aai.onap.org.v13.RelationshipList"/>
</java-attributes>
<xml-properties>
    <xml-property name="description" value="HPA Capability Feature attributes"/>
    <xml-property name="container" value="hpa-capability"/>
</xml-properties>
</java-type>
Edge Relations
{
	"from": "flavor",
	"to": "cloud-region",
	"label": "org.onap.relationships.inventory.BelongsTo",
	"direction": "OUT",
	"multiplicity": "MANY2ONE",
	"contains-other-v": "!${direction}",
	"delete-other-v": "NONE",
	"SVC-INFRA": "NONE",
	"prevent-delete": "!${direction}",
	"default": "true",
	"description":""
},
{
	"from": "hpa-capability",
	"to": "flavor",
	"label": "org.onap.relationships.inventory.BelongsTo",
	"direction": "OUT",
	"multiplicity": "MANY2ONE",
	"contains-other-v": "!${direction}",
	"delete-other-v": "NONE",
	"SVC-INFRA": "NONE",
	"prevent-delete": "!${direction}",
	"default": "true",
	"description":""
},
{
	"from": "hpa-capability",
	"to": "cloud-region",
	"label": "org.onap.relationships.inventory.AssociatedWith",
	"direction": "OUT",
	"multiplicity": "MANY2ONE",
	"contains-other-v": "NONE",
	"delete-other-v": "NONE",
	"SVC-INFRA": "NONE",
	"prevent-delete": "!${direction}",
	"default": "true",
	"description":""
},

Sequence Diagrams

Discovery of HPA-flavors when cloud-region is added

Cloud-Region Init Discovery

Periodic Discovery of HPACapabilities

Periodic Discover HPA


VNFC Instantiation 

VNFC instantiation

TBD

Following table provides HPA features and attributes.  Also, it describes matching constraints for each HPA feature. These constraints are applied while finding the best cloud-region for placing VNFC.

Attributes are represented as:

TBD...

<HPA feature name



AAI APIs for HPA :

TBD


  • No labels

4 Comments

  1. As per F2F discussion at Santa Clara conference, replaced the term "compute-group" with "EPA-flavor".

    There were few objections on the term EPA itself. Once the new term is chosen,  this page would be updated accordingly.

  2. Srinivasa Addepalli the new term has been chosen. Going forward, we've agreed to use HPA (Hardware Platform Awareness) instead of EPA.

    The updated proposal and list of participating companies is available here: https://wiki.onap.org/download/attachments/20086968/onap-hpa-requirements.pptx?api=v2



  3. Explicitly tying OpenStack flavors and HPA capabilities is problematic for a number of reasons, not the least of which is that we would be tying operators to a specific flavor creation/scheme. What we have discussed before was an approach where for each VIM we would model a list of higher order features, with HPA being one of them. This way we can distinguish between VIMs capable/willing to expose HPA information and those that are not. If HPA information is available, we would express it as an array of tuples using the following format...

    (architecture-spec, capability-name, capability-value)

    where:

    architecture-speca character string that defines the hardware architecture
    capability-name

    a character string that defines the name of a specific HPA capability

    capability-valuea character string that defines the value of a given HPA capability

    Observe that the tuples are hardware vendor specific. Each vendor would be unique identified by the <architecture-spec> string. The names and values of capabilities would also be vendor-specific.

    During optimization of homing and placement, hardware specific OOF plugins could be used to interpret the names/values of VNFD requirements and match them as appropriate against capabilities listed in the AAI.

    1. I agree. In fact, the concept of "flavors" or "groups" in general is problematic in itself from an orchestration perspective. It either requires defining standard types of flavors, or some type of central "clearinghouse" where VNF designers can go look up what flavors are available and likely to be recognized by orchestrators. Lacking that, there is not guarantee that any flavor specified in the VNF descriptor will be meaningful. Alex' proposal of just specifying a list of tuples is much simpler.