#!/bin/env python3
import os
import sys
import subprocess
import json

OCF_FUNCTIONS_DIR = os.environ.get("OCF_FUNCTIONS_DIR", "%s/lib/heartbeat" % os.environ.get("OCF_ROOT"))
sys.path.append(OCF_FUNCTIONS_DIR)
import ocf


def do_cmd(cmd):
    ocf.logger.info("do_cmd: %s", str(cmd))
    ret = subprocess.run(cmd, stdout=subprocess.PIPE)
    return ret.returncode, ret.stdout


def graid_dg_ha_status():
    dg_uuid = ocf.get_parameter("dgUUID")
    if dg_uuid == None or dg_uuid == "":
        return ocf.OCF_ERR_ARGS
    cmd = ["graidctl", "desc", "dg", "--format=json", "--uuid", dg_uuid]
    rc, output = do_cmd(cmd)

    if rc != 0:
        return ocf.OCF_NOT_RUNNING

    result = json.loads(output)
    if result["ErrorCode"] != 0:
        return ocf.OCF_NOT_RUNNING

    dg_state = result["Result"]["State"]
    #pd_ids = result["Result"]["PdIds"]

    if dg_state == "OFFLINE" or dg_state == "FAILED":
        return ocf.OCF_NOT_RUNNING

    return ocf.OCF_SUCCESS


def graid_dg_ha_start():
    if graid_dg_ha_status() == ocf.OCF_SUCCESS:
        return ocf.OCF_SUCCESS

    dg_uuid = ocf.get_parameter("dgUUID")
    if dg_uuid == None or dg_uuid == "":
        return ocf.OCF_ERR_ARGS
    cmd = ["graidctl", "import", "foreign_dg", dg_uuid]
    rc, output = do_cmd(cmd)
    if rc == 0:
        return ocf.OCF_SUCCESS
    else:
        return ocf.OCF_ERR_GENERIC


def graid_dg_ha_stop():
    if graid_dg_ha_status() != ocf.OCF_SUCCESS:
        return ocf.OCF_SUCCESS

    dg_uuid = ocf.get_parameter("dgUUID")
    if dg_uuid == None or dg_uuid == "":
        return ocf.OCF_ERR_ARGS
    cmd = ["graidctl", "export", "dg", "--uuid", dg_uuid]
    rc, output = do_cmd(cmd)
    if rc == 0:
        return ocf.OCF_SUCCESS
    else:
        return ocf.OCF_ERR_GENERIC


def graid_dg_ha_validate_all():
    if ocf.is_probe():
        return ocf.OCF_SUCCESS
    dg_uuid = ocf.get_parameter("dgUUID")
    if dg_uuid == None or dg_uuid == "":
        return ocf.OCF_ERR_ARGS
    return ocf.OCF_SUCCESS


def main():
    agent = ocf.Agent("graid-dg-ha",
                      shortdesc="This is a resource agent for Graid DG HA.",
                      longdesc="This is a resource agent for Graid DG HA.")
    agent.add_parameter("dgUUID",
                        shortdesc="Graid DG UUID",
                        longdesc="This parameter specifies Graid DG UUID.",
                        content_type="string",
                        default="")
    agent.add_action("start", timeout=60, handler=graid_dg_ha_start)
    agent.add_action("stop", timeout=60, handler=graid_dg_ha_stop)
    agent.add_action("status", timeout=60, handler=graid_dg_ha_status)
    agent.add_action("monitor", timeout=60, handler=graid_dg_ha_status)
    agent.add_action("validate-all", timeout=60, handler=graid_dg_ha_validate_all)
    agent.run()

if __name__ == "__main__":
    main()

