openstack-helm-addons/ranger-agent/templates/bin/_ranger-agent-test.py.tpl

164 lines
5.0 KiB
Smarty

#!/usr/bin/env python
import base64
import os
import json
import requests
import sys
import uuid
import time
def get_token():
headers = {'Content-Type': 'application/json'}
keystone_ep = os.environ['OS_AUTH_URL']
url = keystone_ep + '/auth/tokens'
data = {
"auth": {
"identity": {
"methods": [
"password"
],
"password": {
"user": {
"name": os.environ['OS_USERNAME'],
"domain": {
"name": os.environ['OS_USER_DOMAIN_NAME']
},
"password": os.environ['OS_PASSWORD']
}
}
},
"scope": {
"project": {
"domain": {
"name": os.environ['OS_PROJECT_DOMAIN_NAME']
},
"name": os.environ['OS_PROJECT_NAME']
}
}
}
}
try:
verify = os.environ['CAFILE'] or False
resp = requests.post(
url, data=json.dumps(data), headers=headers,
verify=verify, timeout=100)
if resp.status_code != 201:
sys.stderr.write("Failed to get token for region: %s - %s\n" %
(resp.status_code, resp.text,))
sys.exit(1)
token = resp.headers['x-subject-token']
return token
except Exception as exp:
sys.stderr.write(
"Exp: Failed to get token for region: %s\n" % str(exp))
sys.exit(1)
def notify_ranger_agent_api(uuid):
""" Send notification message to Ranger-agent-api. """
region = os.environ['OS_REGION_NAME']
url = os.environ['RANGER_SERVICE_URL']
# get token for region and send to ranger-agent-api
headers = {}
headers['X-Auth-Token'] = get_token()
# Prepare the request body
data_to_send = {
'ord-notifier': {
'request-id': uuid,
'resource-id': uuid,
'resource-type': 'flavor',
'resource-template-version': '1',
'resource-template-name': 'sanity-test.yaml',
'resource-template-type': 'hot',
'operation': 'create',
'region': region
}
}
invalid_template_data = 'template: heat_template_version: 2020-01-01'
files = {
'json': (None, json.dumps(data_to_send), 'application/json'),
'file': ('heat_template',
base64.b64encode(invalid_template_data.encode()),
'application/yaml')}
exit_code = 1
# Retry up to 5 times
for i in range(5):
time.sleep(15)
try:
resp = requests.post(url,
files=files,
headers=headers,
timeout=100)
if resp.status_code != 200:
message = 'failure respond code [%d] received.' % (
resp.status_code)
sys.stderr.write("ORD notification failed: %s\n" % message)
continue
else:
ord_status = resp.json()['ord-notifier-response']['status']
if ord_status == 'Submitted':
sys.stderr.write("ORD notification completed.\n")
exit_code = 0
break
else:
sys.stderr.write("Unexpected ord status: %s\n" %
ord_status)
continue
except Exception as exp:
sys.stderr.write(
"Exp: Failed to post resource: %s\n" % str(exp))
continue
if exit_code:
sys.exit(exit_code)
def validate_resource_status(uuid):
url = os.environ['RANGER_SERVICE_URL']
expected_code = os.environ['END_STATUS_KEY']
exit_code = 1
url = "{}?Id={}".format(url, uuid)
# Retry up to 5 times
for i in range(5):
time.sleep(15)
try:
resp = requests.get(url, timeout=100)
if resp.status_code != 200:
sys.stderr.write("Unexpected status code received: %s\n" %
resp.status_code)
continue
else:
ord_error = resp.json()['rds-listener']['error-code']
if ord_error == expected_code:
sys.stderr.write("Expected error code received: %s\n" %
ord_error)
exit_code = 0
break
else:
sys.stderr.write("Unexpected error code received: %s\n" %
ord_error)
continue
except Exception as exp:
sys.stderr.write(
"Exp: Failed to get resource status: %s\n" % str(exp))
continue
sys.exit(exit_code)
if __name__ == "__main__":
test_uuid = uuid.uuid1().hex
notify_ranger_agent_api(test_uuid)
validate_resource_status(test_uuid)