blob: b3eb80be1b5ee6c9da09ff8ab1feefdc89d68fcc [file] [log] [blame]
#!/usr/bin/env bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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.
## @description download calico bin
## @audience public
## @stability stable
function download_calico_bin()
{
# submarine http server
if [[ -n "$DOWNLOAD_HTTP" ]]; then
MY_CALICOCTL_DOWNLOAD_URL=${DOWNLOAD_HTTP}/downloads/calico/calicoctl
MY_CALICO_DOWNLOAD_URL=${DOWNLOAD_HTTP}/downloads/calico/calico
MY_CALICO_IPAM_DOWNLOAD_URL=${DOWNLOAD_HTTP}/downloads/calico/calico-ipam
else
MY_CALICOCTL_DOWNLOAD_URL=${CALICOCTL_DOWNLOAD_URL}
MY_CALICO_DOWNLOAD_URL=${CALICO_DOWNLOAD_URL}
MY_CALICO_IPAM_DOWNLOAD_URL=${CALICO_IPAM_DOWNLOAD_URL}
fi
mkdir -p "${DOWNLOAD_DIR}/calico"
if [[ -f ${DOWNLOAD_DIR}/calico/calico ]]; then
echo "${DOWNLOAD_DIR}/calico/calico already exists."
else
echo "download ${MY_CALICO_DOWNLOAD_URL} ..."
wget -P "${DOWNLOAD_DIR}/calico" "${MY_CALICO_DOWNLOAD_URL}"
fi
if [[ -f ${DOWNLOAD_DIR}/calico/calicoctl ]]; then
echo "${DOWNLOAD_DIR}/calico already exists."
else
echo "download ${MY_CALICOCTL_DOWNLOAD_URL} ..."
wget -P "${DOWNLOAD_DIR}/calico" "${MY_CALICOCTL_DOWNLOAD_URL}"
fi
if [[ -f ${DOWNLOAD_DIR}/calico/calico-ipam ]]; then
echo "${DOWNLOAD_DIR}/calico/calico-ipam already exists."
else
echo "download ${MY_CALICO_IPAM_DOWNLOAD_URL} ..."
wget -P "${DOWNLOAD_DIR}/calico" "${MY_CALICO_IPAM_DOWNLOAD_URL}"
fi
}
## @description install calico bin
## @audience public
## @stability stable
function install_calico_bin()
{
download_calico_bin
sudo cp -f "${DOWNLOAD_DIR}/calico/calico" /usr/bin/calico
sudo cp -f "${DOWNLOAD_DIR}/calico/calicoctl" /usr/bin/calicoctl
sudo cp -f "${DOWNLOAD_DIR}/calico/calico-ipam" /usr/bin/calico-ipam
sudo chmod +x /usr/bin/calico
sudo chmod +x /usr/bin/calicoctl
sudo chmod +x /usr/bin/calico-ipam
}
## @description install calico config
## @audience public
## @stability stable
function install_calico_config()
{
sudo mkdir -p /etc/calico
cp -rf "${PACKAGE_DIR}/calico" "${INSTALL_TEMP_DIR}/"
# 1. replace etcdEndpoints
# etcdEndpoints: https://10.196.69.173:2379,https://10.196.69.174:2379,https://10.196.69.175:2379
etcdEndpoints=''
index=0
etcdHostsSize=${#ETCD_HOSTS[@]}
for item in "${ETCD_HOSTS[@]}"
do
index=$((index+1))
etcdEndpoints="${etcdEndpoints}http:\\/\\/${item}:2379"
if [[ ${index} -lt ${etcdHostsSize} ]]; then
etcdEndpoints=${etcdEndpoints}","
fi
done
# echo "etcdEndpoints=${etcdEndpoints}"
sed -i "s/ETCD_ENDPOINTS_REPLACE/${etcdEndpoints}/g" "$INSTALL_TEMP_DIR/calico/calicoctl.cfg"
if [[ ! -d /etc/calico ]]; then
sudo mkdir /etc/calico
else
sudo rm -rf /etc/calico/*
fi
sudo cp -f "$INSTALL_TEMP_DIR/calico/calicoctl.cfg" /etc/calico/calicoctl.cfg
sed -i "s/ETCD_ENDPOINTS_REPLACE/${etcdEndpoints}/g" "$INSTALL_TEMP_DIR/calico/calico-node.service"
sed -i "s/CALICO_IPV4POOL_CIDR_REPLACE/${CALICO_IPV4POOL_CIDR}/g" "$INSTALL_TEMP_DIR/calico/calico-node.service"
sudo cp "$INSTALL_TEMP_DIR/calico/calico-node.service" /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable calico-node.service
}
## @description modify kernel network config
## @audience public
## @stability stable
function kernel_network_config()
{
if [ "$(grep -c "net.ipv4.conf.all.rp_filter=1" /etc/sysctl.conf)" -eq '0' ]; then
sudo echo "net.ipv4.conf.all.rp_filter=1" >>/etc/sysctl.conf
fi
if [ "$(grep -c "net.ipv4.ip_forward=1" /etc/sysctl.conf)" -eq '0' ]; then
sudo echo "net.ipv4.ip_forward=1" >>/etc/sysctl.conf
fi
sudo sysctl -p
}
## @description check if the calico-network exist
## @audience public
## @stability stable
function calico_network_exist()
{
local dockerNetworkInfo
dockerNetworkInfo=$(docker network ls --filter NAME="${CALICO_NETWORK_NAME}")
echo "${dockerNetworkInfo}" | grep "${CALICO_NETWORK_NAME}"
}
## @description verification calico
## @audience public
## @stability stable
function verification_calico()
{
echo " ===== Check if the network between 2 containers can be connected ====="
local calicoNetworkExist
calicoNetworkExist=$(calico_network_exist)
if [[ "$calicoNetworkExist" = "" ]]; then
echo "Create a calico network"
docker network create --driver calico --ipam-driver calico-ipam "${CALICO_NETWORK_NAME}"
else
echo "calico network ${CALICO_NETWORK_NAME} already exists."
fi
local verifyA="verify-calico-network-A"
local verifyAInfo
verifyAInfo=$(containers_exist ${verifyA})
if [[ -n "$verifyAInfo" ]]; then
echo "Delete existing container ${verifyA}."
docker stop ${verifyA}
docker rm ${verifyA}
fi
echo "Create containers verify-calico-network-A"
docker run --net "${CALICO_NETWORK_NAME}" --name ${verifyA} -tid busybox
local verifyB="verify-calico-network-B"
local verifyBInfo
verifyBInfo=$(containers_exist ${verifyB})
if [[ -n "$verifyBInfo" ]]; then
echo "Delete existing container ${verifyB}."
docker stop ${verifyB}
docker rm ${verifyB}
fi
echo "Create containers verify-calico-network-B"
docker run --net "${CALICO_NETWORK_NAME}" --name ${verifyB} -tid busybox
echo -e "\\033[33m${verifyA} ping ${verifyB}\\033[0m"
docker exec ${verifyA} ping ${verifyB} -c 5
}
## @description install calico
## @audience public
## @stability stable
function install_calico()
{
kernel_network_config
install_calico_bin
install_calico_config
start_calico
verification_calico
}
## @description uninstall calico
## @audience public
## @stability stable
function uninstall_calico()
{
echo "stop calico-node.service"
sudo systemctl stop calico-node.service
echo "rm /usr/bin/calico ..."
sudo rm /usr/bin/calicoctl
sudo rm /usr/bin/calico
sudo rm /usr/bin/calico-ipam
sudo rm -rf /etc/calico/
sudo rm /etc/systemd/system/calico-node.service
systemctl daemon-reload
}
## @description start calico
## @audience public
## @stability stable
function start_calico()
{
sudo systemctl restart calico-node.service
sudo systemctl status calico-node.service
}
## @description stop calico
## @audience public
## @stability stable
function stop_calico()
{
sudo systemctl stop calico-node.service
sudo systemctl status calico-node.service
}