#!/bin/bash
#    Licensed under the Apache License, Version 2.0 (the "License"); you may
#    not use this file except in compliance with the License. You may obtain
#    a copy of the License at
#
#         http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
#    License for the specific language governing permissions and limitations
#    under the License.

# Save trace setting
XTRACE=$(set +o | grep xtrace)
set -o xtrace

KURYR_CONT=$(trueorfalse False KURYR_K8S_CONTAINERIZED_DEPLOYMENT)
KURYR_OVS_BM=$(trueorfalse True KURYR_CONFIGURE_BAREMETAL_KUBELET_IFACE)


source $DEST/kuryr-kubernetes/devstack/lib/kuryr_kubernetes
source $DEST/kuryr-kubernetes/devstack/lib/kubernetes


if is_service_enabled kuryr-kubernetes kuryr-daemon \
    kuryr-kubernetes-worker; then
    # There are four services provided by this plugin.
    #
    # Those two are needed for non-containerized deployment, otherwise,
    # run_process will not create systemd units thus run the service. For
    # containerized one, kuryr-daemon can be omitted, but you'll still need
    # kuryr-kubernetes to be able to install and run kuryr/k8s bits.
    #
    # * kuryr-kubernetes (no change from former version)
    # * kuryr-daemon (no change from former version)
    #
    # Those are new one, and differentiate between kubernetes master node and
    # worker node:
    #
    # * kubernetes-master (former: kubernetes-api, kubernetes-scheduler,
    #   kubernetes-controller-manager, kubelet)
    # * kubernetes-worker (former: kubelet)
    #
    # There were openshift-* services removed, since they are not working
    # anymore.

    if [[ "$1" == "stack" && "$2" == "pre-install" ]]; then
        echo_summary "Installing dependecies for Kuryr-Kubernetes"
        if is_service_enabled kubernetes-master kubernetes-worker; then
            kubeadm_install
        fi

    elif [[ "$1" == "stack" && "$2" == "install" ]]; then
        echo_summary "Installing kuryr CNI and Controller"
        setup_develop "$KURYR_HOME"
        if [[ "${KURYR_CONT}" == "False" ]]; then
            # Build CNI only for non-containerized deployment. For
            # containerized CNI will be built within the images build.
            build_install_kuryr_cni
        fi

    elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then
        echo_summary "Configure kuryr bits"
        if is_service_enabled kuryr-daemon; then
            create_kuryr_account
            configure_kuryr
        fi

    elif [[ "$1" == "stack" && "$2" == "extra" ]]; then
        echo_summary "Installing kubernetes and kuryr"
        # Initialize and start the template service
        if is_service_enabled kuryr-kubernetes; then
            configure_neutron_defaults
        fi

        if is_service_enabled kubernetes-master kubernetes-worker; then
            prepare_kubelet
        fi

        if is_service_enabled kubernetes-master; then
            wait_for "etcd" "http://${SERVICE_HOST}:${ETCD_PORT}/v2/machines"
            kubeadm_init
            copy_kuryr_certs
        elif is_service_enabled kubernetes-worker; then
            kubeadm_join
        fi

        if [ "${KURYR_CONT}" == "True" ]; then
            if is_service_enabled kubernetes-master; then
                build_kuryr_container_image "controller"
                build_kuryr_container_image "cni"
            else
                build_kuryr_container_image "cni"
            fi
        fi

        if is_service_enabled kubernetes-master; then
            # don't alter kubernetes config
            # prepare_kubeconfig
            prepare_kubernetes_files
        fi

        if is_service_enabled kubernetes-master kubernetes-worker; then
            if [[ "${KURYR_OVS_BM}" == "True" ]]; then
                ovs_bind_for_kubelet "$KURYR_NEUTRON_DEFAULT_PROJECT" 6443
            else
                configure_overcloud_vm_k8s_svc_sg
            fi
        fi

        if is_service_enabled tempest; then
            copy_tempest_kubeconfig
            configure_k8s_pod_sg_rules
        fi

        if is_service_enabled kuryr-kubernetes; then
            kubectl apply -f ${KURYR_HOME}/kubernetes_crds/kuryr_crds/
            if [[ "${KURYR_CONT}" == "True" ]]; then
                _generate_containerized_kuryr_resources
            fi
            if [ "$KURYR_MULTI_VIF_DRIVER" == "npwg_multiple_interfaces" ]; then
                kubectl apply -f ${KURYR_HOME}/kubernetes_crds/network_attachment_definition_crd.yaml
            fi
        fi

    elif [[ "$1" == "stack" && "$2" == "test-config" ]]; then
        echo_summary "Run kuryr-kubernetes"
        if is_service_enabled kuryr-kubernetes; then
            if is_service_enabled octavia; then
                create_lb_for_services
            fi

            # FIXME(dulek): This is a very late phase to start Kuryr services.
            # We're doing it here because we need K8s API LB to be created in
            # order to run kuryr services. Thing is Octavia is unable to
            # create LB until test-config phase. We can revisit this once
            # Octavia's DevStack plugin will get improved.

            if [ "${KURYR_CONT}" == "True" ]; then
                run_containerized_kuryr_resources
            else
                run_kuryr_kubernetes
                run_kuryr_daemon
            fi
        fi

        if is_service_enabled tempest; then
            update_tempest_conf_file
        fi
    fi

    if [[ "$1" == "unstack" ]]; then
        # Shut down kuryr and kubernetes services
        if is_service_enabled kuryr-kubernetes; then
            if [ "${KURYR_CONT}" == "False" ]; then
                stop_process kuryr-kubernetes
                stop_process kuryr-daemon
            fi
            kubeadm_reset
        fi
        cleanup_kuryr_devstack_iptables
    fi

    if [[ "$1" == "clean" ]]; then
        # Uninstall kubernetes pkgs, remove config files and kuryr cni
        kubeadm_uninstall
        uninstall_kuryr_cni
        rm_kuryr_conf
    fi
fi

# Restore xtrace
$XTRACE