0

If I run a post request like this, it works:

def myFunction():
  contentTypeHeader = {
    'Content-type': 'application/json',
  }
 
  data = """
  {
  "target": {
    "ref_type": "branch",
    "type": "pipeline_ref_target",
    "ref_name": "master",
  "selector": {
    "type": "custom",
    "pattern" : "mypipeline"
    }
  },
  "variables": []
  }
  """

  http = urllib3.PoolManager()
  headers = urllib3.make_headers(basic_auth='{}:{}'.format("username", "password"))
  headers = dict(list(contentTypeHeader .items()) + list(headers.items()))
  try:
    resp = http.urlopen('POST', 'https://api.bitbucket.org/2.0/repositories/owner/slugg/pipelines/', headers=headers, body=data)
    print('Response', str(resp.data))
  except Exception as e:
    print('Error', e)


myFunction()

However, if instead of hardcoding the values, I try to pass them on as a function:

def myFunction(bitbucket_branch, pipeline_name):
  contentTypeHeader = {
    'Content-type': 'application/json',
  }
  
  data = """
  {
  "target": {
    "ref_type": "branch",
    "type": "pipeline_ref_target",
    "ref_name": "${bitbucket_branch}",
  "selector": {
    "type": "custom",
    "pattern" : "${pipeline_name}"
    }
  },
  "variables": []
  }
  """
...


 myFunction("master","mypipeline")

I get this error:

Response b'{"error": {"message": "Not found", "detail": "Could not find last reference for branch ${bitbucket_branch}", "data": {"key": "result-service.pipeline.reference-not-found", "arguments": {"uuid": "${bitbucket_branch}"}}}}'

Additionally, in my function :

def myFunction(bitbucket_branch, pipeline_name):

the parameters are still in a light color in my VSCode, which indicates that the parameters aren't actually being used in the function.

Perhaps I am doing something wrong with encoding strings but can't figure out what exactly.

1 Answer 1

1

Python does not expand ${pipeline_name} inside strings for you; this is a feature of Javascript template strings (and is not part of JSON) - so unless you run actual Javascript, this is not going to work.

However, python have f-strings, which does the same:

def myFunction(bitbucket_branch, pipeline_name):
  contentTypeHeader = {
    'Content-type': 'application/json',
  }

  # notice the added f and removal of $
  data = f"""    
  {
  "target": {
    "ref_type": "branch",
    "type": "pipeline_ref_target",
    "ref_name": "{bitbucket_branch}",
  "selector": {
    "type": "custom",
    "pattern" : "{pipeline_name}"
    }
  },
  "variables": []
  }
  """

This will replace the content in {} inside your string with the values from the variables. I'd also like to mention that you might want to declare this as a Python structure instead and use json.dumps to transform it to JSON. That way you can do anything you're used to in Python, instead of having a JSON template and replacing values inside that template (if either of these values contain ", you'll end up generating invalid JSON in this case).

import json

def myFunction(bitbucket_branch, pipeline_name):
  data = {
    "target": {
      "ref_type": "branch",
      "type": "pipeline_ref_target",
      "ref_name": bitbucket_branch,
      "selector": {
        "type": "custom",
        "pattern" : pipeline_name
        }
      },
      "variables": []
    }
  }

  return json.dumps(data)
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.