Terraform External Data Source not working properly

2.4k Views Asked by At

I am using Terraform External Data Source to get a response from the Azure DevOps rest api (objectId of the branch to be used as further input to other scripts/actions).

I'm calling a python script via the external data source resource as following:

data "external" "example" {
  program = ["python", "ex-data-source.py"]

  query = {
    organisation = "https://dev.azure.com/my-org"
    project = "my-proj"
    repositoryId = "my-repo"
    branch = "heads/my-branch"
    new_branch = "heads/newbranch"
    pat = "my-pat"
  }
}

output "branch_id" {
  value = data.external.example.result.branch_id
}

My ex-data-source.py file is:

import base64
import json
import sys
import requests
from azure.cli.core import get_default_cli

# Step#1 - Parse the input as stdin from terraform external data source
input = sys.stdin.read()
input_json = json.loads(input)

# Step#2 - Extract the relevant data based on key passed
pat = input_json.get("pat")
organisation = input_json.get("organisation")
project = input_json.get("project")
repositoryId = input_json.get("repositoryId")
branch = input_json.get("branch")
new_branch = input_json.get("new_branch")

b64userpass = str(base64.b64encode(bytes(':' + pat, 'ascii')), 'ascii')
headers = {
    'Accept': 'application/json',
    'Authorization': 'Basic %s' % b64userpass
}

list_url = f"https://dev.azure.com/{organisation}/{project}/_apis/git/repositories/{repositoryId}/refs?filtercontain={branch}&api-version=6.1-preview.1"

r = requests.get(list_url, headers=headers)
if r.status_code == 200:
    r_json = r.json()
    branch_id = r_json["value"][0]["objectId"]

# Step#3 - Extract the relevant data based on key passed
output = {
    "objectID": branch_id
}

output_json = json.dumps(output)
print(output_json)

Expected Output ideally I should get back the objectId of the branch e.g. a750b8eb8e26a2e4b9910c10f29e6d55d8639d50

Error received

Error: failed to execute "python": Traceback (most recent call last):
│   File "/Users/metro.akaushik/Desktop/Projects/AzDO/ex-data-source.py", line 42, in <module>
│     "objectID": branch_id
│ NameError: name 'branch_id' is not defined
│ 
│ 
│   with data.external.example,
│   on main.tf line 21, in data "external" "example":
│   21: data "external" "example" {

The python code runs just fine when executed outside of terraform. Please help in resolving the issue, as this lays foundation for my future scripts/actions

The unfiltered api response body is:

{'count': 2,
 'value': [{'creator': {'_links': {'avatar': {'href': 'https://dev.azure.com/xxxx/_apis/GraphProfile/MemberAvatars/aad.xxxxx'}},
                        'descriptor': 'aad.xxxxxx',
                        'displayName': 'xxxxx',
                        'id': 'eb6383c7-bf62-6cec-9ae4-57dc29b68deb',
                        'imageUrl': 'https://dev.azure.com/xxxx/_api/_common/identityImage?id=xxxxx',
                        'uniqueName': 'xxxxx',
                        'url': 'https://spsprodweu1.vssps.visualstudio.com/xxxxx/_apis/Identities/xxxx'},
            'name': 'refs/heads/devops',
            'objectId': 'a750b8eb8e26a2e4b9910c10f29e6d55d8639d50',
            'url': 'https://dev.azure.com/xxxx/xxxxx/_apis/git/repositories/xxxxxx/refs?filter=heads%2Fdevops'},
           {'creator': {'_links': {'avatar': {'href': 'https://dev.azure.com/xxxx/_apis/GraphProfile/MemberAvatars/aad.xxxxx'}},
                        'descriptor': 'aad.xxxxx',
                        'displayName': 'xxxx',
                        'id': 'eb6383c7-bf62-6cec-9ae4-57dc29b68deb',
                        'imageUrl': 'https://dev.azure.com/xxxx/_api/_common/identityImage?id=xxxxx',
                        'uniqueName': 'xxxxx',
                        'url': 'https://spsprodweu1.vssps.visualstudio.com/xxxx/_apis/Identities/xxxx'},
            'name': 'refs/heads/main',
            'objectId': 'a2956c20d33541b337c01f7ddfd5315acc796dfe',
            'url': 'https://dev.azure.com/xxxx/xxxx/_apis/git/repositories/xxxx/refs?filter=heads%2Fmain'}]}
0

There are 0 best solutions below