メモ
EDCのConnectorのOpenAPIスペックを出力するための手順がGenerating the OpenApi Spec (*.yaml)に記載されている。 これに従い、試しに出力してみることにする。
ただ、このSpecはいわゆる現在EDCが採用している、Dataspace
Protocol仕様ではないものが含まれている可能性が高い。
pathが/v2
となっているのは、Dataspace Protocol準拠か? →
実際に調べてみると、v2が必ずしも、Dataspace
Protocol向けというわけではなさそうである。
ちなみに、参考までに、IDSA Dataspace ConnectorのOpenAPI Specは Dataspace ConnectorのOpenAPI Spec にある。 このコネクタは昨年からあまり更新されていないので注意。
準備
もしまだソースコードを取得していなければ取得しておく。
1 | git pull git@github.com:eclipse-edc/Connector.git |
生成
ビルド環境にはJDK17を利用したいので、今回はDockerで簡単に用意する。
そのまま実行する場合:
1 | docker run --rm -v ${PWD}:/local --workdir /local openjdk:17-alpine ./gradlew clean resolve |
いったんシェル立ち上げる場合:
1 | docker run -it --rm -v ${PWD}:/local --workdir /local openjdk:17-alpine sh |
BUILD SUCCESSFUL
となったらOK。
ちなみに、このYAMLファイル生成は自前のビルドツールを用いているようだ。参考:SwaggerGeneratorExtension
Data Planeの中身を軽く確認
resources/openapi/yaml/control-api/data-plane-api.yaml
にある、Data Planeを試しに見てみる。
概要
description部分を機械翻訳したのが以下である。
1 | Data PlaneのパブリックAPIはデータプロキシであり、データコンシューマがData Planeインスタンスを通じて、プロバイダのデータソース(バックエンドのRest APIや内部データベースなど)から能動的にデータを問い合わせることを可能にします。 |
企業が持つデータストアをデータソースとしてデータ連携する際、そのプロキシとして働く。
paths
APIのパスを確認する。
transfer
データ転送をリクエストする。 リクエストボディには、データ転送のリクエスト情報が含まれる。
1 | /transfer: |
transfer/{processId}
パラメータprocessId
で与えられたIDのデータ転送処理の状態を確認する。
1 | /transfer/{processId}: |
/{any}
/{any}
以下にはDELETE、GET、PATCH、POST、PUTのOperationが定義されている。
1 | /{any}: |
単純にデータを取得するだけではない。
Transfer Data Plane
resources/openapi/yaml/control-api/transfer-data-plane.yaml
に含まれるのは以下のSpecだった。
トークンを受け取り検証するAPIのようだ。
1 | openapi: 3.0.1 |
control-plane-api
resources/openapi/yaml/control-api/control-plane-api.yaml
にコントロールプレーンのSpecが含まれている。
/transferprocess/{processId}/complete
転送プロセスの完了をリクエストする。 転送が非同期、処理なので、受付成功が返る。
1 | /transferprocess/{processId}/complete: |
/transferprocess/{processId}/fail
転送プロセスを失敗で完了させるリクエストを送る。
1 | post: |
マネージメントAPIの類
resources/openapi/yaml/management-api
以下には、マネージメント系のAPIのSpecが。含まれている。
例えば、
- カタログ: おそらくDataspace
Protocolに対応している。DCATカタログのやり取り。
/v2/catalog/dataset/request
/v2/catalog/request
- データアセット:
データアドレスの情報と合わせて、データアセットを登録する
/v2/assets
- post: 登録
- put: 更新
/v2/assets/request
: クエリに従ってアセット群を取得する/v2/assets/{assetId}/dataaddress
: データアドレスの更新/v2/assets/{id}
- delete: 消す
- get: アセット取得
/v2/assets/{id}/dataaddress
: アドレス取得/v3/assets
... v3とは?- v2とおおよそ同じ
/v3/assets/request
- v2とおおよそ同じ
など。ただ、/v2
としていながら、DSPではなかったりするものがある(例:/v2/contractnegotiations
)など注意が必要。
Dataspace Protocol Architecture
IDS Dataspace Protocolのドキュメント にIDSプロトコル対応の概要が記載されている。
後方互換性
当該ドキュメントに記載の通り、後方互換性を保証するものではない。 新しいプロトコルに対応次第、古い実装は破棄される。
ゴール
- (将来リリースされる?)IDS-TCK(IDS Test Compatibility Kit)の必須項目をパスすること
- Dataspace Protocol仕様を満たす他のコネクタと相互運用可能であること
- Dataspace Protocolよりも前のバージョンのIDSには対応しない。
- Usage Policyは実装しない。他のプロジェクトで実装される。
アプローチ
Dataspace ProtocolはJSON-LD、DCAT、ODRLで実現されている。 このプロトコルの対応で、Contract NegotiationとTransfer Processステートが新たに実装されることになる。 ただし、新しいプロトコルの対応が完了するまで、テストが通るようにする。
- JSON-LD Processing Architecture に基きJSON-LD対応する。
- Dataspace Protocol Endpoints and Services Architecture に基きエンドポイントとサービスの拡張を実装する。
- Dataspace Protocol Contract Negotiation Architecture に基きContract Negotiationマネージャのステートマシンを更新する。
- The Dataspace Protocol Transfer Process Architecture に基きTransfer Processのステートマシンを更新する。
- この1から4項目が安定すると、古いモジュールとサービスが削除される。
- Management APIを更新する。
JSON-LD Processing Architecture
JSON-LD Processing Architecture にJSON-LDを処理するアーキテクチャに関するコンセプトとアプローチが記載されている。
冒頭に記載あるとおり、結果として、JDS InfoModel Java Libraryを用いるのをやめ、JSON-LDメッセージをやり取りすることになる。
既存の TypeManagerに機能付加する。 JSONP対応する。
文書上は、以下のようなコンセプトが例として載っていた。
1 | var mapper = new ObjectMapper(); |
実際に、2023/9/24時点での実装においても、以下のようにTypeManagerに登録されたJSON_JDのマッパーを利用していることが見られます。
org/eclipse/edc/protocol/dsp/api/configuration/DspApiConfigurationExtension.java:128
1 | var jsonLdMapper = typeManager.getMapper(JSON_LD); |
org/eclipse/edc/protocol/dsp/api/configuration/DspApiConfigurationExtension.java:135
1 | private void registerTransformers() { |
特に後者の実装は、各種情報をJSONのオブジェクトに変換するトランスフォーマー(や、その逆)を登録している。 JSON-LDにてメッセージをやりとりしている様子の一端をみられる。
また、ドキュメントの方ではコンセプトとして、以下のような変換の流れが例として挙げられていた。
1 | // message is de-serialized as Map<String, Object> by Jersey |
もし実際の実装をみるのであれば、
org.eclipse.edc.core.transform.transformer.from.JsonObjectFromCatalogTransformer#transform
メソッドのようなものを確認すると良い。
なお、ドキュメントローダとしては、titanium-json-ldが使われているようだ。
参考→ org.eclipse.edc.jsonld.TitaniumJsonLd
Dataspace
Protocol Endpoints and Services Architecture
にもその旨記載されている。
Dataspace Protocol Endpoints and Services Architecture
Dataspace Protocol Endpoints and Services Architecture にIDS Controller Endpoint実装のアプローチが記載されている。
また当該ドキュメントには、以下のように拡張との対応関係が示されている。
Description | Repository | Extension |
---|---|---|
Contract Negotiation | Connector | control-plane-ids |
Transfer Process | Connector | control-plane-ids |
Catalog requests | Connector | catalog-ids |
また前述の通り、Dataspace ProtocolではJSON-LDにてメッセージがやりとりされる。 それらを「(デ)マーシャル」(シリアライズ、デシリアライズ)する必要がある。
デシリアライズは以下のように行われると例示されている。
1 | var document = JsonDocument.of(jsonObject); |
シリアライズは以下のように行われると例示されている。
1 | var document = JsonDocument.of(jsonObject); |
マイグレーションのポイント
大きなポイントの例は、
- アセット(DCATにおけるデータセット)にODRLポリシーであるofferを含むようになること
- データセットはカタログに含まれる。
(もともとEDCが採用していたIDS Infomodelでは、offerにアセットが含まれる)
Contract Definition、Asset、Dataset、ODRL Offerの関係は以下のように表現されていた。
1 | CD = Contract Definition |
上記は包含関係を表している。
また、ProviderにContract Negotiationyや転送タイプをリクエストするためのエンドポイントは、DCAT Distributionである。 Distributionは、コネクタエンドポイントのメタデータとDataAdress属性で示される転送タイプの組み合わせで示される。
なお、現状のEDCではまだ未実装の部分があり、フューチャーワークとされていた。
また、DCAT CatalogやDatasetは名前空間プロパティを使用して拡張可能である必要がある。CatalogDecoratorが必要。
型変換
もともとあったIdsTypeTransfomerを実装し直す必要がある。
これは先に上げていたJsonObjectFromCatalogTransformer
のようなTransformerである。
本ドキュメントには、その実装コンセプト/アプローチが記載されている。
その他
Identificationの取り扱い方についても変更あり。
RemoteMessageDispatcherも変更あり。 以下のようなクラス設計になっている。
1 | RemoteMessageDispatcher (org.eclipse.edc.spi.message) |
Dataspace
Protocol対応は、org.eclipse.edc.protocol.dsp.dispatcher.DspHttpRemoteMessageDispatcherImpl
と考えておくとよい。
Dataspace Protocol Contract Negotiation Architecture
Dataspace Protocol Contract Negotiation Architecture にContract Negotiationの変更アプローチが記載されている。
ステートマシンの変化内容を一覧化した表が載っていた。 表の通り、Dataspace Protocolに対応したのちも、IDSにはもともと無いステートが一部残っている。 Contract Negotiationでは、その状態が重要であるから、より厳密に扱っている印象がある。
EDC Existing | EDC New | IDS | Transition Function | Notes |
---|---|---|---|---|
UNSAVED | (remove) | N/A | This state is not needed | |
INITIAL | INITIAL | N/A | ||
REQUESTING | REQUESTING | N/A | ||
REQUESTED | REQUESTED | REQUESTED | Provider (new & counter) | |
PROVIDER_OFFERING | OFFERING | N/A | ||
PROVIDER_OFFERED | OFFERED | OFFERED | Consumer | |
CONSUMER_OFFERING | (REQUESTING) | |||
CONSUMER_OFFERED | (REQUESTED) | |||
CONSUMER_APPROVING | ACCEPTING | N/A | ||
CONSUMER_APPROVED | ACCEPTED | ACCEPTED | Provider | |
DECLINING | (TERMINATING) | |||
DECLINED | (TERMINATED) | |||
CONFIRMING | AGREEING | N/A | ||
CONFIRMED | AGREED | AGREED | Consumer | |
VERIFYING | N/A | |||
VERIFIED | VERIFIED | Provider | ||
FINALIZING | N/A | |||
FINALIZED | FINALIZED | Consumer | ||
TERMINATING | N/A | |||
TERMINATED | TERMINATED | P & C | ||
ERROR | (TERMINATED) |
参考
プロジェクト
ドキュメント
- Generating the OpenApi Spec (*.yaml)
- IDS Dataspace Protocolのドキュメント
- JSON-LD Processing Architecture
- Dataspace Protocol Endpoints and Services Architecture
- Dataspace Protocol Contract Negotiation Architecture
- The Dataspace Protocol Transfer Process Architecture