aboutsummaryrefslogtreecommitdiffstats
path: root/build/Makefile
blob: ab60f005f3c4c13628e5d844d92dc7806bb9ddec (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
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
##############################################################################
# Copyright (c) 2015 Ericsson AB and others.
# stefan.k.berg@ericsson.com
# jonas.bjurel@ericsson.com
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################

SHELL = /bin/bash

# This file will be created if needed by runcontext to contain proxy
# settings.
-include environment.mk

############################################################################
# BEGIN of variables to customize
#
#Input args
export ISOSRC = file:$(shell pwd)/fuel-8.0.iso
export ISOCACHE = $(shell pwd)/$(shell basename $(ISOSRC))
export PRODNO = "OPNFV_FUEL"
export REVSTATE = "P0000"

ifdef BUILD_FUEL_PLUGINS
$(warning Overriding plugin build selection to $(BUILD_FUEL_PLUGINS))
export NEWISO = $(shell pwd)/release/unofficial-opnfv-${REVSTATE}.iso
else
export NEWISO = $(shell pwd)/release/opnfv-${REVSTATE}.iso
endif

# Note! Invoke with "make REVSTATE=RXXXX all" to make release build!
# Invoke with ICOCACHE=/full/path/to/iso if cached ISO is in non-standard location.

# Build variables
export BUILD_BASE := $(shell pwd)
export DEB_DEST := $(BUILD_BASE)/release/packages/ubuntu/pool/main
export UDEB_DEST := $(BUILD_BASE)/release/packages/ubuntu/pool/debian-installer
export PUPPET_DEST := $(BUILD_BASE)/release/puppet/modules
export VERSION_FILE := $(BUILD_BASE)/.versions
export DOCKERIMG = opnfv.org/ubuntu-builder:14.04
export TOPDIR := $(shell pwd)
export REPOINFO  := $(BUILD_BASE)/repo_info.sh

# Use snapshots
# Use nearby repositories
export MIRROR_UBUNTU_URL := $(shell ./f_isoroot/f_repobuild/select_ubuntu_repo.sh --url)
export MIRROR_UBUNTU := $(shell echo "$(MIRROR_UBUNTU_URL)" | cut -d'/' -f3 )
export MIRROR_UBUNTU_ROOT := $(shell echo -n '/' ; echo "$(MIRROR_UBUNTU_URL)" | cut -d'/' -f4-)

export LATEST_MIRROR_ID_URL := http://$(shell ./select_closest_fuel_mirror.py)

export MIRROR_MOS_UBUNTU := $(shell echo "$(LATEST_MIRROR_ID_URL)" | cut -d'/' -f3)
export LATEST_TARGET_UBUNTU := $(shell curl -sSf "$(MIRROR_MOS_UBUNTU)/mos-repos/ubuntu/8.0.target.txt" | head -1)
export MIRROR_MOS_UBUNTU_ROOT := /mos-repos/ubuntu/$(LATEST_TARGET_UBUNTU)

export LATEST_TARGET_CENTOS := $(shell curl -sSf "$(LATEST_MIRROR_ID_URL)/mos-repos/centos/mos8.0-centos7-fuel/os.target.txt" | head -1)
export MIRROR_FUEL := "$(LATEST_MIRROR_ID_URL)/mos-repos/centos/mos8.0-centos7-fuel/$(LATEST_TARGET_CENTOS)/x86_64"

# uncomment and use: make print-VARIABLE
#print-%  : ; @echo $* = $($*)

#Build subclasses

SUBDIRS := f_isoroot

# f_example is only an example of how to generate a .deb package and
# should not be enabled in official builds.
#SUBDIRS += f_example

ORIGDIR := $(TOPDIR)/origiso
#
# END of variables to customize
#############################################################################

SUBCLEAN = $(addsuffix .clean,$(SUBDIRS))

.PHONY: all
all:
	@docker version >/dev/null 2>&1 || (echo 'No Docker installation available'; exit 1)
	@make -C docker
	@docker/runcontext $(DOCKERIMG) $(MAKE) $(MAKEFLAGS) iso


############################################################################
# BEGIN of Include definitions
#
include config.mk
include cache.mk
#
# END Include definitions
#############################################################################

$(ISOCACHE):
	# Clone Fuel to non-persistent location and build
	if [ ! -d /tmp/fuel-main ]; then \
		cd /tmp && git clone $(FUEL_MAIN_REPO); \
	fi
	cd /tmp/fuel-main && git checkout $(FUEL_MAIN_TAG)
	@echo "fuel" `git -C /tmp/fuel-main show | grep commit | head -1 | cut -d " " -f2` >> $(VERSION_FILE)
	# Patch for adding dosfstools, as Fuel 6.1 is running mkfs.vfat
	cd /tmp/fuel-main && patch -f -p0 < $(TOPDIR)/fuel-main_5.patch
	# Patch for using the Czech Fuel mirror
	# cd /tmp/fuel-main && patch -p0 < $(TOPDIR)/fuel-main_7.patch
	# Remove Docker optimizations, otherwise multistrap will fail during
	# Fuel build.
	sudo rm -f /etc/apt/apt.conf.d/docker*
	#
	# Need to replace the old Docker v. 1.5.0 with a later version to be
	# able to access the Docker remote repository!
	cd /tmp/fuel-main && patch -f -p0 < $(TOPDIR)/fuel-main_docker_version.patch
	#
	cd /tmp/fuel-main && ./prepare-build-env.sh
	# Verify that Docker is alive
	sudo docker info
	cd /tmp/fuel-main && make repos
	$(REPOINFO) -r /tmp/fuel-main > gitinfo_fuel.txt
	# Repeat build up to ten times
	sudo ./fuel_build_loop
	cp /tmp/fuel-main/build/artifacts/fuel*.iso .
	# Store artifact in cache straight away if caching is enabled
	# (no .cacheid will be present unless this is a cached build)
	test -f .cacheid && $(MAKE) -f Makefile put-cache || exit 0

.PHONY: mount-origiso umount-origiso
mount-origiso: $(ISOCACHE)
	@echo "Mounting original ISO in $(ORIGDIR)"
	@mkdir -p $(ORIGDIR)
	@fuseiso $(ISOCACHE) $(ORIGDIR)

umount-origiso:
	@echo "Unmounting original ISO from $(ORIGDIR)"
	@fusermount -u $(ORIGDIR)
	@rmdir $(ORIGDIR)

.PHONY: $(SUBDIRS)
$(SUBDIRS):
	@mkdir -p release/packages/ubuntu/pool/main release/packages/ubuntu/pool/debian-installer release/puppet/modules release/isoroot
	$(MAKE) -C $@ -f Makefile release

.PHONY: patch-packages
patch-packages:
	ORIGISO=$(ISOCACHE) REVSTATE=$(REVSTATE) $(MAKE) -C $@ -f Makefile release

.PHONY: clean $(SUBCLEAN)
clean:  $(SUBCLEAN)
	$(MAKE) -C patch-packages -f Makefile clean
	@rm -f *.iso
	@rm -Rf release
	@rm -Rf newiso
	@rm -Rf .versions
	@rm -f $(NEWISO)
	@rm -f $(BUILD_BASE)/gitinfo_*.txt

.PHONY: deepclean
deepclean: clean clean-cache
	make -C docker clean
	docker rmi opnfv.org/ubuntu-builder:14.04 &>/dev/null || exit 0
	docker rmi opnfv.org/ubuntu-builder:latest &>/dev/null || exit 0
	docker rmi ubuntu:14.04 &>/dev/null || exit 0
	@if docker images | grep -q "ubuntu *14.04"; then \
		echo "Error: ubuntu:14.04 still present!"; \
		exit 1; \
	fi
	@if docker images | grep -q "opnfv.org/ubuntu-builder"; then \
		echo "Error: opnfv.org/ubuntu-builder still present!"; \
		exit 1; \
	fi

$(SUBCLEAN): %.clean:
	$(MAKE) -C $* -f Makefile clean

.PHONY: setup-env
setup-env:
	@if [ -f environment.mk ]; then \
		sudo bash -c "cat environment.mk >> /etc/environment"; \
	fi

# Todo: Make things smarter - we shouldn't need to clean everything
# betwen make invocations.
.PHONY: iso
iso:	setup-env $(ISOCACHE) $(SUBDIRS) patch-packages
	$(REPOINFO) . > gitinfo_main.txt
	install/install.sh iso $(ISOCACHE) $(NEWISO) $(PRODNO) $(REVSTATE)
	@printf "\n\nProduct ISO is $(NEWISO)\n\n"

# Start a bash shell in docker for Makefile debugging
.PHONY: debug
debug:
	@docker version >/dev/null 2>&1 || (echo 'No Docker installation available'; exit 1)
	@make -C docker
	docker/runcontext $(DOCKERIMG) debug

#############################################################################
# Cache operations - only used when building through ci/build.sh
#############################################################################

# Create a unique hash to be used for getting and putting cache, based on:
#   - The commit ID of the full Fuel repo structre
#   - The contents of all local Fuel patches
.cacheid:
	cd /tmp && git clone $(FUEL_MAIN_REPO)
	cd /tmp/fuel-main && git checkout $(FUEL_MAIN_TAG)
	cd /tmp/fuel-main && make repos
	$(REPOINFO) -r /tmp/fuel-main > .cachedata
	sha1sum *.patch >> .cachedata
	sha1sum fuel_build_loop >> .cachedata
	sha1sum config.mk >> .cachedata
	sha1sum Makefile >> .cachedata
	$(CACHETOOL) getbiweek >> .cachedata
	cat .cachedata | $(CACHETOOL) getid > .cacheid
	# Not removing fuel-main as it is re-used in build

# Clean local data related to caching - called prior to ordinary build
.PHONY: clean-cache
clean-cache: $(SUBCLEANCACHE)
	rm -f .cachedata .cacheid

# Try to download cache - called prior to ordinary build
.PHONY: get-cache
get-cache: .cacheid
	@if $(CACHETOOL) check $(shell cat .cacheid); then \
		 $(CACHETOOL) get $(shell cat .cacheid) | tar xf -;\
	else \
		exit 0;\
	fi

# Store cache if not already stored - called after ordinary build
.PHONY: put-cache
put-cache: .cacheid
	@tar cf - fuel*.iso gitinfo_fuel.txt | $(CACHETOOL) put $(shell cat .cacheid)
class="o">} #copy the files and create extra resources needed for HA deployment # in case of default VM labs. deploy() { if [ ! -f ./labconfig.yaml ] && [ -e ~/joid_config/labconfig.yaml ]; then cp ~/joid_config/labconfig.yaml ./labconfig.yaml if [ ! -f ./deployconfig.yaml ] && [ -e ~/joid_config/deployconfig.yaml ]; then cp ~/joid_config/deployconfig.yaml ./deployconfig.yaml else python genDeploymentConfig.py -l labconfig.yaml > deployconfig.yaml fi else if [ -e ./labconfig.yaml ]; then if [ ! -f ./deployconfig.yaml ] && [ -e ~/joid_config/deployconfig.yaml ]; then cp ~/joid_config/deployconfig.yaml ./deployconfig.yaml else python genDeploymentConfig.py -l labconfig.yaml > deployconfig.yaml fi else if [ "$maasinstall" -eq 0 ]; then echo_error "MAAS not deployed please deploy MAAS first." else echo_info "MAAS not deployed this will deploy MAAS first." fi fi fi # Install MAAS and expecting the labconfig.yaml at local directory. if [ "$maasinstall" -eq 1 ]; then ./clean.sh || true PROFILE=${PROFILE:-ubuntu} MAAS_IP=$(grep " ip_address" deployconfig.yaml | cut -d ':' -f 2 | sed -e 's/ //') API_SERVER="http://$MAAS_IP:5240/MAAS/api/2.0" if which maas > /dev/null; then API_KEY=`sudo maas-region apikey --username=ubuntu` maas login $PROFILE $API_SERVER $API_KEY # make sure there is no machine entry in maas for m in $(maas $PROFILE machines read | jq -r '.[].system_id') do maas $PROFILE machine delete $m || true done podno=$(maas $PROFILE pods read | jq -r ".[]".id) maas $PROFILE pod delete $podno || true fi ./cleanvm.sh || true if [ "$virtinstall" -eq 1 ]; then ./03-maasdeploy.sh virtual else if [ -z "$labfile" ]; then if [ ! -e ./labconfig.yaml ]; then echo_error "Labconfig file must be specified when using custom" else echo_warning "Labconfig was not specified, using ./labconfig.yaml instead" fi elif [ ! -e "$labfile" ]; then echo_warning "Labconfig not found locally, trying download" wget $labfile -t 3 -T 10 -O ./labconfig.yaml || true count=`wc -l labconfig.yaml | cut -d " " -f 1` if [ $count -lt 10 ]; then echo_error "Unable to download labconfig" exit 1 fi else echo_info "Using $labfile to setup deployment" cp $labfile ./labconfig.yaml fi ./03-maasdeploy.sh custom fi fi #create json file which is missing in case of new deployment after maas and git tree cloned freshly. python -c 'import sys, yaml, json; json.dump(yaml.load(sys.stdin), sys.stdout, indent=4)' < labconfig.yaml > labconfig.json python -c 'import sys, yaml, json; json.dump(yaml.load(sys.stdin), sys.stdout, indent=4)' < deployconfig.yaml > deployconfig.json if [[ "$opnfvtype" = "ha" && "$opnfvlab" = "default" ]]; then createresource fi #bootstrap the node ./01-bootstrap.sh juju model-config default-series=$opnfvdistro enable-os-refresh-update=false enable-os-upgrade=false # case default deploy the opnfv platform: ./02-deploybundle.sh $opnfvtype $openstack $opnfvlab $opnfvsdn $opnfvfeature $opnfvdistro $opnfvmodel } #check whether charms are still executing the code even juju-deployer says installed. check_status() { waitstatus=$1 waittime=$2 retval=0 timeoutiter=0 echo_info "Executing the relationships within charms..." while [ $retval -eq 0 ]; do if juju status | grep -q $waitstatus; then echo_info "Still waiting for $waitstatus units" if [ $timeoutiter -ge $waittime ]; then echo_error 'Timed out' retval=1 else sleep 30 fi timeoutiter=$((timeoutiter+1)) else echo_info 'Done executing the relationships' retval=1 fi done if [[ "$opnfvmodel" = "openstack" ]]; then juju expose ceph-radosgw || true #juju ssh ceph/0 \ 'sudo radosgw-admin user create --uid="ubuntu" --display-name="Ubuntu Ceph"' fi echo_info "Deployment finishing..." } # In the case of a virtual deployment if [ "$virtinstall" -eq 1 ]; then ./clean.sh || true fi echo_info "Deployment started" deploy check_status executing 180 echo_info "Deployment finished" juju status --format=tabular # translate bundle.yaml to json python -c 'import sys, yaml, json; json.dump(yaml.load(sys.stdin), sys.stdout, indent=4)' < bundles.yaml > bundles.json # Configuring deployment if ([ $opnfvmodel == "openstack" ]); then if ([ $opnfvsdn == "ocl" ]); then echo_info "Patching OpenContrail controller container" juju run --application contrail-controller sudo docker cp contrail-controller:/etc/contrail/vnc_api_lib.ini /tmp juju run --application contrail-controller cp /tmp/vnc_api_lib.ini /tmp/vnc_api_lib.ini2 juju run --application contrail-controller 'echo "AUTHN_DOMAIN = admin_domain" >> /tmp/vnc_api_lib.ini2' juju run --application contrail-controller sudo docker cp /tmp/vnc_api_lib.ini2 contrail-controller:/etc/contrail/vnc_api_lib.ini juju run --application contrail-controller sudo docker exec contrail-controller service contrail-api restart juju run --application contrail-controller sudo docker cp /tmp/vnc_api_lib.ini2 contrail-analytics:/etc/contrail/vnc_api_lib.ini echo_info "Wait for OpenContrail components to stabilize" sleep 600 fi echo_info "Configuring OpenStack deployment" ./openstack.sh "$opnfvsdn" "$opnfvlab" "$opnfvdistro" "$openstack" || true # creating heat domain after pushing the public API into /etc/hosts status=`juju run-action heat/0 domain-setup` echo $status status=`juju run-action ceilometer/0 ceilometer-upgrade` echo $status if ([ $opnftype == "ha" ]); then status=`juju run-action heat/1 domain-setup` echo $status status=`juju run-action ceilometer/1 ceilometer-upgrade` echo $status status=`juju run-action heat/2 domain-setup` echo $status status=`juju run-action ceilometer/2 ceilometer-upgrade` echo $status fi sudo ../juju/get-cloud-images || true ../juju/joid-configure-openstack || true if grep -q 'openbaton' bundles.yaml; then juju add-relation openbaton keystone fi elif ([ $opnfvmodel == "kubernetes" ]); then #Workarounf for master chanrm as it takes 5 minutes to run properly check_status waiting 50 check_status executing 50 echo_info "Configuring Kubernetes deployment" ./k8.sh $opnfvfeature fi # expose the juju gui-url to login into juju gui echo_info "Juju GUI can be accessed using the following URL and credentials:" juju gui --show-credentials --no-browser echo "Finished deployment and configuration"