{#
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 prep_kubespray_prereqs is defined %}
PREP_KUBESPRAY_PREREQS   = $(M)/{{ prep_kubespray_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 %}

