3 # Copyright (C) The Arvados Authors. All rights reserved.
5 # SPDX-License-Identifier: Apache-2.0
12 read -rd "\000" helpmessage <<EOF
13 $(basename $0): Build cloud images for arvados-dispatch-cloud
16 $(basename $0) [options]
21 Path to the packer json file (required)
22 --arvados-cluster-id <xxxxx>
23 The ID of the Arvados cluster, e.g. zzzzz(required)
24 --aws-profile <profile>
25 AWS profile to use (valid profile from ~/.aws/config (optional)
26 --aws-secrets-file <path>
27 AWS secrets file which will be sourced from this script (optional)
28 When building for AWS, either an AWS profile or an AWS secrets file
30 --aws-source-ami <ami-xxxxxxxxxxxxxxxxx>
31 The AMI to use as base for building the images (required if building for AWS)
32 --aws-region <region> (default: us-east-1)
33 The AWS region to use for building the images
35 VPC id for AWS, if not specified packer will derive from the subnet id or pick the default one.
36 --aws-subnet-id <subnet-xxxxxxxxxxxxxxxxx>
37 Subnet id for AWS, if not specified packer will pick the default one for the VPC.
39 Install the AWS EBS autoscaler daemon (default: do not install the AWS EBS autoscaler).
40 --aws-associate-public-ip <true|false>
41 Associate a public IP address with the node used for building the compute image.
42 Required when the machine running packer can not reach the node used for building
43 the compute image via its private IP. (default: true if building for AWS)
44 Note: if the subnet has "Auto-assign public IPv4 address" enabled, disabling this
45 flag will have no effect.
46 --aws-ena-support <true|false>
47 Enable enhanced networking (default: true if building for AWS)
48 --gcp-project-id <project-id>
49 GCP project id (required if building for GCP)
50 --gcp-account-file <path>
51 GCP account file (required if building for GCP)
52 --gcp-zone <zone> (default: us-central1-f)
54 --azure-secrets-file <patch>
55 Azure secrets file which will be sourced from this script (required if building for Azure)
56 --azure-resource-group <resouce-group>
57 Azure resource group (required if building for Azure)
58 --azure-location <location>
59 Azure location, e.g. centralus, eastus, westeurope (required if building for Azure)
60 --azure-sku <sku> (required if building for Azure, e.g. 16.04-LTS)
61 Azure SKU image to use
62 --ssh_user <user> (default: packer)
63 The user packer will use to log into the image
64 --workdir <path> (default: /tmp)
65 The directory where data files are staged and setup scripts are run
66 --resolver <resolver_IP>
67 The dns resolver for the machine (default: host's network provided)
69 Set this to "-dev" to track the unstable/dev Arvados repositories
70 --pin-packages, --no-pin-packages
71 These flags determine whether or not to configure apt pins for Arvados
72 and third-party packages it depends on. By default packages are pinned
73 unless you set \`--reposuffix -dev\`.
74 --public-key-file <path>
75 Path to the public key file that a-d-c will use to log into the compute node (required)
76 --mksquashfs-mem (default: 256M)
77 Only relevant when using Singularity. This is the amount of memory mksquashfs is allowed to use.
79 Install all the necessary tooling for Nvidia GPU support (default: do not install Nvidia GPU support)
81 Output debug information (default: no debug output is printed)
83 For more information, see the Arvados documentation at https://doc.arvados.org/install/crunch2-cloud/install-compute-node.html
97 AWS_ASSOCIATE_PUBLIC_IP=true
103 AZURE_RESOURCE_GROUP=
105 AZURE_CLOUD_ENVIRONMENT=
109 AWS_DEFAULT_REGION=us-east-1
115 PARSEDOPTS=$(getopt --name "$0" --longoptions \
116 help,json-file:,arvados-cluster-id:,aws-source-ami:,aws-profile:,aws-secrets-file:,aws-region:,aws-vpc-id:,aws-subnet-id:,aws-ebs-autoscale,aws-associate-public-ip:,aws-ena-support:,gcp-project-id:,gcp-account-file:,gcp-zone:,azure-secrets-file:,azure-resource-group:,azure-location:,azure-sku:,azure-cloud-environment:,ssh_user:,workdir:,resolver:,reposuffix:,pin-packages,no-pin-packages,public-key-file:,mksquashfs-mem:,nvidia-gpu-support,debug \
118 if [ $? -ne 0 ]; then
122 eval set -- "$PARSEDOPTS"
123 while [ $# -gt 0 ]; do
126 echo >&2 "$helpmessage"
131 JSON_FILE="$2"; shift
133 --arvados-cluster-id)
134 ARVADOS_CLUSTER_ID="$2"; shift
137 AWS_SOURCE_AMI="$2"; shift
140 AWS_PROFILE="$2"; shift
143 AWS_SECRETS_FILE="$2"; shift
146 AWS_DEFAULT_REGION="$2"; shift
149 AWS_VPC_ID="$2"; shift
152 AWS_SUBNET_ID="$2"; shift
157 --aws-associate-public-ip)
158 AWS_ASSOCIATE_PUBLIC_IP="$2"; shift
161 AWS_ENA_SUPPORT="$2"; shift
164 GCP_PROJECT_ID="$2"; shift
167 GCP_ACCOUNT_FILE="$2"; shift
172 --azure-secrets-file)
173 AZURE_SECRETS_FILE="$2"; shift
175 --azure-resource-group)
176 AZURE_RESOURCE_GROUP="$2"; shift
179 AZURE_LOCATION="$2"; shift
182 AZURE_SKU="$2"; shift
184 --azure-cloud-environment)
185 AZURE_CLOUD_ENVIRONMENT="$2"; shift
197 REPOSUFFIX="$2"; shift
206 PUBLIC_KEY_FILE="$2"; shift
209 MKSQUASHFS_MEM="$2"; shift
211 --nvidia-gpu-support)
215 # If you want to debug a build issue, add the -debug flag to the build
216 # command in question.
217 # This will allow you to ssh in, if you use the .pem file that packer
218 # generates in this directory as the ssh key. The base image uses the admin
219 # user and ssh port 22.
223 if [ $# -gt 1 ]; then
224 echo >&2 "$0: unrecognized argument '$2'. Try: $0 --help"
233 if [[ -z "$JSON_FILE" ]] || [[ ! -f "$JSON_FILE" ]]; then
234 echo >&2 "$helpmessage"
236 echo >&2 "ERROR: packer json file not found"
241 if [[ -z "$ARVADOS_CLUSTER_ID" ]]; then
242 echo >&2 "$helpmessage"
244 echo >&2 "ERROR: arvados cluster id not specified"
249 if [[ -z "$PUBLIC_KEY_FILE" ]] || [[ ! -f "$PUBLIC_KEY_FILE" ]]; then
250 echo >&2 "$helpmessage"
252 echo >&2 "ERROR: public key file file not found"
257 if [[ ! -z "$AWS_SECRETS_FILE" ]]; then
258 source $AWS_SECRETS_FILE
261 if [[ ! -z "$AZURE_SECRETS_FILE" ]]; then
262 source $AZURE_SECRETS_FILE
269 if [[ -n "$AWS_SOURCE_AMI" ]]; then
270 EXTRA2+=" -var aws_source_ami=$AWS_SOURCE_AMI"
273 if [[ -n "$AWS_PROFILE" ]]; then
274 EXTRA2+=" -var aws_profile=$AWS_PROFILE"
277 if [[ -n "$AWS_VPC_ID" ]]; then
278 EXTRA2+=" -var vpc_id=$AWS_VPC_ID"
281 if [[ -n "$AWS_SUBNET_ID" ]]; then
282 EXTRA2+=" -var subnet_id=$AWS_SUBNET_ID"
285 if [[ -n "$AWS_DEFAULT_REGION" ]]; then
286 EXTRA2+=" -var aws_default_region=$AWS_DEFAULT_REGION"
289 if [[ -n "$AWS_EBS_AUTOSCALE" ]]; then
290 EXTRA2+=" -var aws_ebs_autoscale=$AWS_EBS_AUTOSCALE"
293 if [[ $AWS -eq 1 ]]; then
294 EXTRA2+=" -var aws_associate_public_ip_address=$AWS_ASSOCIATE_PUBLIC_IP"
295 EXTRA2+=" -var aws_ena_support=$AWS_ENA_SUPPORT"
297 if [[ -n "$GCP_PROJECT_ID" ]]; then
298 EXTRA2+=" -var project_id=$GCP_PROJECT_ID"
300 if [[ -n "$GCP_ACCOUNT_FILE" ]]; then
301 EXTRA2+=" -var account_file=$GCP_ACCOUNT_FILE"
303 if [[ -n "$GCP_ZONE" ]]; then
304 EXTRA2+=" -var zone=$GCP_ZONE"
306 if [[ -n "$AZURE_RESOURCE_GROUP" ]]; then
307 EXTRA2+=" -var resource_group=$AZURE_RESOURCE_GROUP"
309 if [[ -n "$AZURE_LOCATION" ]]; then
310 EXTRA2+=" -var location=$AZURE_LOCATION"
312 if [[ -n "$AZURE_SKU" ]]; then
313 EXTRA2+=" -var image_sku=$AZURE_SKU"
315 if [[ -n "$AZURE_CLOUD_ENVIRONMENT" ]]; then
316 EXTRA2+=" -var cloud_environment_name=$AZURE_CLOUD_ENVIRONMENT"
318 if [[ -n "$SSH_USER" ]]; then
319 EXTRA2+=" -var ssh_user=$SSH_USER"
321 if [[ -n "$WORKDIR" ]]; then
322 EXTRA2+=" -var workdir=$WORKDIR"
324 if [[ -n "$RESOLVER" ]]; then
325 EXTRA2+=" -var resolver=$RESOLVER"
327 if [[ -n "$REPOSUFFIX" ]]; then
328 EXTRA2+=" -var reposuffix=$REPOSUFFIX"
330 if [[ -z "$PIN_PACKAGES" ]]; then
331 case "$REPOSUFFIX" in
332 -dev) PIN_PACKAGES=false ;;
333 *) PIN_PACKAGES=true ;;
336 EXTRA2+=" -var pin_packages=$PIN_PACKAGES"
337 if [[ -n "$PUBLIC_KEY_FILE" ]]; then
338 EXTRA2+=" -var public_key_file=$PUBLIC_KEY_FILE"
340 if [[ -n "$MKSQUASHFS_MEM" ]]; then
341 EXTRA2+=" -var mksquashfs_mem=$MKSQUASHFS_MEM"
343 if [[ -n "$NVIDIA_GPU_SUPPORT" ]]; then
344 EXTRA2+=" -var nvidia_gpu_support=$NVIDIA_GPU_SUPPORT"
347 GOVERSION=$(grep 'const goversion =' ../../lib/install/deps.go |awk -F'"' '{print $2}')
348 EXTRA2+=" -var goversion=$GOVERSION"
350 logfile=packer-$(date -Iseconds).log
355 echo packer build$EXTRA -var "arvados_cluster=$ARVADOS_CLUSTER_ID"$EXTRA2 $JSON_FILE | tee -a $logfile
356 packer build$EXTRA -var "arvados_cluster=$ARVADOS_CLUSTER_ID"$EXTRA2 $JSON_FILE 2>&1 | tee -a $logfile