Minizinc Placement Model Ex. for vDNS+vFW use case
[optf/osdf.git] / examples / placement-models-minizinc / vdns-plus-vfw-use-case / placement.mzn
diff --git a/examples/placement-models-minizinc/vdns-plus-vfw-use-case/placement.mzn b/examples/placement-models-minizinc/vdns-plus-vfw-use-case/placement.mzn
new file mode 100755 (executable)
index 0000000..ba66a4e
--- /dev/null
@@ -0,0 +1,89 @@
+int: N_CLOUD_REGIONS;  % number of cloud regions\r
+% set of 1..N_CLOUD_REGIONS: C_REGIONS;\r
+\r
+int: N_ATTRIBUTES; %  number of capability related attributes\r
+% set of 1..N_ATTRIBUTES: ATTRIBS;\r
+array[1..N_ATTRIBUTES] of float: w_attributes; % weights of each attribute\r
+\r
+int: N_UTILIZATION_METRICS; % number of dynamic capacity metrics of interest\r
+% set of 1..N_UTILIZATION_METRICS: U_METRICS;\r
+array[1..N_UTILIZATION_METRICS] of float: w_metrics; % weights of each capacity metric\r
+\r
+int: cust_type;  % customer type, 0 = regular, 1 = silver, 2 = gold\r
+int: N_VMS; % number of VMs in VNF\r
+int: N_CAPACITY_METRICS; % number of metrics for cloud region capacity check\r
+\r
+float: C_ALLOC_THRESHOLD; % allocation threshold for cloud\r
+float: CUST_ALLOC_THRESHOLD; % allocation threshold for customer in cloud\r
+float: AVG_CPU_UTILIZATION_THRESHOLD;\r
+float: PEAK_CPU_UTILIZATION_THRESHOLD;\r
+\r
+enum CUST_TYPES = { STANDARD, SILVER, GOLD };\r
+enum ATTRIBUTES = { CORE_DC, DIRECT_CONN, MIN_GUARANTEE, SRIOV };\r
+enum METRICS = { AVG_CPU_UTILIZATION, PEAK_CPU_UTILIZATION };\r
+enum CLOUD_REGION_CAPACITY = {CPU_CLOUD, MEMORY_CLOUD};\r
+enum VNFS_TYPES = { VDNS, VFW };\r
+int: N_VNFS;\r
+\r
+% set of 1..N_CAPACITY_METRICS: CAP_METRICS;\r
+\r
+% whether a cloud region has the corresponding capability -- data will be customer specific\r
+% array[1..N_CLOUD_REGIONS, 1..N_CLOUD_REGIONS] of float: c_dist;\r
+array[1..N_CLOUD_REGIONS, 1..N_ATTRIBUTES] of int: capabilities;\r
+array[1..N_CLOUD_REGIONS, 1..N_UTILIZATION_METRICS] of float: cpu_utilization;  % how much capacity is already dynamically utilized     (fraction)\r
+array[1..N_CLOUD_REGIONS, 1..N_CAPACITY_METRICS] of int: c_alloc_capacity; % how much percent is already allocated in the cloud\r
+array[1..N_CLOUD_REGIONS, 1..N_CAPACITY_METRICS] of int: c_total_capacity;  % total cloud capacity\r
+array[1..N_CLOUD_REGIONS, 1..N_CAPACITY_METRICS] of float: c_alloc_capacity_norm;\r
+array[1..N_CLOUD_REGIONS, 1..N_CAPACITY_METRICS] of int: cust_alloc_capacity; % how much percent is already allocated in the cloud for the customer\r
+array[1..N_CLOUD_REGIONS, 1..N_CAPACITY_METRICS] of int: cust_total_capacity; % total cloud capacity for customer\r
+array[1..N_CLOUD_REGIONS, 1..N_CAPACITY_METRICS] of float: cust_alloc_capacity_norm;\r
+\r
+% VM requirements for each type of capacity (vm cpu, memory, etc.)\r
+% TODO: establish a standard for units (MB RAM, GB disk, N virtual cores, etc.)\r
+array[1..N_VMS, 1..N_CAPACITY_METRICS] of int: vm_reqs;\r
+array[1..N_CAPACITY_METRICS] of int: vm_reqs_sums = [ sum(k in 1..N_VMS) (vm_reqs[k,j]) | j in 1..N_CAPACITY_METRICS ];\r
+array[1..N_CLOUD_REGIONS, 1..N_CAPACITY_METRICS] of float: vm_reqs_sums_norm;\r
+%forall(i in 1..N_CLOUD_REGIONS, j in 1..N_CAPACITY_METRICS) (\r
+%  vm_reqs_sums_norm[i, j] = vm_reqs_sums[j]/c_total_capacity[i, j]\r
+%)\r
+%array[1..N_CLOUD_REGIONS, 1..N_CAPACITY_METRICS] of float: vm_reqs_sums_norm = [ ((vm_reqs_sums[j]/c_total_capacity[i,j]) | j in 1..N_CAPACITY_METRICS) | i in 1..N_CLOUD_REGIONS ];\r
+\r
+array[1..N_VNFS] of var int: s_regions;  % target cloud regions (solution to the problem)\r
+\r
+% custom constraints\r
+constraint forall (s in s_regions) (\r
+    cpu_utilization[s, AVG_CPU_UTILIZATION] <= AVG_CPU_UTILIZATION_THRESHOLD /\    % hard constraint: need some capacity available\r
+    cpu_utilization[s, PEAK_CPU_UTILIZATION] <= PEAK_CPU_UTILIZATION_THRESHOLD /\  % hard constraint: need some capacity available\r
+    cust_alloc_capacity[s, CPU_CLOUD] <= (CUST_ALLOC_THRESHOLD*(cust_total_capacity[s, CPU_CLOUD])) - (vm_reqs_sums[CPU_CLOUD]) /\\r
+    cust_alloc_capacity[s, MEMORY_CLOUD] <= (CUST_ALLOC_THRESHOLD*(cust_total_capacity[s, MEMORY_CLOUD])) - (vm_reqs_sums[MEMORY_CLOUD]) /\\r
+    c_alloc_capacity[s, CPU_CLOUD] <= (C_ALLOC_THRESHOLD*(c_total_capacity[s, CPU_CLOUD])) - (vm_reqs_sums[CPU_CLOUD]) /\\r
+    c_alloc_capacity[s, MEMORY_CLOUD] <= (C_ALLOC_THRESHOLD*(c_total_capacity[s, MEMORY_CLOUD])) - (vm_reqs_sums[MEMORY_CLOUD])\r
+);\r
+\r
+% specific constraints based on the VNF\r
+constraint capabilities[s_regions[VDNS], CORE_DC] = 1;  % hard constraint for vDNS: has to be placed in CORE DC\r
+\r
+% custom soft constraint for gold customers -- give a large weight to direct connection\r
+var float: additional_obj = sum(s in s_regions) (bool2int(cust_type = GOLD) * capabilities[s, MIN_GUARANTEE] * 1000);\r
+\r
+% TODO: global constraints (such as data validation)\r
+\r
+% Objective for utilization\r
+var float: obj_c_capacity = sum(k in 1..N_CAPACITY_METRICS, s in s_regions) (\r
+                 (1 - c_alloc_capacity_norm[s, k] - vm_reqs_sums_norm[s, k]) +\r
+                  (1 - cust_alloc_capacity_norm[s, k] - vm_reqs_sums_norm[s, k]));\r
+\r
+% Objective for utilization\r
+var float: obj_utilization = sum(k in 1..N_UTILIZATION_METRICS, s in s_regions) ( w_metrics[k] * (1 - cpu_utilization[s, k]) );\r
+\r
+% Objective for capabilities\r
+var float: obj_capabilities = sum(k in 1..N_ATTRIBUTES, s in s_regions) ( w_attributes[k] * capabilities[s, k] );\r
+\r
+% Overall objective function\r
+var float: obj = obj_c_capacity + obj_utilization + obj_capabilities + additional_obj;\r
+\r
+solve maximize obj;\r
+\r
+output [ "Solution: \nCloud Region for vDNS = ", show(s_regions[VDNS]) ] \r
+++ [ if N_VNFS = 2 then "\nCloud Region for vFW = " ++ show(s_regions[VFW]) ++ "\n" else "\n" endif ]\r
+++ [ "Objective function value: ", show(obj), "\n", "Customer type: ", show(cust_type), "\n"];\r