eclipse-basyx / basyx-java-server-sdk

MIT License
55 stars 45 forks source link

[BUG] Milestone 3 breaks Environment API client code generation #391

Closed arteeh closed 2 weeks ago

arteeh commented 1 month ago

Describe the bug With milestone 2 I was able to generate a C# client SDK for Discovery, Shell repository, Submodel repository and Environment APIs using Kiota. With Milestone 3 I can no longer generate a client for the Environment API. The others work fine.

Here's the trace log from running Kiota on my running instance of basyx-environment. It gives a vague error at the end and then doesn't output anything. ``` Trace: KiotaBuilder configuration: {"Generation":{"ShouldGetApiManifest":false,"SkipGeneration":false,"Operation":null,"OpenAPIFilePath":"http://localhost:8081/v3/api-docs","ApiManifestPath":"C:\\REDACTEDBaSyx\\apimanifest.json","OutputPath":"C:\\REDACTEDBaSyx\\.\\Generated","ClientClassName":"EnvironmentClient","ClientNamespaceName":"REDACTEDBaSyx","NamespaceNameSeparator":".","ModelsNamespaceName":"REDACTEDBaSyx.models","Language":0,"PluginTypes":[],"ApiRootUrl":null,"UsesBackingStore":false,"ExcludeBackwardCompatible":true,"IncludeBackwardCompatible":false,"IncludeAdditionalData":true,"Serializers":["Microsoft.Kiota.Serialization.Json.JsonSerializationWriterFactory","Microsoft.Kiota.Serialization.Text.TextSerializationWriterFactory","Microsoft.Kiota.Serialization.Form.FormSerializationWriterFactory","Microsoft.Kiota.Serialization.Multipart.MultipartSerializationWriterFactory"],"Deserializers":["Microsoft.Kiota.Serialization.Json.JsonParseNodeFactory","Microsoft.Kiota.Serialization.Text.TextParseNodeFactory","Microsoft.Kiota.Serialization.Form.FormParseNodeFactory"],"ShouldWriteNamespaceIndices":false,"ShouldWriteBarrelsIfClassExists":false,"CleanOutput":false,"StructuredMimeTypes":["application/json","text/plain;q=0.9","application/x-www-form-urlencoded;q=0.2","multipart/form-data;q=0.1"],"IncludePatterns":[],"ExcludePatterns":[],"PatternsOverride":[],"ClearCache":false,"DisabledValidationRules":[],"MaxDegreeOfParallelism":-1,"IsPluginConfiguration":false,"DisableSSLValidation":false},"Search":{"APIsGuruListUrl":"https://raw.githubusercontent.com/APIs-guru/openapi-directory/gh-pages/v2/list.json","GitHub":{"AppId":"Iv1.9ed2bcb878c90617","ApiBaseUrl":"https://api.github.com","BlockListUrl":"https://raw.githubusercontent.com/microsoft/kiota/main/resources/index-block-list.yml","AppManagement":"https://aka.ms/kiota/install/github"},"ClearCache":false},"Download":{"OutputPath":"./output/result.json","CleanOutput":false,"DisableSSLValidation":false,"ClearCache":false},"Languages":{"CLI":{"MaturityLevel":1,"Dependencies":[{"Name":"Microsoft.Kiota.Abstractions","Version":"1.11.0"},{"Name":"Microsoft.Kiota.Http.HttpClientLibrary","Version":"1.11.0"},{"Name":"Microsoft.Kiota.Serialization.Form","Version":"1.11.0"},{"Name":"Microsoft.Kiota.Serialization.Json","Version":"1.11.0"},{"Name":"Microsoft.Kiota.Authentication.Azure","Version":"1.11.0"},{"Name":"Microsoft.Kiota.Serialization.Text","Version":"1.11.0"},{"Name":"Microsoft.Kiota.Cli.Commons","Version":"1.1.2"}],"DependencyInstallCommand":"dotnet add package {0} --version {1}","ClientClassName":"","ClientNamespaceName":"","StructuredMimeTypes":[]},"CSharp":{"MaturityLevel":2,"Dependencies":[{"Name":"Microsoft.Kiota.Abstractions","Version":"1.11.0"},{"Name":"Microsoft.Kiota.Http.HttpClientLibrary","Version":"1.11.0"},{"Name":"Microsoft.Kiota.Serialization.Form","Version":"1.11.0"},{"Name":"Microsoft.Kiota.Serialization.Json","Version":"1.11.0"},{"Name":"Microsoft.Kiota.Authentication.Azure","Version":"1.11.0"},{"Name":"Microsoft.Kiota.Serialization.Text","Version":"1.11.0"},{"Name":"Microsoft.Kiota.Serialization.Multipart","Version":"1.11.0"}],"DependencyInstallCommand":"dotnet add package {0} --version {1}","ClientClassName":"","ClientNamespaceName":"","StructuredMimeTypes":[]},"Go":{"MaturityLevel":2,"Dependencies":[{"Name":"github.com/microsoft/kiota-abstractions-go","Version":"v1.6.1"},{"Name":"github.com/microsoft/kiota-http-go","Version":"v1.4.3"},{"Name":"github.com/microsoft/kiota-serialization-form-go","Version":"v1.0.0"},{"Name":"github.com/microsoft/kiota-serialization-json-go","Version":"v1.0.7"},{"Name":"github.com/microsoft/kiota-authentication-azure-go","Version":"v1.1.0"},{"Name":"github.com/microsoft/kiota-serialization-text-go","Version":"v1.0.0"},{"Name":"github.com/microsoft/kiota-serialization-multipart-go","Version":"v1.0.0"}],"DependencyInstallCommand":"go get {0}@{1}","ClientClassName":"","ClientNamespaceName":"","StructuredMimeTypes":[]},"Java":{"MaturityLevel":2,"Dependencies":[{"Name":"com.microsoft.kiota:microsoft-kiota-abstractions","Version":"1.2.0"},{"Name":"com.microsoft.kiota:microsoft-kiota-http-okHttp","Version":"1.2.0"},{"Name":"com.microsoft.kiota:microsoft-kiota-serialization-form","Version":"1.2.0"},{"Name":"com.microsoft.kiota:microsoft-kiota-serialization-json","Version":"1.2.0"},{"Name":"com.microsoft.kiota:microsoft-kiota-authentication-azure","Version":"1.2.0"},{"Name":"com.microsoft.kiota:microsoft-kiota-serialization-text","Version":"1.2.0"},{"Name":"com.microsoft.kiota:microsoft-kiota-serialization-multipart","Version":"1.2.0"},{"Name":"jakarta.annotation:jakarta.annotation-api","Version":"3.0.0"}],"DependencyInstallCommand":"{0}:{1}","ClientClassName":"","ClientNamespaceName":"","StructuredMimeTypes":[]},"PHP":{"MaturityLevel":2,"Dependencies":[{"Name":"microsoft/kiota-abstractions","Version":"1.4.0"},{"Name":"microsoft/kiota-http-guzzle","Version":"1.3.0"},{"Name":"microsoft/kiota-serialization-json","Version":"1.3.0"},{"Name":"microsoft/kiota-authentication-phpleague","Version":"1.2.0"},{"Name":"microsoft/kiota-serialization-text","Version":"1.1.0"},{"Name":"microsoft/kiota-serialization-multipart","Version":"1.0.0"},{"Name":"microsoft/kiota-serialization-form","Version":"1.1.1"}],"DependencyInstallCommand":"composer require {0}:{1}","ClientClassName":"","ClientNamespaceName":"","StructuredMimeTypes":[]},"Python":{"MaturityLevel":2,"Dependencies":[{"Name":"microsoft-kiota-abstractions","Version":"1.3.3"},{"Name":"microsoft-kiota-http","Version":"1.3.2"},{"Name":"microsoft-kiota-serialization-json","Version":"1.3.0"},{"Name":"microsoft-kiota-authentication-azure","Version":"1.0.0"},{"Name":"microsoft-kiota-serialization-text","Version":"1.0.0"},{"Name":"microsoft-kiota-serialization-form","Version":"0.1.0"},{"Name":"microsoft-kiota-serialization-multipart","Version":"0.1.0"}],"DependencyInstallCommand":"pip install {0}=={1}","ClientClassName":"","ClientNamespaceName":"","StructuredMimeTypes":[]},"Ruby":{"MaturityLevel":0,"Dependencies":[{"Name":"microsoft_kiota_abstractions","Version":"0.14.4"},{"Name":"microsoft_kiota_faraday","Version":"0.15.0"},{"Name":"microsoft_kiota_serialization_json","Version":"0.9.1"},{"Name":"microsoft_kiota_authentication_oauth","Version":"0.8.0"}],"DependencyInstallCommand":"gem install \u0022{0}\u0022 -v \u0022{1}\u0022","ClientClassName":"","ClientNamespaceName":"","StructuredMimeTypes":[]},"Swift":{"MaturityLevel":0,"Dependencies":[],"DependencyInstallCommand":"","ClientClassName":"","ClientNamespaceName":"","StructuredMimeTypes":[]},"TypeScript":{"MaturityLevel":1,"Dependencies":[{"Name":"@microsoft/kiota-abstractions","Version":"1.0.0-preview.59"},{"Name":"@microsoft/kiota-http-fetchlibrary","Version":"1.0.0-preview.58"},{"Name":"@microsoft/kiota-serialization-form","Version":"1.0.0-preview.48"},{"Name":"@microsoft/kiota-serialization-json","Version":"1.0.0-preview.59"},{"Name":"@microsoft/kiota-authentication-azure","Version":"1.0.0-preview.54"},{"Name":"@microsoft/kiota-serialization-text","Version":"1.0.0-preview.56"},{"Name":"@microsoft/kiota-serialization-multipart","Version":"1.0.0-preview.37"}],"DependencyInstallCommand":"npm install {0}@{1} -SE","ClientClassName":"","ClientNamespaceName":"","StructuredMimeTypes":[]}},"Update":{"OrgName":"microsoft","RepoName":"kiota","Disabled":false}} Debug: KiotaBuilder kiota version 1.17.0 Debug: KiotaBuilder cache file C:\Users\REDACTED\AppData\Local\Temp\kiota\cache\generation\8BDA0BAAA35A629EE553DB234EBDAAD707BD8986787C78156DEECE5B8B8F10C1\api-docs not found, downloading from http://localhost:8081/v3/api-docs Information: KiotaBuilder skipping cache write for URI http://localhost:8081/v3/api-docs as it is a loopback address Information: KiotaBuilder loaded description from remote source Trace: KiotaBuilder 60ms: Read OpenAPI file http://localhost:8081/v3/api-docs Debug: KiotaBuilder step 1 - reading the stream - took 00:00:00.0640603 Trace: KiotaBuilder Parsing OpenAPI file Warning: KiotaBuilder OpenAPI warning: #/paths/~1submodels~1{submodelIdentifier}~1submodel-elements~1{idShortPath}/post - The operation describes multiple response schemas that are divergent. Only the schema of the lowest success status code will be used. Warning: KiotaBuilder OpenAPI warning: #/paths/~1submodels/post - The operation describes multiple response schemas that are divergent. Only the schema of the lowest success status code will be used. Warning: KiotaBuilder OpenAPI warning: #/paths/~1submodels~1{submodelIdentifier}~1submodel-elements/post - The operation describes multiple response schemas that are divergent. Only the schema of the lowest success status code will be used. Warning: KiotaBuilder OpenAPI warning: #/paths/~1shells/post - The operation describes multiple response schemas that are divergent. Only the schema of the lowest success status code will be used. Warning: KiotaBuilder OpenAPI warning: #/paths/~1shells~1{aasIdentifier}~1submodel-refs/post - The operation describes multiple response schemas that are divergent. Only the schema of the lowest success status code will be used. Warning: KiotaBuilder OpenAPI warning: #/paths/~1concept-descriptions/post - The operation describes multiple response schemas that are divergent. Only the schema of the lowest success status code will be used. Trace: KiotaBuilder 122ms: Parsed OpenAPI successfully. 20 paths found. Debug: KiotaBuilder step 2 - parsing the document - took 00:00:00.1244297 Debug: KiotaBuilder step 3 - updating generation configuration from kiota extension - took 00:00:00.0000934 Debug: KiotaBuilder step 4 - filtering API paths with patterns - took 00:00:00.0048009 Information: KiotaBuilder Client root URL set to http://localhost:8081 Debug: KiotaBuilder step 5 - checking whether the output should be updated - took 00:00:00.0166522 Trace: KiotaBuilder 6ms: Created UriSpace tree Debug: KiotaBuilder step 6 - create uri space - took 00:00:00.0069462 Debug: KiotaBuilder InitializeInheritanceIndex 00:00:00.0035151 Trace: KiotaBuilder Creating class EnvironmentClient Trace: KiotaBuilder Creating property submodels of submodelsRequestBuilder Trace: KiotaBuilder Creating property shells of shellsRequestBuilder Trace: KiotaBuilder Creating property conceptDescriptions of conceptDescriptionsRequestBuilder Trace: KiotaBuilder Creating property upload of uploadRequestBuilder Trace: KiotaBuilder Creating property serialization of serializationRequestBuilder Trace: KiotaBuilder Creating property description of descriptionRequestBuilder Trace: KiotaBuilder Creating class serializationRequestBuilder Trace: KiotaBuilder Creating class conceptDescriptionsRequestBuilder Trace: KiotaBuilder Creating class descriptionRequestBuilder Trace: KiotaBuilder Creating class shellsRequestBuilder Trace: KiotaBuilder Creating class submodelsRequestBuilder Trace: KiotaBuilder Creating class uploadRequestBuilder Trace: KiotaBuilder Creating indexer WithCdIdentifier-indexer Trace: KiotaBuilder Creating indexer WithAasIdentifier-indexer Trace: KiotaBuilder Creating indexer WithSubmodelIdentifier-indexer Warning: KiotaBuilder Could not create error type for 400 in uploadEnvironment Warning: KiotaBuilder Could not create error type for 500 in uploadEnvironment Trace: KiotaBuilder Creating method Get of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToGetRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method Get of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method Get of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToGetRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToGetRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method Get of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToGetRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method Post of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method Post of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToPostRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToPostRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating class WithAasIdentifierItemRequestBuilder Trace: KiotaBuilder Creating property assetInformation of assetInformationRequestBuilder Trace: KiotaBuilder Creating property submodelRefs of submodelRefsRequestBuilder Warning: KiotaBuilder Discriminator Capability is not inherited from DataElement. Trace: KiotaBuilder Creating method Get of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToGetRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method Put of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToPutRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method Delete of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToDeleteRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating class assetInformationRequestBuilder Trace: KiotaBuilder Creating property thumbnail of thumbnailRequestBuilder Trace: KiotaBuilder Creating class submodelRefsRequestBuilder Trace: KiotaBuilder Creating indexer WithSubmodelIdentifier-indexer Trace: KiotaBuilder Creating method Get of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToGetRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method Put of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToPutRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating class thumbnailRequestBuilder Warning: KiotaBuilder Discriminator Capability is not inherited from SubmodelElement. Trace: KiotaBuilder Creating method Get of Kiota.Builder.CodeDOM.CodeType Warning: KiotaBuilder Discriminator DataElement is not inherited from SubmodelElement. Trace: KiotaBuilder Creating method Get of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToGetRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToGetRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method Post of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToPostRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating class WithSubmodelIdentifierItemRequestBuilder Trace: KiotaBuilder Creating method Put of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToPutRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method Delete of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToDeleteRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method Delete of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToDeleteRequestInformation of Kiota.Builder.CodeDOM.CodeType Warning: KiotaBuilder Discriminator Capability is not inherited from EventElement. Warning: KiotaBuilder Discriminator DataElement is not inherited from EventElement. Warning: KiotaBuilder Discriminator SubmodelElement is not inherited from EventElement. Warning: KiotaBuilder Discriminator EventElement is not inherited from SubmodelElement. Warning: KiotaBuilder Discriminator EventElement is not inherited from DataElement. Warning: KiotaBuilder Discriminator SubmodelElement is not inherited from DataElement. Warning: KiotaBuilder Discriminator DataElement is not inherited from Capability. Warning: KiotaBuilder Discriminator EventElement is not inherited from Capability. Warning: KiotaBuilder Discriminator SubmodelElement is not inherited from Capability. Trace: KiotaBuilder Creating method Get of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToGetRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method Post of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToPostRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating class WithSubmodelIdentifierItemRequestBuilder Trace: KiotaBuilder Creating property submodelElements of submodelElementsRequestBuilder Trace: KiotaBuilder Creating property Content of ContentRequestBuilder Trace: KiotaBuilder Creating property Metadata of MetadataRequestBuilder Trace: KiotaBuilder Creating method Get of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToGetRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method Put of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToPutRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method Delete of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToDeleteRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating class submodelElementsRequestBuilder Trace: KiotaBuilder Creating class ContentRequestBuilder Trace: KiotaBuilder Creating class MetadataRequestBuilder Trace: KiotaBuilder Creating indexer WithIdShortPath-indexer Trace: KiotaBuilder Creating method Get of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToGetRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method Get of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToGetRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method Get of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToGetRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method Post of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToPostRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating class WithIdShortPathItemRequestBuilder Trace: KiotaBuilder Creating property attachment of attachmentRequestBuilder Trace: KiotaBuilder Creating property invoke of invokeRequestBuilder Trace: KiotaBuilder Creating property Content of ContentRequestBuilder Trace: KiotaBuilder Creating method Get of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToGetRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method Put of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToPutRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method Patch of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method Post of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToPostRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method Delete of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToDeleteRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating class attachmentRequestBuilder Trace: KiotaBuilder Creating method ToPatchRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating class ContentRequestBuilder Trace: KiotaBuilder Creating class invokeRequestBuilder Trace: KiotaBuilder Creating method Get of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToGetRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method Put of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToPutRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method Delete of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToDeleteRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method Get of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToGetRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method Post of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method Patch of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToPostRequestInformation of Kiota.Builder.CodeDOM.CodeType Trace: KiotaBuilder Creating method ToPatchRequestInformation of Kiota.Builder.CodeDOM.CodeType Critical: KiotaBuilder error generating the client: One or more errors occurred. (the type does not contain any information) ```

NSwag is a more popular code generator, but that one has never worked with any version of BaSyx or the IDTA openapi specs. With Milestone 3 it does seem to create a client for the Environment, but when I use it i get exceptions like Newtonsoft.Json.JsonSerializationException: Error converting value "GlobalReference" to type 'Beenen.MS.BaSyx.NSwag.KeyType'. Path 'result[8].semanticId.keys[0].type', line 1, position 2247.

To Reproduce

  1. Run BaSyx locally. I've provided my docker compose file below.
  2. Install the .NET SDK (8.0)
  3. Use this powershell (or bash) script to generate the client with Kiota. I run this script inside the folder of a "BaSyx" C# project as my working directory.
    dotnet tool install --global Microsoft.OpenApi.Kiota
    kiota generate -l CSharp -o ./Generated -n BaSyx -d http://localhost:8084/v3/api-docs -c DiscoveryClient --exclude-backward-compatible --log-level Information --co
    kiota generate -l CSharp -o ./Generated -n BaSyx -d http://localhost:8083/api-docs -c SubmodelRegistryClient --exclude-backward-compatible --log-level Information
    kiota generate -l CSharp -o ./Generated -n BaSyx -d http://localhost:8082/api-docs -c ShellRegistryClient --exclude-backward-compatible --log-level Information
    kiota generate -l CSharp -o ./Generated -n BaSyx -d http://localhost:8081/v3/api-docs -c EnvironmentClient --exclude-backward-compatible --log-level Trace

Expected behavior I can generate client code using the BaSyx OpenAPI specs without errors. I can use the client code to easily interact with the API of BaSyx services.

BaSyx (please complete the following information):

BaSyx configuration

compose.yaml ```yaml services: aas-environment: container_name: aas-environment image: eclipsebasyx/aas-environment:2.0.0-milestone-03.1 restart: unless-stopped volumes: - "./aas-environment.properties:/application/application.properties" networks: - backend ports: - "8081:8081" depends_on: mongo: condition: service_healthy aas-registry: container_name: aas-registry image: eclipsebasyx/aas-registry-log-mongodb:2.0.0-milestone-03.1 restart: unless-stopped volumes: - "./aas-registry.yml:/workspace/config/application.yml" networks: - backend ports: - "8082:8080" depends_on: mongo: condition: service_healthy submodel-registry: container_name: submodel-registry image: eclipsebasyx/submodel-registry-log-mongodb:2.0.0-milestone-03.1 restart: unless-stopped volumes: - "./submodel-registry.yml:/workspace/config/application.yml" networks: - backend ports: - "8083:8080" depends_on: mongo: condition: service_healthy aas-discovery: container_name: aas-discovery image: eclipsebasyx/aas-discovery:2.0.0-milestone-03.1 restart: unless-stopped volumes: - "./aas-discovery.properties:/application/application.properties" networks: - backend ports: - "8084:8081" depends_on: mongo: condition: service_healthy mongo: container_name: mongo image: mongo:5.0 restart: unless-stopped environment: MONGO_INITDB_ROOT_USERNAME: REDACTED MONGO_INITDB_ROOT_PASSWORD: REDACTED ME_CONFIG_MONGODB_URL: mongodb://REDACTED:REDACTED@aasv2-mongodb:27017/ networks: - backend volumes: - mongo-data:/data/db - mongo-config:/data/configdb healthcheck: test: mongo interval: 10s retries: 5 start_period: 1s timeout: 5s aas-gui: container_name: aas-gui image: eclipsebasyx/aas-gui:v2-240801 restart: unless-stopped networks: - backend ports: - "3001:3000" environment: AAS_DISCOVERY_PATH: "http://localhost:8084" AAS_REGISTRY_PATH: "http://localhost:8082" SUBMODEL_REGISTRY_PATH: "http://localhost:8083" AAS_REPO_PATH: "http://localhost:8081/shells" SUBMODEL_REPO_PATH: "http://localhost:8081/submodels" CD_REPO_PATH: "http://localhost:8081/concept-descriptions" networks: backend: volumes: mongo-data: mongo-config: ```
aas-discovery.properties ``` server.port=8081 spring.application.name=AAS Discovery Service basyx.aasdiscoveryservice.name=aas-discovery-service org.eclipse.digitaltwin.basyx.aasdiscoveryservice.backend.AasDiscoveryBackendProvider basyx.backend=MongoDB spring.data.mongodb.host=mongo spring.data.mongodb.port=27017 spring.data.mongodb.database=aas-discovery spring.data.mongodb.authentication-database=admin spring.data.mongodb.username=REDACTED spring.data.mongodb.password=REDACTED basyx.cors.allowed-origins=* basyx.cors.allowed-methods=GET,POST,PATCH,DELETE,PUT,OPTIONS,HEAD ```

aas-environment.properties ``` server.port=8081 spring.application.name=AAS Environment basyx.backend = MongoDB spring.data.mongodb.host=mongo spring.data.mongodb.port=27017 spring.data.mongodb.database=aas-environment spring.data.mongodb.authentication-database=admin spring.data.mongodb.username=REDACTED spring.data.mongodb.password=REDACTED basyx.feature.mqtt.enabled=true basyx.aasrepository.feature.mqtt.enabled=true basyx.aasservice.feature.mqtt.enabled=true basyx.submodelrepository.feature.mqtt.enabled=true mqtt.hostname=emqx mqtt.clientId=aas-environment mqtt.port=1883 basyx.externalurl=http://localhost:8081 basyx.aasrepository.feature.registryintegration=http://aas-registry:8080 basyx.submodelrepository.feature.registryintegration=http://submodel-registry:8080 basyx.cors.allowed-origins=* basyx.cors.allowed-methods=GET,POST,PATCH,DELETE,PUT,OPTIONS,HEAD # To define the maximum size of file to be uploaded in a request (default 1 MB) spring.servlet.multipart.max-file-size=1000MB # To define the total request size for a multipart/form-data (default 10 MB) spring.servlet.multipart.max-request-size=1000MB ```

aas-registry.yml ``` --- basyx: cors: allowed-origins: "*" allowed-methods: "GET,POST,PATCH,DELETE,PUT,OPTIONS,HEAD" spring: data: mongodb: uri: mongodb://REDACTED:REDACTED@mongo:27017 ```

submodel-registry.yml ``` --- basyx: cors: allowed-origins: "*" allowed-methods: "GET,POST,PATCH,DELETE,PUT,OPTIONS,HEAD" spring: data: mongodb: uri: mongodb://REDACTED:REDACTED@mongo:27017 ```

System (please complete the following information):

mdanish98 commented 1 month ago

Hi @arteeh ,

Thanks for raising this issue, we will discuss it internally and get back to you soon.

arteeh commented 1 month ago

It seems that NSwag does work for the Environment API, but only after I change a bunch of enums in the OpenAPI spec from SCREAMING_SNAKE_CASE (like CO_MANAGED_ENTITY) to PascalCase (like CoManagedEntity). Related issue: #296

But NSwag has the annoyance of not being able to 'combine' multiple APIs. So when I make an API for the shell registry and the submodel registry, I'll end up with two AssetAdministrationShellDescriptor classes for example.

Kiota makes a file for each class, so I just generate code for every API and let things overwrite eachother. But Kiota doesn't work with the BaSyx environment API.

arteeh commented 1 month ago

I opened an issue at Kiota about the unclear error message. They added some logging that might help me investigate the problem on Kiota's end.

https://github.com/microsoft/kiota/issues/5136

mdanish98 commented 1 month ago

Hi @arteeh

thanks for providing more details. Since we are utilizing the official API provided by IDTA, generating the code from our API was never a use case that we considered. Would it be possible that you generate the code from their specification?

arteeh commented 1 month ago

I gave the IDTA API spec another try and posted my findings in this issue: https://github.com/admin-shell-io/aas-specs-api/issues/285

Could you please keep this issue open until there is some way (through BaSyx or through IDTA) to get a useful C# client SDK for BaSyx?

(P.S. we are aware of the aas-core-works SDK for C#, but I wrote here why that is not a sufficient replacement for us. Code generation seems like the best option for reaching BaSyx API from C#, when it works.)

mdanish98 commented 1 month ago

Sure, we will keep this issue open :)

aaronzi commented 2 weeks ago

The BaSyx dotnet SDK got an update to AAS V3. It seems to include clients as well. Please check if it includes the features that you need.