blob: 8818922093ccd43db7207140d1067d306c40cfbd [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
16from netaddr import IPNetwork
Pavel Svimbersky483a19e2017-08-22 09:50:29 +020017from vnc_api.vnc_api import PhysicalRouter, PhysicalInterface, LogicalInterface
18from vnc_api.vnc_api import EncapsulationPrioritiesType
Vasyl Saienkob10b7202017-09-05 14:19:03 +030019from vnc_api.vnc_api import VirtualMachineInterface, MacAddressesType
Ales Komarekad46d2e2017-03-09 17:16:38 +010020
21try:
22 from vnc_api import vnc_api
Petr Jediný5f3efe32017-05-26 17:55:09 +020023 from vnc_api.vnc_api import LinklocalServiceEntryType, \
24 LinklocalServicesTypes, GlobalVrouterConfig
Ales Komarekad46d2e2017-03-09 17:16:38 +010025 from vnc_api.gen.resource_client import VirtualRouter, AnalyticsNode, \
26 ConfigNode, DatabaseNode, BgpRouter
27 from vnc_api.gen.resource_xsd import AddressFamilies, BgpSessionAttributes, \
28 BgpSession, BgpPeeringAttributes, BgpRouterParams
Pavel Svimbersky483a19e2017-08-22 09:50:29 +020029
Ales Komarekad46d2e2017-03-09 17:16:38 +010030 HAS_CONTRAIL = True
31except ImportError:
32 HAS_CONTRAIL = False
33
34__opts__ = {}
35
36
37def __virtual__():
38 '''
39 Only load this module if vnc_api library is installed.
40 '''
41 if HAS_CONTRAIL:
42 return 'contrail'
43
44 return False
45
46
47def _auth(**kwargs):
48 '''
49 Set up Contrail API credentials.
50 '''
51 user = kwargs.get('user')
52 password = kwargs.get('password')
53 tenant_name = kwargs.get('project')
54 api_host = kwargs.get('api_server_ip')
55 api_port = kwargs.get('api_server_port')
56 api_base_url = kwargs.get('api_base_url')
57 use_ssl = False
58 auth_host = kwargs.get('auth_host_ip')
59 vnc_lib = vnc_api.VncApi(user, password, tenant_name,
Pavel Svimbersky483a19e2017-08-22 09:50:29 +020060 api_host, api_port, api_base_url, wait_for_connect=True,
61 api_server_use_ssl=use_ssl, auth_host=auth_host)
Ales Komarekad46d2e2017-03-09 17:16:38 +010062
63 return vnc_lib
64
65
Pavel Svimbersky483a19e2017-08-22 09:50:29 +020066def _get_config(vnc_client, global_system_config='default-global-system-config'):
Ales Komarekad46d2e2017-03-09 17:16:38 +010067 try:
68 gsc_obj = vnc_client.global_system_config_read(id=global_system_config)
69 except vnc_api.NoIdError:
70 gsc_obj = vnc_client.global_system_config_read(fq_name_str=global_system_config)
71 except:
72 gsc_obj = None
73
74 return gsc_obj
75
76
77def _get_rt_inst_obj(vnc_client):
Ales Komarekad46d2e2017-03-09 17:16:38 +010078 # TODO pick fqname hardcode from common
79 rt_inst_obj = vnc_client.routing_instance_read(
80 fq_name=['default-domain', 'default-project',
81 'ip-fabric', '__default__'])
82
83 return rt_inst_obj
84
Vasyl Saienkob10b7202017-09-05 14:19:03 +030085def _get_fq_name(vnc_client, resource_name, project_name, domain='default-domain'):
86 res = [domain]
87 if project_name:
88 res.append(project_name)
89 if resource_name:
90 res.append(resource_name)
91 return res
92
93def _get_project_obj(vnc_client, name, domain='default-domain'):
94 return vnc_client.project_read(fq_name=[domain, name])
95
Ales Komarekad46d2e2017-03-09 17:16:38 +010096
97def _get_ip(ip_w_pfx):
98 return str(IPNetwork(ip_w_pfx).ip)
99
100
Ales Komarekad46d2e2017-03-09 17:16:38 +0100101def virtual_router_list(**kwargs):
102 '''
103 Return a list of all Contrail virtual routers
104
105 CLI Example:
106
107 .. code-block:: bash
108
109 salt '*' contrail.virtual_router_list
110 '''
111 ret = {}
112 vnc_client = _auth(**kwargs)
113 vrouter_objs = vnc_client._objects_list('virtual-router', detail=True)
114 for vrouter_obj in vrouter_objs:
115 ret[vrouter_obj.name] = {
116 'ip_address': vrouter_obj.virtual_router_ip_address,
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200117 'dpdk_enabled': vrouter_obj.virtual_router_dpdk_enabled,
118 'uuid': vrouter_obj.uuid
119
Ales Komarekad46d2e2017-03-09 17:16:38 +0100120 }
121 return ret
122
123
124def virtual_router_get(name, **kwargs):
125 '''
126 Return a specific Contrail virtual router
127
128 CLI Example:
129
130 .. code-block:: bash
131
132 salt '*' contrail.virtual_router_get cmp01
133 '''
134 ret = {}
135 vrouter_objs = virtual_router_list(**kwargs)
136 if name in vrouter_objs:
137 ret[name] = vrouter_objs.get(name)
138 if len(ret) == 0:
139 return {'Error': 'Error in retrieving virtual router.'}
140 return ret
141
142
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200143def virtual_router_create(name, ip_address, router_type=None, dpdk_enabled=False, **kwargs):
Ales Komarekad46d2e2017-03-09 17:16:38 +0100144 '''
145 Create specific Contrail virtual router
146
147 CLI Example:
148
149 .. code-block:: bash
150
151 salt '*' contrail.virtual_router_create cmp02 10.10.10.102
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200152 router_types:
153 - tor-agent
154 - tor-service-node
155 - embedded
Ales Komarekad46d2e2017-03-09 17:16:38 +0100156 '''
157 ret = {}
158 vnc_client = _auth(**kwargs)
159 gsc_obj = _get_config(vnc_client)
160 vrouter_objs = virtual_router_list(**kwargs)
Pavel Svimberskya3140552017-08-28 16:55:44 +0200161 router_types = ['tor-agent', 'tor-service-node', 'embedded']
162 if router_type not in router_types:
163 router_type = None
Ales Komarekad46d2e2017-03-09 17:16:38 +0100164 if name in vrouter_objs:
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200165 vrouter = virtual_router_get(name)
166 vrouter_obj = vnc_client._object_read('virtual-router', id=vrouter[name]['uuid'])
167 changed = False
168 if vrouter_obj.get_virtual_router_ip_address() != ip_address:
169 ret['ip_address'] = {'from': vrouter_obj.get_virtual_router_ip_address(), "to": ip_address}
170 vrouter_obj.set_virtual_router_ip_address(ip_address)
171 changed = True
172 if vrouter_obj.get_virtual_router_type() != router_type:
173 ret['router_type'] = {"from": vrouter_obj.get_virtual_router_type(), "to": router_type}
174 vrouter_obj.set_virtual_router_type(router_type)
175 changed = True
176 if vrouter_obj.get_virtual_router_dpdk_enabled() != dpdk_enabled:
177 ret['dpdk_enabled'] = {"from": vrouter_obj.get_virtual_router_dpdk_enabled(), "to": dpdk_enabled}
178 vrouter_obj.set_virtual_router_dpdk_enabled(dpdk_enabled)
179 changed = True
180 if changed:
181 if __opts__['test']:
182 return "Virtual router " + name + " will be updated"
183 vnc_client.virtual_router_update(vrouter_obj)
184 return ret
185 return {'OK': 'Virtual router %s already exists and is updated' % name}
Ales Komarekad46d2e2017-03-09 17:16:38 +0100186 else:
187 vrouter_obj = VirtualRouter(
188 name, gsc_obj,
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200189 virtual_router_ip_address=ip_address,
190 virtual_router_type=router_type)
Ales Komarekad46d2e2017-03-09 17:16:38 +0100191 vrouter_obj.set_virtual_router_dpdk_enabled(dpdk_enabled)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200192 if __opts__['test']:
193 return "Virtual router " + name + " will be created"
Ales Komarekad46d2e2017-03-09 17:16:38 +0100194 vnc_client.virtual_router_create(vrouter_obj)
195 ret = virtual_router_list(**kwargs)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200196 return "Create"
Ales Komarekad46d2e2017-03-09 17:16:38 +0100197
198
199def virtual_router_delete(name, **kwargs):
200 '''
201 Delete specific Contrail virtual router
202
203 CLI Example:
204
205 .. code-block:: bash
206
207 salt '*' contrail.virtual_router_delete cmp01
208 '''
209 vnc_client = _auth(**kwargs)
210 gsc_obj = _get_config(vnc_client)
211 vrouter_obj = VirtualRouter(name, gsc_obj)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200212 if __opts__['test']:
213 return "Virtual router " + name + " will be deleted"
Ales Komarekad46d2e2017-03-09 17:16:38 +0100214 vnc_client.virtual_router_delete(
215 fq_name=vrouter_obj.get_fq_name())
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200216 return "Deleted"
217
218
219def physical_router_list(**kwargs):
220 '''
221 Return a list of all Contrail physical routers
222
223 CLI Example:
224
225 .. code-block:: bash
226
227 salt '*' contrail.physical_router_list
228 '''
229 ret = {}
230 vnc_client = _auth(**kwargs)
231 prouter_objs = vnc_client._objects_list('physical-router', detail=True)
232 for prouter_obj in prouter_objs:
233 ret[prouter_obj.name] = {
234 'uuid': prouter_obj._uuid,
235 'management_ip': prouter_obj._physical_router_management_ip,
236 'product_name': prouter_obj._physical_router_product_name,
237 }
238
239 return ret
240
241
242def physical_router_get(name, **kwargs):
243 '''
244 Return a specific Contrail physical router
245
246 CLI Example:
247
248 .. code-block:: bash
249
250 salt '*' contrail.physical_router_get router_name
251 '''
252 ret = {}
253 vnc_client = _auth(**kwargs)
254 prouter_objs = vnc_client._objects_list('physical-router', detail=True)
255 for prouter_obj in prouter_objs:
256 if name == prouter_obj.name:
257 ret[name] = prouter_obj.__dict__
258 if len(ret) == 0:
259 return {'Error': 'Error in retrieving physical router.'}
260 return ret
261
262
263def physical_router_create(name, parent_type=None,
264 management_ip=None,
265 dataplane_ip=None, # VTEP address in web GUI
266 vendor_name=None,
267 product_name=None,
268 vnc_managed=None,
269 junos_service_ports=None,
270 agents=None, **kwargs):
271 '''
272 Create specific Contrail physical router
273
274 CLI Example:
275
276 .. code-block:: bash
277
278 salt '*' contrail.physical_router_create OVSDB_router management_ip=10.167.4.202 dataplane_ip=172.16.20.15 vendor_name=MyVendor product_name=MyProduct agents="['tor01','tns01']"
279 '''
280 ret = {}
281 vnc_client = _auth(**kwargs)
282 gsc_obj = _get_config(vnc_client)
283 prouter_objs = physical_router_list(**kwargs)
284 if name in prouter_objs:
285 prouter = physical_router_get(name)
286 prouter_obj = vnc_client._object_read('physical-router', id=prouter[name]['_uuid'])
287 if prouter_obj.physical_router_management_ip != management_ip:
288 ret['management_ip'] = {'from': prouter_obj.physical_router_management_ip, "to": management_ip}
289 prouter_obj.set_physical_router_management_ip(management_ip)
290 if prouter_obj.physical_router_dataplane_ip != dataplane_ip:
291 ret['dataplane_ip'] = {'from': prouter_obj.physical_router_dataplane_ip, "to": dataplane_ip}
292 prouter_obj.set_physical_router_dataplane_ip(dataplane_ip)
293 if prouter_obj.get_physical_router_vendor_name() != vendor_name:
294 ret['vendor_name'] = {'from': prouter_obj.get_physical_router_vendor_name(), "to": vendor_name}
295 prouter_obj.set_physical_router_vendor_name(vendor_name)
296 if prouter_obj.get_physical_router_product_name() != product_name:
297 ret['product_name'] = {'from': prouter_obj.get_physical_router_product_name(), "to": product_name}
298 prouter_obj.set_physical_router_product_name(product_name)
299 if prouter_obj.get_physical_router_vnc_managed() != vnc_managed:
300 ret['vnc_managed'] = {'from': prouter_obj.get_physical_router_vnc_managed(), "to": vnc_managed}
301 prouter_obj.set_physical_router_vnc_managed(vnc_managed)
302 if prouter_obj.get_physical_router_junos_service_ports() != junos_service_ports:
303 ret['junos_service_ports'] = {'from': prouter_obj.get_physical_router_junos_service_ports(),
304 "to": junos_service_ports}
305 prouter_obj.set_physical_router_junos_service_ports(junos_service_ports)
306
307 if __opts__['test']:
308 if len(ret) != 0:
309 return "Physical router " + name + " will be updated"
310 return {"OK": "Physical router exists and is updated"}
311
312 vrouter_objs = vnc_client._objects_list('virtual-router', detail=True) # all vrouter objects
313 c_agents = [] # referenced vrouters
314 for c_agent in prouter_obj.get_virtual_router_refs():
315 c_agents.append(c_agent['uuid'])
316 agent_objs = [] # required state of references
317 for vrouter_obj in vrouter_objs:
318 if vrouter_obj._display_name in agents and vrouter_obj._uuid not in c_agents:
319 prouter_obj.add_virtual_router(vrouter_obj)
320 ret['vrouter ' + vrouter_obj._display_name] = "Reference added"
321 if vrouter_obj._display_name not in agents and vrouter_obj._uuid in c_agents:
322 prouter_obj.del_virtual_router(vrouter_obj)
323 ret['vrouter ' + vrouter_obj._display_name] = "Reference removed"
324 vnc_client.physical_router_update(prouter_obj)
325
326 if len(ret) == 0:
327 return {"OK": "Physical router exists and is updated"}
328 return ret
329 else:
330 if __opts__['test']:
331 return "Physical router " + name + " will be created"
332 prouter_obj = PhysicalRouter(
333 name=name,
334 parent_obj=None,
335 physical_router_management_ip=management_ip,
336 physical_router_dataplane_ip=dataplane_ip,
337 physical_router_vendor_name=vendor_name,
338 physical_router_product_name=product_name,
339 physical_router_vnc_managed=vnc_managed,
340 physical_router_junos_service_ports=junos_service_ports,
341 )
342 for agent in agents:
343 vrouter = virtual_router_get(agent)
344 vrouter_obj = vnc_client._object_read('virtual-router', id=vrouter[agent]['uuid'])
345 prouter_obj.add_virtual_router(vrouter_obj)
346 vnc_client.physical_router_create(prouter_obj)
347 return "Created"
348
349
350def physical_router_delete(name, **kwargs):
351 '''
352 Delete specific Contrail physical router
353
354 CLI Example:
355
356 .. code-block:: bash
357
358 salt '*' contrail.physical_router_delete router_name
359 '''
360 vnc_client = _auth(**kwargs)
361 gsc_obj = _get_config(vnc_client)
362 prouter_obj = PhysicalRouter(name, gsc_obj)
363 if __opts__['test']:
364 return "Physical router " + name + " will be deleted"
365 vnc_client.physical_router_delete(
366 fq_name=prouter_obj.get_fq_name())
367 return "Deleted"
368
369
370def physical_interface_list(**kwargs):
371 '''
372 Return a list of all Contrail physical interface
373
374 CLI Example:
375
376 .. code-block:: bash
377
378 salt '*' contrail.physical_interface_list
379 '''
380 ret = {}
381 vnc_client = _auth(**kwargs)
382 pinterface_objs = vnc_client._objects_list('physical-interface', detail=True)
383 for pinterface_obj in pinterface_objs:
384 ret[pinterface_obj.name] = {
385 'uuid': pinterface_obj._uuid,
386 'fq_name': pinterface_obj.fq_name,
387 'parent_type': pinterface_obj.parent_type,
388 }
389
390 return ret
391
392
393def physical_interface_get(name, physical_router, **kwargs):
394 '''
395 Return a specific Contrail physical interface
396
397 CLI Example:
398
399 .. code-block:: bash
400
401 salt '*' contrail.physical_interface_get interface_name physical_router_name
402 '''
403 ret = {}
404 vnc_client = _auth(**kwargs)
405 pinterf_objs = vnc_client._objects_list('physical-interface', detail=True)
406 for pinterf_obj in pinterf_objs:
407 if name == pinterf_obj.name and physical_router in pinterf_obj.fq_name:
408 ret[name] = pinterf_obj.__dict__
409 if len(ret) == 0:
410 return {'Error': 'Error in retrieving physical interface.'}
411 return ret
412
413
414def physical_interface_create(name, physical_router, **kwargs):
415 '''
416 Create specific Contrail physical interface
417
418 CLI Example:
419
420 .. code-block:: bash
421
422 salt '*' contrail.physical_interface_create ge-0/0/10 physical_router_name
423 '''
424 ret = {}
425 vnc_client = _auth(**kwargs)
426 gsc_obj = _get_config(vnc_client)
427 pinterf_obj = physical_interface_get(name, physical_router, **kwargs)
428 if 'Error' not in pinterf_obj:
429 return {'OK': 'Physical interface ' + name + ' on ' + physical_router + ' already exists'}
430 else:
431 if __opts__['test']:
432 return "Physical interface " + name + " will be created"
433 prouter = physical_router_get(physical_router)
434 prouter_obj = vnc_client._object_read('physical-router', id=prouter[physical_router]['_uuid'])
435 pinterf_obj = PhysicalInterface(name, prouter_obj)
436 vnc_client.physical_interface_create(pinterf_obj)
437 return "Created"
438
439
440def physical_interface_delete(name, physical_router, **kwargs):
441 '''
442 Delete specific Contrail physical interface
443
444 CLI Example:
445 .. code-block:: bash
446
447 salt '*' contrail.physical_interface_delete ge-0/0/0 phr01
448 '''
449 vnc_client = _auth(**kwargs)
450 gsc_obj = _get_config(vnc_client)
451 piface = physical_interface_get(name, physical_router)
452 if __opts__['test']:
453 return "Physical interface " + name + " will be deleted"
454 vnc_client.physical_interface_delete(id=piface[name]['_uuid'])
455 return "Deleted"
456
457
458def logical_interface_list(**kwargs):
459 '''
460 Return a list of all Contrail logical interfaces
461
462 CLI Example:
463
464 .. code-block:: bash
465
466 salt '*' contrail.logical_interface_list
467 '''
468 ret = []
469 vnc_client = _auth(**kwargs)
470 liface_objs = vnc_client._objects_list('logical-interface', detail=True)
471 for liface_obj in liface_objs:
472 ret.append({
473 'name': liface_obj.name,
474 'uuid': liface_obj._uuid,
475 'fq_name': liface_obj.fq_name,
476 'parent_type': liface_obj.parent_type,
477 })
478 return ret
479
480
481def logical_interface_get(name, parent_names, parent_type=None, **kwargs):
482 '''
483 Return a specific Contrail logical interface
484
485 CLI Example:
486
487 .. code-block:: bash
488
489 salt '*' contrail.logical_interface_get ge-0/0/0.10 ['phr01']
490 or
491 salt '*' contrail.logical_interface_get ge-0/0/0.10 ['ge-0/0/0','phr01']
492 or
493 salt '*' contrail.logical_interface_get ge-0/0/0.10 ['phr01'] parent_type=physcal-interface
494 '''
495 ret = {}
496 vnc_client = _auth(**kwargs)
497 liface_objs = vnc_client._objects_list('logical-interface', detail=True)
498 count = 0
499 for liface_obj in liface_objs:
500 if name == liface_obj.name and set(parent_names).issubset(liface_obj.fq_name):
501 if parent_type and parent_type == liface_obj.parent_type:
502 count += 1
503 ret[liface_obj.name] = liface_obj.__dict__
504 if not parent_type:
505 count += 1
506 ret[liface_obj.name] = liface_obj.__dict__
507 if len(ret) == 0:
508 return {'Error': 'Error in retrieving logical interface.'}
509 if count > 1:
510 return {
511 'Error': 'Error Was found more then one logical interface. Please put more parent_name or put parent_type to chose one of them.'}
512 return ret
513
514
515def logical_interface_create(name, parent_names, parent_type='physical-interface', vlan_tag=None, interface_type="l2",
Vasyl Saienkob10b7202017-09-05 14:19:03 +0300516 vmis=None, **kwargs):
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200517 '''
518 Create specific Contrail logical interface
519
520 CLI Example:
521
522 .. code-block:: bash
523
524 salt '*' contrail.logical_interface_create ge-0/0/10.11 parent_names="['ge-0/0/0','phr1']" parent_type=physical-interface vlan_tag=1025 interface_type=L2
525 '''
526 ret = {}
527 vnc_client = _auth(**kwargs)
528 gsc_obj = _get_config(vnc_client)
Vasyl Saienkob10b7202017-09-05 14:19:03 +0300529
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200530 liface_obj = logical_interface_get(name, parent_names, parent_type, **kwargs)
531 if 'Error' not in liface_obj:
532 return {'OK': 'Logical interface ' + name + ' already exists'}
533 else:
534 if __opts__['test']:
535 return "Logical interface " + name + " will be created"
536 parent_obj = None
537 for router in parent_names:
538 parent_router = physical_router_get(router)
539 if 'Error' not in parent_router:
540 parent_obj = vnc_client._object_read('physical-router', id=parent_router[router]['_uuid'])
541 break
542 if not parent_obj:
543 return {'Error': 'Physical router have to be defined'}
544 if parent_type == 'physical-interface':
545 for interface in parent_names:
546 parent_interface = physical_interface_get(interface, parent_obj.name)
547 if 'Error' not in parent_interface:
548 parent_obj = vnc_client._object_read('physical-interface', id=parent_interface[interface]['_uuid'])
549 break
550 if interface_type.lower() == "l3":
551 return {'Error': "Virtual Network have to be defined for L3 interface type"}
552
553 liface_obj = LogicalInterface(name, parent_obj, vlan_tag, interface_type.lower())
Vasyl Saienkob10b7202017-09-05 14:19:03 +0300554
555 for vmi_name, vmi in vmis.iteritems():
556 vmi = vnc_client.virtual_machine_interface_read(
557 fq_name=_get_fq_name(vnc_client, resource_name=vmi_name,
558 project_name=kwargs.get('tenant', 'admin')))
559 liface_obj.add_virtual_machine_interface(vmi)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200560 vnc_client.logical_interface_create(liface_obj)
Vasyl Saienkob10b7202017-09-05 14:19:03 +0300561
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200562 return "Created"
563
564
565def logical_interface_delete(name, parent_names, parent_type=None, **kwargs):
566 '''
567 Delete specific Contrail logical interface
568
569 CLI Example:
570
571 .. code-block:: bash
572
573 salt '*' contrail.logical_interface_delete ge-0/0/0.12 ['ge-0/0/0','phr01']
574 or
575 salt '*' contrail.logical_interface_delete ge-0/0/0.12 ['phr01'] parent_type=physical-router
576
577 '''
578 vnc_client = _auth(**kwargs)
579 gsc_obj = _get_config(vnc_client)
580 liface = logical_interface_get(name, parent_names, parent_type)
581 if 'Error' not in liface:
582 if __opts__['test']:
583 return "Logical interface " + name + " will be deleted"
584 vnc_client.logical_interface_delete(id=liface[name]['_uuid'])
585 return "Deleted"
586 else:
587 return liface
588
589
590def global_vrouter_config_list(**kwargs):
591 '''
592 Return a list of all Contrail global vrouter configs
593
594 CLI Example:
595
596 .. code-block:: bash"
597
598 salt '*' global_vrouter_config_list
599 '''
600 ret = {}
601 vnc_client = _auth(**kwargs)
602 vrouter_conf_objs = vnc_client._objects_list('global-vrouter-config', detail=True)
603 for vrouter_conf_obj in vrouter_conf_objs:
604 ret[vrouter_conf_obj._display_name] = vrouter_conf_obj.__dict__
605 return ret
606
607
608def global_vrouter_config_get(name, **kwargs):
609 '''
610 Return a specific Contrail global vrouter config
611
612 CLI Example:
613
614 .. code-block:: bash
615
616 salt '*' contrail.global_vrouter_get global-vrouter-config
617 '''
618 ret = {}
619 vrouter_conf_objs = global_vrouter_config_list(**kwargs)
620 if name in vrouter_conf_objs:
621 ret[name] = vrouter_conf_objs.get(name)
622 if len(ret) == 0:
623 return {'Error': 'Error in retrieving global vrouter config.'}
624 return ret
625
626
627def global_vrouter_config_create(name, parent_type, encap_priority, vxlan_vn_id_mode, *fq_names, **kwargs):
628 '''
629 Create specific Contrail global vrouter config
630
631 CLI Example:
632
633 .. code-block:: bash
634
635 salt '*' contrail.global_vrouter_config_create name=global-vrouter-config parent_type=global-system-config encap_priority="MPLSoUDP,MPLSoGRE" vxlan_vn_id_mode="automatic" fq_names="['default-global-system-config', 'default-global-vrouter-config']"
636 '''
637 ret = {}
638 vnc_client = _auth(**kwargs)
639 gsc_obj = _get_config(vnc_client)
640 vrouter_conf_objs = global_vrouter_config_list(**kwargs)
641 if name in vrouter_conf_objs:
642 return {'OK': 'Global vrouter config %s already exists' % name}
643 else:
644 vrouter_conf_obj = GlobalVrouterConfig(
645 name=name,
646 parent_obj=None,
647 encapsulation_priorities=EncapsulationPrioritiesType(encapsulation=encap_priority.split(",")),
648 fq_name=fq_names,
649 vxlan_network_identifier_mode=vxlan_vn_id_mode,
650 parent_type=parent_type,
651 )
652 if __opts__['test']:
653 return "Global vRouter config " + name + " will be created"
654 vnc_client.global_vrouter_config_create(vrouter_conf_obj)
655 return "Created"
656
657
658def global_vrouter_config_delete(name, **kwargs):
659 '''
660 Delete specific Contrail global vrouter config
661
662 CLI Example:
663
664 .. code-block:: bash
665
666 salt '*' contrail.global_vrouter_config_delete global-vrouter-config
667 '''
668 vnc_client = _auth(**kwargs)
669 gsc_obj = _get_config(vnc_client)
670 vrouter_conf_obj = GlobalVrouterConfig(name, gsc_obj)
671 if __opts__['test']:
672 return "Global vRouter config " + name + " will be deleted"
673 vnc_client.global_vrouter_config_delete(
674 fq_name=vrouter_conf_obj.get_fq_name())
675 return "Deleted"
Ales Komarekad46d2e2017-03-09 17:16:38 +0100676
677
678def analytics_node_list(**kwargs):
679 '''
680 Return a list of all Contrail analytics nodes
681
682 CLI Example:
683
684 .. code-block:: bash
685
686 salt '*' contrail.analytics_node_list
687 '''
688 ret = {}
689 vnc_client = _auth(**kwargs)
690 node_objs = vnc_client._objects_list('analytics-node', detail=True)
691 for node_obj in node_objs:
692 ret[node_obj.name] = node_obj.__dict__
693 return ret
694
695
696def analytics_node_get(name, **kwargs):
697 '''
698 Return a specific Contrail analytics node
699
700 CLI Example:
701
702 .. code-block:: bash
703
704 salt '*' contrail.analytics_node_get nal01
705 '''
706 ret = {}
707 vrouter_objs = analytics_node_list(**kwargs)
708 if name in vrouter_objs:
709 ret[name] = vrouter_objs.get(name)
710 if len(ret) == 0:
711 return {'Error': 'Error in retrieving analytics node.'}
712 return ret
713
714
715def analytics_node_create(name, ip_address, **kwargs):
716 '''
717 Create specific Contrail analytics node
718
719 CLI Example:
720
721 .. code-block:: bash
722
723 salt '*' contrail.analytics_node_create ntw03 10.10.10.103
724 '''
725 ret = {}
726 vnc_client = _auth(**kwargs)
727 gsc_obj = _get_config(vnc_client)
728 analytics_node_objs = analytics_node_list(**kwargs)
729 if name in analytics_node_objs:
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200730 return {'OK': 'Analytics node %s already exists' % name}
Ales Komarekad46d2e2017-03-09 17:16:38 +0100731 else:
732 analytics_node_obj = AnalyticsNode(
733 name, gsc_obj,
734 analytics_node_ip_address=ip_address)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200735 if __opts__['test']:
736 return "AnalyticsNode " + name + " will be created"
Ales Komarekad46d2e2017-03-09 17:16:38 +0100737 vnc_client.analytics_node_create(analytics_node_obj)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200738 return "Created"
Ales Komarekad46d2e2017-03-09 17:16:38 +0100739
740
741def analytics_node_delete(name, **kwargs):
742 '''
743 Delete specific Contrail analytics node
744
745 CLI Example:
746
747 .. code-block:: bash
748
749 salt '*' contrail.analytics_node_delete cmp01
750 '''
751 vnc_client = _auth(**kwargs)
752 gsc_obj = _get_config(vnc_client)
753 analytics_node_obj = AnalyticsNode(name, gsc_obj)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200754 if __opts__['test']:
755 return "AnalyticsNode " + name + " will be deleted"
Ales Komarekad46d2e2017-03-09 17:16:38 +0100756 vnc_client.analytics_node_delete(
757 fq_name=analytics_node_obj.get_fq_name())
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200758 return "Deleted"
Ales Komarekad46d2e2017-03-09 17:16:38 +0100759
760
761def config_node_list(**kwargs):
762 '''
763 Return a list of all Contrail config nodes
764
765 CLI Example:
766
767 .. code-block:: bash
768
769 salt '*' contrail.config_node_list
770 '''
771 ret = {}
772 vnc_client = _auth(**kwargs)
773 node_objs = vnc_client._objects_list('config-node', detail=True)
774 for node_obj in node_objs:
775 ret[node_obj.name] = node_obj.__dict__
776 return ret
777
778
779def config_node_get(name, **kwargs):
780 '''
781 Return a specific Contrail config node
782
783 CLI Example:
784
785 .. code-block:: bash
786
787 salt '*' contrail.config_node_get nal01
788 '''
789 ret = {}
790 vrouter_objs = config_node_list(**kwargs)
791 if name in vrouter_objs:
792 ret[name] = vrouter_objs.get(name)
793 if len(ret) == 0:
794 return {'Error': 'Error in retrieving config node.'}
795 return ret
796
797
798def config_node_create(name, ip_address, **kwargs):
799 '''
800 Create specific Contrail config node
801
802 CLI Example:
803
804 .. code-block:: bash
805
806 salt '*' contrail.config_node_create ntw03 10.10.10.103
807 '''
808 ret = {}
809 vnc_client = _auth(**kwargs)
810 gsc_obj = _get_config(vnc_client)
811 config_node_objs = config_node_list(**kwargs)
812 if name in config_node_objs:
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200813 return {'OK': 'Config node %s already exists' % name}
Ales Komarekad46d2e2017-03-09 17:16:38 +0100814 else:
815 config_node_obj = ConfigNode(
816 name, gsc_obj,
817 config_node_ip_address=ip_address)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200818 if __opts__['test']:
819 return "ConfigNode " + name + " will be created"
Ales Komarekad46d2e2017-03-09 17:16:38 +0100820 vnc_client.config_node_create(config_node_obj)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200821 return "Created"
Ales Komarekad46d2e2017-03-09 17:16:38 +0100822
823
824def config_node_delete(name, **kwargs):
825 '''
826 Delete specific Contrail config node
827
828 CLI Example:
829
830 .. code-block:: bash
831
832 salt '*' contrail.config_node_delete cmp01
833 '''
834 vnc_client = _auth(**kwargs)
835 gsc_obj = _get_config(vnc_client)
836 config_node_obj = ConfigNode(name, gsc_obj)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200837 if __opts__['test']:
838 return "ConfigNode " + name + " will be deleted"
Ales Komarekad46d2e2017-03-09 17:16:38 +0100839 vnc_client.config_node_delete(
840 fq_name=config_node_obj.get_fq_name())
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200841 return "Deleted"
Ales Komarekad46d2e2017-03-09 17:16:38 +0100842
843
844def bgp_router_list(**kwargs):
845 '''
846 Return a list of all Contrail BGP routers
847
848 CLI Example:
849
850 .. code-block:: bash
851
852 salt '*' contrail.bgp_router_list
853 '''
854 ret = {}
855 vnc_client = _auth(**kwargs)
856 bgp_router_objs = vnc_client._objects_list('bgp-router', detail=True)
857 for bgp_router_obj in bgp_router_objs:
858 ret[bgp_router_obj.name] = bgp_router_obj.__dict__
859 return ret
860
861
862def bgp_router_get(name, **kwargs):
863 '''
864 Return a specific Contrail BGP router
865
866 CLI Example:
867
868 .. code-block:: bash
869
870 salt '*' contrail.bgp_router_get nal01
871 '''
872 ret = {}
873 bgp_router_objs = bgp_router_list(**kwargs)
874 if name in bgp_router_objs:
875 ret[name] = bgp_router_objs.get(name)
876 if len(ret) == 0:
877 return {'Error': 'Error in retrieving BGP router.'}
878 return ret
879
880
881def bgp_router_create(name, type, ip_address, asn=64512, **kwargs):
882 '''
883 Create specific Contrail control node
884
885 CLI Example:
886
887 .. code-block:: bash
888
889 salt '*' contrail.bgp_router_create ntw03 control-node 10.10.10.103
890 salt '*' contrail.bgp_router_create mx01 router 10.10.10.105
891 '''
892 ret = {}
893 vnc_client = _auth(**kwargs)
894
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200895 address_families = ['route-target', 'inet-vpn', 'e-vpn', 'erm-vpn',
896 'inet6-vpn']
897 if type != 'control-node':
898 address_families.remove('erm-vpn')
899
900 bgp_addr_fams = AddressFamilies(address_families)
901 bgp_sess_attrs = [
902 BgpSessionAttributes(address_families=bgp_addr_fams)]
903 bgp_sessions = [BgpSession(attributes=bgp_sess_attrs)]
904 bgp_peering_attrs = BgpPeeringAttributes(session=bgp_sessions)
905 rt_inst_obj = _get_rt_inst_obj(vnc_client)
906
907 if type == 'control-node':
908 vendor = 'contrail'
909 elif type == 'router':
910 vendor = 'mx'
911 else:
912 vendor = 'unknown'
913
914 router_params = BgpRouterParams(router_type=type,
915 vendor=vendor, autonomous_system=int(asn),
916 identifier=_get_ip(ip_address),
917 address=_get_ip(ip_address),
918 port=179, address_families=bgp_addr_fams)
919
Ales Komarekad46d2e2017-03-09 17:16:38 +0100920 bgp_router_objs = bgp_router_list(**kwargs)
921 if name in bgp_router_objs:
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200922 bgp_router_obj = vnc_client._object_read('bgp-router', id=bgp_router_objs[name]['_uuid'])
923 bgp_router_obj.set_bgp_router_parameters(router_params)
924 if __opts__['test']:
925 return "BGP router " + name + " will be updated"
926 vnc_client.bgp_router_update(bgp_router_obj)
Ales Komarekad46d2e2017-03-09 17:16:38 +0100927 else:
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200928 bgp_router_obj = BgpRouter(name, rt_inst_obj, bgp_router_parameters=router_params)
929 if __opts__['test']:
930 return "BGP router " + name + " will be created"
Ales Komarekad46d2e2017-03-09 17:16:38 +0100931 vnc_client.bgp_router_create(bgp_router_obj)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200932 return "Created"
933 return {'OK': 'Config node %s already exists' % name}
Ales Komarekad46d2e2017-03-09 17:16:38 +0100934
935
936def bgp_router_delete(name, **kwargs):
937 '''
938 Delete specific Contrail control node
939
940 CLI Example:
941
942 .. code-block:: bash
943
944 salt '*' contrail.bgp_router_delete mx01
945 '''
946 vnc_client = _auth(**kwargs)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200947 gsc_obj = _get_config(vnc_client)
Ales Komarekad46d2e2017-03-09 17:16:38 +0100948 bgp_router_obj = BgpRouter(name, gsc_obj)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200949
950 if __opts__['test']:
951 return "BGP router " + name + " will be deleted"
Ales Komarekad46d2e2017-03-09 17:16:38 +0100952 vnc_client.bgp_router_delete(
953 fq_name=bgp_router_obj.get_fq_name())
954
Pavel Svimbersky483a19e2017-08-22 09:50:29 +0200955 return "Deleted"
956
Ales Komarekad46d2e2017-03-09 17:16:38 +0100957
958def database_node_list(**kwargs):
959 '''
960 Return a list of all Contrail database nodes
961
962 CLI Example:
963
964 .. code-block:: bash
965
966 salt '*' contrail.database_node_list
967 '''
968 ret = {}
969 vnc_client = _auth(**kwargs)
970 node_objs = vnc_client._objects_list('database-node', detail=True)
971 for node_obj in node_objs:
972 ret[node_obj.name] = node_obj.__dict__
973 return ret
974
975
976def database_node_get(name, **kwargs):
977 '''
978 Return a specific Contrail database node
979
980 CLI Example:
981
982 .. code-block:: bash
983
984 salt '*' contrail.database_node_get nal01
985 '''
986 ret = {}
987 vrouter_objs = database_node_list(**kwargs)
988 if name in vrouter_objs:
989 ret[name] = vrouter_objs.get(name)
990 if len(ret) == 0:
991 return {'Error': 'Error in retrieving database node.'}
992 return ret
993
994
995def database_node_create(name, ip_address, **kwargs):
996 '''
997 Create specific Contrail database node
998
999 CLI Example:
1000
1001 .. code-block:: bash
1002
1003 salt '*' contrail.database_node_create ntw03 10.10.10.103
1004 '''
1005 ret = {}
1006 vnc_client = _auth(**kwargs)
1007 gsc_obj = _get_config(vnc_client)
1008 database_node_objs = database_node_list(**kwargs)
1009 if name in database_node_objs:
Pavel Svimbersky483a19e2017-08-22 09:50:29 +02001010 return {'OK': 'Database node %s already exists' % name}
Ales Komarekad46d2e2017-03-09 17:16:38 +01001011 else:
1012 database_node_obj = DatabaseNode(
1013 name, gsc_obj,
1014 database_node_ip_address=ip_address)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +02001015 if __opts__['test']:
1016 return "DatabaseNode " + name + " will be created"
Ales Komarekad46d2e2017-03-09 17:16:38 +01001017 vnc_client.database_node_create(database_node_obj)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +02001018 return "Created"
Ales Komarekad46d2e2017-03-09 17:16:38 +01001019
1020
1021def database_node_delete(name, **kwargs):
1022 '''
1023 Delete specific Contrail database node
1024
1025 CLI Example:
1026
1027 .. code-block:: bash
1028
1029 salt '*' contrail.database_node_delete cmp01
1030 '''
1031 vnc_client = _auth(**kwargs)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +02001032 gsc_obj = _get_config(vnc_client)
1033 database_node_obj = DatabaseNode(name, gsc_obj)
1034 if __opts__['test']:
1035 return "DatabaseNode " + name + " will be deleted"
Ales Komarekad46d2e2017-03-09 17:16:38 +01001036 vnc_client.database_node_delete(
1037 fq_name=database_node_obj.get_fq_name())
Petr Jediný5f3efe32017-05-26 17:55:09 +02001038
1039
Petr Jediný5f3efe32017-05-26 17:55:09 +02001040def _get_vrouter_config(vnc_client):
1041 try:
1042 config = vnc_client.global_vrouter_config_read(
1043 fq_name=['default-global-system-config', 'default-global-vrouter-config'])
1044 except Exception:
1045 config = None
1046
1047 return config
1048
1049
Petr Jediný5f3efe32017-05-26 17:55:09 +02001050def linklocal_service_list(**kwargs):
1051 '''
1052 Return a list of all Contrail link local services
1053
1054 CLI Example:
1055
1056 .. code-block:: bash
1057
1058 salt '*' contrail.linklocal_service_list
1059 '''
1060 ret = {}
1061 vnc_client = _auth(**kwargs)
1062
1063 current_config = _get_vrouter_config(vnc_client)
1064 if current_config is None:
1065 return ret
1066
1067 service_list_res = current_config.get_linklocal_services()
1068 if service_list_res is None:
1069 service_list_obj = {'linklocal_service_entry': []}
1070 else:
1071 service_list_obj = service_list_res.__dict__
1072 for _, value in service_list_obj.iteritems():
1073 for entry in value:
1074 service = entry.__dict__
1075 if 'linklocal_service_name' in service:
1076 ret[service['linklocal_service_name']] = service
1077 return ret
1078
1079
1080def linklocal_service_get(name, **kwargs):
1081 '''
1082 Return a specific Contrail link local service
1083
1084 CLI Example:
1085
1086 .. code-block:: bash
1087
1088 salt '*' contrail.linklocal_service_get llservice
1089 '''
1090 ret = {}
1091 services = linklocal_service_list(**kwargs)
1092 if name in services:
1093 ret[name] = services.get(name)
1094 if len(ret) == 0:
1095 return {'Error': 'Error in retrieving link local service "{0}"'.format(name)}
1096 return ret
1097
1098
1099def linklocal_service_create(name, lls_ip, lls_port, ipf_dns_or_ip, ipf_port, **kwargs):
1100 '''
1101 Create specific Contrail link local service
1102
1103 CLI Example:
1104
1105 .. code-block:: bash
1106
1107 salt '*' contrail.linklocal_service_create \
1108 llservice 10.10.10.103 22 '["20.20.20.20", "30.30.30.30"]' 22
1109 salt '*' contrail.linklocal_service_create \
1110 llservice 10.10.10.103 22 link-local.service.dns-name 22
1111 '''
1112 ret = {}
1113 vnc_client = _auth(**kwargs)
1114
1115 current_config = _get_vrouter_config(vnc_client)
1116
1117 service_entry = LinklocalServiceEntryType(
1118 linklocal_service_name=name,
1119 linklocal_service_ip=lls_ip,
1120 linklocal_service_port=lls_port,
1121 ip_fabric_service_port=ipf_port)
1122 if isinstance(ipf_dns_or_ip, basestring):
1123 service_entry.ip_fabric_DNS_service_name = ipf_dns_or_ip
1124 elif isinstance(ipf_dns_or_ip, list):
1125 service_entry.ip_fabric_service_ip = ipf_dns_or_ip
1126 service_entry.ip_fabric_DNS_service_name = ''
1127
1128 if current_config is None:
1129 new_services = LinklocalServicesTypes([service_entry])
1130 new_config = GlobalVrouterConfig(linklocal_services=new_services)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +02001131 if __opts__['test']:
1132 ret['GlobalVrouterConfig'] = "Global vRouter Config will be created"
1133 else:
1134 ret = "Created"
1135 vnc_client.global_vrouter_config_create(new_config)
Petr Jediný5f3efe32017-05-26 17:55:09 +02001136 else:
1137 _current_service_list = current_config.get_linklocal_services()
1138 if _current_service_list is None:
1139 service_list = {'linklocal_service_entry': []}
1140 else:
1141 service_list = _current_service_list.__dict__
1142 new_services = [service_entry]
1143 for key, value in service_list.iteritems():
1144 if key != 'linklocal_service_entry':
1145 continue
1146 for _entry in value:
1147 entry = _entry.__dict__
1148 if 'linklocal_service_name' in entry:
1149 if entry['linklocal_service_name'] == name:
Pavel Svimbersky483a19e2017-08-22 09:50:29 +02001150 return {'OK': 'Link local service "{0}" already exists'.format(name)}
Petr Jediný5f3efe32017-05-26 17:55:09 +02001151 new_services.append(_entry)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +02001152 if __opts__['test']:
1153 ret['Test'] = "LinkLocalSevices will be created"
Petr Jediný5f3efe32017-05-26 17:55:09 +02001154 service_list[key] = new_services
1155 new_config = GlobalVrouterConfig(linklocal_services=service_list)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +02001156 if __opts__['test']:
1157 ret['GlobalVrouterConfig'] = "Global vRouter Config will be updated"
1158 else:
1159 vnc_client.global_vrouter_config_update(new_config)
1160 ret = "Created"
1161 return ret
Petr Jediný5f3efe32017-05-26 17:55:09 +02001162
1163
1164def linklocal_service_delete(name, **kwargs):
1165 '''
1166 Delete specific link local service entry
1167
1168 CLI Example:
1169
1170 .. code-block:: bash
1171
1172 salt '*' contrail.linklocal_service_delete llservice
1173 '''
1174 vnc_client = _auth(**kwargs)
1175
1176 current_config = _get_vrouter_config(vnc_client)
1177
1178 found = False
1179 if current_config is not None:
1180 _current_service_list = current_config.get_linklocal_services()
1181 if _current_service_list is None:
1182 service_list = {'linklocal_service_entry': []}
1183 else:
1184 service_list = _current_service_list.__dict__
1185 new_services = []
1186 for key, value in service_list.iteritems():
1187 if key != 'linklocal_service_entry':
1188 continue
1189 for _entry in value:
1190 entry = _entry.__dict__
1191 if 'linklocal_service_name' in entry:
1192 if entry['linklocal_service_name'] == name:
1193 found = True
1194 else:
1195 new_services.append(_entry)
1196 service_list[key] = new_services
1197 new_config = GlobalVrouterConfig(linklocal_services=service_list)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +02001198 if __opts__['test']:
1199 return "Link local service " + name + " will be deleted"
Petr Jediný5f3efe32017-05-26 17:55:09 +02001200 vnc_client.global_vrouter_config_update(new_config)
Pavel Svimbersky483a19e2017-08-22 09:50:29 +02001201 return "Deleted"
Petr Jediný5f3efe32017-05-26 17:55:09 +02001202 if not found:
1203 return {'Error': 'Link local service "{0}" not found'.format(name)}
Pavel Svimbersky483a19e2017-08-22 09:50:29 +02001204
1205
1206def virtual_machine_interface_list(**kwargs):
1207 '''
1208 Return a list of all Contrail virtual machine interfaces
1209
1210 CLI Example:
1211
1212 .. code-block:: bash
1213
1214 salt '*' contrail.virtual_machine_interfaces
1215 '''
Vasyl Saienkob10b7202017-09-05 14:19:03 +03001216 ret = []
1217 vnc_client = _auth(**kwargs)
1218 project = _get_project_obj(vnc_client, name=kwargs.get('tenant', 'admin'))
1219 project_uuid = project.get_uuid()
1220
1221 vm_ifaces = vnc_client.virtual_machine_interfaces_list(
1222 detail=True, parent_id=project_uuid)
1223
1224 for vm_iface in vm_ifaces:
1225 ret.append(vm_iface.__dict__)
1226
1227 return ret
1228
1229
1230def virtual_machine_interface_create(name,
1231 virtual_network,
1232 mac_address=None,
1233 ip_address=None,
1234 security_group=None,
1235 **kwargs):
1236 '''
1237 Create specific Contrail virtual machine interface (Port)
1238
1239 CLI Example:
1240
1241 .. code-block:: bash
1242
1243 salt '*' contrail.virtual_machine_interface_create port01 net01 mac_address='01:02:03:04:05:06'
1244 router_types:
1245 - tor-agent
1246 - tor-service-node
1247 - embedded
1248 '''
Pavel Svimbersky483a19e2017-08-22 09:50:29 +02001249 ret = {}
1250 vnc_client = _auth(**kwargs)
Vasyl Saienkob10b7202017-09-05 14:19:03 +03001251 project = _get_project_obj(vnc_client, name=kwargs.get('tenant', 'admin'))
1252
1253 vm_int = VirtualMachineInterface(name, parent_obj=project)
1254
1255 if mac_address:
1256 mac_address_obj = MacAddressesType([mac_address])
1257 vm_int.set_virtual_machine_interface_mac_addresses(mac_address_obj)
1258
1259 if security_group:
1260 sgo = vnc_client.security_group_read(fq_name=_get_fq_name(
1261 vnc_client, security_group, kwargs.get('tenant', 'admin')))
1262 vm_int.set_security_group(sgo)
1263
1264 vnet_uuid = virtual_network_get(virtual_network, **kwargs)[virtual_network]['_uuid']
1265 vnet_obj = vnc_client.virtual_network_read(id=vnet_uuid)
1266 vm_int.set_virtual_network(vnet_obj)
1267
1268 vmi_uuid = vnc_client.virtual_machine_interface_create(vm_int)
1269 vmi = vnc_client.virtual_machine_interface_read(id=vmi_uuid)
1270
1271 vm_int.set_port_security_enabled(False)
1272 vnc_client.virtual_machine_interface_update(vm_int)
1273
1274 #Allocate IP to VMI
1275 ip = vnc_api.InstanceIp(name + '.ip')
1276 ip.set_virtual_machine_interface(vmi)
1277 ip.set_virtual_network(vnet_obj)
1278
1279 ip_uuid = vnc_client.instance_ip_create(ip)
1280
1281 if ip_address:
1282 ip.set_instance_ip_address(ip_address)
1283 vnc_client.instance_ip_update(ip)
1284
1285 return vmi.__dict__
Pavel Svimbersky483a19e2017-08-22 09:50:29 +02001286
1287
1288def virtual_network_list(**kwargs):
1289 '''
1290 Return a list of all Contrail virtual network
1291
1292 CLI Example:
1293
1294 .. code-block:: bash
1295
1296 salt '*' contrail.virtual_network
1297 '''
1298
1299 ret = {}
1300 vnc_client = _auth(**kwargs)
1301 virtual_networks = vnc_client._objects_list('virtual-network', detail=True)
1302 for virtual_network in virtual_networks:
1303 ret[virtual_network.name] = virtual_network.__dict__
1304 return ret
Vasyl Saienkob10b7202017-09-05 14:19:03 +03001305
1306
1307def virtual_network_get(name, **kwargs):
1308 '''
1309 Return a specific Contrail virtual network
1310
1311 CLI Example:
1312
1313 .. code-block:: bash
1314
1315 salt '*' contrail.virtual_network_get net01
1316 '''
1317 ret = {}
1318 vnet_objs = virtual_network_list(**kwargs)
1319 if name in vnet_objs:
1320 ret[name] = vnet_objs.get(name)
1321 if len(ret) != 1 :
1322 return {'result': False,
1323 'Error': 'Error in retrieving virtual networks.'}
1324 return ret