Merge "Add function create network to contrail plugin"
diff --git a/README.rst b/README.rst
index a940cc6..d465fac 100644
--- a/README.rst
+++ b/README.rst
@@ -1128,6 +1128,35 @@
                     security_group: 'default'
                     virtual_network: 'virtual-network'
 
+Enforcing virtual networks
+
+
+.. code-block:: yaml
+
+  opencontrail:
+    client:
+      virtual_networks:
+        net01:
+          name: 'network01'
+          ip_address: '172.16.111.0'
+          ip_prefix: 24
+          asn: 64512
+          route_target: 10000
+          external: True
+          allow_transit: False
+          forwarding_mode: 'l2_l3'
+          rpf: 'disable'
+          mirror_destination: False
+          domain: 'default-domain'
+          project: 'admin'
+          ipam_domain: 'default-domain'
+          ipam_project: 'default-project'
+          ipam_name: 'default-network-ipam'
+        net02:
+          name: 'network02'
+        net03:
+          name: 'network03'
+
 
 Contrail DNS custom forwarders
 ------------------------------
diff --git a/_states/contrail.py b/_states/contrail.py
index 4632370..b729d26 100644
--- a/_states/contrail.py
+++ b/_states/contrail.py
@@ -338,6 +338,31 @@
     global_system_config_delete:
       contrail.global_system_config_absent:
         - name: global-system_config
+
+
+Enforce the virtual network existence
+----------------------------------------
+
+.. code-block: yaml
+
+    virtual_network_create:
+      contrail.virtual_network_present:
+        - name: virtual_network_name
+        - conf:
+            domain: domain name
+            project: domain project
+            ipam_domain: ipam domain name
+            ipam_project: ipam project name
+            ipam_name: ipam name
+            ip_prefix: xxx.xxx.xxx.xxx
+            ip_prefix_len: 24
+            asn: 64512
+            target: 10000
+            external: False
+            allow_transit: False
+            forwading_mode: 'l2_l3'
+            rpf: 'disabled'
+            mirror_destination: False
 '''
 
 
@@ -792,3 +817,15 @@
     if 'Error' not in gsc:
         ret = __salt__['contrail.global_system_config_delete'](name, **kwargs)
     return ret
+
+
+def virtual_network_present(name, conf=None, **kwargs):
+    '''
+    Ensure that the virtual network exists.
+
+    :param name: Name of the virtual network
+    :param conf: Key:Value pairs used for network creation
+    '''
+
+    ret = __salt__['contrail.virtual_network_create'](name, conf, **kwargs)
+    return ret
diff --git a/opencontrail/client.sls b/opencontrail/client.sls
index 02761c5..ff67a3e 100644
--- a/opencontrail/client.sls
+++ b/opencontrail/client.sls
@@ -236,4 +236,63 @@
 
 {%- endfor %} # end for physical_router
 
+{%- if client.virtual_networks is defined %}
+{%- for vn_name, vn in client.virtual_networks.items() %}
+create_network_{{ vn.name }}:
+  contrail.virtual_network_present:
+  - name: {{ vn.name }}
+  - conf:
+{%- if vn.ip_prefix is defined and vn.ip_prefix_len is defined %}
+      ip: {{ vn.ip_prefix }}
+      prefix: {{ vn.ip_prefix_len }}
+{%- endif %}
+
+{%- if vn.asn is defined and vn.route_target is defined %}
+      asn: {{ vn.asn }}
+      target: {{ vn.route_target }}
+{%- endif %}
+
+{%- if vn.external is defined %}
+      external: {{ vn.external }}
+{%- endif %}
+
+{%- if vn.allow_transit is defined %}
+      allow_transit: {{ vn.allow_transit }}
+{%- endif %}
+
+{%- if vn.forwarding_mode is defined %}
+      forwarding_mode: {{ vn.forwarding_mode }}
+{%- endif %}
+
+{%- if vn.rpf is defined %}
+      rpf: {{ vn.rpf }}
+{%- endif %}
+
+{%- if vn.mirror_destination is defined %}
+      mirror_destination: {{ vn.mirror_destination }}
+{%- endif %}
+
+{%- if vn.domain is defined %}
+      domain: {{ vn.domain }}
+{%- endif %}
+
+{%- if vn.project is defined %}
+      project: {{ vn.project }}
+{%- endif %}
+
+{%- if vn.ipam_domain is defined %}
+      ipam_domain: {{ vn.ipam_domain }}
+{%- endif %}
+
+{%- if vn.ipam_project is defined %}
+      ipam_project: {{ vn.ipam_project }}
+{%- endif %}
+
+{%- if vn.ipam_name is defined %}
+      ipam_name: {{ vn.ipam_name }}
+{%- endif %}
+
+{%- endfor %}
+{%- endif %}  # end for virtual_network
+
 {%- endif %}