Skip to content

Commit 32ff7f1

Browse files
author
Corneil du Plessis
authored
Improve Carvel Deployment Support. (spring-attic#5921)
* Improve Carvel Deployment Support. * Allow kapp-controller to select default service account. * Provide for specifying allocateLoadBalancerNodePorts and loadBalancerClass on skipper and dataflow server services.
1 parent b3be82a commit 32ff7f1

22 files changed

+298
-112
lines changed

build-carvel-package.sh

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#!/bin/bash
2+
3+
function create_and_clear() {
4+
rm -rf "$1"
5+
mkdir -p "$1"
6+
}
7+
8+
SCDIR=$(realpath $(dirname "$(readlink -f "${BASH_SOURCE[0]}")"))
9+
set -euxo pipefail
10+
pushd $SCDIR > /dev/null
11+
export DATAFLOW_VERSION=$(./mvnw help:evaluate -o -Dexpression=project.version -q -DforceStdout)
12+
export SKIPPER_VERSION=$(./mvnw help:evaluate -o -Dexpression=spring-cloud-skipper.version -pl spring-cloud-dataflow-parent -q -DforceStdout)
13+
14+
if [ "$PACKAGE_VERSION" = "" ]; then
15+
export PACKAGE_VERSION=$DATAFLOW_VERSION
16+
fi
17+
18+
# you can launch a local docker registry using docker run -d -p 5000:5000 --name registry registry:2.7
19+
# export REPO_PREFIX="<local-machine-ip>:5000/"
20+
if [ "$REPO_PREFIX" = "" ]; then
21+
REPO_PREFIX="docker.io/"
22+
fi
23+
24+
export PACKAGE_BUNDLE_REPOSITORY="${REPO_PREFIX}springcloud/scdf-oss-package"
25+
export REPOSITORY_BUNDLE="${REPO_PREFIX}springcloud/scdf-oss-repo"
26+
27+
export SKIPPER_REPOSITORY="springcloud/spring-cloud-skipper-server"
28+
export SERVER_REPOSITORY="springcloud/spring-cloud-dataflow-server"
29+
export CTR_VERSION=$DATAFLOW_VERSION
30+
export PACKAGE_NAME="scdf"
31+
export PACKAGE_BUNDLE_TEMPLATE="src/carvel/templates/bundle/package"
32+
export IMGPKG_LOCK_TEMPLATE="src/carvel/templates/imgpkg"
33+
export VENDIR_SRC_IN="src/carvel/config"
34+
export SERVER_VERSION="$DATAFLOW_VERSION"
35+
36+
export PACKAGE_BUNDLE_GENERATED=/tmp/generated/packagebundle
37+
export IMGPKG_LOCK_GENERATED_IN=/tmp/generated/imgpkgin
38+
export IMGPKG_LOCK_GENERATED_OUT=/tmp/generated/imgpkgout
39+
create_and_clear $PACKAGE_BUNDLE_GENERATED
40+
create_and_clear $IMGPKG_LOCK_GENERATED_IN
41+
create_and_clear $IMGPKG_LOCK_GENERATED_OUT
42+
43+
echo "bundle-path=$PACKAGE_BUNDLE_GENERATED"
44+
export SCDF_DIR="$SCDIR"
45+
46+
sh "$SCDIR/.github/actions/build-package-bundle/build-package-bundle.sh"
47+
48+
imgpkg push --bundle "$PACKAGE_BUNDLE_REPOSITORY:$PACKAGE_VERSION" --file "$PACKAGE_BUNDLE_GENERATED"
49+
50+
export REPO_BUNDLE_TEMPLATE="src/carvel/templates/bundle/repo"
51+
52+
export REPO_BUNDLE_RENDERED=/tmp/generated/reporendered
53+
export REPO_BUNDLE_GENERATED=/tmp/generated/repobundle
54+
create_and_clear $REPO_BUNDLE_RENDERED
55+
create_and_clear $REPO_BUNDLE_GENERATED
56+
57+
sh "$SCDIR/.github/actions/build-repository-bundle/build-repository-bundle.sh"
58+
59+
imgpkg push --bundle "$REPOSITORY_BUNDLE:$PACKAGE_VERSION" --file "$REPO_BUNDLE_GENERATED"
60+
61+
popd

build-containers.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/bin/bash
2+
./mvnw install -s .settings.xml -DskipTests -T 1C -am -pl :spring-cloud-dataflow-server,:spring-cloud-skipper-server,:spring-cloud-dataflow-composed-task-runner
3+
./mvnw spring-boot:build-image -s .settings.xml -DskipTests -T 1C -pl :spring-cloud-dataflow-server,:spring-cloud-skipper-server,:spring-cloud-dataflow-composed-task-runner

src/carvel/config/dataflow-svc.yml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
#@ load("@ytt:data", "data")
22
#@ load("dataflow.star", "service_spec_type")
3-
3+
#@ load("dataflow.star", "service_spec_type_loadbalancer")
4+
#@ load("dataflow.star", "service_spec_allocate_load_balancer_node_ports")
5+
#@ load("dataflow.star", "has_service_spec_load_balancer_class")
6+
#@ load("dataflow.star", "service_spec_load_balancer_class")
47
kind: Service
58
apiVersion: v1
69
metadata:
@@ -18,5 +21,11 @@ spec:
1821
- port: 80
1922
targetPort: 9393
2023
name: scdf-server
24+
#@ if service_spec_type_loadbalancer():
25+
allocateLoadBalancerNodePorts: #@ service_spec_allocate_load_balancer_node_ports()
26+
#@ if has_service_spec_load_balancer_class():
27+
loadBalancerClass: #@ service_spec_load_balancer_class()
28+
#@ end
29+
#@ end
2130
selector:
2231
app: scdf-server

src/carvel/config/dataflow.star

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,30 @@ end
8282
def image_pull_secrets():
8383
return [{"name": registry_secret_ref()}]
8484
end
85+
def has_service_spec_type():
86+
return non_empty_string(data.values.scdf.server.service.type)
87+
end
88+
89+
def service_spec_type_loadbalancer():
90+
return non_empty_string(data.values.scdf.server.service.type) and data.values.scdf.server.service.type == 'LoadBalancer'
91+
end
8592

8693
def service_spec_type():
8794
return data.values.scdf.server.service.type
8895
end
8996

97+
def service_spec_allocate_load_balancer_node_ports():
98+
return data.values.scdf.server.service.allocateLoadBalancerNodePorts
99+
end
100+
101+
def has_service_spec_load_balancer_class():
102+
return non_empty_string(data.values.scdf.server.service.loadBalancerClass)
103+
end
104+
105+
def service_spec_load_balancer_class():
106+
return data.values.scdf.server.service.loadBalancerClass
107+
end
108+
90109
def context_path():
91110
return data.values.scdf.server.contextPath
92111
end

src/carvel/config/skipper-svc.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
#@ load("@ytt:data", "data")
22
#@ load("skipper.star", "service_spec_type")
3+
#@ load("skipper.star", "service_spec_type_loadbalancer")
4+
#@ load("skipper.star", "service_spec_allocate_load_balancer_node_ports")
5+
#@ load("skipper.star", "has_service_spec_load_balancer_class")
6+
#@ load("skipper.star", "service_spec_load_balancer_class")
37

48
apiVersion: v1
59
kind: Service
@@ -16,5 +20,11 @@ spec:
1620
ports:
1721
- port: 80
1822
targetPort: 7577
23+
#@ if service_spec_type_loadbalancer():
24+
allocateLoadBalancerNodePorts: #@ service_spec_allocate_load_balancer_node_ports()
25+
#@ if has_service_spec_load_balancer_class():
26+
loadBalancerClass: #@ service_spec_load_balancer_class()
27+
#@ end
28+
#@ end
1929
selector:
2030
app: skipper

src/carvel/config/skipper.star

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,23 @@ def service_spec_type():
9090
return data.values.scdf.skipper.service.type
9191
end
9292

93+
def service_spec_type_loadbalancer():
94+
return non_empty_string(data.values.scdf.skipper.service.type) and data.values.scdf.skipper.service.type == 'LoadBalancer'
95+
end
96+
97+
def service_spec_allocate_load_balancer_node_ports():
98+
return data.values.scdf.skipper.service.allocateLoadBalancerNodePorts
99+
end
100+
101+
def has_service_spec_load_balancer_class():
102+
return non_empty_string(data.values.scdf.skipper.service.loadBalancerClass)
103+
end
104+
105+
def service_spec_load_balancer_class():
106+
return data.values.scdf.skipper.service.loadBalancerClass
107+
end
108+
93109
def skipper_has_password():
94110
return non_empty_string(data.values.scdf.skipper.database.password)
95-
end
111+
end
112+

src/carvel/config/values/values.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ scdf:
1515
digest: ""
1616
service:
1717
type: ClusterIP
18+
allocateLoadBalancerNodePorts: true
19+
loadBalancerClass: ""
1820
resources:
1921
limits:
2022
cpu: ""
@@ -59,6 +61,8 @@ scdf:
5961
digest: ""
6062
service:
6163
type: ClusterIP
64+
allocateLoadBalancerNodePorts: true
65+
loadBalancerClass: ""
6266
resources:
6367
limits:
6468
cpu: ""

src/carvel/templates/bundle/repo/values-schema.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,12 @@ components:
7979
- ClusterIP
8080
- ExternalName
8181
description: Service type
82+
allocateLoadBalancerNodePorts:
83+
type: boolean
84+
description: Indicates if load balancer should create node ports. Default is true
85+
loadBalancerClass:
86+
type: string
87+
description: Determines a specific configured type of load balancer.
8288
resources:
8389
type: object
8490
properties:
@@ -185,6 +191,12 @@ components:
185191
- ClusterIP
186192
- ExternalName
187193
description: Service type
194+
allocateLoadBalancerNodePorts:
195+
type: boolean
196+
description: Indicates if load balancer should create node ports. Default is true
197+
loadBalancerClass:
198+
type: string
199+
description: Determines a specific configured type of load balancer.
188200
resources:
189201
type: object
190202
properties:

src/carvel/test/ordering.test.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ describe('ordering', () => {
2929
expect(findAnnotation(skipperDeployment, 'kapp.k14s.io/change-group')).toBe('scdf.tanzu.vmware.com/skipper');
3030
expect(findAnnotation(dataflowService, 'kapp.k14s.io/change-group')).toBe('scdf.tanzu.vmware.com/server');
3131
expect(findAnnotation(dataflowDeployment, 'kapp.k14s.io/change-group')).toBe('scdf.tanzu.vmware.com/server');
32-
3332
expect(findAnnotations(dataflowService, 'kapp.k14s.io/change-rule')).toContainAnyValues([
3433
'upsert after upserting scdf.tanzu.vmware.com/skipper'
3534
]);

src/carvel/test/servers.test.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,25 @@ describe('servers', () => {
3737
dataValueYamls: [
3838
...DEFAULT_REQUIRED_DATA_VALUES,
3939
'scdf.server.service.type=LoadBalancer',
40-
'scdf.skipper.service.type=LoadBalancer'
40+
'scdf.server.service.allocateLoadBalancerNodePorts=false',
41+
'scdf.skipper.service.type=ClusterIP',
42+
'scdf.skipper.service.allocateLoadBalancerNodePorts=true'
4143
]
4244
});
4345
expect(result.success, result.stderr).toBeTruthy();
4446
const yaml = result.stdout;
4547

4648
const dataflowService = findService(yaml, SCDF_SERVER_NAME);
49+
console.log(dataflowService);
4750
expect(dataflowService).toBeTruthy();
4851
expect(dataflowService?.spec?.type).toBe('LoadBalancer');
4952

53+
expect(dataflowService?.spec?.allocateLoadBalancerNodePorts).toBe(false);
54+
5055
const skipperService = findService(yaml, SKIPPER_NAME);
5156
expect(skipperService).toBeTruthy();
52-
expect(skipperService?.spec?.type).toBe('LoadBalancer');
57+
expect(skipperService?.spec?.type).toBe('ClusterIP');
58+
expect(skipperService?.spec?.allocateLoadBalancerNodePorts).toBeFalsy();
5359
});
5460

5561
it('should have tagged images', async () => {

src/deploy/carvel/carvel-add-package.sh

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ fi
1515
check_env NS
1616
check_env PACKAGE
1717
check_env PACKAGE_NAME
18+
1819
echo "Adding $PACKAGE as $PACKAGE_NAME in $NS"
1920

2021
if [ "$DEBUG" = "true" ]; then
@@ -23,5 +24,27 @@ else
2324
ARGS=""
2425
fi
2526
echo "Creating $PACKAGE_NAME for $PACKAGE"
26-
kctrl package repository add --namespace $NS --repository $PACKAGE_NAME --url $PACKAGE --yes --wait --wait-check-interval 10s $ARGS
27+
if [ "$REPO_SECRET_REF" = "" ]; then
28+
if [[ "$PACKAGE_NAME" == *"pro"* ]]; then
29+
REPO_SECRET_REF=reg-creds-dev-registry
30+
else
31+
REPO_SECRET_REF=reg-creds-dockerhub
32+
fi
33+
fi
34+
35+
echo "Using secretRef=$REPO_SECRET_REF in $PACKAGE_NAME for $PACKAGE"
36+
37+
kubectl apply --namespace $NS -f - <<EOF
38+
apiVersion: packaging.carvel.dev/v1alpha1
39+
kind: PackageRepository
40+
metadata:
41+
name: $PACKAGE_NAME
42+
spec:
43+
fetch:
44+
imgpkgBundle:
45+
image: $PACKAGE
46+
secretRef:
47+
name: $REPO_SECRET_REF
48+
EOF
49+
kctrl package repository kick --namespace $NS --repository $PACKAGE_NAME --yes --wait --wait-check-interval 10s
2750
kctrl package repository list --namespace $NS

src/deploy/carvel/carvel-add-registry-secret.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ function create_secret() {
3030
# --docker-password="$4" \
3131
# --namespace "$NS"
3232
echo "Annotating $SCRT_NAME for image-pull-secret"
33-
# kubectl annotate secret "$SCRT_NAME" --namespace "$SCRT_NS" secretgen.carvel.dev/image-pull-secret=""
3433
# kubectl annotate secret "$1" --namespace "$NS" secretgen.carvel.dev/image-pull-secret=""
3534
echo "Exporting $SCRT_NAME from $SCRT_NS"
3635
kubectl apply -f - <<EOF
@@ -40,7 +39,8 @@ metadata:
4039
name: ${SCRT_NAME}
4140
namespace: ${SCRT_NS}
4241
spec:
43-
toNamespace: '*'
42+
toNamespaces:
43+
- "*"
4444
EOF
4545

4646
}

src/deploy/carvel/carvel-deploy-package.sh

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@ if [ "$5" != "" ]; then
2525
fi
2626
if [ "$6" != "" ]; then
2727
SA=$6
28-
else
29-
SA=scdf-sa
3028
fi
3129
if [ ! -f "$VALUES_FILE" ]; then
3230
echo "Cannot find $VALUES_FILE"
@@ -43,12 +41,13 @@ if [ "$DEBUG" = "true" ]; then
4341
else
4442
ARGS=""
4543
fi
46-
if [ "$SA" = "" ]; then
47-
SA=scdf-sa
44+
SA_ARGS=
45+
if [ "$SA" != "" ]; then
46+
SA_ARGS="--service-account-name $SA"
4847
fi
4948
echo "Installing $APP_NAME from $PACKAGE_NAME:$PACKAGE_VERSION"
49+
# $SA_ARGS
5050
kctrl package install --package-install "$APP_NAME" \
51-
--service-account-name "$SA" \
5251
--package "$PACKAGE_NAME" \
5352
--values-file "$VALUES_FILE" \
5453
--version "$PACKAGE_VERSION" --namespace "$NS" --yes \

src/deploy/carvel/carvel-import-secret.sh

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,30 +26,30 @@ if [ "$NAMESPACE" = "" ]; then
2626
exit 2
2727
fi
2828
if [ "$IMPORT_TYPE" == "import" ]; then
29-
kubectl apply -f - <<EOF
29+
echo "Creating SecretImport $SECRET_NAME from $FROM_NAMESPACE to $NAMESPACE"
30+
kubectl apply --namespace $NAMESPACE -f - <<EOF
3031
apiVersion: secretgen.carvel.dev/v1alpha1
3132
kind: SecretImport
3233
metadata:
3334
name: $SECRET_NAME
34-
namespace: $NAMESPACE
3535
spec:
3636
fromNamespace: $FROM_NAMESPACE
3737
EOF
38-
echo "Created SecretImport $SECRET_NAME from $FROM_NAMESPACE to $NAMESPACE"
38+
echo "Created SecretImport $SECRET_NAME from $FROM_NAMESPACE to $NAMESPACE"
3939
else
40-
kubectl apply -f - <<EOF
40+
echo "Creating Placeholder Secret $SECRET_NAME in $NAMESPACE"
41+
kubectl apply --namespace $NAMESPACE -f - <<EOF
4142
apiVersion: v1
4243
kind: Secret
4344
metadata:
4445
name: $SECRET_NAME
45-
namespace: $NAMESPACE
4646
annotations:
4747
secretgen.carvel.dev/image-pull-secret: ""
4848
type: kubernetes.io/dockerconfigjson
4949
data:
5050
.dockerconfigjson: e30K
5151
EOF
52-
echo "Created Placeholder Secret $SECRET_NAME in $NAMESPACE"
52+
echo "Created Placeholder Secret $SECRET_NAME in $NAMESPACE"
5353
fi
5454

5555
if [ "$DEBUG" = "true" ]; then

0 commit comments

Comments
 (0)