#!/bin/bash -x
# A-A集群中的卷必须改成lvmlockd锁
# HA集群中的卷使用tagging，没必要搞复杂了
# 双控环境下必须接管全部lvm和zfs

# env:
#   CLUSTER

if [ -z "$SSH" ];then
    source /unas/sbin/dualcontroller/config/prepare
fi

if [ -z "$PCS" ];then
    PCS=pcs
fi

if [ -z "$CLUSTER" ];then
    CLUSTER=$(pcs cluster config | grep "Cluster Name:" | awk '{print $3}' || pcs status | grep "Cluster name:" | awk '{print $3}')
fi

all_vgs() {
    vgs --noheadings -o vg_name
}

all_lvm_in_vg() {
    lvs --noheadings -o lv_name "$vgname"
}

vg_dlm_configured() {
    if vgs "$vgname" --options=vg_lock_type --noheadings | grep -q dlm;then
        if vgs "$vgname" --options=vg_lock_args --noheadings | grep -wq "$CLUSTER";then
            return 0
        else
            # dlm 锁开了，但是配置里的cluster name不对
            # 清掉锁，让后续流程重新配置
            vgchange --locktype none --lockopt force -y "$vgname"
            return 1
        fi
    else
        return 1
    fi
}

share_vg() {
    if vg_dlm_configured;then
        echo "VG $vgname already shared with dlm lock"
    else
        echo "Converting VG $vgname to shared with dlm lock"
        # 先在全部节点上停用
        /unas/sbin/dualcontroller/tool/nodes "partprobe; umount -f /dev/$vgname/*; sed -i '\#/dev/$vgname/#d;\#/dev/mapper/$vgname-#d' /etc/fstab ; vgchange -an '$vgname'|| :"
        vgchange --locktype dlm "$vgname"
    fi
    # 共享卷必须是集群管理，为每个卷创建资源，并设置依赖关系
    for lv in $(all_lvm_in_vg);do
        res_lv_name=LV_$(echo "$vgname" | sed 's/_/__/g')_$(echo "$lv" | sed 's/_/__/g')
        if $PCS resource config $res_lv_name;then
            echo "Resource $res_lv_name already exists, skipping"
            continue
        fi
        echo "Setting lvmlockd lock for /dev/$vgname/$lv ($res_lv_name)"
        $PCS resource create $res_lv_name ocf:heartbeat:LVM-activate \
            vgname="$vgname" \
            vg_access_mode=lvmlockd \
            lvname="$lv" \
            activation_mode=shared \
            op monitor interval=30s timeout=90s
        $PCS resource clone $res_lv_name meta clone-max=2 clone-node-max=1 notify=true interleave=true
        $PCS constraint colocation add $res_lv_name-clone with lvmlockd-clone
        $PCS constraint order lvmlockd-clone then $res_lv_name-clone
    done
}

lvm_activation() {
    # 先在全部节点上停用
    /unas/sbin/dualcontroller/tool/nodes "partprobe; umount -f /dev/$vgname/*; sed -i '\#/dev/$vgname/#d;\#/dev/mapper/$vgname-#d' /etc/fstab|| :"
    # 共享卷必须是集群管理，为每个卷创建资源，并设置依赖关系
    for lv in $(all_lvm_in_vg);do
        res_lv_name=LV_$(echo "$vgname" | sed 's/_/__/g')_$(echo "$lv" | sed 's/_/__/g')
        if $PCS resource config $res_lv_name;then
            echo "Resource $res_lv_name already exists, skipping"
            continue;
        else
            $PCS resource create $res_lv_name ocf:heartbeat:LVM-activate \
                vgname="$vgname" \
                lvname="$lv" \
                vg_access_mode="tagging"\
                op monitor interval=30s timeout=90s \
                op start  interval=0s  timeout=600s on-fail=ignore
            $PCS constraint colocation add $res_lv_name with UNAS_Main_Node
            $PCS constraint order $res_lv_name then disk_ready kind=Optional
        fi
    done
}

for vgname in $(all_vgs);do
    if [ "$RUNMODE" == "aa" ]; then
        # 双活模式，直接共享卷
        share_vg
    else
        # 主备模式
        lvm_activation
    fi
done
