def execute_networkports(changeplan): changed_networkports = NetworkPort.objects.filter(version=changeplan) for changed_networkport in changed_networkports: try: live = ChangePlan.objects.get(id=0) live_networkport = versioned_object(changed_networkport, live, NetworkPort.IDENTITY_FIELDS) if live_networkport is None: live_asset = add_asset(changed_networkport.asset, live) NetworkPort.objects.create( asset=live_asset, label=changed_networkport.label, mac_address=changed_networkport.mac_address, connection=add_network_conn(changed_networkport.connection, live), version=live ) else: live_networkport.label = changed_networkport.label live_networkport.mac_address = changed_networkport.mac_address if changed_networkport.connection: live_networkport.connection = add_network_conn(changed_networkport.connection, live) else: live_networkport.connection = None live_networkport.save() except Exception as e: pass
def loop_ports(old_asset, recurse): for port in old_asset.networkport_set.all(): old_port = NetworkPort.objects.get(id=port.id) other = old_port.connection port = add_network_conn(port, change_plan) if other: if recurse: loop_ports(other.asset, False) other = add_network_conn(other, change_plan) other.connection = port port.connection = other other.save() port.save()
def after_import_row(self, row, row_result, **kwargs): if row_result.import_type == 'skip': return try: port = NetworkPort.objects.get(id=row_result.object_id) except: return if (row['dest_hostname'] == '' and row['dest_port'] != '') or (row['dest_hostname'] != '' and row['dest_port'] == ''): raise ValidationError("These fields must both be empty or set") if row['dest_hostname'] != '' and row['dest_port'] != '': dest_conn = newest_object(NetworkPort, self.version, asset__hostname=row['dest_hostname'], label__name=row['dest_port']) dest_conn = add_network_conn(dest_conn, self.version) port.connection = dest_conn port.save() else: port.connection = None port.save()
def create_asset_extra(asset, version, power_connections, net_ports): # Other objects if power_connections: order = 1 for connection in power_connections: if order > asset.itmodel.power_ports: break if isinstance(connection['pdu_id'], int): connection['pdu_id'] = PDU.objects.get(id=connection['pdu_id']) new_pdu = versioned_object(connection['pdu_id'], version, PDU.IDENTITY_FIELDS) if new_pdu is None: add_rack(connection['pdu_id'].rack, version) Powered.objects.create( pdu=versioned_object(connection['pdu_id'], version, PDU.IDENTITY_FIELDS), plug_number=connection['plug'], version=version, asset=asset, order=order ) order += 1 if net_ports: i = 1 for port in net_ports: if i > asset.itmodel.network_ports: break mac = port.get('mac_address') if mac and len(mac) == 0: mac = None if version.id != 0: if port['connection'] is not None: versioned_conn = add_network_conn(port['connection'], version) port['connection'] = versioned_conn NetworkPort.objects.create( asset=asset, label=NetworkPortLabel.objects.get( itmodel=asset.itmodel, name=port['label'] ), mac_address=mac, connection=add_network_conn(port.get('connection'), version), version=version, ) i += 1
def after_save_instance(self, instance, using_transactions, dry_run): if self.version.parent: asset = versioned_object(instance.asset, self.version.parent, ['hostname']) for port in asset.networkport_set.all(): add_network_conn(port, self.version)
def update(self, request, *args, **kwargs): # todo the logic in this looks fishy.. # Do you need to update data's id or is that done already? what about version? # Does the new asset get added to the new version? What about its network ports? # Make sure that network ports are not deleted in the offline case but connections are wiped version = ChangePlan.objects.get(id=get_version(request)) asset = self.get_object() asset_ver = asset.version request.data['power_connections'] = request.data.get( 'power_connections', []) request.data['network_ports'] = request.data.get('network_ports', []) request.data['power_connections'] = [ entry for entry in request.data['power_connections'] if entry ] site = Site.objects.get(id=request.data['location']['site']) check_asset_perm(request.user.username, site.abbr) check_asset_perm(request.user.username, asset.site.abbr) if version != asset_ver: data = request.data if not site.offline: rack = versioned_object(asset.rack, version, Rack.IDENTITY_FIELDS) if not rack: rack = add_rack(asset.rack, version) old_pdus = { port['id']: port['position'] for port in asset.rack.pdu_set.order_by('position').values( 'id', 'position') } new_pdus = { port['position']: port['id'] for port in rack.pdu_set.order_by('position').values( 'id', 'position') } data['location']['rack'] = rack.id for i, port in enumerate(request.data['power_connections']): data['power_connections'][i]['pdu_id'] = new_pdus[old_pdus[ int(port['pdu_id'])]] for i, port in enumerate(request.data['network_ports']): if port['connection'] is not None: versioned_conn = add_network_conn( NetworkPort.objects.get(id=port['connection']), version) data['network_ports'][i][ 'connection'] = versioned_conn.id else: request.data['power_connections'] = [] if request.data['location']['tag'] == 'chassis-mount': chassis = Asset.objects.get( id=request.data['location']['asset']) request.data['location']['asset'] = add_asset( chassis, version, Asset.IDENTITY_FIELDS).id pass serializer = AssetSerializer(data=data, context={ 'request': request, 'version': version.id }) serializer.is_valid(raise_exception=True) serializer.save() return Response(data=serializer.data, status=HTTP_200_OK) else: return super(AssetUpdate, self).update(request, *args, **kwargs)