From c1ab63071a6e6e3e3fbcaf7b0f33310f7c0ac0db Mon Sep 17 00:00:00 2001 From: Glenn Rodgers Date: Wed, 30 Oct 2024 13:55:12 -0400 Subject: [PATCH 01/15] Update policies-pdk-configure-features-streamproperties.adoc --- .../pages/policies-pdk-configure-features-streamproperties.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdk/1.2/modules/ROOT/pages/policies-pdk-configure-features-streamproperties.adoc b/pdk/1.2/modules/ROOT/pages/policies-pdk-configure-features-streamproperties.adoc index 704053a63..3274b5a63 100644 --- a/pdk/1.2/modules/ROOT/pages/policies-pdk-configure-features-streamproperties.adoc +++ b/pdk/1.2/modules/ROOT/pages/policies-pdk-configure-features-streamproperties.adoc @@ -1,4 +1,4 @@ -= Sharing Properties Across Requests += Sharing Data Between Policies ifndef::env-site,env-github[] include::_attributes.adoc[] endif::[] From 4dffb1a8953dd814eb5621b20500eb93fa368c79 Mon Sep 17 00:00:00 2001 From: Marina B Date: Wed, 30 Oct 2024 11:03:46 -0700 Subject: [PATCH 02/15] Setting up for PDK 1.3 --- pdk/1.3/antora.yml | 3 ++- pdk/1.3/modules/ROOT/pages/policies-pdk-prerequisites.adoc | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pdk/1.3/antora.yml b/pdk/1.3/antora.yml index 154b8cdd9..bfc6a1e96 100644 --- a/pdk/1.3/antora.yml +++ b/pdk/1.3/antora.yml @@ -6,6 +6,7 @@ start_page: policies-pdk-overview.adoc asciidoc: attributes: rust-ver-var: 'v1.74.0' - template-policies-url-ver-var: '1.3.0' + template-policies-url-ver-var: '1.2.0' + template-policies-url-ver-var: '1.2.0' nav: - modules/ROOT/nav.adoc diff --git a/pdk/1.3/modules/ROOT/pages/policies-pdk-prerequisites.adoc b/pdk/1.3/modules/ROOT/pages/policies-pdk-prerequisites.adoc index 3d8bed342..0e29af260 100644 --- a/pdk/1.3/modules/ROOT/pages/policies-pdk-prerequisites.adoc +++ b/pdk/1.3/modules/ROOT/pages/policies-pdk-prerequisites.adoc @@ -10,7 +10,7 @@ To begin using Flex Gateway Policy Development Kit (PDK), ensure you have the fo PDK tutorials assume that you have xref:gateway::index.adoc[downloaded Flex Gateway] and have some prior knowledge of the product. -include::release-notes::partial$pdk/pdk-supported-versions.adoc[tags=intro;1.2.0] +include::release-notes::partial$pdk/pdk-supported-versions.adoc[tags=intro;1.3.0] [[rust-requirements]] From 8215c9ea193cbf615c21a99bdcd9d4a9e4c0e78b Mon Sep 17 00:00:00 2001 From: Marina B Date: Wed, 30 Oct 2024 11:04:39 -0700 Subject: [PATCH 03/15] Oops, double line, removing one :) --- pdk/1.3/antora.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/pdk/1.3/antora.yml b/pdk/1.3/antora.yml index bfc6a1e96..9a5fec5f7 100644 --- a/pdk/1.3/antora.yml +++ b/pdk/1.3/antora.yml @@ -7,6 +7,5 @@ asciidoc: attributes: rust-ver-var: 'v1.74.0' template-policies-url-ver-var: '1.2.0' - template-policies-url-ver-var: '1.2.0' nav: - modules/ROOT/nav.adoc From 1c8214a82b63c2c7dfa0e44352a0aba63de8796f Mon Sep 17 00:00:00 2001 From: andytesti Date: Wed, 13 Nov 2024 15:07:10 -0300 Subject: [PATCH 04/15] Timer::set_period() --- ...policies-pdk-configure-features-timer.adoc | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-timer.adoc b/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-timer.adoc index 1fe3f933a..cd16372a1 100644 --- a/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-timer.adoc +++ b/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-timer.adoc @@ -6,7 +6,7 @@ endif::[] Use the `Clock` injectable to build a timer to enable delayed, periodic, and synchronous functions. Each policy supports only one timer. -Each timer provides the following two functions: +Each timer provides the following two async functions: [source,rust] ---- @@ -57,6 +57,31 @@ You can now await timer functions in `on_request` and `on_response` functions, f NOTE: To view an example policy project that launches delayed functions, see https://github.com/mulesoft/pdk-custom-policy-examples/blob/{template-policies-url-ver-var}/spike/README.md[Spike Policy Example]. +== Change the tick period + +The timer provides the next method to change the previously configured tick period: + +[source,rust] +---- +pub fn set_period(&self, interval: Duration); +---- + +You can reuse timer across the policy lifecycle. When setting the period with an interval of `Duration::ZERO`, +tick event is no longer available and invokations like `Timer::next_tick().await` and `Timer::sleep().await` will not be +awakened. + +[source,rust] +---- + let mut timer = clock.period(Duration::from_millis(500)); + some_initial_task(&timer).await; + + timer.set_period(Duration::from_millis(3000)) + some_other_task(&timer).await; + + // Stop the tick event. + timer.set_period(Duration::ZERO); +---- + == Launch Asynchronous Tasks Use the timer to execute tasks independent of the request flow. To execute asynchronous tasks: From 9c4682f188a65c8d14796f2ae0067f0e089c05e8 Mon Sep 17 00:00:00 2001 From: andytesti Date: Thu, 14 Nov 2024 15:57:10 -0300 Subject: [PATCH 05/15] update timer --- ...policies-pdk-configure-features-timer.adoc | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-timer.adoc b/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-timer.adoc index cd16372a1..94f798dc2 100644 --- a/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-timer.adoc +++ b/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-timer.adoc @@ -57,29 +57,29 @@ You can now await timer functions in `on_request` and `on_response` functions, f NOTE: To view an example policy project that launches delayed functions, see https://github.com/mulesoft/pdk-custom-policy-examples/blob/{template-policies-url-ver-var}/spike/README.md[Spike Policy Example]. -== Change the tick period +== Releasing the Clock -The timer provides the next method to change the previously configured tick period: +The timer provides the method for releasing the `Clock` in: [source,rust] ---- -pub fn set_period(&self, interval: Duration); +pub fn release(self) -> Clock; ---- -You can reuse timer across the policy lifecycle. When setting the period with an interval of `Duration::ZERO`, -tick event is no longer available and invokations like `Timer::next_tick().await` and `Timer::sleep().await` will not be -awakened. +This method is useful when you want to reset the tick period in order to create a new timer. [source,rust] ---- - let mut timer = clock.period(Duration::from_millis(500)); - some_initial_task(&timer).await; + // Configure an initial tick period. + let initial_timer = clock.period(Duration::from_millis(500)); + some_initial_task(&other_timer).await; - timer.set_period(Duration::from_millis(3000)) - some_other_task(&timer).await; + // Configure another tick period. + let other_timer = initial_timer.release().period(Duration::from_millis(3000); + some_other_task(&other_timer).await; - // Stop the tick event. - timer.set_period(Duration::ZERO); + // Get the clock back. + let clock = other_timer.release(); ---- == Launch Asynchronous Tasks From 6eac199e2f54aae3c191751c4a5ddbcd3dc7280f Mon Sep 17 00:00:00 2001 From: andytesti Date: Thu, 14 Nov 2024 16:10:04 -0300 Subject: [PATCH 06/15] change spell --- .../ROOT/pages/policies-pdk-configure-features-timer.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-timer.adoc b/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-timer.adoc index 94f798dc2..4cdbad964 100644 --- a/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-timer.adoc +++ b/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-timer.adoc @@ -59,7 +59,7 @@ NOTE: To view an example policy project that launches delayed functions, see htt == Releasing the Clock -The timer provides the method for releasing the `Clock` in: +The timer provides a method for releasing the `Clock`: [source,rust] ---- From e417720e374c261058b3e4ae2db6e8fb0bed5885 Mon Sep 17 00:00:00 2001 From: andytesti Date: Fri, 15 Nov 2024 14:57:21 -0300 Subject: [PATCH 07/15] Contracts API --- pdk/1.3/modules/ROOT/nav.adoc | 1 + ...cies-pdk-configure-features-contracts.adoc | 311 ++++++++++++++++++ .../policies-pdk-configure-features.adoc | 1 + 3 files changed, 313 insertions(+) create mode 100644 pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-contracts.adoc diff --git a/pdk/1.3/modules/ROOT/nav.adoc b/pdk/1.3/modules/ROOT/nav.adoc index 7530199a0..1167675f5 100644 --- a/pdk/1.3/modules/ROOT/nav.adoc +++ b/pdk/1.3/modules/ROOT/nav.adoc @@ -12,6 +12,7 @@ *** xref:policies-pdk-configure-features-headers.adoc[] *** xref:policies-pdk-configure-features-inject-parameters.adoc[] *** xref:policies-pdk-configure-features-http-request.adoc[] +*** xref:policies-pdk-configure-features-contracts.adoc[] *** xref:policies-pdk-configure-features-cors.adoc[] *** xref:policies-pdk-configure-features-jwt.adoc[] *** xref:policies-pdk-configure-features-dataweave.adoc[] diff --git a/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-contracts.adoc b/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-contracts.adoc new file mode 100644 index 000000000..9fee774a8 --- /dev/null +++ b/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-contracts.adoc @@ -0,0 +1,311 @@ += Using Contracts Validation library functions +ifndef::env-site,env-github[] +include::_attributes.adoc[] +endif::[] +:imagesdir: ../assets/images + +NOTE: To view an example policy project that uses Flex Gateway Policy Development Kit (PDK)'s Contracts Validation library, see https://github.com/mulesoft/pdk-custom-policy-examples/blob/{template-policies-url-ver-var}/contracts-validation/README.md[Contracts Validation Policy Example^]. + +A https://docs.mulesoft.com/api-manager/latest/api-contracts-landing-page[contract] between the API instance and the application gives access to it based on SLA tiers. +Only one contract can exist per API instance and application at any time. +Client applications can validate their contract by providing credentials that consist of two keys: client ID and client secret. +Contracts Validation library provides functionalities to validate client credentials and is useful for implementing a custom client ID enforcement policy. + +[[contracts-module]] +== Contracts module +The Contracts Validation library is available from the `pdk::contracts` module. +The module provides the `ContractValidator` object to validate client credentials. +Client credentials are represented by `ClientId` and `ClientSecret` objects. +Authentication and authorization can be validated with `ContractValidator::authenticate()` and `ContractValidator::authorize()` methods: + +[source,Rust] +---- + +impl ContractValidator { + + pub fn authenticate(client_id: &ClientId, client_secret: &ClientSecret) -> Result; + + pub fn authenticate(client_id: &ClientId, client_secret: &ClientSecret) -> Result; +} + +---- + +Both methods return a `ClientData` struct that holds client ID, client name and SLA ID fields. + +[source,Rust] +---- +pub struct ClientData { + pub client_id: String, + pub client_name: String, + pub sla_id: Option, +} +---- + +[[request-validation]] +== Request authentication and authorization + +A request can be authenticated by extracting client credentials from it, and invoking the `ClientValidation::authenticate()` method. +A helper function `basic_auth_credentials()` for extracting Basic Auth credentials from headers is provided with the `pdk::contracts` module. + +[source,Rust] +---- +pub fn basic_auth_credentials(request_headers_state: &RequestHeadersState) + -> Result<(ClientId, ClientSecret), BasicAuthError>; +---- + +An authentication request filter could be written as follows: + +[source,Rust] +---- +async fn my_authentication_filter( + state: RequestHeadersState, + authentication: Authentication, + validator: &ContractValidator, +) -> Flow<()> { + + // Extract credentials + let (client_id, client_secret) = match basic_auth_credentials(&state) { + Ok(credentials) => credentials, + Err(e) => { + logger::info!("Invalid credentials: {e}"); + + // For simplicity, we are using a user-defined `unathorized_response()` + // helper function for building responses. + return Flow::Break(unauthorized_response("Invalid credentials", 401)); + } + }; + + // Validate authentication + let validation = validator.authenticate(&client_id, &client_secret); + + let client_data = match validation { + Ok(client_data) => client_data, + Err(e) => { + logger::info!("Invalid authentication: {e}"); + return Flow::Break(unauthorized_response("Invalid authentication", 403)); + } + }; + + // Update the current authentication + if let Some(mut auth) = authentication.authentication() { + auth.client_id = Some(client_data.client_id); + auth.client_name = Some(client_data.client_name); + + authentication.set_authentication(Some(&auth)); + } + + Flow::Continue(()) +} +---- + +An authorization request filter could be written in a similar way: + +[source,Rust] +---- +async fn my_authorization_filter( + state: RequestHeadersState, + validator: &ContractValidator, +) -> Flow<()> { + + // Extract client id with a user defined helper `extract_client_id()` function, + let client_id = match extract_client_id(&state) { + Ok(credentials) => credentials, + Err(e) => { + logger::info!("Invalid credentials: {e}"); + + // For simplicity, we are using a user-defined `unathorized_response()` + // helper function for building responses. + return Flow::Break(unauthorized_response("Invalid credentials", 401)); + } + }; + + // Validate authorization + let validation = validator.authorize(&client_id); + + if let Err(e) = validation { + logger::info!("Invalid authentication: {e}"); + return Flow::Break(unauthorized_response("Invalid authentication", 403)); + } + + Flow::Continue(()) +} +---- + +[[custom-credentials-extraction]] +== Custom extraction for client credentials + +Credential extraction can be implemented by invoking `ClientId::new()` and `ClientSecret::new()` methods: + +[source,Rust] +---- +impl ClientId { + pub fn new(client_id: String) -> Self; +} + +impl ClientSecret { + pub fn new(client_secret: String) -> Self; +} +---- + +The next snippet shows how to initialize a set of credentials: + +[source,Rust] +---- + +fn initialize_credentials(raw_client_id: String, raw_client_secret) -> (ClientId, ClientSecret) { + let client_id = ClientId::new(raw_client_id); + let client_secret = ClientSecret::new(raw_client_secret); + + (client_id, client_secret) +} + +---- + +NOTE: `ClientSecret` is implemented in a secure way where it's content is zeroed after use. +It also implements the `Debug` trait without exposing his content. + +[[contract-validator-injection]] +== ContractValidator injection + +The `ContractValidator` object can be injected in the `configure()` function and share it by reference to the filter +as in the next snippet: + +[source,Rust] +---- +#[entrypoint] +async fn configure(launcher: Launcher, validator: ContractValidator) -> Result<(), LaunchError> { + + let filter = on_request(|state, authentication| my_authentication_filter(state, authentication, &validator)); + launcher.launch(filter).await?; + + OK(()) +} +---- + +[[contract-database-polling]] +=== Local Contracts Database polling + +`ContractValidator` object maintains a local copy of the contracts database. This local copy must be polled periodically +in order to maintain the local copy of contracts up to date by invoking the `ContractValidator::update_contracts()` method: + +[source,Rust] +---- + +impl ContractValidator { + pub async fn update_contracts(&self) -> Result<(), UpdateError>; +} + +---- + +The `ContractValidator::update_contracts()` method returns an error that specifies if some connectivity problem occurs +during the contracts database polling. It is responsibility of the programmer the handle retry and error handling heuristics. + +`ContractValidator::update_contracts()` must be invoked periodically in a period specified by the +`ContractValidator::UPDATE_PERIOD` constant: + +[source,Rust] +---- + +async fn update_my_contracts(validator: &ContractValidator, clock: Clock) { + + // Configure a new timer + let timer = clock.period(ContractValidator::UPDATE_PERIOD); + + loop { + // Update result handling should be customized by the programmer + let update_result = validator.update_contracts().await; + + // Wait for the next tick + if !timer.next_tick().await { + // If no more ticks are available, finish the task. + return; + } + } +} +---- + +[source,Rust] +---- +There is a contract database initialization period where the contracts database must be polled in a higher frequency +than update period. The `ContractValidator::INITIALIZATION_PERIOD` specifies the interval required by the initial polling. + +async fn initialize_my_contracts(validator: &ContractValidator, clock: Clock) { + + // Configure a new timer + let timer = clock.period(ContractValidator::UPDATE_PERIOD); + + loop { + // Update result handling should be customized by the programmer + let update_result = validator.update_contracts().await; + + // Wait for the next tick + if !timer.next_tick().await { + // If no more ticks are available, finish the task. + return; + } + } +} + +---- + +The next snippet shows a complete contract polling task, with initialization and update polling periods: + +[source,Rust] +---- +async fn update_my_contracts(validator: &ContractValidator, clock: Clock) { + let initialization_timer = clock.period(ContractValidator::INITIALIZATION_PERIOD); + + loop { + if validator.update_contracts().await.is_ok() { + logger::info!("Contracts storage initialized."); + break; + } + + if !initialization_timer.next_tick().await { + logger::info!("Tick event suspended."); + break; + } + } + + let update_timer = initialization_timer + .release() + .period(ContractValidator::UPDATE_PERIOD); + + loop { + let _ = validator.update_contracts().await; + + if !update_timer.next_tick().await { + logger::info!("Tick event suspended."); + break; + } + logger::info!("Retrying contracts storage initialization."); + } +} +---- + +Since contracts database polling task must run concurrently with `Launcher::launch()` task, the `join!()` macro +from the https://crates.io/crates/futures[futures] crate can help to join both tasks. +The next snippet shows a complete `configure()` function with polling and launching: + +[source,Rust] +---- +#[entrypoint] +async fn configure(launcher: Launcher, clock: Clock,validator: ContractValidator) -> Result<(), LauncherError> { + + let filter = on_request(|state, authentication| my_authentication_filter(state, authentication, &validator)); + + let (_, launcher_result) = join! { + update_my_contracts(&validator, clock), + launcher.launch(filter), + }; + + launcher_result +} +---- + +== See Also + +* xref:policies-pdk-configure-features.adoc[] +* xref:policies-pdk-configure-features-timer.adoc[] +* https://docs.mulesoft.com/api-manager/latest/api-contracts-landing-page[Client Applications, Contracts, and Credentials] + diff --git a/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features.adoc b/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features.adoc index 0505468d8..fb1dfb34b 100644 --- a/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features.adoc +++ b/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features.adoc @@ -183,6 +183,7 @@ PDK provides code examples for the following policy features. Review < Date: Fri, 15 Nov 2024 15:09:34 -0300 Subject: [PATCH 08/15] fix twice methods --- .../ROOT/pages/policies-pdk-configure-features-contracts.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-contracts.adoc b/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-contracts.adoc index 9fee774a8..cafe73a02 100644 --- a/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-contracts.adoc +++ b/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-contracts.adoc @@ -25,7 +25,7 @@ impl ContractValidator { pub fn authenticate(client_id: &ClientId, client_secret: &ClientSecret) -> Result; - pub fn authenticate(client_id: &ClientId, client_secret: &ClientSecret) -> Result; + pub fn authorize(client_id: &ClientId, client_secret: &ClientSecret) -> Result; } ---- From ad86d5e05231c6e018c8057329e8272eaadc073d Mon Sep 17 00:00:00 2001 From: Marina B Date: Wed, 20 Nov 2024 10:45:25 -0800 Subject: [PATCH 09/15] Update pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-timer.adoc --- .../ROOT/pages/policies-pdk-configure-features-timer.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-timer.adoc b/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-timer.adoc index 4cdbad964..caf87f00a 100644 --- a/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-timer.adoc +++ b/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-timer.adoc @@ -66,7 +66,7 @@ The timer provides a method for releasing the `Clock`: pub fn release(self) -> Clock; ---- -This method is useful when you want to reset the tick period in order to create a new timer. +This method is useful if you want to reset the tick period in order to create a new timer. [source,rust] ---- From e22569b8773a97bc4a33fb78206e429149fba9f1 Mon Sep 17 00:00:00 2001 From: Marina B Date: Wed, 20 Nov 2024 10:49:17 -0800 Subject: [PATCH 10/15] Update pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-contracts.adoc --- .../ROOT/pages/policies-pdk-configure-features-contracts.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-contracts.adoc b/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-contracts.adoc index cafe73a02..afd7d6c0c 100644 --- a/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-contracts.adoc +++ b/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-contracts.adoc @@ -98,7 +98,7 @@ async fn my_authentication_filter( } ---- -An authorization request filter could be written in a similar way: +An authorization request filter can be written in a similar way: [source,Rust] ---- From ba06e1f4d0ea3ece277f6fcb77b2e5c1c4f0d917 Mon Sep 17 00:00:00 2001 From: Marina B Date: Wed, 20 Nov 2024 10:57:03 -0800 Subject: [PATCH 11/15] Update antora.yml Change template-policies-url-ver-var to 1.3.0 --- pdk/1.3/antora.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdk/1.3/antora.yml b/pdk/1.3/antora.yml index 9a5fec5f7..154b8cdd9 100644 --- a/pdk/1.3/antora.yml +++ b/pdk/1.3/antora.yml @@ -6,6 +6,6 @@ start_page: policies-pdk-overview.adoc asciidoc: attributes: rust-ver-var: 'v1.74.0' - template-policies-url-ver-var: '1.2.0' + template-policies-url-ver-var: '1.3.0' nav: - modules/ROOT/nav.adoc From 87ec6392dbf90ea67386fb4ad544168d35bcf547 Mon Sep 17 00:00:00 2001 From: Marina B Date: Wed, 20 Nov 2024 13:06:03 -0800 Subject: [PATCH 12/15] avoid tracking vscode files in github --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 5c07fb1f5..9375f10cc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .DS_Store *.DS_Store .idea -*.idea \ No newline at end of file +*.idea +.vscode/* From b232d86c80f238cb797ad69a159123d16d8b5901 Mon Sep 17 00:00:00 2001 From: Marina B Date: Wed, 20 Nov 2024 13:07:33 -0800 Subject: [PATCH 13/15] match change Glenn made for pdk 1.2 --- .../pages/policies-pdk-configure-features-streamproperties.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-streamproperties.adoc b/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-streamproperties.adoc index 704053a63..3274b5a63 100644 --- a/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-streamproperties.adoc +++ b/pdk/1.3/modules/ROOT/pages/policies-pdk-configure-features-streamproperties.adoc @@ -1,4 +1,4 @@ -= Sharing Properties Across Requests += Sharing Data Between Policies ifndef::env-site,env-github[] include::_attributes.adoc[] endif::[] From b5d3904c37869c2ca686f82964f7ba29a02c9a15 Mon Sep 17 00:00:00 2001 From: Marina B Date: Fri, 29 Nov 2024 12:40:28 -0800 Subject: [PATCH 14/15] W-16674836 - Update mule-gateway-org-credentials-mule4.adoc (#730) --- .../modules/ROOT/pages/mule-gateway-org-credentials-mule4.adoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mule-gateway/modules/ROOT/pages/mule-gateway-org-credentials-mule4.adoc b/mule-gateway/modules/ROOT/pages/mule-gateway-org-credentials-mule4.adoc index 1e3df2edd..df5f0051f 100644 --- a/mule-gateway/modules/ROOT/pages/mule-gateway-org-credentials-mule4.adoc +++ b/mule-gateway/modules/ROOT/pages/mule-gateway-org-credentials-mule4.adoc @@ -26,6 +26,8 @@ Because you are required to provide credentials from time to time when using API To obtain environment credentials: . Log in to Anypoint Platform as an administrator, and click *Access Management*. +. In the Access Management navigation menu, click *Business Groups*. +. In the *Business Groups* menu, select your root organization. . Click the *Environments* tab and click the name of your environment within your desired organization. + image::environment-api-manager.png[align=center] From 437cacaec218ff264da9060ef4b666c49de49369 Mon Sep 17 00:00:00 2001 From: Marina B Date: Tue, 3 Dec 2024 01:07:47 -0800 Subject: [PATCH 15/15] restore antora.yml for pdk1.3 --- pdk/1.3/antora.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 pdk/1.3/antora.yml diff --git a/pdk/1.3/antora.yml b/pdk/1.3/antora.yml new file mode 100644 index 000000000..154b8cdd9 --- /dev/null +++ b/pdk/1.3/antora.yml @@ -0,0 +1,11 @@ +name: pdk +title: 'Flex Gateway Policy Development Kit (PDK)' +version: '1.3' +display_version: '1.3' +start_page: policies-pdk-overview.adoc +asciidoc: + attributes: + rust-ver-var: 'v1.74.0' + template-policies-url-ver-var: '1.3.0' +nav: +- modules/ROOT/nav.adoc