1# --------------------------------------------------------------------------------------------
2# Copyright (c) Microsoft Corporation. All rights reserved.
3# Licensed under the MIT License. See License.txt in the project root for license information.
4# --------------------------------------------------------------------------------------------
5
6from azure.cli.core.commands.validators import validate_tag
7
8
9def validate_storage_account_id(cmd, namespace):
10    """Validate storage account name"""
11    from azure.cli.core.commands.client_factory import get_subscription_id
12    from msrestazure.tools import is_valid_resource_id, resource_id
13
14    if namespace.storage_account:
15        if not is_valid_resource_id(namespace.storage_account):
16            namespace.storage_account = resource_id(
17                subscription=get_subscription_id(cmd.cli_ctx),
18                resource_group=namespace.resource_group_name,
19                namespace='Microsoft.Storage', type='storageAccounts',
20                name=namespace.storage_account
21            )
22
23
24def datetime_format(value):
25    """Validate the correct format of a datetime string and deserialize."""
26    from msrest.serialization import Deserializer
27    from msrest.exceptions import DeserializationError
28
29    try:
30        datetime_obj = Deserializer.deserialize_iso(value)
31    except DeserializationError:
32        message = "Argument {} is not a valid ISO-8601 datetime format"
33        raise ValueError(message.format(value))
34    return datetime_obj
35
36
37def validate_archive_window_length(ns):
38    """Validate the correct format of a datetime string and the range."""
39    if ns.archive_window_length is not None:
40        from msrest.serialization import Deserializer
41        from msrest.exceptions import DeserializationError
42
43        try:
44            datetime_obj = Deserializer.deserialize_duration(ns.archive_window_length)
45        except DeserializationError:
46            message = "archive-window-length {} is not a valid ISO-8601 duration format"
47            raise ValueError(message.format(ns.archive_window_length))
48
49        minwindow = Deserializer.deserialize_duration("PT5M")
50        maxwindow = Deserializer.deserialize_duration("PT25H")
51
52        if datetime_obj < minwindow or datetime_obj > maxwindow:
53            message = "archive-window-length '{}' is not in the range of PT5M and PT25H"\
54                .format(ns.archive_window_length)
55            raise ValueError(message)
56
57
58def validate_key_frame_interval_duration(ns):
59    """Validate the correct format of a datetime string and the range."""
60    if ns.key_frame_interval_duration is not None:
61        from msrest.serialization import Deserializer
62        from msrest.exceptions import DeserializationError
63
64        try:
65            datetime_obj = Deserializer.deserialize_duration(ns.key_frame_interval_duration)
66        except DeserializationError:
67            message = "key-frame-interval-duration {} is not a valid ISO-8601 duration format"
68            raise ValueError(message.format(ns.key_frame_interval_duration))
69
70        minwindow = Deserializer.deserialize_duration("PT1S")
71        maxwindow = Deserializer.deserialize_duration("PT30S")
72
73        if datetime_obj < minwindow or datetime_obj > maxwindow:
74            message = "key-frame-interval-duration '{}' is not in the range of PT1S and PT30S"\
75                .format(ns.key_frame_interval_duration)
76            raise ValueError(message)
77
78
79def validate_correlation_data(ns):
80    """ Extracts multiple space-separated correlation data in key[=value] format """
81    if isinstance(ns.correlation_data, list):
82        correlation_data_dict = {}
83        for item in ns.correlation_data:
84            correlation_data_dict.update(validate_tag(item))
85        ns.correlation_data = correlation_data_dict
86
87
88def validate_token_claim(ns):
89    """ Extracts multiple space-separated token claims in key[=value] format """
90    if isinstance(ns.token_claims, list):
91        token_claims_dict = {}
92        for item in ns.token_claims:
93            token_claims_dict.update(validate_tag(item))
94        ns.token_claims = token_claims_dict
95
96
97def validate_output_assets(ns):
98    """ Extracts multiple space-separated output assets in key[=value] format """
99    def _get_asset(asset_string):
100        from azure.mgmt.media.models import JobOutputAsset
101
102        name_and_label = asset_string.split('=')
103        name = name_and_label[0]
104        label = name_and_label[1]
105        return JobOutputAsset(asset_name=name, label=label)
106
107    if isinstance(ns.output_assets, list):
108        ns.output_assets = list(map(_get_asset, ns.output_assets))
109