blob: b729d26b69d5d2bf35cdf60775b8fb0ea9ddce0c [file] [log] [blame]
Ales Komarekad46d2e2017-03-09 17:16:38 +01001#!/usr/bin/python
2# Copyright 2017 Mirantis, Inc.
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15'''
16Management of Contrail resources
17================================
18
19:depends: - vnc_api Python module
20
21
22Enforce the virtual router existence
23------------------------------------
24
25.. code-block:: yaml
26
27 virtual_router:
28 contrail.virtual_router_present:
Pavel Svimbersky483a19e2017-08-22 09:50:29 +020029 name: tor01
Ales Komarekad46d2e2017-03-09 17:16:38 +010030 ip_address: 10.0.0.23
31 dpdk_enabled: False
Pavel Svimbersky483a19e2017-08-22 09:50:29 +020032 router_type: tor-agent
Ales Komarekad46d2e2017-03-09 17:16:38 +010033
34
35Enforce the virtual router absence
36----------------------------------
37
38.. code-block:: yaml
39
Pavel Svimbersky483a19e2017-08-22 09:50:29 +020040 virtual_router_tor01:
Ales Komarekad46d2e2017-03-09 17:16:38 +010041 contrail.virtual_router_absent:
Pavel Svimbersky483a19e2017-08-22 09:50:29 +020042 name: tor01
43
44
45Enforce the physical router existence
46------------------------------------
47
48.. code-block:: yaml
49
50 physical_router_phr01:
51 contrail.physical_router_present:
52 name: phr01
53 parent_type: global-system-config
54 management_ip: 10.167.4.206
55 dataplane_ip: 172.17.56.9
56 vendor_name: MyVendor
57 product_name: MyProduct
58 agents:
59 - tor01
60 - tns01
61
62
63Enforce the physical router absence
64----------------------------------
65
66.. code-block:: yaml
67
68 physical_router_delete_phr01:
69 contrail.physical_router_absent:
70 name: phr01
71
72
73Enforce the physical interface present
74----------------------------------
75
76.. code-block:: yaml
77
78 create physical interface ge-0/1/10 for phr01:
79 contrail.physical_interface_present:
80 - name: ge-0/1/10
81 - physical_router: prh01
82
83
84Enforce the physical interface absence
85----------------------------------
86
87.. code-block:: yaml
88
89 physical_interface_delete ge-0/1/10:
90 contrail.physical_interface_absent:
91 name: ge-0/1/10
Pavel Svimbersky4358c352017-09-27 13:23:46 +020092 physical_router: phr01
Pavel Svimbersky483a19e2017-08-22 09:50:29 +020093
94Enforce the logical interface present
95----------------------------------
96
97.. code-block:: yaml
98
99 create logical interface 11/15:
100 contrail.logical_interface_present:
101 - name: ge-0/1/11.15
102 - parent_names:
103 - ge-0/1/11
104 - phr01
105 - parent_type: physical-interface
106 - vlan_tag: 15
107 - interface_type: L3
108
109
110Enforce the logical interface absence
111----------------------------------
112
113.. code-block:: yaml
114
115 logical interface delete ge-0/1/10.0 phr02:
116 contrail.logical_interface_absent:
117 - name: ge-0/1/10.0
118 - parent_names:
119 - ge-0/1/10
120 - phr02
121 - parent_type: physical-interface
122
123
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200124Enforce the global vrouter config existence
125-------------------------------------------
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200126
127.. code-block:: yaml
128
129 #Example
130 opencontrail_client_virtual_router_global_conf_create:
131 contrail.global_vrouter_config_present:
132 - name: "global-vrouter-config"
133 - parent_type: "global-system-config"
134 - encap_priority : "MPLSoUDP,MPLSoGRE"
135 - vxlan_vn_id_mode : "automatic"
Pavel Svimberskydbd52ea2017-12-05 18:05:25 +0100136 - flow_export_rate: 100
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200137 - fq_names:
138 - default-global-system-config
139 - default-global-vrouter-config
140
141
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200142Enforce the global vrouter config absence
143-----------------------------------------
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200144
145.. code-block:: yaml
146
147 #Example
148 opencontrail_client_virtual_router_global_conf_delete:
149 contrail.global_vrouter_config_absent:
150 - name: "global-vrouter-config"
Ales Komarekad46d2e2017-03-09 17:16:38 +0100151
152
Petr Jediný5f3efe32017-05-26 17:55:09 +0200153Enforce the link local service entry existence
154----------------------------------------------
155
156.. code-block:: yaml
157
158 # Example with dns name, only one is permited
159 lls_meta1:
160 contrail.linklocal_service_present:
161 - name: meta1
162 - lls_ip: 10.0.0.23
163 - lls_port: 80
164 - ipf_addresses: "meta.example.com"
165 - ipf_port: 80
166
167 # Example with multiple ip addresses
168 lls_meta2:
169 contrail.linklocal_service_present:
170 - name: meta2
171 - lls_ip: 10.0.0.23
172 - lls_port: 80
173 - ipf_addresses:
174 - 10.10.10.10
175 - 10.20.20.20
176 - 10.30.30.30
177 - ipf_port: 80
178
179 # Example with one ip addresses
180 lls_meta3:
181 contrail.linklocal_service_present:
182 - name: meta3
183 - lls_ip: 10.0.0.23
184 - lls_port: 80
185 - ipf_addresses:
186 - 10.10.10.10
187 - ipf_port: 80
188
189
190Enforce the link local service entry absence
191--------------------------------------------
192
193.. code-block:: yaml
194
195 lls_meta1_delete:
196 contrail.linklocal_service_absent:
197 - name: cmp01
198
199
Ales Komarekad46d2e2017-03-09 17:16:38 +0100200Enforce the analytics node existence
201------------------------------------
202
203.. code-block:: yaml
204
205 analytics_node01:
206 contrail.analytics_node_present:
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200207 - name: nal01
208 - ip_address: 10.0.0.13
209
210
211Enforce the analytics node absence
212------------------------------------
213
214.. code-block:: yaml
215
216 analytics_node01_delete:
217 contrail.analytics_node_absent:
218 - name: nal01
219
Ales Komarekad46d2e2017-03-09 17:16:38 +0100220
221
222Enforce the config node existence
223---------------------------------
224
225.. code-block:: yaml
226
227 config_node01:
228 contrail.config_node_present:
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200229 - name: ntw01
230 - ip_address: 10.0.0.23
Ales Komarekad46d2e2017-03-09 17:16:38 +0100231
232
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200233Enforce the config node absence
234-------------------------------
Ales Komarekad46d2e2017-03-09 17:16:38 +0100235
236.. code-block:: yaml
237
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200238 config_node01_delete:
239 contrail.config_node_absent:
240 - name: ntw01
241
242
243Enforce the BGP router existence
244--------------------------------
245
246.. code-block:: yaml
247
248 BGP router mx01:
249 contrail.bgp_router_present:
250 - name: mx01
251 - ip_address: 10.0.0.133
252 - type: mx
253 - asn: 64512
Marek Celoud3097e5b2018-01-09 13:52:14 +0100254 - key_type: md5
255 - key: password
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200256
257
258Enforce the BGP router absence
259------------------------------
260
261.. code-block:: yaml
262
263 BGP router mx01:
264 contrail.bgp_router_absence:
265 - name: mx01
Ales Komarekad46d2e2017-03-09 17:16:38 +0100266
Pavel Svimbersky5ba8a7b2017-09-21 11:07:48 +0200267
268Enforce the service appliance set existence
269-------------------------------------------
270
271.. code-block:: yaml
272
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200273 create service appliance:
274 contrail.service_appliance_set_present:
275 - name: testappliance
276 - driver: 'neutron_lbaas.drivers.avi.avi_ocdriver.OpencontrailAviLoadbalancerDriver'
277 - ha_mode: active-backup
278 - properties:
279 address: 10.1.11.3
280 user: admin
281 password: avi123
282 cloud: Default-Cloud
Pavel Svimbersky5ba8a7b2017-09-21 11:07:48 +0200283
284
285Enforce the service appliance set entry absence
286-----------------------------------------------
287
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200288 .. code-block:: yaml
Pavel Svimbersky5ba8a7b2017-09-21 11:07:48 +0200289
290 delete service appliance:
291 contrail.service_appliance_set_absent:
292 - name: testappliance
293
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200294
295Enforce the database node existence
296-----------------------------------
297
298.. code-block:: yaml
299
300 database_node01:
301 contrail.database_node_present:
302 - name: dbs01
303 - ip_address: 10.0.0.33
304
Pavel Svimberskydbd52ea2017-12-05 18:05:25 +0100305
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200306Enforce the database node absence
307-----------------------------------
308
309.. code-block:: yaml
310
311 database_node01:
312 contrail.database_node_absent:
313 - name: dbs01
314
315
Pavel Svimberskydbd52ea2017-12-05 18:05:25 +0100316Enforce the global system config existence
317------------------------------------------
318
319.. code-block:: yaml
320 global_system_config_update:
321 contrail.global_system_config_present:
322 - name: default-global-system_config
323 - ans: 64512
324 - grp:
325 enable: true
326 restart_time: 400
327 bgp_helper_enable: true
328 xmpp_helper_enable: true
329 long_lived_restart_time: 400
330 end_of_rib_timeout: 40
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200331
332
Pavel Svimberskydbd52ea2017-12-05 18:05:25 +0100333Enforce the global system config absence
334----------------------------------------
335
336.. code-block:: yaml
337
338 global_system_config_delete:
339 contrail.global_system_config_absent:
340 - name: global-system_config
Jan Cachebfed1c2018-01-09 17:21:35 +0100341
342
343Enforce the virtual network existence
344----------------------------------------
345
346.. code-block: yaml
347
348 virtual_network_create:
349 contrail.virtual_network_present:
350 - name: virtual_network_name
351 - conf:
352 domain: domain name
353 project: domain project
354 ipam_domain: ipam domain name
355 ipam_project: ipam project name
356 ipam_name: ipam name
357 ip_prefix: xxx.xxx.xxx.xxx
358 ip_prefix_len: 24
359 asn: 64512
360 target: 10000
361 external: False
362 allow_transit: False
363 forwading_mode: 'l2_l3'
364 rpf: 'disabled'
365 mirror_destination: False
Ales Komarekad46d2e2017-03-09 17:16:38 +0100366'''
367
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200368
Ales Komarekad46d2e2017-03-09 17:16:38 +0100369def __virtual__():
370 '''
371 Load Contrail module
372 '''
373 return 'contrail'
374
375
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200376def virtual_router_present(name, ip_address, router_type=None, dpdk_enabled=False, **kwargs):
Ales Komarekad46d2e2017-03-09 17:16:38 +0100377 '''
378 Ensures that the Contrail virtual router exists.
379
380 :param name: Virtual router name
381 :param ip_address: Virtual router IP address
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200382 :param router_type: Any of ['tor-agent', 'tor-service-node', 'embedded']
Ales Komarekad46d2e2017-03-09 17:16:38 +0100383 '''
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200384 ret = __salt__['contrail.virtual_router_create'](name, ip_address, router_type, dpdk_enabled, **kwargs)
385 if len(ret['changes']) == 0:
Ales Komarekad46d2e2017-03-09 17:16:38 +0100386 pass
Ales Komarekad46d2e2017-03-09 17:16:38 +0100387 return ret
388
389
390def virtual_router_absent(name, **kwargs):
391 '''
392 Ensure that the Contrail virtual router doesn't exist
393
394 :param name: The name of the virtual router that should not exist
395 '''
396 ret = {'name': name,
397 'changes': {},
398 'result': True,
399 'comment': 'Virtual router "{0}" is already absent'.format(name)}
400 virtual_router = __salt__['contrail.virtual_router_get'](name, **kwargs)
401 if 'Error' not in virtual_router:
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200402 ret = __salt__['contrail.virtual_router_delete'](name, **kwargs)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200403 return ret
Ales Komarekad46d2e2017-03-09 17:16:38 +0100404
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200405
406def physical_router_present(name, parent_type=None,
407 management_ip=None,
408 dataplane_ip=None, # VTEP address in web GUI
409 vendor_name=None,
410 product_name=None,
411 vnc_managed=None,
412 junos_service_ports=None,
413 agents=None, **kwargs):
414 '''
415 Ensures that the Contrail virtual router exists.
416
417 :param name: Physical router name
418 :param parent_type: Parent resource type: Any of ['global-system-config']
419 :param management_ip: Management ip for this physical router. It is used by the device manager to perform netconf and by SNMP collector if enabled.
420 :param dataplane_ip: VTEP address in web GUI. This is ip address in the ip-fabric(underlay) network that can be used in data plane by physical router. Usually it is the VTEP address in VxLAN for the TOR switch.
421 :param vendor_name: Vendor name of the physical router (e.g juniper). Used by the device manager to select driver.
422 :param product_name: Model name of the physical router (e.g juniper). Used by the device manager to select driver.
423 :param vnc_managed: This physical router is enabled to be configured by device manager.
424 :param user_credentials: Username and password for netconf to the physical router by device manager.
425 :param junos_service_ports: Juniper JUNOS specific service interfaces name to perform services like NAT.
426 :param agents: List of virtual-router references
427 '''
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200428
429 ret = __salt__['contrail.physical_router_create'](name, parent_type, management_ip, dataplane_ip, vendor_name,
430 product_name, vnc_managed, junos_service_ports, agents,
431 **kwargs)
432 if len(ret['changes']) == 0:
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200433 pass
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200434 return ret
435
436
437def physical_router_absent(name, **kwargs):
438 '''
439 Ensure that the Contrail physical router doesn't exist
440
441 :param name: The name of the physical router that should not exist
442 '''
443 ret = {'name': name,
444 'changes': {},
445 'result': True,
446 'comment': 'Physical router "{0}" is already absent'.format(name)}
447 physical_router = __salt__['contrail.physical_router_get'](name, **kwargs)
448 if 'Error' not in physical_router:
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200449 ret = __salt__['contrail.physical_router_delete'](name, **kwargs)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200450 return ret
451
452
453def physical_interface_present(name, physical_router, **kwargs):
454 '''
455 Ensures that the Contrail physical interface exists.
456
457 :param name: Physical interface name
458 :param physical_router: Name of existing physical router
459 '''
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200460 ret = __salt__['contrail.physical_interface_create'](name, physical_router, **kwargs)
461 if len(ret['changes']) == 0:
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200462 pass
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200463 return ret
464
465
466def physical_interface_absent(name, physical_router, **kwargs):
467 '''
468 Ensure that the Contrail physical interface doesn't exist
469
470 :param name: The name of the physical interface that should not exist
471 :param physical_router: Physical router name
472 '''
473 ret = {'name': name,
474 'changes': {},
475 'result': True,
476 'comment': 'Physical interface "{0}" is already absent'.format(name)}
477 physical_interface = __salt__['contrail.physical_interface_get'](name, physical_router, **kwargs)
478 if 'Error' not in physical_interface:
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200479 ret = __salt__['contrail.physical_interface_delete'](name, physical_router, **kwargs)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200480 return ret
481
482
Vasyl Saienkob10b7202017-09-05 14:19:03 +0300483def logical_interface_present(name, parent_names, parent_type, vlan_tag=None, interface_type="L2",
484 vmis=None, **kwargs):
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200485 '''
486 Ensures that the Contrail logical interface exists.
487
488 :param name: Logical interface name
489 :param parent_names: List of parents
490 :param parent_type Parent resource type. Any of ['physical-router', 'physical-interface']
491 :param vlan_tag: VLAN tag (.1Q) classifier for this logical interface.
Vasyl Saienkob10b7202017-09-05 14:19:03 +0300492 :param interface_type: Logical interface type can be L2 or L3.
493 :param vmis: Virtual machine interface name associate with
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200494 '''
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200495 ret = __salt__['contrail.logical_interface_create'](name, parent_names, parent_type, vlan_tag,
496 interface_type, vmis=vmis, **kwargs)
497 if len(ret['changes']) == 0:
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200498 pass
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200499 return ret
500
501
502def logical_interface_absent(name, parent_names, parent_type=None, **kwargs):
503 '''
504 Ensure that the Contrail logical interface doesn't exist
505
506 :param name: The name of the logical interface that should not exist
507 :param parent_names: List of parent names. Example ['phr01','ge-0/1/0']
508 :param parent_type: Parent resource type. Any of ['physical-router', 'physical-interface']
509 '''
510 ret = {'name': name,
511 'changes': {},
512 'result': True,
513 'comment': 'logical interface "{0}" is already absent'.format(name)}
514 logical_interface = __salt__['contrail.logical_interface_get'](name, parent_names, parent_type, **kwargs)
515 if 'Error' not in logical_interface:
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200516 ret = __salt__['contrail.logical_interface_delete'](name, parent_names, parent_type, **kwargs)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200517 return ret
518
519
520def global_vrouter_config_present(name, parent_type, encap_priority="MPLSoUDP,MPLSoGRE", vxlan_vn_id_mode="automatic",
Pavel Svimberskydbd52ea2017-12-05 18:05:25 +0100521 flow_export_rate=None, *fq_names, **kwargs):
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200522 '''
523 Ensures that the Contrail global vrouter config exists.
524
525 :param name: Global vrouter config name
526 :param parent_type: Parent resource type
527 :param encap_priority: Ordered list of encapsulations that vrouter will use in priority order
528 :param vxlan_vn_id_mode: Method of allocation of VxLAN VNI(s).
529 :param fq_names: Fully Qualified Name of resource devided <string>array
Pavel Svimberskydbd52ea2017-12-05 18:05:25 +0100530 :param flow_export_rate: Flow export rate is global config, rate at which each vrouter will sample and export flow records to analytics
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200531 '''
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200532 ret = __salt__['contrail.global_vrouter_config_create'](name, parent_type, encap_priority, vxlan_vn_id_mode,
Pavel Svimberskydbd52ea2017-12-05 18:05:25 +0100533 flow_export_rate, *fq_names, **kwargs)
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200534 if len(ret['changes']) == 0:
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200535 pass
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200536 return ret
537
538
539def global_vrouter_config_absent(name, **kwargs):
540 '''
541 Ensure that the Contrail global vrouter config doesn't exist
542
543 :param name: The name of the global vrouter config that should not exist
544 '''
545 ret = {'name': name,
546 'changes': {},
547 'result': True,
548 'comment': 'Global vrouter config "{0}" is already absent'.format(name)}
549 vrouter_conf = __salt__['contrail.global_vrouter_config_get'](name, **kwargs)
550 if 'Error' not in vrouter_conf:
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200551 ret = __salt__['contrail.global_vrouter_config_delete'](name, **kwargs)
Ales Komarekad46d2e2017-03-09 17:16:38 +0100552 return ret
553
554
Petr Jediný5f3efe32017-05-26 17:55:09 +0200555def linklocal_service_present(name, lls_ip, lls_port, ipf_addresses, ipf_port, **kwargs):
556 '''
557 Ensures that the Contrail link local service entry exists.
558
559 :param name: Link local service name
560 :param lls_ip: Link local ip address
561 :param lls_port: Link local service port
562 :param ipf_addresses: IP fabric dns name or list of IP fabric ip addresses
563 :param ipf_port: IP fabric port
564 '''
565 ret = {'name': name,
566 'changes': {},
567 'result': True,
568 'comment': 'Link local service "{0}" already exists'.format(name)}
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200569
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200570 ret = __salt__['contrail.linklocal_service_create'](name, lls_ip, lls_port, ipf_addresses, ipf_port, **kwargs)
571 if len(ret['changes']) == 0:
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200572 pass
Petr Jediný5f3efe32017-05-26 17:55:09 +0200573 return ret
574
575
576def linklocal_service_absent(name, **kwargs):
577 '''
578 Ensure that the Contrail link local service entry doesn't exist
579
580 :param name: The name of the link local service entry
581 '''
582 ret = {'name': name,
583 'changes': {},
584 'result': True,
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200585 'comment': 'Linklocal service "{0}" is already absent'.format(name)}
Petr Jediný5f3efe32017-05-26 17:55:09 +0200586 lls = __salt__['contrail.linklocal_service_get'](name, **kwargs)
587 if 'Error' not in lls:
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200588 ret = __salt__['contrail.linklocal_service_delete'](name, **kwargs)
Petr Jediný5f3efe32017-05-26 17:55:09 +0200589 return ret
590
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200591
Ales Komarekad46d2e2017-03-09 17:16:38 +0100592def analytics_node_present(name, ip_address, **kwargs):
593 '''
594 Ensures that the Contrail analytics node exists.
595
596 :param name: Analytics node name
597 '''
598 ret = {'name': name,
599 'changes': {},
600 'result': True,
601 'comment': 'Analytics node {0} already exists'.format(name)}
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200602
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200603 ret = __salt__['contrail.analytics_node_create'](name, ip_address, **kwargs)
604 if len(ret['changes']) == 0:
Ales Komarekad46d2e2017-03-09 17:16:38 +0100605 pass
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200606 return ret
607
608
609def analytics_node_absent(name, **kwargs):
610 '''
611 Ensure that the Contrail analytics node doesn't exist
612
613 :param name: The name of the analytics node that should not exist
614 '''
615 ret = {'name': name,
616 'changes': {},
617 'result': True,
618 'comment': 'Analytics node "{0}" is already absent'.format(name)}
619 node = __salt__['contrail.analytics_node_get'](name, **kwargs)
620 if 'Error' not in node:
621 ret = __salt__['contrail.analytics_node_delete'](name, **kwargs)
Ales Komarekad46d2e2017-03-09 17:16:38 +0100622 return ret
623
624
625def config_node_present(name, ip_address, **kwargs):
626 '''
627 Ensures that the Contrail config node exists.
628
629 :param name: Config node name
630 '''
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200631 ret = __salt__['contrail.config_node_create'](name, ip_address, **kwargs)
632 if len(ret['changes']) == 0:
633 pass
634 return ret
635
636
637def config_node_absent(name, **kwargs):
638 '''
639 Ensure that the Contrail config node doesn't exist
640
641 :param name: The name of the config node that should not exist
642 '''
Ales Komarekad46d2e2017-03-09 17:16:38 +0100643 ret = {'name': name,
644 'changes': {},
645 'result': True,
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200646 'comment': 'Config node "{0}" is already absent'.format(name)}
647 node = __salt__['contrail.config_node_get'](name, **kwargs)
648 if 'Error' not in node:
649 ret = __salt__['contrail.config_node_delete'](name, **kwargs)
Ales Komarekad46d2e2017-03-09 17:16:38 +0100650 return ret
651
652
Marek Celoud3097e5b2018-01-09 13:52:14 +0100653def bgp_router_present(name, type, ip_address, asn=64512, key_type=None, key=None, **kwargs):
Ales Komarekad46d2e2017-03-09 17:16:38 +0100654 '''
655 Ensures that the Contrail BGP router exists.
656
657 :param name: BGP router name
658 '''
659 ret = {'name': name,
660 'changes': {},
661 'result': True,
662 'comment': 'BGP router {0} already exists'.format(name)}
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200663
Marek Celoud3097e5b2018-01-09 13:52:14 +0100664 ret = __salt__['contrail.bgp_router_create'](name, type, ip_address, asn, key_type, key, **kwargs)
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200665 if len(ret['changes']) == 0:
Ales Komarekad46d2e2017-03-09 17:16:38 +0100666 pass
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200667 return ret
668
669
670def bgp_router_absent(name, **kwargs):
671 '''
672 Ensure that the Contrail BGP router doesn't exist
673
674 :param name: The name of the BGP router that should not exist
675 '''
676 ret = {'name': name,
677 'changes': {},
678 'result': True,
679 'comment': 'BGP router "{0}" is already absent'.format(name)}
680 node = __salt__['contrail.bgp_router_get'](name, **kwargs)
681 if 'Error' not in node:
682 ret = __salt__['contrail.bgp_router_delete'](name, **kwargs)
Ales Komarekad46d2e2017-03-09 17:16:38 +0100683 return ret
684
685
686def database_node_present(name, ip_address, **kwargs):
687 '''
688 Ensures that the Contrail database node exists.
689
690 :param name: Database node name
691 '''
692 ret = {'name': name,
693 'changes': {},
694 'result': True,
695 'comment': 'Database node {0} already exists'.format(name)}
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200696 ret = __salt__['contrail.database_node_create'](name, ip_address, **kwargs)
697 if len(ret['changes']) == 0:
Ales Komarekad46d2e2017-03-09 17:16:38 +0100698 pass
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200699 return ret
700
701
702def database_node_absent(name, **kwargs):
703 '''
704 Ensure that the Contrail database node doesn't exist
705
706 :param name: The name of the database node that should not exist
707 '''
708 ret = {'name': name,
709 'changes': {},
710 'result': True,
711 'comment': 'Database node "{0}" is already absent'.format(name)}
712 node = __salt__['contrail.database_node_get'](name, **kwargs)
713 if 'Error' not in node:
714 ret = __salt__['contrail.database_node_delete'](name, **kwargs)
Ales Komarekad46d2e2017-03-09 17:16:38 +0100715 return ret
Vasyl Saienkob10b7202017-09-05 14:19:03 +0300716
717
718def virtual_machine_interface_present(name,
719 virtual_network,
720 mac_address=None,
721 ip_address=None,
722 security_group=None,
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200723 **kwargs):
Vasyl Saienkob10b7202017-09-05 14:19:03 +0300724 '''
725 Ensures that the Contrail virtual machine interface exists.
726
727 :param name: Virtual machine interface name
728 :param virtual_network: Network name
729 :param mac_address: Mac address of vmi interface
730 :param ip_address: Virtual machine interface ip address
731 '''
732 ret = {'name': name,
733 'changes': {},
734 'result': True,
735 'comment': 'Virtual machine interface "{0}" already exists'.format(name)}
736
737 vmis = __salt__['contrail.virtual_machine_interface_list'](**kwargs)
738
739 for vmi in vmis:
740 if vmi['name'] == name:
741 return ret
742
743 vmi = __salt__['contrail.virtual_machine_interface_create'](name, virtual_network,
744 mac_address=mac_address,
745 ip_address=ip_address,
746 security_group=security_group,
747 **kwargs)
748 if vmi['name'] == name:
749 ret['comment'] = 'Virtual machine interface {0} has been created'.format(name)
750 ret['result'] = True
751 else:
752 ret['comment'] = 'Virtual machine interface {0} creation failed'.format(name)
753 ret['result'] = False
754 return ret
Pavel Svimbersky5ba8a7b2017-09-21 11:07:48 +0200755
756
757def service_appliance_set_present(name,
758 properties=None,
759 driver=None,
760 ha_mode=None,
761 **kwargs):
762 '''
763 Ensures that the Contrail service appliance set exists.
764
765 :param name: Service appliance set name
766 :param properties: Key:Value pairs that are used by the provider driver and opaque to sytem.
767 :param driver: Name of the provider driver for this service appliance set.
768 :param ha_mode: High availability mode for the service appliance set, active-active or active-backup.
769 '''
770 ret = __salt__['contrail.service_appliance_set_create'](name, properties, driver, ha_mode, **kwargs)
771 if len(ret['changes']) == 0:
772 pass
773 return ret
774
775
776def service_appliance_set_absent(name, **kwargs):
777 '''
778 Ensure that the Contrail service appliance set doesn't exist
779
780 :param name: The name of the service appliance set that should not exist
781 '''
782 ret = {'name': name,
783 'changes': {},
784 'result': True,
785 'comment': 'Service appliance set "{0}" is already absent'.format(name)}
786 physical_router = __salt__['contrail.service_appliance_set_get'](name, **kwargs)
787 if 'Error' not in physical_router:
788 ret = __salt__['contrail.service_appliance_set_delete'](name, **kwargs)
789 return ret
Pavel Svimberskydbd52ea2017-12-05 18:05:25 +0100790
791
792def global_system_config_present(name, ans=64512, grp=None, **kwargs):
793 '''
794 Ensures that the Contrail global system config exists or is updated
795
796 :param name: Virtual router name
797 :param ans: Autonomous system number
798 :param grp: Graceful-Restart-Parameters - dict of parameters
799 '''
800 ret = __salt__['contrail.global_system_config_create'](name=name, ans=ans, grp=grp, **kwargs)
801 if len(ret['changes']) == 0:
802 pass
803 return ret
804
805
806def global_system_config_absent(name, **kwargs):
807 '''
808 Ensure that the Contrail global system config doesn't exist
809
810 :param name: The name of the global system config that should not exist
811 '''
812 ret = {'name': name,
813 'changes': {},
814 'result': True,
815 'comment': 'Global system config "{0}" is already absent'.format(name)}
816 gsc = __salt__['contrail.global_system_config_get'](name, **kwargs)
817 if 'Error' not in gsc:
818 ret = __salt__['contrail.global_system_config_delete'](name, **kwargs)
819 return ret
Jan Cachebfed1c2018-01-09 17:21:35 +0100820
821
822def virtual_network_present(name, conf=None, **kwargs):
823 '''
824 Ensure that the virtual network exists.
825
826 :param name: Name of the virtual network
827 :param conf: Key:Value pairs used for network creation
828 '''
829
830 ret = __salt__['contrail.virtual_network_create'](name, conf, **kwargs)
831 return ret