@@ -79,7 +79,7 @@ def create_storage_account(cmd, resource_group_name, account_name, sku=None, loc
7979 immutability_period_since_creation_in_days = None , immutability_policy_state = None ,
8080 allow_protected_append_writes = None , public_network_access = None , dns_endpoint_type = None ,
8181 enable_smb_oauth = None , zones = None , zone_placement_policy = None ,
82- enable_blob_geo_priority_replication = None ):
82+ enable_blob_geo_priority_replication = None , publish_ipv6_endpoint = None ):
8383 StorageAccountCreateParameters , Kind , Sku , CustomDomain , AccessTier , Identity , Encryption , NetworkRuleSet = \
8484 cmd .get_models ('StorageAccountCreateParameters' , 'Kind' , 'Sku' , 'CustomDomain' , 'AccessTier' , 'Identity' ,
8585 'Encryption' , 'NetworkRuleSet' )
@@ -325,6 +325,12 @@ def create_storage_account(cmd, resource_group_name, account_name, sku=None, loc
325325 GeoPriorityReplicationStatus = cmd .get_models ('GeoPriorityReplicationStatus' )
326326 params .geo_priority_replication_status = GeoPriorityReplicationStatus (is_blob_enabled = enable_blob_geo_priority_replication )
327327
328+ if publish_ipv6_endpoint is not None :
329+ DualStackEndpointPreference = cmd .get_models ('DualStackEndpointPreference' )
330+ params .dual_stack_endpoint_preference = DualStackEndpointPreference (
331+ publish_ipv6_endpoint = publish_ipv6_endpoint
332+ )
333+
328334 return scf .storage_accounts .begin_create (resource_group_name , account_name , params )
329335
330336
@@ -420,7 +426,7 @@ def update_storage_account(cmd, instance, sku=None, tags=None, custom_domain=Non
420426 immutability_period_since_creation_in_days = None , immutability_policy_state = None ,
421427 allow_protected_append_writes = None , public_network_access = None , upgrade_to_storagev2 = None ,
422428 yes = None , enable_smb_oauth = None , zones = None , zone_placement_policy = None ,
423- enable_blob_geo_priority_replication = None ):
429+ enable_blob_geo_priority_replication = None , publish_ipv6_endpoint = None ):
424430 StorageAccountUpdateParameters , Sku , CustomDomain , AccessTier , Identity , Encryption , NetworkRuleSet , Kind = \
425431 cmd .get_models ('StorageAccountUpdateParameters' , 'Sku' , 'CustomDomain' , 'AccessTier' , 'Identity' , 'Encryption' ,
426432 'NetworkRuleSet' , 'Kind' )
@@ -734,6 +740,12 @@ def update_storage_account(cmd, instance, sku=None, tags=None, custom_domain=Non
734740 GeoPriorityReplicationStatus = cmd .get_models ('GeoPriorityReplicationStatus' )
735741 params .geo_priority_replication_status = GeoPriorityReplicationStatus (is_blob_enabled = enable_blob_geo_priority_replication )
736742
743+ if publish_ipv6_endpoint is not None :
744+ DualStackEndpointPreference = cmd .get_models ('DualStackEndpointPreference' )
745+ params .dual_stack_endpoint_preference = DualStackEndpointPreference (
746+ publish_ipv6_endpoint = publish_ipv6_endpoint
747+ )
748+
737749 return params
738750
739751
@@ -746,11 +758,12 @@ def list_network_rules(client, resource_group_name, account_name):
746758
747759
748760def add_network_rule (cmd , client , resource_group_name , account_name , action = 'Allow' , subnet = None ,
749- vnet_name = None , ip_address = None , tenant_id = None , resource_id = None ): # pylint: disable=unused-argument
761+ vnet_name = None , ip_address = None , ipv6_address = None , tenant_id = None , resource_id = None ): # pylint: disable=unused-argument
750762 sa = client .get_properties (resource_group_name , account_name )
751763 rules = sa .network_rule_set
752- if not subnet and not ip_address :
764+ if not subnet and not ip_address and not ipv6_address :
753765 logger .warning ('No subnet or ip address supplied.' )
766+
754767 if subnet :
755768 from azure .mgmt .core .tools import is_valid_resource_id
756769 if not is_valid_resource_id (subnet ):
@@ -761,22 +774,13 @@ def add_network_rule(cmd, client, resource_group_name, account_name, action='All
761774 rules .virtual_network_rules = [r for r in rules .virtual_network_rules
762775 if r .virtual_network_resource_id .lower () != subnet .lower ()]
763776 rules .virtual_network_rules .append (VirtualNetworkRule (virtual_network_resource_id = subnet , action = action ))
777+
764778 if ip_address :
765- IpRule = cmd .get_models ('IPRule' )
766- if not rules .ip_rules :
767- rules .ip_rules = []
768- for ip in ip_address :
769- to_modify = True
770- for x in rules .ip_rules :
771- existing_ip_network = ip_network (x .ip_address_or_range )
772- new_ip_network = ip_network (ip )
773- if new_ip_network .overlaps (existing_ip_network ):
774- logger .warning ("IP/CIDR %s overlaps with %s, which exists already. Not adding duplicates." ,
775- ip , x .ip_address_or_range )
776- to_modify = False
777- break
778- if to_modify :
779- rules .ip_rules .append (IpRule (ip_address_or_range = ip , action = action ))
779+ rules .ip_rules = _process_add_ip (cmd , ip_address , rules .ip_rules , action = action , ipv6 = False )
780+
781+ if ipv6_address :
782+ rules .ipv6_rules = _process_add_ip (cmd , ipv6_address , rules .ipv6_rules , action = action , ipv6 = True )
783+
780784 if resource_id :
781785 ResourceAccessRule = cmd .get_models ('ResourceAccessRule' )
782786 if not rules .resource_access_rules :
@@ -790,7 +794,26 @@ def add_network_rule(cmd, client, resource_group_name, account_name, action='All
790794 return client .update (resource_group_name , account_name , params )
791795
792796
793- def remove_network_rule (cmd , client , resource_group_name , account_name , ip_address = None , subnet = None ,
797+ def _process_add_ip (cmd , ip_address , ip_rules , action , ipv6 = False ):
798+ IpRule = cmd .get_models ('IPRule' )
799+ if not ip_rules :
800+ ip_rules = []
801+ for ip in ip_address :
802+ to_modify = True
803+ for x in ip_rules :
804+ existing_ip_network = ip_network (x .ip_address_or_range )
805+ new_ip_network = ip_network (ip )
806+ if new_ip_network .overlaps (existing_ip_network ):
807+ logger .warning ("IP%s/CIDR %s overlaps with %s, which exists already. Not adding duplicates." ,
808+ "v6" if ipv6 else "v4" , ip , x .ip_address_or_range )
809+ to_modify = False
810+ break
811+ if to_modify :
812+ ip_rules .append (IpRule (ip_address_or_range = ip , action = action ))
813+ return ip_rules
814+
815+
816+ def remove_network_rule (cmd , client , resource_group_name , account_name , ip_address = None , ipv6_address = None , subnet = None ,
794817 vnet_name = None , tenant_id = None , resource_id = None ): # pylint: disable=unused-argument
795818 sa = client .get_properties (resource_group_name , account_name )
796819 rules = sa .network_rule_set
@@ -802,6 +825,11 @@ def remove_network_rule(cmd, client, resource_group_name, account_name, ip_addre
802825 rules .ip_rules = list (filter (lambda x : all (ip_network (x .ip_address_or_range ) != i for i in to_remove ),
803826 rules .ip_rules ))
804827
828+ if ipv6_address :
829+ to_remove = [ip_network (x ) for x in ipv6_address ]
830+ rules .ipv6_rules = list (filter (lambda x : all (ip_network (x .ip_address_or_range ) != i for i in to_remove ),
831+ rules .ipv6_rules ))
832+
805833 if resource_id :
806834 rules .resource_access_rules = [x for x in rules .resource_access_rules if
807835 not (x .tenant_id == tenant_id and x .resource_id == resource_id )]
0 commit comments