aboutsummaryrefslogtreecommitdiffstats
path: root/examples/policies/policy_utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/policies/policy_utils.py')
-rw-r--r--examples/policies/policy_utils.py192
1 files changed, 192 insertions, 0 deletions
diff --git a/examples/policies/policy_utils.py b/examples/policies/policy_utils.py
new file mode 100644
index 0000000..0c1b595
--- /dev/null
+++ b/examples/policies/policy_utils.py
@@ -0,0 +1,192 @@
+from jinja2 import Template
+import json
+import os
+import requests
+import sys
+
+BASE_DIR = os.path.dirname(os.path.dirname(__file__))
+
+HEADERS = {'Content-Type': 'application/json'}
+AUTH = requests.auth.HTTPBasicAuth('healthcheck', 'zb!XztG34')
+
+
+def get_tosca_policy(policy):
+ pol = json.loads(policy)
+ tosca_policy = {
+ 'tosca_definitions_version': 'tosca_simple_yaml_1_1_0',
+ 'topology_template': {
+ 'policies': [pol]
+ }
+ }
+ return json.dumps(tosca_policy)
+
+def gen_policy(template_dir, gen_dir, filename, jinja_args):
+ with open(os.path.join(template_dir, filename), 'r') as file:
+ contents = file.read()
+ tm = Template(contents)
+ gen = tm.render(jinja_args)
+ tosca_policy = get_tosca_policy(gen)
+ with open(os.path.join(gen_dir, filename), 'w') as file:
+ file.write(tosca_policy)
+
+def create_and_push_policies(policy_dir):
+ for filename in os.listdir(policy_dir):
+ if filename.endswith('.json'):
+ with open(os.path.join(policy_dir, filename), 'r') as file:
+ data = json.loads(file.read())
+ metadata = create_policy(data)
+ if metadata:
+ push_policy(metadata)
+
+def delete_policies(policy_dir):
+ for filename in os.listdir(policy_dir):
+ if filename.endswith('.json'):
+ with open(os.path.join(policy_dir, filename), 'r') as file:
+ data = json.loads(file.read())
+ policy_id = list(data['topology_template']['policies'][0].keys())[0]
+ undeploy_policy(policy_id)
+ metadata = delete_policy(data)
+
+def create_policy(data):
+ policy = data['topology_template']['policies'][0]
+ content = policy[list(policy.keys())[0]]
+ policy_type = content['type']
+ type_version = content['type_version']
+ policy_url = "https://policy-api:6969"
+ path = '/policy/api/v1/policytypes/{}/versions/{}/policies'.format(policy_type, type_version)
+ url = policy_url + path
+ try:
+ response = requests.post(url, headers=HEADERS, auth=AUTH, data=json.dumps(data), verify=False)
+ except Exception as e:
+ print(str(e))
+ return None
+ if response.status_code == 200:
+ print('Policy {} created'.format(content['metadata']['policy-id']))
+ return content['metadata']
+ else:
+ print(response.content)
+ return None
+
+def push_policy(metadata):
+ data = {'policies': [metadata]}
+ policy_url = "https://policy-pap:6969"
+ path = '/policy/pap/v1/pdps/policies'
+ url = policy_url + path
+ try:
+ response = requests.post(url, headers=HEADERS, auth=AUTH, data=json.dumps(data), verify=False)
+ except Exception as e:
+ print(str(e))
+ print("Cannot push policy {}".format(metadata['policy-id']))
+ if response.status_code == 200:
+ print("Policy {} pushed".format(metadata['policy-id']))
+ else:
+ print(response.content)
+
+def undeploy_policy(policy_id):
+ policy_url = "https://policy-pap:6969"
+ path = '/policy/pap/v1/pdps/policies/{}'.format(policy_id)
+ url = policy_url + path
+ try:
+ response = requests.delete(url, headers=HEADERS, auth=AUTH, verify=False)
+ except Exception as e:
+ print(str(e))
+ print("Cannot undeploy policy {}".format(policy_id))
+ if response.status_code == 200:
+ print("Policy {} undeployed".format(policy_id))
+ else:
+ print(response.content)
+
+def delete_policy(data):
+ policy = data['topology_template']['policies'][0]
+ content = policy[list(policy.keys())[0]]
+ policy_type = content['type']
+ type_version = content['type_version']
+ policy_id = content['metadata']['policy-id']
+ version = content['version']
+ policy_url = "https://policy-api:6969"
+ path = '/policy/api/v1/policytypes/{}/versions/{}/policies/{}/versions/{}'.format(policy_type, type_version, policy_id, version)
+ url = policy_url + path
+ try:
+ response = requests.delete(url, headers=HEADERS, auth=AUTH, data=json.dumps(data), verify=False)
+ except Exception as e:
+ print(str(e))
+ return None
+ if response.status_code == 200:
+ print('Policy {} deleted'.format(content['metadata']['policy-id']))
+ return content['metadata']
+ else:
+ print(response.content)
+ return None
+
+def generate_nssi_policies(jinja_args):
+ template_dir = BASE_DIR + 'nssi_policies'
+ gen_dir = BASE_DIR + 'gen_nssi_policies'
+
+ if not os.path.exists(gen_dir):
+ os.mkdir(gen_dir)
+
+ for filename in os.listdir(template_dir):
+ if filename.endswith('.json'):
+ gen_policy(template_dir, gen_dir, filename, jinja_args)
+
+def generate_nsi_policies(jinja_args):
+ template_dir = BASE_DIR + 'nsi_policies'
+ gen_dir = BASE_DIR + 'gen_nsi_policies'
+
+ if not os.path.exists(gen_dir):
+ os.mkdir(gen_dir)
+
+ for filename in os.listdir(template_dir):
+ if filename.endswith('.json'):
+ gen_policy(template_dir, gen_dir, filename, jinja_args)
+
+def create_policy_types(policy_dir):
+ for filename in os.listdir(policy_dir):
+ if filename.endswith('.json'):
+ with open(os.path.join(policy_dir, filename), 'r') as file:
+ data = json.loads(file.read())
+ create_policy_type(data)
+
+def create_policy_type(data):
+ policy_url = "https://policy-api:6969"
+ path = '/policy/api/v1/policytypes'
+ url = policy_url + path
+ try:
+ response = requests.post(url, headers=HEADERS, auth=AUTH, data=json.dumps(data), verify=False)
+ except Exception as e:
+ print(str(e))
+ return None
+ if response.status_code == 200:
+ print('Policy type created')
+ else:
+ print(response.content)
+ return None
+
+
+action = sys.argv[1]
+
+if action == "generate_nssi_policies":
+ jinja_args = {
+ 'service_name': sys.argv[2],
+ 'goal': sys.argv[3],
+ 'attribute': sys.argv[4]
+ }
+ generate_nssi_policies(jinja_args)
+
+elif action == "create_and_push_policies":
+ policy_dir = sys.argv[2]
+ create_and_push_policies(policy_dir)
+
+elif action == "delete_policies":
+ policy_dir = sys.argv[2]
+ delete_policies(policy_dir)
+
+elif action == "generate_nsi_policies":
+ jinja_args = {
+ 'service_name': sys.argv[2]
+ }
+ generate_nsi_policies(jinja_args)
+
+elif action == "create_policy_types":
+ policy_dir = sys.argv[2]
+ create_policy_types(policy_dir) \ No newline at end of file