blob: 28a206dac4bd427c95a1b7deba06bacf6dea20f8 [file] [log] [blame]
Wei-Yu Chenba043592017-10-18 17:08:51 +08001# 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
15import os
16import sys
17from django.db.models import Q, F
Wei-Yu Chenba043592017-10-18 17:08:51 +080018from synchronizers.new_base.modelaccessor import *
19from synchronizers.new_base.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible
20
21parentdir = os.path.join(os.path.dirname(__file__), "..")
22sys.path.insert(0, parentdir)
23
Sapan Bhatia968f28f2017-11-22 12:00:01 -050024
Wei-Yu Chenba043592017-10-18 17:08:51 +080025class SyncVSPGWUTenant(SyncInstanceUsingAnsible):
Wei-Yu Chenba043592017-10-18 17:08:51 +080026 observes = VSPGWUTenant
Wei-Yu Chenba043592017-10-18 17:08:51 +080027 template_name = "vspgwutenant_playbook.yaml"
Wei-Yu Chenba043592017-10-18 17:08:51 +080028 service_key_name = "/opt/xos/configurations/mcord/mcord_private_key"
29
30 def __init__(self, *args, **kwargs):
31 super(SyncVSPGWUTenant, self).__init__(*args, **kwargs)
32
Woojoong Kimf002aec2017-10-25 14:43:37 -070033 def get_extra_attributes(self, o):
34
Sapan Bhatia968f28f2017-11-22 12:00:01 -050035 scenario = self.get_scenario(o)
Woojoong Kimf002aec2017-10-25 14:43:37 -070036
37 if scenario == 'ng4t_with_sdncontroller':
Sapan Bhatia968f28f2017-11-22 12:00:01 -050038 return self.get_values_for_ng4t_w_sdncontroller(o)
Woojoong Kimf002aec2017-10-25 14:43:37 -070039 elif scenario == 'ng4t_without_sdncontroller':
Sapan Bhatia968f28f2017-11-22 12:00:01 -050040 return self.get_values_for_ng4t_wo_sdncontroller(o)
Woojoong Kimf002aec2017-10-25 14:43:37 -070041 elif scenario == 'spirent_with_sdncontroller':
Sapan Bhatia968f28f2017-11-22 12:00:01 -050042 return self.get_values_for_spirent_w_sdncontroller(o)
Woojoong Kimf002aec2017-10-25 14:43:37 -070043 elif scenario == 'spirent_without_sdncontroller':
Sapan Bhatia968f28f2017-11-22 12:00:01 -050044 return self.get_values_for_spirent_wo_sdncontroller(o)
Woojoong Kimf002aec2017-10-25 14:43:37 -070045 else:
Sapan Bhatia968f28f2017-11-22 12:00:01 -050046 return self.get_extra_attributes_for_manual(o)
Woojoong Kimf002aec2017-10-25 14:43:37 -070047
48 # fields for manual case
Sapan Bhatia968f28f2017-11-22 12:00:01 -050049 def get_extra_attributes_for_manual(self, o):
Woojoong Kimf002aec2017-10-25 14:43:37 -070050 fields = {}
Sapan Bhatia968f28f2017-11-22 12:00:01 -050051 fields['scenario'] = self.get_scenario(o)
Woojoong Kimf002aec2017-10-25 14:43:37 -070052 # for interface.cfg file
53 fields['zmq_sub_ip'] = "manual"
54 fields['zmq_pub_ip'] = "manual"
55 fields['dp_comm_ip'] = "manual"
56 fields['cp_comm_ip'] = "manual"
57 fields['fpc_ip'] = "manual"
58 fields['cp_nb_server_ip'] = "manual"
59
60 # for dp_config.cfg file
61 fields['s1u_ip'] = "manual"
62 fields['sgi_ip'] = "manual"
63
64 return fields
65
Sapan Bhatia968f28f2017-11-22 12:00:01 -050066 def get_values_for_ng4t_w_sdncontroller(self, o):
Woojoong Kimf002aec2017-10-25 14:43:37 -070067 fields = {}
68 fields['scenario'] = "ng4t_with_sdncontroller"
69 # for interface.cfg file
Sapan Bhatia968f28f2017-11-22 12:00:01 -050070 fields['zmq_sub_ip'] = self.get_ip_address_from_peer_service_instance(
71 'sbi_network', "SDNControllerServiceInstance", 'zmq_sub_ip')
72 fields['zmq_pub_ip'] = self.get_ip_address_from_peer_service_instance(
73 'sbi_network', "SDNControllerServiceInstance", 'zmq_pub_ip')
74 fields['dp_comm_ip'] = self.get_ip_address_from_peer_service_instance_instance(
75 'sbi_network', o, 'dp_comm_ip')
76 fields['cp_comm_ip'] = self.get_ip_address_from_peer_service_instance(
77 'nbi_network', "VSPGWCTenant", 'cp_comm_ip')
78 fields['fpc_ip'] = self.get_ip_address_from_peer_service_instance(
79 'nbi_network', "SDNControllerServiceInstance", 'fpc_ip')
80 fields['cp_nb_server_ip'] = self.get_ip_address_from_peer_service_instance(
81 'nbi_network', "VSPGWCTenant", 'cp_nb_server_ip')
Woojoong Kimf002aec2017-10-25 14:43:37 -070082
83 # for dp_config.cfg file
Sapan Bhatia968f28f2017-11-22 12:00:01 -050084 fields['s1u_ip'] = self.get_ip_address_from_peer_service_instance_instance(
85 's1u_network', o, 's1u_ip')
86 fields['sgi_ip'] = self.get_ip_address_from_peer_service_instance(
87 'sgi_network', "VSPGWUTenant", 'sgi_ip')
Woojoong Kimf002aec2017-10-25 14:43:37 -070088
89 return fields
90
Sapan Bhatia968f28f2017-11-22 12:00:01 -050091 def get_values_for_ng4t_wo_sdncontroller(self, o):
Woojoong Kimf002aec2017-10-25 14:43:37 -070092 fields = {}
93 fields['scenario'] = "ng4t_without_sdncontroller"
94 # for interface.cfg file
95 fields['zmq_sub_ip'] = "127.0.0.1"
96 fields['zmq_pub_ip'] = "127.0.0.1"
Sapan Bhatia968f28f2017-11-22 12:00:01 -050097 fields['dp_comm_ip'] = self.get_ip_address_from_peer_service_instance_instance(
98 'spgw_network', o, 'dp_comm_ip')
99 fields['cp_comm_ip'] = self.get_ip_address_from_peer_service_instance(
100 'spgw_network', "VSPGWCTenant", 'cp_comm_ip')
Woojoong Kimf002aec2017-10-25 14:43:37 -0700101 fields['fpc_ip'] = "127.0.0.1"
102 fields['cp_nb_server_ip'] = "127.0.0.1"
103
104 # for cp_config.cfg file
Sapan Bhatia968f28f2017-11-22 12:00:01 -0500105 fields['s1u_ip'] = self.get_ip_address_from_peer_service_instance_instance(
106 's1u_network', o, 's1u_ip')
107 fields['sgi_ip'] = self.get_ip_address_from_peer_service_instance_instance(
108 'sgi_network', o, 'sgi_ip')
Woojoong Kimf002aec2017-10-25 14:43:37 -0700109
110 return fields
111
Sapan Bhatia968f28f2017-11-22 12:00:01 -0500112 def get_values_for_spirent_w_sdncontroller(self, o):
Woojoong Kimf002aec2017-10-25 14:43:37 -0700113 fields = {}
114 fields['scenario'] = "ng4t_with_sdncontroller"
115 # for interface.cfg file
Sapan Bhatia968f28f2017-11-22 12:00:01 -0500116 fields['zmq_sub_ip'] = self.get_ip_address_from_peer_service_instance(
117 'sbi_network', "SDNControllerServiceInstance", 'zmq_sub_ip')
118 fields['zmq_pub_ip'] = self.get_ip_address_from_peer_service_instance(
119 'sbi_network', "SDNControllerServiceInstance", 'zmq_pub_ip')
120 fields['dp_comm_ip'] = self.get_ip_address_from_peer_service_instance_instance(
121 'sbi_network', o, 'dp_comm_ip')
122 fields['cp_comm_ip'] = self.get_ip_address_from_peer_service_instance(
123 'nbi_network', "VSPGWCTenant", 'cp_comm_ip')
124 fields['fpc_ip'] = self.get_ip_address_from_peer_service_instance(
125 'nbi_network', "SDNControllerServiceInstance", 'fpc_ip')
126 fields['cp_nb_server_ip'] = self.get_ip_address_from_peer_service_instance(
127 'nbi_network', "VSPGWCTenant", 'cp_nb_server_ip')
Woojoong Kimf002aec2017-10-25 14:43:37 -0700128
129 # for dp_config.cfg file
Sapan Bhatia968f28f2017-11-22 12:00:01 -0500130 fields['s1u_ip'] = self.get_ip_address_from_peer_service_instance_instance(
131 's1u_network', o, 's1u_ip')
132 fields['sgi_ip'] = self.get_ip_address_from_peer_service_instance_instance(
133 'sgi_network', o, 'sgi_ip')
Woojoong Kimf002aec2017-10-25 14:43:37 -0700134
135 return fields
136
Sapan Bhatia968f28f2017-11-22 12:00:01 -0500137 def get_values_for_spirent_wo_sdncontroller(self, o):
Woojoong Kimf002aec2017-10-25 14:43:37 -0700138 fields = {}
139 fields['scenario'] = "ng4t_without_sdncontroller"
140 # for interface.cfg file
141 fields['zmq_sub_ip'] = "127.0.0.1"
142 fields['zmq_pub_ip'] = "127.0.0.1"
Sapan Bhatia968f28f2017-11-22 12:00:01 -0500143 fields['dp_comm_ip'] = self.get_ip_address_from_peer_service_instance_instance(
144 'spgw_network', o, 'dp_comm_ip')
145 fields['cp_comm_ip'] = self.get_ip_address_from_peer_service_instance(
146 'spgw_network', "VSPGWCTenant", 'cp_comm_ip')
Woojoong Kimf002aec2017-10-25 14:43:37 -0700147 fields['fpc_ip'] = "127.0.0.1"
148 fields['cp_nb_server_ip'] = "127.0.0.1"
149
150 # for cp_config.cfg file
Sapan Bhatia968f28f2017-11-22 12:00:01 -0500151 fields['s1u_ip'] = self.get_ip_address_from_peer_service_instance_instance(
152 's1u_network', o, 's1u_ip')
153 fields['sgi_ip'] = self.get_ip_address_from_peer_service_instance_instance(
154 'sgi_network', o, 'sgi_ip')
Woojoong Kimf002aec2017-10-25 14:43:37 -0700155
156 return fields
157
Sapan Bhatia968f28f2017-11-22 12:00:01 -0500158 def has_instance(self, sitype, o):
159 i = self.get_peer_serviceinstance_of_type(sitype, o)
160 if not i:
161 self.log.info("Missing in ServiceInstance graph",
162 serviceinstance=sitype)
Woojoong Kimf002aec2017-10-25 14:43:37 -0700163 return False
164
Sapan Bhatia968f28f2017-11-22 12:00:01 -0500165 return i.instance_id
Woojoong Kimf002aec2017-10-25 14:43:37 -0700166
167 # Which scenario does it use among Spirent or NG4T?
Sapan Bhatia968f28f2017-11-22 12:00:01 -0500168 def get_scenario(self, o):
Woojoong Kimf002aec2017-10-25 14:43:37 -0700169 # try get vENB instance: one of both Spirent and NG4T
Sapan Bhatia968f28f2017-11-22 12:00:01 -0500170 venb_flag = self.has_instance("VENBServiceInstance", o)
171 vmme_flag = self.has_instance("VMMETenant", o)
172 sdncontroller_flag = self.has_instance(
173 "SDNControllerServiceInstance", o)
174 vspgwu_flag = self.has_instance("VSPGWUTenant", o)
175 internetemulator_flag = self.has_instance(
176 "SDNControllerServiceInstance", o)
Woojoong Kimf002aec2017-10-25 14:43:37 -0700177
178 if vmme_flag and venb_flag and sdncontroller_flag and vspgwu_flag and internetemulator_flag:
179 return 'ng4t_with_sdncontroller'
180
181 if vmme_flag and venb_flag and (not sdncontroller_flag) and vspgwu_flag and internetemulator_flag:
182 return 'ng4t_without_sdncontroller'
183
184 if (not vmme_flag) and venb_flag and sdncontroller_flag and vspgwu_flag and (not internetemulator_flag):
185 return 'spirent_with_sdncontroller'
186
187 if (not vmme_flag) and venb_flag and (not sdncontroller_flag) and vspgwu_flag and (
Sapan Bhatia968f28f2017-11-22 12:00:01 -0500188 not internetemulator_flag):
Woojoong Kimf002aec2017-10-25 14:43:37 -0700189 return 'spirent_without_sdncontroller'
190
191 return 'manual'
192
Sapan Bhatia968f28f2017-11-22 12:00:01 -0500193 def get_peer_serviceinstance_of_type(self, sitype, o):
194 prov_link_set = ServiceInstanceLink.objects.filter(
195 subscriber_service_instance_id=o.id)
Woojoong Kimf002aec2017-10-25 14:43:37 -0700196
197 try:
Sapan Bhatia968f28f2017-11-22 12:00:01 -0500198 peer_service = next(
199 p for p in prov_link_set if p.leaf_model_name == sitype)
200 except StopIteration:
201 sub_link_set = ServiceInstanceLink.objects.filter(
202 provider_service_instance_id=o.id)
203 try:
204 peer_service = next(
205 s for s in sub_link_set if s.leaf_model_name == sitype)
206 except StopIteration:
207 self.log.error(
208 'Could not find service type in service graph', service_type=sitype, object=o)
209 raise Exception(
210 "Synchronization failed due to incomplete service graph")
211
212 return peer_service
213
214 def get_ip_address_from_peer_service_instance(self, network_name, sitype, o, parameter=None):
215 peer_si = self.get_peer_serviceinstance_of_type(sitype, o)
216 return self.get_ip_address_for_peer_service_instance_instance(network_name, peer_si, parameter)
217
218 def get_ip_address_from_peer_service_instance_instance(self, network_name, peer_si, parameter=None):
219 try:
Woojoong Kimf002aec2017-10-25 14:43:37 -0700220 net_id = self.get_network_id(network_name)
Sapan Bhatia968f28f2017-11-22 12:00:01 -0500221 ins_id = peer_si.instance_id
222 ip_address = Port.objects.get(
223 network_id=net_id, instance_id=ins_id).ip
Woojoong Kimf002aec2017-10-25 14:43:37 -0700224 except Exception:
Sapan Bhatia968f28f2017-11-22 12:00:01 -0500225 self.log.error("Failed to fetch parameter",
226 parameter=parameter,
227 network_name=network_name)
Sapan Bhatiaa71f2212017-11-22 10:12:18 -0500228 self.defer_sync("Waiting for parameters to become available")
Woojoong Kimf002aec2017-10-25 14:43:37 -0700229
230 return ip_address
231
232 # To get each network id
233 def get_network_id(self, network_name):
234 return Network.objects.get(name=network_name).id