
# 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: {{ swarm_manager_address }}
  become: true 
  tasks:
    {% if delete -%} 
    - name: delete a docker network '{{ network_name }}'
      shell: docker network rm  {{ network_name }}
    {% elif duplicated -%} 
    - name: network list on swarm cluster
      shell: docker network ls
    - name: network inspection '{{ network_name }}'
      shell: docker network inspect  {{ network_name }} 
    {% else -%} 
    - name: create a docker network '{{ network_name }}'
      shell: docker network create  {{ opt_driver }}  {{ opt_ipam_driver }}  {{ opt_subnet }}  {{ opt_gateway }}  {{ opt_ipam_neutron_opt }}  {{ network_name }}
    - name: network inspection '{{ network_name }}'
      shell: docker network inspect  {{ network_name }} 
    {% endif -%} 
