blob: e47815e366201c510c59c37a70bc73ae894eac2a [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
24class SyncVSPGWUTenant(SyncInstanceUsingAnsible):
25
26 provides = [VSPGWUTenant]
27
28 observes = VSPGWUTenant
29
30 requested_interval = 0
31
32 template_name = "vspgwutenant_playbook.yaml"
33
34 service_key_name = "/opt/xos/configurations/mcord/mcord_private_key"
35
36 def __init__(self, *args, **kwargs):
37 super(SyncVSPGWUTenant, self).__init__(*args, **kwargs)
38
Woojoong Kimf002aec2017-10-25 14:43:37 -070039 def get_extra_attributes(self, o):
40
41 scenario = self.get_scenario()
42
43 if scenario == 'ng4t_with_sdncontroller':
44 return self.get_values_for_ng4t_w_sdncontroller()
45 elif scenario == 'ng4t_without_sdncontroller':
46 return self.get_values_for_ng4t_wo_sdncontroller()
47 elif scenario == 'spirent_with_sdncontroller':
48 return self.get_values_for_spirent_w_sdncontroller()
49 elif scenario == 'spirent_without_sdncontroller':
50 return self.get_values_for_spirent_wo_sdncontroller()
51 else:
52 return self.get_extra_attributes_for_manual()
53
54 # fields for manual case
55 def get_extra_attributes_for_manual(self):
56 fields = {}
57 fields['scenario'] = self.get_scenario()
58 # for interface.cfg file
59 fields['zmq_sub_ip'] = "manual"
60 fields['zmq_pub_ip'] = "manual"
61 fields['dp_comm_ip'] = "manual"
62 fields['cp_comm_ip'] = "manual"
63 fields['fpc_ip'] = "manual"
64 fields['cp_nb_server_ip'] = "manual"
65
66 # for dp_config.cfg file
67 fields['s1u_ip'] = "manual"
68 fields['sgi_ip'] = "manual"
69
70 return fields
71
72 def get_values_for_ng4t_w_sdncontroller(self):
73 fields = {}
74 fields['scenario'] = "ng4t_with_sdncontroller"
75 # for interface.cfg file
76 fields['zmq_sub_ip'] = self.get_ip_address('sbi_network', SDNControllerServiceInstance, 'zmq_sub_ip')
77 fields['zmq_pub_ip'] = self.get_ip_address('sbi_network', SDNControllerServiceInstance, 'zmq_pub_ip')
78 fields['dp_comm_ip'] = self.get_ip_address('sbi_network', VSPGWUTenant, 'dp_comm_ip')
79 fields['cp_comm_ip'] = self.get_ip_address('nbi_network', VSPGWCTenant, 'cp_comm_ip')
80 fields['fpc_ip'] = self.get_ip_address('nbi_network', SDNControllerServiceInstance, 'fpc_ip')
81 fields['cp_nb_server_ip'] = self.get_ip_address('nbi_network', VSPGWCTenant, 'cp_nb_server_ip')
82
83 # for dp_config.cfg file
84 fields['s1u_ip'] = self.get_ip_address('s1u_network', VSPGWUTenant, 's1u_ip')
85 fields['sgi_ip'] = self.get_ip_address('sgi_network', VSPGWUTenant, 'sgi_ip')
86
87 return fields
88
89 def get_values_for_ng4t_wo_sdncontroller(self):
90 fields = {}
91 fields['scenario'] = "ng4t_without_sdncontroller"
92 # for interface.cfg file
93 fields['zmq_sub_ip'] = "127.0.0.1"
94 fields['zmq_pub_ip'] = "127.0.0.1"
95 fields['dp_comm_ip'] = self.get_ip_address('spgw_network', VSPGWUTenant, 'dp_comm_ip')
96 fields['cp_comm_ip'] = self.get_ip_address('spgw_network', VSPGWCTenant, 'cp_comm_ip')
97 fields['fpc_ip'] = "127.0.0.1"
98 fields['cp_nb_server_ip'] = "127.0.0.1"
99
100 # for cp_config.cfg file
101 fields['s1u_ip'] = self.get_ip_address('s1u_network', VSPGWUTenant, 's1u_ip')
102 fields['sgi_ip'] = self.get_ip_address('sgi_network', VSPGWUTenant, 'sgi_ip')
103
104 return fields
105
106 def get_values_for_spirent_w_sdncontroller(self):
107 fields = {}
108 fields['scenario'] = "ng4t_with_sdncontroller"
109 # for interface.cfg file
110 fields['zmq_sub_ip'] = self.get_ip_address('sbi_network', SDNControllerServiceInstance, 'zmq_sub_ip')
111 fields['zmq_pub_ip'] = self.get_ip_address('sbi_network', SDNControllerServiceInstance, 'zmq_pub_ip')
112 fields['dp_comm_ip'] = self.get_ip_address('sbi_network', VSPGWUTenant, 'dp_comm_ip')
113 fields['cp_comm_ip'] = self.get_ip_address('nbi_network', VSPGWCTenant, 'cp_comm_ip')
114 fields['fpc_ip'] = self.get_ip_address('nbi_network', SDNControllerServiceInstance, 'fpc_ip')
115 fields['cp_nb_server_ip'] = self.get_ip_address('nbi_network', VSPGWCTenant, 'cp_nb_server_ip')
116
117 # for dp_config.cfg file
118 fields['s1u_ip'] = self.get_ip_address('s1u_network', VSPGWUTenant, 's1u_ip')
119 fields['sgi_ip'] = self.get_ip_address('sgi_network', VSPGWUTenant, 'sgi_ip')
120
121 return fields
122
123 def get_values_for_spirent_wo_sdncontroller(self):
124 fields = {}
125 fields['scenario'] = "ng4t_without_sdncontroller"
126 # for interface.cfg file
127 fields['zmq_sub_ip'] = "127.0.0.1"
128 fields['zmq_pub_ip'] = "127.0.0.1"
129 fields['dp_comm_ip'] = self.get_ip_address('spgw_network', VSPGWUTenant, 'dp_comm_ip')
130 fields['cp_comm_ip'] = self.get_ip_address('spgw_network', VSPGWCTenant, 'cp_comm_ip')
131 fields['fpc_ip'] = "127.0.0.1"
132 fields['cp_nb_server_ip'] = "127.0.0.1"
133
134 # for cp_config.cfg file
135 fields['s1u_ip'] = self.get_ip_address('s1u_network', VSPGWUTenant, 's1u_ip')
136 fields['sgi_ip'] = self.get_ip_address('sgi_network', VSPGWUTenant, 'sgi_ip')
137
138 return fields
139
140 def has_venb(self):
141 # try get vMME instance
142 try:
143 instance_id = self.get_instance_id(VENBServiceInstance)
144 except Exception:
145 print 'cannot get VENBServiceInstance'
146 return False
147
148 return True
149
150 def has_vmme(self):
151 # try get vMME instance
152 try:
153 instance_id = self.get_instance_id(VMMETenant)
154 except Exception:
155 print 'cannot get VMMETenant'
156 return False
157
158 return True
159
160 def has_sdncontroller(self):
161 # try get vMME instance
162 try:
163 instance_id = self.get_instance_id(SDNControllerServiceInstance)
164 except Exception:
165 print 'cannot get SDNControllerServiceInstance'
166 return False
167
168 return True
169
170 def has_vspgwu(self):
171 # try get vMME instance
172 try:
173 instance_id = self.get_instance_id(VSPGWUTenant)
174 except Exception:
175 print 'cannot get VSPGWUTenant'
176 return False
177
178 return True
179
180 def has_internetemulator(self):
181 # try get vMME instance
182 try:
183 instance_id = self.get_instance_id(InternetEmulatorServiceInstance)
184 except Exception:
185 print 'cannot get InternetEmulatorServiceInstance'
186 return False
187
188 return True
189
190 # Which scenario does it use among Spirent or NG4T?
191 def get_scenario(self):
192 # try get vENB instance: one of both Spirent and NG4T
193 venb_flag = self.has_venb()
194 vmme_flag = self.has_vmme()
195 sdncontroller_flag = self.has_sdncontroller()
196 vspgwu_flag = self.has_vspgwu()
197 internetemulator_flag = self.has_internetemulator()
198
199 if vmme_flag and venb_flag and sdncontroller_flag and vspgwu_flag and internetemulator_flag:
200 return 'ng4t_with_sdncontroller'
201
202 if vmme_flag and venb_flag and (not sdncontroller_flag) and vspgwu_flag and internetemulator_flag:
203 return 'ng4t_without_sdncontroller'
204
205 if (not vmme_flag) and venb_flag and sdncontroller_flag and vspgwu_flag and (not internetemulator_flag):
206 return 'spirent_with_sdncontroller'
207
208 if (not vmme_flag) and venb_flag and (not sdncontroller_flag) and vspgwu_flag and (
209 not internetemulator_flag):
210 return 'spirent_without_sdncontroller'
211
212 return 'manual'
213
214 def get_ip_address(self, network_name, service_instance, parameter):
215
216 try:
217 net_id = self.get_network_id(network_name)
218 ins_id = self.get_instance_id(service_instance)
219 ip_address = Port.objects.get(network_id=net_id, instance_id=ins_id).ip
220
221 except Exception:
Sapan Bhatiaa71f2212017-11-22 10:12:18 -0500222 self.log.error("Failed to fetch parameter", parameter = parameter, network_name = network_name)
223 self.defer_sync("Waiting for parameters to become available")
Woojoong Kimf002aec2017-10-25 14:43:37 -0700224
225 return ip_address
226
227 # To get each network id
228 def get_network_id(self, network_name):
229 return Network.objects.get(name=network_name).id
230
231 # To get service_instance (assumption: there is a single instance for each service)
232 def get_instance_id(self, serviceinstance):
233 instances = serviceinstance.objects.all()
234 instance_id = instances[0].instance_id
Sapan Bhatiaa71f2212017-11-22 10:12:18 -0500235 return instance_id