1+ #! /usr/bin/env bash
2+
3+ # A script that builds release artifacts for a single ACK service controller
4+ # for an AWS service API
5+
6+ set -eo pipefail
7+
8+ SCRIPTS_DIR=" $( cd " $( dirname " ${BASH_SOURCE[0]} " ) " > /dev/null 2>&1 && pwd ) "
9+ ROOT_DIR=" $SCRIPTS_DIR /.."
10+ BIN_DIR=" $ROOT_DIR /bin"
11+ DEFAULT_IMAGE_REPOSITORY=" public.ecr.aws/aws-controllers-k8s/controller"
12+ ACK_GENERATE_OLM=${ACK_GENERATE_OLM:- " false" }
13+
14+ source " $SCRIPTS_DIR /lib/common.sh"
15+ source " $SCRIPTS_DIR /lib/k8s.sh"
16+ source " $SCRIPTS_DIR /lib/helm.sh"
17+
18+ check_is_installed controller-gen " You can install controller-gen with the helper scripts/install-controller-gen.sh"
19+ check_is_installed helm " You can install Helm with the helper scripts/install-helm.sh"
20+
21+ if [[ $ACK_GENERATE_OLM == " true" ]]; then
22+ check_is_installed operator-sdk " You can install Operator SDK with the helper scripts/install-operator-sdk.sh"
23+ fi
24+
25+ if ! k8s_controller_gen_version_equals " $CONTROLLER_TOOLS_VERSION " ; then
26+ echo " FATAL: Existing version of controller-gen " ` controller-gen --version` " , required version is $CONTROLLER_TOOLS_VERSION ."
27+ echo " FATAL: Please uninstall controller-gen and install the required version with scripts/install-controller-gen.sh."
28+ exit 1
29+ fi
30+
31+ ACK_GENERATE_CACHE_DIR=${ACK_GENERATE_CACHE_DIR:- " $HOME /.cache/aws-controllers-k8s" }
32+ # The ack-generate code generator is in a separate source code repository,
33+ # typically at $GOPATH/src/github.com/aws-controllers-k8s/code-generator
34+ DEFAULT_ACK_GENERATE_BIN_PATH=" $ROOT_DIR /../../aws-controllers-k8s/code-generator/bin/ack-generate"
35+ ACK_GENERATE_BIN_PATH=${ACK_GENERATE_BIN_PATH:- $DEFAULT_ACK_GENERATE_BIN_PATH }
36+ ACK_GENERATE_API_VERSION=${ACK_GENERATE_API_VERSION:- " v1alpha1" }
37+ ACK_GENERATE_CONFIG_PATH=${ACK_GENERATE_CONFIG_PATH:- " " }
38+ ACK_GENERATE_IMAGE_REPOSITORY=${ACK_GENERATE_IMAGE_REPOSITORY:- " $DEFAULT_IMAGE_REPOSITORY " }
39+ AWS_SDK_GO_VERSION=${AWS_SDK_GO_VERSION:- " v1.35.5" }
40+
41+ DEFAULT_TEMPLATES_DIR=" $ROOT_DIR /../../aws-controllers-k8s/code-generator/templates"
42+ TEMPLATES_DIR=${TEMPLATES_DIR:- $DEFAULT_TEMPLATES_DIR }
43+
44+ DEFAULT_RUNTIME_DIR=" $ROOT_DIR /../runtime"
45+ RUNTIME_DIR=${RUNTIME_DIR:- $DEFAULT_RUNTIME_DIR }
46+ RUNTIME_API_VERSION=${RUNTIME_API_VERSION:- " v1alpha1" }
47+
48+ USAGE="
49+ Usage:
50+ $( basename " $0 " ) <service> <release_version>
51+
52+ <service> should be an AWS service API aliases that you wish to build -- e.g.
53+ 's3' 'sns' or 'sqs'
54+
55+ <release_version> should be the SemVer version tag for the release -- e.g.
56+ 'v0.1.3'
57+
58+ Environment variables:
59+ ACK_GENERATE_CACHE_DIR Overrides the directory used for caching
60+ AWS API models used by the ack-generate
61+ tool.
62+ Default: $ACK_GENERATE_CACHE_DIR
63+ ACK_GENERATE_BIN_PATH: Overrides the path to the the ack-generate
64+ binary.
65+ Default: $ACK_GENERATE_BIN_PATH
66+ SERVICE_CONTROLLER_SOURCE_PATH: Path to the service controller source code
67+ repository.
68+ Default: ../{SERVICE}-controller
69+ ACK_GENERATE_OLM: Enable Operator Lifecycle Manager generators.
70+ Default: false
71+ ACK_GENERATE_OLMCONFIG_PATH: Path to the service OLM configuration file. Ignored
72+ if ACK_GENERATE_OLM is not true.
73+ Default: {SERVICE_CONTROLLER_SOURCE_PATH}/olm/olmconfig.yaml
74+ ACK_GENERATE_CONFIG_PATH: Specify a path to the generator config YAML file to
75+ instruct the code generator for the service.
76+ Default: {SERVICE_CONTROLLER_SOURCE_PATH}/generator.yaml
77+ ACK_GENERATE_OUTPUT_PATH: Specify a path for the generator to output
78+ to.
79+ Default: services/{SERVICE}
80+ ACK_GENERATE_IMAGE_REPOSITORY: Specify a Docker image repository to use
81+ for release artifacts
82+ Default: $DEFAULT_IMAGE_REPOSITORY
83+ ACK_GENERATE_SERVICE_ACCOUNT_NAME: Name of the Kubernetes Service Account and
84+ Cluster Role to use in Helm chart.
85+ Default: $ACK_GENERATE_SERVICE_ACCOUNT_NAME
86+ AWS_SDK_GO_VERSION: Overrides the version of github.com/aws/aws-sdk-go used
87+ by 'ack-generate' to fetch the service API Specifications.
88+ Default: $AWS_SDK_GO_VERSION
89+ K8S_RBAC_ROLE_NAME: Name of the Kubernetes Role to use when
90+ generating the RBAC manifests for the
91+ custom resource definitions.
92+ Default: $K8S_RBAC_ROLE_NAME
93+ "
94+
95+ if [ $# -ne 2 ]; then
96+ echo " ERROR: $( basename " $0 " ) accepts exactly two parameters, the SERVICE and the RELEASE_VERSION" 1>&2
97+ echo " $USAGE "
98+ exit 1
99+ fi
100+
101+ if [ ! -f $ACK_GENERATE_BIN_PATH ]; then
102+ if is_installed " ack-generate" ; then
103+ ACK_GENERATE_BIN_PATH=$( which " ack-generate" )
104+ else
105+ echo " ERROR: Unable to find an ack-generate binary.
106+ Either set the ACK_GENERATE_BIN_PATH to a valid location or
107+ run:
108+
109+ make build-ack-generate
110+
111+ from the root directory or install ack-generate using:
112+
113+ go get -u github.com/aws/aws-controllers-k8s/cmd/ack-generate" 1>&2
114+ exit 1;
115+ fi
116+ fi
117+ SERVICE=$( echo " $1 " | tr ' [:upper:]' ' [:lower:]' )
118+
119+ # Source code for the controller will be in a separate repo, typically in
120+ # $GOPATH/src/github.com/aws-controllers-k8s/$AWS_SERVICE-controller/
121+ DEFAULT_SERVICE_CONTROLLER_SOURCE_PATH=" $ROOT_DIR /../$SERVICE -controller"
122+ SERVICE_CONTROLLER_SOURCE_PATH=${SERVICE_CONTROLLER_SOURCE_PATH:- $DEFAULT_SERVICE_CONTROLLER_SOURCE_PATH }
123+
124+ if [[ ! -d $SERVICE_CONTROLLER_SOURCE_PATH ]]; then
125+ echo " Error evaluating SERVICE_CONTROLLER_SOURCE_PATH environment variable:" 1>&2
126+ echo " $SERVICE_CONTROLLER_SOURCE_PATH is not a directory." 1>&2
127+ echo " ${USAGE} "
128+ exit 1
129+ fi
130+
131+ RELEASE_VERSION=" $2 "
132+ K8S_RBAC_ROLE_NAME=${K8S_RBAC_ROLE_NAME:- " ack-$SERVICE -controller" }
133+ ACK_GENERATE_SERVICE_ACCOUNT_NAME=${ACK_GENERATE_SERVICE_ACCOUNT_NAME:- " ack-$SERVICE -controller" }
134+
135+ # If there's a generator.yaml in the service's directory and the caller hasn't
136+ # specified an override, use that.
137+ if [ -z " $ACK_GENERATE_CONFIG_PATH " ]; then
138+ if [ -f " $SERVICE_CONTROLLER_SOURCE_PATH /generator.yaml" ]; then
139+ ACK_GENERATE_CONFIG_PATH=" $SERVICE_CONTROLLER_SOURCE_PATH /generator.yaml"
140+ fi
141+ fi
142+
143+ helm_output_dir=" $SERVICE_CONTROLLER_SOURCE_PATH /helm"
144+ ag_args=" $SERVICE $RELEASE_VERSION -o $SERVICE_CONTROLLER_SOURCE_PATH --template-dirs $TEMPLATES_DIR --aws-sdk-go-version $AWS_SDK_GO_VERSION "
145+ if [ -n " $ACK_GENERATE_CACHE_DIR " ]; then
146+ ag_args=" $ag_args --cache-dir $ACK_GENERATE_CACHE_DIR "
147+ fi
148+ if [ -n " $ACK_GENERATE_OUTPUT_PATH " ]; then
149+ ag_args=" $ag_args --output $ACK_GENERATE_OUTPUT_PATH "
150+ helm_output_dir=" $ACK_GENERATE_OUTPUT_PATH /helm"
151+ fi
152+ if [ -n " $ACK_GENERATE_CONFIG_PATH " ]; then
153+ ag_args=" $ag_args --generator-config-path $ACK_GENERATE_CONFIG_PATH "
154+ fi
155+ if [ -n " $ACK_GENERATE_IMAGE_REPOSITORY " ]; then
156+ ag_args=" $ag_args --image-repository $ACK_GENERATE_IMAGE_REPOSITORY "
157+ fi
158+ if [ -n " $ACK_GENERATE_SERVICE_ACCOUNT_NAME " ]; then
159+ ag_args=" $ag_args --service-account-name $ACK_GENERATE_SERVICE_ACCOUNT_NAME "
160+ fi
161+
162+ echo " Building release artifacts for $SERVICE -$RELEASE_VERSION "
163+ $ACK_GENERATE_BIN_PATH release $ag_args
164+
165+ pushd $RUNTIME_DIR /apis/core/$RUNTIME_API_VERSION 1> /dev/null
166+
167+ echo " Generating common custom resource definitions"
168+ controller-gen crd:allowDangerousTypes=true paths=./... output:crd:artifacts:config=$helm_output_dir /crds
169+
170+ popd 1> /dev/null
171+
172+ pushd $SERVICE_CONTROLLER_SOURCE_PATH /apis/$ACK_GENERATE_API_VERSION 1> /dev/null
173+
174+ echo " Generating custom resource definitions for $SERVICE "
175+ controller-gen crd:allowDangerousTypes=true paths=./... output:crd:artifacts:config=$helm_output_dir /crds
176+
177+ popd 1> /dev/null
178+
179+ pushd $SERVICE_CONTROLLER_SOURCE_PATH /pkg/resource 1> /dev/null
180+
181+ echo " Generating RBAC manifests for $SERVICE "
182+ controller-gen rbac:roleName=$K8S_RBAC_ROLE_NAME paths=./... output:rbac:artifacts:config=$helm_output_dir /templates
183+ # controller-gen rbac outputs a ClusterRole definition in a
184+ # $config_output_dir/rbac/role.yaml file. We have some other standard Role
185+ # files for a reader and writer role, so here we rename the `role.yaml` file to
186+ # `cluster-role-controller.yaml` to better reflect what is in that file.
187+ mv $helm_output_dir /templates/role.yaml $helm_output_dir /templates/cluster-role-controller.yaml
188+
189+ popd 1> /dev/null
190+
191+ if [[ $ACK_GENERATE_OLM == " true" ]]; then
192+ echo " Generating operator lifecycle manager bundle assets for $SERVICE "
193+
194+ DEFAULT_ACK_GENERATE_OLMCONFIG_PATH=" $SERVICE_CONTROLLER_SOURCE_PATH /olm/olmconfig.yaml"
195+ ACK_GENERATE_OLMCONFIG_PATH=${ACK_GENERATE_OLMCONFIG_PATH:- $DEFAULT_ACK_GENERATE_OLMCONFIG_PATH }
196+
197+ olm_version=$( echo $RELEASE_VERSION | tr -d " v" )
198+ ag_olm_args=" $SERVICE $olm_version -o $SERVICE_CONTROLLER_SOURCE_PATH --template-dirs $TEMPLATES_DIR --olm-config $ACK_GENERATE_OLMCONFIG_PATH --aws-sdk-go-version $AWS_SDK_GO_VERSION "
199+
200+ if [ -n " $ACK_GENERATE_CONFIG_PATH " ]; then
201+ ag_olm_args=" $ag_olm_args --generator-config-path $ACK_GENERATE_CONFIG_PATH "
202+ fi
203+
204+ $ACK_GENERATE_BIN_PATH olm $ag_olm_args
205+ fi
0 commit comments