Skip to content

Commit

Permalink
[storage-preview] az storage account create/update: Support `--enab…
Browse files Browse the repository at this point in the history
…le-sftp` and `--enable-local-user` (#4140)

* Bump `azure-mgmt-storage` to 2021-08-01

* linter

* update SDK

* Update SDK

* Copy `az storage account create/update` from CLI main repo

* `az storage account create/update`: Support `--enable-sftp` and `--enable-local-user`

* update sdk

* fix test

* re-record test
  • Loading branch information
evelyn-ys committed Jan 13, 2022
1 parent ec35a6e commit 18eb1da
Show file tree
Hide file tree
Showing 9 changed files with 1,344 additions and 232 deletions.
311 changes: 304 additions & 7 deletions src/storage-preview/azext_storage_preview/_params.py

Large diffs are not rendered by default.

38 changes: 19 additions & 19 deletions src/storage-preview/azext_storage_preview/_validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -343,28 +343,16 @@ def validate_encryption_services(cmd, namespace):
namespace.encryption_services = t_encryption_services(**services)


def validate_encryption_source(cmd, namespace):
ns = vars(namespace)

key_name = ns.pop('encryption_key_name', None)
key_version = ns.pop('encryption_key_version', None)
key_vault_uri = ns.pop('encryption_key_vault', None)

if namespace.encryption_key_source == 'Microsoft.Keyvault' and not (key_name and key_version and key_vault_uri):
raise ValueError('--encryption-key-name, --encryption-key-vault, and --encryption-key-version are required '
def validate_encryption_source(namespace):
if namespace.encryption_key_source == 'Microsoft.Keyvault' and \
not (namespace.encryption_key_name and namespace.encryption_key_vault):
raise ValueError('--encryption-key-name and --encryption-key-vault are required '
'when --encryption-key-source=Microsoft.Keyvault is specified.')

if key_name or key_version or key_vault_uri:
if namespace.encryption_key_source != 'Microsoft.Keyvault':
if namespace.encryption_key_name or namespace.encryption_key_version is not None or namespace.encryption_key_vault:
if namespace.encryption_key_source and namespace.encryption_key_source != 'Microsoft.Keyvault':
raise ValueError('--encryption-key-name, --encryption-key-vault, and --encryption-key-version are not '
'applicable when --encryption-key-source=Microsoft.Keyvault is not specified.')
KeyVaultProperties = get_sdk(cmd.cli_ctx, CUSTOM_MGMT_STORAGE, 'KeyVaultProperties',
mod='models')
if not KeyVaultProperties:
return

kv_prop = KeyVaultProperties(key_name=key_name, key_version=key_version, key_vault_uri=key_vault_uri)
namespace.encryption_key_vault_properties = kv_prop
'applicable without Microsoft.Keyvault key-source.')


def get_file_path_validator(default_file_param=None):
Expand Down Expand Up @@ -411,6 +399,18 @@ def validate_storage_account(cmd, namespace):
raise CLIError("You storage account doesn't enable HNS property.")


def validate_immutability_arguments(namespace):
from azure.cli.core.azclierror import InvalidArgumentValueError
if not namespace.enable_alw:
if any([namespace.immutability_period_since_creation_in_days,
namespace.immutability_policy_state, namespace.allow_protected_append_writes is not None]):
raise InvalidArgumentValueError("Incorrect usage: To enable account level immutability, "
"need to specify --enable-alw true. "
"Cannot set --enable_alw to false and specify "
"--immutability-period --immutability-state "
"--allow-append")


def validate_subnet(cmd, namespace):
from msrestazure.tools import resource_id, is_valid_resource_id
from azure.cli.core.commands.client_factory import get_subscription_id
Expand Down
6 changes: 6 additions & 0 deletions src/storage-preview/azext_storage_preview/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,12 @@ def get_custom_sdk(custom_module, client_factory, resource_type=CUSTOM_DATA_STOR
resource_type=CUSTOM_MGMT_STORAGE
)

with self.command_group('storage account', storage_account_sdk, resource_type=CUSTOM_MGMT_STORAGE,
custom_command_type=storage_account_custom_type) as g:
g.custom_command('create', 'create_storage_account')
g.generic_update_command('update', getter_name='get_properties', setter_name='update',
custom_func_name='update_storage_account')

with self.command_group('storage account network-rule', storage_account_sdk,
custom_command_type=storage_account_custom_type,
resource_type=CUSTOM_MGMT_STORAGE, min_api='2017-06-01') as g:
Expand Down
412 changes: 379 additions & 33 deletions src/storage-preview/azext_storage_preview/operations/account.py

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@

from azure.cli.core.profiles import register_resource_type
from ...profiles import CUSTOM_MGMT_STORAGE, CUSTOM_DATA_STORAGE_FILEDATALAKE
register_resource_type('latest', CUSTOM_MGMT_STORAGE, '2020-08-01-preview')

register_resource_type('latest', CUSTOM_MGMT_STORAGE, '2021-08-01')
register_resource_type('latest', CUSTOM_DATA_STORAGE_FILEDATALAKE, '2020-06-12')

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 @@ -10,6 +10,25 @@
from knack.util import CLIError


class StorageAccountTests(StorageScenarioMixin, ScenarioTest):
@AllowLargeResponse()
@api_version_constraint(CUSTOM_MGMT_STORAGE, min_api='2021-08-01')
@ResourceGroupPreparer(name_prefix='cli_test_storage_account_sftp')
def test_storage_account_sftp(self, resource_group):
self.kwargs.update({
'rg': resource_group,
'sa': self.create_random_name(prefix='cli', length=24),
'loc': 'centraluseuap'
})
self.cmd('storage account create -n {sa} -g {rg} -l {loc} --sku Standard_LRS --hns true '
'--enable-sftp true --enable-nfs-v3 false --enable-local-user true',
checks=[JMESPathCheck('isSftpEnabled', True), JMESPathCheck('isLocalUserEnabled', True)])
self.cmd('storage account update -n {sa} --enable-sftp false',
checks=[JMESPathCheck('isSftpEnabled', False), JMESPathCheck('isLocalUserEnabled', True)])
self.cmd('storage account update -n {sa} --enable-local-user false',
checks=[JMESPathCheck('isSftpEnabled', False), JMESPathCheck('isLocalUserEnabled', False)])


@api_version_constraint(CUSTOM_MGMT_STORAGE, min_api='2016-12-01')
class StorageAccountNetworkRuleTests(StorageScenarioMixin, ScenarioTest):
@api_version_constraint(CUSTOM_MGMT_STORAGE, min_api='2017-06-01')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,27 +121,15 @@ def test_validate_encryption_services(self):

def test_validate_encryption_source(self):
with self.assertRaises(ValueError):
validate_encryption_source(MockCmd(self.cli),
Namespace(encryption_key_source='Microsoft.Keyvault', _cmd=MockCmd(self.cli)))
validate_encryption_source(
Namespace(encryption_key_source='Microsoft.Keyvault', encryption_key_name=None,
encryption_key_version=None, encryption_key_vault=None, _cmd=MockCmd(self.cli)))

with self.assertRaises(ValueError):
validate_encryption_source(
MockCmd(self.cli),
Namespace(encryption_key_source='Microsoft.Storage', encryption_key_name='key_name',
encryption_key_version='key_version', encryption_key_vault='https://example.com/key_uri'))

ns = Namespace(encryption_key_source='Microsoft.Keyvault', encryption_key_name='key_name',
encryption_key_version='key_version', encryption_key_vault='https://example.com/key_uri')
validate_encryption_source(MockCmd(self.cli), ns)
self.assertFalse(hasattr(ns, 'encryption_key_name'))
self.assertFalse(hasattr(ns, 'encryption_key_version'))
self.assertFalse(hasattr(ns, 'encryption_key_uri'))

properties = ns.encryption_key_vault_properties
self.assertEqual(properties.key_name, 'key_name')
self.assertEqual(properties.key_version, 'key_version')
self.assertEqual(properties.key_vault_uri, 'https://example.com/key_uri')


if __name__ == '__main__':
unittest.main()

0 comments on commit 18eb1da

Please sign in to comment.