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 --public-key-file <path>
71 Path to the public key file that a-d-c will use to log into the compute node (required)
72 --mksquashfs-mem (default: 256M)
73 Only relevant when using Singularity. This is the amount of memory mksquashfs is allowed to use.
75 Install all the necessary tooling for Nvidia GPU support (default: do not install Nvidia GPU support)
77 Output debug information (default: no debug output is printed)
79 For more information, see the Arvados documentation at https://doc.arvados.org/install/crunch2-cloud/install-compute-node.html
91 AWS_ASSOCIATE_PUBLIC_IP=true
99 AZURE_CLOUD_ENVIRONMENT=
103 AWS_DEFAULT_REGION=us-east-1
108 PARSEDOPTS=$(getopt --name "$0" --longoptions \
109 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:,public-key-file:,mksquashfs-mem:,nvidia-gpu-support,debug \
111 if [ $? -ne 0 ]; then
115 eval set -- "$PARSEDOPTS"
116 while [ $# -gt 0 ]; do
119 echo >&2 "$helpmessage"
124 JSON_FILE="$2"; shift
126 --arvados-cluster-id)
127 ARVADOS_CLUSTER_ID="$2"; shift
130 AWS_SOURCE_AMI="$2"; shift
133 AWS_PROFILE="$2"; shift
136 AWS_SECRETS_FILE="$2"; shift
139 AWS_DEFAULT_REGION="$2"; shift
142 AWS_VPC_ID="$2"; shift
145 AWS_SUBNET_ID="$2"; shift
150 --aws-associate-public-ip)
151 AWS_ASSOCIATE_PUBLIC_IP="$2"; shift
154 AWS_ENA_SUPPORT="$2"; shift
157 GCP_PROJECT_ID="$2"; shift
160 GCP_ACCOUNT_FILE="$2"; shift
165 --azure-secrets-file)
166 AZURE_SECRETS_FILE="$2"; shift
168 --azure-resource-group)
169 AZURE_RESOURCE_GROUP="$2"; shift
172 AZURE_LOCATION="$2"; shift
175 AZURE_SKU="$2"; shift
177 --azure-cloud-environment)
178 AZURE_CLOUD_ENVIRONMENT="$2"; shift
190 REPOSUFFIX="$2"; shift
193 PUBLIC_KEY_FILE="$2"; shift
196 MKSQUASHFS_MEM="$2"; shift
198 --nvidia-gpu-support)
202 # If you want to debug a build issue, add the -debug flag to the build
203 # command in question.
204 # This will allow you to ssh in, if you use the .pem file that packer
205 # generates in this directory as the ssh key. The base image uses the admin
206 # user and ssh port 22.
210 if [ $# -gt 1 ]; then
211 echo >&2 "$0: unrecognized argument '$2'. Try: $0 --help"
220 if [[ -z "$JSON_FILE" ]] || [[ ! -f "$JSON_FILE" ]]; then
221 echo >&2 "$helpmessage"
223 echo >&2 "ERROR: packer json file not found"
228 if [[ -z "$ARVADOS_CLUSTER_ID" ]]; then
229 echo >&2 "$helpmessage"
231 echo >&2 "ERROR: arvados cluster id not specified"
236 if [[ -z "$PUBLIC_KEY_FILE" ]] || [[ ! -f "$PUBLIC_KEY_FILE" ]]; then
237 echo >&2 "$helpmessage"
239 echo >&2 "ERROR: public key file file not found"
244 if [[ ! -z "$AWS_SECRETS_FILE" ]]; then
245 source $AWS_SECRETS_FILE
248 if [[ ! -z "$AZURE_SECRETS_FILE" ]]; then
249 source $AZURE_SECRETS_FILE
256 if [[ -n "$AWS_SOURCE_AMI" ]]; then
257 EXTRA2+=" -var aws_source_ami=$AWS_SOURCE_AMI"
260 if [[ -n "$AWS_PROFILE" ]]; then
261 EXTRA2+=" -var aws_profile=$AWS_PROFILE"
264 if [[ -n "$AWS_VPC_ID" ]]; then
265 EXTRA2+=" -var vpc_id=$AWS_VPC_ID"
268 if [[ -n "$AWS_SUBNET_ID" ]]; then
269 EXTRA2+=" -var subnet_id=$AWS_SUBNET_ID"
272 if [[ -n "$AWS_DEFAULT_REGION" ]]; then
273 EXTRA2+=" -var aws_default_region=$AWS_DEFAULT_REGION"
276 if [[ -n "$AWS_EBS_AUTOSCALE" ]]; then
277 EXTRA2+=" -var aws_ebs_autoscale=$AWS_EBS_AUTOSCALE"
280 if [[ $AWS -eq 1 ]]; then
281 EXTRA2+=" -var aws_associate_public_ip_address=$AWS_ASSOCIATE_PUBLIC_IP"
282 EXTRA2+=" -var aws_ena_support=$AWS_ENA_SUPPORT"
284 if [[ -n "$GCP_PROJECT_ID" ]]; then
285 EXTRA2+=" -var project_id=$GCP_PROJECT_ID"
287 if [[ -n "$GCP_ACCOUNT_FILE" ]]; then
288 EXTRA2+=" -var account_file=$GCP_ACCOUNT_FILE"
290 if [[ -n "$GCP_ZONE" ]]; then
291 EXTRA2+=" -var zone=$GCP_ZONE"
293 if [[ -n "$AZURE_RESOURCE_GROUP" ]]; then
294 EXTRA2+=" -var resource_group=$AZURE_RESOURCE_GROUP"
296 if [[ -n "$AZURE_LOCATION" ]]; then
297 EXTRA2+=" -var location=$AZURE_LOCATION"
299 if [[ -n "$AZURE_SKU" ]]; then
300 EXTRA2+=" -var image_sku=$AZURE_SKU"
302 if [[ -n "$AZURE_CLOUD_ENVIRONMENT" ]]; then
303 EXTRA2+=" -var cloud_environment_name=$AZURE_CLOUD_ENVIRONMENT"
305 if [[ -n "$SSH_USER" ]]; then
306 EXTRA2+=" -var ssh_user=$SSH_USER"
308 if [[ -n "$WORKDIR" ]]; then
309 EXTRA2+=" -var workdir=$WORKDIR"
311 if [[ -n "$RESOLVER" ]]; then
312 EXTRA2+=" -var resolver=$RESOLVER"
314 if [[ -n "$REPOSUFFIX" ]]; then
315 EXTRA2+=" -var reposuffix=$REPOSUFFIX"
317 if [[ -n "$PUBLIC_KEY_FILE" ]]; then
318 EXTRA2+=" -var public_key_file=$PUBLIC_KEY_FILE"
320 if [[ -n "$MKSQUASHFS_MEM" ]]; then
321 EXTRA2+=" -var mksquashfs_mem=$MKSQUASHFS_MEM"
323 if [[ -n "$NVIDIA_GPU_SUPPORT" ]]; then
324 EXTRA2+=" -var nvidia_gpu_support=$NVIDIA_GPU_SUPPORT"
327 GOVERSION=$(grep 'const goversion =' ../../lib/install/deps.go |awk -F'"' '{print $2}')
328 EXTRA2+=" -var goversion=$GOVERSION"
330 logfile=packer-$(date -Iseconds).log
335 echo packer build$EXTRA -var "arvados_cluster=$ARVADOS_CLUSTER_ID"$EXTRA2 $JSON_FILE | tee -a $logfile
336 packer build$EXTRA -var "arvados_cluster=$ARVADOS_CLUSTER_ID"$EXTRA2 $JSON_FILE 2>&1 | tee -a $logfile