"""
@module de.stschnell
@version 0.1.0
@runtime python:3.10
@inputType in_url {string}
@inputType in_userName {string}
@inputType in_password {string}
@outputType Properties
Checked with Aria Automation 8.18.0
"""
import base64
import json
import ssl
import urllib.request
def request(
url: str,
user: str | None = None,
password: str | None = None,
bearerToken: str | None = None,
method: str = "GET",
body: dict = {},
contentType: str = "application/json;charset=utf-8",
accept: str = "application/json"
) -> dict | bytes | None:
""" Executes a REST request
@param {string} url - URL to execute the request
@param {string} user
@param {string} password
@param {string} bearerToken
@param {string} method - Method of request, e.g. GET, POST, etc
@param {dictionary} body - Body of request
@param {string} contentType - MIME type of the body for the request
@param {string} accept - MIME type of response content
@returns {dictionary or bytes or None}
"""
returnValue: dict | bytes | None = None
try:
request: urllib.request.Request = urllib.request.Request(
url = url,
method = method,
data = bytes(json.dumps(body).encode("utf-8"))
)
if user and password:
authorization: str = base64.b64encode(
bytes(user + ":" + password, "UTF-8")
).decode("UTF-8")
request.add_header(
"Authorization", "Basic " + authorization
)
if bearerToken:
request.add_header(
"Authorization", "Bearer " + bearerToken
)
request.add_header(
"Content-Type", contentType
)
request.add_header(
"Accept", accept
)
response = urllib.request.urlopen(
request,
context = ssl._create_unverified_context()
)
responseCode: int = response.status
responseRead: bytes = response.read()
if responseCode == 200 or responseCode == 202:
if "json" in accept:
returnValue = json.loads(responseRead)
else:
returnValue = responseRead
except Exception as err:
raise Exception(f"An error occurred at request - {err}") \
from err
return returnValue
def getBearerToken(
url: str,
username: str,
password: str
) -> str | None:
""" Gets the Bearer token
@param {string} url
@param {string} username
@param {string} password
"""
returnValue: str | None = None
try:
login: dict = {
"username": username,
"password": password
}
refreshToken: str = request(
url = url + "/csp/gateway/am/api/login?access_token",
method = "POST",
body = login
)["refresh_token"]
bearerToken: str = request(
url = url + "/iaas/api/login",
method = "POST",
body = { "refreshToken": refreshToken }
)["token"]
returnValue = bearerToken
except Exception as err:
raise ValueError(f"An error occurred at get Bearer token - {err}") \
from err
return returnValue
def handler(context: dict, inputs: dict) -> dict:
""" Aria Automation standard handler, the main function.
"""
url: str = "https://auto.vcf.sddc.lab"
username: str = "holadmin@vcf.holo.lab"
password: str = "VMware123!"
# url: str = inputs["in_url"]
# username: str = inputs["in_userName"]
# password: str = inputs["in_password"]
outputs: dict = {}
try:
bearerToken: str | None = getBearerToken(
url,
username,
password
)
outputs = {
"status": "done",
"error": None,
"result": bearerToken
}
except Exception as err:
outputs = {
"status": "incomplete",
"error": repr(err),
"result": None
}
return outputs
|