blob: 0d1a0bdab1b0ec8f276282abef0df9aa27649dc6 [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
Jan Cachb3092722018-01-31 12:46:16 +0100351
352
353Enforce Floating Ip Pool configuration
354----------------------------------------
355
356.. code-block: yaml
357
358 floating_ip_pool_present
359 - vn_name: virtual_network_name
360 - vn_project:
361 - vn_domain
362 - owner_access: owner_access_permission
363 - global_access: global_access_permission
364 - projects: list of project-permission pairs
Ales Komarekad46d2e2017-03-09 17:16:38 +0100365'''
366
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200367
Ales Komarekad46d2e2017-03-09 17:16:38 +0100368def __virtual__():
369 '''
370 Load Contrail module
371 '''
372 return 'contrail'
373
374
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200375def virtual_router_present(name, ip_address, router_type=None, dpdk_enabled=False, **kwargs):
Ales Komarekad46d2e2017-03-09 17:16:38 +0100376 '''
377 Ensures that the Contrail virtual router exists.
378
379 :param name: Virtual router name
380 :param ip_address: Virtual router IP address
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200381 :param router_type: Any of ['tor-agent', 'tor-service-node', 'embedded']
Ales Komarekad46d2e2017-03-09 17:16:38 +0100382 '''
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200383 ret = __salt__['contrail.virtual_router_create'](name, ip_address, router_type, dpdk_enabled, **kwargs)
384 if len(ret['changes']) == 0:
Ales Komarekad46d2e2017-03-09 17:16:38 +0100385 pass
Ales Komarekad46d2e2017-03-09 17:16:38 +0100386 return ret
387
388
389def virtual_router_absent(name, **kwargs):
390 '''
391 Ensure that the Contrail virtual router doesn't exist
392
393 :param name: The name of the virtual router that should not exist
394 '''
395 ret = {'name': name,
396 'changes': {},
397 'result': True,
398 'comment': 'Virtual router "{0}" is already absent'.format(name)}
399 virtual_router = __salt__['contrail.virtual_router_get'](name, **kwargs)
400 if 'Error' not in virtual_router:
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200401 ret = __salt__['contrail.virtual_router_delete'](name, **kwargs)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200402 return ret
Ales Komarekad46d2e2017-03-09 17:16:38 +0100403
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200404
405def physical_router_present(name, parent_type=None,
406 management_ip=None,
407 dataplane_ip=None, # VTEP address in web GUI
408 vendor_name=None,
409 product_name=None,
410 vnc_managed=None,
411 junos_service_ports=None,
412 agents=None, **kwargs):
413 '''
414 Ensures that the Contrail virtual router exists.
415
416 :param name: Physical router name
417 :param parent_type: Parent resource type: Any of ['global-system-config']
418 :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.
419 :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.
420 :param vendor_name: Vendor name of the physical router (e.g juniper). Used by the device manager to select driver.
421 :param product_name: Model name of the physical router (e.g juniper). Used by the device manager to select driver.
422 :param vnc_managed: This physical router is enabled to be configured by device manager.
423 :param user_credentials: Username and password for netconf to the physical router by device manager.
424 :param junos_service_ports: Juniper JUNOS specific service interfaces name to perform services like NAT.
425 :param agents: List of virtual-router references
426 '''
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200427
428 ret = __salt__['contrail.physical_router_create'](name, parent_type, management_ip, dataplane_ip, vendor_name,
429 product_name, vnc_managed, junos_service_ports, agents,
430 **kwargs)
431 if len(ret['changes']) == 0:
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200432 pass
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200433 return ret
434
435
436def physical_router_absent(name, **kwargs):
437 '''
438 Ensure that the Contrail physical router doesn't exist
439
440 :param name: The name of the physical router that should not exist
441 '''
442 ret = {'name': name,
443 'changes': {},
444 'result': True,
445 'comment': 'Physical router "{0}" is already absent'.format(name)}
446 physical_router = __salt__['contrail.physical_router_get'](name, **kwargs)
447 if 'Error' not in physical_router:
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200448 ret = __salt__['contrail.physical_router_delete'](name, **kwargs)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200449 return ret
450
451
452def physical_interface_present(name, physical_router, **kwargs):
453 '''
454 Ensures that the Contrail physical interface exists.
455
456 :param name: Physical interface name
457 :param physical_router: Name of existing physical router
458 '''
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200459 ret = __salt__['contrail.physical_interface_create'](name, physical_router, **kwargs)
460 if len(ret['changes']) == 0:
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200461 pass
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200462 return ret
463
464
465def physical_interface_absent(name, physical_router, **kwargs):
466 '''
467 Ensure that the Contrail physical interface doesn't exist
468
469 :param name: The name of the physical interface that should not exist
470 :param physical_router: Physical router name
471 '''
472 ret = {'name': name,
473 'changes': {},
474 'result': True,
475 'comment': 'Physical interface "{0}" is already absent'.format(name)}
476 physical_interface = __salt__['contrail.physical_interface_get'](name, physical_router, **kwargs)
477 if 'Error' not in physical_interface:
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200478 ret = __salt__['contrail.physical_interface_delete'](name, physical_router, **kwargs)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200479 return ret
480
481
Vasyl Saienkob10b7202017-09-05 14:19:03 +0300482def logical_interface_present(name, parent_names, parent_type, vlan_tag=None, interface_type="L2",
483 vmis=None, **kwargs):
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200484 '''
485 Ensures that the Contrail logical interface exists.
486
487 :param name: Logical interface name
488 :param parent_names: List of parents
489 :param parent_type Parent resource type. Any of ['physical-router', 'physical-interface']
490 :param vlan_tag: VLAN tag (.1Q) classifier for this logical interface.
Vasyl Saienkob10b7202017-09-05 14:19:03 +0300491 :param interface_type: Logical interface type can be L2 or L3.
492 :param vmis: Virtual machine interface name associate with
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200493 '''
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200494 ret = __salt__['contrail.logical_interface_create'](name, parent_names, parent_type, vlan_tag,
495 interface_type, vmis=vmis, **kwargs)
496 if len(ret['changes']) == 0:
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200497 pass
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200498 return ret
499
500
501def logical_interface_absent(name, parent_names, parent_type=None, **kwargs):
502 '''
503 Ensure that the Contrail logical interface doesn't exist
504
505 :param name: The name of the logical interface that should not exist
506 :param parent_names: List of parent names. Example ['phr01','ge-0/1/0']
507 :param parent_type: Parent resource type. Any of ['physical-router', 'physical-interface']
508 '''
509 ret = {'name': name,
510 'changes': {},
511 'result': True,
512 'comment': 'logical interface "{0}" is already absent'.format(name)}
513 logical_interface = __salt__['contrail.logical_interface_get'](name, parent_names, parent_type, **kwargs)
514 if 'Error' not in logical_interface:
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200515 ret = __salt__['contrail.logical_interface_delete'](name, parent_names, parent_type, **kwargs)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200516 return ret
517
518
519def global_vrouter_config_present(name, parent_type, encap_priority="MPLSoUDP,MPLSoGRE", vxlan_vn_id_mode="automatic",
Pavel Svimberskydbd52ea2017-12-05 18:05:25 +0100520 flow_export_rate=None, *fq_names, **kwargs):
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200521 '''
522 Ensures that the Contrail global vrouter config exists.
523
524 :param name: Global vrouter config name
525 :param parent_type: Parent resource type
526 :param encap_priority: Ordered list of encapsulations that vrouter will use in priority order
527 :param vxlan_vn_id_mode: Method of allocation of VxLAN VNI(s).
528 :param fq_names: Fully Qualified Name of resource devided <string>array
Pavel Svimberskydbd52ea2017-12-05 18:05:25 +0100529 :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 +0200530 '''
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200531 ret = __salt__['contrail.global_vrouter_config_create'](name, parent_type, encap_priority, vxlan_vn_id_mode,
Pavel Svimberskydbd52ea2017-12-05 18:05:25 +0100532 flow_export_rate, *fq_names, **kwargs)
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200533 if len(ret['changes']) == 0:
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200534 pass
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200535 return ret
536
537
538def global_vrouter_config_absent(name, **kwargs):
539 '''
540 Ensure that the Contrail global vrouter config doesn't exist
541
542 :param name: The name of the global vrouter config that should not exist
543 '''
544 ret = {'name': name,
545 'changes': {},
546 'result': True,
547 'comment': 'Global vrouter config "{0}" is already absent'.format(name)}
548 vrouter_conf = __salt__['contrail.global_vrouter_config_get'](name, **kwargs)
549 if 'Error' not in vrouter_conf:
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200550 ret = __salt__['contrail.global_vrouter_config_delete'](name, **kwargs)
Ales Komarekad46d2e2017-03-09 17:16:38 +0100551 return ret
552
553
Petr Jediný5f3efe32017-05-26 17:55:09 +0200554def linklocal_service_present(name, lls_ip, lls_port, ipf_addresses, ipf_port, **kwargs):
555 '''
556 Ensures that the Contrail link local service entry exists.
557
558 :param name: Link local service name
559 :param lls_ip: Link local ip address
560 :param lls_port: Link local service port
561 :param ipf_addresses: IP fabric dns name or list of IP fabric ip addresses
562 :param ipf_port: IP fabric port
563 '''
564 ret = {'name': name,
565 'changes': {},
566 'result': True,
567 'comment': 'Link local service "{0}" already exists'.format(name)}
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200568
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200569 ret = __salt__['contrail.linklocal_service_create'](name, lls_ip, lls_port, ipf_addresses, ipf_port, **kwargs)
570 if len(ret['changes']) == 0:
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200571 pass
Petr Jediný5f3efe32017-05-26 17:55:09 +0200572 return ret
573
574
575def linklocal_service_absent(name, **kwargs):
576 '''
577 Ensure that the Contrail link local service entry doesn't exist
578
579 :param name: The name of the link local service entry
580 '''
581 ret = {'name': name,
582 'changes': {},
583 'result': True,
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200584 'comment': 'Linklocal service "{0}" is already absent'.format(name)}
Petr Jediný5f3efe32017-05-26 17:55:09 +0200585 lls = __salt__['contrail.linklocal_service_get'](name, **kwargs)
586 if 'Error' not in lls:
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200587 ret = __salt__['contrail.linklocal_service_delete'](name, **kwargs)
Petr Jediný5f3efe32017-05-26 17:55:09 +0200588 return ret
589
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200590
Ales Komarekad46d2e2017-03-09 17:16:38 +0100591def analytics_node_present(name, ip_address, **kwargs):
592 '''
593 Ensures that the Contrail analytics node exists.
594
595 :param name: Analytics node name
596 '''
597 ret = {'name': name,
598 'changes': {},
599 'result': True,
600 'comment': 'Analytics node {0} already exists'.format(name)}
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200601
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200602 ret = __salt__['contrail.analytics_node_create'](name, ip_address, **kwargs)
603 if len(ret['changes']) == 0:
Ales Komarekad46d2e2017-03-09 17:16:38 +0100604 pass
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200605 return ret
606
607
608def analytics_node_absent(name, **kwargs):
609 '''
610 Ensure that the Contrail analytics node doesn't exist
611
612 :param name: The name of the analytics node that should not exist
613 '''
614 ret = {'name': name,
615 'changes': {},
616 'result': True,
617 'comment': 'Analytics node "{0}" is already absent'.format(name)}
618 node = __salt__['contrail.analytics_node_get'](name, **kwargs)
619 if 'Error' not in node:
620 ret = __salt__['contrail.analytics_node_delete'](name, **kwargs)
Ales Komarekad46d2e2017-03-09 17:16:38 +0100621 return ret
622
623
624def config_node_present(name, ip_address, **kwargs):
625 '''
626 Ensures that the Contrail config node exists.
627
628 :param name: Config node name
629 '''
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200630 ret = __salt__['contrail.config_node_create'](name, ip_address, **kwargs)
631 if len(ret['changes']) == 0:
632 pass
633 return ret
634
635
636def config_node_absent(name, **kwargs):
637 '''
638 Ensure that the Contrail config node doesn't exist
639
640 :param name: The name of the config node that should not exist
641 '''
Ales Komarekad46d2e2017-03-09 17:16:38 +0100642 ret = {'name': name,
643 'changes': {},
644 'result': True,
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200645 'comment': 'Config node "{0}" is already absent'.format(name)}
646 node = __salt__['contrail.config_node_get'](name, **kwargs)
647 if 'Error' not in node:
648 ret = __salt__['contrail.config_node_delete'](name, **kwargs)
Ales Komarekad46d2e2017-03-09 17:16:38 +0100649 return ret
650
651
Marek Celoud3097e5b2018-01-09 13:52:14 +0100652def bgp_router_present(name, type, ip_address, asn=64512, key_type=None, key=None, **kwargs):
Ales Komarekad46d2e2017-03-09 17:16:38 +0100653 '''
654 Ensures that the Contrail BGP router exists.
655
656 :param name: BGP router name
657 '''
658 ret = {'name': name,
659 'changes': {},
660 'result': True,
661 'comment': 'BGP router {0} already exists'.format(name)}
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200662
Marek Celoud3097e5b2018-01-09 13:52:14 +0100663 ret = __salt__['contrail.bgp_router_create'](name, type, ip_address, asn, key_type, key, **kwargs)
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200664 if len(ret['changes']) == 0:
Ales Komarekad46d2e2017-03-09 17:16:38 +0100665 pass
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200666 return ret
667
668
669def bgp_router_absent(name, **kwargs):
670 '''
671 Ensure that the Contrail BGP router doesn't exist
672
673 :param name: The name of the BGP router that should not exist
674 '''
675 ret = {'name': name,
676 'changes': {},
677 'result': True,
678 'comment': 'BGP router "{0}" is already absent'.format(name)}
679 node = __salt__['contrail.bgp_router_get'](name, **kwargs)
680 if 'Error' not in node:
681 ret = __salt__['contrail.bgp_router_delete'](name, **kwargs)
Ales Komarekad46d2e2017-03-09 17:16:38 +0100682 return ret
683
684
685def database_node_present(name, ip_address, **kwargs):
686 '''
687 Ensures that the Contrail database node exists.
688
689 :param name: Database node name
690 '''
691 ret = {'name': name,
692 'changes': {},
693 'result': True,
694 'comment': 'Database node {0} already exists'.format(name)}
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200695 ret = __salt__['contrail.database_node_create'](name, ip_address, **kwargs)
696 if len(ret['changes']) == 0:
Ales Komarekad46d2e2017-03-09 17:16:38 +0100697 pass
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200698 return ret
699
700
701def database_node_absent(name, **kwargs):
702 '''
703 Ensure that the Contrail database node doesn't exist
704
705 :param name: The name of the database node that should not exist
706 '''
707 ret = {'name': name,
708 'changes': {},
709 'result': True,
710 'comment': 'Database node "{0}" is already absent'.format(name)}
711 node = __salt__['contrail.database_node_get'](name, **kwargs)
712 if 'Error' not in node:
713 ret = __salt__['contrail.database_node_delete'](name, **kwargs)
Ales Komarekad46d2e2017-03-09 17:16:38 +0100714 return ret
Vasyl Saienkob10b7202017-09-05 14:19:03 +0300715
716
717def virtual_machine_interface_present(name,
718 virtual_network,
719 mac_address=None,
720 ip_address=None,
721 security_group=None,
Pavel Svimbersky4358c352017-09-27 13:23:46 +0200722 **kwargs):
Vasyl Saienkob10b7202017-09-05 14:19:03 +0300723 '''
724 Ensures that the Contrail virtual machine interface exists.
725
726 :param name: Virtual machine interface name
727 :param virtual_network: Network name
728 :param mac_address: Mac address of vmi interface
729 :param ip_address: Virtual machine interface ip address
730 '''
731 ret = {'name': name,
732 'changes': {},
733 'result': True,
734 'comment': 'Virtual machine interface "{0}" already exists'.format(name)}
735
736 vmis = __salt__['contrail.virtual_machine_interface_list'](**kwargs)
737
738 for vmi in vmis:
739 if vmi['name'] == name:
740 return ret
741
742 vmi = __salt__['contrail.virtual_machine_interface_create'](name, virtual_network,
743 mac_address=mac_address,
744 ip_address=ip_address,
745 security_group=security_group,
746 **kwargs)
747 if vmi['name'] == name:
748 ret['comment'] = 'Virtual machine interface {0} has been created'.format(name)
749 ret['result'] = True
750 else:
751 ret['comment'] = 'Virtual machine interface {0} creation failed'.format(name)
752 ret['result'] = False
753 return ret
Pavel Svimbersky5ba8a7b2017-09-21 11:07:48 +0200754
755
756def service_appliance_set_present(name,
757 properties=None,
758 driver=None,
759 ha_mode=None,
760 **kwargs):
761 '''
762 Ensures that the Contrail service appliance set exists.
763
764 :param name: Service appliance set name
765 :param properties: Key:Value pairs that are used by the provider driver and opaque to sytem.
766 :param driver: Name of the provider driver for this service appliance set.
767 :param ha_mode: High availability mode for the service appliance set, active-active or active-backup.
768 '''
769 ret = __salt__['contrail.service_appliance_set_create'](name, properties, driver, ha_mode, **kwargs)
770 if len(ret['changes']) == 0:
771 pass
772 return ret
773
774
775def service_appliance_set_absent(name, **kwargs):
776 '''
777 Ensure that the Contrail service appliance set doesn't exist
778
779 :param name: The name of the service appliance set that should not exist
780 '''
781 ret = {'name': name,
782 'changes': {},
783 'result': True,
784 'comment': 'Service appliance set "{0}" is already absent'.format(name)}
785 physical_router = __salt__['contrail.service_appliance_set_get'](name, **kwargs)
786 if 'Error' not in physical_router:
787 ret = __salt__['contrail.service_appliance_set_delete'](name, **kwargs)
788 return ret
Pavel Svimberskydbd52ea2017-12-05 18:05:25 +0100789
790
791def global_system_config_present(name, ans=64512, grp=None, **kwargs):
792 '''
793 Ensures that the Contrail global system config exists or is updated
794
795 :param name: Virtual router name
796 :param ans: Autonomous system number
797 :param grp: Graceful-Restart-Parameters - dict of parameters
798 '''
799 ret = __salt__['contrail.global_system_config_create'](name=name, ans=ans, grp=grp, **kwargs)
800 if len(ret['changes']) == 0:
801 pass
802 return ret
803
804
805def global_system_config_absent(name, **kwargs):
806 '''
807 Ensure that the Contrail global system config doesn't exist
808
809 :param name: The name of the global system config that should not exist
810 '''
811 ret = {'name': name,
812 'changes': {},
813 'result': True,
814 'comment': 'Global system config "{0}" is already absent'.format(name)}
815 gsc = __salt__['contrail.global_system_config_get'](name, **kwargs)
816 if 'Error' not in gsc:
817 ret = __salt__['contrail.global_system_config_delete'](name, **kwargs)
818 return ret
Jan Cachebfed1c2018-01-09 17:21:35 +0100819
820
ibumarskov6ec99c42019-02-20 11:44:22 +0400821def virtual_network_present(name, domain='default-domain', project='admin',
822 ipam_domain='default-domain',
823 ipam_project='default-project',
824 ipam_name='default-network-ipam',
825 router_external=None, route_target_list=None,
826 subnet_conf=None, vntype_conf=None, **kwargs):
Jan Cachebfed1c2018-01-09 17:21:35 +0100827 '''
828 Ensure that the virtual network exists.
829
ibumarskov6ec99c42019-02-20 11:44:22 +0400830 :param name (str): name of the network (required)
831 :param domain (str): name of domain (optional)
832 :param project (str): name of project (optional)
833 :param ipam_domain (str): domain for ipam (optional)
834 :param ipam_project (str): project for ipam (optional)
835 :param ipam_name (str): name of IP Address Management (optional)
836 :param router_external (bool): When true, this virtual network is openstack
837 router external network. (optional)
838 :param route_target_list (list): route target list - format is
839 ['target:<asn>:<target>']
840 :param subnet_conf (dict):
841 ip_prefix (string) optional - format is xxx.xxx.xxx.xxx
842 ip_prefix_len (int) optional - format is xx
843 :param vntype_conf (dict):
844 allow_transit (boolean) optional - enable allow transit
845 vxlan_network_identifier (int) - VxLAN VNI value for network
846 forwarding_mode (any of ['l2_l3','l2','l3']) optional
847 - packet forwarding mode for this virtual network
848 rpf (any of ['enabled','disabled']) optional
849 - Enable or disable Reverse Path Forwarding check
850 for this network
851 mirror_destination (boolean) optional
852 - Mark the vn as mirror destination network
Jan Cachebfed1c2018-01-09 17:21:35 +0100853 '''
854
ibumarskov6ec99c42019-02-20 11:44:22 +0400855 ret = __salt__['contrail.virtual_network_create'](
856 name, domain='default-domain', project='admin',
857 ipam_domain='default-domain',
858 ipam_project='default-project',
859 ipam_name='default-network-ipam',
860 router_external=None, route_target_list=None,
861 subnet_conf=None, vntype_conf=None, **kwargs)
862 if len(ret['changes']) == 0:
863 pass
Jan Cachebfed1c2018-01-09 17:21:35 +0100864 return ret
Jan Cachb3092722018-01-31 12:46:16 +0100865
ibumarskov6ec99c42019-02-20 11:44:22 +0400866
Jan Cachb3092722018-01-31 12:46:16 +0100867def floating_ip_pool_present(vn_name,
868 vn_project,
869 vn_domain=None,
870 owner_access=None,
871 global_access=None,
872 projects=None,
873 **kwargs):
874 '''
875 Ensure that floating ip pool existst
876 Virtual network with flag external need to be created before this
877 function is called
878
879 :param vn_name: Name of the virtual network with external flag,
880 tell us which floating ip pool we want to manage
881 :param vn_project: Name of the project in which floating pool exists
882 :param vn_domain: Name of the domain in which floating pool exists
883 :param owner_access: permissions rights for owner of the pool
884 :param global_access: permissions rights for other users than owner
885 :param projects: list of pairs (project, permission for given project)
886 '''
887
888 ret = __salt__['contrail.update_floating_ip_pool'](vn_name,
889 vn_project,
890 vn_domain,
891 owner_access,
892 global_access,
893 projects,
894 **kwargs)
895 return ret