blob: 046e7444dacff1b4d525921190320a9782723f03 [file] [log] [blame]
Matteo Scandoloe2cb8a42018-05-18 16:30:06 -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
Matteo Scandolo6be6ee92018-05-24 15:07:51 -070015import random
16
Matteo Scandolo6be6ee92018-05-24 15:07:51 -070017from xos.exceptions import XOSValidationError
Matteo Scandoloe2cb8a42018-05-18 16:30:06 -070018
19from models_decl import VOLTService_decl
20from models_decl import VOLTServiceInstance_decl
21from models_decl import OLTDevice_decl
Scott Baker04c5ec32018-07-12 14:01:06 -070022from models_decl import PortBase_decl
Matteo Scandoloe2cb8a42018-05-18 16:30:06 -070023from models_decl import PONPort_decl
Matteo Scandolo6be6ee92018-05-24 15:07:51 -070024from models_decl import NNIPort_decl
Matteo Scandoloe2cb8a42018-05-18 16:30:06 -070025from models_decl import ONUDevice_decl
Matteo Scandolod8ed60e2018-06-18 17:00:57 -070026from models_decl import PONONUPort_decl
27from models_decl import UNIPort_decl
Matteo Scandoloe2cb8a42018-05-18 16:30:06 -070028
29class VOLTService(VOLTService_decl):
30 class Meta:
31 proxy = True
32
33 @staticmethod
34 def has_access_device(serial_number):
35 try:
36 ONUDevice.objects.get(serial_number=serial_number)
37 return True
38 except IndexError, e:
39 return False
40
Matteo Scandoloe2cb8a42018-05-18 16:30:06 -070041class VOLTServiceInstance(VOLTServiceInstance_decl):
42 class Meta:
Matteo Scandolo2360fd92018-05-29 17:27:51 -070043 proxy = True
Matteo Scandoloe2cb8a42018-05-18 16:30:06 -070044
45class OLTDevice(OLTDevice_decl):
46 class Meta:
Matteo Scandolo2360fd92018-05-29 17:27:51 -070047 proxy = True
Matteo Scandoloe2cb8a42018-05-18 16:30:06 -070048
Matteo Scandolo2360fd92018-05-29 17:27:51 -070049 def get_volt_si(self):
50 return VOLTServiceInstance.objects.all()
51
Matteo Scandolo2ed64b92018-06-18 10:32:56 -070052 def save(self, *args, **kwargs):
53
54 if (self.host or self.port) and self.mac_address:
55 raise XOSValidationError("You can't specify both host/port and mac_address for OLTDevice [host=%s, port=%s, mac_address=%s]" % (self.host, self.port, self.mac_address))
56
57 super(OLTDevice, self).save(*args, **kwargs)
58
Matteo Scandolo2360fd92018-05-29 17:27:51 -070059 def delete(self, *args, **kwargs):
60
61 onus = []
62 pon_ports = self.pon_ports.all()
63 for port in pon_ports:
64 onus = onus + list(port.onu_devices.all())
65
66
67 if len(onus) > 0:
68 onus = [o.id for o in onus]
69
70 # find the ONUs used by VOLTServiceInstances
71 used_onus = [o.onu_device_id for o in self.get_volt_si()]
72
73 # find the intersection between the onus associated with this OLT and the used one
74 used_onus_to_delete = [o for o in onus if o in used_onus]
75
76 if len(used_onus_to_delete) > 0:
77 if hasattr(self, "device_id") and self.device_id:
78 item = self.device_id
79 elif hasattr(self, "name") and self.name:
80 item = self.name
81 else:
82 item = self.id
83 raise XOSValidationError('OLT "%s" can\'t be deleted as it has subscribers associated with its ONUs' % item)
84
85 super(OLTDevice, self).delete(*args, **kwargs)
Matteo Scandoloe2cb8a42018-05-18 16:30:06 -070086
Scott Baker04c5ec32018-07-12 14:01:06 -070087class PortBase(PortBase_decl):
88 class Meta:
89 proxy = True
90
Matteo Scandoloe2cb8a42018-05-18 16:30:06 -070091class PONPort(PONPort_decl):
92 class Meta:
Matteo Scandolo6be6ee92018-05-24 15:07:51 -070093 proxy = True
94
95 def generate_tag(self):
96 # NOTE this method will loop if available c_tags are ended
97 tag = random.randint(16, 4096)
98 if tag in self.get_used_s_tags():
99 return self.generate_tag()
100 return tag
101
102 def get_used_s_tags(self):
103 same_olt_device = OLTDevice.objects.filter(device_id=self.olt_device)
104 return [s.c_tag for s in same_olt_device]
105
106 def save(self, *args, **kwargs):
107 # validate s_tag
108 if hasattr(self, 's_tag') and self.s_tag is not None:
109 is_update_with_same_tag = False
110
111 if not self.is_new:
112 # if it is an update, but the tag is the same, skip validation
113 existing = PONPort.objects.filter(s_tag=self.s_tag)
114
115 if len(existing) > 0 and existing[0].s_tag == self.s_tag and existing[0].id == self.id:
116 is_update_with_same_tag = True
117
118 if self.s_tag in self.get_used_s_tags() and not is_update_with_same_tag:
119 raise XOSValidationError(
120 "The s_tag you specified (%s) has already been used on device %s" % (self.s_tag, self.onu_device))
121
122 if not hasattr(self, "s_tag") or self.s_tag is None:
123 self.s_tag = self.generate_tag()
124
125 super(PONPort, self).save(*args, **kwargs)
126
127
128class NNIPort(NNIPort_decl):
129 class Meta:
130 proxy = True
Matteo Scandoloe2cb8a42018-05-18 16:30:06 -0700131
132
133class ONUDevice(ONUDevice_decl):
134 class Meta:
Matteo Scandolod8ed60e2018-06-18 17:00:57 -0700135 proxy = True
136
Matteo Scandolo33fb1622018-06-19 18:54:35 -0700137 def delete(self, *args, **kwargs):
138
139 if len(self.volt_service_instances.all()) > 0:
140 raise XOSValidationError('ONU "%s" can\'t be deleted as it has subscribers associated with it' % self.serial_number)
141
142 super(ONUDevice, self).delete(*args, **kwargs)
143
Matteo Scandolod8ed60e2018-06-18 17:00:57 -0700144class PONONUPort(PONONUPort_decl):
145 class Meta:
146 proxy = True
147
148class UNIPort(UNIPort_decl):
149 class Meta:
150 proxy = True
Matteo Scandoloe2cb8a42018-05-18 16:30:06 -0700151