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