lxc build to use lxc branch of bootcd
[build.git] / vbuild-init-lxc.sh
index bab5818..4f0bdac 100755 (executable)
@@ -5,19 +5,22 @@
 
 COMMAND=$(basename $0)
 DIRNAME=$(dirname $0)
+BUILD_DIR=$(pwd)
 
 # pkgs parsing utilities
 PATH=$(dirname $0):$PATH export PATH
 . build.common
 
-DEFAULT_FCDISTRO=f8
+DEFAULT_FCDISTRO=f16
 DEFAULT_PLDISTRO=planetlab
-DEFAULT_PERSONALITY=linux32
+DEFAULT_PERSONALITY=linux64
 DEFAULT_IFNAME=eth0
 
 COMMAND_VBUILD="vbuild-init-lxc.sh"
 COMMAND_MYPLC="vtest-init-lxc.sh"
 
+lxc_version="0.8.0-rc2"
+
 function bridge_init () {
 
     # turn on verbosity
@@ -48,9 +51,6 @@ function bridge_init () {
     # take extra arg for ifname, if provided
     [ -n "$1" ] && { INTERFACE_LAN=$1; shift ; }
 
-    ### Checking
-    type -p brctl &> /dev/null || { echo "brctl not found, please install bridge-utils" ; exit 1 ; }
-
     #if we have already configured the same host_box no need to do it again
     /sbin/ifconfig $INTERFACE_BRIDGE &> /dev/null && {
         echo "Bridge interface $INTERFACE_BRIDGE already set up - $COMMAND start exiting"
@@ -127,53 +127,60 @@ echo $cidr
 
 }
 
-function prepare_host() {
-        
-       #Bridge init
-       isInstalled=$(netstat -rn | grep '^0.0.0.0' | awk '{print $8;}')
-       if [ "$isInstalled" != "br0" ] ; then
-          bridge_init
-           sleep5
-        fi
-
-       #install development tools
-        isInstalled=$(yum grouplist "Development Tools" | grep Installed)
-        if [ -z "$isInstalled" ] ; then
-                echo "Installing Development Tools ..."
-                yum -y groupinstall "Development Tools"
-       fi
-
-        #install libcap-devel, libvirt
-        isInstalled=$(rpm -qa | grep libcap-devel)
-        if [ -z "$isInstalled" ] ; then
-                echo "Installing libcap-devel ..."
-                yum -y install libcap-devel
-        fi
+function check_yum_installed () {
+    package=$1; shift
+    rpm -q $package >& /dev/null || yum -y install $package
+}
 
-        isInstalled=$(rpm -qa | grep libvirt)
-        if [ -z "$isInstalled" ] ; then
-                echo "Installing libvirt ..."
-                yum -y install libvirt
-        fi
+function check_yumgroup_installed () {
+    group="$1"; shift
+    yum grouplist "$group" | grep -q Installed || { yum -y groupinstall "$group" ; }
+}
 
-        #retreive and install lxc from sources 
-        isInstalled=$(lxc-version | cut -d: -f2 | grep "0.8.0-rc1")
-        if [ -z "$isInstalled" ] ; then
-                echo "Installing lxc ..."
-                cd /root
-                git clone git://lxc.git.sourceforge.net/gitroot/lxc/lxc 
-                cd lxc
-                ./autogen.sh
-                ./configure
-                make
-                make install
-        fi
+function prepare_host() {
         
-        #create a symlink (just a hack to make lxc works)
-        [ ! -d "/usr/local/var/lib" ] && mkdir -p /usr/local/var/lib
-        #[ ! -f "/usr/local/var/lib/lxc" ] && ln -s /var/lib/lxc /usr/local/var/lib/lxc
+    #################### lxc-tools : rebuild as current fedora release has flaws
+    #install development tools
+    check_yumgroup_installed "Development Tools"
+    #install libcap-devel, libvirt
+    check_yum_installed libcap-devel
+    check_yum_installed libvirt
+
+    #retrieve and install lxc from sources 
+    #raw_version=$(lxc-version ||: )
+    #lxc_installed_version=$(echo $raw_version | sed -e 's,.*: ,,')
+    #if [ "$lxc_installed_version" != "$lxc_version" ] ; then
+    if [ ! -f /usr/bin/lxc-ls ] ; then
+       #echo "Expecting version" '['$lxc_version']'
+       #echo "Found version" '['$lxc_installed_version']'
+        echo "Installing lxc ..."
+        cd /root
+       [ -d lxc ] || git clone git://lxc.git.sourceforge.net/gitroot/lxc/lxc 
+        cd lxc
+       git pull
+       git checkout $lxc_version
+        ./autogen.sh
+        ./configure --prefix=/usr --exec-prefix=/usr
+        make
+        make install
+        mkdir -p /usr/var/lib/
+        [ -d /usr/var/lib/lxc ] || ln -s /var/lib/lxc /usr/var/lib/lxc
+       cd $BUILD_DIR
+    fi
+#    #create a placeholder (just a hack to make lxc works)
+#    [ -d "/usr/local/var/lib" ] || mkdir -p /usr/local/var/lib
+
+    #################### bride initialization
+    check_yum_installed bridge-utils
+    #Bridge init
+    isInstalled=$(netstat -rn | grep '^0.0.0.0' | awk '{print $8;}')
+    if [ "$isInstalled" != "br0" ] ; then
+       bridge_init
+        sleep 5
+    fi
 
-       return 0
+    return 0
 }
 
 
@@ -315,7 +322,7 @@ set -x
 
 
 function install_fedora() {
-set -x
+    set -x
 
     mkdir -p /var/lock/subsys/
     (
@@ -374,6 +381,7 @@ lxc.network.link = $lxc_network_link
 lxc.network.name = $IFNAME
 lxc.network.mtu = 1500
 lxc.network.ipv4 = $IP/$CIDR
+lxc.network.veth.pair = $veth_pair
 #cgroups
 #lxc.cgroup.devices.deny = a
 # /dev/null and zero
@@ -510,8 +518,6 @@ function setup_lxc() {
     pldistro=$1; shift
     personality=$1; shift
 
-
-
     # create lxc container 
     copy_configuration
     if [ $? -ne 0 ]; then
@@ -538,7 +544,6 @@ function setup_lxc() {
         configure_fedora_systemd
     fi
 
-
     # Enable cgroup
     mkdir $rootfs_path/cgroup
     
@@ -551,9 +556,27 @@ function setup_lxc() {
     mkdir $rootfs_path/root/.ssh
     cat /root/.ssh/id_rsa.pub >> $rootfs_path/root/.ssh/authorized_keys
     
+    # start container
     lxc-start -d -n $lxc
 
-    sleep 20
+    lxc-wait -n $lxc -s RUNNING
+
+    echo $IP is up, waiting for ssh...
+
+    # wait max 5 min for sshd to start 
+    ssh_up=""
+    stop_time=$(($(date +%s) + 300))
+    current_time=$(date +%s)
+
+    while [ "$current_time" -lt "$stop_time" ] ; do
+         echo "ssh attempt ..."
+         ssh -o "StrictHostKeyChecking no" $IP 'uname -i' && { ssh_up=true; echo "SSHD in container $lxc is UP"; break ; } || :
+         sleep 10
+         current_time=$(($current_time + 10))
+    done
+
+    [ -z $ssh_up ] && echo "SSHD in container $lxc is not running"
+     
 
     # rpm --rebuilddb
     chroot $rootfs_path rpm --rebuilddb
@@ -825,7 +848,10 @@ function main () {
         echo "Unknown personality: $personality"
     fi
 
-    
+    # need lxc installed before we can run lxc-ls
+    # need bridge installed
+    prepare_host    
+
     if [ -n "$VBUILD_MODE" ] ; then
 
        # Bridge IP affectation
@@ -839,6 +865,7 @@ function main () {
        
         lxc_network_type=veth
         lxc_network_link=virbr0
+       veth_pair="veth$z"
         echo "the IP address of container $lxc is $IP "
     else
         [[ -z "$REPO_URL" ]] && usage
@@ -848,6 +875,7 @@ function main () {
         [[ -z "$HOSTNAME" ]] && usage
         lxc_network_type=veth
         lxc_network_link=br0
+        veth_pair="i$(echo $HOSTNAME | cut -d. -f1)"
     fi
 
     CIDR=$(cidr_notation $NETMASK)
@@ -858,28 +886,22 @@ function main () {
           exit 1
     fi
 
-    if [ ! -z "$(lxc-ls | grep $lxc)" ];then
-        echo "container $lxc exists"
-        exit 1
-    fi
-
-    
     path=/var/lib/lxc
     rootfs_path=$path/$lxc/rootfs
     config_path=$path/$lxc
     cache_base=/var/cache/lxc/fedora/$arch
     cache=$cache_base/$release
     root_password=root
-
-
-    prepare_host
+    
+    # check whether the rootfs directory is created to know if the container exists
+    # bacause /var/lib/lxc/$lxc is already created while putting $lxc.timestamp
+    [ -d $rootfs_path ] && { echo "container $lxc already exists - exiting" ; exit 1 ; }
 
     setup_lxc $lxc $fcdistro $pldistro $personality 
 
     devel_or_vtest_tools $lxc $fcdistro $pldistro $personality
 
     post_install $lxc $personality
-
     
 
     echo $COMMAND Done