Skip to content

Commit

Permalink
Create file share when creating app with network restricted storage
Browse files Browse the repository at this point in the history
  • Loading branch information
kamperiadis committed Jan 7, 2025
1 parent 1f976d5 commit 17efde4
Show file tree
Hide file tree
Showing 20 changed files with 6,254 additions and 1,312 deletions.
15 changes: 14 additions & 1 deletion src/azure-cli/azure/cli/command_modules/appservice/custom.py
Original file line number Diff line number Diff line change
Expand Up @@ -5016,6 +5016,7 @@ def create_functionapp(cmd, resource_group_name, name, storage_account, plan=Non
'flag instead.'.format(storage_account))
if vnet and configure_networking_later:
raise ValidationError('The --vnet and --configure-networking-later flags are mutually exclusive.')
functionapp_def.vnet_content_share_enabled = True

con_string = _validate_and_get_connection_string(cmd.cli_ctx, resource_group_name, storage_account)

Expand Down Expand Up @@ -5155,7 +5156,9 @@ def create_functionapp(cmd, resource_group_name, name, storage_account, plan=Non
if (plan_info is not None and is_plan_elastic_premium(cmd, plan_info)) or consumption_plan_location is not None:
site_config.app_settings.append(NameValuePair(name='WEBSITE_CONTENTAZUREFILECONNECTIONSTRING',
value=con_string))
site_config.app_settings.append(NameValuePair(name='WEBSITE_CONTENTSHARE', value=_get_content_share_name(name)))
content_share_name = _get_content_share_name(name)
site_config.app_settings.append(NameValuePair(name='WEBSITE_CONTENTSHARE', value=content_share_name))
create_file_share(cmd.cli_ctx, resource_group_name, storage_account, content_share_name)

create_app_insights = False

Expand Down Expand Up @@ -5384,6 +5387,16 @@ def _validate_cpu_momory_functionapp(cpu=None, memory=None):
return


def create_file_share(cli_ctx, resource_group_name, storage_account, share_name):

storage_client = get_mgmt_service_client(cli_ctx, StorageManagementClient)
from azure.mgmt.storage.models import FileShare

file_share = FileShare()

return storage_client.file_shares.create(resource_group_name, storage_account, share_name, file_share=file_share)


def _get_extension_version_functionapp(functions_version):
if functions_version is not None:
return '~{}'.format(functions_version)
Expand Down

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -2769,7 +2769,7 @@ def test_functionapp_vnet_integration_consumption_plan(self, resource_group, sto
])

@ResourceGroupPreparer(location=WINDOWS_ASP_LOCATION_FUNCTIONAPP)
def test_consumption_functionapp_disabled_public_network_access_storage(self, resource_group):
def test_functionapp_consumption_disabled_public_network_access_storage(self, resource_group):
functionapp_name = self.create_random_name('functionapp', 24)
storage_account = self.create_random_name('funcstorage1', 24)

Expand All @@ -2780,7 +2780,7 @@ def test_consumption_functionapp_disabled_public_network_access_storage(self, re


@ResourceGroupPreparer(location=WINDOWS_ASP_LOCATION_FUNCTIONAPP)
def test_consumption_functionapp_restricted_public_network_access_storage(self, resource_group):
def test_functionapp_consumption_restricted_public_network_access_storage(self, resource_group):
functionapp_name = self.create_random_name('functionapp', 24)
storage_account = self.create_random_name('funcstorage', 24)

Expand All @@ -2791,7 +2791,7 @@ def test_consumption_functionapp_restricted_public_network_access_storage(self,


@ResourceGroupPreparer(location=WINDOWS_ASP_LOCATION_FUNCTIONAPP)
def test_elastic_premium_functionapp_restricted_public_network_access_storage_no_vnet(self, resource_group):
def test_functionapp_elastic_premium_restricted_public_network_access_storage_no_vnet(self, resource_group):
functionapp_name = self.create_random_name('functionapp', 24)
storage_account = self.create_random_name('funcstorage', 24)
ep_plan_name = self.create_random_name('epplan', 24)
Expand All @@ -2805,7 +2805,7 @@ def test_elastic_premium_functionapp_restricted_public_network_access_storage_no


@ResourceGroupPreparer(location=WINDOWS_ASP_LOCATION_FUNCTIONAPP)
def test_elastic_premium_functionapp_restricted_public_network_access_storage_mutually_exclusive_flags(self, resource_group):
def test_functionapp_elastic_premium_restricted_public_network_access_storage_mutually_exclusive_flags(self, resource_group):
functionapp_name = self.create_random_name('functionapp', 24)
storage_account = self.create_random_name('funcstorage', 24)
ep_plan_name = self.create_random_name('epplan', 24)
Expand All @@ -2822,6 +2822,41 @@ def test_elastic_premium_functionapp_restricted_public_network_access_storage_mu
with self.assertRaises(ValidationError):
self.cmd('functionapp create -g {} -n {} -s {} -p {} --functions-version 4 --vnet {} --subnet {} --configure-networking-later'.format(resource_group, functionapp_name, storage_account, ep_plan_name, vnet_name, subnet_name))

@ResourceGroupPreparer(location=WINDOWS_ASP_LOCATION_FUNCTIONAPP)
def test_functionapp_elastic_premium_restricted_public_network_access_storage_vnet(self, resource_group):
functionapp_name = self.create_random_name('functionapp', 24)
storage_account = self.create_random_name('funcstorage', 24)
ep_plan_name = self.create_random_name('epplan', 24)
subnet_name = self.create_random_name('swiftsubnet', 24)
vnet_name = self.create_random_name('swiftname', 24)

self.cmd('functionapp plan create -g {} -n {} --sku EP1'.format(resource_group, ep_plan_name))

self.cmd('storage account create --name {} -g {} -l {} --sku Standard_LRS --default-action Deny --public-network-access Enabled'.format(storage_account, resource_group, WINDOWS_ASP_LOCATION_FUNCTIONAPP))

subnet_id = self.cmd('network vnet create -g {} -n {} --address-prefix 10.0.0.0/16 --subnet-name {} --subnet-prefix 10.0.0.0/24'.format(
resource_group, vnet_name, subnet_name)).get_output_in_json()['newVNet']['subnets'][0]['id']

self.cmd('functionapp create -g {} -n {} -s {} -p {} --functions-version 4 --vnet {} --subnet {}'.format(resource_group, functionapp_name, storage_account, ep_plan_name, vnet_name, subnet_name)).assert_with_checks([
JMESPathCheck('vnetContentShareEnabled', True),
JMESPathCheck('vnetRouteAllEnabled', True),
JMESPathCheck('virtualNetworkSubnetId', subnet_id)
])

@ResourceGroupPreparer(location=WINDOWS_ASP_LOCATION_FUNCTIONAPP)
def test_functionapp_elastic_premium_restricted_public_network_access_storage_configure_vnet_later(self, resource_group):
functionapp_name = self.create_random_name('functionapp', 24)
storage_account = self.create_random_name('funcstorage', 24)
ep_plan_name = self.create_random_name('epplan', 24)

self.cmd('functionapp plan create -g {} -n {} --sku EP1'.format(resource_group, ep_plan_name))

self.cmd('storage account create --name {} -g {} -l {} --sku Standard_LRS --default-action Deny --public-network-access Enabled'.format(storage_account, resource_group, WINDOWS_ASP_LOCATION_FUNCTIONAPP))

self.cmd('functionapp create -g {} -n {} -s {} -p {} --functions-version 4 --cnl'.format(resource_group, functionapp_name, storage_account, ep_plan_name)).assert_with_checks([
JMESPathCheck('vnetContentShareEnabled', True),
])


@ResourceGroupPreparer(location=WINDOWS_ASP_LOCATION_FUNCTIONAPP)
@StorageAccountPreparer()
Expand Down

0 comments on commit 17efde4

Please sign in to comment.