
    >TfR8              	          d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
mZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZmZ d dl m!Z!m"Z" d dl#m$Z$m%Z% d dl&m'Z' d dl(m)Z) d dl*m+Z+ d dl,T dZ- G d de!e"eee          Z. G d de          Z/ G d de/ee+          Z0 G d de/e+          Z1dS )    N)GenericRelation)ValidationError)MinValueValidator)models)QSum)Lower)reverse)gettext_lazy)BaseInterface)RenderConfigMixin)ConfigContextModel)ConfigContextModelQuerySet)
get_config)NetBoxModelPrimaryModel)ContactsMixinImageAttachmentsMixin)CounterCacheFieldNaturalOrderingField)naturalize_interface)CollateAsChar)TrackingModelMixin)*)VirtualDiskVirtualMachineVMInterfacec                   B    e Zd ZdZ ej        dej        ddd          Z ej        dej        ddd          Z ej        dej        ddd          Z	 ej        dej        ddd          Z
 ej        d	ej        ddd          Z ej         ed
          d          Z ed
dd          Z ej        deej         ed                    Z ej        dej        dddidd          Z ej        dej        ddd ed                    Z ej        dej        ddd ed                    Z ej        dddd ed           e ej        d                    f          Z ej        dd ed                     Z ej        dd ed!                     Z  ej         ed"          dd#          Z! e"d$d%&          Z# e"d'd%&          Z$ e%j&                    Z'd(Z(d)Z) G d* d+          Z*d, Z+d- Z, fd.Z- fd/Z.d0 Z/e0d1             Z1 xZ2S )2r   z8
    A virtual machine which runs inside a Cluster.
    z	dcim.Sitevirtual_machinesT)to	on_deleterelated_nameblanknullvirtualization.Clusterzdcim.Deviceztenancy.Tenantzdcim.Platformname@   verbose_name
max_lengthd   )target_fieldr*   r#   2   status)r*   choicesdefaultr)   zdcim.DeviceRolevm_role)r    r!   r"   limit_choices_tor#   r$   ipam.IPAddress+zprimary IPv4)r    r!   r"   r#   r$   r)   zprimary IPv6      vCPUsg{Gz?)
max_digitsdecimal_placesr#   r$   r)   
validatorszmemory (MB))r#   r$   r)   z	disk (MB)zserial number)r)   r#   r*   zvirtualization.VMInterfacevirtual_machine)to_modelto_fieldzvirtualization.VirtualDisk)
siteclusterdevicetenantplatformr.   rolevcpusmemorydisk)r%   c            
           e Zd ZdZ ej         ed          ddd           ej         ed          dd ed	           ed
                    fZ	 ed          Z
 ed          ZdS )VirtualMachine.Meta)_namepkr&   r?   rA   z2%(app_label)s_%(class)s_unique_name_cluster_tenantr&   z+%(app_label)s_%(class)s_unique_name_clusterT)tenant__isnullz0Virtual machine name must be unique per cluster.)r&   	conditionviolation_error_messagezvirtual machinezvirtual machinesN)__name__
__module____qualname__orderingr   UniqueConstraintr	   r   _constraintsr)   verbose_name_plural     J/var/www/html/netbox-4.1.3/netbox/virtualization/models/virtualmachines.pyMetarH      s        "#F#fy(I   $F#fyB!4000()*\(](]	  
 q*++a 233rX   rZ   c                     | j         S NrK   selfs    rY   __str__zVirtualMachine.__str__   
    yrX   c                 0    t          d| j        g          S )Nzvirtualization:virtualmachineargsr
   rJ   r]   s    rY   get_absolute_urlzVirtualMachine.get_absolute_url   s    6dgYGGGGrX   c           	         t                                                       | j        s%| j        st	          dt          d          i          | j        re| j        r^| j        j        rR| j        j        | j        k    r=t	          dt          d                              | j        | j                  i          | j        r%| j        st	          dt          d          i          | j        rb| j        | j        j        	                                vr=t	          dt          d                              | j        | j                  i          | j
        j        s| j                            t          d	d
                    d         }|r| j        || _        nE|rC| j        |k    r8t	          dt          d                              | j        |          i          | j        r| j        	                                nd }dD ]}d| }t%          | |          }||j        j        |k    r>t	          |t          d                              |||j        j                  i          |j        |v rq|j        |j        j        |v rt	          |t          d                              |          i          d S )Nr?   z<A virtual machine must be assigned to a site and/or cluster.zGThe selected cluster ({cluster}) is not assigned to this site ({site}).)r?   r>   r@   z4Must specify a cluster when assigning a host device.zKThe selected device ({device}) is not assigned to this cluster ({cluster}).)r@   r?   sizer   )r0   	size__sumrF   zhThe specified disk size ({size}) must match the aggregate size of assigned virtual disks ({total_size}).)rg   
total_size)   r5   
primary_ipzBMust be an IPv{family} address. ({ip} is an IPv{version} address.))familyipversionz;The specified IP address ({ip}) is not assigned to this VM.)rm   )supercleanr>   r?   r   rT   formatr@   devicesall_stateaddingvirtualdisks	aggregater   rF   rJ   
interfacesgetattraddressrn   assigned_object
nat_inside)r^   
total_diskrx   rl   fieldrm   	__class__s         rY   rp   zVirtualMachine.clean   s    y 	 	!1[\\#   
 < 	DI 	$,*; 	@QUYU^@^@^!1] &DI&>>#    ; 	t| 	!!RSS#    ; 	4;dl.B.F.F.H.HHH!!a &T\&BB#    {! 
	*44S5K5K5KLL[YJ di/&		 	Z 7 7%A*  f$)
fCC	'    /3g?T_((***4
 	 	F)))Eu%%B~:%//)q`    &2rz?Q&RR+   
 %33].2=3PT^3^3^)q!^__ffjlfmm+    	 	rX   c                 x    | j         r| j        s| j         j        | _         t                      j        |i | d S r\   )r?   r>   ro   save)r^   rc   kwargsr   s      rY   r   zVirtualMachine.save   sE     < 	*	 	*)DId%f%%%%%rX   c                 J    t           j                            | j                  S r\   )VirtualMachineStatusChoicescolorsgetr.   r]   s    rY   get_status_colorzVirtualMachine.get_status_color   s    *155dkBBBrX   c                     t                      j        r| j        r| j        S | j        r| j        S | j        r| j        S d S r\   )r   PREFER_IPV4primary_ip4primary_ip6r]   s    rY   rk   zVirtualMachine.primary_ip   sQ    <<# 	(8 	## 	## 	##4rX   )3rO   rP   rQ   __doc__r   
ForeignKeyPROTECTr>   r?   r@   rA   SET_NULLrB   	CharFieldrT   r&   r   rI   r   STATUS_ACTIVEr.   rC   OneToOneFieldr   r   DecimalFieldr   decimalDecimalrD   PositiveIntegerFieldrE   rF   serialr   interface_countvirtual_disk_countr   
as_managerobjectsclone_fieldsprerequisite_modelsrZ   r_   re   rp   r   r   propertyrk   __classcell__r   s   @rY   r   r       s         6.'  D  f#.'  G V.'  F V.'  F !v /'  H 6QvYY  D !   E
 V++9Qx[[	  F 6.'#T*  D '&&/Q~&&  K '&&/Q~&&  K  FQwZZogod3344
	 	 	E )V(Q}%%  F
 '6&Q{^^  D
 VQ''  F ('-"  O +*-"  
 4(355GL4 4 4 4 4 4 4 4"  H H H= = = = =~& & & & &C C C   X    rX   r   c                       e Zd ZdZ ej        dej        d          Z ej         e	d          d          Z
 ededd	
          Z ej         e	d          dd	          Z G d d          Zd Z fdZed             Z xZS )ComponentModelzU
    An abstract model inherited by any model which has a parent VirtualMachine.
    virtualization.VirtualMachinez
%(class)ssr    r!   r"   r&   r'   r(   r+   Tr,   naturalize_functionr*   r#   description   )r)   r*   r#   c                   R    e Zd ZdZd ed          fZ ej        dd          fZdS )ComponentModel.MetaTr;   rI   )r;   r&   z3%(app_label)s_%(class)s_unique_virtual_machine_name)fieldsr&   N)	rO   rP   rQ   abstractr   rR   r   rS   rU   rW   rX   rY   rZ   r   &  sK        %}}W'='=>#F#2J  
rX   rZ   c                     | j         S r\   rK   r]   s    rY   r_   zComponentModel.__str__0  r`   rX   c                 b    t                                          |          }| j        |_        |S r\   )ro   to_objectchanger;   related_object)r^   actionobjectchanger   s      rY   r   zComponentModel.to_objectchange3  s+    ww..v66&*&:#rX   c                     | j         S r\   )r;   r]   s    rY   parent_objectzComponentModel.parent_object8  s    ##rX   )rO   rP   rQ   r   r   r   CASCADEr;   r   rT   r&   r   r   rI   r   rZ   r_   r   r   r   r   r   s   @rY   r   r     s6         (f'*.!  O
 6QvYY  D ! 0	  E #&"Q}%%  K
 
 
 
 
 
 
 
      
 $ $ X$ $ $ $ $rX   r   c            
           e Zd Z ej        dej        d          Z ededd          Z	 ej        dej
        d	dd ed
                    Z ej        ddd ed                    Z edddd          Z ej        dej
        ddd ed                    Z edddd          Z edddd          Z edddd          Z G d d ej                  Zd! Z fd"Zed#             Z xZS )$r   r   rx   r   r&   r+   Tr   z	ipam.VLANvminterfaces_as_untaggedzuntagged VLAN)r    r!   r"   r$   r#   r)   vminterfaces_as_taggedztagged VLANs)r    r"   r#   r)   r3   assigned_object_typeassigned_object_idvminterface)r    content_type_fieldobject_id_fieldrelated_query_namezipam.VRFvminterfacesVRFzipam.FHRPGroupAssignmentinterface_typeinterface_idr4   zvpn.TunnelTerminationtermination_typetermination_idzvpn.L2VPNTerminationc                   :    e Zd Z ed          Z ed          ZdS )VMInterface.Meta	interfacerx   NrO   rP   rQ   rT   r)   rV   rW   rX   rY   rZ   r   x  s+        q~~aoorX   rZ   c                 2    t          dd| j        i          S )Nzvirtualization:vminterfacerJ   )r   rd   r]   s    rY   re   zVMInterface.get_absolute_url|  s    3T47OLLLLrX   c                 H   t                                                       | j        r.| j        | j        k    rt	          dt          d          i          | j        rW| j        j        | j        k    rBt	          dt          d                              | j        | j        j                  i          | j        r.| j	        | j        k    rt	          dt          d          i          | j
        rW| j
        j        | j        k    rBt	          dt          d                              | j
        | j
        j                  i          | j        rQ| j        j        | j        j        d fvr9t	          d	t          d
                              | j                  i          d S d S )Nparentz&An interface cannot be its own parent.zdThe selected parent interface ({parent}) belongs to a different virtual machine ({virtual_machine}).)r   r;   bridgez)An interface cannot be bridged to itself.zdThe selected bridge interface ({bridge}) belongs to a different virtual machine ({virtual_machine}).)r   r;   untagged_vlanzThe untagged VLAN ({untagged_vlan}) must belong to the same site as the interface's parent virtual machine, or it must be global.)r   )ro   rp   rJ   	parent_idr   rT   r   r;   rq   	bridge_idr   r   r>   )r^   r   s    rY   rp   zVMInterface.clean  s   
 7 	[t~00!8Q/W-X-X"YZZZ ; 	4;6$:NNN!!+  &T[=X&YY	#    7 	^t~00!8Q/Z-[-["\]]] ; 	4;6$:NNN!!+  &T[=X&YY	#     	$"4"9$BVB[]aAb"b"b!=" " &t'9&::	#   	 	"b"brX   c                 4    | j                                         S r\   )l2vpn_terminationsfirstr]   s    rY   l2vpn_terminationzVMInterface.l2vpn_termination  s    &,,...rX   )rO   rP   rQ   r   r   r   r;   r   r   rI   r   rT   r   ManyToManyFieldtagged_vlansr   ip_addressesvrffhrp_group_assignmentstunnel_terminationsr   r   rZ   re   rp   r   r   r   r   s   @rY   r   r   =  s       'f'*.!  O
 ! 0	  E &F%//Q''  M *6)-Q~&&	  L #?1,(	  L &
/#QuXX  C -_%+&	   */"-((	   )!1,(	  . . . . .~" . . .M M M* * * * *X / / X/ / / / /rX   r   c                   n    e Zd Z ej         ed                    Z G d dej                  Zd Z	dS )r   z	size (MB))r)   c                   :    e Zd Z ed          Z ed          ZdS )VirtualDisk.Metazvirtual diskzvirtual disksNr   rW   rX   rY   rZ   r     s/        q((a00rX   rZ   c                 0    t          d| j        g          S )Nzvirtualization:virtualdiskrb   rd   r]   s    rY   re   zVirtualDisk.get_absolute_url  s    347)DDDDrX   N)
rO   rP   rQ   r   r   rT   rg   r   rZ   re   rW   rX   rY   r   r     sy        &6&Q{^^  D1 1 1 1 1~" 1 1 1E E E E ErX   r   )2r   "django.contrib.contenttypes.fieldsr   django.core.exceptionsr   django.core.validatorsr   	django.dbr   django.db.modelsr   r   django.db.models.functionsr	   django.urlsr
   django.utils.translationr   rT   dcim.modelsr   dcim.models.mixinsr   extras.modelsr   extras.querysetsr   netbox.configr   netbox.modelsr   r   netbox.models.featuresr   r   utilities.fieldsr   r   utilities.orderingr   utilities.query_functionsr   utilities.trackingr   virtualization.choices__all__r   r   r   r   rW   rX   rY   <module>r      sr    > > > > > > 2 2 2 2 2 2 4 4 4 4 4 4       # # # # # # # # , , , , , ,       6 6 6 6 6 6 % % % % % % 0 0 0 0 0 0 , , , , , , 7 7 7 7 7 7 $ $ $ $ $ $ 3 3 3 3 3 3 3 3 G G G G G G G G D D D D D D D D 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 $ $ $ $e e e e e]$9;LN`bn e e eZ-$ -$ -$ -$ -$[ -$ -$ -$`p/ p/ p/ p/ p/.-1C p/ p/ p/f
E 
E 
E 
E 
E."4 
E 
E 
E 
E 
ErX   