
{#
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

# Needed for MaaS, not settable
DOCKER_REGISTRY         = docker-registry:5000

# 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 }}
{% endif %}
{% if deploy_docker_tag is defined %}
DEPLOY_DOCKER_TAG       = {{ deploy_docker_tag }}
{% 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 %}
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 cord_config_prereqs is defined %}
CORD_CONFIG_PREREQS     = $(M)/{{ cord_config_prereqs | join(" $(M)/") }}
{% endif %}
{% if copy_config_prereqs is defined %}
COPY_CONFIG_PREREQS     = $(M)/{{ copy_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_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 %}

