blob: c642bb8558ece26a741e4aceda87adff7a8ad2a1 [file] [log] [blame]
Matteo Scandolo5b7a5d42017-08-08 13:05:26 -07001# Copyright 2017-present Open Networking Foundation
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
Saleil Bhat1c5593d2017-01-06 15:25:57 -080015import os
16import sys
17from django.db.models import Q, F
Pingping Lin7ea29aa2017-10-03 16:39:23 -070018#from services.vmme.models import VMMEService, VMMETenant
19from synchronizers.new_base.modelaccessor import *
20from synchronizers.new_base.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible
Saleil Bhat1c5593d2017-01-06 15:25:57 -080021
22parentdir = os.path.join(os.path.dirname(__file__), "..")
23sys.path.insert(0, parentdir)
24
25class SyncVMMETenant(SyncInstanceUsingAnsible):
26
27 provides = [VMMETenant]
28
29 observes = VMMETenant
30
31 requested_interval = 0
32
33 template_name = "vmmetenant_playbook.yaml"
34
Pingping Lin7ea29aa2017-10-03 16:39:23 -070035 service_key_name = "/opt/xos/configurations/mcord/mcord_private_key"
Saleil Bhat1c5593d2017-01-06 15:25:57 -080036
37 def __init__(self, *args, **kwargs):
38 super(SyncVMMETenant, self).__init__(*args, **kwargs)
39
Andy Bavier9a3aed12018-01-16 15:37:08 -070040 def get_extra_attributes(self, o):
41 fields = {}
Saleil Bhat1c5593d2017-01-06 15:25:57 -080042
Andy Bavier9a3aed12018-01-16 15:37:08 -070043 fields['s6a_hss_ip'] = self.get_ip_address_from_peer_service_instance('s6a_network', 'VHSSTenant', o, 's6a_hss_ip')
44 fields['s1mme_enb_ip'] = o.enodeb_ip_addr
45 fields['s1mme_mme_ip'] = self.get_my_ip_address(o, 'flat_network_s1mme', 's1mme_mme_ip')
46 fields['s11_mme_ip'] = self.get_my_ip_address(o, 's11_network', 's11_mme_ip')
47 fields['s11_sgw_ip'] = self.get_ip_address_from_peer_service_instance('s11_network', 'VSPGWCTenant', o, 's11_sgw_ip')
48
49 return fields
50
51 def get_my_ip_address(self, o, network_name, parameter=None):
52 return self.get_ip_address_from_peer_service_instance_instance(network_name, o, o, parameter)
53
54 def get_ip_address_from_peer_service_instance(self, network_name, sitype, o, parameter=None):
55 peer_si = self.get_peer_serviceinstance_of_type(sitype, o)
56 return self.get_ip_address_from_peer_service_instance_instance(network_name, peer_si, o, parameter)
57
58 def get_ip_address_from_peer_service_instance_instance(self, network_name, peer_si, o, parameter=None):
59 try:
60 net_id = self.get_network_id(network_name)
61 ins_id = peer_si.leaf_model.instance_id
62 ip_address = Port.objects.get(
63 network_id=net_id, instance_id=ins_id).ip
64 except Exception:
65 self.log.error("Failed to fetch parameter",
66 parameter=parameter,
67 network_name=network_name)
68 self.defer_sync(o, "Waiting for parameters to become available")
69
70 return ip_address
71
72 def get_peer_serviceinstance_of_type(self, sitype, o):
73 prov_link_set = ServiceInstanceLink.objects.filter(
74 subscriber_service_instance_id=o.id)
75
76 try:
77 peer_service = next(
78 p.provider_service_instance for p in prov_link_set if p.provider_service_instance.leaf_model_name == sitype)
79 except StopIteration:
80 sub_link_set = ServiceInstanceLink.objects.filter(
81 provider_service_instance_id=o.id)
82 try:
83 peer_service = next(
84 s.subscriber_service_instance for s in sub_link_set if s.subscriber_service_instance.leaf_model_name == sitype)
85 except StopIteration:
86 self.log.error(
87 'Could not find service type in service graph', service_type=sitype, object=o)
88 raise ServiceGraphException(
89 "Synchronization failed due to incomplete service graph")
90
91 return peer_service
92
93 # To get each network id
94 def get_network_id(self, network_name):
95 return Network.objects.get(name=network_name).id