aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/onos/tools/build/onos-package
blob: 8f6127da1044546054941a56c9defca9c02727f8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
#!/bin/bash
# -----------------------------------------------------------------------------
# Packages ONOS distributable into onos.tar.gz, onos.zip or a deb file
# -----------------------------------------------------------------------------

set -e

# Build the staging directory used to produce the packages
function build_stage_dir() {
    # Make sure we have the original apache karaf bits first
    [ ! -d $M2_REPO ] && echo "M2 repository $M2_REPO not found" && exit 1
    [ -d $ONOS_STAGE ] && echo "ONOS stage $ONOS_STAGE already exists" && exit 1

    # Create the stage directory and warp into it
    mkdir -p $ONOS_STAGE
    cd $ONOS_STAGE

    # Check if Apache Karaf bits are available and if not, fetch them.
    if [ ! -f $KARAF_ZIP -a ! -f $KARAF_TAR ]; then
        echo "Downloading $KARAF_TAR..."
        curl -sL http://downloads.onosproject.org/third-party/apache-karaf-$KARAF_VERSION.tar.gz > $KARAF_TAR
    fi
    [ ! -f $KARAF_ZIP -a ! -f $KARAF_TAR ] && \
        echo "Apache Karaf bits $KARAF_ZIP or $KARAF_TAR not found" && exit 1

    # Unroll the Apache Karaf bits, prune them and make ONOS top-level directories.
    [ -f $KARAF_ZIP ] && unzip -q $KARAF_ZIP && rm -rf $ONOS_STAGE/$KARAF_DIST/demos
    [ -f $KARAF_TAR ] && tar zxf $KARAF_TAR && rm -rf $ONOS_STAGE/$KARAF_DIST/demos
    mkdir bin

    # Stage the ONOS admin scripts and patch in Karaf service wrapper extras
    cp -r $ONOS_ROOT/tools/package/bin .
    cp -r $ONOS_ROOT/tools/package/debian $ONOS_STAGE/debian
    cp -r $ONOS_ROOT/tools/package/etc/* $ONOS_STAGE/$KARAF_DIST/etc

    # Stage all builtin ONOS apps for factory install
    onos-stage-apps $ONOS_STAGE/apps $ONOS_STAGE/$KARAF_DIST/system

    # Mark the org.onosproject.drivers app active by default
    touch $ONOS_STAGE/apps/org.onosproject.drivers/active

    # Patch-in proper Karaf version into the startup script
    sed "s/\$KARAF_VERSION/$KARAF_VERSION/g" \
        $ONOS_ROOT/tools/package/bin/onos-service > bin/onos-service
    sed "s/\$KARAF_VERSION/$KARAF_VERSION/g" \
        $ONOS_ROOT/tools/package/bin/onos-client > bin/onos
    chmod a+x bin/onos-service bin/onos

    # Stage the ONOS bundles, but only those that match the version
    mkdir -p $ONOS_STAGE/$KARAF_DIST/system/org/onosproject
    find $M2_REPO/org/onosproject -type f -path "*/$ONOS_POM_VERSION/*" \
        -name '*.jar' -o -name '*.pom' -o -name '*-features.xml' \
            | grep -v -Ee '-tests.jar|-[0-9]{8}.[0-9]{6}-' \
            | while read src; do
        dst=$ONOS_STAGE/$KARAF_DIST/system/${src#$M2_REPO/*}
        mkdir -p $(dirname $dst)
        cp $src $dst
    done

    # ONOS Patching ----------------------------------------------------------------

    # Patch the Apache Karaf distribution file to add ONOS features repository
    perl -pi.old -e "s|^(featuresRepositories=.*)|\1,mvn:org.onosproject/onos-features/$ONOS_POM_VERSION/xml/features|" \
        $ONOS_STAGE/$KARAF_DIST/etc/org.apache.karaf.features.cfg

    # Patch the Apache Karaf distribution file to load default ONOS boot features
    export BOOT_FEATURES="webconsole,onos-api,onos-core,onos-incubator,onos-cli,onos-rest,onos-gui"
    perl -pi.old -e "s|^(featuresBoot=.*)|\1,$BOOT_FEATURES|" \
        $ONOS_STAGE/$KARAF_DIST/etc/org.apache.karaf.features.cfg

    # Patch the Apache Karaf distribution with ONOS branding bundle
    cp $M2_REPO/org/onosproject/onos-branding/$ONOS_POM_VERSION/onos-branding-*.jar \
        $ONOS_STAGE/$KARAF_DIST/lib

    # Patch in the ONOS version file
    echo $ONOS_VERSION > $ONOS_STAGE/VERSION
}

function build_compressed_package() {
    # Package up the ONOS tar file
    cd $ONOS_STAGE_ROOT
    rm -f $ONOS_TAR $ONOS_ZIP
    COPYFILE_DISABLE=1 tar zcf $ONOS_TAR $ONOS_BITS

    # Figure out whether we should build ONOS zip file and if so, build it.
    which zip >/dev/null && [ -z "$ONOS_TAR_ONLY" ] && buildZip=true || unset buildZip
    [ -n "$buildZip" ] && zip -rq $ONOS_ZIP $ONOS_BITS

    # Report on the archives that were built and clean-up
    [ -n "$buildZip" ] && ls -lh $ONOS_TAR $ONOS_ZIP || ls -lh $ONOS_TAR
    rm -r $ONOS_STAGE
}

# Build a DEB package
function build_deb() {
    echo "You need to be root in order to generate a proper DEB package."

    sudo rm -fr $ONOS_DEB_ROOT

    mkdir -p $ONOS_DEB_ROOT/{DEBIAN,opt,etc/init}

    {
        echo "Package: ONOS"
        echo "Architecture: all"
        echo "Maintainer: ONOS Project"
        echo "Depends: debconf (>= 0.5.00), default-jre-headless (>= 1.8) | openjdk-8-jre | oracle-java8-installer"
        echo "Priority: optional"
        echo "Version: $ONOS_POM_VERSION"
        echo "Description: Open Network Operating System (ONOS) is an"
        echo "  opensource SDN controller."
    } > $ONOS_DEB_ROOT/DEBIAN/control

    cp -r $ONOS_STAGE $ONOS_DEB_ROOT/opt/onos
    cp $ONOS_ROOT/tools/package/debian/onos.conf $ONOS_DEB_ROOT/etc/init/

    mkdir -p $ONOS_DEB_ROOT/opt/onos/var/

    sudo chown -R root:root $ONOS_DEB_ROOT

    sudo dpkg-deb --build $ONOS_DEB_ROOT > /dev/null &&
    sudo mv $ONOS_STAGE_ROOT/deb.deb $ONOS_DEB && ls -l $ONOS_DEB
}

# Build an RPM package
function build_rpm() {
    read -r -p "WARN: rpm-build utility and root priviledges are need to build the package. Do you want to continue? [Y/n] " response
    case $response in
        [nN][oO])
            exit 0
            ;;
        *)
            sudo rm -fr $ONOS_RPM_ROOT

            sudo yum -y install rpm-build

            mkdir -p $ONOS_RPM_ROOT/{BUILD,RPMS,SOURCES/ONOS-$ONOS_RPM_VERSION/{etc/init,opt},SPECS,SRPMS}

            cp -r $ONOS_STAGE $ONOS_RPM_ROOT/SOURCES/ONOS-$ONOS_RPM_VERSION/opt/onos
            cp $ONOS_ROOT/tools/package/debian/onos.conf $ONOS_RPM_ROOT/SOURCES/ONOS-$ONOS_RPM_VERSION/etc/init/

            cd $ONOS_RPM_ROOT/SOURCES
            COPYFILE_DISABLE=1 tar zcf ONOS-$ONOS_RPM_VERSION.tar.gz ONOS-$ONOS_RPM_VERSION

            {
                echo "Name: ONOS"
                echo "Version: $ONOS_RPM_VERSION"
                echo "Release: 1"
                echo "Summary: Open Networking Operating System (ONOS)"
                echo "Vendor: ONOS Project"
                echo "Packager: ONOS Project"
                echo "Group: Applications/Engineering"
                echo "Requires: jre >= 1:8"
                echo "License: Apache 2.0"
                echo "URL: http://www.onosproject.org"
                echo "Source0: ONOS-$ONOS_RPM_VERSION.tar.gz"
                echo "BuildArch: noarch"
                echo "BuildRoot: %{_tmppath}/%{name}-buildroot"
                echo "%description"
                echo "Open Network Operating System (ONOS) is an opensource SDN controller."
                echo -e "\n"
                echo "%prep"
                echo "%setup -q"
                echo -e "\n"
                echo "%install"
                echo "mkdir -p %{buildroot}"
                echo "cp -R * %{buildroot}"
                echo -e "\n"
                echo "%clean"
                echo "rm -rf %{buildroot}"
                echo -e "\n"
                echo "%files"
                echo "%defattr(-,root,root,-)"
                echo "/etc/init/onos.conf"
                echo "/opt/onos/"
                echo -e "\n"
                echo "%post"
                echo "echo ONOS successfully installed at /opt/onos"
            } > $ONOS_RPM_ROOT/SPECS/onos.spec

            rpmbuild --define "_topdir $ONOS_RPM_ROOT" -bb $ONOS_RPM_ROOT/SPECS/onos.spec

            cp $ONOS_RPM_ROOT/RPMS/noarch/ONOS-$ONOS_RPM_VERSION-1.noarch.rpm $ONOS_STAGE_ROOT && ls -l $ONOS_STAGE_ROOT/ONOS-$ONOS_RPM_VERSION-1.noarch.rpm
            ;;
    esac
}

# Script entry point
[ ! -d "$ONOS_ROOT" ] && echo "ONOS_ROOT is not defined" >&2 && exit 1
. $ONOS_ROOT/tools/build/envDefaults

# Bail on any errors
set -e

# Before starting make sure the environment is clan - delete onos staging folder
rm -fr $ONOS_STAGE

# If there are parameters check if we want to build a deb - otherwise build tar.gz
case ${1:---tar} in
    "--tar" | "-T") build_stage_dir
                    build_compressed_package
    ;;
    "--deb" | "-D") build_stage_dir
                    build_deb
    ;;
    "--rpm" | "-R") build_stage_dir
                    build_rpm
    ;;
    *) echo "usage: $(basename $0) [--tar|--deb|--rpm]" >&2 && exit 1
    ;;
esac