tripleo-heat-templates/docker/services/opendaylight-api.yaml
Michel Peterson 5a8950c706 Run 'Delete Upgrade Flag and Unset it via Rest' only once
Currently the curl commands associated with this command run on all
controller nodes of the overcloud. Becuase the ODL URI is always the
same it's actually doing it against the same REST API every time,
causing problems with the optimistic locking ODL uses.

This patch adds extra error information and limits the execution of this
task to only once per playbook (i.e. just one controller).

Change-Id: I75aed2c0f412961c1eed2ff14e039a0baca09e8a
2019-01-13 10:14:02 +02:00

274 lines
10 KiB
YAML

heat_template_version: rocky
description: >
OpenStack containerized OpenDaylight API service
parameters:
DockerOpendaylightApiImage:
description: image
type: string
DockerOpendaylightConfigImage:
description: image
type: string
EndpointMap:
default: {}
description: Mapping of service endpoint -> protocol. Typically set
via parameter_defaults in the resource registry.
type: json
ServiceData:
default: {}
description: Dictionary packing service data
type: json
ServiceNetMap:
default: {}
description: Mapping of service_name -> network name. Typically set
via parameter_defaults in the resource registry. This
mapping overrides those in ServiceNetMapDefaults.
type: json
DefaultPasswords:
default: {}
type: json
RoleName:
default: ''
description: Role name on which the service is applied
type: string
RoleParameters:
default: {}
description: Parameters specific to the role
type: json
EnableInternalTLS:
type: boolean
default: false
InternalTLSCAFile:
default: '/etc/ipa/ca.crt'
type: string
description: Specifies the default CA cert to use if TLS is used for
services in the internal network.
ODLUpdateLevel:
default: 1
description: Specify the level of update
type: number
constraints:
- allowed_values:
- 1
- 2
conditions:
internal_tls_enabled: {equals: [{get_param: EnableInternalTLS}, true]}
resources:
ContainersCommon:
type: ./containers-common.yaml
OpenDaylightBase:
type: ../../puppet/services/opendaylight-api.yaml
properties:
EndpointMap: {get_param: EndpointMap}
ServiceData: {get_param: ServiceData}
ServiceNetMap: {get_param: ServiceNetMap}
DefaultPasswords: {get_param: DefaultPasswords}
RoleName: {get_param: RoleName}
RoleParameters: {get_param: RoleParameters}
OpenDaylightApiLogging:
type: OS::TripleO::Services::Logging::OpenDaylightApi
outputs:
role_data:
description: Role data for the OpenDaylight API role.
value:
service_name: {get_attr: [OpenDaylightBase, role_data, service_name]}
config_settings:
map_merge:
- get_attr: [OpenDaylightBase, role_data, config_settings]
- if:
- internal_tls_enabled
- tripleo::certmonger::opendaylight::postsave_cmd: "true" # TODO: restart the odl container here
- {}
# BEGIN DOCKER SETTINGS
puppet_config:
config_volume: opendaylight
volumes:
list_concat:
- if:
- internal_tls_enabled
- - /etc/pki/tls/certs/odl.crt:/etc/pki/tls/certs/odl.crt:ro
- /etc/pki/tls/private/odl.key:/etc/pki/tls/private/odl.key:ro
- list_join:
- ':'
- - {get_param: InternalTLSCAFile}
- {get_param: InternalTLSCAFile}
- 'ro'
- null
# 'file,concat,file_line,augeas' are included by default
puppet_tags: odl_user,odl_keystore
step_config:
get_attr: [OpenDaylightBase, role_data, step_config]
config_image: {get_param: DockerOpendaylightConfigImage}
kolla_config:
/var/lib/kolla/config_files/opendaylight_api.json:
command: /opt/opendaylight/bin/karaf server
config_files:
- source: "/var/lib/kolla/config_files/src/*"
dest: "/"
merge: true
preserve_properties: true
permissions:
- path: /opt/opendaylight
owner: odl:odl
recurse: true
docker_config:
step_1:
opendaylight_api:
start_order: 0
image: &odl_api_image {get_param: DockerOpendaylightApiImage}
privileged: false
net: host
detach: true
user: odl
restart: unless-stopped
healthcheck:
test: /openstack/healthcheck
volumes:
list_concat:
- {get_attr: [ContainersCommon, volumes]}
- {get_attr: [OpenDaylightApiLogging, volumes]}
-
- /var/lib/kolla/config_files/opendaylight_api.json:/var/lib/kolla/config_files/config.json:ro
- /var/lib/config-data/puppet-generated/opendaylight/:/var/lib/kolla/config_files/src:ro
- /var/lib/opendaylight/journal:/opt/opendaylight/journal
- /var/lib/opendaylight/snapshots:/opt/opendaylight/snapshots
environment:
- KOLLA_CONFIG_STRATEGY=COPY_ALWAYS
metadata_settings:
get_attr: [OpenDaylightBase, role_data, metadata_settings]
host_prep_tasks:
list_concat:
- {get_attr: [OpenDaylightApiLogging, host_prep_tasks]}
-
- name: Delete data and karaf folder
file:
path: "{{ item }}"
state: absent
with_items:
- /var/lib/opendaylight/data # Delete folder if present from previous deployment
- /var/lib/config-data/puppet-generated/opendaylight/opt/opendaylight/etc/opendaylight/karaf
- name: create persistent directories
file:
path: "{{ item }}"
state: directory
with_items:
- /var/lib/opendaylight/snapshots
- /var/lib/opendaylight/journal
upgrade_tasks:
# Containerized deployment upgrade steps
- name: ODL container L2 update and upgrade tasks
block: &odl_container_upgrade_tasks
- name: Check if ODL container is present
shell: "docker ps -a --format '{{ '{{' }}.Names{{ '}}' }}' | grep '^opendaylight_api$'"
register: opendaylight_api_container_present
failed_when: false
# NOTE: using shell module because of
# https://github.com/ansible/ansible/issues/27960
- name: Update ODL container restart policy to unless-stopped
shell: "docker update --restart=unless-stopped opendaylight_api"
when: opendaylight_api_container_present.rc == 0
- name: stop previous ODL container
docker_container:
name: opendaylight_api
state: stopped
when: step|int == 0
- name: remove journal and snapshots
file:
path: /var/lib/opendaylight/{{item}}
state: absent
with_items:
- snapshots
- journal
when: step|int == 0
- name: Set ODL upgrade flag to True
copy:
dest: /var/lib/config-data/puppet-generated/opendaylight/opt/opendaylight/etc/opendaylight/datastore/initial/config/genius-mdsalutil-config.xml
content: |
<config xmlns="urn:opendaylight:params:xml:ns:yang:mdsalutil">
<upgradeInProgress>true</upgradeInProgress>
</config>
owner: 42462
group: 42462
mode: 0644
when: step|int == 1
post_upgrade_tasks: &odl_container_post_upgrade_tasks
- name: Disable Upgrade in Config File
copy:
dest: /var/lib/config-data/puppet-generated/opendaylight/opt/opendaylight/etc/opendaylight/datastore/initial/config/genius-mdsalutil-config.xml
content: |
<config xmlns="urn:opendaylight:params:xml:ns:yang:mdsalutil">
<upgradeInProgress>false</upgradeInProgress>
</config>
owner: 42462
group: 42462
mode: 0644
when: step|int == 0
# 2 commands in 1 task because the sequence of commands needs to be ensured
# and that no other task is executed in between.
- name: Delete Upgrade Flag and Unset it via Rest
shell:
str_replace:
template: >
curl -k -v --silent --fail --show-error -u $ODL_USERNAME:$ODL_PASSWORD
-H "Content-Type: application/json" -X DELETE
$ODL_URI/restconf/config/genius-mdsalutil:config;
curl -k -v --silent --fail --show-error -u $ODL_USERNAME:$ODL_PASSWORD
-H "Content-Type: application/json" -X POST
$ODL_URI/restconf/config/genius-mdsalutil:config
-d "{ "upgradeInProgress": false }"
params:
$ODL_USERNAME: {get_attr: [OpenDaylightBase, role_data, config_settings, 'opendaylight::username']}
$ODL_PASSWORD: {get_attr: [OpenDaylightBase, role_data, config_settings, 'opendaylight::password']}
$ODL_URI: {get_param: [EndpointMap, OpenDaylightInternal, uri]}
when: step|int == 0
run_once: true
- when: step|int == 1
import_role:
name: tripleo-docker-rm
vars:
containers_to_rm:
- opendaylight_api
update_tasks:
- name: Get ODL update level
block: &get_odl_update_level
- name: store update level to update_level variable
set_fact:
odl_update_level: {get_param: ODLUpdateLevel}
- name: Stop ODL container and remove cache
block:
- name: Check if ODL container is present
shell: "docker ps -a --format '{{ '{{' }}.Names{{ '}}' }}' | grep '^opendaylight_api$'"
register: opendaylight_api_container_present
failed_when: false
# NOTE: using shell module because of
# https://github.com/ansible/ansible/issues/27960
- name: Update ODL container restart policy to unless-stopped
shell: "docker update --restart=unless-stopped opendaylight_api"
when: opendaylight_api_container_present.rc == 0
- name: Stop previous ODL container
docker_container:
name: opendaylight_api
state: stopped
- name: Delete data folder
file:
path: /var/lib/opendaylight/data
state: absent
when:
- step|int == 0
- odl_update_level == 1
- name: Run L2 update tasks that are similar to upgrade_tasks when update level is 2
block: *odl_container_upgrade_tasks
when: odl_update_level == 2
post_update_tasks:
- block: *get_odl_update_level
- block: *odl_container_post_upgrade_tasks
when: odl_update_level == 2