Skip to content

Copying MCAD CRDs in Kustomize config instead of referencing them #357

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 12 commits into from
Oct 20, 2023
2 changes: 2 additions & 0 deletions .github/workflows/verify_generated_files.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,15 @@ on:
- '**.go'
- '**go.mod'
- '**go.sum'
- 'config/**'
tags-ignore:
- 'v*'
pull_request:
paths:
- '**.go'
- '**go.mod'
- '**go.sum'
- 'config/**'
jobs:
verify-imports:
runs-on: ubuntu-latest
Expand Down
39 changes: 34 additions & 5 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -146,9 +146,12 @@ defaults:

gofmt -w $(DEFAULTS_TEST_FILE)

# this encounters sed issues on MacOS, quick fix is to use gsed or to escape the parentheses i.e. \( \)
.PHONY: manifests
manifests: controller-gen ## Generate RBAC objects.
manifests: controller-gen kustomize ## Generate RBAC objects.
$(CONTROLLER_GEN) rbac:roleName=manager-role webhook paths="./..."
# $(SED) -i -E "s|(- )\${MCAD_REPO}.*|\1\${MCAD_CRD}|" config/crd/mcad/kustomization.yaml
# $(KUSTOMIZE) build config/crd/mcad > config/crd/mcad.yaml && make split_yaml FILE=config/crd/mcad.yaml

.PHONY: fmt
fmt: ## Run go fmt against code.
Expand Down Expand Up @@ -192,19 +195,16 @@ endif

.PHONY: install
install: manifests kustomize ## Install CRDs into the K8s cluster specified in ~/.kube/config.
$(SED) -i -E "s|(- )\${MCAD_REPO}.*|\1\${MCAD_CRD}|" config/crd/mcad/kustomization.yaml
$(KUSTOMIZE) build config/crd | kubectl apply -f -
git restore config/*

.PHONY: uninstall
uninstall: manifests kustomize ## Uninstall CRDs from the K8s cluster specified in ~/.kube/config. Call with ignore-not-found=true to ignore resource not found errors during deletion.
$(SED) -i -E "s|(- )\${MCAD_REPO}.*|\1\${MCAD_CRD}|" config/crd/mcad/kustomization.yaml
$(KUSTOMIZE) build config/crd | kubectl delete --ignore-not-found=$(ignore-not-found) -f -
git restore config/*

.PHONY: deploy
deploy: manifests kustomize ## Deploy controller to the K8s cluster specified in ~/.kube/config.
$(SED) -i -E "s|(- )\${MCAD_REPO}.*|\1\${MCAD_CRD}|" config/crd/mcad/kustomization.yaml
cd config/manager && $(KUSTOMIZE) edit set image controller=${IMG}
$(KUSTOMIZE) build config/${ENV} | kubectl apply -f -
git restore config/*
Expand All @@ -224,6 +224,7 @@ $(LOCALBIN):

## Tool Binaries
KUSTOMIZE ?= $(LOCALBIN)/kustomize
YQ ?= $(LOCALBIN)/yq
CONTROLLER_GEN ?= $(LOCALBIN)/controller-gen
ENVTEST ?= $(LOCALBIN)/setup-envtest
OPENSHIFT-GOIMPORTS ?= $(LOCALBIN)/openshift-goimports
Expand Down Expand Up @@ -284,7 +285,6 @@ validate-bundle: install-operator-sdk
.PHONY: bundle
bundle: defaults manifests kustomize install-operator-sdk ## Generate bundle manifests and metadata, then validate generated files.
$(OPERATOR_SDK) generate kustomize manifests -q
$(SED) -i -E "s|(- )\${MCAD_REPO}.*|\1\${MCAD_CRD}|" config/crd/mcad/kustomization.yaml
cd config/manager && $(KUSTOMIZE) edit set image controller=$(IMG)
cd config/manifests && $(KUSTOMIZE) edit add patch --patch '[{"op":"add", "path":"/metadata/annotations/containerImage", "value": "$(IMG)" }]' --kind ClusterServiceVersion
cd config/manifests && $(KUSTOMIZE) edit add patch --patch '[{"op":"add", "path":"/spec/replaces", "value": "codeflare-operator.$(PREVIOUS_VERSION)" }]' --kind ClusterServiceVersion
Expand Down Expand Up @@ -388,3 +388,32 @@ verify-imports: openshift-goimports ## Run import verifications.
.PHONY: scorecard-bundle
scorecard-bundle: install-operator-sdk ## Run scorecard tests on bundle image.
$(OPERATOR_SDK) scorecard bundle


FILE ?= input.yaml # Default value, it isn't a file, but the make cmds fill hang for longer without it
temp_dir := temp_split
output_dir := 'config/crd/'

.PHONY: check_yq
check_yq:
@command -v wget >/dev/null 2>&1 || (echo "Installing wget..."; apt-get install -y wget)
@command -v $(YQ) >/dev/null 2>&1 || (echo "Installing yq..."; wget https://github.com/mikefarah/yq/releases/download/v4.2.0/yq_linux_amd64.tar.gz -O - |\
tar xz && mv yq_linux_amd64 $(YQ))

# this works on a MacOS by replacing awk with gawk
.PHONY: split_yaml
split_yaml:
@$(MAKE) check_yq
@mkdir -p $(temp_dir)
@awk '/apiVersion: /{if (x>0) close("$(temp_dir)/section_" x ".yaml"); x++}{print > "$(temp_dir)/section_"x".yaml"}' $(FILE)
@$(MAKE) process_sections

.PHONY: process_sections
process_sections:
@mkdir -p $(output_dir)
@for section_file in $(temp_dir)/section_*; do \
metadata_name=$$(YQ e '.metadata.name' $$section_file); \
file_name=$$(echo $$metadata_name | awk -F'.' '{print $$2"."$$3"_"$$1".yaml"}'); \
mv $$section_file $(output_dir)/$$file_name; \
done
@rm -r $(temp_dir)
5 changes: 4 additions & 1 deletion config/crd/kustomization.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,8 @@
# since it depends on service name and namespace that are out of this kustomize package.
# It should be run by config/default
resources:
- mcad
- quota.codeflare_quotasubtrees.yaml
- workload.codeflare_appwrappers.yaml
- workload.codeflare_schedulingspecs.yaml

#+kubebuilder:scaffold:crdkustomizeresource
2 changes: 1 addition & 1 deletion config/crd/mcad/kustomization.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- github.com/project-codeflare/multi-cluster-app-dispatcher/config/crd?ref=v0.0.0 # kpt-set: ${MCAD_CRD}
- github.com/project-codeflare/multi-cluster-app-dispatcher/config/crd?ref=v1.36.0
122 changes: 122 additions & 0 deletions config/crd/quota.codeflare_quotasubtrees.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.9.2
creationTimestamp: null
name: quotasubtrees.quota.codeflare.dev
spec:
group: quota.codeflare.dev
names:
kind: QuotaSubtree
listKind: QuotaSubtreeList
plural: quotasubtrees
singular: quotasubtree
scope: Namespaced
versions:
- name: v1alpha1
schema:
openAPIV3Schema:
description: QuotaSubtree is a specification for a quota subtree resource
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
spec:
description: QuotaSubtreeSpec is the spec for a resource plan
properties:
children:
items:
description: Child is the spec for a QuotaSubtree resource
properties:
name:
type: string
namespace:
type: string
path:
type: string
quotas:
description: Quota is the spec for a QuotaSubtree resource
properties:
disabled:
type: boolean
hardLimit:
type: boolean
requests:
additionalProperties:
anyOf:
- type: integer
- type: string
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
type: object
type: object
type: object
type: array
parent:
type: string
parentNamespace:
type: string
type: object
status:
description: QuotaSubtreeStatus is the status for a QuotaSubtree resource
properties:
children:
items:
description: ResourceAllocation is the spec for the child status
properties:
allocated:
description: ResourceAllocationStatus is the spec for the child
resource usage
properties:
requests:
additionalProperties:
type: string
type: object
type: object
name:
type: string
namespace:
type: string
path:
type: string
type: object
type: array
totalAllocation:
description: ResourceAllocation is the spec for the child status
properties:
allocated:
description: ResourceAllocationStatus is the spec for the child
resource usage
properties:
requests:
additionalProperties:
type: string
type: object
type: object
name:
type: string
namespace:
type: string
path:
type: string
type: object
required:
- children
- totalAllocation
type: object
required:
- spec
type: object
served: true
storage: true
---
Loading