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


---
- hosts: {{ instance_name }}
  gather_facts: False
  connection: ssh
  user: {{ username }}
  become: yes

  tasks:

  - name: Get Docker IP
    #TODO: copy dockerip.sh to monitoring service synchronizer
    script: /opt/xos/synchronizers/onos/scripts/dockerip.sh {{ sflow_container }}
    register: sflowserviceaddr

  - name: Wait for SFlow service to come up
    wait_for:
      host={{ '{{' }} sflowserviceaddr.stdout {{ '}}' }}
      port={{ '{{' }} item {{ '}}' }}
      state=present
    with_items:
    - {{ sflow_api_port }}

  - name: Invoke SFlow service REST API to subscribe
    uri:
      url: http://{{ '{{' }} sflowserviceaddr.stdout {{ '}}' }}:{{ sflow_api_port }}/subscribe
      body: "{{ listening_endpoint }}"
      body_format: raw
      method: POST
