...
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
//Support the current simple capacity check API besides the intent-based framework for backward compatibility. //If a cloud region does not support the policy-based interface, it is given a high net value assuming the current capacity api (yes/no) //returns an yes. This ensures smooth migration to the new policy-based framework. { "service": "cloudPolicy", "policyName": "oofMulti-cloudCasablanca.cloudPolicy_vCPE_VNF", "description": "Cloud Policy for vCPE VNF", "templateVersion": "0.0.1", "version": "oofMulti-cloudCasablanca", "priority": "3", "riskType": "test", "riskLevel": "2", "guard": "False", "content": { "cloudOwner" : { "owner": "All", "intent": { "name": "Infrastructure High Availability (HA) for VNF", //realization thru OpenStack-based: anti-affinity, Azure: Fault Domain or //Different anti-affinity models from ETSI -- host-level, rack-level, availability zone level //max-count in heat template - scale out factor //server-group in heat template - usable thru API and CLI in OpenStack, VMware VIO } "intent": { "name": "Infrastructure Resource Isolation for VNF", // realization possible without dedicating CPU and Memory, refer to section on "Cloud Resource Partitioning for Differentiated QoS" // on how this can help in offering tiered services "qosProperty": { {"Burstable QoS": "TRUE", "Burstable QoS Oversubscription Percentage": "10"}, {"operator", "OR"}, {"Guaranteed QoS": "TRUE"} // VMware VIO - tenant VDC CLI and API - configure the appropriate settings per tenant // Burstable QoS is specified through min guarantee (part of flavor metadata -- // https://docs.openstack.org/horizon/latest/admin/manage-flavors.html } } "cloudCapacityUtilizaitonAttributes" : { //current_allocated_capacity is normalized to 1 //max value for cpu or memory is 1 if usage is greater than equal to limit "current_allocated_capacity" : { {"cpu", "memory", "disk"}: "tenant (OpenStack Project or Resource Slice)", }, // under discussion - elaborate capacity, utilization checks for various objects //"current_allocated_capacity" : //{ // {"cpu", "memory", "network"}: // {"cloud": {"weight": "0.85", "threshold": "0.9"}, // {"tenant (resource slice)": {"weight": "0.85", "threshold": "0.9" }, // {"host aggregate (resource cluster)": {"weight": "0.85", "threshold": "0.9"}, //}, //"average_utilization" : { {"cpu", "memory", "network"}: {"cloud": {"weight": "0.13"}, "tenant (resource slice)": {"weight": "0.13"}, // "host aggregate (resource cluster)": {"weight": "0.13"} }, "time-window": "24", "unit": "hours" }, //"peak_utilization" : { {"cpu", "memory", "network"}: {"cloud": {"weight": "0.02"}, "tenant (resource slice)": {"weight": "0.02"}, "host // aggregate (resource cluster)": {"weight": "0.02"} }, "time-window": "24", "unit": "hours" } //current_allocated_capacity, average_utilization and peak_utilization are normalized to 1 //For a given object such as tenant_cpu, sum of weights across all attributes (current_allocated_capacity, average_utilization & //peak_utilization) must be 1 //E.g. net_value = cloud_cpu_current_allocated_capacity*0.85 + cloud_cpu_average_utilization*0.13 + cloud_cpu_peak_utilization*.02 + ... //For a given object such as cloud_cpu, if the current_allocated_capacity "threshold" exceeds the specified value, return "high net //value" } } //use cloud provider in – <cloud region id, cloud provider> – different cloud providers may need different capacities for the same VNF "cloudOwner" : { "owner": "Azure", "capacityProperty": { //under discussion – "capabilityProperty": {SR_IOV, ...} //under discussion - host network bandwidth "controller": "multicloud", "request": //from R2 "{\"vCPU\": {\"quantity\": {\"get_param\": \"REQUIRED_VCPU\"}, \"Memory\": {\"quantity\": {\"get_param\": \"REQUIRED_MEM\"}, \"unit\": \"GB\"}, \"Storage\": {\"quantity\": {\"get_param\": \"REQUIRED_DISK\"}, \"unit\": \"GB\"}}" } "owner": "OpenStack", "capacityProperty": { //under discussion – "capabilityProperty": {SR_IOV, ...} //under discussion - host network bandwidth "controller": "multicloud", "request": //from R2 "{\"vCPU\": {\"quantity\": {\"get_param\": \"REQUIRED_VCPU\"}, \"Memory\": {\"quantity\": {\"get_param\": \"REQUIRED_MEM\"}, \"unit\": \"GB\"}, \"Storage\": {\"quantity\": {\"get_param\": \"REQUIRED_DISK\"}, \"unit\": \"GB\"}}" } } } "resources": ["vGMux"], //R2 support status – single VF module assumption per VNF "applicableResources": "any", "identity": "distance-vGMux", "policyScope": ["vCPE", "US", "INTERNATIONAL", "ip", "vGMux"], "policyType": "AllPolicy" } |
Private Cloud Setup (e.g. OpenStack)
- Pre-defined (including custom) flavors map to Instance types in Public Clouds
- Pre-defined flavors are created by the Cloud Admin before the Cloud is used by ONAP for workload deployment
Multi-Cloud - Key Processing Steps
For each cloud owner
- Map VNFC to Instance Type
- One or more VNFCs (e.g. vCPE VGW) could map to an instance type
- Convert to appropriate instance type based on intent //e.g. "Infrastructure Resource Isolation for VNF" may result in a different instance type if the cloud owner supports "Burstable QoS"
- For each cloud region // Public cloud could have different costs in different geographic locations
- net_value_cost = net_value_cost + cost_instance_type // cost per instance type is based on policy (for R3, it is picked up from Multi Cloud configuration file)
- net_value_cost = net_value_cost + cost_intent //e.g. "Infrastructure High Availability (HA) for VNF" may have additional cost
- If infra capacity is finite (Private cloud or Public cloud with on-demand reserved instances) // e.g. object of interest is OpenStack Project with a quota (upper limit) for cpu, mem and local disk
- Option A: (supportable with OpenStack based clouds, other clouds to be investigated)
- normalized_cpu_per_object = (current_cpu_used_object + instance_type_cpu*number_of_instances_of vnfc)/currenttotal_cpu_used_object
- if normalized_cpu_per_object > 1, capacity check failed
- normalized_mem_per_object = (current_mem_used_object + instance_type_mem*number_of_instances_of_vnfc)/currenttotal_mem_used_object
- if normalized_mem_per_object > 1, capacity check failed
- normalized_disk_per_object = (current_disk_used_object + instance_type_disk*number_of_instances_of_vnfc)/currenttotal_disk_used_object
- if normalized_disk_per_object > 1, capacity check failed
- net_value_capacity = normalized_infra_capacity = wcpu*normalized_cpu_per_object + wmem*normalized_mem_per_object + wdisk*normalized_disk_per_object // wcpu, wmem, wdisk are specified in a multi-cloud configuration file; wcpu + wmem + wdisk = 1
- normalized_cpu_per_object = (current_cpu_used_object + instance_type_cpu*number_of_instances_of vnfc)/currenttotal_cpu_used_object
- Option B: (under study)
- normalized_instances_per_object = (current_used_reserved_instances + number_of_instances_of_vnfc)/total_reserved_instances
- net_value_capacity = normalized_instances_per_object
- Option A: (supportable with OpenStack based clouds, other clouds to be investigated)
Multi-Cloud - Other
- Convert to appropriate instance type based on intent //e.g. "Infrastructure Resource Isolation for VNF" may result in a different instance type if the cloud owner supports "Burstable QoS"
Cloud Resource Partitioning for Differentiated QoS (Combined with Previous)
...