/home/zuul/src/opendev.org/openstack/openstack-ansible-lxc_container_create/handlers/main.yml
---
# Copyright 2014, Rackspace US, Inc.
#
# 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.

# Due to https://github.com/ansible/ansible-modules-extras/issues/2691
# this uses the LXC CLI tools to ensure that we get logging.
# TODO(odyssey4me): revisit this once the bug is fixed and released
- name: Stop Container
  command: >
    lxc-stop --name {{ inventory_hostname }}
    --logfile {{ lxc_container_log_path }}/lxc-{{ inventory_hostname }}.log
    --logpriority {{ (debug | bool) | ternary('DEBUG', 'INFO') }}
  notify:
    - Start Container
  delegate_to: "{{ physical_host }}"
  register: container_stop
  changed_when: true
  failed_when: not container_stop.rc in [0, 2]
  until: container_stop.rc in [0, 2]
  retries: 3
  delay: 2
  when:
    - lxc_container_allow_restarts | bool
  listen: Lxc container restart

# Due to https://github.com/ansible/ansible-modules-extras/issues/2691
# this uses the LXC CLI tools to ensure that we get logging.
# TODO(odyssey4me): revisit this once the bug is fixed and released
- name: Start Container
  command: >
    lxc-start --daemon --name {{ inventory_hostname }}
    --logfile {{ lxc_container_log_path }}/lxc-{{ inventory_hostname }}.log
    --logpriority {{ (debug | bool) | ternary('DEBUG', 'INFO') }}
  delegate_to: "{{ physical_host }}"
  register: container_start
  until: container_start is success
  retries: 3
  listen: Lxc container restart

- name: Flush addresses
  command: "ip addr flush {{ item.value.interface }}"
  with_dict: "{{ lxc_container_networks_combined }}"
  failed_when: false
  when:
    - item.value.interface is defined
  listen: Restart networkd

- name: Restart systemd-networkd
  systemd:
    name: systemd-networkd
    state: restarted
    enabled: true
    daemon_reload: true
  listen: Restart networkd

- name: Enable resolved
  systemd:
    name: systemd-resolved
    state: started
    enabled: true
    daemon_reload: true
  when:
    - lxc_container_enable_resolved | bool

- name: Enable dbus
  systemd:
    name: dbus
    state: started
    enabled: true
    daemon_reload: true

- name: Reload systemd daemon
  systemd:
    daemon_reload: true

- name: Start hostnamed
  systemd:
    name: systemd-hostnamed
    state: started
    enabled: true
    daemon_reload: true
  listen: Enable hostnamed

- name: Set hostnamectl name
  command: "/usr/bin/hostnamectl --static --pretty --transient set-hostname {{ inventory_hostname | replace('_', '-') | quote }}"
  changed_when: false
  listen: Enable hostnamed

# NOTE(hwoarang) openSUSE randomly fails to start the service
# with an error like the following one
# sysctl-container.service: Failed at step CGROUP spawning /sbin/sysctl: No such device
# Until this is fixed, we workaround it by simply retrying a few more times
# before giving up
# https://bugzilla.suse.com/show_bug.cgi?id=1055426
# https://bugs.launchpad.net/openstack-ansible/+bug/1712741
- name: Enable container sysctl service
  service:
    name: "sysctl-container"
    state: started
    enabled: yes
    daemon_reload: yes
  remote_user: root
  register: _sysctl_service_started
  until: _sysctl_service_started is success
  retries: 5
  delay: 5