Skip to content

Commit e5b060a

Browse files
sbueringerk8s-ci-robot
authored andcommitted
Pr finalize v1alpha2 (#462)
* Re-sync controller implementation with CAPA, Fix cloud config indent bug, also copy addons to examples output folder, Re-sync makefile * update * fix image name, more sync * Update generate.sh
1 parent 005d712 commit e5b060a

File tree

11 files changed

+114
-99
lines changed

11 files changed

+114
-99
lines changed

Dockerfile

Lines changed: 14 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -13,39 +13,13 @@
1313
# limitations under the License.
1414

1515
# Build the manager binary
16-
#FROM golang:1.12.9 as builder
17-
#
18-
## Copy in the go src
19-
#WORKDIR ${GOPATH}/src/sigs.k8s.io/cluster-api-provider-openstack
20-
#COPY pkg/ pkg/
21-
#COPY cmd/ cmd/
22-
#COPY vendor/ vendor/
23-
#COPY api/ api/
24-
#COPY controllers/ controllers/
25-
#COPY main.go main.go
26-
#COPY go.mod go.mod
27-
#COPY go.sum go.sum
28-
#
29-
## Build
30-
#RUN CGO_ENABLED=0 GOOS=linux GO111MODULE=on GOFLAGS="-mod=vendor" \
31-
# go build -a -ldflags '-extldflags "-static"' \
32-
# -o manager sigs.k8s.io/cluster-api-provider-openstack
33-
#
34-
## Copy the controller-manager into a thin image
35-
#FROM gcr.io/distroless/static:latest
36-
#WORKDIR /
37-
#COPY --from=builder /go/src/sigs.k8s.io/cluster-api-provider-openstack/manager .
38-
#USER nobody
39-
#ENTRYPOINT ["/manager"]
40-
41-
# Build the manager binary
42-
FROM golang:1.12.9
16+
FROM golang:1.12.9 as builder
17+
WORKDIR /workspace
4318

4419
# Run this with docker build --build_arg $(go env GOPROXY) to override the goproxy
4520
ARG goproxy=https://proxy.golang.org
4621
ENV GOPROXY=$goproxy
4722

48-
WORKDIR /workspace
4923
# Copy the Go Modules manifests
5024
COPY go.mod go.mod
5125
COPY go.sum go.sum
@@ -54,17 +28,17 @@ COPY go.sum go.sum
5428
RUN go mod download
5529

5630
# Copy the sources
57-
COPY main.go main.go
58-
COPY api/ api/
59-
COPY controllers/ controllers/
60-
COPY pkg/ pkg/
31+
COPY ./ ./
6132

62-
# Allow containerd to restart pods by calling /restart.sh (mostly for tilt + fast dev cycles)
63-
# TODO: Remove this on prod and use a multi-stage build
64-
COPY third_party/forked/rerun-process-wrapper/start.sh .
65-
COPY third_party/forked/rerun-process-wrapper/restart.sh .
33+
# Build
34+
ARG ARCH
35+
RUN CGO_ENABLED=0 GOOS=linux GOARCH=${ARCH} \
36+
go build -a -ldflags '-extldflags "-static"' \
37+
-o manager .
6638

67-
# Build and run
68-
RUN go install -v .
69-
RUN mv /go/bin/cluster-api-provider-openstack /manager
70-
ENTRYPOINT ["./start.sh", "/manager"]
39+
# Copy the controller-manager into a thin image
40+
FROM gcr.io/distroless/static:latest
41+
WORKDIR /
42+
COPY --from=builder /workspace/manager .
43+
USER nobody
44+
ENTRYPOINT ["/manager"]

Makefile

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@ MOCKGEN := $(TOOLS_BIN_DIR)/mockgen
4343

4444
# Define Docker related variables. Releases should modify and double check these vars.
4545
REGISTRY ?= gcr.io/$(shell gcloud config get-value project)
46-
STAGING_REGISTRY := gcr.io/k8s-staging-cluster-api-openstack
47-
PROD_REGISTRY := us.gcr.io/k8s-artifacts-prod/cluster-api-openstack
48-
IMAGE_NAME ?= cluster-api-openstack-controller
46+
STAGING_REGISTRY := gcr.io/k8s-staging-capi-openstack
47+
PROD_REGISTRY := us.gcr.io/k8s-artifacts-prod/capi-openstack
48+
IMAGE_NAME ?= capi-openstack-controller
4949
CONTROLLER_IMG ?= $(REGISTRY)/$(IMAGE_NAME)
5050
TAG ?= dev
5151
ARCH ?= amd64
@@ -225,7 +225,7 @@ docker-push-manifest: ## Push the fat manifest docker image.
225225
## Minimum docker version 18.06.0 is required for creating and pushing manifest images.
226226
docker manifest create --amend $(CONTROLLER_IMG):$(TAG) $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~$(CONTROLLER_IMG)\-&:$(TAG)~g")
227227
@for arch in $(ALL_ARCH); do docker manifest annotate --arch $${arch} ${CONTROLLER_IMG}:${TAG} ${CONTROLLER_IMG}-$${arch}:${TAG}; done
228-
docker manifest push --purge ${CONTROLLER_IMG}:${TAG}
228+
docker manifest push --purge $(CONTROLLER_IMG):$(TAG)
229229
MANIFEST_IMG=$(CONTROLLER_IMG) MANIFEST_TAG=$(TAG) $(MAKE) set-manifest-image
230230

231231
.PHONY: set-manifest-image
@@ -238,24 +238,35 @@ set-manifest-image:
238238
## --------------------------------------
239239

240240
RELEASE_TAG := $(shell git describe --abbrev=0 2>/dev/null)
241+
RELEASE_DIR := out
242+
243+
$(RELEASE_DIR):
244+
mkdir -p $(RELEASE_DIR)/
241245

242246
.PHONY: release
243-
release: ## Builds and push container images using the latest git tag for the commit.
247+
release: clean-release ## Builds and push container images using the latest git tag for the commit.
244248
@if [ -z "${RELEASE_TAG}" ]; then echo "RELEASE_TAG is not set"; exit 1; fi
249+
@if ! [ -z "$$(git status --porcelain)" ]; then echo "Your local git repository contains uncommitted changes, use git clean before proceeding."; exit 1; fi
250+
git checkout "${RELEASE_TAG}"
245251
# Push the release image to the staging bucket first.
246252
REGISTRY=$(STAGING_REGISTRY) TAG=$(RELEASE_TAG) \
247253
$(MAKE) docker-build-all docker-push-all
248254
# Set the manifest image to the production bucket.
249255
MANIFEST_IMG=$(PROD_REGISTRY)/$(IMAGE_NAME) MANIFEST_TAG=$(RELEASE_TAG) \
250256
$(MAKE) set-manifest-image
251-
# Generate release artifacts.
252-
mkdir -p out/
253-
kustomize build config/default > out/infrastructure-components.yaml
257+
$(MAKE) release-manifests
254258

255-
.PHONY: release-staging-latest
256-
release-staging-latest: ## Builds and push container images to the staging bucket using "latest" tag.
257-
REGISTRY=$(STAGING_REGISTRY) TAG=latest \
258-
$(MAKE) docker-build-all docker-push-all
259+
.PHONY: release-manifests
260+
release-manifests: $(RELEASE_DIR) ## Builds the manifests to publish with a release
261+
kustomize build config/default > $(RELEASE_DIR)/infrastructure-components.yaml
262+
263+
.PHONY: release-staging
264+
release-staging: ## Builds and push container images to the staging bucket.
265+
REGISTRY=$(STAGING_REGISTRY) $(MAKE) docker-build-all docker-push-all release-tag-latest
266+
267+
.PHONY: release-tag-latest
268+
release-tag-latest: ## Adds the latest tag to the last build tag.
269+
gcloud container images add-tag $(CONTROLLER_IMG):$(TAG) $(CONTROLLER_IMG):latest
259270

260271
## --------------------------------------
261272
## Development
@@ -312,8 +323,9 @@ delete-cluster: $(CLUSTERCTL) ## Deletes the development Kubernetes Cluster "tes
312323
--bootstrap-flags="name=clusterapi" \
313324
--cluster test1 \
314325
--kubeconfig ./kubeconfig \
315-
-p ./examples/out/provider-components.yaml \
326+
-p ./examples/_out/provider-components.yaml \
316327

328+
.PHONY: kind-reset
317329
kind-reset: ## Destroys the "clusterapi" kind cluster.
318330
kind delete cluster --name=clusterapi || true
319331

@@ -335,7 +347,10 @@ clean-bin: ## Remove all generated binaries
335347
clean-temporary: ## Remove all temporary files and folders
336348
rm -f minikube.kubeconfig
337349
rm -f kubeconfig
338-
rm -rf out/
350+
351+
.PHONY: clean-release
352+
clean-release: ## Remove the release folder
353+
rm -rf $(RELEASE_DIR)
339354

340355
.PHONY: clean-examples
341356
clean-examples: ## Remove all the temporary files generated in the examples folder

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ For more information, please refer to [v1alpha2](https://github.com/kubernetes-s
120120
-m examples/_out/machines.yaml \
121121
-p examples/_out/provider-components.yaml \
122122
-a examples/addons.yaml
123+
# Alternatively
124+
make create-cluster
123125
```
124126

125127
- If you are using an existing Kubernetes cluster:

config/default/manager_image_patch.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ spec:
88
spec:
99
containers:
1010
# Change the value of image field below to your controller image URL
11-
- image: k8scloudprovider/openstack-cluster-api-controller:latest
11+
- image: gcr.io/k8s-staging-capi-openstack/capi-openstack-controller:dev
1212
name: manager

controllers/openstackcluster_controller.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,11 +255,11 @@ func (r *OpenStackClusterReconciler) SetupWithManager(mgr ctrl.Manager, options
255255

256256
func (r *OpenStackClusterReconciler) getControlPlaneMachine() (*infrav1.OpenStackMachine, error) {
257257
machines := &clusterv1.MachineList{}
258-
if err := r.Client.List(context.Background(), machines); err != nil {
258+
if err := r.Client.List(context.TODO(), machines); err != nil {
259259
return nil, err
260260
}
261261
openStackMachines := &infrav1.OpenStackMachineList{}
262-
if err := r.Client.List(context.Background(), openStackMachines); err != nil {
262+
if err := r.Client.List(context.TODO(), openStackMachines); err != nil {
263263
return nil, err
264264
}
265265

controllers/openstackmachine_controller.go

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -442,15 +442,28 @@ func (r *OpenStackMachineReconciler) OpenStackClusterToOpenStackMachines(o handl
442442
r.Log.Error(errors.Errorf("expected a OpenStackCluster but got a %T", o.Object), "failed to get OpenStackMachine for OpenStackCluster")
443443
return nil
444444
}
445+
log := r.Log.WithValues("OpenStackCluster", c.Name, "Namespace", c.Namespace)
445446

446-
labels := map[string]string{clusterv1.MachineClusterLabelName: c.Name}
447-
machineList := &infrav1.OpenStackMachineList{}
448-
if err := r.List(context.Background(), machineList, client.InNamespace(c.Namespace), client.MatchingLabels(labels)); err != nil {
449-
r.Log.Error(err, "failed to list OpenStackMachines", "OpenStackCluster", c.Name, "Namespace", c.Namespace)
447+
cluster, err := util.GetOwnerCluster(context.TODO(), r.Client, c.ObjectMeta)
448+
switch {
449+
case apierrors.IsNotFound(err) || cluster == nil:
450+
return result
451+
case err != nil:
452+
log.Error(err, "failed to get owning cluster")
453+
return result
454+
}
455+
456+
labels := map[string]string{clusterv1.MachineClusterLabelName: cluster.Name}
457+
machineList := &clusterv1.MachineList{}
458+
if err := r.List(context.TODO(), machineList, client.InNamespace(c.Namespace), client.MatchingLabels(labels)); err != nil {
459+
log.Error(err, "failed to list Machines")
450460
return nil
451461
}
452462
for _, m := range machineList.Items {
453-
name := client.ObjectKey{Namespace: m.Namespace, Name: m.Name}
463+
if m.Spec.InfrastructureRef.Name == "" {
464+
continue
465+
}
466+
name := client.ObjectKey{Namespace: m.Namespace, Name: m.Spec.InfrastructureRef.Name}
454467
result = append(result, ctrl.Request{NamespacedName: name})
455468
}
456469

examples/controlplane/controlplane.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ spec:
6161
permissions: "0600"
6262
content: |-
6363
# cloud.conf to communicate with OpenStack
64-
$OPENSTACK_CLOUD_PROVIDER_CONF
64+
$OPENSTACK_CLOUD_PROVIDER_CONF6
6565
- path: /etc/certs/cacert
6666
owner: root
6767
permissions: "0600"
@@ -172,7 +172,7 @@ spec:
172172
permissions: "0600"
173173
content: |-
174174
# cloud.conf to communicate with OpenStack
175-
$OPENSTACK_CLOUD_PROVIDER_CONF
175+
$OPENSTACK_CLOUD_PROVIDER_CONF6
176176
- path: /etc/certs/cacert
177177
owner: root
178178
permissions: "0600"
@@ -254,7 +254,7 @@ spec:
254254
permissions: "0600"
255255
content: |-
256256
# cloud.conf to communicate with OpenStack
257-
$OPENSTACK_CLOUD_PROVIDER_CONF
257+
$OPENSTACK_CLOUD_PROVIDER_CONF6
258258
- path: /etc/certs/cacert
259259
owner: root
260260
permissions: "0600"

examples/generate.sh

Lines changed: 32 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
# limitations under the License.
1515

1616
set -o errexit
17+
set -o nounset
1718

1819
# Directories.
1920
SOURCE_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
@@ -113,7 +114,7 @@ PROVIDER_COMPONENTS_GENERATED_FILE=${OUTPUT_DIR}/provider-components.yaml
113114
CLUSTER_GENERATED_FILE=${OUTPUT_DIR}/cluster.yaml
114115
CONTROLPLANE_GENERATED_FILE=${OUTPUT_DIR}/controlplane.yaml
115116
MACHINEDEPLOYMENT_GENERATED_FILE=${OUTPUT_DIR}/machinedeployment.yaml
116-
MACHINES_GENERATED_FILE=${OUTPUT_DIR}/machines.yaml
117+
ADDONS_GENERATED_FILE=${OUTPUT_DIR}/addons.yaml
117118

118119
rm -rf "${OUTPUT_DIR}"
119120
rm -rf "${CLOUDS_SECRETS_CONFIG_DIR}"
@@ -127,7 +128,7 @@ if [[ ! -f ${MACHINE_CONTROLLER_SSH_PRIVATE_FILE} ]]; then
127128
ssh-keygen -t rsa -f ${MACHINE_CONTROLLER_SSH_PRIVATE_FILE} -N ""
128129
fi
129130
export MACHINE_CONTROLLER_SSH_PUBLIC_FILE_CONTENT
130-
MACHINE_CONTROLLER_SSH_PUBLIC_FILE_CONTENT=$(cat ${MACHINE_CONTROLLER_SSH_PRIVATE_FILE}.pub)
131+
MACHINE_CONTROLLER_SSH_PUBLIC_FILE_CONTENT="\"$(cat ${MACHINE_CONTROLLER_SSH_PRIVATE_FILE}.pub)\""
131132

132133
CLOUDS_PATH=${CLOUDS_PATH:-""}
133134
OPENSTACK_CLOUD_CONFIG_PLAIN=$(cat "$CLOUDS_PATH")
@@ -144,24 +145,34 @@ if [[ "$DOMAIN_NAME" = "null" ]]; then
144145
fi
145146
CACERT_ORIGINAL=$(echo "$OPENSTACK_CLOUD_CONFIG_PLAIN" | yq r - clouds.${CLOUD}.cacert)
146147

148+
# use only the selected cloud not the whole clouds.yaml
149+
OPENSTACK_CLOUD_CONFIG_SELECTED_CLOUD=$(echo "${OPENSTACK_CLOUD_CONFIG_PLAIN}" | yq r - clouds.${CLOUD} | yq p - clouds.${CLOUD})
150+
147151
# Basic cloud.conf, no LB configuration as that data is not known yet.
148-
export OPENSTACK_CLOUD_PROVIDER_CONF="[Global]
149-
auth-url=$AUTH_URL
150-
username=\"$USERNAME\"
151-
password=\"$PASSWORD\"
152-
tenant-id=\"$PROJECT_ID\"
153-
domain-name=\"$DOMAIN_NAME\"
152+
OPENSTACK_CLOUD_PROVIDER_CONF="
153+
[Global]
154+
auth-url=$AUTH_URL
155+
username=\"$USERNAME\"
156+
password=\"$PASSWORD\"
157+
tenant-id=\"$PROJECT_ID\"
158+
domain-name=\"$DOMAIN_NAME\"
154159
"
155160
if [[ "$CACERT_ORIGINAL" != "null" ]]; then
156161
OPENSTACK_CLOUD_PROVIDER_CONF="$OPENSTACK_CLOUD_PROVIDER_CONF
157-
ca-file=\"${CACERT_ORIGINAL}\"
162+
ca-file=\"${CACERT_ORIGINAL}\"
158163
"
159164
fi
160165
if [[ "$REGION" != "null" ]]; then
161166
OPENSTACK_CLOUD_PROVIDER_CONF="$OPENSTACK_CLOUD_PROVIDER_CONF
162-
region=\"${REGION}\"
167+
region=\"${REGION}\"
163168
"
164169
fi
170+
171+
export OPENSTACK_CLOUD_PROVIDER_CONF6
172+
OPENSTACK_CLOUD_PROVIDER_CONF6=$(echo "${OPENSTACK_CLOUD_PROVIDER_CONF}" | sed -e 's/^/ /')
173+
export OPENSTACK_CLOUD_PROVIDER_CONF10
174+
OPENSTACK_CLOUD_PROVIDER_CONF10=$(echo "${OPENSTACK_CLOUD_PROVIDER_CONF}" | sed -e 's/^/ /')
175+
165176
OS=$(uname)
166177
if [[ "$OS" =~ "Linux" ]]; then
167178
# export OPENSTACK_CLOUD_PROVIDER_CONF=$(echo "$OPENSTACK_CLOUD_PROVIDER_CONF_PLAIN"|base64 -w0)
@@ -180,52 +191,46 @@ else
180191
exit 1
181192
fi
182193

183-
echo "${OPENSTACK_CLOUD_CONFIG_PLAIN}" > ${CLOUDS_SECRETS_CONFIG_DIR}/clouds.yaml
194+
echo "${OPENSTACK_CLOUD_CONFIG_SELECTED_CLOUD}" > ${CLOUDS_SECRETS_CONFIG_DIR}/clouds.yaml
184195
if [[ "$CACERT_ORIGINAL" != "null" ]]; then
185196
cat "$CACERT_ORIGINAL" > ${CLOUDS_SECRETS_CONFIG_DIR}/cacert
186197
else
187198
echo "dummy" > ${CLOUDS_SECRETS_CONFIG_DIR}/cacert
188199
fi
189200

190201
# Generate cluster resources.
191-
kustomize build "${SOURCE_DIR}/cluster" --reorder=none | envsubst > "${CLUSTER_GENERATED_FILE}"
202+
kustomize build "${SOURCE_DIR}/cluster" | envsubst > "${CLUSTER_GENERATED_FILE}"
192203
echo "Generated ${CLUSTER_GENERATED_FILE}"
193204

194205
# Generate controlplane resources.
195-
kustomize build "${SOURCE_DIR}/controlplane" --reorder=none | envsubst > "${CONTROLPLANE_GENERATED_FILE}"
206+
kustomize build "${SOURCE_DIR}/controlplane" | envsubst > "${CONTROLPLANE_GENERATED_FILE}"
196207
echo "Generated ${CONTROLPLANE_GENERATED_FILE}"
197208

198209
# Generate machinedeployment resources.
199-
kustomize build "${SOURCE_DIR}/machinedeployment" --reorder=none | envsubst >> "${MACHINEDEPLOYMENT_GENERATED_FILE}"
210+
kustomize build "${SOURCE_DIR}/machinedeployment" | envsubst >> "${MACHINEDEPLOYMENT_GENERATED_FILE}"
200211
echo "Generated ${MACHINEDEPLOYMENT_GENERATED_FILE}"
201212

202-
# combine control plane and regular machines in ${MACHINES_GENERATED_FILE}
203-
cat ${CONTROLPLANE_GENERATED_FILE} > ${MACHINES_GENERATED_FILE}
204-
echo "---" >> ${MACHINES_GENERATED_FILE}
205-
#cat ${MACHINEDEPLOYMENT_GENERATED_FILE} >> ${MACHINES_GENERATED_FILE}
206-
echo "---" >> ${MACHINES_GENERATED_FILE}
207-
cat ${MACHINEDEPLOYMENT_GENERATED_FILE} >> ${MACHINES_GENERATED_FILE}
208-
echo "---" >> ${MACHINES_GENERATED_FILE}
209-
echo "Generated ${MACHINES_GENERATED_FILE}"
213+
cp ${SOURCE_DIR}/addons.yaml "${ADDONS_GENERATED_FILE}"
214+
echo "Generated ${ADDONS_GENERATED_FILE}"
210215

211216
# Generate Cluster API provider components file.
212-
kustomize build "github.com/kubernetes-sigs/cluster-api//config/default/?ref=master" --reorder=none > "${COMPONENTS_CLUSTER_API_GENERATED_FILE}"
217+
kustomize build "github.com/kubernetes-sigs/cluster-api/config/default/?ref=master" > "${COMPONENTS_CLUSTER_API_GENERATED_FILE}"
213218
echo "Generated ${COMPONENTS_CLUSTER_API_GENERATED_FILE}"
214219

215220
# Generate Kubeadm Bootstrap Provider components file.
216-
kustomize build "github.com/kubernetes-sigs/cluster-api-bootstrap-provider-kubeadm//config/default/?ref=master" --reorder=none > "${COMPONENTS_KUBEADM_GENERATED_FILE}"
221+
kustomize build "github.com/kubernetes-sigs/cluster-api-bootstrap-provider-kubeadm//config/default/?ref=master" > "${COMPONENTS_KUBEADM_GENERATED_FILE}"
217222
echo "Generated ${COMPONENTS_KUBEADM_GENERATED_FILE}"
218223

219224
# Generate OpenStack Infrastructure Provider components file.
220-
kustomize build "${SOURCE_DIR}/../config/default" --reorder=none | envsubst > "${COMPONENTS_OPENSTACK_GENERATED_FILE}"
225+
kustomize build "${SOURCE_DIR}/../config/default" | envsubst > "${COMPONENTS_OPENSTACK_GENERATED_FILE}"
221226
echo "Generated ${COMPONENTS_OPENSTACK_GENERATED_FILE}"
222227

223228
# Generate OpenStack Infrastructure Provider cloud-secrets file.
224-
kustomize build "${SOURCE_DIR}/clouds-secrets" --reorder=none | envsubst > "${COMPONENTS_OPENSTACK_CLOUDS_SECRETS_GENERATED_FILE}"
229+
kustomize build "${SOURCE_DIR}/clouds-secrets" | envsubst > "${COMPONENTS_OPENSTACK_CLOUDS_SECRETS_GENERATED_FILE}"
225230
echo "Generated ${COMPONENTS_OPENSTACK_CLOUDS_SECRETS_GENERATED_FILE}"
226231
echo "WARNING: ${COMPONENTS_OPENSTACK_CLOUDS_SECRETS_GENERATED_FILE} includes OpenStack credentials"
227232

228233
# Generate a single provider components file.
229-
kustomize build "${SOURCE_DIR}/provider-components"| envsubst > "${PROVIDER_COMPONENTS_GENERATED_FILE}"
234+
kustomize build "${SOURCE_DIR}/provider-components" | envsubst > "${PROVIDER_COMPONENTS_GENERATED_FILE}"
230235
echo "Generated ${PROVIDER_COMPONENTS_GENERATED_FILE}"
231236
echo "WARNING: ${PROVIDER_COMPONENTS_GENERATED_FILE} includes OpenStack credentials"

0 commit comments

Comments
 (0)