% Copyright 2020 ArctosLabs Scandinavia AB
%
% Licensed under the Apache License, Version 2.0 (the "License");
% you may not use this file except in compliance with the License.
% You may obtain a copy of the License at
%
%    http://www.apache.org/licenses/LICENSE-2.0
%
% Unless required by applicable law or agreed to in writing, software
% distributed under the License is distributed on an "AS IS" BASIS,
% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
% implied.
% See the License for the specific language governing permissions and
% limitations under the License.
{%- macro vim_accounts(vim_accounts) -%}
enum  Vims = {
{%- for vim in vim_accounts %}
{{vim}}{% if loop.nextitem is defined%},{% endif %}
{%- endfor -%}
}; % The vim-accounts
{%- endmacro -%}

{%- macro variables_vnf(ns_desc) -%}
{%- for vnf in ns_desc -%}
{%- if vnf.vim_account %}
Vims: VNF{{vnf.vnf_id}} = {{vnf.vim_account}};
{%- else %}
var Vims: VNF{{vnf.vnf_id}};
{%- endif -%}
{% endfor -%}
{%- endmacro -%}

{%- macro trp_link_latency(trp_link_latency) -%}
array[Vims, Vims] of int: trp_link_latency = [
{%- for row in trp_link_latency -%}
|
{%- for col in row -%}
{{col}},
{%- endfor %}
{% endfor -%}
|]; % Transport link latency between data centers
{%- endmacro -%}

{%- macro trp_link_jitter(trp_link_jitter) -%}
array[Vims, Vims] of int: trp_link_jitter = [
{%- for row in trp_link_jitter -%}
|
{%- for col in row -%}
{{col}},
{%- endfor %}
{% endfor -%}
|]; % Transport link jitter between data centers
{%- endmacro -%}

{%- macro trp_link_price_list(trp_link_price_list) -%}
array[Vims, Vims] of int: trp_link_price_list = [
{%- for row in trp_link_price_list -%}
|
{%- for col in row -%}
{{col}},
{%- endfor %}
{% endfor -%}
|]; % Transport link price list
{%- endmacro -%}

{%- macro vnf_price_list_per_vim(ns_desc) -%}
{%- for vnf in ns_desc -%}
array[Vims] of int: vim_price_list_{{vnf.vnf_id}} = [
{%- for price in vnf.vnf_price_per_vim -%}
{{price}}{% if loop.nextitem is defined%},{% endif %}
{%- endfor -%}
];
{% endfor %}
{%- endmacro -%}

{%- macro vld_constraints(vld_desc) -%}
{%- for cp in vld_desc -%}
{%- if 'latency' in cp.keys()%}
constraint trp_link_latency[VNF{{cp.cp_refs[0]}}, VNF{{cp.cp_refs[1]}}] <= {{cp.latency}};
{% endif -%}
{% endfor -%}
{%- for cp in vld_desc -%}
{%- if 'jitter' in cp.keys()%}
constraint trp_link_jitter[VNF{{cp.cp_refs[0]}}, VNF{{cp.cp_refs[1]}}] <= {{cp.jitter}};
{% endif -%}
{% endfor -%}
{%- endmacro -%}

{% macro transport_cost(vld_desc) -%}
var int: used_transport_cost =
{%- if not vld_desc -%}
0;
{% else %}
{%- for cp in vld_desc -%}
trp_link_price_list[VNF{{cp.cp_refs[0]}}, VNF{{cp.cp_refs[1]}}]{% if loop.nextitem is defined %}+{% else %};{% endif %}
{% endfor -%}
{% endif -%}
{%- endmacro -%}

{%- macro used_vim_cost(ns_desc) -%}
var int: used_vim_cost =
{%- for vnf in ns_desc -%}
vim_price_list_{{vnf.vnf_id}}[VNF{{vnf.vnf_id}}]{% if loop.nextitem is defined %}+{% else %};{% endif %}
{% endfor -%}
{%- endmacro -%}
