+ Handles GET /a1-p/policytypes/policy_type_id/policies
+ """
+ return _try_func_return(lambda: data.get_instance_list(policy_type_id))
+
+
+def get_policy_instance(policy_type_id, policy_instance_id):
+ """
+ Handles GET /a1-p/policytypes/polidyid/policies/policy_instance_id
+ """
+ return _try_func_return(lambda: data.get_policy_instance(policy_type_id, policy_instance_id))
+
+
+def get_policy_instance_status(policy_type_id, policy_instance_id):
+ """
+ Handles GET /a1-p/policytypes/polidyid/policies/policy_instance_id/status
+
+ Return the aggregated status. The order of rules is as follows:
+ 1. If a1 has received at least one status, and *all* received statuses are "DELETED", we blow away the instance and return a 404
+ 2. if a1 has received at least one status and at least one is OK, we return "IN EFFECT"
+ 3. "NOT IN EFFECT" otherwise (no statuses, or none are OK but not all are deleted)
+ """
+
+ def get_status_handler():
+ vector = data.get_policy_instance_statuses(policy_type_id, policy_instance_id)
+ for i in vector:
+ if i == "OK":
+ return "IN EFFECT", 200
+ return "NOT IN EFFECT", 200
+
+ return _try_func_return(get_status_handler)
+
+
+def create_or_replace_policy_instance(policy_type_id, policy_instance_id):
+ """
+ Handles PUT /a1-p/policytypes/polidyid/policies/policy_instance_id
+ """
+ instance = connexion.request.json
+
+ def put_instance_handler():
+ """
+ Handles policy instance put
+
+ For now, policy_type_id is used as the message type
+ """
+ # validate the PUT against the schema
+ schema = data.get_policy_type(policy_type_id)["create_schema"]
+ validate(instance=instance, schema=schema)
+
+ # store the instance
+ data.store_policy_instance(policy_type_id, policy_instance_id, instance)
+
+ # send rmr (best effort)
+ body = _gen_body_to_handler("CREATE", policy_type_id, policy_instance_id, payload=instance)
+ a1rmr.queue_work({"payload": json.dumps(body), "msg type": policy_type_id})
+
+ return "", 202
+
+ return _try_func_return(put_instance_handler)
+
+
+def delete_policy_instance(policy_type_id, policy_instance_id):
+ """
+ Handles DELETE /a1-p/policytypes/polidyid/policies/policy_instance_id
+ """
+
+ def delete_instance_handler():
+ """
+ here we send out the DELETEs but we don't delete the instance until a GET is called where we check the statuses
+ """
+ data.instance_is_valid(policy_type_id, policy_instance_id)
+
+ # send rmr (best effort)
+ body = _gen_body_to_handler("DELETE", policy_type_id, policy_instance_id)
+ a1rmr.queue_work({"payload": json.dumps(body), "msg type": policy_type_id})
+
+ return "", 202
+
+ return _try_func_return(delete_instance_handler)