Source code for networkapi.rack.models

# -*- coding: utf-8 -*-
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from __future__ import with_statement
from django.db import models
from django.core.exceptions import ObjectDoesNotExist
import logging
from networkapi.models.BaseModel import BaseModel


[docs]class RackError(Exception): """Representa um erro ocorrido durante acesso ?| tabela racks.""" def __init__(self, cause, message=None): self.cause = cause self.message = message def __str__(self): msg = u'Causa: %s, Mensagem: %s' % (self.cause, self.message) return msg.encode('utf-8', 'replace')
[docs]class InvalidMacValueError(RackError): """Retorna exceção quando o valor da variávmac é inválido.""" def __init__(self, cause, message=None): RackError.__init__(self, cause, message)
[docs]class RackNumberDuplicatedValueError(RackError): """Retorna exceção quando numero do rack for repetido.""" def __init__(self, cause, message=None): RackError.__init__(self, cause, message)
[docs]class RackNameDuplicatedError(RackError): """Retorna exceção quando numero do rack for repetido.""" def __init__(self, cause, message=None): RackError.__init__(self, cause, message)
[docs]class RackNumberNotFoundError(RackError): """Retorna exceção quando rack nao for encontrado.""" def __init__(self, cause, message=None): RackError.__init__(self, cause, message)
[docs]class RackConfigError(Exception): """Retorna exceção quao a configuracao nao for criada.""" def __init__(self, cause, param=None, value=None): self.cause = cause self.param = param self.value = value
[docs]class RackAplError(Exception): """Retorna exceção quao a configuracao nao pode ser aplicada.""" def __init__(self, cause, param=None, value=None): self.cause = cause self.param = param self.value = value
[docs]class Datacenter(BaseModel): log = logging.getLogger('Datacenter') id = models.AutoField(primary_key=True, db_column='id_dc') dcname = models.CharField(max_length=100, unique=True) address = models.CharField(max_length=100, unique=True) class Meta(BaseModel.Meta): db_table = u'datacenter' managed = True def _get_initials(self): if len(self.dcname.split()) <= 1: return self.dcname[:3] return "".join(i[0].upper() for i in self.dcname.split()) sigla = property(_get_initials)
[docs] def get_dc(self, idt=None, dcname=None, address=None): """"Find Datacenter by id or name. @return: Datacenter @raise : . """ try: if idt: return Datacenter.objects.get(id=idt) if dcname: return Datacenter.objects.get(dcname=dcname) if address: return Datacenter.objects.filter(address=address) return Datacenter.objects.all() except ObjectDoesNotExist, e: raise Exception(u'Datacenter doesnt exist. %s' % e) except Exception, e: self.log.error(u'Failure to get datacenter. %s' % e) raise Exception(e, u'Failure to get datacenter. %s' % e)
[docs] def save_dc(self): '''Insert a new Datacenter. ''' try: self.save() except Exception, e: self.log.error(u'Error trying to insert DatacenterRooms: %s.' %e)
[docs] def del_dc(self): try: self.delete() except Exception, e: self.log.error(u'Error trying to remove Datacenter: %s.' %e) raise Exception(u'Error trying to remove Datacenter: %s.' %e)
[docs]class DatacenterRooms(BaseModel): log = logging.getLogger('DatacenterRooms') id = models.AutoField(primary_key=True, db_column='id_dcroom') name = models.CharField(max_length=100, unique=True) dc = models.ForeignKey(Datacenter, unique=True, db_column='id_dc') racks = models.IntegerField(blank=True, null=True) spines = models.IntegerField(blank=True, null=True) leafs = models.IntegerField(blank=True, null=True) config = models.CharField(max_length=255) class Meta(BaseModel.Meta): db_table = u'datacenterrooms' managed = True
[docs] def get_dcrooms(self, idt=None, id_dc=None, name=None): """ Find DatacenterRooms by id, name or datacenter. @return: DatacenterRooms. @raise : . """ try: if idt: return DatacenterRooms.objects.get(id=idt) if name: return DatacenterRooms.objects.filter(name=name) if id_dc: return DatacenterRooms.objects.filter(dc=id_dc) return DatacenterRooms.objects.all() except ObjectDoesNotExist, e: raise Exception(u'Datacenter Rooms doesnt exist. %s' % e) except Exception, e: self.log.error(u'Failure to get datacenter room. %s' % e) raise Exception(u'Failure to get datacenter room. %s' % e)
[docs] def save_dcrooms(self): '''Insert a new DatacenterRooms. ''' try: self.save() except Exception, e: self.log.error(u'Error trying to insert DatacenterRooms: %s.' %e) raise Exception(u'Error trying to insert DatacenterRooms: %s.' %e)
[docs] def del_dcrooms(self): try: self.delete() except Exception, e: self.log.error(u'Error trying to remove DatacenterRooms: %s.' %e) raise Exception(u'Error trying to remove DatacenterRooms: %s.' %e)
[docs]class Rack(BaseModel): log = logging.getLogger('Rack') id = models.AutoField(primary_key=True, db_column='id_rack') numero = models.IntegerField(unique=True) nome = models.CharField(max_length=4, unique=True) mac_sw1 = models.CharField(max_length=17, blank=True, null=True, db_column='mac_sw1') mac_sw2 = models.CharField(max_length=17, blank=True, null=True, db_column='mac_sw2') mac_ilo = models.CharField(max_length=17, blank=True, null=True, db_column='mac_ilo') id_sw1 = models.ForeignKey('equipamento.Equipamento', blank=True, null=True, db_column='id_equip1', related_name='equipamento_sw1') id_sw2 = models.ForeignKey('equipamento.Equipamento', blank=True, null=True, db_column='id_equip2', related_name='equipamento_sw2') id_ilo = models.ForeignKey('equipamento.Equipamento', blank=True, null=True, db_column='id_equip3', related_name='equipamento_ilo') config = models.BooleanField(default=False) create_vlan_amb = models.BooleanField(default=False) dcroom = models.ForeignKey(DatacenterRooms, db_column='dcroom', null=True) class Meta(BaseModel.Meta): db_table = u'racks' managed = True
[docs] def get_rack(cls, idt=None, number=None, name=None, dcroom_id=None, dc_id=None): """"Get Rack by id, number, name, equipment, room or datacenter. @return: Rack. """ try: if idt: return Rack.objects.get(id=idt) if name: return Rack.objects.filter(nome=name) if number: return Rack.objects.filter(numero=number) if dcroom_id: return Rack.objects.filter(dcroom=dcroom_id) if dc_id: return Rack.objects.filter(dcroom__dc__id=dc_id) return Rack.objects.all() except ObjectDoesNotExist, e: raise Exception('Rack does not exist. %s.' % e) except Exception, e: raise Exception('Failure to search the Rack. %s' % e)
[docs] def save_rack(self): if Rack.objects.filter(numero=self.numero, dcroom=self.dcroom): raise Exception ('Numero de Rack %s ja existe na sala %s.' % (self.numero, self.dcroom.name)) if Rack.objects.filter(nome=self.nome, dcroom=self.dcroom): raise Exception ('Já existe um rack com o nome %s na sala %s.' % (self.nome, self.dcroom.name)) try: self.id_sw1 = networkapi.equipamento.Equipamento.get_by_pk(int(id_sw1)) if self.id_sw1 is int else self.id_sw1 self.id_sw2 = networkapi.equipamento.Equipamento.get_by_pk(int(id_sw2)) if self.id_sw2 is int else self.id_sw2 self.id_ilo = networkapi.equipamento.Equipamento.get_by_pk(int(id_sw3)) if self.id_sw3 is int else self.id_sw3 self.dcroom = DatacenterRoom.get_dcrooms(int(dcroom)) if self.dcroom is int else self.dcroom return self.save() except Exception, e: raise Exception('Falha ao inserir Rack. %s' % e)
[docs] def del_rack(self): try: self.delete() except Exception, e: raise Exception(u'Error trying to remove Rack: %s.' %e)
[docs] def get_by_pk(cls, idt): """"Get Rack id. @return: Rack. @raise RackNumberNotFoundError: Rack is not registered. @raise RackError: Failed to search for the Rack. """ try: return Rack.objects.filter(id=idt).uniqueResult() except ObjectDoesNotExist, e: raise RackNumberNotFoundError( e, u'Dont there is a Rack by pk = %s.' % idt) except Exception, e: cls.log.error(u'Failure to search the Rack.') raise RackError(e, u'Failure to search the Rack.')
[docs] def get_by_name(cls, name): """"Get Rack id. @return: Rack. @raise RackNumberNotFoundError: Rack is not registered. @raise RackError: Failed to search for the Rack. """ try: return Rack.objects.filter(nome=name).uniqueResult() except ObjectDoesNotExist, e: raise RackNumberNotFoundError( e, u'Dont there is the Rack %s.' % name) except Exception, e: cls.log.error(u'Failure to search the Rack.') raise RackError(e, u'Failure to search the Rack.')
[docs] def get_by_id(cls, number): """"Get Rack number. @return: Rack. @raise RackNumberNotFoundError: Rack is not registered. @raise RackError: Failed to search for the Rack. """ try: return Rack.objects.get(numero__iexact=number) except ObjectDoesNotExist, e: raise RackNumberNotFoundError( e, u'Dont there is a Rack by pk = %s.' % idt) except Exception, e: cls.log.error(u'Failure to search the Rack.') raise RackError(e, u'Failure to search the Rack.')
[docs] def insert_new(self, authenticated_user): try: Rack.objects.get(numero__iexact=self.numero) raise RackNumberDuplicatedValueError( None, u'Numero de Rack %s ja existe.' % (self.numero)) except ObjectDoesNotExist, e: pass try: Rack.objects.get(nome__iexact=self.nome) raise RackNameDuplicatedError( None, u'Nome %s ja existe.' % (self.nome)) except ObjectDoesNotExist, e: pass try: return self.save() except Exception, e: self.log.error(u'Falha ao inserir Rack.') raise RackError(e, u'Falha ao inserir Rack.')
[docs]class EnvironmentRackError(Exception): """EnvironmentRack table errors""" def __init__(self, cause, message=None): self.cause = cause self.message = message def __str__(self): msg = u'Cause: %s, Message: %s' % (self.cause, self.message) return msg.encode('utf-8', 'replace')
[docs]class EnvironmentRackDuplicatedError(EnvironmentRackError): """Exception when environment and rack are already associated.""" def __init__(self, cause, message=None): EnvironmentRackError.__init__(self, cause, message)
[docs]class EnvironmentRackNotFoundError(EnvironmentRackError): """EnvironmentRack not found.""" def __init__(self, cause, message=None): EnvironmentRackError.__init__(self, cause, message)
[docs]class EnvironmentRack(BaseModel): log = logging.getLogger('EnvironmentRack') id = models.AutoField(primary_key=True, db_column='id_ambienterack') ambiente = models.ForeignKey('ambiente.Ambiente', db_column='id_ambiente') rack = models.ForeignKey(Rack, db_column='id_rack') class Meta(BaseModel.Meta): db_table = u'ambiente_rack' managed = True
[docs] def create(self, authenticated_user): """Insert a new associoation between rack and environment @return: Nothing @raise AmbienteNotFoundError: Ambiente does not exists. @raise EnvironmentRackDuplicatedError: Rack already related to environment @raise EnvironmentRackError: Not able to complete. """ self.ambiente = Ambiente().get_by_pk(self.ambiente.id) self.rack = Rack().get_by_pk(self.rack.id) try: exist = EnvironmentRack().get_by_rack_environment( self.rack.id, self.ambiente.id) raise EnvironmentRackDuplicatedError( None, u'EnvironmentRack already registered.') except EnvironmentRackNotFoundError: pass try: self.save() except Exception, e: self.log.error(u'Error trying to insert EnvironmentRack: %s/%s.' % (self.rack.id, self.ambiente.id)) raise EnvironmentRackError( e, u'Error trying to insert EnvironmentRack: %s/%s.' % (self.rack.id, self.ambiente.id))
[docs] def get_by_rack_environment(self, rack_id, environment_id): try: return EnvironmentRack.objects.get(ambiente__id=environment_id, rack__id=rack_id) except ObjectDoesNotExist, e: raise EnvironmentRackNotFoundError( e, u'There is no EnvironmentRack with rack = %s and environment = %s.' % (rack_id, environment_id)) except Exception, e: self.log.error( u'Error trying to search EnvironmentRack %s/%s.' % (rack_id, environment_id)) raise EnvironmentRackError( e, u'Error trying to search EnvironmentRack.')
[docs] @classmethod def get_by_rack(cls, rack_id): """"Get Environment by racks id. @return: Environment. """ try: return EnvironmentRack.objects.filter(rack=rack_id) except ObjectDoesNotExist, e: raise RackError( e, u'Dont there is a Environment by rack = %s.' % rack_id) except Exception, e: cls.log.error(u'Failure to search the Environment.') raise AmbienteError(e, u'Failure to search the Environment.')