{#
Copyright 2017-present Open Networking Foundation

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.
#}
# config.mk - generated from ansible/roles/genconfig/templates/config.mk.j2
# ** DO NOT EDIT THIS FILE MANUALLY! **
# Edit the Pod Config (or Scenario) and rerun `make config` to regenerate it

# Scenario specific config
{% if vagrant_vms is defined %}
VAGRANT_VMS             = {{ vagrant_vms | join(' ') }}
{% endif %}
{% if headnode is defined %}
HEADNODE                = {{ headnode }}
{% endif %}
{% if buildnode is defined %}
BUILDNODE               = {{ buildnode }}
{% endif %}
{% if deploy_docker_registry is defined %}
DEPLOY_DOCKER_REGISTRY  = {{ deploy_docker_registry }}
# For MAAS
DOCKER_REGISTRY         = {{ deploy_docker_registry }}
{% endif %}
{% if deploy_docker_tag is defined %}
DEPLOY_DOCKER_TAG       = {{ deploy_docker_tag }}
{% endif %}
{% if config_cord_profile_dir is defined %}
CONFIG_CORD_PROFILE_DIR = {{ config_cord_profile_dir }}
{% endif %}
{% if build_cord_dir is defined %}
BUILD_CORD_DIR = {{ build_cord_dir }}
{% endif %}
{% if skipTags is defined and skipTags %}
ANSIBLE_ARGS += --skip-tags "{{ skipTags | join(",") }}"
{% endif %}

# Targets and prerequisties
{% if build_targets is defined %}
BUILD_TARGETS           = $(M)/{{ build_targets | join(" $(M)/") }}
{% endif %}
{% if vagrant_up_prereqs is defined %}
VAGRANT_UP_PREREQS      = $(M)/{{ vagrant_up_prereqs | join(" $(M)/") }}
{% endif %}
{% if config_ssh_key_prereqs is defined %}
CONFIG_SSH_KEY_PREREQS      = $(M)/{{ config_ssh_key_prereqs | join(" $(M)/") }}
{% endif %}
{% if copy_cord_prereqs is defined %}
COPY_CORD_PREREQS       = $(M)/{{ copy_cord_prereqs | join(" $(M)/") }}
{% endif %}
{% if cord_config_prereqs is defined %}
CORD_CONFIG_PREREQS     = $(M)/{{ cord_config_prereqs | join(" $(M)/") }}
{% endif %}
{% if prep_buildnode_prereqs is defined %}
PREP_BUILDNODE_PREREQS  = $(M)/{{ prep_buildnode_prereqs | join(" $(M)/") }}
{% endif %}
{% if prep_headnode_prereqs is defined %}
PREP_HEADNODE_PREREQS   = $(M)/{{ prep_headnode_prereqs | join(" $(M)/") }}
{% endif %}
{% if docker_images_prereqs is defined %}
DOCKER_IMAGES_PREREQS   = $(M)/{{ docker_images_prereqs | join(" $(M)/") }}
{% endif %}
{% if start_xos_prereqs is defined %}
START_XOS_PREREQS       = $(M)/{{ start_xos_prereqs | join(" $(M)/") }}
{% endif %}
{% if deploy_onos_prereqs is defined %}
DEPLOY_ONOS_PREREQS     = $(M)/{{ deploy_onos_prereqs | join(" $(M)/") }}
{% endif %}
{% if deploy_mavenrepo_prereqs is defined %}
DEPLOY_MAVENREPO_PREREQS     = $(M)/{{ deploy_mavenrepo_prereqs | join(" $(M)/") }}
{% endif %}
{% if deploy_openstack_prereqs is defined %}
DEPLOY_OPENSTACK_PREREQS = $(M)/{{ deploy_openstack_prereqs | join(" $(M)/") }}
{% endif %}
{% if setup_automation_prereqs is defined %}
SETUP_AUTOMATION_PREREQS = $(M)/{{ setup_automation_prereqs | join(" $(M)/") }}
{% endif %}

