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


---
# cord-profile/tasks/main.yml
# Constructs a CORD service profile directory and configuration files

# if this step fails, may need to include `create-configdirs-become` role to
# create directory using become.
- name: Create cord_profile directory
  file:
    path: "{{ config_cord_profile_dir }}"
    state: directory
    mode: 0755
    owner: "{{ ansible_user_id }}"
    group: "{{ ansible_user_gid }}"

- name: Create cord_profile/profile_name file containing profile name
  copy:
    dest: "{{ config_cord_profile_dir }}/profile_name"
    content: "{{ cord_profile }}"
    mode: 0644

- name: Create subdirectories inside cord_profile directory
  file:
    path: "{{ config_cord_profile_dir }}/{{ item }}"
    state: directory
    mode: 0755
  with_items:
    - key_import
    - images

- name: Copy ssh private key to node_key file
  copy:
    src: "{{ ssh_pki_dir }}/client_certs/{{ pod_sshkey_name }}_sshkey"
    dest: "{{ config_cord_profile_dir }}/node_key"
    mode: 0600
    remote_src: True

- name: Copy ssh public key to node_key.pub file
  copy:
    src: "{{ ssh_pki_dir }}/client_certs/{{ pod_sshkey_name }}_sshkey.pub"
    dest: "{{ config_cord_profile_dir }}/node_key.pub"
    mode: 0600
    remote_src: True

- name: Copy ssh private key to key_import directory for services that require it
  copy:
    src: "{{ ssh_pki_dir }}/client_certs/{{ pod_sshkey_name }}_sshkey"
    dest: "{{ config_cord_profile_dir }}/key_import/{{ item.keypair }}"
    mode: 0600
    remote_src: True
  with_items: "{{ xos_services | selectattr('keypair', 'defined') | list }}"

- name: Copy ssh public key to key_import directory for services that require it
  copy:
    src: "{{ ssh_pki_dir }}/client_certs/{{ pod_sshkey_name }}_sshkey.pub"
    dest: "{{ config_cord_profile_dir }}/key_import/{{ item.keypair }}.pub"
    mode: 0644
    remote_src: True
  with_items: "{{ xos_services | selectattr('keypair', 'defined') | list }}"

- name: Copy cert chain and core api key and cert
  copy:
    src: "{{ pki_dir }}/{{ item.src }}"
    dest: "{{ config_cord_profile_dir }}/{{ item.dest }}"
    mode: 0600
  with_items:
    - src: "{{ site_name }}_im_ca/private/xos-core.{{ site_suffix }}_key.pem"
      dest: "core_api_key.pem"
    - src: "{{ site_name }}_im_ca/certs/xos-core.{{ site_suffix }}_cert_chain.pem"
      dest: "core_api_cert.pem"
    - src: "{{ site_name }}_im_ca/certs/im_cert_chain.pem"
      dest: "im_cert_chain.pem"

- name: Copy over commonly used and utility TOSCA files
  copy:
    src: "{{ item }}"
    dest: "{{ config_cord_profile_dir }}/{{ item }}"
  with_items:
    - fixtures.yaml

- name: Create templated XOS configuration files
  template:
    src: "{{ item }}.j2"
    dest: "{{ config_cord_profile_dir }}/{{ item }}"
    mode: 0644
  with_items:
    - xos_config.yaml
    - xos_config_synchronizer.yaml
    - initial_data.yaml
    - deployment.yaml
    - xos.yaml
    - gateway-config.yml
    - style.config.js
    - app.config.js
    - Dockerfile.xos
    - docker-compose.yml
    - xos-tosca.config.yaml

- name: Set cord_profile_src_dir
  set_fact:
    cord_profile_src_dir: "../../orchestration/profiles/{{ cord_use_case }}"

- name: Create profile specific templated TOSCA config files
  template:
    src: "{{ cord_profile_src_dir }}/templates/{{ item }}.j2"
    dest: "{{ config_cord_profile_dir }}/{{ item }}"
  with_items: "{{ xos_tosca_config_templates }}"

- name: Create profile specific templated TOSCA config files (new Engine)
  template:
    src: "{{ cord_profile_src_dir }}/templates/{{ item }}.j2"
    dest: "{{ config_cord_profile_dir }}/{{ item }}"
  with_items: "{{ xos_new_tosca_config_templates }}"

- name: Create profile specific templated non-TOSCA files
  template:
    src: "{{ cord_profile_src_dir }}/templates/{{ item }}.j2"
    dest: "{{ config_cord_profile_dir }}/{{ item }}"
  with_items: "{{ xos_other_templates }}"

- name: Create OpenStack config and TOSCA onboarding
  template:
    src: "{{ item }}.j2"
    dest: "{{ config_cord_profile_dir }}/{{ item }}"
  with_items:
    - openstack.yaml
    - admin-openrc.sh

