mirror of
https://github.com/cozystack/cozystack.git
synced 2026-10-30 08:37:31 +09:00
A managed application's tenant-facing Services are its endpoints, and the only way to publish one externally has been the chart boolean `external`, which publishes one chart-chosen endpoint on one address from no particular pool through five different render paths. EndpointAttachment attaches one address, minted from an IPAddressClass or bound from a reserved IPAddressClaim, to one tenant-facing Service by rendering an additive LoadBalancer Service that mirrors the endpoint's selector and ports. The mechanism therefore needs no per-engine render knowledge and never touches the application's own objects, and a reserved address survives every attachment and moves between applications. The endpoint check requires both the lineage labels and the tenantresource marker: lineage alone also covers operator-internal Services. Identity is by owner reference throughout, so a Service carrying the ownership label without the reference is never adopted, and a same-name recreated application does not inherit the previous incarnation's attachments. The VM datapath modes render the cozy-proxy Service contract unchanged and are gated on a platform declaration rather than CNI detection: a proxy skips a Service delegated to a name it does not claim while the load balancer still attracts the address. Exclusivity is keyed on the backend pod in both modes because cozy-proxy's egress map holds one address per pod, and a whole-IP attachment with several ready backends keeps its address dark instead of picking one. The e2e suite is parked as disabled until the address substrate is packaged; the unit tests carry the hold/move and identity proofs. The kind lives in local.sdn.cozystack.io, the CRD-served half of the sdn family the address substrate and cozyplane share, so stock ResourceQuota counts keep working; the proposal text is being corrected from cozystack.io to match. Assisted-by: LLM Signed-off-by: Timofei Larkin <lllamnyp@gmail.com>
117 lines
5.0 KiB
Bash
Executable File
117 lines
5.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
# Copyright 2024 The Cozystack Authors.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
set -o errexit
|
|
set -o nounset
|
|
set -o pipefail
|
|
|
|
SCRIPT_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
|
|
# CODEGEN_VERSION must match the literal version pinned in CODEGEN_PKG
|
|
# below. The codegen-drift workflow's pre-fetch step greps this file
|
|
# for `code-generator@vX.Y.Z` and expects exactly one match, so keep
|
|
# the version literal only in CODEGEN_PKG (not duplicated in any
|
|
# comment) — bump both lines together when upgrading.
|
|
CODEGEN_VERSION=v0.35.0
|
|
CODEGEN_PKG=${CODEGEN_PKG:-~/go/pkg/mod/k8s.io/code-generator@v0.35.0}
|
|
|
|
# Pre-fetch the code-generator module if it is not yet in the local
|
|
# module cache. We intentionally do not declare k8s.io/code-generator
|
|
# in go.mod — the project does not import any of its packages from Go
|
|
# code; only this shell script consumes its kube_codegen.sh. On a
|
|
# clean CI runner the cache is empty, so the sourced script below
|
|
# would fail with "No such file or directory". Fetch it explicitly
|
|
# from a temporary module to keep the project's go.mod clean.
|
|
if [ ! -f "${CODEGEN_PKG}/kube_codegen.sh" ]; then
|
|
codegen_tmp=$(mktemp -d)
|
|
(
|
|
cd "${codegen_tmp}"
|
|
go mod init codegen-fetch >/dev/null
|
|
go get "k8s.io/code-generator@${CODEGEN_VERSION}" >/dev/null
|
|
)
|
|
rm -rf "${codegen_tmp}"
|
|
fi
|
|
API_KNOWN_VIOLATIONS_DIR="${API_KNOWN_VIOLATIONS_DIR:-"${SCRIPT_ROOT}/api/api-rules"}"
|
|
UPDATE_API_KNOWN_VIOLATIONS="${UPDATE_API_KNOWN_VIOLATIONS:-true}"
|
|
CONTROLLER_GEN="go run sigs.k8s.io/controller-tools/cmd/controller-gen@v0.16.4"
|
|
TMPDIR=$(mktemp -d)
|
|
OPERATOR_CRDDIR=internal/crdinstall/manifests
|
|
COZY_CONTROLLER_CRDDIR=packages/system/cozystack-controller/definitions
|
|
COZY_RD_CRDDIR=packages/system/application-definition-crd/definition
|
|
BACKUPS_CORE_CRDDIR=packages/system/backup-controller/definitions
|
|
BACKUPSTRATEGY_CRDDIR=packages/system/backupstrategy-controller/definitions
|
|
MIGRATION_CRDDIR=packages/system/migration-controller/definitions
|
|
|
|
trap 'rm -rf ${TMPDIR}' EXIT
|
|
|
|
source "${CODEGEN_PKG}/kube_codegen.sh"
|
|
|
|
THIS_PKG="github.com/cozystack/cozystack"
|
|
|
|
kube::codegen::gen_helpers \
|
|
--boilerplate "${SCRIPT_ROOT}/hack/boilerplate.go.txt" \
|
|
"${SCRIPT_ROOT}/pkg/apis"
|
|
|
|
kube::codegen::gen_helpers \
|
|
--boilerplate "${SCRIPT_ROOT}/hack/boilerplate.go.txt" \
|
|
"${SCRIPT_ROOT}/api"
|
|
|
|
if [[ -n "${API_KNOWN_VIOLATIONS_DIR:-}" ]]; then
|
|
report_filename="${API_KNOWN_VIOLATIONS_DIR}/cozystack_api_violation_exceptions.list"
|
|
if [[ "${UPDATE_API_KNOWN_VIOLATIONS:-}" == "true" ]]; then
|
|
update_report="--update-report"
|
|
fi
|
|
fi
|
|
|
|
kube::codegen::gen_openapi \
|
|
--extra-pkgs "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" \
|
|
--output-dir "${SCRIPT_ROOT}/pkg/generated/openapi" \
|
|
--output-pkg "${THIS_PKG}/pkg/generated/openapi" \
|
|
--report-filename "${report_filename:-"/dev/null"}" \
|
|
${update_report:+"${update_report}"} \
|
|
--boilerplate "${SCRIPT_ROOT}/hack/boilerplate.go.txt" \
|
|
"${SCRIPT_ROOT}/pkg/apis"
|
|
|
|
kube::codegen::gen_client \
|
|
--with-applyconfig \
|
|
--output-dir "${SCRIPT_ROOT}/pkg/generated" \
|
|
--output-pkg "${THIS_PKG}/pkg/generated" \
|
|
--boilerplate "${SCRIPT_ROOT}/hack/boilerplate.go.txt" \
|
|
"${SCRIPT_ROOT}/pkg/apis"
|
|
|
|
$CONTROLLER_GEN object:headerFile="hack/boilerplate.go.txt" paths="./api/..."
|
|
$CONTROLLER_GEN rbac:roleName=manager-role crd paths="./api/v1alpha1/..." paths="./api/backups/..." paths="./api/gateway/..." paths="./api/internalapi/..." paths="./api/localsdn/..." paths="./api/migration/..." output:crd:artifacts:config=${TMPDIR}
|
|
|
|
mv ${TMPDIR}/cozystack.io_packages.yaml ${OPERATOR_CRDDIR}/cozystack.io_packages.yaml
|
|
mv ${TMPDIR}/cozystack.io_packagesources.yaml ${OPERATOR_CRDDIR}/cozystack.io_packagesources.yaml
|
|
|
|
mv ${TMPDIR}/cozystack.io_applicationdefinitions.yaml \
|
|
${COZY_RD_CRDDIR}/cozystack.io_applicationdefinitions.yaml
|
|
|
|
mv ${TMPDIR}/backups.cozystack.io*.yaml ${BACKUPS_CORE_CRDDIR}/
|
|
mv ${TMPDIR}/strategy.backups.cozystack.io*.yaml ${BACKUPSTRATEGY_CRDDIR}/
|
|
mv ${TMPDIR}/forklift.cozystack.io*.yaml ${MIGRATION_CRDDIR}/
|
|
|
|
mv ${TMPDIR}/*.yaml ${COZY_CONTROLLER_CRDDIR}/
|
|
|
|
# Tidy dependencies for standalone api/apps/v1alpha1 submodule
|
|
(cd "${SCRIPT_ROOT}/api/apps/v1alpha1" && go mod tidy)
|
|
|
|
# Generate deepcopy for standalone api/apps/v1alpha1 submodule (separate Go module)
|
|
# Use absolute path for headerFile since we cd into the submodule directory
|
|
APPS_API_ROOT="$(cd "${SCRIPT_ROOT}" && pwd)"
|
|
(cd "${APPS_API_ROOT}/api/apps/v1alpha1" && $CONTROLLER_GEN object:headerFile="${APPS_API_ROOT}/hack/boilerplate.go.txt" paths="./...")
|
|
|