diff --git a/.gitignore b/.gitignore index ab4d21d6..d4b0f2bf 100644 --- a/.gitignore +++ b/.gitignore @@ -37,4 +37,7 @@ build/ .prefs *.prefs .metadata/ -.factorypath \ No newline at end of file +.factorypath + +### Macbook ### +.DS_Store diff --git a/helm/.helmignore b/helm/.helmignore new file mode 100644 index 00000000..0e8a0eb3 --- /dev/null +++ b/helm/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/helm/Chart.yaml b/helm/Chart.yaml new file mode 100644 index 00000000..b65bfa77 --- /dev/null +++ b/helm/Chart.yaml @@ -0,0 +1,9 @@ +apiVersion: v2 +name: resource-group-controller +description: A Helm chart for resource-group-controller + +type: application + +version: 1.0.0 + +appVersion: "1.1.0-SNAPSHOT" diff --git a/helm/templates/_helpers.tpl b/helm/templates/_helpers.tpl new file mode 100644 index 00000000..f5e1dfba --- /dev/null +++ b/helm/templates/_helpers.tpl @@ -0,0 +1,19 @@ +{{/* +Create Resource Group Controller app version +*/}} +{{- define "resource-group-controller.version" -}} +{{- default .Chart.AppVersion .Values.image.tag }} +{{- end -}} + +{{/* +Resource Group Controller Envs Configuration +*/}} +{{- define "resource-group-controller.cm.envs" -}} +TZ: {{ .Values.app.timezone }} +SPRING_PROFILES_ACTIVE: {{ .Values.app.profile }} +LOGGING_LEVEL_IO_TEN1010_COASTER_GROUPCONTROLLER: {{ .Values.app.loggingLevel }} +SERVER_SSL_CERTIFICATE: {{ .Values.app.certificatePath }}/tls.crt +SERVER_SSL_CERTIFICATE_PRIVATE_KEY: {{ .Values.app.certificatePath }}/tls.key +SERVER_SSL_TRUST_CERTIFICATE: {{ .Values.app.certificatePath }}/ca.crt +APP_SCHEDULING_GROUP_NODE_ONLY: '{{ .Values.app.schedulingGroupNodeOnly }}' +{{- end }} \ No newline at end of file diff --git a/helm/templates/cert-webhook-crd.yaml b/helm/templates/cert-webhook-crd.yaml new file mode 100644 index 00000000..e1e34bd0 --- /dev/null +++ b/helm/templates/cert-webhook-crd.yaml @@ -0,0 +1,232 @@ +{{- $altNames := list ( "resource-group-controller.resource-group-controller.svc" ) -}} +{{- $ca := genCA "coaster" 365 -}} +{{- $cert := genSignedCert "resource-group-controller" nil $altNames 365 $ca -}} + + +apiVersion: admissionregistration.k8s.io/v1 +kind: MutatingWebhookConfiguration +metadata: + name: resource-group-controller.resource-group.ten1010.io + namespace: {{ .Release.Namespace }} +webhooks: + - name: resource-group-controller.resource-group.ten1010.io + admissionReviewVersions: ["v1"] + clientConfig: + caBundle: {{ $ca.Cert | b64enc | quote }} + service: + namespace: {{ .Release.Namespace }} + name: resource-group-controller + path: /admissionreviews + port: 8080 + failurePolicy: Ignore + matchPolicy: Equivalent + namespaceSelector: {} + objectSelector: {} + reinvocationPolicy: IfNeeded + rules: + - apiGroups: [ "" ] + apiVersions: [ "v1" ] + operations: [ "CREATE", "UPDATE" ] + resources: [ "pods", "replicationcontrollers" ] + scope: "*" + - apiGroups: [ "batch" ] + apiVersions: [ "v1" ] + operations: [ "CREATE", "UPDATE" ] + resources: [ "cronjobs", "jobs" ] + scope: "*" + - apiGroups: [ "apps" ] + apiVersions: [ "v1" ] + operations: [ "CREATE", "UPDATE" ] + resources: [ "daemonsets", "deployments", "replicasets", "statefulsets" ] + scope: "*" + sideEffects: None + timeoutSeconds: 10 +--- + +apiVersion: v1 +kind: Secret +type: kubernetes.io/tls +metadata: + name: resource-group-controller-tls + namespace: {{ .Release.Namespace }} + +data: + tls.crt: {{ $cert.Cert | b64enc | quote }} + tls.key: {{ $cert.Key | b64enc | quote }} + ca.crt: {{ $ca.Cert | b64enc | quote }} +--- + +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: resourcegroups.resource-group.ten1010.io +spec: + scope: Cluster + names: + kind: ResourceGroup + plural: resourcegroups + singular: resourcegroup + shortNames: + - rgroup + group: resource-group.ten1010.io + conversion: + strategy: Webhook + webhook: + conversionReviewVersions: [ "v1" ] + clientConfig: + service: + namespace: {{ .Release.Namespace }} + name: resource-group-controller + path: /crdconvert + port: 8080 + caBundle: {{ $ca.Cert | b64enc | quote }} + versions: + - name: v1beta2 + served: true + storage: true + additionalPrinterColumns: + - name: NODES + type: string + jsonPath: .spec.nodes + - name: NAMESPACES + type: string + jsonPath: .spec.namespaces + subresources: + status: { } + schema: + openAPIV3Schema: + type: object + required: + - metadata + - spec + properties: + metadata: + type: object + spec: + type: object + properties: + nodes: + type: array + items: + type: string + default: [ ] + namespaces: + type: array + items: + type: string + default: [ ] + daemonSet: + type: object + properties: + daemonSets: + type: array + items: + type: object + required: + - namespace + - name + properties: + namespace: + type: string + name: + type: string + default: [ ] + allowAll: + type: boolean + default: false + default: + daemonSets: [ ] + subjects: + type: array + items: + type: object + required: + - apiGroup + - kind + - name + properties: + apiGroup: + type: string + kind: + type: string + name: + type: string + namespace: + type: string + default: [ ] + status: + type: object + - name: v1beta1 + served: true + storage: false + deprecated: true + additionalPrinterColumns: + - name: NODES + type: string + jsonPath: .spec.nodes + - name: NAMESPACES + type: string + jsonPath: .spec.namespaces + subresources: + status: {} + schema: + openAPIV3Schema: + type: object + required: + - metadata + - spec + properties: + metadata: + type: object + spec: + type: object + properties: + nodes: + type: array + items: + type: string + default: [] + namespaces: + type: array + items: + type: string + default: [] + daemonSet: + type: object + properties: + daemonSets: + type: array + items: + type: object + required: + - namespace + - name + properties: + namespace: + type: string + name: + type: string + default: [] + default: + daemonSets: [] + subjects: + type: array + items: + type: object + required: + - apiGroup + - kind + - name + properties: + apiGroup: + type: string + kind: + type: string + name: + type: string + namespace: + type: string + default: [] + status: + type: object +--- diff --git a/helm/templates/cluster-role.yaml b/helm/templates/cluster-role.yaml new file mode 100644 index 00000000..68b5b1c9 --- /dev/null +++ b/helm/templates/cluster-role.yaml @@ -0,0 +1,78 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: resource-group-controller.resource-group.ten1010.io +rules: + - apiGroups: [ "resource-group.ten1010.io" ] + resources: [ "resourcegroups" ] + verbs: [ "get", "watch", "list" ] + - apiGroups: [ "" ] + resources: [ "pods", "replicationcontrollers" ] + verbs: [ "get", "watch", "list", "update", "delete" ] + - apiGroups: [ "batch" ] + resources: [ "cronjobs", "jobs" ] + verbs: [ "get", "watch", "list", "update", "delete" ] + - apiGroups: [ "apps" ] + resources: [ "daemonsets", "deployments", "replicasets", "statefulsets" ] + verbs: [ "get", "watch", "list", "update", "delete" ] + - apiGroups: [ "" ] + resources: [ "nodes" ] + verbs: [ "get", "watch", "list", "update" ] + - apiGroups: [ "rbac.authorization.k8s.io" ] + resources: [ "roles" ] + verbs: [ "create", "get", "watch", "list", "update", "delete" ] + - apiGroups: [ "rbac.authorization.k8s.io" ] + resources: [ "rolebindings" ] + verbs: [ "create", "get", "watch", "list", "update", "delete" ] + - apiGroups: [ "rbac.authorization.k8s.io" ] + resources: [ "clusterroles" ] + verbs: [ "create", "get", "watch", "list", "update", "delete" ] + - apiGroups: [ "rbac.authorization.k8s.io" ] + resources: [ "clusterrolebindings" ] + verbs: [ "create", "get", "watch", "list", "update", "delete" ] + - apiGroups: [ "" ] + resources: [ "namespaces" ] + verbs: [ "get", "watch", "list" ] + + ### Needed to reconcile resource group role ### + - apiGroups: [ "" ] + resources: [ "pods", "replicationcontrollers", "services", "configmaps", "secrets", "persistentvolumeclaims", "serviceaccounts", "limitranges", "events" ] + verbs: [ "*" ] + - apiGroups: [ "events.k8s.io" ] + resources: [ "events" ] + verbs: [ "*" ] + - apiGroups: [ "batch" ] + resources: [ "cronjobs", "jobs" ] + verbs: [ "*" ] + - apiGroups: [ "apps" ] + resources: [ "daemonsets", "deployments", "replicasets", "statefulsets" ] + verbs: [ "*" ] + - apiGroups: [ "autoscaling" ] + resources: [ "horizontalpodautoscalers" ] + verbs: [ "*" ] + - apiGroups: [ "policy" ] + resources: [ "poddisruptionbudgets" ] + verbs: [ "*" ] + - apiGroups: [ "ten1010.io" ] + resources: [ "resourcegroups" ] + verbs: [ "get" ] + - apiGroups: [ "" ] + resources: [ "nodes" ] + verbs: [ "get" ] + - apiGroups: [ "" ] + resources: [ "namespaces" ] + verbs: [ "get" ] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: resource-group-controller.resource-group.ten1010.io +subjects: + - kind: ServiceAccount + namespace: {{ .Release.Namespace }} + name: resource-group-controller +roleRef: + kind: ClusterRole + name: resource-group-controller.resource-group.ten1010.io + apiGroup: rbac.authorization.k8s.io +--- diff --git a/helm/templates/configmap.yaml b/helm/templates/configmap.yaml new file mode 100644 index 00000000..8c0f566d --- /dev/null +++ b/helm/templates/configmap.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: resource-group-controller-envs + namespace: {{ .Release.Namespace }} + +data: + {{- include "resource-group-controller.cm.envs" . | nindent 2 }} +--- diff --git a/helm/templates/deployment.yaml b/helm/templates/deployment.yaml new file mode 100644 index 00000000..ecd365f2 --- /dev/null +++ b/helm/templates/deployment.yaml @@ -0,0 +1,53 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: resource-group-controller + namespace: {{ .Release.Namespace }} +spec: + replicas: 1 + selector: + matchLabels: + app: resource-group-controller + template: + metadata: + labels: + app: resource-group-controller + spec: + serviceAccountName: resource-group-controller + automountServiceAccountToken: true + containers: + - name: resource-group-controller + image: "{{ .Values.image.repository }}:{{ include "resource-group-controller.version" . }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + envFrom: + - configMapRef: + name: resource-group-controller-envs + volumeMounts: + - name: tls + readOnly: true + mountPath: {{ .Values.app.certificatePath }} + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 1 + preference: + matchExpressions: + - key: node-role.kubernetes.io/control-plane + operator: Exists + tolerations: + - key: "node-role.kubernetes.io/control-plane" + operator: "Exists" + effect: "NoSchedule" + volumes: + - name: tls + projected: + sources: + - secret: + name: resource-group-controller-tls + items: + - key: tls.crt + path: "tls.crt" + - key: tls.key + path: "tls.key" + - key: ca.crt + path: "ca.crt" \ No newline at end of file diff --git a/helm/templates/service-account.yaml b/helm/templates/service-account.yaml new file mode 100644 index 00000000..e196df25 --- /dev/null +++ b/helm/templates/service-account.yaml @@ -0,0 +1,5 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: resource-group-controller + namespace: {{ .Release.Namespace }} diff --git a/helm/templates/service.yaml b/helm/templates/service.yaml new file mode 100644 index 00000000..8d07e257 --- /dev/null +++ b/helm/templates/service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: resource-group-controller + namespace: {{ .Release.Namespace }} +spec: + type: {{ .Values.service.type }} + selector: + app: resource-group-controller + ports: + - protocol: TCP + port: {{ .Values.service.port }} + targetPort: {{ .Values.service.targetPort }} diff --git a/helm/values.yaml b/helm/values.yaml new file mode 100644 index 00000000..12e2aa78 --- /dev/null +++ b/helm/values.yaml @@ -0,0 +1,16 @@ +image: + pullPolicy: IfNotPresent + repository: ten1010io/resource-group-controller + tag: "" + +app: + certificatePath: /etc/resource-group-controller/tls + timezone: Asia/Seoul + profile: production + loggingLevel: info + schedulingGroupNodeOnly: true + +service: + type: ClusterIP + targetPort: 8080 + port: 8080 diff --git a/kubernetes/controller/cert/configure.sh b/kubernetes/controller/cert/configure.sh index 97c034a0..d9c66c75 100755 --- a/kubernetes/controller/cert/configure.sh +++ b/kubernetes/controller/cert/configure.sh @@ -10,4 +10,6 @@ if [ ! -e "$output_dir_path/tls.p12" ]; then fi ca_bundle=$($script_path/get-ca-bundle.sh) sed -i 's/caBundle:.*/''caBundle: '"$ca_bundle"'/g' "../patches.yaml" -cp -f $output_dir_path/tls.p12 $script_path/../ +cp -f $output_dir_path/ca.crt $script_path/../ +cp -f $output_dir_path/tls.crt $script_path/../ +cp -f $output_dir_path/tls.key $script_path/../ diff --git a/kubernetes/controller/kustomization.yaml b/kubernetes/controller/kustomization.yaml index a707567f..c801d221 100644 --- a/kubernetes/controller/kustomization.yaml +++ b/kubernetes/controller/kustomization.yaml @@ -5,14 +5,15 @@ configMapGenerator: - TZ=Asia/Seoul - SPRING_PROFILES_ACTIVE=production - LOGGING_LEVEL_IO_TEN1010_COASTER_GROUPCONTROLLER=info - - SERVER_SSL_KEY_STORE=/etc/resource-group-controller/tls/tls.p12 + - SERVER_SSL_CERTIFICATE=/etc/resource-group-controller/tls/tls.crt + - SERVER_SSL_CERTIFICATE_PRIVATE_KEY=/etc/resource-group-controller/tls/tls.key + - SERVER_SSL_TRUST_CERTIFICATE=/etc/resource-group-controller/tls/ca.crt secretGenerator: - - name: resource-group-controller-envs - literals: - - SERVER_SSL_KEY_STORE_PASSWORD="" - name: resource-group-controller-tls files: - - tls.p12 + - tls.crt + - tls.key + - ca.crt generatorOptions: disableNameSuffixHash: true resources: diff --git a/kubernetes/controller/patches.yaml b/kubernetes/controller/patches.yaml index 9cca9b12..32229b22 100644 --- a/kubernetes/controller/patches.yaml +++ b/kubernetes/controller/patches.yaml @@ -20,3 +20,12 @@ webhooks: clientConfig: caBundle: ### To be patched ### --- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: resourcegroups.resource-group.ten1010.io +spec: + conversion: + webhook: + clientConfig: + caBundle: ### To be patched ### \ No newline at end of file diff --git a/kubernetes/controller/templates/crd.yaml b/kubernetes/controller/templates/crd.yaml index fbf98ccf..b32ce02a 100644 --- a/kubernetes/controller/templates/crd.yaml +++ b/kubernetes/controller/templates/crd.yaml @@ -11,10 +11,97 @@ spec: shortNames: - rgroup group: resource-group.ten1010.io + conversion: + strategy: Webhook + webhook: + conversionReviewVersions: [ "v1" ] + clientConfig: + service: + namespace: resource-group-controller + name: resource-group-controller + path: /crdconvert + port: 8080 + caBundle: versions: - - name: v1beta1 + - name: v1beta2 served: true storage: true + additionalPrinterColumns: + - name: NODES + type: string + jsonPath: .spec.nodes + - name: NAMESPACES + type: string + jsonPath: .spec.namespaces + subresources: + status: { } + schema: + openAPIV3Schema: + type: object + required: + - metadata + - spec + properties: + metadata: + type: object + spec: + type: object + properties: + nodes: + type: array + items: + type: string + default: [ ] + namespaces: + type: array + items: + type: string + default: [ ] + daemonSet: + type: object + properties: + daemonSets: + type: array + items: + type: object + required: + - namespace + - name + properties: + namespace: + type: string + name: + type: string + default: [ ] + allowAll: + type: boolean + default: false + default: + daemonSets: [ ] + subjects: + type: array + items: + type: object + required: + - apiGroup + - kind + - name + properties: + apiGroup: + type: string + kind: + type: string + name: + type: string + namespace: + type: string + default: [ ] + status: + type: object + - name: v1beta1 + served: true + storage: false + deprecated: true additionalPrinterColumns: - name: NODES type: string @@ -84,4 +171,3 @@ spec: default: [] status: type: object ---- diff --git a/kubernetes/controller/templates/deployment.yaml b/kubernetes/controller/templates/deployment.yaml index 85ca5c18..c5568248 100644 --- a/kubernetes/controller/templates/deployment.yaml +++ b/kubernetes/controller/templates/deployment.yaml @@ -32,8 +32,6 @@ spec: envFrom: - configMapRef: name: resource-group-controller-envs - - secretRef: - name: resource-group-controller-envs volumeMounts: - name: tls readOnly: true @@ -45,6 +43,10 @@ spec: - secret: name: resource-group-controller-tls items: - - key: tls.p12 - path: "tls.p12" + - key: tls.crt + path: "tls.crt" + - key: tls.key + path: "tls.key" + - key: ca.crt + path: "ca.crt" --- diff --git a/pom.xml b/pom.xml index dc0e2ec4..53a7b13a 100644 --- a/pom.xml +++ b/pom.xml @@ -18,7 +18,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.4 + 2.7.14 diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/configuration/ClusterControllerConfiguration.java b/src/main/java/io/ten1010/coaster/groupcontroller/configuration/ClusterControllerConfiguration.java index b6f62a06..4ef97432 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/configuration/ClusterControllerConfiguration.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/configuration/ClusterControllerConfiguration.java @@ -11,7 +11,7 @@ import io.ten1010.coaster.groupcontroller.controller.cluster.role.RoleControllerFactory; import io.ten1010.coaster.groupcontroller.controller.cluster.rolebinding.RoleBindingControllerFactory; import io.ten1010.coaster.groupcontroller.core.K8sApis; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -26,8 +26,8 @@ public Controller nodeController( Indexer nodeIndexer = sharedInformerFactory .getExistingSharedIndexInformer(V1Node.class) .getIndexer(); - Indexer groupIndexer = sharedInformerFactory - .getExistingSharedIndexInformer(V1Beta1ResourceGroup.class) + Indexer groupIndexer = sharedInformerFactory + .getExistingSharedIndexInformer(V1Beta2ResourceGroup.class) .getIndexer(); return new NodeControllerFactory(sharedInformerFactory, nodeIndexer, groupIndexer, k8sApis, eventRecorder) .create(); @@ -43,8 +43,8 @@ public Controller roleController( Indexer namespaceIndexer = sharedInformerFactory .getExistingSharedIndexInformer(V1Namespace.class) .getIndexer(); - Indexer groupIndexer = sharedInformerFactory - .getExistingSharedIndexInformer(V1Beta1ResourceGroup.class) + Indexer groupIndexer = sharedInformerFactory + .getExistingSharedIndexInformer(V1Beta2ResourceGroup.class) .getIndexer(); return new RoleControllerFactory( sharedInformerFactory, @@ -67,8 +67,8 @@ public Controller roleBindingController( Indexer namespaceIndexer = sharedInformerFactory .getExistingSharedIndexInformer(V1Namespace.class) .getIndexer(); - Indexer groupIndexer = sharedInformerFactory - .getExistingSharedIndexInformer(V1Beta1ResourceGroup.class) + Indexer groupIndexer = sharedInformerFactory + .getExistingSharedIndexInformer(V1Beta2ResourceGroup.class) .getIndexer(); return new RoleBindingControllerFactory( sharedInformerFactory, @@ -86,8 +86,8 @@ public Controller clusterRoleController( Indexer clusterRoleIndexer = sharedInformerFactory .getExistingSharedIndexInformer(V1ClusterRole.class) .getIndexer(); - Indexer groupIndexer = sharedInformerFactory - .getExistingSharedIndexInformer(V1Beta1ResourceGroup.class) + Indexer groupIndexer = sharedInformerFactory + .getExistingSharedIndexInformer(V1Beta2ResourceGroup.class) .getIndexer(); return new ClusterRoleControllerFactory( sharedInformerFactory, @@ -106,8 +106,8 @@ public Controller clusterRoleBindingController( Indexer clusterRoleIndexer = sharedInformerFactory .getExistingSharedIndexInformer(V1ClusterRole.class) .getIndexer(); - Indexer groupIndexer = sharedInformerFactory - .getExistingSharedIndexInformer(V1Beta1ResourceGroup.class) + Indexer groupIndexer = sharedInformerFactory + .getExistingSharedIndexInformer(V1Beta2ResourceGroup.class) .getIndexer(); return new ClusterRoleBindingControllerFactory( sharedInformerFactory, diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/configuration/ControllerConfiguration.java b/src/main/java/io/ten1010/coaster/groupcontroller/configuration/ControllerConfiguration.java index 94697301..5dad6e5f 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/configuration/ControllerConfiguration.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/configuration/ControllerConfiguration.java @@ -11,7 +11,7 @@ import io.ten1010.coaster.groupcontroller.controller.Reconciliation; import io.ten1010.coaster.groupcontroller.controller.SharedInformerFactoryFactory; import io.ten1010.coaster.groupcontroller.core.K8sApis; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; import org.springframework.boot.CommandLineRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -50,8 +50,8 @@ public SharedInformerFactory sharedInformerFactory(K8sApis k8sApis) { @Bean public Reconciliation reconciliation(SharedInformerFactory sharedInformerFactory) { - Indexer groupIndexer = sharedInformerFactory - .getExistingSharedIndexInformer(V1Beta1ResourceGroup.class) + Indexer groupIndexer = sharedInformerFactory + .getExistingSharedIndexInformer(V1Beta2ResourceGroup.class) .getIndexer(); return new Reconciliation(groupIndexer); } diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/Reconciliation.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/Reconciliation.java index d09f8246..6d1115e1 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/Reconciliation.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/Reconciliation.java @@ -3,10 +3,11 @@ import io.kubernetes.client.informer.cache.Indexer; import io.kubernetes.client.openapi.models.*; import io.ten1010.coaster.groupcontroller.core.*; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; import org.springframework.lang.Nullable; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -14,7 +15,7 @@ public class Reconciliation { - private static Optional reconcileAffinity(@Nullable V1Affinity existingAffinity, List groups) { + private static Optional reconcileAffinity(@Nullable V1Affinity existingAffinity, List groups) { List terms = new ArrayList<>(); if (existingAffinity == null) { if (groups.isEmpty()) { @@ -64,7 +65,7 @@ private static Optional reconcileAffinity(@Nullable V1Affinity exist return Optional.of(clone); } - private static List reconcileTolerations(List existingTolerations, List groups) { + private static List reconcileTolerations(List existingTolerations, List groups) { List tolerations = replaceAllKeyAllEffectTolerations(existingTolerations); tolerations = replaceAllKeyNoScheduleEffectTolerations(tolerations); tolerations = removeResourceGroupExclusiveTolerations(tolerations); @@ -135,7 +136,7 @@ private static List extractNonResourceGroupExclusiveNodeSele .collect(Collectors.toList()); } - private static List buildResourceGroupExclusiveNodeSelectorTerms(List groups) { + private static List buildResourceGroupExclusiveNodeSelectorTerms(List groups) { V1NodeSelectorRequirement requirement = new V1NodeSelectorRequirementBuilder() .withKey(Labels.KEY_RESOURCE_GROUP_EXCLUSIVE) .withOperator("In") @@ -163,13 +164,13 @@ private static List removeResourceGroupExclusiveTolerations(List buildResourceGroupExclusiveTolerations(List groups) { + private static List buildResourceGroupExclusiveTolerations(List groups) { return groups.stream() .flatMap(e -> buildResourceGroupExclusiveTolerations(e).stream()) .collect(Collectors.toList()); } - private static List buildResourceGroupExclusiveTolerations(V1Beta1ResourceGroup group) { + private static List buildResourceGroupExclusiveTolerations(V1Beta2ResourceGroup group) { V1TolerationBuilder baseBuilder = new V1TolerationBuilder() .withKey(Taints.KEY_RESOURCE_GROUP_EXCLUSIVE) .withValue(K8sObjectUtil.getName(group)) @@ -188,9 +189,9 @@ private static boolean isResourceGroupExclusiveToleration(V1Toleration toleratio return toleration.getKey().equals(Taints.KEY_RESOURCE_GROUP_EXCLUSIVE); } - private Indexer groupIndexer; + private Indexer groupIndexer; - public Reconciliation(Indexer groupIndexer) { + public Reconciliation(Indexer groupIndexer) { this.groupIndexer = groupIndexer; } @@ -198,7 +199,7 @@ public Optional reconcileUncontrolledCronJobAffinity(V1CronJob cronJ if (K8sObjectUtil.isControlled(cronJob)) { throw new IllegalArgumentException(); } - List groups = this.groupIndexer.byIndex( + List groups = this.groupIndexer.byIndex( IndexNames.BY_NAMESPACE_NAME_TO_GROUP_OBJECT, K8sObjectUtil.getNamespace(cronJob)); return reconcileAffinity(CronJobUtil.getAffinity(cronJob).orElse(null), groups); @@ -215,7 +216,7 @@ public Optional reconcileUncontrolledDeploymentAffinity(V1Deployment if (K8sObjectUtil.isControlled(deployment)) { throw new IllegalArgumentException(); } - List groups = this.groupIndexer.byIndex( + List groups = this.groupIndexer.byIndex( IndexNames.BY_NAMESPACE_NAME_TO_GROUP_OBJECT, K8sObjectUtil.getNamespace(deployment)); return reconcileAffinity(DeploymentUtil.getAffinity(deployment).orElse(null), groups); @@ -225,7 +226,7 @@ public Optional reconcileUncontrolledJobAffinity(V1Job job) { if (K8sObjectUtil.isControlled(job)) { throw new IllegalArgumentException(); } - List groups = this.groupIndexer.byIndex( + List groups = this.groupIndexer.byIndex( IndexNames.BY_NAMESPACE_NAME_TO_GROUP_OBJECT, K8sObjectUtil.getNamespace(job)); return reconcileAffinity(JobUtil.getAffinity(job).orElse(null), groups); @@ -235,7 +236,7 @@ public Optional reconcileUncontrolledPodAffinity(V1Pod pod) { if (K8sObjectUtil.isControlled(pod)) { throw new IllegalArgumentException(); } - List groups = this.groupIndexer.byIndex( + List groups = this.groupIndexer.byIndex( IndexNames.BY_NAMESPACE_NAME_TO_GROUP_OBJECT, K8sObjectUtil.getNamespace(pod)); return reconcileAffinity(PodUtil.getAffinity(pod).orElse(null), groups); @@ -245,7 +246,7 @@ public Optional reconcileUncontrolledReplicaSetAffinity(V1ReplicaSet if (K8sObjectUtil.isControlled(replicaSet)) { throw new IllegalArgumentException(); } - List groups = this.groupIndexer.byIndex( + List groups = this.groupIndexer.byIndex( IndexNames.BY_NAMESPACE_NAME_TO_GROUP_OBJECT, K8sObjectUtil.getNamespace(replicaSet)); return reconcileAffinity(ReplicaSetUtil.getAffinity(replicaSet).orElse(null), groups); @@ -255,7 +256,7 @@ public Optional reconcileUncontrolledReplicationControllerAffinity(V if (K8sObjectUtil.isControlled(replicationController)) { throw new IllegalArgumentException(); } - List groups = this.groupIndexer.byIndex( + List groups = this.groupIndexer.byIndex( IndexNames.BY_NAMESPACE_NAME_TO_GROUP_OBJECT, K8sObjectUtil.getNamespace(replicationController)); return reconcileAffinity(ReplicationControllerUtil.getAffinity(replicationController).orElse(null), groups); @@ -265,7 +266,7 @@ public Optional reconcileUncontrolledStatefulSetAffinity(V1StatefulS if (K8sObjectUtil.isControlled(statefulSet)) { throw new IllegalArgumentException(); } - List groups = this.groupIndexer.byIndex( + List groups = this.groupIndexer.byIndex( IndexNames.BY_NAMESPACE_NAME_TO_GROUP_OBJECT, K8sObjectUtil.getNamespace(statefulSet)); return reconcileAffinity(StatefulSetUtil.getAffinity(statefulSet).orElse(null), groups); @@ -275,7 +276,7 @@ public List reconcileUncontrolledCronJobTolerations(V1CronJob cron if (K8sObjectUtil.isControlled(cronJob)) { throw new IllegalArgumentException(); } - List groups = this.groupIndexer.byIndex( + List groups = this.groupIndexer.byIndex( IndexNames.BY_NAMESPACE_NAME_TO_GROUP_OBJECT, K8sObjectUtil.getNamespace(cronJob)); return reconcileTolerations(CronJobUtil.getTolerations(cronJob), groups); @@ -285,12 +286,17 @@ public List reconcileUncontrolledDaemonSetTolerations(V1DaemonSet if (K8sObjectUtil.isControlled(daemonSet)) { throw new IllegalArgumentException(); } - List groupsContainingNamespace = this.groupIndexer.byIndex( + List groupsContainingNamespace = this.groupIndexer.byIndex( IndexNames.BY_NAMESPACE_NAME_TO_GROUP_OBJECT, K8sObjectUtil.getNamespace(daemonSet)); - List groupsContainingDaemonSet = this.groupIndexer.byIndex( + List groupsContainingDaemonSet = this.groupIndexer.byIndex( IndexNames.BY_DAEMON_SET_KEY_TO_GROUP_OBJECT, KeyUtil.buildKey(K8sObjectUtil.getNamespace(daemonSet), K8sObjectUtil.getName(daemonSet))); - List groups = Stream.concat(groupsContainingNamespace.stream(), groupsContainingDaemonSet.stream()) + List groupsAllowingAllDaemonSet = this.groupIndexer.byIndex( + IndexNames.BY_GROUP_ALLOW_ALL_DAEMON_SET_TO_GROUP_OBJECT, Boolean.TRUE.toString() + ); + List groups = Stream.of( + groupsContainingNamespace, groupsContainingDaemonSet, groupsAllowingAllDaemonSet) + .flatMap(Collection::stream) .distinct() .collect(Collectors.toList()); @@ -301,7 +307,7 @@ public List reconcileUncontrolledDeploymentTolerations(V1Deploymen if (K8sObjectUtil.isControlled(deployment)) { throw new IllegalArgumentException(); } - List groups = this.groupIndexer.byIndex( + List groups = this.groupIndexer.byIndex( IndexNames.BY_NAMESPACE_NAME_TO_GROUP_OBJECT, K8sObjectUtil.getNamespace(deployment)); return reconcileTolerations(DeploymentUtil.getTolerations(deployment), groups); @@ -311,7 +317,7 @@ public List reconcileUncontrolledJobTolerations(V1Job job) { if (K8sObjectUtil.isControlled(job)) { throw new IllegalArgumentException(); } - List groups = this.groupIndexer.byIndex( + List groups = this.groupIndexer.byIndex( IndexNames.BY_NAMESPACE_NAME_TO_GROUP_OBJECT, K8sObjectUtil.getNamespace(job)); return reconcileTolerations(JobUtil.getTolerations(job), groups); @@ -321,7 +327,7 @@ public List reconcileUncontrolledPodTolerations(V1Pod pod) { if (K8sObjectUtil.isControlled(pod)) { throw new IllegalArgumentException(); } - List groups = this.groupIndexer.byIndex( + List groups = this.groupIndexer.byIndex( IndexNames.BY_NAMESPACE_NAME_TO_GROUP_OBJECT, K8sObjectUtil.getNamespace(pod)); return reconcileTolerations(PodUtil.getTolerations(pod), groups); @@ -331,7 +337,7 @@ public List reconcileUncontrolledReplicaSetTolerations(V1ReplicaSe if (K8sObjectUtil.isControlled(replicaSet)) { throw new IllegalArgumentException(); } - List groups = this.groupIndexer.byIndex( + List groups = this.groupIndexer.byIndex( IndexNames.BY_NAMESPACE_NAME_TO_GROUP_OBJECT, K8sObjectUtil.getNamespace(replicaSet)); return reconcileTolerations(ReplicaSetUtil.getTolerations(replicaSet), groups); @@ -341,7 +347,7 @@ public List reconcileUncontrolledReplicationControllerTolerations( if (K8sObjectUtil.isControlled(replicationController)) { throw new IllegalArgumentException(); } - List groups = this.groupIndexer.byIndex( + List groups = this.groupIndexer.byIndex( IndexNames.BY_NAMESPACE_NAME_TO_GROUP_OBJECT, K8sObjectUtil.getNamespace(replicationController)); return reconcileTolerations(ReplicationControllerUtil.getTolerations(replicationController), groups); @@ -351,7 +357,7 @@ public List reconcileUncontrolledStatefulSetTolerations(V1Stateful if (K8sObjectUtil.isControlled(statefulSet)) { throw new IllegalArgumentException(); } - List groups = this.groupIndexer.byIndex( + List groups = this.groupIndexer.byIndex( IndexNames.BY_NAMESPACE_NAME_TO_GROUP_OBJECT, K8sObjectUtil.getNamespace(statefulSet)); return reconcileTolerations(StatefulSetUtil.getTolerations(statefulSet), groups); diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/SharedInformerFactoryFactory.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/SharedInformerFactoryFactory.java index a7fa5f0d..fb7a8f6d 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/SharedInformerFactoryFactory.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/SharedInformerFactoryFactory.java @@ -4,10 +4,13 @@ import io.kubernetes.client.informer.SharedInformerFactory; import io.kubernetes.client.openapi.models.*; import io.ten1010.coaster.groupcontroller.core.*; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2DaemonSet; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroupSpec; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.function.Function; import java.util.stream.Collectors; @@ -15,20 +18,30 @@ public class SharedInformerFactoryFactory { public static long RESYNC_PERIOD_IN_MILLIS = 30000; - private static Map>> byNodeNameToGroupObject() { + private static Map>> byNodeNameToGroupObject() { return Map.of(IndexNames.BY_NODE_NAME_TO_GROUP_OBJECT, ResourceGroupUtil::getNodes); } - private static Map>> byNamespaceNameToGroupObject() { + private static Map>> byNamespaceNameToGroupObject() { return Map.of(IndexNames.BY_NAMESPACE_NAME_TO_GROUP_OBJECT, ResourceGroupUtil::getNamespaces); } - private static Map>> byDaemonSetKeyToGroupObject() { + private static Map>> byDaemonSetKeyToGroupObject() { return Map.of(IndexNames.BY_DAEMON_SET_KEY_TO_GROUP_OBJECT, object -> ResourceGroupUtil.getDaemonSets(object).stream() .map(KeyUtil::getKey) .collect(Collectors.toList())); } + private static Map>> byGroupAllowAllDaemonSetToGroupObject() { + return Map.of(IndexNames.BY_GROUP_ALLOW_ALL_DAEMON_SET_TO_GROUP_OBJECT, group -> List.of( + Optional.ofNullable(group.getSpec()) + .map(V1Beta2ResourceGroupSpec::getDaemonSet) + .map(V1Beta2DaemonSet::isAllowAll) + .map(v -> Boolean.toString(v)) + .orElseThrow() + )); + } + private static Map>> byNamespaceNameToCronJobObject() { return Map.of(IndexNames.BY_NAMESPACE_NAME_TO_CRON_JOB_OBJECT, object -> List.of(K8sObjectUtil.getNamespace(object))); @@ -77,13 +90,14 @@ public SharedInformerFactoryFactory(K8sApis k8sApis) { public SharedInformerFactory create() { SharedInformerFactory informerFactory = new SharedInformerFactory(this.k8sApis.getApiClient()); - SharedIndexInformer groupInformer = informerFactory.sharedIndexInformerFor( + SharedIndexInformer groupInformer = informerFactory.sharedIndexInformerFor( this.k8sApis.getResourceGroupApi(), - V1Beta1ResourceGroup.class, + V1Beta2ResourceGroup.class, RESYNC_PERIOD_IN_MILLIS); groupInformer.addIndexers(byNodeNameToGroupObject()); groupInformer.addIndexers(byNamespaceNameToGroupObject()); groupInformer.addIndexers(byDaemonSetKeyToGroupObject()); + groupInformer.addIndexers(byGroupAllowAllDaemonSetToGroupObject()); SharedIndexInformer cronJobInformer = informerFactory.sharedIndexInformerFor( this.k8sApis.getCronJobApi(), diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrole/ClusterRoleControllerFactory.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrole/ClusterRoleControllerFactory.java index 6145d5d9..04070439 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrole/ClusterRoleControllerFactory.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrole/ClusterRoleControllerFactory.java @@ -6,18 +6,18 @@ import io.kubernetes.client.informer.cache.Indexer; import io.kubernetes.client.openapi.models.V1ClusterRole; import io.ten1010.coaster.groupcontroller.core.K8sApis; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; public class ClusterRoleControllerFactory { private SharedInformerFactory informerFactory; - private Indexer groupIndexer; + private Indexer groupIndexer; private Indexer clusterRoleIndexer; private K8sApis k8sApis; public ClusterRoleControllerFactory( SharedInformerFactory informerFactory, - Indexer groupIndexer, + Indexer groupIndexer, Indexer clusterRoleIndexer, K8sApis k8sApis) { this.informerFactory = informerFactory; diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrole/ClusterRoleReconciler.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrole/ClusterRoleReconciler.java index a9e2c0c1..d9e18cd6 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrole/ClusterRoleReconciler.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrole/ClusterRoleReconciler.java @@ -10,7 +10,7 @@ import io.ten1010.coaster.groupcontroller.controller.KubernetesApiReconcileExceptionHandlingTemplate; import io.ten1010.coaster.groupcontroller.core.K8sObjectUtil; import io.ten1010.coaster.groupcontroller.core.KeyUtil; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; import lombok.extern.slf4j.Slf4j; import java.time.Duration; @@ -44,7 +44,7 @@ private static List buildRules(List groups, List n return List.of(groupApiRule, nodeApiRule, namespaceApiRule); } - private static List buildRules(V1Beta1ResourceGroup group) { + private static List buildRules(V1Beta2ResourceGroup group) { String groupName = K8sObjectUtil.getName(group); Objects.requireNonNull(group.getSpec()); return buildRules(List.of(groupName), group.getSpec().getNodes(), group.getSpec().getNamespaces()); @@ -56,16 +56,16 @@ private static List getRules(V1ClusterRole clusterRole) { private static V1OwnerReference buildOwnerReference(String groupName, String groupUid) { V1OwnerReferenceBuilder builder = new V1OwnerReferenceBuilder(); - return builder.withApiVersion(V1Beta1ResourceGroup.API_VERSION) + return builder.withApiVersion(V1Beta2ResourceGroup.API_VERSION) .withBlockOwnerDeletion(true) .withController(true) - .withKind(V1Beta1ResourceGroup.KIND) + .withKind(V1Beta2ResourceGroup.KIND) .withName(groupName) .withUid(groupUid) .build(); } - private static V1OwnerReference buildOwnerReference(V1Beta1ResourceGroup group) { + private static V1OwnerReference buildOwnerReference(V1Beta2ResourceGroup group) { Objects.requireNonNull(group.getMetadata()); Objects.requireNonNull(group.getMetadata().getName()); Objects.requireNonNull(group.getMetadata().getUid()); @@ -73,12 +73,12 @@ private static V1OwnerReference buildOwnerReference(V1Beta1ResourceGroup group) } private KubernetesApiReconcileExceptionHandlingTemplate template; - private Indexer groupIndexer; + private Indexer groupIndexer; private Indexer clusterRoleIndexer; private RbacAuthorizationV1Api rbacAuthorizationV1Api; public ClusterRoleReconciler( - Indexer groupIndexer, + Indexer groupIndexer, Indexer clusterRoleIndexer, RbacAuthorizationV1Api rbacAuthorizationV1Api) { this.template = new KubernetesApiReconcileExceptionHandlingTemplate(API_CONFLICT_REQUEUE_DURATION, API_FAIL_REQUEUE_DURATION); @@ -95,7 +95,7 @@ public Result reconcile(Request request) { return new Result(false); } String groupName = ResourceGroupClusterRoleName.fromClusterRoleName(request.getName()).getResourceGroupName(); - V1Beta1ResourceGroup group = this.groupIndexer.getByKey(groupName); + V1Beta2ResourceGroup group = this.groupIndexer.getByKey(groupName); if (group == null) { deleteClusterRoleIfExist(request.getName()); return new Result(false); diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrole/ResourceGroupWatch.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrole/ResourceGroupWatch.java index d669014e..4e55eeb0 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrole/ResourceGroupWatch.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrole/ResourceGroupWatch.java @@ -5,15 +5,15 @@ import io.kubernetes.client.extended.workqueue.WorkQueue; import io.kubernetes.client.informer.ResourceEventHandler; import io.ten1010.coaster.groupcontroller.core.K8sObjectUtil; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; import java.time.Duration; -public class ResourceGroupWatch implements ControllerWatch { +public class ResourceGroupWatch implements ControllerWatch { public static final Duration RESYNC_PERIOD = Duration.ofSeconds(30); - public static class EventHandler implements ResourceEventHandler { + public static class EventHandler implements ResourceEventHandler { private static Request buildRequest(String groupName) { return new Request(new ResourceGroupClusterRoleName(groupName).getName()); @@ -26,19 +26,19 @@ public EventHandler(WorkQueue queue) { } @Override - public void onAdd(V1Beta1ResourceGroup obj) { + public void onAdd(V1Beta2ResourceGroup obj) { String groupName = K8sObjectUtil.getName(obj); this.queue.add(buildRequest(groupName)); } @Override - public void onUpdate(V1Beta1ResourceGroup oldObj, V1Beta1ResourceGroup newObj) { + public void onUpdate(V1Beta2ResourceGroup oldObj, V1Beta2ResourceGroup newObj) { String groupName = K8sObjectUtil.getName(newObj); this.queue.add(buildRequest(groupName)); } @Override - public void onDelete(V1Beta1ResourceGroup obj, boolean deletedFinalStateUnknown) { + public void onDelete(V1Beta2ResourceGroup obj, boolean deletedFinalStateUnknown) { } } @@ -50,12 +50,12 @@ public ResourceGroupWatch(WorkQueue queue) { } @Override - public Class getResourceClass() { - return V1Beta1ResourceGroup.class; + public Class getResourceClass() { + return V1Beta2ResourceGroup.class; } @Override - public ResourceEventHandler getResourceEventHandler() { + public ResourceEventHandler getResourceEventHandler() { return new EventHandler(this.queue); } diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrolebinding/ClusterRoleBindingControllerFactory.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrolebinding/ClusterRoleBindingControllerFactory.java index 9b1b688c..cff761a9 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrolebinding/ClusterRoleBindingControllerFactory.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrolebinding/ClusterRoleBindingControllerFactory.java @@ -7,19 +7,19 @@ import io.kubernetes.client.openapi.models.V1ClusterRole; import io.kubernetes.client.openapi.models.V1ClusterRoleBinding; import io.ten1010.coaster.groupcontroller.core.K8sApis; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; public class ClusterRoleBindingControllerFactory { private SharedInformerFactory informerFactory; - private Indexer groupIndexer; + private Indexer groupIndexer; private Indexer clusterRoleBindingIndexer; private Indexer clusterRoleIndexer; private K8sApis k8sApis; public ClusterRoleBindingControllerFactory( SharedInformerFactory informerFactory, - Indexer groupIndexer, + Indexer groupIndexer, Indexer clusterRoleBindingIndexer, Indexer clusterRoleIndexer, K8sApis k8sApis) { diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrolebinding/ClusterRoleBindingReconciler.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrolebinding/ClusterRoleBindingReconciler.java index b7b95d05..d3896a10 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrolebinding/ClusterRoleBindingReconciler.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrolebinding/ClusterRoleBindingReconciler.java @@ -10,7 +10,7 @@ import io.ten1010.coaster.groupcontroller.controller.KubernetesApiReconcileExceptionHandlingTemplate; import io.ten1010.coaster.groupcontroller.controller.cluster.clusterrole.ResourceGroupClusterRoleName; import io.ten1010.coaster.groupcontroller.core.KeyUtil; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; import lombok.extern.slf4j.Slf4j; import java.time.Duration; @@ -43,16 +43,16 @@ private static List getSubjects(V1ClusterRoleBinding clusterRoleBindi private static V1OwnerReference buildOwnerReference(String groupName, String groupUid) { V1OwnerReferenceBuilder builder = new V1OwnerReferenceBuilder(); - return builder.withApiVersion(V1Beta1ResourceGroup.API_VERSION) + return builder.withApiVersion(V1Beta2ResourceGroup.API_VERSION) .withBlockOwnerDeletion(true) .withController(true) - .withKind(V1Beta1ResourceGroup.KIND) + .withKind(V1Beta2ResourceGroup.KIND) .withName(groupName) .withUid(groupUid) .build(); } - private static V1OwnerReference buildOwnerReference(V1Beta1ResourceGroup group) { + private static V1OwnerReference buildOwnerReference(V1Beta2ResourceGroup group) { Objects.requireNonNull(group.getMetadata()); Objects.requireNonNull(group.getMetadata().getName()); Objects.requireNonNull(group.getMetadata().getUid()); @@ -60,13 +60,13 @@ private static V1OwnerReference buildOwnerReference(V1Beta1ResourceGroup group) } private KubernetesApiReconcileExceptionHandlingTemplate template; - private Indexer groupIndexer; + private Indexer groupIndexer; private Indexer clusterRoleBindingIndexer; private Indexer clusterRoleIndexer; private RbacAuthorizationV1Api rbacAuthorizationV1Api; public ClusterRoleBindingReconciler( - Indexer groupIndexer, + Indexer groupIndexer, Indexer clusterRoleBindingIndexer, Indexer clusterRoleIndexer, RbacAuthorizationV1Api rbacAuthorizationV1Api) { @@ -85,7 +85,7 @@ public Result reconcile(Request request) { return new Result(false); } String groupName = ResourceGroupClusterRoleBindingName.fromClusterRoleBindingName(request.getName()).getResourceGroupName(); - V1Beta1ResourceGroup group = this.groupIndexer.getByKey(groupName); + V1Beta2ResourceGroup group = this.groupIndexer.getByKey(groupName); if (group == null) { deleteClusterRoleBindingIfExist(request.getName()); return new Result(false); diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrolebinding/ResourceGroupWatch.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrolebinding/ResourceGroupWatch.java index 263bab5e..47d18896 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrolebinding/ResourceGroupWatch.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrolebinding/ResourceGroupWatch.java @@ -5,15 +5,15 @@ import io.kubernetes.client.extended.workqueue.WorkQueue; import io.kubernetes.client.informer.ResourceEventHandler; import io.ten1010.coaster.groupcontroller.core.K8sObjectUtil; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; import java.time.Duration; -public class ResourceGroupWatch implements ControllerWatch { +public class ResourceGroupWatch implements ControllerWatch { public static final Duration RESYNC_PERIOD = Duration.ofSeconds(30); - public static class EventHandler implements ResourceEventHandler { + public static class EventHandler implements ResourceEventHandler { private static Request buildRequest(String groupName) { return new Request(new ResourceGroupClusterRoleBindingName(groupName).getName()); @@ -26,19 +26,19 @@ public EventHandler(WorkQueue queue) { } @Override - public void onAdd(V1Beta1ResourceGroup obj) { + public void onAdd(V1Beta2ResourceGroup obj) { String groupName = K8sObjectUtil.getName(obj); this.queue.add(buildRequest(groupName)); } @Override - public void onUpdate(V1Beta1ResourceGroup oldObj, V1Beta1ResourceGroup newObj) { + public void onUpdate(V1Beta2ResourceGroup oldObj, V1Beta2ResourceGroup newObj) { String groupName = K8sObjectUtil.getName(newObj); this.queue.add(buildRequest(groupName)); } @Override - public void onDelete(V1Beta1ResourceGroup obj, boolean deletedFinalStateUnknown) { + public void onDelete(V1Beta2ResourceGroup obj, boolean deletedFinalStateUnknown) { } } @@ -50,12 +50,12 @@ public ResourceGroupWatch(WorkQueue queue) { } @Override - public Class getResourceClass() { - return V1Beta1ResourceGroup.class; + public Class getResourceClass() { + return V1Beta2ResourceGroup.class; } @Override - public ResourceEventHandler getResourceEventHandler() { + public ResourceEventHandler getResourceEventHandler() { return new EventHandler(this.queue); } diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/node/NodeControllerFactory.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/node/NodeControllerFactory.java index 919cf0b1..26ce96e4 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/node/NodeControllerFactory.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/node/NodeControllerFactory.java @@ -7,20 +7,20 @@ import io.kubernetes.client.informer.cache.Indexer; import io.kubernetes.client.openapi.models.V1Node; import io.ten1010.coaster.groupcontroller.core.K8sApis; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; public class NodeControllerFactory { private SharedInformerFactory informerFactory; private Indexer nodeIndexer; - private Indexer groupIndexer; + private Indexer groupIndexer; private K8sApis k8sApis; private EventRecorder eventRecorder; public NodeControllerFactory( SharedInformerFactory informerFactory, Indexer nodeIndexer, - Indexer groupIndexer, + Indexer groupIndexer, K8sApis k8sApis, EventRecorder eventRecorder) { this.informerFactory = informerFactory; diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/node/NodeReconciler.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/node/NodeReconciler.java index 5bc74129..40ab3b22 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/node/NodeReconciler.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/node/NodeReconciler.java @@ -14,7 +14,7 @@ import io.kubernetes.client.openapi.models.V1TaintBuilder; import io.ten1010.coaster.groupcontroller.controller.KubernetesApiReconcileExceptionHandlingTemplate; import io.ten1010.coaster.groupcontroller.core.*; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; import lombok.extern.slf4j.Slf4j; import org.springframework.lang.Nullable; @@ -45,13 +45,13 @@ private static List getTaints(V1Node node) { } /** - * Check whether given taint has ResourceGroup{@link V1Beta1ResourceGroup} exclusive key. + * Check whether given taint has ResourceGroup{@link V1Beta2ResourceGroup} exclusive key. *

* See constant string in TaintConstants{@link Taints}. *

* * @param taint - * @return {@code true} if this taint has ResourceGroup{@link V1Beta1ResourceGroup} exclusive key + * @return {@code true} if this taint has ResourceGroup{@link V1Beta2ResourceGroup} exclusive key */ private static boolean isResourceGroupExclusiveTaint(V1Taint taint) { if (taint.getKey() == null) { @@ -62,12 +62,12 @@ private static boolean isResourceGroupExclusiveTaint(V1Taint taint) { } /** - * Build exclusive taints for ResourceGroup{@link V1Beta1ResourceGroup} which has no schedule and no execute effect, and has resource group name as value. + * Build exclusive taints for ResourceGroup{@link V1Beta2ResourceGroup} which has no schedule and no execute effect, and has resource group name as value. * * @param group * @return a list of taints */ - private static List buildResourceGroupExclusiveTaints(V1Beta1ResourceGroup group) { + private static List buildResourceGroupExclusiveTaints(V1Beta2ResourceGroup group) { V1TaintBuilder baseBuilder = new V1TaintBuilder() .withKey(Taints.KEY_RESOURCE_GROUP_EXCLUSIVE) .withValue(K8sObjectUtil.getName(group)); @@ -80,12 +80,12 @@ private static List buildResourceGroupExclusiveTaints(V1Beta1ResourceGr private KubernetesApiReconcileExceptionHandlingTemplate template; private Indexer nodeIndexer; - private Indexer groupIndexer; + private Indexer groupIndexer; private CoreV1Api coreV1Api; private EventRecorder eventRecorder; - public NodeReconciler(Indexer nodeIndexer, Indexer groupIndexer, CoreV1Api coreV1Api, EventRecorder eventRecorder) { + public NodeReconciler(Indexer nodeIndexer, Indexer groupIndexer, CoreV1Api coreV1Api, EventRecorder eventRecorder) { this.template = new KubernetesApiReconcileExceptionHandlingTemplate(API_CONFLICT_REQUEUE_DURATION, API_FAIL_REQUEUE_DURATION); this.nodeIndexer = nodeIndexer; this.groupIndexer = groupIndexer; @@ -110,9 +110,9 @@ public Result reconcile(Request request) { } log.debug("Node [{}] founded while reconciling\n{}", nodeKey, node.toString()); - List groups = this.groupIndexer.byIndex(IndexNames.BY_NODE_NAME_TO_GROUP_OBJECT, K8sObjectUtil.getName(node)); + List groups = this.groupIndexer.byIndex(IndexNames.BY_NODE_NAME_TO_GROUP_OBJECT, K8sObjectUtil.getName(node)); if (groups.size() > 1) { - for (V1Beta1ResourceGroup g : groups) { + for (V1Beta2ResourceGroup g : groups) { this.eventRecorder.event( g, EventType.Warning, @@ -139,7 +139,7 @@ public Result reconcile(Request request) { * @param group * @return a map has reconciled labels */ - private Map reconcileLabels(V1Node node, @Nullable V1Beta1ResourceGroup group) { + private Map reconcileLabels(V1Node node, @Nullable V1Beta2ResourceGroup group) { Map labels = getLabels(node); labels.remove(Labels.KEY_RESOURCE_GROUP_EXCLUSIVE); if (group == null) { @@ -154,7 +154,7 @@ private Map reconcileLabels(V1Node node, @Nullable V1Beta1Resour * @param group * @return a list of reconciled taints */ - private List reconcileTaints(V1Node node, @Nullable V1Beta1ResourceGroup group) { + private List reconcileTaints(V1Node node, @Nullable V1Beta2ResourceGroup group) { List taints = getTaints(node).stream() .filter(e -> !isResourceGroupExclusiveTaint(e)) .collect(Collectors.toList()); diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/node/ResourceGroupWatch.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/node/ResourceGroupWatch.java index f936df0d..90827ff0 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/node/ResourceGroupWatch.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/node/ResourceGroupWatch.java @@ -4,7 +4,7 @@ import io.kubernetes.client.extended.controller.reconciler.Request; import io.kubernetes.client.extended.workqueue.WorkQueue; import io.kubernetes.client.informer.ResourceEventHandler; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; import java.time.Duration; import java.util.ArrayList; @@ -13,13 +13,13 @@ import java.util.Set; import java.util.stream.Collectors; -public class ResourceGroupWatch implements ControllerWatch { +public class ResourceGroupWatch implements ControllerWatch { public static final Duration RESYNC_PERIOD = Duration.ofSeconds(30); - public static class EventHandler implements ResourceEventHandler { + public static class EventHandler implements ResourceEventHandler { - private static List getNodes(V1Beta1ResourceGroup obj) { + private static List getNodes(V1Beta2ResourceGroup obj) { if (obj.getSpec() == null) { return new ArrayList<>(); } @@ -43,7 +43,7 @@ public EventHandler(WorkQueue queue) { } @Override - public void onAdd(V1Beta1ResourceGroup obj) { + public void onAdd(V1Beta2ResourceGroup obj) { Set requests = getNodes(obj).stream() .map(Request::new) .collect(Collectors.toSet()); @@ -51,7 +51,7 @@ public void onAdd(V1Beta1ResourceGroup obj) { } @Override - public void onUpdate(V1Beta1ResourceGroup oldObj, V1Beta1ResourceGroup newObj) { + public void onUpdate(V1Beta2ResourceGroup oldObj, V1Beta2ResourceGroup newObj) { Set requests = getAddedOrDeletedNodes(getNodes(oldObj), getNodes(newObj)).stream() .map(Request::new) .collect(Collectors.toSet()); @@ -59,7 +59,7 @@ public void onUpdate(V1Beta1ResourceGroup oldObj, V1Beta1ResourceGroup newObj) { } @Override - public void onDelete(V1Beta1ResourceGroup obj, boolean deletedFinalStateUnknown) { + public void onDelete(V1Beta2ResourceGroup obj, boolean deletedFinalStateUnknown) { Set requests = getNodes(obj).stream() .map(Request::new) .collect(Collectors.toSet()); @@ -75,12 +75,12 @@ public ResourceGroupWatch(WorkQueue queue) { } @Override - public Class getResourceClass() { - return V1Beta1ResourceGroup.class; + public Class getResourceClass() { + return V1Beta2ResourceGroup.class; } @Override - public ResourceEventHandler getResourceEventHandler() { + public ResourceEventHandler getResourceEventHandler() { return new EventHandler(this.queue); } diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/role/NamespaceWatch.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/role/NamespaceWatch.java index 312eb0af..de89187c 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/role/NamespaceWatch.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/role/NamespaceWatch.java @@ -8,7 +8,7 @@ import io.kubernetes.client.openapi.models.V1Namespace; import io.ten1010.coaster.groupcontroller.core.IndexNames; import io.ten1010.coaster.groupcontroller.core.K8sObjectUtil; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; import java.time.Duration; import java.util.List; @@ -20,18 +20,18 @@ public class NamespaceWatch implements ControllerWatch { public static class EventHandler implements ResourceEventHandler { private WorkQueue queue; - private Indexer groupIndexer; + private Indexer groupIndexer; public EventHandler( WorkQueue queue, - Indexer groupIndexer) { + Indexer groupIndexer) { this.queue = queue; this.groupIndexer = groupIndexer; } @Override public void onAdd(V1Namespace obj) { - List groups = this.groupIndexer.byIndex(IndexNames.BY_NAMESPACE_NAME_TO_GROUP_OBJECT, K8sObjectUtil.getName(obj)); + List groups = this.groupIndexer.byIndex(IndexNames.BY_NAMESPACE_NAME_TO_GROUP_OBJECT, K8sObjectUtil.getName(obj)); groups.stream() .map(group -> { String roleName = new ResourceGroupRoleName(K8sObjectUtil.getName(group)).getName(); @@ -51,11 +51,11 @@ public void onDelete(V1Namespace obj, boolean deletedFinalStateUnknown) { } private WorkQueue queue; - private Indexer groupIndexer; + private Indexer groupIndexer; public NamespaceWatch( WorkQueue queue, - Indexer groupIndexer) { + Indexer groupIndexer) { this.queue = queue; this.groupIndexer = groupIndexer; } diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/role/ResourceGroupWatch.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/role/ResourceGroupWatch.java index 7f1eed57..d44fa8ff 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/role/ResourceGroupWatch.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/role/ResourceGroupWatch.java @@ -5,19 +5,19 @@ import io.kubernetes.client.extended.controller.reconciler.Request; import io.kubernetes.client.extended.workqueue.WorkQueue; import io.kubernetes.client.informer.ResourceEventHandler; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; import java.time.Duration; import java.util.*; import java.util.stream.Collectors; -public class ResourceGroupWatch implements ControllerWatch { +public class ResourceGroupWatch implements ControllerWatch { public static final Duration RESYNC_PERIOD = Duration.ofSeconds(30); - public static class EventHandler implements ResourceEventHandler { + public static class EventHandler implements ResourceEventHandler { - private static List getNamespaces(V1Beta1ResourceGroup obj) { + private static List getNamespaces(V1Beta2ResourceGroup obj) { if (obj.getSpec() == null) { return new ArrayList<>(); } @@ -48,7 +48,7 @@ public EventHandler(WorkQueue queue) { } @Override - public void onAdd(V1Beta1ResourceGroup obj) { + public void onAdd(V1Beta2ResourceGroup obj) { String groupName = getName(obj); Set requests = getNamespaces(obj).stream() .map(e -> buildRequest(groupName, e)) @@ -57,7 +57,7 @@ public void onAdd(V1Beta1ResourceGroup obj) { } @Override - public void onUpdate(V1Beta1ResourceGroup oldObj, V1Beta1ResourceGroup newObj) { + public void onUpdate(V1Beta2ResourceGroup oldObj, V1Beta2ResourceGroup newObj) { String groupName = getName(newObj); Set requests = getAddedOrDeletedNamespaces(getNamespaces(oldObj), getNamespaces(newObj)).stream() .map(e -> buildRequest(groupName, e)) @@ -66,7 +66,7 @@ public void onUpdate(V1Beta1ResourceGroup oldObj, V1Beta1ResourceGroup newObj) { } @Override - public void onDelete(V1Beta1ResourceGroup obj, boolean deletedFinalStateUnknown) { + public void onDelete(V1Beta2ResourceGroup obj, boolean deletedFinalStateUnknown) { } private Request buildRequest(String groupName, String roleNamespace) { @@ -83,12 +83,12 @@ public ResourceGroupWatch(WorkQueue queue) { } @Override - public Class getResourceClass() { - return V1Beta1ResourceGroup.class; + public Class getResourceClass() { + return V1Beta2ResourceGroup.class; } @Override - public ResourceEventHandler getResourceEventHandler() { + public ResourceEventHandler getResourceEventHandler() { return new EventHandler(this.queue); } diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/role/RoleControllerFactory.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/role/RoleControllerFactory.java index ce2f6238..ef7d8aeb 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/role/RoleControllerFactory.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/role/RoleControllerFactory.java @@ -7,20 +7,20 @@ import io.kubernetes.client.openapi.models.V1Namespace; import io.kubernetes.client.openapi.models.V1Role; import io.ten1010.coaster.groupcontroller.core.K8sApis; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; public class RoleControllerFactory { private SharedInformerFactory informerFactory; private Indexer namespaceIndexer; - private Indexer groupIndexer; + private Indexer groupIndexer; private Indexer roleIndexer; private K8sApis k8sApis; public RoleControllerFactory( SharedInformerFactory informerFactory, Indexer namespaceIndexer, - Indexer groupIndexer, + Indexer groupIndexer, Indexer roleIndexer, K8sApis k8sApis) { this.informerFactory = informerFactory; diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/role/RoleReconciler.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/role/RoleReconciler.java index dc50eb96..3288b35e 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/role/RoleReconciler.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/role/RoleReconciler.java @@ -9,7 +9,7 @@ import io.kubernetes.client.openapi.models.*; import io.ten1010.coaster.groupcontroller.controller.KubernetesApiReconcileExceptionHandlingTemplate; import io.ten1010.coaster.groupcontroller.core.KeyUtil; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; import lombok.extern.slf4j.Slf4j; import java.time.Duration; @@ -73,16 +73,16 @@ private static List getRules(V1Role role) { private static V1OwnerReference buildOwnerReference(String groupName, String groupUid) { V1OwnerReferenceBuilder builder = new V1OwnerReferenceBuilder(); - return builder.withApiVersion(V1Beta1ResourceGroup.API_VERSION) + return builder.withApiVersion(V1Beta2ResourceGroup.API_VERSION) .withBlockOwnerDeletion(true) .withController(true) - .withKind(V1Beta1ResourceGroup.KIND) + .withKind(V1Beta2ResourceGroup.KIND) .withName(groupName) .withUid(groupUid) .build(); } - private static V1OwnerReference buildOwnerReference(V1Beta1ResourceGroup group) { + private static V1OwnerReference buildOwnerReference(V1Beta2ResourceGroup group) { Objects.requireNonNull(group.getMetadata()); Objects.requireNonNull(group.getMetadata().getName()); Objects.requireNonNull(group.getMetadata().getUid()); @@ -91,13 +91,13 @@ private static V1OwnerReference buildOwnerReference(V1Beta1ResourceGroup group) private KubernetesApiReconcileExceptionHandlingTemplate template; private Indexer namespaceIndexer; - private Indexer groupIndexer; + private Indexer groupIndexer; private Indexer roleIndexer; private RbacAuthorizationV1Api rbacAuthorizationV1Api; public RoleReconciler( Indexer namespaceIndexer, - Indexer groupIndexer, + Indexer groupIndexer, Indexer roleIndexer, RbacAuthorizationV1Api rbacAuthorizationV1Api) { this.template = new KubernetesApiReconcileExceptionHandlingTemplate(API_CONFLICT_REQUEUE_DURATION, API_FAIL_REQUEUE_DURATION); @@ -108,7 +108,7 @@ public RoleReconciler( } /** - * Reconcile given role based on {@link Request} to ensure its namespace and its policy compared with {@link V1Beta1ResourceGroup}. + * Reconcile given role based on {@link Request} to ensure its namespace and its policy compared with {@link V1Beta2ResourceGroup}. * * @param request the reconcile request which triggered by watch events * @return the result @@ -125,7 +125,7 @@ public Result reconcile(Request request) { return new Result(false); } String groupName = ResourceGroupRoleName.fromRoleName(request.getName()).getResourceGroupName(); - V1Beta1ResourceGroup group = this.groupIndexer.getByKey(groupName); + V1Beta2ResourceGroup group = this.groupIndexer.getByKey(groupName); if (group == null) { deleteRoleIfExist(request.getNamespace(), request.getName()); return new Result(false); diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/rolebinding/NamespaceWatch.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/rolebinding/NamespaceWatch.java index bbab9aa5..3a40d0dc 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/rolebinding/NamespaceWatch.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/rolebinding/NamespaceWatch.java @@ -8,7 +8,7 @@ import io.kubernetes.client.openapi.models.V1Namespace; import io.ten1010.coaster.groupcontroller.core.IndexNames; import io.ten1010.coaster.groupcontroller.core.K8sObjectUtil; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; import java.time.Duration; import java.util.List; @@ -20,18 +20,18 @@ public class NamespaceWatch implements ControllerWatch { public static class EventHandler implements ResourceEventHandler { private WorkQueue queue; - private Indexer groupIndexer; + private Indexer groupIndexer; public EventHandler( WorkQueue queue, - Indexer groupIndexer) { + Indexer groupIndexer) { this.queue = queue; this.groupIndexer = groupIndexer; } @Override public void onAdd(V1Namespace obj) { - List groups = this.groupIndexer.byIndex(IndexNames.BY_NAMESPACE_NAME_TO_GROUP_OBJECT, K8sObjectUtil.getName(obj)); + List groups = this.groupIndexer.byIndex(IndexNames.BY_NAMESPACE_NAME_TO_GROUP_OBJECT, K8sObjectUtil.getName(obj)); groups.stream() .map(group -> { String bindingName = new ResourceGroupRoleBindingName(K8sObjectUtil.getName(group)).getName(); @@ -51,11 +51,11 @@ public void onDelete(V1Namespace obj, boolean deletedFinalStateUnknown) { } private WorkQueue queue; - private Indexer groupIndexer; + private Indexer groupIndexer; public NamespaceWatch( WorkQueue queue, - Indexer groupIndexer) { + Indexer groupIndexer) { this.queue = queue; this.groupIndexer = groupIndexer; } diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/rolebinding/ResourceGroupWatch.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/rolebinding/ResourceGroupWatch.java index d124affd..e9f6e932 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/rolebinding/ResourceGroupWatch.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/rolebinding/ResourceGroupWatch.java @@ -6,19 +6,19 @@ import io.kubernetes.client.extended.workqueue.WorkQueue; import io.kubernetes.client.informer.ResourceEventHandler; import io.kubernetes.client.openapi.models.V1Subject; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; import java.time.Duration; import java.util.*; import java.util.stream.Collectors; -public class ResourceGroupWatch implements ControllerWatch { +public class ResourceGroupWatch implements ControllerWatch { public static final Duration RESYNC_PERIOD = Duration.ofSeconds(30); - public static class EventHandler implements ResourceEventHandler { + public static class EventHandler implements ResourceEventHandler { - private static List getNamespaces(V1Beta1ResourceGroup obj) { + private static List getNamespaces(V1Beta2ResourceGroup obj) { if (obj.getSpec() == null) { return new ArrayList<>(); } @@ -49,14 +49,14 @@ private static String getName(KubernetesObject obj) { return obj.getMetadata().getName(); } - private static List getSubjects(V1Beta1ResourceGroup obj) { + private static List getSubjects(V1Beta2ResourceGroup obj) { if (obj.getSpec() == null) { return new ArrayList<>(); } return obj.getSpec().getSubjects(); } - private static boolean changeExistOnSubjects(V1Beta1ResourceGroup oldObj, V1Beta1ResourceGroup newObj) { + private static boolean changeExistOnSubjects(V1Beta2ResourceGroup oldObj, V1Beta2ResourceGroup newObj) { return !getSubjects(oldObj).equals(getSubjects(newObj)); } @@ -71,7 +71,7 @@ public EventHandler(WorkQueue queue) { } @Override - public void onAdd(V1Beta1ResourceGroup obj) { + public void onAdd(V1Beta2ResourceGroup obj) { String groupName = getName(obj); Set requests = getNamespaces(obj).stream() .map(e -> buildRequest(groupName, e)) @@ -80,7 +80,7 @@ public void onAdd(V1Beta1ResourceGroup obj) { } @Override - public void onUpdate(V1Beta1ResourceGroup oldObj, V1Beta1ResourceGroup newObj) { + public void onUpdate(V1Beta2ResourceGroup oldObj, V1Beta2ResourceGroup newObj) { String groupName = getName(newObj); Set requests1 = getAddedOrDeletedNamespaces(getNamespaces(oldObj), getNamespaces(newObj)).stream() .map(e -> buildRequest(groupName, e)) @@ -95,7 +95,7 @@ public void onUpdate(V1Beta1ResourceGroup oldObj, V1Beta1ResourceGroup newObj) { } @Override - public void onDelete(V1Beta1ResourceGroup obj, boolean deletedFinalStateUnknown) { + public void onDelete(V1Beta2ResourceGroup obj, boolean deletedFinalStateUnknown) { } } @@ -107,12 +107,12 @@ public ResourceGroupWatch(WorkQueue queue) { } @Override - public Class getResourceClass() { - return V1Beta1ResourceGroup.class; + public Class getResourceClass() { + return V1Beta2ResourceGroup.class; } @Override - public ResourceEventHandler getResourceEventHandler() { + public ResourceEventHandler getResourceEventHandler() { return new EventHandler(this.queue); } diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/rolebinding/RoleBindingControllerFactory.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/rolebinding/RoleBindingControllerFactory.java index 51d73d22..0146c1e2 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/rolebinding/RoleBindingControllerFactory.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/rolebinding/RoleBindingControllerFactory.java @@ -8,13 +8,13 @@ import io.kubernetes.client.openapi.models.V1Role; import io.kubernetes.client.openapi.models.V1RoleBinding; import io.ten1010.coaster.groupcontroller.core.K8sApis; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; public class RoleBindingControllerFactory { private SharedInformerFactory informerFactory; private Indexer namespaceIndexer; - private Indexer groupIndexer; + private Indexer groupIndexer; private Indexer roleBindingIndexer; private Indexer roleIndexer; private K8sApis k8sApis; @@ -22,7 +22,7 @@ public class RoleBindingControllerFactory { public RoleBindingControllerFactory( SharedInformerFactory informerFactory, Indexer namespaceIndexer, - Indexer groupIndexer, + Indexer groupIndexer, Indexer roleBindingIndexer, Indexer roleIndexer, K8sApis k8sApis) { diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/rolebinding/RoleBindingReconciler.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/rolebinding/RoleBindingReconciler.java index 0ce06e11..bec1da49 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/rolebinding/RoleBindingReconciler.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/cluster/rolebinding/RoleBindingReconciler.java @@ -10,7 +10,7 @@ import io.ten1010.coaster.groupcontroller.controller.KubernetesApiReconcileExceptionHandlingTemplate; import io.ten1010.coaster.groupcontroller.controller.cluster.role.ResourceGroupRoleName; import io.ten1010.coaster.groupcontroller.core.KeyUtil; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; import lombok.extern.slf4j.Slf4j; import java.time.Duration; @@ -43,16 +43,16 @@ private static List getSubjects(V1RoleBinding roleBinding) { private static V1OwnerReference buildOwnerReference(String groupName, String groupUid) { V1OwnerReferenceBuilder builder = new V1OwnerReferenceBuilder(); - return builder.withApiVersion(V1Beta1ResourceGroup.API_VERSION) + return builder.withApiVersion(V1Beta2ResourceGroup.API_VERSION) .withBlockOwnerDeletion(true) .withController(true) - .withKind(V1Beta1ResourceGroup.KIND) + .withKind(V1Beta2ResourceGroup.KIND) .withName(groupName) .withUid(groupUid) .build(); } - private static V1OwnerReference buildOwnerReference(V1Beta1ResourceGroup group) { + private static V1OwnerReference buildOwnerReference(V1Beta2ResourceGroup group) { Objects.requireNonNull(group.getMetadata()); Objects.requireNonNull(group.getMetadata().getName()); Objects.requireNonNull(group.getMetadata().getUid()); @@ -61,14 +61,14 @@ private static V1OwnerReference buildOwnerReference(V1Beta1ResourceGroup group) private KubernetesApiReconcileExceptionHandlingTemplate template; private Indexer namespaceIndexer; - private Indexer groupIndexer; + private Indexer groupIndexer; private Indexer roleBindingIndexer; private Indexer roleIndexer; private RbacAuthorizationV1Api rbacAuthorizationV1Api; public RoleBindingReconciler( Indexer namespaceIndexer, - Indexer groupIndexer, + Indexer groupIndexer, Indexer roleBindingIndexer, Indexer roleIndexer, RbacAuthorizationV1Api rbacAuthorizationV1Api) { @@ -92,7 +92,7 @@ public Result reconcile(Request request) { return new Result(false); } String groupName = ResourceGroupRoleBindingName.fromRoleBindingName(request.getName()).getResourceGroupName(); - V1Beta1ResourceGroup group = this.groupIndexer.getByKey(groupName); + V1Beta2ResourceGroup group = this.groupIndexer.getByKey(groupName); if (group == null) { deleteRoleBindingIfExist(request.getNamespace(), request.getName()); return new Result(false); diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/cronjob/ResourceGroupWatch.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/cronjob/ResourceGroupWatch.java index dbeb3149..4917ad69 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/cronjob/ResourceGroupWatch.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/cronjob/ResourceGroupWatch.java @@ -9,7 +9,7 @@ import io.ten1010.coaster.groupcontroller.controller.EventHandlerUtil; import io.ten1010.coaster.groupcontroller.core.IndexNames; import io.ten1010.coaster.groupcontroller.core.ResourceGroupUtil; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; import java.time.Duration; import java.util.List; @@ -17,11 +17,11 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -public class ResourceGroupWatch implements ControllerWatch { +public class ResourceGroupWatch implements ControllerWatch { public static final Duration RESYNC_PERIOD = Duration.ofSeconds(30); - public static class EventHandler implements ResourceEventHandler { + public static class EventHandler implements ResourceEventHandler { private WorkQueue queue; private Indexer cronJobIndexer; @@ -32,7 +32,7 @@ public EventHandler(WorkQueue queue, Indexer cronJobIndexer) } @Override - public void onAdd(V1Beta1ResourceGroup obj) { + public void onAdd(V1Beta2ResourceGroup obj) { Set requests = ResourceGroupUtil.getNamespaces(obj).stream() .flatMap(this::resolveToCronJobs) .map(EventHandlerUtil::resolveNamespacedObjectToRequest) @@ -41,7 +41,7 @@ public void onAdd(V1Beta1ResourceGroup obj) { } @Override - public void onUpdate(V1Beta1ResourceGroup oldObj, V1Beta1ResourceGroup newObj) { + public void onUpdate(V1Beta2ResourceGroup oldObj, V1Beta2ResourceGroup newObj) { Set requests = EventHandlerUtil.getAddedOrDeletedNamespaces( ResourceGroupUtil.getNamespaces(oldObj), ResourceGroupUtil.getNamespaces(newObj)) @@ -53,7 +53,7 @@ public void onUpdate(V1Beta1ResourceGroup oldObj, V1Beta1ResourceGroup newObj) { } @Override - public void onDelete(V1Beta1ResourceGroup obj, boolean deletedFinalStateUnknown) { + public void onDelete(V1Beta2ResourceGroup obj, boolean deletedFinalStateUnknown) { Set requests = ResourceGroupUtil.getNamespaces(obj).stream() .flatMap(this::resolveToCronJobs) .map(EventHandlerUtil::resolveNamespacedObjectToRequest) @@ -77,12 +77,12 @@ public ResourceGroupWatch(WorkQueue queue, Indexer cronJobIn } @Override - public Class getResourceClass() { - return V1Beta1ResourceGroup.class; + public Class getResourceClass() { + return V1Beta2ResourceGroup.class; } @Override - public ResourceEventHandler getResourceEventHandler() { + public ResourceEventHandler getResourceEventHandler() { return new EventHandler(this.queue, this.cronJobIndexer); } diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/daemonset/ResourceGroupWatch.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/daemonset/ResourceGroupWatch.java index 075d39ef..40edc710 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/daemonset/ResourceGroupWatch.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/daemonset/ResourceGroupWatch.java @@ -9,8 +9,8 @@ import io.ten1010.coaster.groupcontroller.controller.EventHandlerUtil; import io.ten1010.coaster.groupcontroller.core.IndexNames; import io.ten1010.coaster.groupcontroller.core.ResourceGroupUtil; -import io.ten1010.coaster.groupcontroller.model.V1Beta1K8sObjectReference; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2K8sObjectReference; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; import java.time.Duration; import java.util.HashSet; @@ -19,16 +19,16 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -public class ResourceGroupWatch implements ControllerWatch { +public class ResourceGroupWatch implements ControllerWatch { public static final Duration RESYNC_PERIOD = Duration.ofSeconds(30); - public static class EventHandler implements ResourceEventHandler { + public static class EventHandler implements ResourceEventHandler { - private static Set getAddedOrDeletedDaemonSets(List oldDaemonSets, List newDaemonSets) { - Set deleted = new HashSet<>(oldDaemonSets); + private static Set getAddedOrDeletedDaemonSets(List oldDaemonSets, List newDaemonSets) { + Set deleted = new HashSet<>(oldDaemonSets); newDaemonSets.forEach(deleted::remove); - Set added = new HashSet<>(newDaemonSets); + Set added = new HashSet<>(newDaemonSets); oldDaemonSets.forEach(added::remove); deleted.addAll(added); return deleted; @@ -43,7 +43,7 @@ public EventHandler(WorkQueue queue, Indexer daemonSetInde } @Override - public void onAdd(V1Beta1ResourceGroup obj) { + public void onAdd(V1Beta2ResourceGroup obj) { Set requestsFromNamespaces = ResourceGroupUtil.getNamespaces(obj).stream() .flatMap(this::resolveToDaemonSet) .map(EventHandlerUtil::resolveNamespacedObjectToRequest) @@ -57,7 +57,7 @@ public void onAdd(V1Beta1ResourceGroup obj) { } @Override - public void onUpdate(V1Beta1ResourceGroup oldObj, V1Beta1ResourceGroup newObj) { + public void onUpdate(V1Beta2ResourceGroup oldObj, V1Beta2ResourceGroup newObj) { Set requestsFromNamespaces = EventHandlerUtil.getAddedOrDeletedNamespaces( ResourceGroupUtil.getNamespaces(oldObj), ResourceGroupUtil.getNamespaces(newObj)) @@ -77,7 +77,7 @@ public void onUpdate(V1Beta1ResourceGroup oldObj, V1Beta1ResourceGroup newObj) { } @Override - public void onDelete(V1Beta1ResourceGroup obj, boolean deletedFinalStateUnknown) { + public void onDelete(V1Beta2ResourceGroup obj, boolean deletedFinalStateUnknown) { Set requestsFromNamespaces = ResourceGroupUtil.getNamespaces(obj).stream() .flatMap(this::resolveToDaemonSet) .map(EventHandlerUtil::resolveNamespacedObjectToRequest) @@ -106,12 +106,12 @@ public ResourceGroupWatch(WorkQueue queue, Indexer daemonS } @Override - public Class getResourceClass() { - return V1Beta1ResourceGroup.class; + public Class getResourceClass() { + return V1Beta2ResourceGroup.class; } @Override - public ResourceEventHandler getResourceEventHandler() { + public ResourceEventHandler getResourceEventHandler() { return new EventHandler(this.queue, this.daemonSetIndexer); } diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/deployment/ResourceGroupWatch.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/deployment/ResourceGroupWatch.java index a5482abe..db6b3c6e 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/deployment/ResourceGroupWatch.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/deployment/ResourceGroupWatch.java @@ -9,7 +9,7 @@ import io.ten1010.coaster.groupcontroller.controller.EventHandlerUtil; import io.ten1010.coaster.groupcontroller.core.IndexNames; import io.ten1010.coaster.groupcontroller.core.ResourceGroupUtil; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; import java.time.Duration; import java.util.List; @@ -17,11 +17,11 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -public class ResourceGroupWatch implements ControllerWatch { +public class ResourceGroupWatch implements ControllerWatch { public static final Duration RESYNC_PERIOD = Duration.ofSeconds(30); - public static class EventHandler implements ResourceEventHandler { + public static class EventHandler implements ResourceEventHandler { private WorkQueue queue; private Indexer deploymentIndexer; @@ -32,7 +32,7 @@ public EventHandler(WorkQueue queue, Indexer deploymentIn } @Override - public void onAdd(V1Beta1ResourceGroup obj) { + public void onAdd(V1Beta2ResourceGroup obj) { Set requests = ResourceGroupUtil.getNamespaces(obj).stream() .flatMap(this::resolveToDeployments) .map(EventHandlerUtil::resolveNamespacedObjectToRequest) @@ -41,7 +41,7 @@ public void onAdd(V1Beta1ResourceGroup obj) { } @Override - public void onUpdate(V1Beta1ResourceGroup oldObj, V1Beta1ResourceGroup newObj) { + public void onUpdate(V1Beta2ResourceGroup oldObj, V1Beta2ResourceGroup newObj) { Set requests = EventHandlerUtil.getAddedOrDeletedNamespaces( ResourceGroupUtil.getNamespaces(oldObj), ResourceGroupUtil.getNamespaces(newObj)) @@ -53,7 +53,7 @@ public void onUpdate(V1Beta1ResourceGroup oldObj, V1Beta1ResourceGroup newObj) { } @Override - public void onDelete(V1Beta1ResourceGroup obj, boolean deletedFinalStateUnknown) { + public void onDelete(V1Beta2ResourceGroup obj, boolean deletedFinalStateUnknown) { Set requests = ResourceGroupUtil.getNamespaces(obj).stream() .flatMap(this::resolveToDeployments) .map(EventHandlerUtil::resolveNamespacedObjectToRequest) @@ -77,12 +77,12 @@ public ResourceGroupWatch(WorkQueue queue, Indexer deploy } @Override - public Class getResourceClass() { - return V1Beta1ResourceGroup.class; + public Class getResourceClass() { + return V1Beta2ResourceGroup.class; } @Override - public ResourceEventHandler getResourceEventHandler() { + public ResourceEventHandler getResourceEventHandler() { return new EventHandler(this.queue, this.deploymentIndexer); } diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/job/ResourceGroupWatch.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/job/ResourceGroupWatch.java index 4fed2801..42514ced 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/job/ResourceGroupWatch.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/job/ResourceGroupWatch.java @@ -9,7 +9,7 @@ import io.ten1010.coaster.groupcontroller.controller.EventHandlerUtil; import io.ten1010.coaster.groupcontroller.core.IndexNames; import io.ten1010.coaster.groupcontroller.core.ResourceGroupUtil; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; import java.time.Duration; import java.util.List; @@ -17,11 +17,11 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -public class ResourceGroupWatch implements ControllerWatch { +public class ResourceGroupWatch implements ControllerWatch { public static final Duration RESYNC_PERIOD = Duration.ofSeconds(30); - public static class EventHandler implements ResourceEventHandler { + public static class EventHandler implements ResourceEventHandler { private WorkQueue queue; private Indexer jobIndexer; @@ -32,7 +32,7 @@ public EventHandler(WorkQueue queue, Indexer jobIndexer) { } @Override - public void onAdd(V1Beta1ResourceGroup obj) { + public void onAdd(V1Beta2ResourceGroup obj) { Set requests = ResourceGroupUtil.getNamespaces(obj).stream() .flatMap(this::resolveToJobs) .map(EventHandlerUtil::resolveNamespacedObjectToRequest) @@ -41,7 +41,7 @@ public void onAdd(V1Beta1ResourceGroup obj) { } @Override - public void onUpdate(V1Beta1ResourceGroup oldObj, V1Beta1ResourceGroup newObj) { + public void onUpdate(V1Beta2ResourceGroup oldObj, V1Beta2ResourceGroup newObj) { Set requests = EventHandlerUtil.getAddedOrDeletedNamespaces( ResourceGroupUtil.getNamespaces(oldObj), ResourceGroupUtil.getNamespaces(newObj)) @@ -53,7 +53,7 @@ public void onUpdate(V1Beta1ResourceGroup oldObj, V1Beta1ResourceGroup newObj) { } @Override - public void onDelete(V1Beta1ResourceGroup obj, boolean deletedFinalStateUnknown) { + public void onDelete(V1Beta2ResourceGroup obj, boolean deletedFinalStateUnknown) { Set requests = ResourceGroupUtil.getNamespaces(obj).stream() .flatMap(this::resolveToJobs) .map(EventHandlerUtil::resolveNamespacedObjectToRequest) @@ -77,12 +77,12 @@ public ResourceGroupWatch(WorkQueue queue, Indexer jobIndexer) { } @Override - public Class getResourceClass() { - return V1Beta1ResourceGroup.class; + public Class getResourceClass() { + return V1Beta2ResourceGroup.class; } @Override - public ResourceEventHandler getResourceEventHandler() { + public ResourceEventHandler getResourceEventHandler() { return new EventHandler(this.queue, this.jobIndexer); } diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/pod/ResourceGroupWatch.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/pod/ResourceGroupWatch.java index a30b554a..c5b39a0f 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/pod/ResourceGroupWatch.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/pod/ResourceGroupWatch.java @@ -9,7 +9,7 @@ import io.ten1010.coaster.groupcontroller.controller.EventHandlerUtil; import io.ten1010.coaster.groupcontroller.core.IndexNames; import io.ten1010.coaster.groupcontroller.core.ResourceGroupUtil; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; import java.time.Duration; import java.util.List; @@ -17,11 +17,11 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -public class ResourceGroupWatch implements ControllerWatch { +public class ResourceGroupWatch implements ControllerWatch { public static final Duration RESYNC_PERIOD = Duration.ofSeconds(30); - public static class EventHandler implements ResourceEventHandler { + public static class EventHandler implements ResourceEventHandler { private WorkQueue queue; private Indexer podIndexer; @@ -32,7 +32,7 @@ public EventHandler(WorkQueue queue, Indexer podIndexer) { } @Override - public void onAdd(V1Beta1ResourceGroup obj) { + public void onAdd(V1Beta2ResourceGroup obj) { Set requests = ResourceGroupUtil.getNamespaces(obj).stream() .flatMap(this::resolveToPods) .map(EventHandlerUtil::resolveNamespacedObjectToRequest) @@ -41,7 +41,7 @@ public void onAdd(V1Beta1ResourceGroup obj) { } @Override - public void onUpdate(V1Beta1ResourceGroup oldObj, V1Beta1ResourceGroup newObj) { + public void onUpdate(V1Beta2ResourceGroup oldObj, V1Beta2ResourceGroup newObj) { Set requests = EventHandlerUtil.getAddedOrDeletedNamespaces( ResourceGroupUtil.getNamespaces(oldObj), ResourceGroupUtil.getNamespaces(newObj)) @@ -53,7 +53,7 @@ public void onUpdate(V1Beta1ResourceGroup oldObj, V1Beta1ResourceGroup newObj) { } @Override - public void onDelete(V1Beta1ResourceGroup obj, boolean deletedFinalStateUnknown) { + public void onDelete(V1Beta2ResourceGroup obj, boolean deletedFinalStateUnknown) { Set requests = ResourceGroupUtil.getNamespaces(obj).stream() .flatMap(this::resolveToPods) .map(EventHandlerUtil::resolveNamespacedObjectToRequest) @@ -77,12 +77,12 @@ public ResourceGroupWatch(WorkQueue queue, Indexer podIndexer) { } @Override - public Class getResourceClass() { - return V1Beta1ResourceGroup.class; + public Class getResourceClass() { + return V1Beta2ResourceGroup.class; } @Override - public ResourceEventHandler getResourceEventHandler() { + public ResourceEventHandler getResourceEventHandler() { return new EventHandler(this.queue, this.podIndexer); } diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/replicaset/ResourceGroupWatch.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/replicaset/ResourceGroupWatch.java index 8da10979..c2ef230c 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/replicaset/ResourceGroupWatch.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/replicaset/ResourceGroupWatch.java @@ -9,7 +9,7 @@ import io.ten1010.coaster.groupcontroller.controller.EventHandlerUtil; import io.ten1010.coaster.groupcontroller.core.IndexNames; import io.ten1010.coaster.groupcontroller.core.ResourceGroupUtil; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; import java.time.Duration; import java.util.List; @@ -17,11 +17,11 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -public class ResourceGroupWatch implements ControllerWatch { +public class ResourceGroupWatch implements ControllerWatch { public static final Duration RESYNC_PERIOD = Duration.ofSeconds(30); - public static class EventHandler implements ResourceEventHandler { + public static class EventHandler implements ResourceEventHandler { private WorkQueue queue; private Indexer replicaSetIndexer; @@ -32,7 +32,7 @@ public EventHandler(WorkQueue queue, Indexer replicaSetIn } @Override - public void onAdd(V1Beta1ResourceGroup obj) { + public void onAdd(V1Beta2ResourceGroup obj) { Set requests = ResourceGroupUtil.getNamespaces(obj).stream() .flatMap(this::resolveToReplicaSets) .map(EventHandlerUtil::resolveNamespacedObjectToRequest) @@ -41,7 +41,7 @@ public void onAdd(V1Beta1ResourceGroup obj) { } @Override - public void onUpdate(V1Beta1ResourceGroup oldObj, V1Beta1ResourceGroup newObj) { + public void onUpdate(V1Beta2ResourceGroup oldObj, V1Beta2ResourceGroup newObj) { Set requests = EventHandlerUtil.getAddedOrDeletedNamespaces( ResourceGroupUtil.getNamespaces(oldObj), ResourceGroupUtil.getNamespaces(newObj)) @@ -53,7 +53,7 @@ public void onUpdate(V1Beta1ResourceGroup oldObj, V1Beta1ResourceGroup newObj) { } @Override - public void onDelete(V1Beta1ResourceGroup obj, boolean deletedFinalStateUnknown) { + public void onDelete(V1Beta2ResourceGroup obj, boolean deletedFinalStateUnknown) { Set requests = ResourceGroupUtil.getNamespaces(obj).stream() .flatMap(this::resolveToReplicaSets) .map(EventHandlerUtil::resolveNamespacedObjectToRequest) @@ -77,12 +77,12 @@ public ResourceGroupWatch(WorkQueue queue, Indexer replic } @Override - public Class getResourceClass() { - return V1Beta1ResourceGroup.class; + public Class getResourceClass() { + return V1Beta2ResourceGroup.class; } @Override - public ResourceEventHandler getResourceEventHandler() { + public ResourceEventHandler getResourceEventHandler() { return new EventHandler(this.queue, this.replicaSetIndexer); } diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/replicationcontroller/ResourceGroupWatch.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/replicationcontroller/ResourceGroupWatch.java index 84f8ff77..cb7770de 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/replicationcontroller/ResourceGroupWatch.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/replicationcontroller/ResourceGroupWatch.java @@ -9,7 +9,7 @@ import io.ten1010.coaster.groupcontroller.controller.EventHandlerUtil; import io.ten1010.coaster.groupcontroller.core.IndexNames; import io.ten1010.coaster.groupcontroller.core.ResourceGroupUtil; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; import java.time.Duration; import java.util.List; @@ -17,11 +17,11 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -public class ResourceGroupWatch implements ControllerWatch { +public class ResourceGroupWatch implements ControllerWatch { public static final Duration RESYNC_PERIOD = Duration.ofSeconds(30); - public static class EventHandler implements ResourceEventHandler { + public static class EventHandler implements ResourceEventHandler { private WorkQueue queue; private Indexer replicationControllerIndexer; @@ -32,7 +32,7 @@ public EventHandler(WorkQueue queue, Indexer r } @Override - public void onAdd(V1Beta1ResourceGroup obj) { + public void onAdd(V1Beta2ResourceGroup obj) { Set requests = ResourceGroupUtil.getNamespaces(obj).stream() .flatMap(this::resolveToReplicationControllers) .map(EventHandlerUtil::resolveNamespacedObjectToRequest) @@ -41,7 +41,7 @@ public void onAdd(V1Beta1ResourceGroup obj) { } @Override - public void onUpdate(V1Beta1ResourceGroup oldObj, V1Beta1ResourceGroup newObj) { + public void onUpdate(V1Beta2ResourceGroup oldObj, V1Beta2ResourceGroup newObj) { Set requests = EventHandlerUtil.getAddedOrDeletedNamespaces( ResourceGroupUtil.getNamespaces(oldObj), ResourceGroupUtil.getNamespaces(newObj)) @@ -53,7 +53,7 @@ public void onUpdate(V1Beta1ResourceGroup oldObj, V1Beta1ResourceGroup newObj) { } @Override - public void onDelete(V1Beta1ResourceGroup obj, boolean deletedFinalStateUnknown) { + public void onDelete(V1Beta2ResourceGroup obj, boolean deletedFinalStateUnknown) { Set requests = ResourceGroupUtil.getNamespaces(obj).stream() .flatMap(this::resolveToReplicationControllers) .map(EventHandlerUtil::resolveNamespacedObjectToRequest) @@ -77,12 +77,12 @@ public ResourceGroupWatch(WorkQueue queue, Indexer getResourceClass() { - return V1Beta1ResourceGroup.class; + public Class getResourceClass() { + return V1Beta2ResourceGroup.class; } @Override - public ResourceEventHandler getResourceEventHandler() { + public ResourceEventHandler getResourceEventHandler() { return new EventHandler(this.queue, this.replicationControllerIndexer); } diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/statefulset/ResourceGroupWatch.java b/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/statefulset/ResourceGroupWatch.java index e9e6f43a..79e72873 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/statefulset/ResourceGroupWatch.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/controller/workload/statefulset/ResourceGroupWatch.java @@ -9,7 +9,7 @@ import io.ten1010.coaster.groupcontroller.controller.EventHandlerUtil; import io.ten1010.coaster.groupcontroller.core.IndexNames; import io.ten1010.coaster.groupcontroller.core.ResourceGroupUtil; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; import java.time.Duration; import java.util.List; @@ -17,11 +17,11 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -public class ResourceGroupWatch implements ControllerWatch { +public class ResourceGroupWatch implements ControllerWatch { public static final Duration RESYNC_PERIOD = Duration.ofSeconds(30); - public static class EventHandler implements ResourceEventHandler { + public static class EventHandler implements ResourceEventHandler { private WorkQueue queue; private Indexer statefulSetIndexer; @@ -32,7 +32,7 @@ public EventHandler(WorkQueue queue, Indexer statefulSet } @Override - public void onAdd(V1Beta1ResourceGroup obj) { + public void onAdd(V1Beta2ResourceGroup obj) { Set requests = ResourceGroupUtil.getNamespaces(obj).stream() .flatMap(this::resolveToStatefulSets) .map(EventHandlerUtil::resolveNamespacedObjectToRequest) @@ -41,7 +41,7 @@ public void onAdd(V1Beta1ResourceGroup obj) { } @Override - public void onUpdate(V1Beta1ResourceGroup oldObj, V1Beta1ResourceGroup newObj) { + public void onUpdate(V1Beta2ResourceGroup oldObj, V1Beta2ResourceGroup newObj) { Set requests = EventHandlerUtil.getAddedOrDeletedNamespaces( ResourceGroupUtil.getNamespaces(oldObj), ResourceGroupUtil.getNamespaces(newObj)) @@ -53,7 +53,7 @@ public void onUpdate(V1Beta1ResourceGroup oldObj, V1Beta1ResourceGroup newObj) { } @Override - public void onDelete(V1Beta1ResourceGroup obj, boolean deletedFinalStateUnknown) { + public void onDelete(V1Beta2ResourceGroup obj, boolean deletedFinalStateUnknown) { Set requests = ResourceGroupUtil.getNamespaces(obj).stream() .flatMap(this::resolveToStatefulSets) .map(EventHandlerUtil::resolveNamespacedObjectToRequest) @@ -77,12 +77,12 @@ public ResourceGroupWatch(WorkQueue queue, Indexer state } @Override - public Class getResourceClass() { - return V1Beta1ResourceGroup.class; + public Class getResourceClass() { + return V1Beta2ResourceGroup.class; } @Override - public ResourceEventHandler getResourceEventHandler() { + public ResourceEventHandler getResourceEventHandler() { return new EventHandler(this.queue, this.statefulSetIndexer); } diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/conversion/ConversionAnnotation.java b/src/main/java/io/ten1010/coaster/groupcontroller/conversion/ConversionAnnotation.java new file mode 100644 index 00000000..adc1ac86 --- /dev/null +++ b/src/main/java/io/ten1010/coaster/groupcontroller/conversion/ConversionAnnotation.java @@ -0,0 +1,11 @@ +package io.ten1010.coaster.groupcontroller.conversion; + +public final class ConversionAnnotation { + + public static String ALLOW_ALL_DAEMON_SET = "resource-group.ten1010.io/allow-all-daemonset"; + + private ConversionAnnotation() { + + throw new UnsupportedOperationException(); + } +} diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/conversion/ConversionController.java b/src/main/java/io/ten1010/coaster/groupcontroller/conversion/ConversionController.java new file mode 100644 index 00000000..fb2b6135 --- /dev/null +++ b/src/main/java/io/ten1010/coaster/groupcontroller/conversion/ConversionController.java @@ -0,0 +1,32 @@ +package io.ten1010.coaster.groupcontroller.conversion; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Objects; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class ConversionController { + + private final ConversionService conversionService; + + @PostMapping( + path = "/crdconvert", + consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE + ) + public ConversionReview convert(@RequestBody ConversionReview conversionReview) { + log.debug("Conversion webhook request: \n{}", conversionReview); + ConversionResponse response = conversionService.convert(Objects.requireNonNull(conversionReview.getRequest())); + conversionReview.setResponse(response); + log.debug("Conversion webhook response: \n{}", conversionReview); + + return conversionReview; + } +} diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/conversion/ConversionRequest.java b/src/main/java/io/ten1010/coaster/groupcontroller/conversion/ConversionRequest.java new file mode 100644 index 00000000..cceea880 --- /dev/null +++ b/src/main/java/io/ten1010/coaster/groupcontroller/conversion/ConversionRequest.java @@ -0,0 +1,21 @@ +package io.ten1010.coaster.groupcontroller.conversion; + +import lombok.Data; +import org.springframework.lang.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Data +public class ConversionRequest { + + @Nullable + private String uid; + + @Nullable + private String desiredAPIVersion; + + private List> objects = new ArrayList<>(); + +} diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/conversion/ConversionResponse.java b/src/main/java/io/ten1010/coaster/groupcontroller/conversion/ConversionResponse.java new file mode 100644 index 00000000..2bd3f985 --- /dev/null +++ b/src/main/java/io/ten1010/coaster/groupcontroller/conversion/ConversionResponse.java @@ -0,0 +1,43 @@ +package io.ten1010.coaster.groupcontroller.conversion; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; +import lombok.Value; +import org.springframework.lang.Nullable; + +import java.util.ArrayList; +import java.util.List; + +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +public class ConversionResponse { + + @Value + @JsonInclude(JsonInclude.Include.NON_NULL) + public static class Result { + + String status; + + @Nullable + String message; + + public static Result success() { + return new Result("Success", null); + } + + public static Result fail(String message) { + return new Result("Failed", message); + } + + public Result(String status, @Nullable String message) { + this.status = status; + this.message = message; + } + } + + private String uid; + + private Result result; + + private List convertedObjects = new ArrayList<>(); +} diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/conversion/ConversionReview.java b/src/main/java/io/ten1010/coaster/groupcontroller/conversion/ConversionReview.java new file mode 100644 index 00000000..0be5bc7c --- /dev/null +++ b/src/main/java/io/ten1010/coaster/groupcontroller/conversion/ConversionReview.java @@ -0,0 +1,23 @@ +package io.ten1010.coaster.groupcontroller.conversion; + +import lombok.Data; +import org.springframework.lang.Nullable; + +@Data +public class ConversionReview { + + public static final String API_VERSION = "apiextensions.k8s.io/v1"; + public static final String KIND = "ConversionReview"; + + @Nullable + private String apiVersion; + + @Nullable + private String kind; + + @Nullable + private ConversionRequest request; + + @Nullable + private ConversionResponse response; +} diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/conversion/ConversionService.java b/src/main/java/io/ten1010/coaster/groupcontroller/conversion/ConversionService.java new file mode 100644 index 00000000..5b187a47 --- /dev/null +++ b/src/main/java/io/ten1010/coaster/groupcontroller/conversion/ConversionService.java @@ -0,0 +1,74 @@ +package io.ten1010.coaster.groupcontroller.conversion; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import io.kubernetes.client.common.KubernetesObject; +import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +@Service +@Slf4j +public class ConversionService { + + private final Map converters = Map.of( + V1Beta1ResourceGroup.API_VERSION, new ResourceGroupV1Beta1Converter(), + V1Beta2ResourceGroup.API_VERSION, new ResourceGroupV1Beta2Converter() + ); + + private final ObjectMapper objectMapper; + + public ConversionService() { + this.objectMapper = new ObjectMapper(); + this.objectMapper.registerModule(new JavaTimeModule()); + } + + public ConversionResponse convert(ConversionRequest request) { + + ConversionResponse response = new ConversionResponse(); + response.setUid(Objects.requireNonNull(request.getUid())); + String desiredVersion = request.getDesiredAPIVersion(); + List convertedObjects = request.getObjects().stream() + .map(group -> { + String apiVersion = (String) group.get("apiVersion"); + KubernetesObject groupObject = mapToObject(group, apiVersion); + return convert(groupObject, desiredVersion); + }) + .collect(Collectors.toList()); + + response.setConvertedObjects(convertedObjects); + + response.setResult(ConversionResponse.Result.success()); + + return response; + } + + private KubernetesObject mapToObject(Map object, String apiVersion) { + if (V1Beta1ResourceGroup.API_VERSION.equals(apiVersion)) { + return objectMapper.convertValue(object, V1Beta1ResourceGroup.class); + } else if (V1Beta2ResourceGroup.API_VERSION.equals(apiVersion)) { + return objectMapper.convertValue(object, V1Beta2ResourceGroup.class); + } else { + throw new IllegalArgumentException("Not supported api version: " + apiVersion); + } + } + + private Object convert(KubernetesObject resource, String targetVersion) { + String sourceVersion = resource.getApiVersion(); + if (!converters.containsKey(sourceVersion)) { + throw new IllegalArgumentException("Missing converter from version: " + sourceVersion); + } + if (!converters.containsKey(targetVersion)) { + throw new IllegalArgumentException("Missing converter from version: " + targetVersion); + } + + return converters.get(targetVersion).convertFromHub(converters.get(sourceVersion).convertToHub(resource)); + } + +} diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/conversion/Converter.java b/src/main/java/io/ten1010/coaster/groupcontroller/conversion/Converter.java new file mode 100644 index 00000000..8de7b2be --- /dev/null +++ b/src/main/java/io/ten1010/coaster/groupcontroller/conversion/Converter.java @@ -0,0 +1,10 @@ +package io.ten1010.coaster.groupcontroller.conversion; + +import io.kubernetes.client.common.KubernetesObject; + +public interface Converter { + + HUB convertToHub(R resource); + + R convertFromHub(HUB hub); +} diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/conversion/ResourceGroupV1Beta1Converter.java b/src/main/java/io/ten1010/coaster/groupcontroller/conversion/ResourceGroupV1Beta1Converter.java new file mode 100644 index 00000000..82735603 --- /dev/null +++ b/src/main/java/io/ten1010/coaster/groupcontroller/conversion/ResourceGroupV1Beta1Converter.java @@ -0,0 +1,88 @@ +package io.ten1010.coaster.groupcontroller.conversion; + +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.ten1010.coaster.groupcontroller.model.*; + +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +public class ResourceGroupV1Beta1Converter implements Converter { + + @Override + public V1Beta2ResourceGroup convertToHub(V1Beta1ResourceGroup from) { + V1Beta2ResourceGroup to = V1Beta2ResourceGroup.withDefaultApiVersionAndKind(); + to.setMetadata(Objects.requireNonNull(from.getMetadata())); + to.setSpec(convertResourceGroupSpecToHub( + Objects.requireNonNull(from.getSpec()))); + to.setStatus(new V1Beta2ResourceGroupStatus()); + Boolean allowAllDaemonSet = Optional.ofNullable(from.getMetadata()) + .map(V1ObjectMeta::getAnnotations) + .map(annotations -> annotations.get(ConversionAnnotation.ALLOW_ALL_DAEMON_SET)) + .map(Boolean::parseBoolean) + .orElse(false); + to.getSpec().getDaemonSet().setAllowAll(allowAllDaemonSet); + return to; + } + + private V1Beta2ResourceGroupSpec convertResourceGroupSpecToHub(V1Beta1ResourceGroupSpec from) { + V1Beta2ResourceGroupSpec to = new V1Beta2ResourceGroupSpec(); + to.setNodes(from.getNodes()); + to.setNamespaces(from.getNamespaces()); + to.setDaemonSet(convertResourceGroupDaemonSetToHub(Objects.requireNonNull(from.getDaemonSet()))); + to.setSubjects(from.getSubjects()); + + return to; + } + + private V1Beta2DaemonSet convertResourceGroupDaemonSetToHub(V1Beta1DaemonSet from) { + V1Beta2DaemonSet to = new V1Beta2DaemonSet(); + to.setDaemonSets(from.getDaemonSets().stream() + .map(this::convertObjectReferenceToHub).collect(Collectors.toList())); + return to; + } + + private V1Beta2K8sObjectReference convertObjectReferenceToHub(V1Beta1K8sObjectReference from) { + V1Beta2K8sObjectReference to = new V1Beta2K8sObjectReference(); + to.setName(from.getName()); + to.setNamespace(from.getNamespace()); + return to; + } + + @Override + public V1Beta1ResourceGroup convertFromHub(V1Beta2ResourceGroup from) { + V1Beta1ResourceGroup to = V1Beta1ResourceGroup.withDefaultApiVersionAndKind(); + to.setMetadata(Objects.requireNonNull(from.getMetadata())); + to.setSpec(convertResourceGroupSpecFromHub(Objects.requireNonNull(from.getSpec()))); + to.setStatus(new V1Beta1ResourceGroupStatus()); + + boolean allowAllDaemonSet = from.getSpec().getDaemonSet().isAllowAll(); + to.getMetadata().putAnnotationsItem( + ConversionAnnotation.ALLOW_ALL_DAEMON_SET, Boolean.toString(allowAllDaemonSet)); + return to; + } + + private V1Beta1ResourceGroupSpec convertResourceGroupSpecFromHub(V1Beta2ResourceGroupSpec from) { + V1Beta1ResourceGroupSpec to = new V1Beta1ResourceGroupSpec(); + to.setNodes(from.getNodes()); + to.setNamespaces(from.getNamespaces()); + to.setDaemonSet(convertResourceGroupDaemonSetFromHub(Objects.requireNonNull(from.getDaemonSet()))); + to.setSubjects(from.getSubjects()); + + return to; + } + + private V1Beta1DaemonSet convertResourceGroupDaemonSetFromHub(V1Beta2DaemonSet from) { + V1Beta1DaemonSet to = new V1Beta1DaemonSet(); + to.setDaemonSets(from.getDaemonSets().stream() + .map(this::convertObjectReferenceFromHub).collect(Collectors.toList())); + return to; + } + + private V1Beta1K8sObjectReference convertObjectReferenceFromHub(V1Beta2K8sObjectReference from) { + V1Beta1K8sObjectReference to = new V1Beta1K8sObjectReference(); + to.setName(from.getName()); + to.setNamespace(from.getNamespace()); + return to; + } +} diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/conversion/ResourceGroupV1Beta2Converter.java b/src/main/java/io/ten1010/coaster/groupcontroller/conversion/ResourceGroupV1Beta2Converter.java new file mode 100644 index 00000000..11ff114e --- /dev/null +++ b/src/main/java/io/ten1010/coaster/groupcontroller/conversion/ResourceGroupV1Beta2Converter.java @@ -0,0 +1,16 @@ +package io.ten1010.coaster.groupcontroller.conversion; + +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; + +public class ResourceGroupV1Beta2Converter implements Converter { + + @Override + public V1Beta2ResourceGroup convertToHub(V1Beta2ResourceGroup from) { + return from; + } + + @Override + public V1Beta2ResourceGroup convertFromHub(V1Beta2ResourceGroup from) { + return from; + } +} diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/conversion/package-info.java b/src/main/java/io/ten1010/coaster/groupcontroller/conversion/package-info.java new file mode 100644 index 00000000..4c8c70a9 --- /dev/null +++ b/src/main/java/io/ten1010/coaster/groupcontroller/conversion/package-info.java @@ -0,0 +1,4 @@ +@NonNullApi +package io.ten1010.coaster.groupcontroller.conversion; + +import org.springframework.lang.NonNullApi; \ No newline at end of file diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/core/IndexNames.java b/src/main/java/io/ten1010/coaster/groupcontroller/core/IndexNames.java index 10ccbd83..dd8960ee 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/core/IndexNames.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/core/IndexNames.java @@ -13,6 +13,7 @@ public final class IndexNames { public static final String BY_NAMESPACE_NAME_TO_STATEFUL_SET_OBJECT = "BY_NAMESPACE_NAME_TO_STATEFUL_SET_OBJECT"; public static final String BY_NODE_NAME_TO_GROUP_OBJECT = "BY_NODE_NAME_TO_GROUP_OBJECT"; public static final String BY_DAEMON_SET_KEY_TO_GROUP_OBJECT = "BY_DAEMON_SET_KEY_TO_GROUP_OBJECT"; + public static final String BY_GROUP_ALLOW_ALL_DAEMON_SET_TO_GROUP_OBJECT = "BY_GROUP_ALLOW_ALL_DAEMON_SET_TO_GROUP_OBJECT"; private IndexNames() { throw new UnsupportedOperationException(); diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/core/K8sApis.java b/src/main/java/io/ten1010/coaster/groupcontroller/core/K8sApis.java index 60f5d7de..b6abe725 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/core/K8sApis.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/core/K8sApis.java @@ -7,8 +7,8 @@ import io.kubernetes.client.openapi.apis.RbacAuthorizationV1Api; import io.kubernetes.client.openapi.models.*; import io.kubernetes.client.util.generic.GenericKubernetesApi; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroupList; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroupList; import lombok.Getter; @Getter @@ -20,7 +20,7 @@ public class K8sApis { private BatchV1Api batchV1Api; private RbacAuthorizationV1Api rbacAuthorizationV1Api; - private GenericKubernetesApi resourceGroupApi; + private GenericKubernetesApi resourceGroupApi; private GenericKubernetesApi cronJobApi; private GenericKubernetesApi daemonSetApi; @@ -45,10 +45,10 @@ public K8sApis(ApiClient apiClient) { this.batchV1Api = new BatchV1Api(apiClient); this.rbacAuthorizationV1Api = new RbacAuthorizationV1Api(apiClient); this.resourceGroupApi = new GenericKubernetesApi<>( - V1Beta1ResourceGroup.class, - V1Beta1ResourceGroupList.class, + V1Beta2ResourceGroup.class, + V1Beta2ResourceGroupList.class, "resource-group.ten1010.io", - "v1beta1", + "v1beta2", "resourcegroups", apiClient); this.cronJobApi = new GenericKubernetesApi<>( diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/core/KeyUtil.java b/src/main/java/io/ten1010/coaster/groupcontroller/core/KeyUtil.java index 04800ed7..728bf444 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/core/KeyUtil.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/core/KeyUtil.java @@ -1,7 +1,7 @@ package io.ten1010.coaster.groupcontroller.core; import io.kubernetes.client.common.KubernetesObject; -import io.ten1010.coaster.groupcontroller.model.V1Beta1K8sObjectReference; +import io.ten1010.coaster.groupcontroller.model.V1Beta2K8sObjectReference; import java.util.Objects; @@ -24,7 +24,7 @@ public static String getKey(KubernetesObject object) { return buildKey(object.getMetadata().getNamespace(), object.getMetadata().getName()); } - public static String getKey(V1Beta1K8sObjectReference reference) { + public static String getKey(V1Beta2K8sObjectReference reference) { Objects.requireNonNull(reference.getName()); if (reference.getNamespace() == null) { return buildKey(reference.getName()); diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/core/ResourceGroupUtil.java b/src/main/java/io/ten1010/coaster/groupcontroller/core/ResourceGroupUtil.java index e3a4df2c..2cb88b3f 100644 --- a/src/main/java/io/ten1010/coaster/groupcontroller/core/ResourceGroupUtil.java +++ b/src/main/java/io/ten1010/coaster/groupcontroller/core/ResourceGroupUtil.java @@ -1,28 +1,28 @@ package io.ten1010.coaster.groupcontroller.core; -import io.ten1010.coaster.groupcontroller.model.V1Beta1K8sObjectReference; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2K8sObjectReference; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; import java.util.ArrayList; import java.util.List; public final class ResourceGroupUtil { - public static List getNodes(V1Beta1ResourceGroup obj) { + public static List getNodes(V1Beta2ResourceGroup obj) { if (obj.getSpec() == null) { return new ArrayList<>(); } return obj.getSpec().getNodes(); } - public static List getNamespaces(V1Beta1ResourceGroup obj) { + public static List getNamespaces(V1Beta2ResourceGroup obj) { if (obj.getSpec() == null) { return new ArrayList<>(); } return obj.getSpec().getNamespaces(); } - public static List getDaemonSets(V1Beta1ResourceGroup obj) { + public static List getDaemonSets(V1Beta2ResourceGroup obj) { if (obj.getSpec() == null || obj.getSpec().getDaemonSet() == null) { return new ArrayList<>(); } diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/model/V1Beta2DaemonSet.java b/src/main/java/io/ten1010/coaster/groupcontroller/model/V1Beta2DaemonSet.java new file mode 100644 index 00000000..db00e575 --- /dev/null +++ b/src/main/java/io/ten1010/coaster/groupcontroller/model/V1Beta2DaemonSet.java @@ -0,0 +1,25 @@ +package io.ten1010.coaster.groupcontroller.model; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import java.util.ArrayList; +import java.util.List; + +@Getter +@Setter +@EqualsAndHashCode +@ToString +public class V1Beta2DaemonSet { + + private List daemonSets; + + private boolean allowAll; + + public V1Beta2DaemonSet() { + this.daemonSets = new ArrayList<>(); + } + +} diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/model/V1Beta2K8sObjectReference.java b/src/main/java/io/ten1010/coaster/groupcontroller/model/V1Beta2K8sObjectReference.java new file mode 100644 index 00000000..29b4ecf7 --- /dev/null +++ b/src/main/java/io/ten1010/coaster/groupcontroller/model/V1Beta2K8sObjectReference.java @@ -0,0 +1,18 @@ +package io.ten1010.coaster.groupcontroller.model; + +import lombok.*; +import org.springframework.lang.Nullable; + +@NoArgsConstructor +@Getter +@Setter +@EqualsAndHashCode +@ToString +public class V1Beta2K8sObjectReference { + + @Nullable + private String namespace; + @Nullable + private String name; + +} diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/model/V1Beta2ResourceGroup.java b/src/main/java/io/ten1010/coaster/groupcontroller/model/V1Beta2ResourceGroup.java new file mode 100644 index 00000000..d49fe335 --- /dev/null +++ b/src/main/java/io/ten1010/coaster/groupcontroller/model/V1Beta2ResourceGroup.java @@ -0,0 +1,36 @@ +package io.ten1010.coaster.groupcontroller.model; + +import io.kubernetes.client.common.KubernetesObject; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import lombok.*; +import org.springframework.lang.Nullable; + +@NoArgsConstructor +@Getter +@Setter +@EqualsAndHashCode +@ToString +public class V1Beta2ResourceGroup implements KubernetesObject { + + public static final String API_VERSION = "resource-group.ten1010.io/v1beta2"; + public static final String KIND = "ResourceGroup"; + + public static V1Beta2ResourceGroup withDefaultApiVersionAndKind() { + V1Beta2ResourceGroup obj = new V1Beta2ResourceGroup(); + obj.setApiVersion(API_VERSION); + obj.setKind(KIND); + return obj; + } + + @Nullable + private String apiVersion; + @Nullable + private String kind; + @Nullable + private V1ObjectMeta metadata; + @Nullable + private V1Beta2ResourceGroupSpec spec; + @Nullable + private V1Beta2ResourceGroupStatus status; + +} diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/model/V1Beta2ResourceGroupList.java b/src/main/java/io/ten1010/coaster/groupcontroller/model/V1Beta2ResourceGroupList.java new file mode 100644 index 00000000..e49d47e4 --- /dev/null +++ b/src/main/java/io/ten1010/coaster/groupcontroller/model/V1Beta2ResourceGroupList.java @@ -0,0 +1,32 @@ +package io.ten1010.coaster.groupcontroller.model; + +import io.kubernetes.client.common.KubernetesListObject; +import io.kubernetes.client.openapi.models.V1ListMeta; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import org.springframework.lang.Nullable; + +import java.util.ArrayList; +import java.util.List; + +@Getter +@Setter +@EqualsAndHashCode +@ToString +public class V1Beta2ResourceGroupList implements KubernetesListObject { + + @Nullable + private String apiVersion; + @Nullable + private String kind; + @Nullable + private V1ListMeta metadata; + private List items; + + public V1Beta2ResourceGroupList() { + this.items = new ArrayList<>(); + } + +} diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/model/V1Beta2ResourceGroupSpec.java b/src/main/java/io/ten1010/coaster/groupcontroller/model/V1Beta2ResourceGroupSpec.java new file mode 100644 index 00000000..dbc2375e --- /dev/null +++ b/src/main/java/io/ten1010/coaster/groupcontroller/model/V1Beta2ResourceGroupSpec.java @@ -0,0 +1,31 @@ +package io.ten1010.coaster.groupcontroller.model; + +import io.kubernetes.client.openapi.models.V1Subject; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import org.springframework.lang.Nullable; + +import java.util.ArrayList; +import java.util.List; + +@Getter +@Setter +@EqualsAndHashCode +@ToString +public class V1Beta2ResourceGroupSpec { + + private List nodes; + private List namespaces; + @Nullable + private V1Beta2DaemonSet daemonSet; + private List subjects; + + public V1Beta2ResourceGroupSpec() { + this.nodes = new ArrayList<>(); + this.namespaces = new ArrayList<>(); + this.subjects = new ArrayList<>(); + } + +} diff --git a/src/main/java/io/ten1010/coaster/groupcontroller/model/V1Beta2ResourceGroupStatus.java b/src/main/java/io/ten1010/coaster/groupcontroller/model/V1Beta2ResourceGroupStatus.java new file mode 100644 index 00000000..b3630eae --- /dev/null +++ b/src/main/java/io/ten1010/coaster/groupcontroller/model/V1Beta2ResourceGroupStatus.java @@ -0,0 +1,11 @@ +package io.ten1010.coaster.groupcontroller.model; + +import lombok.*; + +@NoArgsConstructor +@Getter +@Setter +@EqualsAndHashCode +@ToString +public class V1Beta2ResourceGroupStatus { +} diff --git a/src/main/resources/application-enable-ssl.properties b/src/main/resources/application-enable-ssl.properties index b76c6b30..7a3472f0 100644 --- a/src/main/resources/application-enable-ssl.properties +++ b/src/main/resources/application-enable-ssl.properties @@ -1,4 +1,4 @@ server.ssl.enabled=true -server.ssl.key-store-type=PKCS12 -server.ssl.key-store=### To be filled ### -server.ssl.key-store-password=### To be filled ### +server.ssl.certificate=### To be filled ### +server.ssl.certificate-private-key=### To be filled ### +server.ssl.trust-certificate=### To be filled ### \ No newline at end of file diff --git a/src/test/java/io/ten1010/coaster/groupcontroller/controller/ReconciliationTest.java b/src/test/java/io/ten1010/coaster/groupcontroller/controller/ReconciliationTest.java new file mode 100644 index 00000000..faf4ac88 --- /dev/null +++ b/src/test/java/io/ten1010/coaster/groupcontroller/controller/ReconciliationTest.java @@ -0,0 +1,91 @@ +package io.ten1010.coaster.groupcontroller.controller; + +import io.kubernetes.client.informer.cache.Indexer; +import io.kubernetes.client.openapi.models.*; +import io.ten1010.coaster.groupcontroller.core.IndexNames; +import io.ten1010.coaster.groupcontroller.core.K8sObjectUtil; +import io.ten1010.coaster.groupcontroller.core.KeyUtil; +import io.ten1010.coaster.groupcontroller.core.Taints; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@ExtendWith(MockitoExtension.class) +class ReconciliationTest { + + @InjectMocks + Reconciliation reconciliation; + + @Mock + Indexer groupIndexer; + + @Test + void should_return_tolerations_of_group_containing_daemon_set() { + // given + V1Beta2ResourceGroup group1 = new V1Beta2ResourceGroup(); + V1ObjectMeta meta1 = new V1ObjectMeta(); + meta1.setName("group1"); + group1.setMetadata(meta1); + Mockito.doReturn(List.of(group1)).when(groupIndexer).byIndex( + IndexNames.BY_NAMESPACE_NAME_TO_GROUP_OBJECT, + "ns1" + ); + + V1Beta2ResourceGroup group2 = new V1Beta2ResourceGroup(); + V1ObjectMeta meta2 = new V1ObjectMeta(); + meta2.setName("group2"); + group2.setMetadata(meta2); + Mockito.doReturn(List.of(group2)).when(groupIndexer).byIndex( + IndexNames.BY_DAEMON_SET_KEY_TO_GROUP_OBJECT, + KeyUtil.buildKey("ns1", "ds1") + ); + + V1Beta2ResourceGroup group3 = new V1Beta2ResourceGroup(); + V1ObjectMeta meta3 = new V1ObjectMeta(); + meta3.setName("group3"); + group3.setMetadata(meta3); + Mockito.doReturn(List.of(group3)).when(groupIndexer).byIndex( + IndexNames.BY_GROUP_ALLOW_ALL_DAEMON_SET_TO_GROUP_OBJECT, + "true" + ); + + // when + V1DaemonSet ds1 = new V1DaemonSetBuilder() + .withNewMetadata() + .withNamespace("ns1") + .withName("ds1") + .endMetadata() + .build(); + List result = reconciliation.reconcileUncontrolledDaemonSetTolerations(ds1); + + // then + assertEquals(List.of( + new V1TolerationBuilder() + .withKey(Taints.KEY_RESOURCE_GROUP_EXCLUSIVE) + .withValue(K8sObjectUtil.getName(group1)) + .withOperator("Equal") + .withEffect(Taints.EFFECT_NO_SCHEDULE) + .build(), + new V1TolerationBuilder() + .withKey(Taints.KEY_RESOURCE_GROUP_EXCLUSIVE) + .withValue(K8sObjectUtil.getName(group2)) + .withOperator("Equal") + .withEffect(Taints.EFFECT_NO_SCHEDULE) + .build(), + new V1TolerationBuilder() + .withKey(Taints.KEY_RESOURCE_GROUP_EXCLUSIVE) + .withValue(K8sObjectUtil.getName(group3)) + .withOperator("Equal") + .withEffect(Taints.EFFECT_NO_SCHEDULE) + .build() + ), result); + } +} \ No newline at end of file diff --git a/src/test/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrole/ClusterRoleReconcilerTest.java b/src/test/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrole/ClusterRoleReconcilerTest.java index ad16d26d..29b3a292 100644 --- a/src/test/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrole/ClusterRoleReconcilerTest.java +++ b/src/test/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrole/ClusterRoleReconcilerTest.java @@ -8,8 +8,8 @@ import io.kubernetes.client.openapi.models.V1Namespace; import io.kubernetes.client.openapi.models.V1ObjectMeta; import io.ten1010.coaster.groupcontroller.core.KeyUtil; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroupSpec; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroupSpec; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -18,7 +18,7 @@ class ClusterRoleReconcilerTest { Indexer namespaceIndexer; - Indexer groupIndexer; + Indexer groupIndexer; Indexer clusterRoleIndexer; RbacAuthorizationV1Api rbacAuthorizationV1Api; @@ -32,12 +32,12 @@ void setUp() { @Test void should_create_the_cluster_role() { - V1Beta1ResourceGroup group1 = new V1Beta1ResourceGroup(); + V1Beta2ResourceGroup group1 = new V1Beta2ResourceGroup(); V1ObjectMeta meta1 = new V1ObjectMeta(); meta1.setName("group1"); meta1.setUid("group1-uid"); group1.setMetadata(meta1); - V1Beta1ResourceGroupSpec spec1 = new V1Beta1ResourceGroupSpec(); + V1Beta2ResourceGroupSpec spec1 = new V1Beta2ResourceGroupSpec(); group1.setSpec(spec1); Mockito.doReturn(group1).when(this.groupIndexer).getByKey("group1"); diff --git a/src/test/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrolebinding/ClusterRoleBindingReconcilerTest.java b/src/test/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrolebinding/ClusterRoleBindingReconcilerTest.java index 0fb3cbba..2fe88ee5 100644 --- a/src/test/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrolebinding/ClusterRoleBindingReconcilerTest.java +++ b/src/test/java/io/ten1010/coaster/groupcontroller/controller/cluster/clusterrolebinding/ClusterRoleBindingReconcilerTest.java @@ -6,8 +6,8 @@ import io.kubernetes.client.openapi.apis.RbacAuthorizationV1Api; import io.kubernetes.client.openapi.models.*; import io.ten1010.coaster.groupcontroller.core.KeyUtil; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroupSpec; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroupSpec; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -17,7 +17,7 @@ class ClusterRoleBindingReconcilerTest { - Indexer groupIndexer; + Indexer groupIndexer; Indexer clusterRoleBindingIndexer; Indexer clusterRoleIndexer; RbacAuthorizationV1Api rbacAuthorizationV1Api; @@ -32,12 +32,12 @@ void setUp() { @Test void should_create_the_cluster_role_binding() { - V1Beta1ResourceGroup group1 = new V1Beta1ResourceGroup(); + V1Beta2ResourceGroup group1 = new V1Beta2ResourceGroup(); V1ObjectMeta meta1 = new V1ObjectMeta(); meta1.setName("group1"); meta1.setUid("group1-uid"); group1.setMetadata(meta1); - V1Beta1ResourceGroupSpec spec1 = new V1Beta1ResourceGroupSpec(); + V1Beta2ResourceGroupSpec spec1 = new V1Beta2ResourceGroupSpec(); V1Subject subject = new V1Subject(); subject.setApiGroup("rbac.authorization.k8s.io"); subject.setKind("User"); diff --git a/src/test/java/io/ten1010/coaster/groupcontroller/controller/cluster/node/NodeReconcilerTest.java b/src/test/java/io/ten1010/coaster/groupcontroller/controller/cluster/node/NodeReconcilerTest.java index 587a696c..bb0719b4 100644 --- a/src/test/java/io/ten1010/coaster/groupcontroller/controller/cluster/node/NodeReconcilerTest.java +++ b/src/test/java/io/ten1010/coaster/groupcontroller/controller/cluster/node/NodeReconcilerTest.java @@ -12,8 +12,8 @@ import io.ten1010.coaster.groupcontroller.core.IndexNames; import io.ten1010.coaster.groupcontroller.core.Labels; import io.ten1010.coaster.groupcontroller.core.Taints; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroupSpec; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroupSpec; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -25,7 +25,7 @@ class NodeReconcilerTest { Indexer nodeIndexer; - Indexer groupIndexer; + Indexer groupIndexer; CoreV1Api coreV1Api; EventRecorder eventRecorder; @@ -39,11 +39,11 @@ void setUp() { @Test void should_patch_labels_and_taints_of_the_node() { - V1Beta1ResourceGroup group1 = new V1Beta1ResourceGroup(); + V1Beta2ResourceGroup group1 = new V1Beta2ResourceGroup(); V1ObjectMeta meta1 = new V1ObjectMeta(); meta1.setName("group1"); group1.setMetadata(meta1); - V1Beta1ResourceGroupSpec spec1 = new V1Beta1ResourceGroupSpec(); + V1Beta2ResourceGroupSpec spec1 = new V1Beta2ResourceGroupSpec(); spec1.setNodes(List.of("node1")); group1.setSpec(spec1); @@ -98,13 +98,13 @@ void should_patch_labels_and_taints_of_the_node() { @Test void should_do_nothing_the_given_labels_and_taints_of_node_are_equal_with_resource_groups() { - V1Beta1ResourceGroup group1 = new V1Beta1ResourceGroup(); + V1Beta2ResourceGroup group1 = new V1Beta2ResourceGroup(); V1ObjectMeta meta1 = new V1ObjectMeta(); meta1.setName("group1"); group1.setMetadata(meta1); - V1Beta1ResourceGroupSpec spec1 = new V1Beta1ResourceGroupSpec(); + V1Beta2ResourceGroupSpec spec1 = new V1Beta2ResourceGroupSpec(); spec1.setNodes(List.of("node1")); group1.setSpec(spec1); diff --git a/src/test/java/io/ten1010/coaster/groupcontroller/controller/cluster/role/RoleReconcilerTest.java b/src/test/java/io/ten1010/coaster/groupcontroller/controller/cluster/role/RoleReconcilerTest.java index 8a5e7fba..602a1238 100644 --- a/src/test/java/io/ten1010/coaster/groupcontroller/controller/cluster/role/RoleReconcilerTest.java +++ b/src/test/java/io/ten1010/coaster/groupcontroller/controller/cluster/role/RoleReconcilerTest.java @@ -6,8 +6,8 @@ import io.kubernetes.client.openapi.apis.RbacAuthorizationV1Api; import io.kubernetes.client.openapi.models.*; import io.ten1010.coaster.groupcontroller.core.KeyUtil; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroupSpec; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroupSpec; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -19,7 +19,7 @@ class RoleReconcilerTest { Indexer namespaceIndexer; - Indexer groupIndexer; + Indexer groupIndexer; Indexer roleIndexer; RbacAuthorizationV1Api rbacAuthorizationV1Api; @@ -33,12 +33,12 @@ void setUp() { @Test void should_create_the_role() { - V1Beta1ResourceGroup group1 = new V1Beta1ResourceGroup(); + V1Beta2ResourceGroup group1 = new V1Beta2ResourceGroup(); V1ObjectMeta meta1 = new V1ObjectMeta(); meta1.setName("group1"); meta1.setUid("group1-uid"); group1.setMetadata(meta1); - V1Beta1ResourceGroupSpec spec1 = new V1Beta1ResourceGroupSpec(); + V1Beta2ResourceGroupSpec spec1 = new V1Beta2ResourceGroupSpec(); spec1.setNamespaces(List.of("ns1")); group1.setSpec(spec1); @@ -73,12 +73,12 @@ void should_create_the_role() { @Test void given_role_has_empty_rules_then_should_update_the_role() { - V1Beta1ResourceGroup group1 = new V1Beta1ResourceGroup(); + V1Beta2ResourceGroup group1 = new V1Beta2ResourceGroup(); V1ObjectMeta meta1 = new V1ObjectMeta(); meta1.setName("group1"); meta1.setUid("group1-uid"); group1.setMetadata(meta1); - V1Beta1ResourceGroupSpec spec1 = new V1Beta1ResourceGroupSpec(); + V1Beta2ResourceGroupSpec spec1 = new V1Beta2ResourceGroupSpec(); spec1.setNamespaces(List.of("ns1")); group1.setSpec(spec1); V1Namespace ns1 = new V1Namespace(); @@ -206,12 +206,12 @@ void given_role_has_group_which_not_exists_then_delete_the_role() { @Test void given_role_has_namespace_which_group_does_not_have_then_delete_the_role() { - V1Beta1ResourceGroup group1 = new V1Beta1ResourceGroup(); + V1Beta2ResourceGroup group1 = new V1Beta2ResourceGroup(); V1ObjectMeta meta1 = new V1ObjectMeta(); meta1.setName("group1"); meta1.setUid("group1-uid"); group1.setMetadata(meta1); - V1Beta1ResourceGroupSpec spec1 = new V1Beta1ResourceGroupSpec(); + V1Beta2ResourceGroupSpec spec1 = new V1Beta2ResourceGroupSpec(); spec1.setNamespaces(List.of("ns1")); group1.setSpec(spec1); diff --git a/src/test/java/io/ten1010/coaster/groupcontroller/controller/cluster/rolebinding/RoleBindingReconcilerTest.java b/src/test/java/io/ten1010/coaster/groupcontroller/controller/cluster/rolebinding/RoleBindingReconcilerTest.java index 730d610f..bfe4122e 100644 --- a/src/test/java/io/ten1010/coaster/groupcontroller/controller/cluster/rolebinding/RoleBindingReconcilerTest.java +++ b/src/test/java/io/ten1010/coaster/groupcontroller/controller/cluster/rolebinding/RoleBindingReconcilerTest.java @@ -6,8 +6,8 @@ import io.kubernetes.client.openapi.apis.RbacAuthorizationV1Api; import io.kubernetes.client.openapi.models.*; import io.ten1010.coaster.groupcontroller.core.KeyUtil; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroupSpec; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroupSpec; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -18,7 +18,7 @@ class RoleBindingReconcilerTest { Indexer namespaceIndexer; - Indexer groupIndexer; + Indexer groupIndexer; Indexer roleBindingIndexer; Indexer roleIndexer; RbacAuthorizationV1Api rbacAuthorizationV1Api; @@ -34,12 +34,12 @@ void setUp() { @Test void should_create_the_role_binding() { - V1Beta1ResourceGroup group1 = new V1Beta1ResourceGroup(); + V1Beta2ResourceGroup group1 = new V1Beta2ResourceGroup(); V1ObjectMeta meta1 = new V1ObjectMeta(); meta1.setName("group1"); meta1.setUid("group1-uid"); group1.setMetadata(meta1); - V1Beta1ResourceGroupSpec spec1 = new V1Beta1ResourceGroupSpec(); + V1Beta2ResourceGroupSpec spec1 = new V1Beta2ResourceGroupSpec(); spec1.setNamespaces(List.of("ns1")); V1Subject subject = new V1Subject(); subject.setApiGroup("rbac.authorization.k8s.io"); diff --git a/src/test/java/io/ten1010/coaster/groupcontroller/controller/workload/daemonset/DaemonSetReconcilerTest.java b/src/test/java/io/ten1010/coaster/groupcontroller/controller/workload/daemonset/DaemonSetReconcilerTest.java index ddb50329..ebd97866 100644 --- a/src/test/java/io/ten1010/coaster/groupcontroller/controller/workload/daemonset/DaemonSetReconcilerTest.java +++ b/src/test/java/io/ten1010/coaster/groupcontroller/controller/workload/daemonset/DaemonSetReconcilerTest.java @@ -9,10 +9,10 @@ import io.ten1010.coaster.groupcontroller.core.IndexNames; import io.ten1010.coaster.groupcontroller.core.KeyUtil; import io.ten1010.coaster.groupcontroller.core.Taints; -import io.ten1010.coaster.groupcontroller.model.V1Beta1K8sObjectReference; -import io.ten1010.coaster.groupcontroller.model.V1Beta1DaemonSet; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroupSpec; +import io.ten1010.coaster.groupcontroller.model.V1Beta2K8sObjectReference; +import io.ten1010.coaster.groupcontroller.model.V1Beta2DaemonSet; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroupSpec; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -26,7 +26,7 @@ class DaemonSetReconcilerTest { - Indexer groupIndexer; + Indexer groupIndexer; Reconciliation reconciliation; Indexer daemonSetIndexer; AppsV1Api appsV1Api; @@ -41,29 +41,29 @@ void setUp() { @Test void should_patch_tolerations_of_the_daemon_set() { - V1Beta1ResourceGroup group1 = new V1Beta1ResourceGroup(); + V1Beta2ResourceGroup group1 = new V1Beta2ResourceGroup(); V1ObjectMeta meta1 = new V1ObjectMeta(); meta1.setName("group1"); group1.setMetadata(meta1); - V1Beta1ResourceGroupSpec spec1 = new V1Beta1ResourceGroupSpec(); + V1Beta2ResourceGroupSpec spec1 = new V1Beta2ResourceGroupSpec(); group1.setSpec(spec1); - V1Beta1K8sObjectReference dsRef1 = new V1Beta1K8sObjectReference(); + V1Beta2K8sObjectReference dsRef1 = new V1Beta2K8sObjectReference(); dsRef1.setNamespace("ns1"); dsRef1.setName("ds1"); - V1Beta1DaemonSet daemonSet1 = new V1Beta1DaemonSet(); + V1Beta2DaemonSet daemonSet1 = new V1Beta2DaemonSet(); daemonSet1.setDaemonSets(List.of(dsRef1)); spec1.setDaemonSet(daemonSet1); - V1Beta1ResourceGroup group2 = new V1Beta1ResourceGroup(); + V1Beta2ResourceGroup group2 = new V1Beta2ResourceGroup(); V1ObjectMeta meta2 = new V1ObjectMeta(); meta2.setName("group2"); group2.setMetadata(meta2); - V1Beta1ResourceGroupSpec spec2 = new V1Beta1ResourceGroupSpec(); + V1Beta2ResourceGroupSpec spec2 = new V1Beta2ResourceGroupSpec(); group2.setSpec(spec2); - V1Beta1K8sObjectReference dsRef2 = new V1Beta1K8sObjectReference(); + V1Beta2K8sObjectReference dsRef2 = new V1Beta2K8sObjectReference(); dsRef2.setNamespace("ns1"); dsRef2.setName("ds1"); - V1Beta1DaemonSet daemonSet2 = new V1Beta1DaemonSet(); + V1Beta2DaemonSet daemonSet2 = new V1Beta2DaemonSet(); daemonSet2.setDaemonSets(List.of(dsRef2)); spec2.setDaemonSet(daemonSet2); diff --git a/src/test/java/io/ten1010/coaster/groupcontroller/controller/workload/pod/PodReconcilerTest.java b/src/test/java/io/ten1010/coaster/groupcontroller/controller/workload/pod/PodReconcilerTest.java index ad652895..6bdc73e9 100644 --- a/src/test/java/io/ten1010/coaster/groupcontroller/controller/workload/pod/PodReconcilerTest.java +++ b/src/test/java/io/ten1010/coaster/groupcontroller/controller/workload/pod/PodReconcilerTest.java @@ -10,8 +10,8 @@ import io.ten1010.coaster.groupcontroller.core.KeyUtil; import io.ten1010.coaster.groupcontroller.core.Labels; import io.ten1010.coaster.groupcontroller.core.Taints; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroupSpec; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroupSpec; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -22,7 +22,7 @@ class PodReconcilerTest { - Indexer groupIndexer; + Indexer groupIndexer; Reconciliation reconciliation; Indexer podIndexer; CoreV1Api coreV1Api; @@ -37,11 +37,11 @@ void setUp() { @Test void given_pod_that_has_invalid_tolerations_when_reconcile_the_pod_then_should_delete_the_pod() { - V1Beta1ResourceGroup group1 = new V1Beta1ResourceGroup(); + V1Beta2ResourceGroup group1 = new V1Beta2ResourceGroup(); V1ObjectMeta meta1 = new V1ObjectMeta(); meta1.setName("group1"); group1.setMetadata(meta1); - V1Beta1ResourceGroupSpec spec1 = new V1Beta1ResourceGroupSpec(); + V1Beta2ResourceGroupSpec spec1 = new V1Beta2ResourceGroupSpec(); spec1.setNamespaces(List.of("ns1")); group1.setSpec(spec1); @@ -91,12 +91,12 @@ void given_pod_that_has_invalid_tolerations_when_reconcile_the_pod_then_should_d @Test void given_pod_has_proper_tolerations_when_reconcile_the_pod_then_should_do_nothing() { - V1Beta1ResourceGroup group1 = new V1Beta1ResourceGroup(); + V1Beta2ResourceGroup group1 = new V1Beta2ResourceGroup(); V1ObjectMeta meta1 = new V1ObjectMeta(); meta1.setName("group1"); group1.setMetadata(meta1); - V1Beta1ResourceGroupSpec spec1 = new V1Beta1ResourceGroupSpec(); + V1Beta2ResourceGroupSpec spec1 = new V1Beta2ResourceGroupSpec(); spec1.setNamespaces(List.of("ns1")); group1.setSpec(spec1); @@ -141,11 +141,11 @@ void given_pod_has_proper_tolerations_when_reconcile_the_pod_then_should_do_noth @Test void given_pod_has_tolerations_for_not_existing_group_then_should_delete_pod() { - V1Beta1ResourceGroup group1 = new V1Beta1ResourceGroup(); + V1Beta2ResourceGroup group1 = new V1Beta2ResourceGroup(); V1ObjectMeta meta1 = new V1ObjectMeta(); meta1.setName("group1"); group1.setMetadata(meta1); - V1Beta1ResourceGroupSpec spec1 = new V1Beta1ResourceGroupSpec(); + V1Beta2ResourceGroupSpec spec1 = new V1Beta2ResourceGroupSpec(); spec1.setNamespaces(List.of("ns1")); group1.setSpec(spec1); V1Pod pod1 = new V1Pod(); @@ -198,11 +198,11 @@ void given_pod_has_tolerations_for_not_existing_group_then_should_delete_pod() { @Test void given_pod_does_not_have_affinity_for_group_then_should_delete_pod() { - V1Beta1ResourceGroup group1 = new V1Beta1ResourceGroup(); + V1Beta2ResourceGroup group1 = new V1Beta2ResourceGroup(); V1ObjectMeta meta1 = new V1ObjectMeta(); meta1.setName("group1"); group1.setMetadata(meta1); - V1Beta1ResourceGroupSpec spec1 = new V1Beta1ResourceGroupSpec(); + V1Beta2ResourceGroupSpec spec1 = new V1Beta2ResourceGroupSpec(); spec1.setNamespaces(List.of("ns1")); group1.setSpec(spec1); V1Pod pod1 = new V1Pod(); @@ -244,11 +244,11 @@ void given_pod_does_not_have_affinity_for_group_then_should_delete_pod() { @Test void given_pod_has_proper_node_affinity_then_do_nothing() { - V1Beta1ResourceGroup group1 = new V1Beta1ResourceGroup(); + V1Beta2ResourceGroup group1 = new V1Beta2ResourceGroup(); V1ObjectMeta meta1 = new V1ObjectMeta(); meta1.setName("group1"); group1.setMetadata(meta1); - V1Beta1ResourceGroupSpec spec1 = new V1Beta1ResourceGroupSpec(); + V1Beta2ResourceGroupSpec spec1 = new V1Beta2ResourceGroupSpec(); spec1.setNamespaces(List.of("ns1")); group1.setSpec(spec1); diff --git a/src/test/java/io/ten1010/coaster/groupcontroller/conversion/ConversionControllerTest.java b/src/test/java/io/ten1010/coaster/groupcontroller/conversion/ConversionControllerTest.java new file mode 100644 index 00000000..83af4c6d --- /dev/null +++ b/src/test/java/io/ten1010/coaster/groupcontroller/conversion/ConversionControllerTest.java @@ -0,0 +1,32 @@ +package io.ten1010.coaster.groupcontroller.conversion; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.context.annotation.Import; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; + +@WebMvcTest(ConversionController.class) +@Import(ConversionService.class) +class ConversionControllerTest { + + @Autowired + MockMvc mockMvc; + + + @Test + void convert() throws Exception { + String body = "{\"kind\":\"ConversionReview\",\"apiVersion\":\"apiextensions.k8s.io/v1\",\"request\":{\"uid\":\"cea0080e-0ef8-48a8-8623-f0f93abdd333\",\"desiredAPIVersion\":\"resource-group.ten1010.io/v1beta1\",\"objects\":[{\"apiVersion\":\"resource-group.ten1010.io/v1beta2\",\"kind\":\"ResourceGroup\",\"metadata\":{\"annotations\":{\"kubectl.kubernetes.io/last-applied-configuration\":\"{\\\"apiVersion\\\":\\\"resource-group.ten1010.io/v1beta2\\\",\\\"kind\\\":\\\"ResourceGroup\\\",\\\"metadata\\\":{\\\"annotations\\\":{},\\\"name\\\":\\\"group1\\\"},\\\"spec\\\":{\\\"daemonSet\\\":{\\\"allowAll\\\":true,\\\"daemonSets\\\":[]},\\\"namespaces\\\":[\\\"ns1\\\"],\\\"nodes\\\":[\\\"minikube-m02\\\"],\\\"subjects\\\":[]}}\\n\"},\"creationTimestamp\":\"2023-09-12T08:11:36Z\",\"generation\":1,\"managedFields\":[{\"apiVersion\":\"resource-group.ten1010.io/v1beta2\",\"fieldsType\":\"FieldsV1\",\"fieldsV1\":{\"f:metadata\":{\"f:annotations\":{\".\":{},\"f:kubectl.kubernetes.io/last-applied-configuration\":{}}},\"f:spec\":{\".\":{},\"f:daemonSet\":{\".\":{},\"f:allowAll\":{},\"f:daemonSets\":{}},\"f:namespaces\":{},\"f:nodes\":{},\"f:subjects\":{}}},\"manager\":\"kubectl-client-side-apply\",\"operation\":\"Update\",\"time\":\"2023-09-12T08:11:36Z\"}],\"name\":\"group1\",\"uid\":\"c39db20a-2863-4007-935c-7eb22c9c9b5b\"},\"spec\":{\"daemonSet\":{\"allowAll\":true,\"daemonSets\":[]},\"namespaces\":[\"ns1\"],\"nodes\":[\"minikube-m02\"],\"subjects\":[]}}]},\"response\":{\"uid\":\"\",\"convertedObjects\":null,\"result\":{\"metadata\":{}}}}\n"; + + mockMvc.perform(post("/crdconvert") + .accept(MediaType.APPLICATION_JSON) + .contentType(MediaType.APPLICATION_JSON) + .content(body)) + .andDo(print()); + + } +} \ No newline at end of file diff --git a/src/test/java/io/ten1010/coaster/groupcontroller/mutating/AdmissionReviewServiceTest.java b/src/test/java/io/ten1010/coaster/groupcontroller/mutating/AdmissionReviewServiceTest.java index af7e9e96..28946cb4 100644 --- a/src/test/java/io/ten1010/coaster/groupcontroller/mutating/AdmissionReviewServiceTest.java +++ b/src/test/java/io/ten1010/coaster/groupcontroller/mutating/AdmissionReviewServiceTest.java @@ -11,8 +11,8 @@ import io.kubernetes.client.openapi.models.V1PodSpec; import io.ten1010.coaster.groupcontroller.controller.Reconciliation; import io.ten1010.coaster.groupcontroller.core.IndexNames; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroup; -import io.ten1010.coaster.groupcontroller.model.V1Beta1ResourceGroupSpec; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroup; +import io.ten1010.coaster.groupcontroller.model.V1Beta2ResourceGroupSpec; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -25,7 +25,7 @@ class AdmissionReviewServiceTest { - Indexer groupIndexer; + Indexer groupIndexer; Reconciliation reconciliation; @BeforeEach @@ -36,11 +36,11 @@ void setUp() { @Test void should_patch_affinity_and_tolerations() { - V1Beta1ResourceGroup group1 = new V1Beta1ResourceGroup(); + V1Beta2ResourceGroup group1 = new V1Beta2ResourceGroup(); V1ObjectMeta meta1 = new V1ObjectMeta(); meta1.setName("group1"); group1.setMetadata(meta1); - V1Beta1ResourceGroupSpec spec1 = new V1Beta1ResourceGroupSpec(); + V1Beta2ResourceGroupSpec spec1 = new V1Beta2ResourceGroupSpec(); spec1.setNamespaces(List.of("ns1")); group1.setSpec(spec1);