Déplacement des fichiers depuis eole-one-singlenode

This commit is contained in:
2014-11-13 10:06:16 +01:00
commit 7a3f95db42
15 changed files with 2638 additions and 0 deletions

446
postservice/30-one-mng Executable file
View File

@ -0,0 +1,446 @@
#!/usr/bin/env bash
function error()
{
MSG=${1}
echo "[ERROR][${MSG}]"
exit 1
}
function get_user_home()
{
HOMEDIR=$(getent passwd ${1} | cut -d ':' -f 6)
echo ${HOMEDIR}
}
function get_one_auth()
{
CMD="cat"
HOME=$(get_user_home oneadmin)
FILE="${HOME}/.one/one_auth"
${CMD} ${FILE}
}
function check_cluster()
{
name="${1}"
cmd="onecluster"
opt="list"
auth=$(get_one_auth)
res=0
clst_list=$(${cmd} ${opt} --user ${auth%:*} --password ${auth#*:} | tail -n +2 | awk -F ' ' '{print $2}')
for hst in ${clst_list}
do
[[ "${NAME}" = "${hst}" ]] && res=$((res+1))
done
return ${res}
}
function manage_cluster()
{
NAME="${1}"
CMD="onecluster create"
AUTH=$(get_one_auth)
check_cluster ${clst_name}
if [[ ${?} -eq 0 ]]
then
crt=$(${CMD} --user ${AUTH%:*} --password ${AUTH#*:} ${NAME})
if [[ ${?} -ne 0 ]]
then
error "Cluster create failed"
else
echo "Cluster ${NAME} created"
fi
else
echo "Cluster \"${NAME}\" already exist"
fi
}
function check_host()
{
name="${1}"
cmd="onehost"
opt="list"
auth=$(get_one_auth)
res=0
clst_list=$(${cmd} ${opt} --user ${auth%:*} --password ${auth#*:} | tail -n +2 | awk -F ' ' '{print $2}')
for hst in ${clst_list}
do
[[ "${NAME}" = "${hst}" ]] && res=$((res+1))
done
return ${res}
}
function manage_host()
{
NAME=${1}
CMD="onehost"
IM_MAD='kvm'
VM_MAD='kvm'
VNET_MAD='ovswitch'
OPT="create ${NAME} -i ${IM_MAD} -v ${VM_MAD} -n ${VNET_MAD}"
AUTH=$(get_one_auth)
check_host ${NAME}
if [[ ${?} -eq 0 ]]
then
res=$(${CMD} ${OPT} --user ${AUTH%:*} --password ${AUTH#*:})
if [[ ${?} -ne 0 ]]
then
error "Host creation failed"
else
echo "Host ${NAME} created"
fi
else
echo "Host ${NAME} already exist"
fi
}
function get_cluster_id_by_name()
{
name=${1}
cmd="onecluster"
opt="show ${name}"
res=$(${cmd} ${opt} --user ${AUTH%:*} --password ${AUTH#*:} | grep ID)
if [[ ${?} -eq 0 ]]
then
echo ${res#*:}
return 0
else
echo ""
return 1
fi
}
#
# Get Host ID by a name
#
function get_host_id_by_name()
{
name=${1}
cmd="onehost"
opt="show ${name}"
res=$(${cmd} ${opt} --user ${AUTH%:*} --password ${AUTH#*:} | grep "ID.*:")
if [[ ${?} -eq 0 ]]
then
echo ${res#*:}
return 0
else
echo ""
return 1
fi
}
#
# Get Datastore ID by a name
#
function get_ds_id_by_name()
{
name=${1}
cmd="onedatastore"
opt="show ${name}"
res=$(${cmd} ${opt} --user ${AUTH%:*} --password ${AUTH#*:} | grep "ID.*:")
if [[ ${?} -eq 0 ]]
then
echo ${res#*:}
return 0
else
echo "ERR"
return 1
fi
}
#
# check_host_in_cluster
# if host is attached to cluster : return 0
# if host not attached to cluster : return 1
#
function check_host_in_cluster()
{
hst=${1}
clst=${2}
auth=$(get_one_auth)
cmd="onehost"
opt="show ${hst} --user ${AUTH%:*} --password ${AUTH#*:}"
RES=$(${cmd} ${opt} | grep CLUSTER)
cluster=${RES#*:}
# clean Outpu
cluster="${cluster#"${cluster%%[![:space:]]*}"}" # remove leading whitespace characters
cluster="${cluster%"${cluster##*[![:space:]]}"}" # remove trailing whitespace characters
if [[ "${cluster}" = "${clst}" ]]
then
return 0
else
return 1
fi
}
#
# Attach a host to a cluster
#
function attach_host()
{
HOST=${1}
CLST=${2}
CLST_ID=$(get_cluster_id_by_name ${CLST})
HST_ID=$(get_host_id_by_name ${HOST})
AUTH=$(get_one_auth)
CMD="onecluster"
OPT="addhost ${CLST_ID} ${HST_ID}"
check_host_in_cluster ${HOST} ${CLST}
if [[ ${?} -eq 1 ]]
then
if [[ -n ${CLST_ID} ]]
then
if [[ -n ${HST_ID} ]]
then
RES=$(${CMD} ${OPT} --user ${AUTH%:*} --password ${AUTH#*:})
if [[ ${?} -ne 0 ]]
then
error "Attaching ${HOST} to ${CLST} failed"
else
echo "${HOST} attached to ${CLST}"
return 0
fi
else
error "No host id for ${HOST}"
fi
else
error "No Cluster id for ${CLST}"
fi
else
echo "Host ${HOST} already present in cluster ${CLST}"
fi
return 0
}
#
# Attach a datastore to a cluster
#
function attach_ds_to_cluster()
{
DS=${1}
CLST=${2}
CLST_ID=$(get_cluster_id_by_name ${CLST})
DS_ID=$(get_ds_id_by_name ${ds_name})
AUTH=$(get_one_auth)
CMD="onecluster"
OPT="adddatastore ${CLST_ID} ${DS_ID}"
RES=$(${CMD} ${OPT} --user ${AUTH%:*} --password ${AUTH#*:})
if [[ ${?} -ne 0 ]]
then
error "Attaching ${DS} to ${CLST} failed."
else
echo "Datastore ${DS} attached to ${CLST}."
return 0
fi
return 0
}
function create_datastore()
{
ds_type="${1}"
ds_name="${2}"
ds_cluster="${3}"
if [[ $(CreoleGet activer_multinode 2>&1) == 'oui' ]]
then
SYS_TM_MAD='ssh'
ISO_TM_MAD='ssh'
IMG_TM_MAD='ssh'
else
SYS_TM_MAD='shared'
ISO_TM_MAD='shared'
IMG_TM_MAD='qcow2'
fi
echo "Creating datastore ${ds_name}"
TMPL_FILE=$(mktemp)
case ${ds_type} in
"SYSTEM")
cat <<__EOF__ > ${TMPL_FILE}
NAME = ${ds_name}
TM_MAD = ${SYS_TM_MAD}
TYPE = SYSTEM_DS
__EOF__
;;
"ISO")
cat <<__EOF__ > ${TMPL_FILE}
NAME = ${ds_name}
DS_MAD = fs
TM_MAD = ${ISO_TM_MAD}
TYPE = IMAGE_DS
__EOF__
;;
"IMAGE")
cat <<__EOF__ > ${TMPL_FILE}
NAME = ${ds_name}
DS_MAD = fs
TM_MAD = ${ISO_TM_MAD}
TYPE = IMAGE_DS
__EOF__
;;
*) echo "Nothing to do with ${ds_type}"
;;
esac
auth=$(get_one_auth)
cmd="onedatastore"
#opt="create --user ${AUTH%:*} --password ${AUTH#*:} -c ${ds_cluster} ${TMPL_FILE}"
opt="create --user ${AUTH%:*} --password ${AUTH#*:} ${TMPL_FILE}"
RUN=$(${cmd} ${opt})
if [[ ${?} -eq 0 ]]
then
attach_ds_to_cluster ${ds_name} ${ds_cluster}
rm ${TMPL_FILE}
return 0
else
return 1
fi
}
function update_datastore()
{
local auth=${1}
local ds_id=${2}
local cmd="onedatastore"
local opt="show"
local multinode=$(CreoleGet activer_multinode 2>&1)
ds_type=""
ds_mad=""
ds_name=""
TMPL_FILE=$(mktemp)
if [[ ${multinode} == 'oui' ]]
then
SYS_TM_MAD='ssh'
ISO_TM_MAD='ssh'
IMG_TM_MAD='ssh'
else
SYS_TM_MAD='shared'
ISO_TM_MAD='shared'
IMG_TM_MAD='qcow2'
fi
out=$(${cmd} ${opt} ${ds_id} --user ${auth%:*} --password ${auth#*:} | \
awk -F ':' '/^DATASTORE.*INFORMATION/,/DATASTORE CAPACITY/ {gsub(" |\t",""); print $1 ":" $2 " " }')
for line in ${out}
do
[[ ${line} =~ ^TM_MAD ]] && ds_mad=${line#*:}
[[ ${line} =~ ^NAME ]] && ds_name=${line#*:}
[[ ${line} =~ ^TYPE ]] && ds_type=${line#*:}
done
if [[ ${ds_name} == "$(CreoleGet one_ds_system_prefix 2>&1)$(CreoleGet one_cluster_name 2>&1)" ]]
then
cat <<__EOF__ > ${TMPL_FILE}
NAME = ${ds_name}
TM_MAD = ${SYS_TM_MAD}
TYPE = SYSTEM_DS
__EOF__
elif [[ ${ds_name} == "$(CreoleGet one_ds_iso_name 2>&1)" ]]
then
cat <<__EOF__ > ${TMPL_FILE}
NAME = ${ds_name}
DS_MAD = fs
TM_MAD = ${ISO_TM_MAD}
TYPE = IMAGE_DS
__EOF__
elif [[ ${ds_name} == "$(CreoleGet one_ds_image_name 2>&1)" ]]
then
cat <<__EOF__ > ${TMPL_FILE}
NAME = ${ds_name}
DS_MAD = fs
TM_MAD = ${ISO_TM_MAD}
TYPE = IMAGE_DS
__EOF__
else
echo "Nothing to do with ${ds_name}"
fi
if [[ -s ${TMPL_FILE} ]]
then
echo "Updating ${ds_name} datastore"
opt="update ${ds_id} --user ${AUTH%:*} --password ${AUTH#*:} ${TMPL_FILE}"
RUN=$(${cmd} ${opt})
rm ${TMPL_FILE}
return ${?}
else
rm ${TMPL_FILE}
return 1
fi
}
function manage_datastores()
{
cluster=${1}
AUTH=$(get_one_auth)
SYSTEM_DS="$(CreoleGet 'one_ds_system_prefix')${cluster}"
ISO_DS=$(CreoleGet 'one_ds_iso_name')
IMAGE_DS=$(CreoleGet 'one_ds_image_name')
echo "Configuring datastores for Cluster"
sid=$(get_ds_id_by_name ${SYSTEM_DS})
if [[ ${sid} = "ERR" ]]
then
create_datastore "SYSTEM" "${SYSTEM_DS}" "${cluster}"
else
update_datastore ${AUTH} ${sid}
fi
imgid=$(get_ds_id_by_name ${IMAGE_DS})
if [[ ${imgid} = "ERR" ]]
then
create_datastore "IMAGE" "${IMAGE_DS}" "${cluster}"
else
update_datastore ${AUTH} ${imgid}
fi
isoid=$(get_ds_id_by_name ${ISO_DS})
if [[ ${isoid} = "ERR" ]]
then
create_datastore "ISO" "${ISO_DS}" "${cluster}"
else
update_datastore ${AUTH} ${isoid}
fi
return 0
}
function main()
{
#
# Creating Cluster
#
clst_name=$(CreoleGet one_cluster_name)
manage_cluster ${clst_name}
#
# Creating Host
#
host=$(CreoleGet nom_machine)
manage_host ${host}
#
# Attaching Host to the Cluster
#
attach_host ${host} ${clst_name}
#
# Création des Datastores
#
manage_datastores ${clst_name}
}
main

345
postservice/31-one-netmng Executable file
View File

@ -0,0 +1,345 @@
#!/usr/bin/env python
from pyeole import ihm
from pyeole import process
from creole.client import CreoleClient
from tempfile import mkstemp
import sys
import os
import csv
import logging
LOG_FILE = '/var/log/one/eole-one-node.log'
#= Configure Logger ===
logger = logging.getLogger(__name__)
#std_handler = logging.StreamHandler(sys.stdout)
file_handler = logging.FileHandler(LOG_FILE)
logger.setLevel(logging.INFO)
#std_handler.setLevel(logging.INFO)
file_handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
#std_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
#logger.addHandler(std_handler)
logger.addHandler(file_handler)
#= End Logger ===
class RunCmdError(Exception):
pass
class OneClient():
def __init__(self, user):
self.user = None
self.auth = None
self.root = '/var/lib/one'
if user:
self.user = user
else:
self.user = 'oneadmin'
user_info = process.system_out(['getent', 'passwd', user])[1]
if user_info:
self.root = user_info.split(':')[5]
command = ['cat', u'{0}/.one/one_auth'.format(self.root)]
res = process.system_out(command)
if res[0] == 0:
self.auth = res[1].split(':')
def __run_cmd__(self, cmd):
cmd.extend(['--user', self.auth[0]])
cmd.extend(['--password', self.auth[1]])
res = process.system_out(cmd)
if res[0] == 0:
if 'list' in cmd:
out_lines = []
if res:
for line in res[1].split('\n'):
if len(line) == 0:
next
elif 'ID' in line:
next
else:
out_lines.append(line.split())
return out_lines
else:
return res
else:
return False
def get_hosts(self):
""" get the list of hosts
"""
cmd = ['onehost', 'list']
cmd.extend(['-l', 'ID,NAME'])
res = self.__run_cmd__(cmd)
return(res)
def get_clusters(self):
""" get the cluster list
"""
cmd = ['onecluster', 'list']
cmd.extend(['-l', 'ID,NAME'])
return self.__run_cmd__(cmd)
def get_networks(self):
""" get the virtual network list
"""
cmd = ['onevnet', 'list']
cmd.extend(['-l', 'ID,NAME'])
return self.__run_cmd__(cmd)
def get_cluster_id_by_name(self, name):
cmd = ['onecluster', 'list']
cmd.extend(['-f', 'NAME={0}'.format(name)])
res = self.__run_cmd__(cmd)
ID = res[0][0]
return ID
def get_vnet_id_by_name(self, name):
cmd = ['onevnet', 'list']
cmd.extend(['-f', 'NAME={0}'.format(name)])
res = self.__run_cmd__(cmd)
ID = res[0][0]
return ID
def create_network(self, templatefile, cluster, vnet_name):
""" Create a network
"""
cmd = ['onevnet', 'create']
cmd.extend(['--user', self.auth[0]])
cmd.extend(['--password', self.auth[1][:-1]])
#cmd.extend(['-c', cluster])
cmd.append(templatefile)
res = process.system_out(cmd)
if res[0] == 0:
clt_id = self.get_cluster_id_by_name(cluster)
vnet_id = self.get_vnet_id_by_name(vnet_name)
res = self.__run_cmd__(['onecluster', 'addvnet', clt_id, vnet_id])
os.remove(templatefile)
if not res:
print("Error attaching {0} vnet to {1} cluster".format(vnet_name, cluster))
return False
else:
return True
else:
logger.error("Creation of virtual network with template {0} failed".format(templatefile))
return False
def update_network(self, templatefile, cluster, vnet_name):
""" Update a network
"""
vnet_id = self.get_vnet_id_by_name(vnet_name)
cmd = ['onevnet', 'update']
cmd.extend(['--user', self.auth[0]])
cmd.extend(['--password', self.auth[1][:-1]])
cmd.extend([vnet_id, templatefile])
res = process.system_out(cmd)
if res[0] == 0:
os.remove(templatefile)
return True
else:
logger.error("Update of virtual network with template {0} failed".format(templatefile))
return False
def delete_network(self, vnet_id):
cmd = ['onevnet', 'delete']
cmd.extend(['--user', self.auth[0]])
cmd.extend(['--password', self.auth[1][:-1]])
cmd.append(vnet_id)
res = process.system_out(cmd)
if res[0] == 0:
ihm.print_line("Network {0} deleted".format(vnet_id))
return True
else:
logger.error("Error deleting network {0}".format(vnet_id))
ihm.print_line("Error deleting network {0}".format(vnet_id))
return False
class OneNetwork():
def create(self, one_client):
tmpl_file = self.create_template()
if one_client.create_network(tmpl_file, self.cluster, self.zone):
ihm.print_line("Virtual network {0} created".format(self.zone))
return True
else:
ihm.print_line("Error Creating virtual network {0}".format(self.zone))
return False
def update(self, one_client):
tmpl_file = self.create_template()
if one_client.update_network(tmpl_file, self.cluster, self.zone):
ihm.print_line("Virtual network {0} updated".format(self.zone))
return True
else:
ihm.print_line("Error Updating virtual network {0}".format(self.zone))
return False
def manage(self, one_client):
found = False
vnet = one_client.get_networks()
network_name = self.zone
for net in vnet:
if network_name in net:
found = True
break
if not found:
return self.create(one_client)
else:
return self.update(one_client)
class OneNetworkL3(OneNetwork):
def __init__(self, net_info, cluster):
self.swname = net_info[0]
self.zone = u'{0}{1}'.format(net_info[10], net_info[1])
self.vlan = net_info[2]
self.vnet_addr = net_info[3]
self.vnet_mask = net_info[4]
self.vnet_gw = net_info[5]
self.vnet_rg_start = net_info[6]
self.vnet_rg_end = net_info[7]
self.vnet_dns = net_info[8]
self.vnet_trunk = net_info[9]
self.cluster = cluster
def create_template(self):
fd, tmp_path = mkstemp(prefix='oneVnet-')
template = open(tmp_path, 'w')
template.write('NAME = "{0}"\n'.format(self.zone))
if self.vnet_rg_start and self.vnet_rg_end:
template.write('TYPE = RANGED\n')
template.write('IP_START = {0}\n'.format(self.vnet_rg_start))
template.write('IP_END = {0}\n'.format(self.vnet_rg_end))
else:
template.write('TYPE = FIXED\n')
if self.vlan:
template.write('VLAN = yes\n')
template.write('VLAN_ID = {0}\n'.format(self.vlan))
if self.vnet_trunk:
template.write('VLAN_TAGGED_ID = {0}\n'.format(self.vnet_trunk))
template.write('BRIDGE = {0}\n'.format(self.swname))
template.write('NETWORK_ADDRESS = {0}\n'.format(self.vnet_addr))
template.write('NETWORK_MASK = {0}\n'.format(self.vnet_mask))
template.write('GATEWAY = {0}\n'.format(self.vnet_gw))
template.write('DNS = {0}\n'.format(self.vnet_dns))
template.close()
return tmp_path
class OneNetworkL2(OneNetwork):
def __init__(self, net_info, cluster):
self.swname = net_info[0]
self.zone = u'{0}{1}'.format(net_info[6], net_info[1])
self.net_size = net_info[2]
self.first_mac = net_info[3]
self.tag = net_info[4]
self.trunk = net_info[5]
self.cluster = cluster
def create_template(self):
fd, tmp_path = mkstemp(prefix='oneVnet-')
template = open(tmp_path, 'w')
template.write('NAME = "{0}"\n'.format(self.zone))
template.write('TYPE = ETHER\n')
template.write('SIZE = "{0}"\n'.format(self.net_size))
if self.tag:
template.write('VLAN = yes\n')
template.write('VLAN_ID = {0}\n'.format(self.tag))
if self.trunk:
template.write('VLAN_TAGGED_ID = {0}\n'.format(self.trunk))
template.write('BRIDGE = {0}\n'.format(self.swname))
template.close()
return tmp_path
def main():
client = CreoleClient()
one_client = OneClient('oneadmin')
networks = []
cluster = client.get_creole('one_cluster_name')
swname = client.get_creole('ovs_sw_name')
zones = client.get_creole('vnets')
vlans = client.get_creole('vnet_vlan_tag')
vnet_addr = client.get_creole('vnet_network_addr')
vnet_mask = client.get_creole('vnet_network_mask')
vnet_dns = client.get_creole('vnet_network_dns')
vnet_gw = client.get_creole('vnet_network_gw')
vnet_rg_start = client.get_creole('vnet_range_start')
vnet_rg_end = client.get_creole('vnet_range_end')
vnet_trunk = client.get_creole('vnet_vlan_trunk')
l2_vnet = client.get_creole('l2_vnets')
l2_vnet_size = client.get_creole('l2_vnet_size')
l2_vnet_vlan_tag = client.get_creole('l2_vnet_vlan_tag')
l2_vnet_vlan_trunk = client.get_creole('l2_vnet_vlan_trunk')
l2_vnet_first_mac = client.get_creole('l2_vnet_first_mac')
net_prefix = "CR_"
processed = []
for cpt in range(len(zones)):
if zones[cpt] not in processed:
info = []
info.append(swname)
info.append(zones[cpt])
info.append(vlans[cpt])
info.append(vnet_addr[cpt])
info.append(vnet_mask[cpt])
info.append(vnet_gw[cpt])
info.append(vnet_rg_start[cpt])
info.append(vnet_rg_end[cpt])
info.append(vnet_dns[cpt])
info.append(vnet_trunk[cpt])
info.append(net_prefix)
networks.append(OneNetworkL3(info, cluster))
processed.append(zones[cpt])
for i in range(len(l2_vnet)):
if l2_vnet[i] not in processed:
net_info = []
net_info.append(swname)
net_info.append(l2_vnet[i])
net_info.append(l2_vnet_size[i])
net_info.append(l2_vnet_first_mac[i])
net_info.append(l2_vnet_vlan_tag[i])
net_info.append(l2_vnet_vlan_trunk[i])
net_info.append(net_prefix)
networks.append(OneNetworkL2(net_info, cluster))
processed.append(l2_vnet[i])
if client.get_creole('activer_openvswitch'):
for network in networks:
if not network.manage(one_client):
exit(1)
else:
ihm.print_line(u'Open vSwitch disabled no need to configure virtual networks')
networks = one_client.get_networks()
for net in networks:
name = net[1]
if name.startswith(net_prefix):
if not name[3:] in zones and not name[3:] in l2_vnet:
one_client.delete_network(net[0])
exit(0)
main()