Source code for networkapi.equipamento.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.
import logging

from _mysql_exceptions import OperationalError
from django.core.exceptions import ObjectDoesNotExist
from django.db import models
from django.db.models import get_model

from networkapi.ambiente.models import Ambiente
from networkapi.ambiente.models import AmbienteNotFoundError
from networkapi.api_asn.v4.exceptions import AsnNotFoundError
from networkapi.api_equipment.exceptions import EquipmentInvalidValueException
from networkapi.grupo.models import EGrupo
from networkapi.grupo.models import EGrupoNotFoundError
from networkapi.models.BaseModel import BaseModel
from networkapi.roteiro.models import Roteiro
from networkapi.tipoacesso.models import TipoAcesso


[docs]class EquipamentoError(Exception): """Representa um erro ocorrido durante acesso à tabelas relacionadas com Equipamento.""" 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 EquipamentoNotFoundError(EquipamentoError): """Retorna exceção para pesquisa de equipamento por chave primária.""" def __init__(self, cause, message=None): EquipamentoError.__init__(self, cause, message)
[docs]class EquipamentoGrupoNotFoundError(EquipamentoError): """Retorna exceção para pesquisa de equipamento_grupo por chave primária.""" def __init__(self, cause, message=None): EquipamentoError.__init__(self, cause, message)
[docs]class EquipamentoAmbienteNotFoundError(EquipamentoError): """Retorna exceção para pesquisa de equipamento_ambiente por chave primária ou equipamento e ambiente.""" def __init__(self, cause, message=None): EquipamentoError.__init__(self, cause, message)
[docs]class EquipTypeCantBeChangedError(EquipamentoError): def __init__(self, cause, message=None): EquipamentoError.__init__(self, cause, message)
[docs]class EquipamentoRoteiroNotFoundError(EquipamentoError): """Retorna exceção para pesquisa de equipamento_roteiro.""" def __init__(self, cause, message=None): EquipamentoError.__init__(self, cause, message)
[docs]class EquipamentoRoteiroDuplicatedError(EquipamentoError): """Retorna exceção quando o equipamento_roteiro já existe.""" def __init__(self, cause, message=None): EquipamentoError.__init__(self, cause, message)
[docs]class EquipamentoGrupoDuplicatedError(EquipamentoError): """Retorna exceção quando o equipamento_grupo já existe.""" def __init__(self, cause, message=None): EquipamentoError.__init__(self, cause, message)
[docs]class EquipamentoAmbienteDuplicatedError(EquipamentoError): """Retorna exceção quando o equipamento_ambiente já existe.""" def __init__(self, cause, message=None): EquipamentoError.__init__(self, cause, message)
[docs]class EquipmentControllerEnvironmentNotFoundError(EquipamentoError): """Retorna exceção quando o equipment_controller_environment não existe.""" def __init__(self, cause, message=None): EquipamentoError.__init__(self, cause, message)
[docs]class EquipmentControllerEnvironmentDuplicatedError(EquipamentoError): """Retorna exceção quando o equipment_controller_environment já existe.""" def __init__(self, cause, message=None): EquipamentoError.__init__(self, cause, message)
[docs]class TipoEquipamentoNotFoundError(EquipamentoError): """Retorna exceção para pesquisa de tipo de equipamento por chave primária.""" def __init__(self, cause, message=None): EquipamentoError.__init__(self, cause, message)
[docs]class ModeloNotFoundError(EquipamentoError): """Retorna exceção para pesquisa de modelo de equipamento por chave primária.""" def __init__(self, cause, message=None): EquipamentoError.__init__(self, cause, message)
[docs]class ModeloRoteiroDuplicatedError(EquipamentoError): """Retorna exceção quando o modelo_roteiro já existe.""" def __init__(self, cause, message=None): EquipamentoError.__init__(self, cause, message)
[docs]class ModeloRoteiroNotFoundError(EquipamentoError): """Retorna exceção para pesquisa de modelo_roteiro.""" def __init__(self, cause, message=None): EquipamentoError.__init__(self, cause, message)
[docs]class MarcaNotFoundError(EquipamentoError): """Retorna exceção para pesquisa de modelo de equipamento por chave primária.""" def __init__(self, cause, message=None): EquipamentoError.__init__(self, cause, message)
[docs]class InvalidGroupToEquipmentTypeError(EquipamentoError): """Equipamento do grupo “Equipamentos Orquestração” somente poderá ser criado com tipo igual a “Servidor Virtual”.""" def __init__(self, cause, message=None): EquipamentoError.__init__(self, cause, message)
[docs]class EquipamentoNameDuplicatedError(EquipamentoError): """Retorna exceção porque já existe um Equipamento cadastrado com o mesmo nome.""" def __init__(self, cause, message=None): EquipamentoError.__init__(self, cause, message)
[docs]class EquipamentoAccessDuplicatedError(EquipamentoError): """Retorna exceção porque já existe um Equipamento cadastrado com o mesmo nome.""" def __init__(self, cause, message=None): EquipamentoError.__init__(self, cause, message)
[docs]class EquipamentoAccessNotFoundError(EquipamentoError): """Retorna exceção para pesquisa de modelo de equipamento por chave primária.""" def __init__(self, cause, message=None): EquipamentoError.__init__(self, cause, message)
[docs]class EquipmentDontRemoveError(EquipamentoError): def __init__(self, cause, message=None): EquipamentoError.__init__(self, cause, message)
[docs]class MarcaUsedByModeloError(EquipamentoError): """Retorna exceção se houver tentativa de exclusão de marca utilizada por algum modelo.""" def __init__(self, cause, message=None): EquipamentoError.__init__(self, cause, message)
[docs]class MarcaModeloNameDuplicatedError(EquipamentoError): """Retorna exceção se houver um Modelo e Marca com mesmo nome já cadastrado..""" def __init__(self, cause, message=None): EquipamentoError.__init__(self, cause, message)
[docs]class ModeloUsedByEquipamentoError(EquipamentoError): """Retorna exceção se houver tentativa de exclusão de um modelo utilizado por algum equipamento.""" def __init__(self, cause, message=None): EquipamentoError.__init__(self, cause, message)
[docs]class MarcaNameDuplicatedError(EquipamentoError): """Retorna exceção porque já existe uma marca cadastrado com o mesmo nome.""" def __init__(self, cause, message=None): EquipamentoError.__init__(self, cause, message)
[docs]class TipoEquipamentoDuplicateNameError(EquipamentoError): """Retorna exceção porque já existe um tipo de equipamento cadastrado com o mesmo nome.""" def __init__(self, cause, message=None): EquipamentoError.__init__(self, cause, message)
[docs]class Marca(BaseModel): id = models.AutoField(primary_key=True, db_column='id_marca') nome = models.CharField(max_length=100) log = logging.getLogger('Marca') class Meta(BaseModel.Meta): db_table = u'marcas' managed = True
[docs] @classmethod def get_by_pk(cls, idt): """"Get Brand id. @return: Brand L3. @raise MarcaNotFoundError: Brand is not registered. @raise EquipamentoError: Failed to search for the Brand. """ try: return Marca.objects.filter(id=idt).uniqueResult() except ObjectDoesNotExist, e: raise MarcaNotFoundError( e, u'Dont there is a Brand by pk = %s.' % idt) except Exception, e: cls.log.error(u'Failure to search the Brand.') raise EquipamentoError(e, u'Failure to search the Brand.')
[docs] @classmethod def get_by_name(cls, name): """"Get Brand by name. @return: Brand. @raise MarcaNotFoundError: Brand is not registered. @raise EquipamentoError: Failed to search for the Brand. """ try: return Marca.objects.get(nome__iexact=name) except ObjectDoesNotExist, e: raise MarcaNotFoundError( e, u'Dont there is a Brand by name = %s.' % name) except Exception, e: cls.log.error(u'Failure to search the Brand.') raise EquipamentoError(e, u'Failure to search the Brand.')
[docs]class Modelo(BaseModel): id = models.AutoField(primary_key=True, db_column='id_modelo') nome = models.CharField(max_length=100) marca = models.ForeignKey(Marca, db_column='id_marca') log = logging.getLogger('Modelo') class Meta(BaseModel.Meta): db_table = u'modelos' managed = True
[docs] @classmethod def get_by_pk(cls, idt): """"Get Model by id. @return: Model. @raise RoteiroNotFoundError: Model is not registered. @raise EquipamentoError: Failed to search for the Model. """ try: return Modelo.objects.filter(id=idt).uniqueResult() except ObjectDoesNotExist, e: raise ModeloNotFoundError( e, u'Dont there is a Model by pk = %s.' % idt) except Exception, e: cls.log.error(u'Failure to search the Model.') raise EquipamentoError(e, u'Failure to search the Model.')
[docs] @classmethod def get_by_name(cls, name): """"Get Model by name. @return: Model. @raise ModeloNotFoundError: Model is not registered. @raise EquipamentoError: Failed to search for the Model. """ try: return Modelo.objects.get(nome__iexact=name) except ObjectDoesNotExist, e: raise ModeloNotFoundError( e, u'Dont there is a Model by name = %s.' % name) except Exception, e: cls.log.error(u'Failure to search the Model.') raise EquipamentoError(e, u'Failure to search the Model.')
[docs] @classmethod def get_by_name_brand(cls, name, id_brand): """"Get Model by Name and Brand. @return: Model. @raise ModeloNotFoundError: Model is not registered. @raise EquipamentoError: Failed to search for the Model. """ try: return Modelo.objects.get(nome__iexact=name, marca__id=id_brand) except ObjectDoesNotExist, e: raise ModeloNotFoundError( e, u'Dont there is a Model by name = %s and Brand = %s.' % (name, id_brand)) except Exception, e: cls.log.error(u'Failure to search the Model.') raise EquipamentoError(e, u'Failure to search the Model.')
[docs] @classmethod def get_by_brand(cls, id_brand): """"Get Model by Brand. @return: Model. @raise ModeloNotFoundError: Model is not registered. @raise EquipamentoError: Failed to search for the Model. """ try: return Modelo.objects.filter(marca__id=id_brand) except ObjectDoesNotExist, e: raise ModeloNotFoundError( e, u'Dont there is a Model by Brand = %s.' % id_brand) except Exception, e: cls.log.error(u'Failure to search the Model.') raise EquipamentoError(e, u'Failure to search the Model.')
[docs]class TipoEquipamento(BaseModel): TIPO_EQUIPAMENTO_SERVIDOR_VIRTUAL = 10 TIPO_EQUIPAMENTO_SERVIDOR = 2 TIPO_EQUIPAMENTO_SWITCH = 1 TIPO_EQUIPAMENTO_ROUTER = 3 id = models.AutoField(primary_key=True, db_column='id_tipo_equipamento') tipo_equipamento = models.CharField(max_length=100) log = logging.getLogger('TipoEquipamento') class Meta(BaseModel.Meta): db_table = u'tipo_equipamento' managed = True
[docs] @classmethod def get_by_pk(cls, idt): """"Get Equipment Type by id. @return: Equipment Type. @raise TipoEquipamentoNotFoundError: Equipment Type is not registered. @raise EquipamentoError: Failed to search for the Equipment Type. """ try: return TipoEquipamento.objects.filter(id=idt).uniqueResult() except ObjectDoesNotExist, e: raise TipoEquipamentoNotFoundError( e, u'Dont there is a Equipment Type by pk = %s.' % idt) except Exception, e: cls.log.error(u'Failure to search the Equipment Type.') raise EquipamentoError(e, u'Failure to search the Equipment Type.')
[docs] @classmethod def get_tipo(cls, tipo): """"Get Equipment Type by Type. @return: Equipment Type. @raise TipoEquipamentoNotFoundError: Equipment Type is not registered. @raise EquipamentoError: Failed to search for the Equipment Type. """ try: return TipoEquipamento.objects.get(tipo_equipamento=tipo) except ObjectDoesNotExist, e: raise TipoEquipamentoNotFoundError( e, u'Dont there is a Equipment Type by type = %s.' % tipo) except Exception, e: cls.log.error(u'Failure to search the Equipment Type.') raise EquipamentoError(e, u'Failure to search the Equipment Type.')
[docs] @classmethod def get_tipo_balanceador(cls): """"Get Equipment Type by Type is balanceador. @return: Equipment Type. @raise TipoEquipamentoNotFoundError: Equipment Type is not registered. @raise EquipamentoError: Failed to search for the Equipment Type. """ try: return TipoEquipamento.objects.get(tipo_equipamento__iexact='balanceador') except ObjectDoesNotExist, e: raise TipoEquipamentoNotFoundError( e, u'Dont there is a Equipment Type by type is balanceador.') except Exception, e: cls.log.error(u'Failure to search the Equipment Type.') raise EquipamentoError(e, u'Failure to search the Equipment Type.')
[docs] @classmethod def get_by_name(cls, name): """"Get Equipment Type by name. @return: Equipment Type. @raise ModeloNotFoundError: Equipment Type is not registered. @raise EquipamentoError: Failed to search for the Equipment Type. """ try: return Modelo.objects.get(nome__iexact=name) except ObjectDoesNotExist, e: raise TipoEquipamentoNotFoundError( e, u'Dont there is a Equipment Type by name = %s.' % name) except Exception, e: cls.log.error(u'Failure to search the Equipment Type.') raise EquipamentoError(e, u'Failure to search the Equipment Type.')
[docs] def search(self): try: return TipoEquipamento.objects.all() except Exception, e: self.log.error(u'Falha ao pesquisar os tipos de equipamentos.') raise EquipamentoError( e, u'Falha ao pesquisar os tipos de equipamentos.')
[docs] def insert_new(self, authenticated_user, name): try: try: TipoEquipamento.objects.get(tipo_equipamento__iexact=name) raise TipoEquipamentoDuplicateNameError( None, u'Tipo equipamento %s, já cadastrado' % (name)) except ObjectDoesNotExist, e: pass self.tipo_equipamento = name self.save() return self.id except TipoEquipamentoDuplicateNameError, e: self.log.error(e.message) raise TipoEquipamentoDuplicateNameError(e, e.message) except Exception, e: self.log.exception(u'Falha ao inserir tipo de equipamentos.') raise EquipamentoError( e, u'Falha ao inserir tipo de equipamentos.')
[docs]class Equipamento(BaseModel): id = models.AutoField(primary_key=True, db_column='id_equip') tipo_equipamento = models.ForeignKey( TipoEquipamento, db_column='id_tipo_equipamento') modelo = models.ForeignKey(Modelo, db_column='id_modelo') nome = models.CharField(unique=True, max_length=50) maintenance = models.BooleanField(db_column='maintenance') grupos = models.ManyToManyField(EGrupo, through='EquipamentoGrupo') log = logging.getLogger('Equipamento') class Meta(BaseModel.Meta): db_table = u'equipamentos' managed = True def __str__(self): return self.nome def _get_groups(self): groups = self.grupos.all() return groups groups = property(_get_groups) def _get_environments(self): envs = self.equipamentoambiente_set.all() return envs environments = property(_get_environments) def _get_equipment_controller_environment(self): envs = self.equipmentcontrollerenvironment_set.all() return envs equipment_controller_environment = property( _get_equipment_controller_environment) def _get_ipv4_equipment(self): return self.ipequipamento_set.all() ipv4_equipment = \ property(_get_ipv4_equipment) def _get_ipv6_equipment(self): return self.ipv6equipament_set.all() ipv6_equipment = \ property(_get_ipv6_equipment) def _get_ipv4(self): ips = self.ipequipamento_set.all() ips = [ip.ip for ip in ips] return ips ipv4 = property(_get_ipv4) def _get_ipv6(self): ips = self.ipv6equipament_set.all() ips = [ip.ip for ip in ips] return ips ipv6 = property(_get_ipv6) def _get_asn(self): asn_bgp = self.asnequipment_set.all() if asn_bgp: return asn_bgp[0].asn return None asn = property(_get_asn) def _get_asn_id(self): asn_bgp = self.asnequipment_set.all() if asn_bgp: return asn_bgp[0].asn.id return None asn_id = property(_get_asn_id)
[docs] @classmethod def get_next_name_by_prefix(cls, prefix): try: names = Equipamento.objects.filter( nome__istartswith=prefix).values_list('nome', flat=True).distinct() if len(names) == 0: return '%s%d' % (prefix, 1) # obtem a lista somente com os números da parte numérica dos nomes start_value = len(prefix) values = [int(name[start_value:]) for name in names] # ordena a lista values.sort() # obtem o maior número last_value = values[len(values) - 1] # busca um número não utilizado entre 1 e o maior número da lista for i in range(1, last_value + 1): if i not in values: return '%s%d' % (prefix, i) # retorna o ultimo valor da lista + 1 return '%s%d' % (prefix, last_value + 1) except Exception, e: cls.log.error(u'Falha ao pesquisar os equipamentos.') raise EquipamentoError(e, u'Falha ao pesquisar os equipamentos.')
[docs] def create(self, authenticated_user, group_id): """Insere um novo Equipamento Se o grupo do equipamento, informado nos dados da requisição, for igual à “Equipamentos Orquestracao” (id = 1) então o tipo do equipamento deverá ser igual a “Servidor Virtual” (id = 10). @return: Nothing @raise InvalidGroupToEquipmentTypeError: Equipamento do grupo “Equipamentos Orquestração” somente poderá ser criado com tipo igual a “Servidor Virtual”. @raise EGrupoNotFoundError: Grupo não cadastrado. @raise GrupoError: Falha ao pesquisar o Grupo. @raise TipoEquipamentoNotFoundError: Tipo de equipamento nao cadastrado. @raise ModeloNotFoundError: Modelo nao cadastrado. @raise EquipamentoNameDuplicatedError: Nome do equipamento duplicado. @raise EquipamentoError: Falha ou inserir o equipamento. """ if self.nome is not None: self.nome = self.nome.upper() egroup = EGrupo.get_by_pk(group_id) if group_id == EGrupo.GRUPO_EQUIPAMENTO_ORQUESTRACAO and self.tipo_equipamento.id != TipoEquipamento.TIPO_EQUIPAMENTO_SERVIDOR_VIRTUAL: raise InvalidGroupToEquipmentTypeError( None, u'Equipamento do grupo “Equipamentos Orquestração” somente poderá ser criado com tipo igual a “Servidor Virtual”.') self.tipo_equipamento = TipoEquipamento().get_by_pk( self.tipo_equipamento.id) self.modelo = Modelo.get_by_pk(self.modelo.id) if self.maintenance is None: self.maintenance = False try: self.get_by_name(self.nome) raise EquipamentoNameDuplicatedError( None, u'Equipamento com nome duplicado.') except EquipamentoNotFoundError: self.log.debug('Equipamento com o mesmo nome não encontrado.') try: self.save() equipment_group = EquipamentoGrupo() equipment_group.egrupo = egroup equipment_group.equipamento = self equipment_group.save(authenticated_user) return equipment_group.id except Exception, e: self.log.error(u'Falha ao inserir o equipamento.') raise EquipamentoError(e, u'Falha ao inserir o equipamento.')
[docs] @classmethod def get_by_pk(cls, pk, *prefetch_list): """Get Equipament by id. @return: Equipament. @raise EquipamentoNotFoundError: Equipament is not registered. @raise EquipamentoError: Failed to search for the Equipament. @raise OperationalError: Lock wait timeout exceeded. """ try: query = Equipamento.objects.filter(id=pk) if prefetch_list: return query.prefetch_related(prefetch_list).uniqueResult() else: return query.uniqueResult() except ObjectDoesNotExist, e: raise EquipamentoNotFoundError( e, u'Dont there is a equipament by pk = %s.' % pk) except OperationalError, e: cls.log.error(u'Lock wait timeout exceeded.') raise OperationalError( e, u'Lock wait timeout exceeded; try restarting transaction') except Exception, e: cls.log.error(u'Failure to search the equipament.') raise EquipamentoError(e, u'Failure to search the equipament.')
[docs] def edit(self, user, nome, tipo_equip, modelo, maintenance=None): try: if maintenance is None: maintenance = self.maintenance self.modelo = modelo self.tipo_equipamento = tipo_equip self.nome = nome self.maintenance = maintenance self.save() except EquipamentoNameDuplicatedError, e: raise EquipamentoNameDuplicatedError(e.message) except Exception, e: self.log.error(u'Falha ao editar o equipamento.') raise EquipamentoError(e, u'Falha ao editar o equipamento.')
[docs] @classmethod def get_by_name(cls, name): try: return Equipamento.objects.get(nome__iexact=name) except ObjectDoesNotExist, e: raise EquipamentoNotFoundError( e, u'There is no equipment with the name = %s.' % name) except Exception, e: cls.log.error(u'Falha ao pesquisar o equipamento.') raise EquipamentoError(e, u'Falha ao pesquisar o equipamento.')
[docs] def search(self, equip_name=None, equip_type_id=None, environment_id=None, ugroups=None): try: equips = Equipamento.objects.all() if ugroups is not None: equips = equips.filter( grupos__direitosgrupoequipamento__ugrupo__in=ugroups, grupos__direitosgrupoequipamento__leitura='1') if equip_name is not None: equips = equips.filter(nome__iexact=equip_name) if equip_type_id is not None: equips = equips.filter(tipo_equipamento__id=equip_type_id) if environment_id is not None: equips = equips.filter( equipamentoambiente__ambiente__id=environment_id) return equips except Exception, e: self.log.error(u'Falha ao pesquisar os equipamentos.') raise EquipamentoError(e, u'Falha ao pesquisar os equipamentos.')
[docs] def delete(self): """Sobrescreve o metodo do Django para remover um equipamento. Antes de remover o equipamento remove todos os seus relacionamentos. """ from networkapi.ip.models import IpCantBeRemovedFromVip is_error = False ipv4_error = '' ipv6_error = '' for ip_equipment in self.ipequipamento_set.all(): try: ip = ip_equipment.ip ip_equipment.delete() except Exception, e: is_error = True ipv4_error += ' %s.%s.%s.%s - Vip %s ,' % ( ip.oct1, ip.oct2, ip.oct3, ip.oct4, e.cause) for ip_v6_equipment in self.ipv6equipament_set.all(): try: ip = ip_v6_equipment.ip ip_v6_equipment.delete() except Exception, e: is_error = True ipv6_error += ' %s:%s:%s:%s:%s:%s:%s:%s - Vip %s ,' % ( ip.block1, ip.block2, ip.block3, ip.block4, ip.block5, ip.block6, ip.block7, ip.block8, e.cause) if is_error: raise IpCantBeRemovedFromVip(ipv4_error, ipv6_error) for equipment_access in self.equipamentoacesso_set.all(): equipment_access.delete() for equipment_script in self.equipamentoroteiro_set.all(): equipment_script.delete() for interface in self.interface_set.all(): interface.delete() for equipment_environment in self.equipamentoambiente_set.all(): equipment_environment.delete() for equipment_group in self.equipamentogrupo_set.all(): equipment_group.delete() super(Equipamento, self).delete()
[docs] def remove(self, authenticated_user, equip_id): """Pesquisa e remove o equipamento. @return: Nothing @raise EquipamentoNotFoundError: Não existe um equipamento com equip_id . @raise EquipamentoError: Falha ao remover o equipamento. """ from networkapi.ip.models import IpCantBeRemovedFromVip equipment = self.get_by_pk(equip_id) try: equipment.delete() except IpCantBeRemovedFromVip, e: raise e except Exception, e: self.log.error(u'Falha ao remover um equipamento: %s' % e) raise EquipamentoError(e, u'Falha ao remover um equipamento.')
[docs] def delete_v3(self): """Before removing the computer it eliminates all your relationships. """ # ipv4 for ip_equipment in self.ipequipamento_set.all(): ip_equipment.delete_v3() # ipv6 for ip_v6_equipment in self.ipv6equipament_set.all(): ip_v6_equipment.delete_v3() for equipment_access in self.equipamentoacesso_set.all(): equipment_access.delete() for equipment_script in self.equipamentoroteiro_set.all(): equipment_script.delete() for interface in self.interface_set.all(): interface.delete() for equipment_environment in self.equipamentoambiente_set.all(): equipment_environment.delete() for equipment_group in self.equipamentogrupo_set.all(): equipment_group.delete() self.delete()
[docs] def create_v3(self, equipment): try: self.nome = equipment.get('name').upper() self.tipo_equipamento = TipoEquipamento()\ .get_by_pk(equipment.get('equipment_type')) self.modelo = Modelo.get_by_pk(equipment.get('model')) self.maintenance = equipment.get('maintenance', False) try: self.get_by_name(self.nome) except EquipamentoNotFoundError: pass else: msg = 'There is another equipment with same name {}' raise EquipmentInvalidValueException(msg.format(self.nome)) self.save() # groups for group in equipment.get('groups', []): eqpt_group = EquipamentoGrupo() eqpt_group.egrupo = EGrupo.get_by_pk(group.get('id')) eqpt_group.equipamento = self eqpt_group.create() # environments for environment in equipment.get('environments', []): eqpt_env = EquipamentoAmbiente() eqpt_env.ambiente = Ambiente.get_by_pk( environment.get('environment')) eqpt_env.equipamento = self eqpt_env.is_router = environment.get('is_router') eqpt_env.create() # ipv4s ipeqpt_model = get_model('ip', 'IpEquipamento') for ipv4 in equipment.get('ipv4', []): ipeqpt_model().create_v3({ 'equipment': self.id, 'ip': ipv4 }) # ipv6s ipeqpt_model = get_model('ip', 'Ipv6Equipament') for ipv6 in equipment.get('ipv6', []): ipeqpt_model().create_v3({ 'equipment': self.id, 'ip': ipv6 }) except EquipmentInvalidValueException, e: raise EquipmentInvalidValueException(e.detail) except AmbienteNotFoundError, e: raise EquipmentInvalidValueException(e.message) except EGrupoNotFoundError, e: raise EquipmentInvalidValueException(e.message) except Exception, e: raise EquipamentoError(None, e)
[docs] def update_v3(self, equipment): try: self.tipo_equipamento = TipoEquipamento().get_by_pk( equipment.get('equipment_type')) self.modelo = Modelo.get_by_pk(equipment.get('model')) self.maintenance = equipment.get('maintenance', False) if self.nome != equipment.get('name').upper(): self.nome = equipment.get('name').upper() try: self.get_by_name(self.nome) except EquipamentoNotFoundError: pass else: msg = 'There is another equipment with same name {}' raise EquipmentInvalidValueException(msg.format(self.nome)) self.save() # groups if equipment.get('groups'): groups_db = EquipamentoGrupo.get_by_equipment(self.id) groups_db_ids = groups_db.values_list('egrupo', flat=True) groups = equipment.get('groups') groups_ids = list() for group in groups: # insert relashionship with group if group.get('id') not in groups_db_ids: eqpt_group = EquipamentoGrupo() eqpt_group.egrupo = EGrupo.get_by_pk(group.get('id')) eqpt_group.equipamento = self eqpt_group.create() groups_ids.append(group.get('id')) # delete relashionship with groups not sended groups_db_ids_old = list(set(groups_db_ids) - set(groups_ids)) groups_db.filter(egrupo__in=groups_db_ids_old).delete() # environments if equipment.get('environments'): env_db = EquipamentoAmbiente.get_by_equipment(self.id) env_db_ids = list(env_db.values_list('ambiente', flat=True)) env_ids = list() for environment in equipment.get('environments'): env_id = environment.get('environment') if env_id not in env_db_ids: # insert new relashionship with environment eqpt_env = EquipamentoAmbiente() eqpt_env.ambiente = Ambiente.get_by_pk(env_id) eqpt_env.equipamento = self eqpt_env.is_router = environment.get('is_router') eqpt_env.create() else: # update relashionship with environment env_current = env_db[env_db_ids.index(env_id)] env_current.is_router = environment.get('is_router') env_current.save() env_ids.append(env_id) # delete relashionship with environment not sended env_db_ids_old = list(set(env_db_ids) - set(env_ids)) env_db.filter(ambiente__in=env_db_ids_old).delete() # ipv4s if equipment.get('ipv4'): ipeqpt_model = get_model('ip', 'IpEquipamento') ips_db = ipeqpt_model.list_by_equip(self.id) ips_db_ids = ips_db.values_list('ip', flat=True) ipv4_ids = equipment.get('ipv4') for ipv4 in ipv4_ids: # insert new relashionship with ipv4 if ipv4 not in ips_db_ids: ipeqpt_model().create_v3({ 'equipment': self.id, 'ip': ipv4 }) # delete relashionship with ipv4 not sended ips_db_ids_old = list(set(ips_db_ids) - set(ipv4_ids)) ips_db.filter(ip__in=ips_db_ids_old).delete() # ipv6s if equipment.get('ipv6'): ipeqpt_model = get_model('ip', 'Ipv6Equipament') ipv6s_db = ipeqpt_model.list_by_equip(self.id) ipv6s_db_ids = ipv6s_db.values_list('ip', flat=True) ipv6_ids = equipment.get('ipv6') for ipv6 in ipv6_ids: # insert new relashionship with ipv6 if ipv6 not in ipv6s_db_ids: ipeqpt_model().create_v3({ 'equipment': self.id, 'ip': ipv6 }) # delete relashionship with ipv6 not sended ipv6s_db_ids_old = list(set(ipv6s_db_ids) - set(ipv6_ids)) ipv6s_db.filter(ip__in=ipv6s_db_ids_old).delete() except EquipmentInvalidValueException, e: raise EquipmentInvalidValueException(e.detail) except AmbienteNotFoundError, e: raise EquipmentInvalidValueException(e.message) except EGrupoNotFoundError, e: raise EquipmentInvalidValueException(e.message) except Exception, e: raise EquipamentoError(None, e)
[docs] def delete_v4(self): """Before removing the computer it eliminates all your relationships. """ # ipv4 for ip_equipment in self.ipequipamento_set.all(): ip_equipment.delete_v3() # ipv6 for ip_v6_equipment in self.ipv6equipament_set.all(): ip_v6_equipment.delete_v3() for equipment_access in self.equipamentoacesso_set.all(): equipment_access.delete() for equipment_script in self.equipamentoroteiro_set.all(): equipment_script.delete() for interface in self.interface_set.all(): interface.delete() for equipment_environment in self.equipamentoambiente_set.all(): equipment_environment.delete() for equipment_group in self.equipamentogrupo_set.all(): equipment_group.delete() for as_equipment in self.asnequipment_set.all(): as_equipment.delete() self.delete()
[docs] def create_v4(self, equipment): try: self.nome = equipment.get('name').upper() self.tipo_equipamento = TipoEquipamento()\ .get_by_pk(equipment.get('equipment_type')) self.modelo = Modelo.get_by_pk(equipment.get('model')) self.maintenance = equipment.get('maintenance', False) try: self.get_by_name(self.nome) except EquipamentoNotFoundError: pass else: msg = 'There is another equipment with same name {}' raise EquipmentInvalidValueException(msg.format(self.nome)) self.save() # groups for group in equipment.get('groups', []): eqpt_group = EquipamentoGrupo() eqpt_group.egrupo = EGrupo.get_by_pk(group.get('id')) eqpt_group.equipamento = self eqpt_group.create() # environments for environment in equipment.get('environments', []): eqpt_env = EquipamentoAmbiente() eqpt_env.ambiente = Ambiente.get_by_pk( environment.get('environment')) eqpt_env.equipamento = self eqpt_env.is_router = environment.get('is_router') eqpt_env.create() # ipv4s ipeqpt_model = get_model('ip', 'IpEquipamento') for ipv4 in equipment.get('ipsv4', []): ipeqpt_model().create_v3({ 'equipment': self.id, 'ip': ipv4 }) # ipv6s ipeqpt_model = get_model('ip', 'Ipv6Equipament') for ipv6 in equipment.get('ipsv6', []): ipeqpt_model().create_v3({ 'equipment': self.id, 'ip': ipv6 }) # as asneqpt_model = get_model('api_asn', 'AsnEquipment') if equipment.get('asn'): asneqpt_model().create_v4({ 'equipment': self.id, 'asn': equipment.get('asn') }) # controller environments for environment in equipment.get('sdn_controlled_environment', []): eqpt_env = EquipmentControllerEnvironment() env_id = environment.get('environment') eqpt_env.create({ 'equipment': self.id, 'environment': env_id }) except EquipmentInvalidValueException, e: raise EquipmentInvalidValueException(e.detail) except AmbienteNotFoundError, e: raise EquipmentInvalidValueException(e.message) except EGrupoNotFoundError, e: raise EquipmentInvalidValueException(e.message) except AsnNotFoundError, e: raise EquipmentInvalidValueException(e.detail) except Exception, e: raise EquipamentoError(None, e)
[docs] def update_v4(self, equipment): try: self.tipo_equipamento = TipoEquipamento().get_by_pk( equipment.get('equipment_type')) self.modelo = Modelo.get_by_pk(equipment.get('model')) self.maintenance = equipment.get('maintenance', False) if self.nome != equipment.get('name').upper(): self.nome = equipment.get('name').upper() try: self.get_by_name(self.nome) except EquipamentoNotFoundError: pass else: msg = 'There is another equipment with same name {}' raise EquipmentInvalidValueException(msg.format(self.nome)) self.save() # groups if equipment.get('groups') is not None: groups_db = EquipamentoGrupo.get_by_equipment(self.id) groups_db_ids = groups_db.values_list('egrupo', flat=True) groups = equipment.get('groups') groups_ids = list() for group in groups: # insert relashionship with group if group.get('id') not in groups_db_ids: eqpt_group = EquipamentoGrupo() eqpt_group.egrupo = EGrupo.get_by_pk(group.get('id')) eqpt_group.equipamento = self eqpt_group.create() groups_ids.append(group.get('id')) # delete relashionship with groups not sended groups_db_ids_old = list(set(groups_db_ids) - set(groups_ids)) groups_db.filter(egrupo__in=groups_db_ids_old).delete() # environments if equipment.get('environments') is not None: env_db = EquipamentoAmbiente.get_by_equipment(self.id) env_db_ids = list(env_db.values_list('ambiente', flat=True)) env_ids = list() for environment in equipment.get('environments'): env_id = environment.get('environment') if env_id not in env_db_ids: # insert new relashionship with environment eqpt_env = EquipamentoAmbiente() eqpt_env.ambiente = Ambiente.get_by_pk(env_id) eqpt_env.equipamento = self eqpt_env.is_router = environment.get('is_router') eqpt_env.create() else: # update relashionship with environment env_current = env_db[env_db_ids.index(env_id)] env_current.is_router = environment.get('is_router') env_current.save() env_ids.append(env_id) # delete relashionship with environment not sended env_db_ids_old = list(set(env_db_ids) - set(env_ids)) env_db.filter(ambiente__in=env_db_ids_old).delete() # ipv4s if equipment.get('ipsv4') is not None: ipeqpt_model = get_model('ip', 'IpEquipamento') ips_db = ipeqpt_model.list_by_equip(self.id) ips_db_ids = ips_db.values_list('ip', flat=True) ipv4_ids = equipment.get('ipsv4') for ipv4 in ipv4_ids: # insert new relashionship with ipv4 if ipv4 not in ips_db_ids: ipeqpt_model().create_v3({ 'equipment': self.id, 'ip': ipv4 }) # delete relashionship with ipv4 not sended ips_db_ids_old = list(set(ips_db_ids) - set(ipv4_ids)) ips_db.filter(ip__in=ips_db_ids_old).delete() # ipv6s if equipment.get('ipsv6') is not None: ipeqpt_model = get_model('ip', 'Ipv6Equipament') ipv6s_db = ipeqpt_model.list_by_equip(self.id) ipv6s_db_ids = ipv6s_db.values_list('ip', flat=True) ipv6_ids = equipment.get('ipsv6') for ipv6 in ipv6_ids: # insert new relashionship with ipv6 if ipv6 not in ipv6s_db_ids: ipeqpt_model().create_v3({ 'equipment': self.id, 'ip': ipv6 }) # delete relashionship with ipv6 not sended ipv6s_db_ids_old = list(set(ipv6s_db_ids) - set(ipv6_ids)) ipv6s_db.filter(ip__in=ipv6s_db_ids_old).delete() # asn if equipment.get('asn') is not None: asneqpt_model = get_model('api_asn', 'AsnEquipment') # delete old AsnEquipment association for asneqpt in self.asnequipment_set.all(): asneqpt.delete() # create new AsnEquipment association asneqpt_model().create_v4({ 'equipment': self.id, 'asn': equipment.get('asn') }) # controlled environment if equipment.get('sdn_controlled_environment') is not None: env_db = EquipmentControllerEnvironment.get_by_equipment( self.id) env_db_ids = list(env_db.values_list('environment', flat=True)) env_ids = list() for environment in equipment.get('sdn_controlled_environment'): env_id = environment.get('environment') if env_id not in env_db_ids: # insert new relashionship with environment eqpt_env = EquipmentControllerEnvironment() eqpt_env.create({ 'equipment': self.id, 'environment': env_id }) else: # update relashionship with environment env_current = env_db[env_db_ids.index(env_id)] env_current.save() env_ids.append(env_id) # delete relashionship with environment not sended env_db_ids_old = list(set(env_db_ids) - set(env_ids)) env_db.filter(environment__in=env_db_ids_old).delete() except EquipmentInvalidValueException, e: raise EquipmentInvalidValueException(e.detail) except AmbienteNotFoundError, e: raise EquipmentInvalidValueException(e.message) except EGrupoNotFoundError, e: raise EquipmentInvalidValueException(e.message) except AsnNotFoundError, e: raise EquipmentInvalidValueException(e.detail) except Exception, e: raise EquipamentoError(None, e)
[docs]class EquipamentoAmbiente(BaseModel): id = models.AutoField(primary_key=True, db_column='id_equip_do_ambiente') ambiente = models.ForeignKey(Ambiente, db_column='id_ambiente') equipamento = models.ForeignKey(Equipamento, db_column='id_equip') is_router = models.BooleanField(db_column='is_router') log = logging.getLogger('EquipamentoAmbiente') class Meta(BaseModel.Meta): db_table = u'equip_do_ambiente' managed = True unique_together = ('equipamento', 'ambiente')
[docs] def create(self, authenticated_user=None): """Insere uma nova associação entre um Equipamento e um Ambiente. @return: Nothing @raise AmbienteNotFoundError: Ambiente não cadastrado. @raise EquipamentoAmbienteDuplicatedError: Equipamento já está cadastrado no Ambiente. @raise EquipamentoError: Falha ao inserir a associação Equipamento e Ambiente. """ self.ambiente = Ambiente().get_by_pk(self.ambiente.id) self.equipamento = Equipamento().get_by_pk(self.equipamento.id) try: EquipamentoAmbiente().get_by_equipment_environment( self.equipamento.id, self.ambiente.id) raise EquipamentoAmbienteDuplicatedError( None, u'Equipamento já está cadastrado no ambiente.') except EquipamentoAmbienteNotFoundError: pass try: self.save() except Exception, e: self.log.error(u'Falha ao inserir a associação equipamento/ambiente: %s/%s.' % (self.equipamento.id, self.ambiente.id)) raise EquipamentoError( e, u'Falha ao inserir a associação equipamento/ambiente: %s/%s.' % (self.equipamento.id, self.ambiente.id))
[docs] def get_by_equipment_environment(self, equipment_id, environment_id): try: return EquipamentoAmbiente.objects.get(ambiente__id=environment_id, equipamento__id=equipment_id) except ObjectDoesNotExist, e: raise EquipamentoAmbienteNotFoundError( e, u'Não existe um equipamento_ambiente com o equipamento = %s e o ambiente = %s.' % (equipment_id, environment_id)) except Exception, e: self.log.error(u'Falha ao pesquisar o equipamento-ambiente.') raise EquipamentoError( e, u'Falha ao pesquisar o equipamento-ambiente.')
[docs] def get_by_environment(self, environment_id): try: return EquipamentoAmbiente.objects.get(ambiente__id=environment_id) except ObjectDoesNotExist, e: raise EquipamentoAmbienteNotFoundError( e, u'Não existe um equipamento_ambiente com o ambiente = %s.' % (environment_id)) except Exception, e: self.log.error(u'Falha ao pesquisar o equipamento-ambiente.') raise EquipamentoError( e, u'Falha ao pesquisar o equipamento-ambiente.')
[docs] @classmethod def get_by_equipment(cls, equipment_id): try: return EquipamentoAmbiente.objects.filter(equipamento__id=equipment_id) except ObjectDoesNotExist, e: raise EquipamentoAmbienteNotFoundError( e, u'Não existe um equipamento_ambiente com o equipamento = %s.' % equipment_id) except Exception, e: cls.log.error(u'Falha ao pesquisar o equipamento-ambiente.') raise EquipamentoError( e, u'Falha ao pesquisar o equipamento-ambiente.')
[docs] @classmethod def remove(cls, authenticated_user, equip_id, environ_id): """Pesquisa e remove uma associação entre um Equipamento e um Ambiente. @return: Nothing @raise EquipamentoAmbienteNotFoundError: Não existe associação entre o equipamento e o ambiente. @raise EquipamentoError: Falha ao remover uma associação entre um Equipamento e um Ambiente. """ try: equipenvironment = EquipamentoAmbiente.objects.get( equipamento__id=equip_id, ambiente__id=environ_id) equipenvironment.delete() except ObjectDoesNotExist, n: cls.log.error(u'Não existe um equipamento_ambiente com o equipamento = %s e o ambiente = %s.' % ( equip_id, environ_id)) raise EquipamentoAmbienteNotFoundError( n, u'Não existe um equipamento_ambiente com o equipamento = %s e o ambiente = %s.' % (equip_id, environ_id)) except Exception, e: cls.log.error( u'Falha ao remover uma associação entre um Equipamento e um Ambiente.') raise EquipamentoError( e, u'Falha ao remover uma associação entre um Equipamento e um Ambiente.')
[docs] @classmethod def get_routers_by_environment(cls, environment_id): return EquipamentoAmbiente.objects.select_related('equipamento')\ .filter(ambiente=environment_id, is_router=True)
[docs] def create_v3(self, eqpt_env_map): """ Insert a new relashionship between an equipment and an environment. @return: Nothing @raise AmbienteNotFoundError: Environment not registered. @raise EquipamentoAmbienteDuplicatedError: Equipment already registered in environment. @raise EquipamentoError: Failure to insert the relashionship between equipment and environment. """ self.ambiente = Ambiente()\ .get_by_pk(eqpt_env_map.get('environment')) self.equipamento = Equipamento()\ .get_by_pk(eqpt_env_map.get('equipment')) try: EquipamentoAmbiente().get_by_equipment_environment( self.equipamento.id, self.ambiente.id) raise EquipamentoAmbienteDuplicatedError( None, u'Equipment already registered in environment.') except EquipamentoAmbienteNotFoundError: pass try: self.save() except Exception, e: msg = u'Failure to insert the relashionship between ' \ 'equipment and environment. %s/%s.' % \ (self.equipamento.id, self.ambiente.id) self.log.error(msg) raise EquipamentoError(e, msg)
[docs]class EquipmentControllerEnvironment(BaseModel): id = models.AutoField(primary_key=True, db_column='id') environment = models.ForeignKey( Ambiente, db_column='id_environment' ) equipment = models.ForeignKey( Equipamento, db_column='id_equipment' ) log = logging.getLogger('EquipmentControllerEnvironment') class Meta(BaseModel.Meta): db_table = u'equipment_controller_environment' managed = True unique_together = ('equipment', 'environment')
[docs] def get_by_equipment_environment(self, equipment_id, environment_id): try: eqpt = EquipmentControllerEnvironment.objects.get( environment__id=environment_id, equipment__id=equipment_id ) return eqpt except ObjectDoesNotExist, e: raise EquipmentControllerEnvironmentNotFoundError( e, u'Não existe um equipment_environment com o equipment = %s e o environment = %s.' % (equipment_id, environment_id)) except Exception, e: self.log.error(u'Falha ao pesquisar o equipment-environment.') raise EquipamentoError( e, u'Falha ao pesquisar o equipment-environment.')
[docs] def get_by_environment(self, environment_id): try: return EquipmentControllerEnvironment.objects.get(environment__id=environment_id) except ObjectDoesNotExist, e: raise EquipmentControllerEnvironmentNotFoundError( e, u'Não existe um environment com o environment = %s.' % (environment_id)) except Exception, e: self.log.error(u'Falha ao pesquisar o equipment-environment.') raise EquipamentoError( e, u'Falha ao pesquisar o equipment-environment.')
[docs] @classmethod def get_by_equipment(cls, equipment_id): try: return EquipmentControllerEnvironment.objects.filter(equipment__id=equipment_id) except ObjectDoesNotExist, e: raise EquipmentControllerEnvironmentNotFoundError( e, u'Não existe um environment com o equipment = %s.' % equipment_id) except Exception, e: cls.log.error(u'Falha ao pesquisar o equipment-environment.') raise EquipamentoError( e, u'Falha ao pesquisar o equipment-environment.')
[docs] def create(self, eqpt_env_map): """ Insert a new relashionship between an equipment and an environment. @return: Nothing @raise AmbienteNotFoundError: Environment not registered. @raise EquipmentControllerEnvironmentDuplicatedError: Equipment already registered in environment. @raise EquipamentoError: Failure to insert the relashionship between equipment and environment. """ self.environment = Ambiente()\ .get_by_pk(eqpt_env_map.get('environment')) self.equipment = Equipamento()\ .get_by_pk(eqpt_env_map.get('equipment')) try: EquipmentControllerEnvironment().get_by_equipment_environment( self.equipment.id, self.environment.id) raise EquipmentControllerEnvironmentDuplicatedError( None, u'Equipment already registered in environment.') except EquipmentControllerEnvironmentNotFoundError: pass try: self.save() except Exception, e: msg = u'Failure to insert the relashionship between ' \ 'equipment and environment. %s/%s.' % \ (self.equipment.id, self.environment.id) self.log.error(msg) raise EquipamentoError(e, msg)
[docs]class EquipamentoGrupo(BaseModel): id = models.AutoField(primary_key=True, db_column='id_equip_do_grupo') egrupo = models.ForeignKey(EGrupo, db_column='id_egrupo') equipamento = models.ForeignKey(Equipamento, db_column='id_equip') log = logging.getLogger('EquipamentoGrupo') class Meta(BaseModel.Meta): db_table = u'equip_do_grupo' managed = True unique_together = ('egrupo', 'equipamento')
[docs] def create(self, authenticated_user=None): """Insere uma nova associação entre um Equipamento e um Grupo. @return: Nothing @raise EGrupoNotFoundError: Grupo não cadastrado. @raise GrupoError: Falha ao pesquisar o grupo do equipamento. @raise EquipamentoGrupoDuplicatedError: Equipamento já está cadastrado no grupo @raise EquipamentoError: Falha ao inserir o equipamento no grupo. """ self.egrupo = EGrupo.get_by_pk(self.egrupo.id) self.equipamento = Equipamento().get_by_pk(self.equipamento.id) try: self.get_by_equipment_group(self.equipamento.id, self.egrupo.id) raise EquipamentoGrupoDuplicatedError( None, u'Equipamento já está cadastrado no grupo.') except EquipamentoGrupoNotFoundError: pass try: self.save() except Exception, e: self.log.error(u'Falha ao inserir a associação equipamento/grupo: %d/%d.' % (self.equipamento.id, self.egrupo.id)) raise EquipamentoError( e, u'Falha ao inserir a associação equipamento/grupo: %d/%d.' % (self.equipamento.id, self.egrupo.id))
[docs] @classmethod def get_by_equipment(cls, equipment_id): try: return EquipamentoGrupo.objects.filter(equipamento__id=equipment_id) except ObjectDoesNotExist, e: raise EquipamentoGrupoNotFoundError( e, u'Não existe um equipamento_grupo com o equipamento = %s ' % (equipment_id)) except Exception, e: cls.log.error(u'Falha ao pesquisar o equipamento-grupo.') raise EquipamentoError( e, u'Falha ao pesquisar o equipamento-grupo.')
[docs] def get_by_equipment_group(self, equipment_id, egroup_id): try: return EquipamentoGrupo.objects.get(egrupo__id=egroup_id, equipamento__id=equipment_id) except ObjectDoesNotExist, e: raise EquipamentoGrupoNotFoundError( e, u'Não existe um equipamento_grupo com o equipamento = %s e o grupo = %s.' % (equipment_id, egroup_id)) except Exception, e: self.log.error(u'Falha ao pesquisar o equipamento-grupo.') raise EquipamentoError( e, u'Falha ao pesquisar o equipamento-grupo.')
[docs] @classmethod def remove(cls, authenticated_user, equip_id, egroup_id): """Pesquisa e remove uma associação entre um Equipamento e um Grupo. @return: Nothing @raise EquipamentoGrupoNotFoundError: Associação entre o equipamento e o grupo não cadastrada. @raise EquipamentoError: Falha ao remover uma associação entre um Equipamento e um Grupo. """ equip_group = EquipamentoGrupo().get_by_equipment_group( equip_id, egroup_id) equipments = EquipamentoGrupo.get_by_equipment(equip_id) if len(equipments) > 1: try: equip_group.delete() except Exception, e: cls.log.error( u'Falha ao remover uma associação entre um Equipamento e um Grupo.') raise EquipamentoError( e, u'Falha ao remover uma associação entre um Equipamento e um Grupo.') else: raise EquipmentDontRemoveError( u'Failure to remove an association between an equipment and a group because the group is related only to a group.')
[docs]class EquipamentoAcesso(BaseModel): id = models.AutoField(primary_key=True, db_column='id_equiptos_access') equipamento = models.ForeignKey(Equipamento, db_column='id_equip') fqdn = models.CharField(max_length=100) user = models.CharField(max_length=20) # Field renamed because it was a Python reserved word. Field name made # lowercase. password = models.CharField(max_length=20, db_column='pass') tipo_acesso = models.ForeignKey(TipoAcesso, db_column='id_tipo_acesso') enable_pass = models.CharField(max_length=20, blank=True) log = logging.getLogger('EquipamentoAcesso') class Meta(BaseModel.Meta): db_table = u'equiptos_access' managed = True unique_together = ('equipamento', 'tipo_acesso')
[docs] @classmethod def get_by_pk(cls, id): """Get EquipamentoAcesso by id. @return: EquipamentoAcesso. @raise EquipamentoAccessNotFoundError: EquipamentoAcesso is not registered. @raise VlanError: Failed to search for the EquipamentoAcesso. @raise OperationalError: Lock wait timeout exceed """ try: return EquipamentoAcesso.objects.filter(id=id).uniqueResult() except ObjectDoesNotExist, e: raise EquipamentoAccessNotFoundError( e, u'Dont there is a EquipamentoAcesso by pk = %s.' % id) except OperationalError, e: cls.log.error(u'Lock wait timeout exceeded.') raise OperationalError( e, u'Lock wait timeout exceeded; try restarting transaction') except Exception, e: cls.log.error(u'Failure to search the EquipamentoAcesso.') raise EquipamentoError( e, u'Failure to search the EquipamentoAcesso.')
[docs] @classmethod def search(cls, ugroups=None, equipamento=None, protocolo=None): """Efetua a pesquisa das informações de acesso a equipamentos @return: Um queryset contendo as informações de aceso a equipamentos cadastrados @raise EquipamentoError: Falha ao pesquisar as informações de acesso a equipamentos. """ try: results = EquipamentoAcesso.objects.all() if ugroups is not None: results = results.filter( equipamento__grupos__direitosgrupoequipamento__ugrupo__in=ugroups, equipamento__grupos__direitosgrupoequipamento__escrita='1') if equipamento is not None: results = results.filter(equipamento=equipamento) if protocolo is not None: results = results.filter(tipo_acesso__protocolo=protocolo) return results except Exception, e: cls.log.error( u'Falha ao pesquisar as informações de acesso a equipamentos.') raise EquipamentoError( e, u'Falha ao pesquisar oas informações de acesso a equipamentos.')
[docs] def create(self, authenticated_user): """Efetua a inclusão de informações de acesso a equipamentos @return: Instância da informação de acesso a equipamento incluída @raise Equipamento.DoesNotExist: Equipamento informado é inexistente @raise TipoAcesso.DoesNotExist: Tipo de acesso informado é inexistente @raise EquipamentoAccessDuplicatedError: Já existe cadastrada a associação de equipamento e tipo de acesso informada @raise EquipamentoError: Falha ao incluir informações de acesso a equipamentos. """ # Valida a existência do equipamento self.equipamento = Equipamento.get_by_pk(self.equipamento.id) try: # Valida a existência do tipo de acesso self.tipo_acesso = TipoAcesso.objects.get(id=self.tipo_acesso.id) # Verifica a existência de uma associação de equipamento e tipo de acesso igual à que está # sendo incluída if EquipamentoAcesso.objects.filter(equipamento=self.equipamento, tipo_acesso=self.tipo_acesso).count() > 0: raise EquipamentoAccessDuplicatedError( None, u'Já existe esta associação de equipamento e tipo de acesso cadastrada.') # Persiste a informação return self.save() except TipoAcesso.DoesNotExist, e: raise e except EquipamentoAccessDuplicatedError, e: raise e except Exception, e: self.log.error( u'Falha ao inserir informação de acesso a equipamento.') raise EquipamentoError( e, u'Falha ao inserir informação de acesso a equipamento.')
[docs] @classmethod def update(cls, authenticated_user, id_equipamento, id_tipo_acesso, **kwargs): """Efetua a alteração de informações de acesso a equipamentos conforme argumentos recebidos @param id_equipamento: Identificador do equipamento da informação de acesso a equipamento a ser alterada @param id_tipo_acesso: Identificador do tipo de acesso da informação de acesso a equipamento a ser alterada @return: Instância da informação de acesso a equipamento alterada @raise EquipamentoAcesso.DoesNotExist: Informação de acesso a equipamento informada é inexistente @raise EquipamentoError: Falha ao alterar informação de acesso a equipamento. """ try: # Obtém a informação de acesso a equipamento a ser alterada equipamento_acesso = EquipamentoAcesso.objects.get( equipamento__id=id_equipamento, tipo_acesso__id=id_tipo_acesso) # Bind dos valores recebidos para o objeto a ser alterado equipamento_acesso.__dict__.update(kwargs) # Persiste a informação return equipamento_acesso.save(authenticated_user) except EquipamentoAcesso.DoesNotExist, e: raise e except Exception, e: cls.log.error( u'Falha ao alterar informação de acesso a equipamento.') raise EquipamentoError( e, u'Falha ao alterar informação de acesso a equipamento.')
[docs] @classmethod def remove(cls, authenticated_user, id_equipamento, id_tipo_acesso): """Efetua a remoção de um tipo de acesso @param id_equipamento: Identificador do equipamento da informação de acesso a equipamento a ser excluída @param id_tipo_acesso: Identificador do tipo de acesso da informação de acesso a equipamento a ser excluída @return: nothing @raise EquipamentoAcesso.DoesNotExist: Informação de acesso a equipamento informada é inexistente @raise EquipamentoError: Falha ao alterar informação de acesso a equipamento. """ try: # Obtém a informação de acesso a equipamento a ser excluída equipamento_acesso = EquipamentoAcesso.objects.get( equipamento__id=id_equipamento, tipo_acesso__id=id_tipo_acesso) return equipamento_acesso.delete() except EquipamentoAcesso.DoesNotExist, e: raise e except Exception, e: EquipamentoAcesso.log.error( u'Falha ao excluir informação de acesso a equipamento.') raise EquipamentoError( e, u'Falha ao excluir informação de acesso a equipamento.')
[docs]class EquipamentoRoteiro(BaseModel): id = models.AutoField(primary_key=True, db_column='id_equiptos_roteiros') equipamento = models.ForeignKey(Equipamento, db_column='id_equip') roteiro = models.ForeignKey(Roteiro, db_column='id_roteiros') log = logging.getLogger('EquipamentoRoteiro') class Meta(BaseModel.Meta): db_table = u'equiptos_roteiros' managed = True unique_together = ('equipamento', 'roteiro')
[docs] @classmethod def search(cls, ugroups=None, equip_id=None, roteiro_type=None): try: er = EquipamentoRoteiro.objects.all() if ugroups is not None: er = er.filter(equipamento__grupos__direitosgrupoequipamento__ugrupo__in=ugroups, equipamento__grupos__direitosgrupoequipamento__leitura='1') if equip_id is not None: er = er.filter(equipamento__id=equip_id) if roteiro_type is not None: er = er.filter(roteiro__tipo_roteiro__tipo=roteiro_type) return er except Exception, e: cls.log.error( u'Falha ao pesquisar os equipamentos e roteiros associados.') raise EquipamentoError( e, u'Falha ao pesquisar os equipamentos e roteiros associados.')
[docs] def create(self, authenticated_user): """Insere uma nova associação entre um Equipamento e um Roteiro. @return: Nothing @raise RoteiroNotFoundError: Roteiro não cadastrado. @raise RoteiroError: Falha ao pesquisar o roteiro. @raise EquipamentoRoteiroDuplicatedError: Equipamento já está associado ao roteiro. @raise EquipamentoError: Falha ao inserir o equipamento no roteiro. """ self.equipamento = Equipamento().get_by_pk(self.equipamento.id) self.roteiro = Roteiro.get_by_pk(self.roteiro.id) try: try: EquipamentoRoteiro.objects.get( equipamento__id=self.equipamento.id, roteiro__id=self.roteiro.id) raise EquipamentoRoteiroDuplicatedError( None, u'Equipamento já está associado ao roteiro.') except ObjectDoesNotExist: pass self.save() except EquipamentoRoteiroDuplicatedError, e: raise e except Exception, e: self.log.error(u'Falha ao inserir a associação equipamento/roteiro: %s/%s.' % (self.equipamento.id, self.roteiro.id)) raise EquipamentoError( e, u'Falha ao inserir a associação equipamento/roteiro: %s/%s.' % (self.equipamento.id, self.roteiro.id))
[docs] @classmethod def remove(cls, authenticated_user, equip_id, script_id): """Pesquisa e remove uma associação entre um Equipamento e um Roteiro. @return: Nothing @raise EquipamentoRoteiroNotFoundError: Não existe associação entre o equipamento e o roteiro. @raise EquipamentoError: Falha ao remover uma associação entre um Equipamento e um Roteiro. """ try: equip_script = EquipamentoRoteiro.objects.get( equipamento__id=equip_id, roteiro__id=script_id) equip_script.delete() except EquipamentoRoteiro.DoesNotExist, n: cls.log.debug(u'Não existe um equipamento_roteiro com o equipamento = %s e o roteiro = %s.' % ( equip_id, script_id)) raise EquipamentoRoteiroNotFoundError( n, u'Não existe um equipamento_roteiro com o equipamento = %s e o roteiro = %s.' % (equip_id, script_id)) except Exception, e: cls.log.error( u'Falha ao remover uma associação entre um Equipamento e um Roteiro.') raise EquipamentoError( e, u'Falha ao remover uma associação entre um Equipamento e um Roteiro.')
[docs]class ModeloRoteiro(BaseModel): id = models.AutoField(primary_key=True, db_column='id_modelo_roteiro') modelo = models.ForeignKey(Modelo, db_column='id_modelo') roteiro = models.ForeignKey(Roteiro, db_column='id_roteiro') log = logging.getLogger('ModeloRoteiro') class Meta(BaseModel.Meta): db_table = u'modelo_roteiro' managed = True unique_together = ('modelo', 'roteiro')
[docs] def create(self, authenticated_user): """ Insere uma nova associação entre um Modelo e um Roteiro. @return: Nothing @raise RoteiroNotFoundError: Roteiro não cadastrado. @raise RoteiroError: Falha ao pesquisar o roteiro. @raise ModeloRoteiroDuplicatedError: Equipamento já está associado ao roteiro. @raise ModeloError: Falha ao inserir o modelo no roteiro. """ self.modelo = Modelo().get_by_pk(self.modelo.id) self.roteiro = Roteiro.get_by_pk(self.roteiro.id) try: try: roteiros = ModeloRoteiro.objects.filter( modelo__id=self.modelo.id) for rot in roteiros: if rot.roteiro.id == self.roteiro.id: raise ModeloRoteiroDuplicatedError( None, u'Modelo id %s já está associado a um roteiro.' % str(self.modelo.id)) except ObjectDoesNotExist: pass self.save() except ModeloRoteiroDuplicatedError, e: raise e except Exception, e: self.log.error(u'Falha ao inserir a associação modelo/roteiro: %s/%s. %s' % (self.modelo.id, self.roteiro.id, e)) raise EquipamentoError( e, u'Falha ao inserir a associação modelo/roteiro: %s/%s.' % (self.modelo.id, self.roteiro.id))
[docs] @classmethod def get_by_pk(cls, idt): try: return ModeloRoteiro.objects.filter(id=idt).uniqueResult() except ObjectDoesNotExist, e: raise ObjectDoesNotExist( e, u'Dont there is a object by pk = %s.' % idt) except Exception, e: cls.log.error(u'Failure to search the object.') raise EquipamentoError(e, u'Failure to search object.')
[docs] @classmethod def remover(cls, authenticated_user, model_id, script_id): try: model_script = ModeloRoteiro.objects.get( modelo__id=model_id, roteiro__id=script_id) model_script.delete() except ObjectDoesNotExist, n: cls.log.debug(u'Não existe um modelo_roteiro com o modelo = %s e o roteiro = %s.' % ( model_id, script_id)) raise ObjectDoesNotExist( n, u'Não existe um modelo_roteiro com o modelo = %s e o roteiro = %s.' % (model_id, script_id)) except Exception, e: cls.log.error( u'Falha ao remover uma associação entre um Modelo e um Roteiro.') raise EquipamentoError( e, u'Falha ao remover uma associação entre um Modelo e um Roteiro.')