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