Statistiques
| Révision :

root / trunk / shell / configuration-create-compute-nodes @ 59

Historique | Voir | Annoter | Télécharger (9,76 ko)

1
#! /bin/bash
2
#
3
# ST - 2012-07-04
4
#
5
# Create the compute nodes for a configuration.
6
# Prerequisite: the compute node model must have been created.
7
#
8
# Get the directory of the script.
9
SCRIPT_PATH=`dirname $0`
10
# Get the script name.
11
SCRIPT_NAME=`basename $0`
12
# Source the common configuration variables.
13
. $SCRIPT_PATH/c-i-a-b.common
14
#
15
# Get the configurations
16
#
17
CONFIGURATIONS=`ls $SCRIPT_PATH/$CONST_CONFIGURATIONS_DIR`
18
CONFIGURATIONS_STRING="{"
19
for i in $CONFIGURATIONS ; do
20
  CONFIGURATIONS_STRING="$CONFIGURATIONS_STRING$i|"
21
done
22
#
23
# Check command line arguments.
24
#
25
if [ "x$1" == "x" ]
26
  then
27
     echo
28
     echo "Missing parameter. Aborting!"
29
     echo
30
     echo "Usage: $SCRIPT_NAME configuration"
31
     echo
32
     echo -e "	configuration: one of $CONFIGURATIONS_STRING\b}"
33
     exit 1
34
fi
35
#
36
# Does the configuration exist?
37
#
38
CONFIGURATION_FOUND=""
39
CONFIGURATION=`echo $1 | tr [:upper:] [:lower:]`
40
for i in $CONFIGURATIONS ; do
41
    CURRENT_CONFIGURATION=`echo $i | tr [:upper:] [:lower:]`
42
    if [ $CONFIGURATION == $CURRENT_CONFIGURATION ] ; then
43
      CONFIGURATION_FOUND=$i
44
    fi
45
done
46
if [ -z $CONFIGURATION_FOUND ] ; then
47
  echo
48
  echo
49
  echo "The configuration \"$1\" does not exist".
50
  echo -e "The configuration must be one of $CONFIGURATIONS_STRING\b}."
51
  echo "Aborting!"
52
  echo
53
  echo
54
  exit 1
55
else
56
  CONFIGURATION=$CONFIGURATION_FOUND  
57
fi 
58
#
59
# Source the specific variables for the configuration.
60
#
61
. $SCRIPT_PATH/$CONST_CONFIGURATIONS_DIR/$CONFIGURATION/c-i-a-b.config.common
62
#
63
# Create the compute nodes.
64
#
65
COMPUTE_NODE_INDEX=1
66
while [ $COMPUTE_NODE_INDEX -le $COMPUTE_NODE_MAX_INDEX ] ; do
67
#
68
# Compute the host name.
69
#
70
  #
71
  # Convert the number into a three caracters strings.
72
  #
73
  COMPUTE_NODE_INDEX_STRING=$COMPUTE_NODE_INDEX
74
  while [ ${#COMPUTE_NODE_INDEX_STRING} -lt 3 ] ; do
75
    COMPUTE_NODE_INDEX_STRING="0$COMPUTE_NODE_INDEX_STRING"
76
  done
77
  #
78
  # Compute the host name.
79
  #
80
  CURRENT_HOST_NAME=${COMPUTE_NODE_NAME_PREFIX}${COMPUTE_NODE_INDEX_STRING}
81
  #
82
  echo "Creating $CURRENT_HOST_NAME..."
83
  #
84
  # Get the compute node MAC address on the cluster.
85
  #
86
  CURRENT_PATH=/etc
87
  COMPUTE_NODE_CLUSTER_MAC_ADDRESS=`awk -F, -v INDEX=$COMPUTE_NODE_INDEX '{if (FNR==INDEX) {print $1}}' $SCRIPT_PATH/${CONST_TEMPLATES_DIR}$CURRENT_PATH/$CONST_DHCP_HOSTS_FILE_BASENAME`
88
  #
89
  # Create the VM system disk (a snapshot of the model disk).
90
  #
91
  COMPUTE_NODE_SYSTEM_DISK="${CURRENT_HOST_NAME}-${CONST_SYSTEM_DISK_POSTFIX}-clone"
92
  COMPUTE_NODE_LOGICAL_VOLUME="${COMPUTE_NODE_MODEL_SYSTEM_VOLUME_GROUP_DEVICE}/${COMPUTE_NODE_MODEL_CLUSTER_HOST_NAME}-$CONST_SYSTEM_DISK_POSTFIX"
93
  lvcreate -L$COMPUTE_NODE_SYSTEM_DISK_CLONE_SIZE -s \
94
           -n  $COMPUTE_NODE_SYSTEM_DISK \
95
           $COMPUTE_NODE_LOGICAL_VOLUME > /dev/null 2>&1
96
  if [ $? -ne 0 ] ; then
97
    ciab_abort_message "Could not create system disk for $CURRENT_HOST_NAME" 1
98
  fi
99
  #
100
  # DO NOT CREATE A FILE SYSTEM ON THE SNAPSHOT!
101
  #
102
  # If necessary, create the swap volume for the compute node.
103
  if [ $COMPUTE_NODE_SWAP_DISK_SIZE != $CONST_NULL_DISK_SIZE ] ; then
104
    COMPUTE_NODE_SWAP_DISK="${CURRENT_HOST_NAME}-${CONST_SWAP_DISK_POSTFIX}"
105
    lvcreate -L $COMPUTE_NODE_SWAP_DISK_SIZE \
106
             -n $COMPUTE_NODE_SWAP_DISK \
107
             $COMPUTE_NODE_SWAP_DISK_VOLUME_GROUP
108
    if [ $? -ne 0 ] ; then
109
      ciab_abort_message "Could not create swap disk for $CURRENT_HOST_NAME" 1
110
    fi
111
    mkswap $COMPUTE_NODE_SWAP_DISK_VOLUME_GROUP_DEVICE/$COMPUTE_NODE_SWAP_DISK
112
    if [ $? -ne 0 ] ; then
113
      ciab_abort_message "Could not initialize swap disk for $CURRENT_HOST_NAME" 1
114
    fi
115
  fi
116
  #
117
  # Get the CPU data.
118
  #
119
  COMPUTE_NODE_CPUS=`sed -n ${COMPUTE_NODE_INDEX},${COMPUTE_NODE_INDEX}p $SCRIPT_PATH/$CONST_CONFIGURATIONS_DIR/$CONFIGURATION/$COMPUTE_NODE_CPUS_FILE`
120
COMPUTE_NODE_VCPUS_NUM=0
121
  COMPUTE_NODE_CPUS_LIST=""
122
  for i in $COMPUTE_NODE_CPUS ; do
123
    if [ -z $COMPUTE_NODE_CPUS_LIST ] ; then
124
      COMPUTE_NODE_CPUS_LIST=$i
125
    else
126
      COMPUTE_NODE_CPUS_LIST="$COMPUTE_NODE_CPUS_LIST,$i"
127
    fi
128
    COMPUTE_NODE_VCPUS_NUM=$((COMPUTE_NODE_VCPUS_NUM + 1))
129
  done # for i
130
  #
131
  # Create the Xen configuration file from a template
132
  #
133
  CURRENT_PATH=/etc/xen
134
  cp ${CONST_TEMPLATES_DIR}$CURRENT_PATH/$CONST_COMPUTE_NODE_XEN_TEMPLATE_NAME \
135
     $CONST_XEN_CONFIG_DIR/$CURRENT_HOST_NAME.cfg
136
  rpl -q Template Configuration $CONST_XEN_CONFIG_DIR/$CURRENT_HOST_NAME.cfg > /dev/null 2>&1
137
  rpl -q __COMPUTE_NODE_KERNEL__ "$COMPUTE_NODE_KERNEL" \
138
     $CONST_XEN_CONFIG_DIR/$CURRENT_HOST_NAME.cfg  > /dev/null 2>&1
139
  rpl -q __COMPUTE_NODE_RAMDISK__ "$COMPUTE_NODE_RAMDISK" \
140
     $CONST_XEN_CONFIG_DIR/$CURRENT_HOST_NAME.cfg > /dev/null 2>&1
141
  rpl -q __COMPUTE_NODE_VCPUS_NUM__ "$COMPUTE_NODE_VCPUS_NUM" \
142
     $CONST_XEN_CONFIG_DIR/$CURRENT_HOST_NAME.cfg > /dev/null 2>&1
143
  rpl -q __COMPUTE_NODE_CPUS__ "$COMPUTE_NODE_CPUS_LIST" \
144
     $CONST_XEN_CONFIG_DIR/$CURRENT_HOST_NAME.cfg > /dev/null 2>&1
145
  # Memory
146
  rpl -q __COMPUTE_NODE_MEMORY__ "$COMPUTE_NODE_MEMORY" \
147
     $CONST_XEN_CONFIG_DIR/$CURRENT_HOST_NAME.cfg > /dev/null 2>&1
148
  # Root device
149
  rpl -q __XEN_SYSTEM_DISK_ROOT_DEVICE_STANZA__ "$CONST_XEN_SYSTEM_DISK_ROOT_DEVICE_STANZA" \
150
     $CONST_XEN_CONFIG_DIR/$CURRENT_HOST_NAME.cfg > /dev/null 2>&1
151
  #
152
  # System disk stuff
153
  #
154
  COMPUTE_NODE_SYSTEM_DISK_STANZA="'phy:${COMPUTE_NODE_MODEL_SYSTEM_VOLUME_GROUP_DEVICE}/${COMPUTE_NODE_SYSTEM_DISK},$COMPUTE_NODE_SYSTEM_VIRTUAL_VOLUME,w'"
155
  rpl -q __COMPUTE_NODE_SYSTEM_DISK_STANZA__ "$COMPUTE_NODE_SYSTEM_DISK_STANZA" \
156
     $CONST_XEN_CONFIG_DIR/$CURRENT_HOST_NAME.cfg > /dev/null 2>&1
157
  #
158
  # No home disk stuff: home is network mounted.
159
  #
160
  # Swap disk stuff.
161
  if [ "x$COMPUTE_NODE_SWAP_DISK_SIZE" != "x$CONST_NULL_DISK_SIZE" ] ; then
162
    COMPUTE_NODE_SWAP_DISK_STANZA="'phy:${COMPUTE_NODE_SWAP_DISK_VOLUME_GROUP_DEVICE}/${COMPUTE_NODE_SWAP_DISK},$COMPUTE_NODE_SWAP_VIRTUAL_VOLUME,w'"
163
    rpl -q __COMPUTE_NODE_SWAP_DISK_STANZA__ "$COMPUTE_NODE_SWAP_DISK_STANZA" \
164
       $CONST_XEN_CONFIG_DIR/$CURRENT_HOST_NAME.cfg > /dev/null 2>&1
165
    # Comment out the noswap stanza.
166
    rpl -q __COMPUTE_NODE_NOSWAP__ "#$CLUSTER_NOSWAP" \
167
       $CONST_XEN_CONFIG_DIR/$CURRENT_HOST_NAME.cfg > /dev/null 2>&1
168
  else # No swap
169
    rpl -q __COMPUTE_NODE_SWAP_DISK_STANZA__ "" \
170
       $CONST_XEN_CONFIG_DIR/$CURRENT_HOST_NAME.cfg > /dev/null 2>&1
171
    rpl -q __COMPUTE_NODE_NOSWAP__ "$CLUSTER_NOSWAP" \
172
       $CONST_XEN_CONFIG_DIR/$CURRENT_HOST_NAME.cfg > /dev/null 2>&1
173
  fi
174
  #
175
  rpl -q __COMPUTE_NODE_HOST_NAME__ "$CURRENT_HOST_NAME" \
176
     $CONST_XEN_CONFIG_DIR/$CURRENT_HOST_NAME.cfg > /dev/null 2>&1
177
  # Vif stuff.
178
  
179
  COMPUTE_NODE_CLUSTER_STATIC_IP=`awk -F, -v INDEX=$COMPUTE_NODE_INDEX '{if (FNR==INDEX) {print $3}}' $SCRIPT_PATH/${CONST_TEMPLATES_DIR}/etc/$CONST_DHCP_HOSTS_FILE_BASENAME`
180
  VIF_STANZA=$CONST_XEN_VIF_STANZA_PREFIX
181
  INTERNAL_MAC="${CONST_XEN_MAC_PREFIX}${COMPUTE_NODE_CLUSTER_MAC_ADDRESS}"
182
  INTERNAL_BRIDGE="${CONST_XEN_BRIDGE_PREFIX}${CLUSTER_BRIDGE_NAME}"
183
  INTERNAL_IP="${CONST_XEN_IP_PREFIX}${COMPUTE_NODE_CLUSTER_STATIC_IP}"
184
  if [ $CLUSTER_INTERNAL_ADDRESSES_BY_DHCP -eq 1 ] ; then
185
    rpl -q __XEN_DHCP_STANZA__ "$CONST_XEN_DHCP_STANZA" \
186
       $CONST_XEN_CONFIG_DIR/$CURRENT_HOST_NAME.cfg > /dev/null 2>&1
187
    VIF_STANZA=${VIF_STANZA}${INTERNAL_IP}","${INTERNAL_MAC}","${INTERNAL_BRIDGE}${CONST_XEN_VIF_STANZA_POSTFIX}
188
  else
189
    # Comment out the DHCP_STANZA.
190
    rpl -q __XEN_DHCP_STANZA__ "#$CONST_XEN_DHCP_STANZA" \
191
       $CONST_XEN_CONFIG_DIR/$CURRENT_HOST_NAME.cfg > /dev/null 2>&1
192
    VIF_STANZA=${VIF_STANZA}${INTERNAL_IP}","${INTERNAL_MAC},${INTERNAL_BRIDGE}${CONST_XEN_VIF_STANZA_POSTFIX}
193
fi
194
  # In any case, write the VIF_STANZA
195
  rpl -q __VIF_STANZA__ "$VIF_STANZA" \
196
     $CONST_XEN_CONFIG_DIR/$CURRENT_HOST_NAME.cfg > /dev/null 2>&1
197
  # Console stuff as extra parameter
198
  rpl -q __EXTRA_STANZA__ "$CONST_XEN_EXTRA_STANZA" \
199
     $CONST_XEN_CONFIG_DIR/$CURRENT_HOST_NAME.cfg > /dev/null 2>&1
200
  # End creation of Xen configuration file.
201
  #
202
  # Complete installation
203
  #
204
  # Mount the file system to append/modify configuration files
205
  #
206
  if [ ! -d $COMPUTE_NODE_FILE_SYSTEM_MOUNT_POINT ] ; then
207
    mkdir $COMPUTE_NODE_FILE_SYSTEM_MOUNT_POINT
208
  fi
209
  mount $COMPUTE_NODE_MODEL_SYSTEM_VOLUME_GROUP_DEVICE/$COMPUTE_NODE_SYSTEM_DISK \
210
    $COMPUTE_NODE_FILE_SYSTEM_MOUNT_POINT
211
  if [ $? -ne 0 ] ; then
212
    echo
213
    echo "Could not mount the compute node file system. Aborting!"
214
    echo
215
    exit 1
216
  fi
217
  #
218
  # Generate or configure the specific files from templates
219
  #
220
  # Create the /etc directory, if necessary
221
  if [ ! -d $COMPUTE_NODE_MODEL_FILE_SYSTEM_MOUNT_POINT/etc ] ; then
222
    mkdir $COMPUTE_NODE_MODEL_FILE_SYSTEM_MOUNT_POINT/etc
223
  fi
224
  # /etc/network/interfaces
225
  # The first interface is DHCP configured.
226
  # No '/' between $COMPUTE_NODE_FILE_SYSTEM_MOUNT_POINT and $CURRENT_PATH
227
  CURRENT_PATH=/etc/network
228
  if [ ! -d ${COMPUTE_NODE_FILE_SYSTEM_MOUNT_POINT}${CURRENT_PATH} ] ; then
229
    mkdir ${COMPUTE_NODE_FILE_SYSTEM_MOUNT_POINT}${CURRENT_PATH}
230
  fi
231
  cp ${CONST_TEMPLATES_DIR}$CURRENT_PATH/$COMPUTE_NODE_INTERFACES_TEMPLATE \
232
     $COMPUTE_NODE_FILE_SYSTEM_MOUNT_POINT$CURRENT_PATH/interfaces
233
  # Static address on the cluster interface.
234
  # The DHCP case should be delt with. It involves a template overhaul.
235
  rpl -q __STATIC_ADDRESS__ "$COMPUTE_NODE_CLUSTER_STATIC_IP" \
236
      ${COMPUTE_NODE_FILE_SYSTEM_MOUNT_POINT}${CURRENT_PATH}/interfaces > /dev/null 2>&1
237
  rpl -q __STATIC_NETMASK__ "$CLUSTER_STATIC_NETMASK"  \
238
      ${COMPUTE_NODE_FILE_SYSTEM_MOUNT_POINT}${CURRENT_PATH}/interfaces > /dev/null 2>&1
239
    
240
  # /etc/hostname
241
  CURRENT_PATH=/etc
242
  echo $CURRENT_HOST_NAME > "${COMPUTE_NODE_FILE_SYSTEM_MOUNT_POINT}${CURRENT_PATH}/hostname"
243
  #
244
  # /etc/hosts. We use the clone.
245
  #
246
  # /etc/resolv.conf. We use the clone.
247
  #
248
  # /etc/fstab. We use the clone.
249
  #
250
  # /etc/inittab stuff. We use the clone.
251
  #
252
  # Umount the compute node model system disk
253
  #
254
  umount $COMPUTE_NODE_FILE_SYSTEM_MOUNT_POINT
255
  #
256
  COMPUTE_NODE_INDEX=$((COMPUTE_NODE_INDEX + 1))
257
done
258
exit 0