Set header parameters in the cli
Certain API operations support/require additional header parameters to be set with the query (i.e. DNS supports `x-auth-all-projects` and `x-auth-sudo-project-id`). Such supported headers should be known from the OpenAPI spec, so add them in the CLI operation and correspondingly set them into the query. In difference to the `python-designateclient` `x-auth-all-projects` will not be set by default, it is wrong to assume so. Admin user is expected to set this parameter in the CLI invocation explicitly. Change-Id: I49b9c31dc47911e261cbdd880c3e6d7327e50f4b Signed-off-by: Artem Goncharov <artem.goncharov@gmail.com>
This commit is contained in:
10 changed files with 81 additions and 29 deletions
@@ -1364,7 +1364,9 @@ class TypeManager:
for parameter in parameters:
data_type = self.convert_model(parameter.data_type)
param = self.request_parameter_class(
remote_name=self.get_remote_attribute_name(parameter.name),
remote_name=self.get_remote_attribute_name(parameter.name)
if parameter.location != "header"
else parameter.name,
local_name=self.get_local_attribute_name(parameter.name),
data_type=data_type,
location=parameter.location,
@@ -1,4 +1,4 @@
{%- if type_manager.get_parameters("header") %}
{%- if type_manager.get_parameters("header") | list | length > 0 %}
/// Header parameters
#[derive(Args)]
@@ -44,6 +44,13 @@ pub struct {{ target_class_name }}Command {
#[command(flatten)]
query: QueryParameters,
{%- if type_manager.get_parameters("header") | list | length > 0 %}
/// Request Headers parameters
#[command(flatten)]
headers: HeaderParameters,
{%- endif %}
/// Path parameters
#[command(flatten)]
path: PathParameters,
@@ -68,6 +75,7 @@ pub struct {{ target_class_name }}Command {
}
{% include "rust_cli/query_parameters.j2" %}
{% include "rust_cli/headers_parameters.j2" %}
{% include "rust_cli/path_parameters.j2" %}
{%- for type in type_manager.get_subtypes() %}
@@ -131,8 +139,12 @@ impl {{ target_class_name }}Command {
let mut find_builder = find::{{ sdk_struct_name }}::builder();
{{ macros.set_cli_path_parameters(type_manager, "find_builder", find_mode=True) }}
{%- if microversion %}
find_builder.header(http::header::HeaderName::from_static("openstack-api-version"), http::header::HeaderValue::from_static("{{ "volume" if service_type == "block-storage" else service_type }} {{ microversion }}"));
find_builder.header(
http::header::HeaderName::from_static("openstack-api-version"),
http::header::HeaderValue::from_static("{{ "volume" if service_type == "block-storage" else service_type }} {{ microversion }}")
);
{%- endif %}
{% include 'rust_cli/set_headers_parameters_to_find.j2' %}
let find_ep = find_builder
.build()
.map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
@@ -143,10 +155,14 @@ impl {{ target_class_name }}Command {
{% set builder_mutable = type_manager.is_operation_supporting_params() %}
let {{ "mut" if builder_mutable }} ep_builder = {{ sdk_mod_path[-1] }}::Request::builder();
{%- if microversion %}
ep_builder.header(http::header::HeaderName::from_static("openstack-api-version"), http::header::HeaderValue::from_static("{{ "volume" if service_type == "block-storage" else service_type }} {{ microversion }}"));
ep_builder.header(
http::header::HeaderName::from_static("openstack-api-version"),
http::header::HeaderValue::from_static("{{ "volume" if service_type == "block-storage" else service_type }} {{ microversion }}")
);
{%- endif %}
{{ macros.set_cli_path_parameters(type_manager, "ep_builder") }}
{% include 'rust_cli/set_query_parameters.j2' %}
{% include 'rust_cli/set_headers_parameters.j2' %}
{% include 'rust_cli/set_body_parameters.j2' %}
{%- if operation_type == "upload" and body_types|length == 1 and body_types[0] != "*/*" %}
@@ -1,8 +1,8 @@
{% import 'rust_macros.j2' as macros with context -%}
{% if not is_json_patch -%}
// Set body parameters
{%- with root = type_manager.get_root_data_type() %}
{%- if root.__class__.__name__ == "StructInput" -%}
{%- if root.__class__.__name__ == "StructInput" and root.fields -%}
// Set body parameters
{%- for root_attr, root_field in root.fields | dictsort %}
// Set Request.{{ root_field.remote_name }} data
@@ -70,6 +70,7 @@
}
{%- endif %}
{%- elif root.__class__.__name__ == "DictionaryInput" %}
// Set body parameters
if let Some(properties) = &self.properties {
{%- if root.value_type.__class__.__name__ == "Option" %}
ep_builder.properties(properties
@@ -1,26 +1,13 @@
{%- import 'rust_macros.j2' as macros with context -%}
{%- if type_manager.get_parameters("header") %}
{%- if type_manager.get_parameters("header") | list | length > 0 -%}
// Set header parameters
{%- for (k, v) in type_manager.get_parameters("header") %}
{%- if v.data_type.__class__.__name__ == "BooleanFlag" and v.data_type.original_data_type.__class__.__name__ == "Null" %}
{%- if v.is_required %}
if self.query.{{ v.local_name }} {
ep_builder.{{ v.remote_name }}(serde_json::Value::Null);
}
{%- else %}
if let Some(true) = self.query.{{ v.local_name }} {
ep_builder.{{ v.remote_name }}(serde_json::Value::Null);
}
{%- endif %}
{%- elif not v.is_required %}
if let Some(val) = &self.query.{{ v.local_name }} {
{{ macros.set_request_data_from_input(type_manager, "ep_builder", v, "val")}}
{%- if not v.is_required %}
if let Some(val) = &self.headers.{{ v.local_name }} {
{{ macros.set_request_header_from_input(type_manager, "ep_builder", v, "val")}}
}
{%- else %}
{{ macros.set_request_data_from_input(type_manager, "ep_builder", v, "&self.query." + v.local_name )}}
{{ macros.set_request_header_from_input(type_manager, "ep_builder", v, "&self.headers." + v.local_name )}}
{%- endif %}
{%- endfor %}
{%- endif %}
{% endif -%}
@@ -0,0 +1,13 @@
{%- import 'rust_macros.j2' as macros with context -%}
{%- if type_manager.get_parameters("header") | list | length > 0 %}
{%- for (k, v) in type_manager.get_parameters("header") %}
{%- if not v.is_required %}
if let Some(val) = &self.headers.{{ v.local_name }} {
{{ macros.set_request_header_from_input(type_manager, "find_builder", v, "val")}}
}
{%- else %}
{{ macros.set_request_header_from_input(type_manager, "find_builder", v, "&self.headers." + v.local_name )}}
{%- endif %}
{%- endfor %}
{%- endif %}
@@ -1,4 +1,5 @@
// Set path parameters
{%- if type_manager.get_parameters("path") | list | length > 0 -%}
// Set path parameters2
{%- for (k, v) in type_manager.get_parameters("path") %}
{%- if not v.is_required %}
{%- if k != "project_id" %}
@@ -16,3 +17,4 @@
ep_builder.{{ v.local_name }}(&self.path.{{ v.local_name }});
{%- endif %}
{%- endfor %}
{%- endif %}
@@ -1,4 +1,5 @@
{%- import 'rust_macros.j2' as macros with context -%}
{%- if type_manager.get_parameters("query") | list | length > 0 -%}
// Set query parameters
{%- for (k, v) in type_manager.get_parameters("query") %}
{%- if not v.resource_link %}
@@ -70,3 +71,4 @@
{%- endif %}
{%- endif %}
{%- endfor %}
{%- endif %}
@@ -451,7 +451,7 @@ Some({{ val }})
{%- endmacro %}
{%- macro set_cli_path_parameters(type_manager, builder, find_mode=False) %}
{%- if not find_mode %}
{%- if not find_mode and type_manager.get_parameters("header") | list | length > 0 -%}
// Set path parameters
{%- endif %}
@@ -579,3 +579,34 @@ Some({{ val }})
"{{ prefix }}{{ url }}".to_string()
{%- endif %}
{%- endmacro %}
{#- Macros to render setting Request headers from CLI input #}
{%- macro set_request_header_from_input(manager, dst_var, param, val_var, by_ref=False) %}
{%- set is_nullable = param.is_nullable if param.is_nullable is defined else False %}
{{ dst_var }}.header(http::header::HeaderName::from_static("{{ param.remote_name }}"),
{%- if param.type_hint == "Option<bool>" -%}
http::header::HeaderValue::from_static(if *val {"true"} else {"false"})
{%- elif param.type_hint == "bool" -%}
http::header::HeaderValue::from_static(if val {"true"} else {"false"})
{%- elif param.type_hint in ["Option<i32>", "Option<i64>", "Option<f32>", "Option<f64>"] -%}
{%- if param.is_optional is defined and not param.is_optional %}
if let Some(val) = {{ val_var }} {
{{ "*val" if not by_ref else "val.clone()" }}
}
{%- else %}
{{ ("*" + val_var) if not by_ref else (val_var + ".clone()") }}
{%- endif %}
{%- elif param.type_hint in ["i32", "i64", "f32", "f64"] -%}
{{ val_var | replace("&", "" )}}
{%- elif param.data_type.__class__.__name__ in ["String", "SecretString"] -%}
http::header::HeaderValue::from_str({{ val_var if not by_ref else (val_var + ".clone()")}})?
{%- else -%}
http::header::HeaderValue::from_str({{ val_var if not by_ref else (val_var + ".clone()")}})?
{%- endif -%}
);
{%- endmacro %}
@@ -102,8 +102,6 @@ impl fooCommand {
let mut ep_builder = srv::Request::builder();
// Set path parameters
// Set query parameters
// Set body parameters
// Set Request.foo data
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.