1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Fabric Free user による Dataflow Gen 2 の所有権引継ぎをあきらめた話

Posted at

はじめに

Pro ライセンスを持たないユーザーがワークスペースの共同作成者以上のロールが付与されていても、引継ぎができない事象を確認しました。

image.png

この回避策として複製を API で試してみましたが、諦めた記録(ポエム)です。

結論

REST API を使用して引継ぎを実施してみましたが、結局この API も Pro ライセンスないと NG と気づき、あきらめました。

image.png

おそらく引継ぎの API が Power BI の方で動いているから・・・

image.png

ロードマップ には、API のサポートや、名前を付けて保存などがあるので、大人しくこのあたりを待ち、現時点では Power Query テンプレートのエクスポートインポート -> 同期先設定という流れで対処しましょう。

image.png
image.png

ちなみに新しい Dataflow Gen 2 が 先日まで作れていましたが別アイテム Dataflow Gen 2 (CI/CD)となっていたことを推察すると、全く新しい Fabric API で管理されているのでしょう。それによってPro ライセンスでの問題は起きなくなることに期待します。

今回試したことはなにか別のケースの参考になる気もしたのでコードだけ備忘しておきます。

コード実装

Pro ライセンスがないユーザーでの実行は成功しないコードであることに注意

python
import requests
import pandas as pd
from sempy import fabric

def take_over_dataflow_gen2(dataflow_object_id):
    base_url = "https://wabi-japan-east-redirect.analysis.windows.net"
    pbi_token = notebookutils.credentials.getToken("pbi")
    workspace_id = fabric.get_workspace_id()

    # Get workspace metadata
    url_get_workspace = f"{base_url}/metadata/relations/folder/{workspace_id}"
    headers = {"Authorization": f"Bearer {pbi_token}"}
    
    workspace_response = requests.get(url_get_workspace, headers=headers)
    if workspace_response.status_code != 200:
        raise Exception(f"Failed to fetch workspace metadata: {workspace_response.status_code}")
    
    workspace_data = workspace_response.json()
    # アイテムには url で見られる objectid とは別に id が降られています
    df_target_item = pd.json_normalize(workspace_data['artifacts']).query(f"objectId == '{dataflow_object_id}'")

    if df_target_item.empty:
        raise Exception(f"No dataflow found with objectId {dataflow_object_id}")
    
    dataflow_id = df_target_item['id'].iloc[0]

    # Get dataflow metadata
    # id を使用してmetadata/gallery の api から取得すると、workspace と紐づいたfolder_id なるものが取れます。
    url_get_dataflow_metadata = f"{base_url}/metadata/gallery/dataflows/{dataflow_id}"
    dataflow_metadata_response = requests.get(url_get_dataflow_metadata, headers=headers)
    if dataflow_metadata_response.status_code != 200:
        raise Exception(f"Failed to fetch dataflow metadata: {dataflow_metadata_response.status_code}")
    
    dataflow_metadata = dataflow_metadata_response.json()
    folder_id = dataflow_metadata['cdsaModel']['folderId']

    # Take over dataflow
    # 現時点での dataflow 引継ぎは folder id と object id によって動きます。
    url_post_takeover = f"{base_url}/metadata/dataflows/gen2/{dataflow_object_id}/takeover?folderId={folder_id}"
    data = {"isallowNativeQueriesChecked": True}

    takeover_response = requests.post(url_post_takeover, headers=headers, json=data)
    if takeover_response.status_code != 200:
        raise Exception(f"""Failed to take over dataflow 
            status:{takeover_response.status_code},
            response: {takeover_response.json()}""")
    return takeover_response




実行方法

  1. python ノートブックとして起動します。(spark でもよいです
    image.png

  2. Dataflow Gen 2 の設定に移動して、url から dataflow gen2 のobject id を取得します。
    image.png
    image.png

    公開されていないデータフローは設定ボタンが押下できないことに注意

  3. 実行例

    python
    # Example usage
    dataflow_object_id = '65a6bfa4-8f5f-499e-a70f-f9bacfa6f1fa'
    response = take_over_dataflow_gen2(dataflow_object_id)
    print(response.json())  # Print the response from the takeover
    
    
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?