def _handle_resource_not_exists(namespace): # TODO: hook up namespace._subscription_id once we support it ns, t = resource_type.split('/') if resource_exists(namespace.resource_group_name, namespace.name, ns, t): raise CLIError('Resource {} of type {} in group {} already exists.'.format( namespace.name, resource_type, namespace.resource_group_name))
def _handle_resource_not_exists(namespace): # TODO: hook up namespace._subscription_id once we support it ns, t = resource_type.split('/') if resource_exists(namespace.resource_group_name, namespace.name, ns, t): raise CLIError( 'Resource {} of type {} in group {} already exists.'.format( namespace.name, resource_type, namespace.resource_group_name))
def validator(namespace): type_field_name = '{}_type'.format(property_name) property_val = getattr(namespace, property_name, None) parent_val = getattr(namespace, parent_name, None) if parent_name else None # Check for the different scenarios (order matters) # 1) provided value indicates None (pair of empty quotes) if property_val in ('', '""', "''") or (property_val is None and default_none): if not allow_none: raise CLIError('{} cannot be None.'.format(property_option)) setattr(namespace, type_field_name, 'none') setattr(namespace, property_name, None) if parent_name and parent_val: logger = azlogging.get_az_logger(__name__) logger.warning('Ignoring: %s %s', parent_option, parent_val) setattr(namespace, parent_name, None) return # SUCCESS # Create a resource ID we can check for existence. (resource_id_parts, value_was_id) = _validate_name_or_id( namespace.resource_group_name, property_val, property_type, parent_val, parent_type) # 2) resource exists if resource_exists(**resource_id_parts): setattr(namespace, type_field_name, 'existingId') setattr(namespace, property_name, resource_id(**resource_id_parts)) if parent_val: if value_was_id: logger = azlogging.get_az_logger(__name__) logger.warning('Ignoring: %s %s', parent_option, parent_val) setattr(namespace, parent_name, None) return # SUCCESS # if a parent name was required but not specified, raise a usage error if has_parent and not value_was_id and not parent_val and not allow_new: raise ValueError('incorrect usage: {0} ID | {0} NAME {1} NAME'.format( property_option, parent_option)) # if non-existent ID was supplied, throw error depending on whether a new resource can # be created. if value_was_id: usage_message = '{} NAME'.format(property_option) if not has_parent \ else '{} NAME [{} NAME]'.format(property_option, parent_option) action_message = 'Specify ( {} ) to create a new resource.'.format(usage_message) if \ allow_new else 'Create the required resource and try again.' raise CLIError('{} {} does not exist. {}'.format( property_name, property_val, action_message)) # 3) try to create new resource if allow_new: setattr(namespace, type_field_name, 'new') else: raise CLIError( '{} {} does not exist. Create the required resource and try again.'.format( property_name, property_val))
def handle_folding(namespace): base_name_val = getattr(namespace, base_name) type_field_val = getattr(namespace, type_field) parent_name_val = getattr(namespace, parent_name) if parent_name else None if base_name_val is None or type_field_val is not None: # Either no name was specified, or the user specified the type of resource # (i.e. new/existing/none) pass elif base_name_val in ('', '""', "''"): # An empty name specified - that means that we are neither referencing an existing # field, or the name is set to an empty string. We check for all types of quotes # so scripts can run cross-platform. if not none_flag_value: raise CLIError('Field {} cannot be none.'.format( make_camel_case(base_name))) setattr(namespace, type_field, none_flag_value) setattr(namespace, base_name, None) else: from azure.cli.core.commands.client_factory import get_subscription_id has_parent = parent_name is not None and parent_type is not None if is_valid_resource_id(base_name_val): resource_id_parts = parse_resource_id(base_name_val) elif has_parent: resource_id_parts = dict( name=parent_name_val, resource_group=namespace.resource_group_name, namespace=parent_type.split('/')[0], type=parent_type.split('/')[1], subscription=get_subscription_id(), child_name=base_name_val, child_type=resource_type) else: resource_id_parts = dict( name=base_name_val, resource_group=namespace.resource_group_name, namespace=resource_type.split('/')[0], type=resource_type.split('/')[1], subscription=get_subscription_id()) if resource_exists(**resource_id_parts): setattr(namespace, type_field, existing_id_flag_value) setattr(namespace, base_name, resource_id(**resource_id_parts)) elif is_valid_resource_id(base_name_val): raise CLIError('ID {} does not exist. Please specify ' 'a name to create a new resource.'.format( resource_id(**resource_id_parts))) elif not new_flag_value: raise CLIError( 'Referenced resource {} does not exist. Please create the required ' 'resource and try again.'.format( resource_id(**resource_id_parts))) else: setattr(namespace, type_field, new_flag_value)
def handle_folding(namespace): base_name_val = getattr(namespace, base_name) type_field_val = getattr(namespace, type_field) parent_name_val = getattr(namespace, parent_name) if parent_name else None if base_name_val is None or type_field_val is not None: # Either no name was specified, or the user specified the type of resource # (i.e. new/existing/none) pass elif base_name_val in ('', '""', "''"): # An empty name specified - that means that we are neither referencing an existing # field, or the name is set to an empty string. We check for all types of quotes # so scripts can run cross-platform. if not none_flag_value: raise CLIError('Field {} cannot be none.'.format(make_camel_case(base_name))) setattr(namespace, type_field, none_flag_value) setattr(namespace, base_name, None) else: from azure.cli.core.commands.client_factory import get_subscription_id has_parent = parent_name is not None and parent_type is not None if is_valid_resource_id(base_name_val): resource_id_parts = parse_resource_id(base_name_val) elif has_parent: if not parent_name_val and base_required: raise CLIError("Must specify '{}' when specifying '{}' name.".format( parent_option_flag or parent_name, base_name)) resource_id_parts = dict( name=parent_name_val, resource_group=namespace.resource_group_name, namespace=parent_type.split('/')[0], type=parent_type.split('/')[1], subscription=get_subscription_id(), child_name=base_name_val, child_type=resource_type) else: resource_id_parts = dict( name=base_name_val, resource_group=namespace.resource_group_name, namespace=resource_type.split('/')[0], type=resource_type.split('/')[1], subscription=get_subscription_id()) if resource_exists(**resource_id_parts): setattr(namespace, type_field, existing_id_flag_value) setattr(namespace, base_name, resource_id(**resource_id_parts)) elif is_valid_resource_id(base_name_val): raise CLIError('ID {} does not exist. Please specify ' 'a name to create a new resource.'.format( resource_id(**resource_id_parts))) elif not new_flag_value: raise CLIError('Referenced resource {} does not exist. Please create the required ' 'resource and try again.'.format(resource_id(**resource_id_parts))) else: setattr(namespace, type_field, new_flag_value)
def validator(namespace): from msrestazure.tools import resource_id type_field_name = '{}_type'.format(property_name) property_val = getattr(namespace, property_name, None) parent_val = getattr(namespace, parent_name, None) if parent_name else None # Check for the different scenarios (order matters) # 1) provided value indicates None (pair of empty quotes) if property_val in ('', '""', "''") or (property_val is None and default_none): if not allow_none: raise CLIError('{} cannot be None.'.format(property_option)) setattr(namespace, type_field_name, 'none') setattr(namespace, property_name, None) if parent_name and parent_val: logger.warning('Ignoring: %s %s', parent_option, parent_val) setattr(namespace, parent_name, None) return # SUCCESS # Create a resource ID we can check for existence. (resource_id_parts, value_was_id) = _validate_name_or_id( namespace.cmd.cli_ctx, namespace.resource_group_name, property_val, property_type, parent_val, parent_type) # 2) resource exists if resource_exists(namespace.cmd.cli_ctx, **resource_id_parts): setattr(namespace, type_field_name, 'existingId') setattr(namespace, property_name, resource_id(**resource_id_parts)) if parent_val: if value_was_id: logger.warning('Ignoring: %s %s', parent_option, parent_val) setattr(namespace, parent_name, None) return # SUCCESS # if a parent name was required but not specified, raise a usage error if has_parent and not value_was_id and not parent_val and not allow_new: raise ValueError('incorrect usage: {0} ID | {0} NAME {1} NAME'.format( property_option, parent_option)) # if non-existent ID was supplied, throw error depending on whether a new resource can # be created. if value_was_id: usage_message = '{} NAME'.format(property_option) if not has_parent \ else '{} NAME [{} NAME]'.format(property_option, parent_option) action_message = 'Specify ( {} ) to create a new resource.'.format(usage_message) if \ allow_new else 'Create the required resource and try again.' raise CLIError('{} {} does not exist. {}'.format( property_name, property_val, action_message)) # 3) try to create new resource if allow_new: setattr(namespace, type_field_name, 'new') else: raise CLIError( '{} {} does not exist. Create the required resource and try again.'.format( property_name, property_val))