##
# Copyright 2015 Telefónica Investigación y Desarrollo, S.A.U.
# This file is part of openvim
# All Rights Reserved.
#
# 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.
#
# For those usages not covered by the Apache License, Version 2.0 please
# contact with: nfvlabs@tid.es
##



# Miscellaneous
# Option to test openvim without the needed infrastructure, possible values are
#    "normal"      by default, Openflow controller (OFC), switch and real host are needed
#    "test"        Used for testing http API and database without connecting to host or to OFC
#    "host only"   Used when neither OFC nor OF switch are provided. 
#                  Dataplane network connection must be done manually.
#    "OF only"     Used for testing of new openflow controllers support. No real VM deployments will be done but
#                  OFC will be used as in real mode
#    "development" Forced a cloud-type deployment, nomal memory instead of hugepages is used, 
#                  without cpu pinning, and using a bridge network instead of a real OFC dataplane networks.
#                  The same 'development_bridge' (see below) is used for all dataplane networks
mode: test


# Default openflow controller information
of_controller:      floodlight                   # Type of controller to be used.
                                                 # Valid controllers are 'opendaylight', 'floodlight' or <custom>
# of_controller_module: module                     # Only needed for <custom>.  Python module that implement
                                                 # this controller. By default a file with the name  <custom>.py is used 
# of_<other>:           value                      # Other parameters required by <custom> controller. Consumed by __init__
of_user:            user credentials             # User credentials for the controller if needed
of_password:        passwd credentials           # Password credentials for the controller if needed
of_controller_ip:   127.0.0.1                    # IP address where the Openflow controller is listening
of_controller_port: 7070                         # TCP port where the Openflow controller is listening (REST API server)
of_controller_dpid: '00:01:02:03:04:05:06:07'    # Openflow Switch identifier (put here the right number)
# This option is used for those openflow switch that cannot deliver one packet to several output with different vlan tags
# When set to true, it fails when trying to attach different vlan tagged ports to the same net
of_controller_nets_with_same_vlan: false         # (by default, true)


# Server parameters
http_host:       0.0.0.0             # IP address where openvim is listening (by default, localhost)
http_port:       9080                # General port where openvim is listening (by default, 9080)
http_admin_port: 9085                # Admin port where openvim is listening (when missing, no administration server is launched)

# Database parameters
db_host:   localhost                 # by default localhost
db_user:   vim                       # DB user
db_passwd: vimpw                     # DB password
db_name:   vim_db                    # Name of the VIM DB


# Common compute node parameters
host_image_path:  /opt/VNF/images        # Folder, same for every host, where the VNF images will be copied
# host_ssh_keyfile: /path/to/ssh-key-file  # Default ssh_kye to use for connecting to compute nodes


# Deprecated: testing parameters (used by ./test/test_openvim.py)
tenant_id: fc7b43b6-6bfa-11e4-84d2-5254006d6777   # Default tenant identifier for testing


# Underlay network: VLAN ranges used for underlay dataplane networks
# When a network is created an unused value in this range is used
network_vlan_range_start: 3000
network_vlan_range_end:   4000


# Overlay network implementation. Options are:
# - ovs :   (by default) Use a vlxan mesh between computes to handle the network overlay.
# - bridge: Use pre-populated linux bridges with L2 conectivity at compte nodes.
network_type : ovs
ovs_controller_ip:        localhost               # IP address of the controller OVS network host
ovs_controller_user:      osm_user                # User for controller OVS network host
# ovs_controller_password: osm_passwd               # password for controller OVS network host
# ovs_controller_keyfile:   /path/to/ssh-key-file   # ssh-access-key file to connect host
ovs_controller_file_path: /var/lib/openvim        # Path for dhcp daemon configuration, by default '/var/lib/openvim'


# Host bridge interfaces for networks. It applies only for 'network_type: bridge'
# Indicates the bridges at compute nodes to be used for the overlay networks
# Bridge networks need to be pre-provisioned on each host and Openvim uses those pre-provisioned bridge networks.
# Openvim assumes that the following bridge interfaces have been created on each host, appropriately associated to a physical port.
# The following information needs to be provided:
#    - Name of the bridge (identical in all hosts)
#    - VLAN tag associated to each bridge interface
#    - The speed of the physical port in Gbps, where that bridge interface was created
# For instance, next example assumes that 10 bridges have been created on each host
# using vlans 2001 to 2010, associated to a 1Gbps physical port 
#bridge_ifaces:
#   #name:      [vlan, speed in Gbps]
#   virbrMan1:  [2001, 1]
#   virbrMan2:  [2002, 1]
#   virbrMan3:  [2003, 1]
#   virbrMan4:  [2004, 1]
#   virbrMan5:  [2005, 1]
#   virbrMan6:  [2006, 1]
#   virbrMan7:  [2007, 1]
#   virbrMan8:  [2008, 1]
#   virbrMan9:  [2009, 1]
#   virbrMan10: [2010, 1]

# Used only when 'mode' is at development'. Indicates which 'bridge_ifaces' is used for dataplane networks
#development_bridge: virbrMan10

# DHCP SERVER PARAMETERS.
# In case some of the previous 'bridge_ifaces' are connected to an EXTERNAL dhcp server, provide
#   the server parameters to allow openvim getting the allocated IP addresses of virtual machines
#   connected to the indicated 'bridge_ifaces' and or 'nets'. Openvim will connect to the dhcp server by ssh.
# DHCP server must contain a shell script "get_dhcp_lease.sh" included in the path, that accepts a mac address as
#   parameter and return empty or the allocated IP address. See an example at the end of the file 
#   ./openvim/dhcp_thread.py 
# COMMENT all lines in case you do not have a DHCP server in 'normal', 'development'  or 'host only' modes.
#   For 'test' or 'OF only' modes you can leave then uncommented, because in these modes fake IP 
#   address are generated instead of connecting with a real DHCP server.
#dhcp_server:
#   host:     host-ip-or-name
#   #port:     22               #ssh port, by default 22
#   provider: isc-dhcp-server  #dhcp-server type
#   user:     user
#   #provide password, or key if needed
#   password: passwd
#   #keyfile:     ssh-access-key
#   #list of the previous bridge interfaces attached to this dhcp server
#   bridge_ifaces:   [ virbrMan1, virbrMan2 ]
#   #list of the networks attached to this dhcp server
#   nets: [default]


# Logging parameters       # DEBUG, INFO, WARNING, ERROR, CRITICAL
log_level:       DEBUG
log_level_db:    DEBUG
log_level_of:    DEBUG


