#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.
#
---
# This task will write whisk.properties to the openwhisk_home.
# Currently whisk.properties is still needed for tests.

- name: write whisk.properties template to openwhisk_home
  template:
    src: whisk.properties.j2
    dest: "{{ openwhisk_home }}/whisk.properties"

- name: check if application.conf.j2 exists
  tags: application
  stat: path="{{ openwhisk_home }}/tests/src/test/resources/application.conf.j2"
  register: application

- name: write test's application conf overrides
  tags: application
  template:
    src: "{{ openwhisk_home }}/tests/src/test/resources/application.conf.j2"
    dest: "{{ openwhisk_home }}/tests/src/test/resources/application.conf"
  when: application.stat.exists

- name: write whisk.conf template for wskadmin to openwhisk_home
  template:
    src: whisk.conf.j2
    dest: "{{ openwhisk_home }}/whisk.conf"
