Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Workaround Parametrized Host #2

Merged
merged 1 commit into from
Oct 28, 2022

Conversation

joheredi
Copy link

@joheredi joheredi commented Oct 24, 2022

The changes in swagger to work around the parametrized host issue has a negative impact in TS Rest Client as the ApiVersion will now have to be passed on every operation.

Tim was kind enough to put out a fix in M4 Azure/autorest#4657 which I'm using in this change. There is still a gap in the @azure/autorest.typescript plugin to correctly handle it, in the meantime, I have addressed the gap manually.

To make this work I added a few Swagger transforms discussed offline with Laurent

Additionally I'm adding a workaround fix for isUnexpected to work correctly with parametrized host.

): AnomalyDetectorRestClient {
const baseUrl = options.baseUrl ?? `${Endpoint}/anomalydetector`;
const apiVersion = options.apiVersion ?? "v1.1";
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the manual change I had to do:

  1. Add apiVersion to clientOptions
  2. create the apiVersion variable, if options.apiVersion is not provided then, use the default from swagger.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@MaryGao, @qiaozha do you think we can integrate this to the codegen? This is dependent on Azure/autorest#4657

Copy link

@MaryGao MaryGao Oct 25, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I created an issue to track this Azure/autorest.typescript#1635.

I am okay with the temp workaround but regarding the long-term support we need to define below details:

  • Is this logic stick to apiVersion only or general optional host parameter?
  • This param would be required or optional, how to define different behavior in codegen?
  • Do we need to put parameter into AnomalyDetectorClientOption?
export interface AnomalyDetectorClientOption extends ClientOptions {
  apiVersion?: string;
}

Let's talk about them in our issue.

}
// track if we have found a match to return the values found.
let found = true;
for (let i = candidateParts.length - 1; i >= 0; i--) {
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the fix I have for parametrized hosts. Instead of checking from the front. Start at the end and walk our way back, if no mismatch at the end we assume it is the same path.

@MaryGao - What do you think? If this works correctly I think we should be able to easily port it to codegen.

@saintzou66 - would you mind verifying if this fix works?

Copy link

@MaryGao MaryGao Oct 25, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One concern for this - if we have similar suffix of two urls we may miss to match the correct one:

url1: http://localhost:80/service/v1.1/a/b/c      ==> swagger path section: a/b/c
url2: http://localhost:80/service/v1.1/a/b/a/b/c  ==> swagger path section: a/b/a/b/c

Then the a/b/c segment could match both of them. Actually the shorter one would be more accurate.

Do you think we need to add more logic to check if this is the shorter one?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, maybe we need a way to include the whole parametrized host to be sure the match is accurate

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we have such a scenario in this library? If not, we can go with this workaround while we do the long term fix in the codegen

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is no this case in this library

.path("/multivariate/models")
.post(createMultivariateModelParameters);

if (isUnexpected(createModelResult)) {
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated isUnexpected, @saintzou66 can you please verify if this is now working?

Copy link
Owner

@saintzou66 saintzou66 Oct 25, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems isUnexpected is still not working.
Here is the logging:
pathParts:
[ '', 'anomalydetector', 'v1.1', 'multivariate', 'models' ]
candidateParts:
[ '', 'timeseries', 'entire', 'detect' ]
[ '', 'timeseries', 'last', 'detect' ]
[ '', 'timeseries', 'changepoint', 'detect' ]
[ '', 'multivariate', 'models' ]
[ '', 'multivariate', 'models', '{modelId}:detect-batch' ]
[ '', 'multivariate', 'models', '{modelId}:detect-last' ]

As they have different parts of the whole url, the getParametrizedPathSuccess function will always return am empty array.

@joheredi

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a bug when do comparation. We should ignore the first empty string.

}
// track if we have found a match to return the values found.
let found = true;
for (let i = candidateParts.length - 1; i >= 0; i--) {
Copy link

@MaryGao MaryGao Oct 25, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
for (let i = candidateParts.length - 1; i >= 0; i--) {
for (let i = candidateParts.length - 1; i >= 1; i--) {

The first part would always be empty space and will not use to do comparation

// If the candidate part is not a template and
// the parts don't match mark the candidate as not found
// to move on with the next candidate path.
if (candidateParts[i] !== pathParts[i]) {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pathParts.length not always equal with candidateParts.length.

pathParts= [ '', 'anomalydetector', 'v1.1', 'multivariate', 'models' ]
candidateParts = [ '', 'multivariate', 'models' ]

// track if we have found a match to return the values found.
let found = true;
for (let i = candidateParts.length - 1; i >= 0; i--) {
if (candidateParts[i]?.startsWith("{") && candidateParts[i]?.endsWith("}")) {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There will be a pattern like this: /multivariate/models/{modelId}:detect-batch,
It includes {modelId}, but not end with '}'

}
// track if we have found a match to return the values found.
let found = true;
for (let i = candidateParts.length - 1; i >= 0; i--) {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
for (let i = candidateParts.length - 1; i >= 0; i--) {
for (
let i = candidateParts.length - 1, j = pathParts.length - 1;
i >= 1 && j >= 1;
i--, j--
) {

// If the candidate part is not a template and
// the parts don't match mark the candidate as not found
// to move on with the next candidate path.
if (candidateParts[i] !== pathParts[i]) {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if (candidateParts[i] !== pathParts[i]) {
if (candidateParts[i] !== pathParts[j]) {

@saintzou66 saintzou66 merged commit 075acfc into saintzou66:shzo/sdk1013 Oct 28, 2022
saintzou66 pushed a commit that referenced this pull request Oct 28, 2022
* Update maps dependency in pnpm-lock.yaml

* Fix sample metadata errors

* Fix linting errors

* Fix linting errors

* Fix run time error

* Update package.json in samples folder

* Fix linting errors

* Fix linting errors

* Add changelog for maps-common

* Update recording files for maps-search

* Add test.yml for maps-search

* Add tests.yml for render and route

* Update tests.yml

* Update test-resources.json for maps

* Fix tests.yml format error

* Update env vars and remove unused export var

* Remove unused code

* Fix lock file

* Remove route & render

* Replace `beginGet*Batch` with `resume*Batch`

We provide a `beginGet*Batch` method to resume the previous
request previously. This is not ideal because it need to get a
`batchId` which is store in the internal state of the LRO. Once
the LRO brings changes, our code will be broken.

We can achieve the same thing by using serialized state.
This change aims to leverage this approach and create convenience
methods `resume*Batch` for users

* Update recording

* Make the endpoint of `MapsSearchClient` configurable

* Change LatLon from an interface to a tuple

Also remove the `toLatLon` function since creating a tuple
is quite easy.

* Make the props `coordinates` and `countryCodeFilter` optional

Specifying `coordinates` and `countryCodeFilter` can narrow the results
of the fuzzy search. But considring the case like searching "Australia",
theese fields may have no use. We decided to make them optional so user
can decides if they want to narrow down the results or not.

* fixup! Remove route & render

* Adjust CHANGELOGs of maps-search & common

Following the keyvault-common, removing CHANGELOGs
from maps-common since it's not published.

* Update samples

* Add batchRequest sample

* Add a new sample searchAddressResult

* Update search.ts and its examples

* enhance code example in README.md

* comment unused import

* Update recording for maps-search

* remove redundant recording files

* Add maps-search

* Rename LatLong to LatLon

* Fix constructor Readme doc

* Update readme to new signature

* Add tests partially

* Change LatLon/BoundingBox to interfaces

* Reduce the number of constructor overloading

* Rename SearchClient as MapsSearchClient

* Add options mapper tests

* Add result type mapper tests (in progress)

* rename clientId to mapsAccountClientId

* listPolygons -> getPolygons

* getPointOfInterestCategoryTree -> getPointOfInterestCategories

* Expose missing model

* Add alternative input file for quick experiment

* Regenerate code and make changes accordingly

* Reduce number of overloads of fuzzy searches

* Add geojson types

* Adopting new geojson definitions

* Change test specs to align with new method names

* clean up models and tsconfig

* Expose Known* models

* Remove batch sync methods

* Add public tests (non-batch)

* move model

* Add docstrings

* Start polling in begin* method

* Refactor BatchPoller for retrieving batchId

* Finalize batch pollers

* Readd batch methods

* Update generated code

* Finalize batch signature

* Rebuild samples & clean up

* Add AAD tests

* Clean up Swagger readme

* Fix spelling

* Add initial files for @azure/maps-route module

* maps-search: change comments and perform formatting

* Methods options and testing skeleton for maps-route

* maps-search: refactor options

* Improve convenience layer for non-LRO methods

* Change variable names

* Complete batch methods

* update maps-search Readme

* Update maps-route Readme

* Add generated samples for maps-route

* Update samples for maps-search

* Delete backup file

* Add maps-common module

* Update maps-route/maps-search to use maps-common

* maps-render: first draft

* Use LatLon/BoundingBox from maps-common

* Complete maps-render with tests

* Expose required types from maps-route

* Expose required types from maps-search

* Complete unit tests for maps-render

* Update maps-render README

* Update samples

* Fix comment/strings

* Fix comment/strings

* Update Route comment/interface

* Regenerate code

* Update files

* Define required fields and fix code

* Remove non-poller batch methods

* Fix playback test failure

* Rename parts of model names

* Rename remaining parts of models according to review feedback

* Remove TODO comments

* Update Reamdme transform to reflect latest swagger

* Change key policy name

* Simplify batch item error model

* Add brower tests

* Turn maps-common into internal module

* Rearrange Readme

* Rewrite Readme for common

* Remove batch-sync methods

* Route required fields: part 1

* Route required fields: part 2

* Add AAD back

* Route model fixes #1

* Route model fixes #2 + geojson named tuples

* Refine geojson types

* Aliased a few method options

* maps-render required fields part 1

* Do not validate budget parameters

* Revert "Do not validate budget parameters"

This reverts commit 4ec3f5f.

* Rename MapTileset to TileJson

* Render: model rename & type improvement

* Explicitly transform image range

* Fix route record tests

* Update map account creation commands in Readme

* Update Readme/docstrings/samples for Search/Route/Render

* Remove rollup and use dev-tool instead

* Remove some empty tests

* Add AAD test case and make file name shorter

* Update test cases

* Update cspell rules

* Update recording files

* Simplify test cases

* Sync cspell.json from upstream

* Use test-recorder 2.0 and update unit test cases

* Push wrong browsers recording files

* Update settings to support recording

* Fix dependency errors

* Upgrade api-recorder and fix errors

* Code refinement

* Update maps search recording files

* Update karma.conf.js format

* Update recording files and settings

* Fix broken links

* Update maps dependency in pnpm-lock.yaml

* Fix sample metadata errors

* Fix linting errors

* Fix linting errors

* Fix run time error

* Update package.json in samples folder

* Fix linting errors

* Fix linting errors

* Add changelog for maps-common

* Update recording files for maps-search

* Add test.yml for maps-search

* Add tests.yml for render and route

* Update tests.yml

* Update test-resources.json for maps

* Fix tests.yml format error

* Update env vars and remove unused export var

* Remove unused code

* Fix lock file

* Remove maps-render

* fixup! Change LatLon from an interface to a tuple

* Comment the future doc link

* Update doc & fix type issue

* fix lint issues

* Regenerate API View

* Comment the whole [apiref] since the original syntax cannot pass the Analyze/Link verification

* Fix issue related to the change of maps-common

- Replace beginGet*Result with resume* methods
- Turn LatLon to a tuple
- Add mapper to transform the string to Date because resume* method will
return a serialized Date

* Update test recording

* Remove maps-common from the Artifacts

* remove unused dependencies

* Add impression in README so we can track the page views

* Remove `AZURE_LOG_LEVEL` in test.yml

* Update samples

- Move the option parameter to the right place
- Add comments & "break" for handling the type of the search result to make it clear for the user

* Patch {} to properties for GeoJsonPolygon

* rename maxDetourTime to maxDetourTimeInSeconds

* Update recordings

* Remove any

* Rename to detourTimeInSeconds to align the convention

* Change the test.yml EnvVar

See more explanation here:
- Azure#23039 (comment)
- Azure#23039 (comment)

* Rename numResults to numberResults

* Add document comment

* Add endpoint options to MapsRouteClient

* Remove unused dependencies in maps-route

* fixup! Change the test.yml EnvVar

* Update interfaces & documents

* Update changelog

* Merge getRouteDirection with the additional parameter one

* Update samples

* Make the `maps-common to a published package

* Update the import of `maps-common` in `maps-search`

* Fix CI Issue

* Add documents for geojson

* Update the samples & readme

* Leverage maps-common package in mpas-route

* chore update

- Remove the unnecessary rule setting of eslint
- Update the legacy type path

* Remove unnecessary eslint config

* WIP: Remove LRO generation

* WIP: refactor mapsRouteClient

* WIP: first generation

* Format the generated code

* Support AAD

* Transform the model name

* Add helper functions

* Add a sample - route.ts

* Add samples for lro

* Add test

* Generate samples

* Add api view

* Update the generation

* WIP: ReadMe

* Rename "computeBestOrder" to "computeBestWaypointOrder"

* Refine README

* Rename model

* Add test createRouteDirectionsBatchRequest

* Fix lint issue

* Add missing metadata

* Remove maps-route/

* Update CI issue

* Fix merged issue

* Update version rule for maps-common

* Update CI name

* Remove extra lint config

* Use `require` in the README for consistency

* Regenerate the samples

* Remove redundant recording files

* Remove unused parameters in test-resources.json

* Refine readme snippet

* Log something specific for the result

* Update samples

* Split the route.ts into 3

* Remove model rename

* Use default export for RLC factory function

Co-authored-by: Charlie Chen <charlie.chen@microsoft.com>
Co-authored-by: Charlie Chen <yuchungchen@microsoft.com>
Co-authored-by: --global <alankashiwa@gmail.com>
saintzou66 pushed a commit that referenced this pull request Apr 10, 2023
* initial changes stableversion

* old files modified

* Added polling Helper

* Added initial sample and tests

* Added API Review

* Added samples for JS and TS

* pnpm lock file and Readme Update

* Added test and removed locale from readme

* Corrected broken links

* Added dev-tool and eslint

* formatting changes

* Added Browser Recordings

* Code generated from main API

* Added Test Recordings

* Added Samples for JS and TS

* Added Validation Poller

* added champion scenario in single file

* added stop and delete samples

* Update sdk/loadtestservice/load-testing-rest/package.json

Co-authored-by: Deyaaeldeen Almahallawi <dealmaha@microsoft.com>

* added TestRun LRO

* modified upload and validte LRO

* Single Test File for test and testrun

* Samples and LRO changes

* Create Test in LRO removed from sample

* Update sdk/loadtestservice/load-testing-rest/src/beginCreateOrUpdateTestRun.ts

Co-authored-by: Deyaaeldeen Almahallawi <dealmaha@microsoft.com>

* Update sdk/loadtestservice/load-testing-rest/src/beginUploadTestFile.ts

Co-authored-by: Deyaaeldeen Almahallawi <dealmaha@microsoft.com>

* Samples and LRO changes as per review

* Added timeout in samples and test recordings

* New Samples generated and corrected broken link

* Update sdk/loadtestservice/load-testing-rest/samples-dev/stopTest.ts

Co-authored-by: Deyaaeldeen Almahallawi <dealmaha@microsoft.com>

* Update sdk/loadtestservice/load-testing-rest/samples-dev/stopTest.ts

Co-authored-by: Deyaaeldeen Almahallawi <dealmaha@microsoft.com>

* Update sdk/loadtestservice/load-testing-rest/src/beginUploadTestFile.ts

Co-authored-by: Deyaaeldeen Almahallawi <dealmaha@microsoft.com>

* Added Sleep Utility

* Updated Readme

* Updated Changelog

* Updated LRO to take queryparams

* Added Tests for LRO impl

* Generated latest Samples

* GetLROHelper Similar impl

* Review Comment Changes

* Updated imports

* LRO error condtions corrected

* Added AbortSignal Changes

* Added LRO Tests

* Removed Begin Methods and added new recordings for tests

* Corrected Broken Links

* rush file update

* build failure due to core-http formatting

* LRO Helper Changes Done

* Ran API extractor again

* Running empty tests

* Review Comments LRO Helper

* New API review

* LRO helper refactoring

* Updated Samples and Readme

* Throw Error when Abort

* Updated Sample

* Updated API View

* Updated package.json, Readme and Samples

* Updated Release date and core-client version

Co-authored-by: Deyaaeldeen Almahallawi <dealmaha@microsoft.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants