Skip to content

Commit

Permalink
Merge pull request #2513 from fgiloux/partitionset-reconciliation
Browse files Browse the repository at this point in the history
✨ Partitionset reconciliation
  • Loading branch information
openshift-merge-robot authored Feb 8, 2023
2 parents 1235ac4 + d63ce02 commit 87f44d4
Show file tree
Hide file tree
Showing 15 changed files with 1,465 additions and 17 deletions.
91 changes: 87 additions & 4 deletions config/crds/topology.kcp.io_partitionsets.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
Expand Down Expand Up @@ -51,9 +50,9 @@ spec:
items:
type: string
type: array
selector:
description: selector (optional) is a label selector that filters
shard targets.
shardSelector:
description: shardSelector (optional) specifies filtering for shard
targets.
properties:
matchExpressions:
description: matchExpressions is a list of label selector requirements.
Expand All @@ -66,11 +65,26 @@ spec:
key:
description: key is the label key that the selector applies
to.
maxLength: 317
type: string
x-kubernetes-validations:
- message: Label key prefixes are optional and limited to
253 characters. They should match "^[a-z0-9]([-a-z0-9]{0,251}[a-z0-9])?$".
Names are limited to 63 characters and should match
"^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$". "/"
is used as separator.
rule: 'self.contains("/") ? self.split("/", 2)[0].matches("^[a-z0-9]([-a-z0-9]{0,251}[a-z0-9])?$")
&& self.split("/", 2)[1].matches("^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$")
: self.matches("^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$")'
operator:
description: operator represents a key's relationship to
a set of values. Valid operators are In, NotIn, Exists
and DoesNotExist.
enum:
- In
- NotIn
- Exists
- DoesNotExist
type: string
values:
description: values is an array of string values. If the
Expand All @@ -79,28 +93,97 @@ spec:
array must be empty. This array is replaced during a strategic
merge patch.
items:
maxLength: 63
pattern: ^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$
type: string
type: array
required:
- key
- operator
type: object
x-kubernetes-validations:
- message: There should be at least one value for In and NotIn
operators. There should not be any value for Exists and
DoesNotExist operators.
rule: 'self.operator in ["In", "NotIn"] ? size(self.values)
> 0 : (self.operator in ["Exists", "DoesNotExist"] ? !has(self.values)
: true)'
maxItems: 10
type: array
matchLabels:
additionalProperties:
maxLength: 380
type: string
description: matchLabels is a map of {key,value} pairs. A single
{key,value} in the matchLabels map is equivalent to an element
of matchExpressions, whose key field is "key", the operator
is "In", and the values array contains only "value". The requirements
are ANDed.
maxProperties: 10
type: object
x-kubernetes-validations:
- message: Label key prefixes are optional and limited to 253
characters. They should match "^[a-z0-9]([-a-z0-9]{0,251}[a-z0-9])?$".
Names are limited to 63 characters and should match "^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$".
"/" is used as separator.
rule: 'self.all(k, k.contains("/") ? k.split("/", 2)[0].matches("^[a-z0-9]([-a-z0-9]{0,251}[a-z0-9])?$")
&& k.split("/", 2)[1].matches("^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$")
: k.matches("^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$"))'
- message: Label values are limited to 63 characters and should
match "^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$".
rule: self.all(k, self[k].matches("^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$"))
type: object
x-kubernetes-map-type: atomic
type: object
status:
description: status holds information about the current status
properties:
conditions:
description: conditions is a list of conditions that apply to the
APIExportEndpointSlice.
items:
description: Condition defines an observation of a object operational
state.
properties:
lastTransitionTime:
description: Last time the condition transitioned from one status
to another. This should be when the underlying condition changed.
If that is not known, then using the time when the API field
changed is acceptable.
format: date-time
type: string
message:
description: A human readable message indicating details about
the transition. This field may be empty.
type: string
reason:
description: The reason for the condition's last transition
in CamelCase. The specific API may choose whether or not this
field is considered a guaranteed API. This field may not be
empty.
type: string
severity:
description: Severity provides an explicit classification of
Reason code, so the users or machines can immediately understand
the current situation and act accordingly. The Severity field
MUST be set only when Status=False.
type: string
status:
description: Status of the condition, one of True, False, Unknown.
type: string
type:
description: Type of condition in CamelCase or in foo.example.com/CamelCase.
Many .condition.type values are consistent across resources
like Available, but because arbitrary conditions can be useful
(see .node.status.conditions), the ability to deconflict is
important.
type: string
required:
- lastTransitionTime
- status
- type
type: object
type: array
count:
description: count is the total number of partitions.
type: integer
Expand Down
58 changes: 58 additions & 0 deletions config/crds/topology.kcp.io_partitionsets.yaml-patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
---
- op: add
path: /spec/versions/name=v1alpha1/schema/openAPIV3Schema/properties/spec/properties/shardSelector/properties/matchExpressions/items/x-kubernetes-validations
value:
- message: There should be at least one value for In and NotIn operators. There should not be any value for Exists and DoesNotExist operators.
rule: 'self.operator in ["In", "NotIn"] ? size(self.values) > 0 : (self.operator in ["Exists", "DoesNotExist"] ? !has(self.values) : true)'
- op: add
path: /spec/versions/name=v1alpha1/schema/openAPIV3Schema/properties/spec/properties/shardSelector/properties/matchExpressions/maxItems
value:
# limiting the number of items for reducing the estimated cost of CEL validation
10
- op: add
path: /spec/versions/name=v1alpha1/schema/openAPIV3Schema/properties/spec/properties/shardSelector/properties/matchExpressions/items/properties/operator/enum
value:
- In
- NotIn
- Exists
- DoesNotExist
- op: add
path: /spec/versions/name=v1alpha1/schema/openAPIV3Schema/properties/spec/properties/shardSelector/properties/matchExpressions/items/properties/key/maxLength
value:
# prefix: 253, separator: 1, name: 63
317
- op: add
path: /spec/versions/name=v1alpha1/schema/openAPIV3Schema/properties/spec/properties/shardSelector/properties/matchExpressions/items/properties/key/x-kubernetes-validations
value:
- message: Label key prefixes are optional and limited to 253 characters. They should match "^[a-z0-9]([-a-z0-9]{0,251}[a-z0-9])?$". Names are limited to 63 characters and should match "^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$". "/" is used as separator.
rule: 'self.contains("/") ? self.split("/", 2)[0].matches("^[a-z0-9]([-a-z0-9]{0,251}[a-z0-9])?$") && self.split("/", 2)[1].matches("^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$") : self.matches("^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$")'
- op: add
path: /spec/versions/name=v1alpha1/schema/openAPIV3Schema/properties/spec/properties/shardSelector/properties/matchExpressions/items/properties/values/items/maxLength
value:
63
- op: add
path: /spec/versions/name=v1alpha1/schema/openAPIV3Schema/properties/spec/properties/shardSelector/properties/matchExpressions/items/properties/values/items/pattern
value:
^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$
- op: add
path: /spec/versions/name=v1alpha1/schema/openAPIV3Schema/properties/spec/properties/shardSelector/properties/matchLabels/additionalProperties/maxLength
value:
63
- op: add
path: /spec/versions/name=v1alpha1/schema/openAPIV3Schema/properties/spec/properties/shardSelector/properties/matchLabels/maxProperties
value:
# limiting the number of properties for reducing the estimated cost of CEL validation
10
- op: add
path: /spec/versions/name=v1alpha1/schema/openAPIV3Schema/properties/spec/properties/shardSelector/properties/matchLabels/additionalProperties/maxLength
value:
# prefix: 253, separator: 1, name: 63, value: 63
380
- op: add
path: /spec/versions/name=v1alpha1/schema/openAPIV3Schema/properties/spec/properties/shardSelector/properties/matchLabels/x-kubernetes-validations
value:
- message: Label key prefixes are optional and limited to 253 characters. They should match "^[a-z0-9]([-a-z0-9]{0,251}[a-z0-9])?$". Names are limited to 63 characters and should match "^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$". "/" is used as separator.
rule: 'self.all(k, k.contains("/") ? k.split("/", 2)[0].matches("^[a-z0-9]([-a-z0-9]{0,251}[a-z0-9])?$") && k.split("/", 2)[1].matches("^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$") : k.matches("^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$"))'
- message: Label values are limited to 63 characters and should match "^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$".
rule: 'self.all(k, self[k].matches("^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$"))'

2 changes: 1 addition & 1 deletion config/root-phase0/apiexport-topology.kcp.io.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@ metadata:
spec:
latestResourceSchemas:
- v221115-9b370eb8.partitions.topology.kcp.io
- v221118-9364e75c.partitionsets.topology.kcp.io
- v230202-eee1a845.partitionsets.topology.kcp.io
status: {}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ apiVersion: apis.kcp.io/v1alpha1
kind: APIResourceSchema
metadata:
creationTimestamp: null
name: v221118-9364e75c.partitionsets.topology.kcp.io
name: v230202-eee1a845.partitionsets.topology.kcp.io
spec:
group: topology.kcp.io
names:
Expand Down Expand Up @@ -47,8 +47,8 @@ spec:
items:
type: string
type: array
selector:
description: selector (optional) is a label selector that filters shard
shardSelector:
description: shardSelector (optional) specifies filtering for shard
targets.
properties:
matchExpressions:
Expand All @@ -61,11 +61,25 @@ spec:
key:
description: key is the label key that the selector applies
to.
maxLength: 317
type: string
x-kubernetes-validations:
- message: Label key prefixes are optional and limited to
253 characters. They should match "^[a-z0-9]([-a-z0-9]{0,251}[a-z0-9])?$".
Names are limited to 63 characters and should match "^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$".
"/" is used as separator.
rule: 'self.contains("/") ? self.split("/", 2)[0].matches("^[a-z0-9]([-a-z0-9]{0,251}[a-z0-9])?$")
&& self.split("/", 2)[1].matches("^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$")
: self.matches("^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$")'
operator:
description: operator represents a key's relationship to a
set of values. Valid operators are In, NotIn, Exists and
DoesNotExist.
enum:
- In
- NotIn
- Exists
- DoesNotExist
type: string
values:
description: values is an array of string values. If the operator
Expand All @@ -74,28 +88,95 @@ spec:
be empty. This array is replaced during a strategic merge
patch.
items:
maxLength: 63
pattern: ^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$
type: string
type: array
required:
- key
- operator
type: object
x-kubernetes-validations:
- message: There should be at least one value for In and NotIn
operators. There should not be any value for Exists and DoesNotExist
operators.
rule: 'self.operator in ["In", "NotIn"] ? size(self.values)
> 0 : (self.operator in ["Exists", "DoesNotExist"] ? !has(self.values)
: true)'
maxItems: 10
type: array
matchLabels:
additionalProperties:
maxLength: 380
type: string
description: matchLabels is a map of {key,value} pairs. A single
{key,value} in the matchLabels map is equivalent to an element
of matchExpressions, whose key field is "key", the operator is
"In", and the values array contains only "value". The requirements
are ANDed.
maxProperties: 10
type: object
x-kubernetes-validations:
- message: Label key prefixes are optional and limited to 253 characters.
They should match "^[a-z0-9]([-a-z0-9]{0,251}[a-z0-9])?$". Names
are limited to 63 characters and should match "^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$".
"/" is used as separator.
rule: 'self.all(k, k.contains("/") ? k.split("/", 2)[0].matches("^[a-z0-9]([-a-z0-9]{0,251}[a-z0-9])?$")
&& k.split("/", 2)[1].matches("^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$")
: k.matches("^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$"))'
- message: Label values are limited to 63 characters and should
match "^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$".
rule: self.all(k, self[k].matches("^[A-Za-z0-9]([-A-Za-z0-9_.]{0,61}[A-Za-z0-9])?$"))
type: object
x-kubernetes-map-type: atomic
type: object
status:
description: status holds information about the current status
properties:
conditions:
description: conditions is a list of conditions that apply to the APIExportEndpointSlice.
items:
description: Condition defines an observation of a object operational
state.
properties:
lastTransitionTime:
description: Last time the condition transitioned from one status
to another. This should be when the underlying condition changed.
If that is not known, then using the time when the API field
changed is acceptable.
format: date-time
type: string
message:
description: A human readable message indicating details about
the transition. This field may be empty.
type: string
reason:
description: The reason for the condition's last transition in
CamelCase. The specific API may choose whether or not this field
is considered a guaranteed API. This field may not be empty.
type: string
severity:
description: Severity provides an explicit classification of Reason
code, so the users or machines can immediately understand the
current situation and act accordingly. The Severity field MUST
be set only when Status=False.
type: string
status:
description: Status of the condition, one of True, False, Unknown.
type: string
type:
description: Type of condition in CamelCase or in foo.example.com/CamelCase.
Many .condition.type values are consistent across resources
like Available, but because arbitrary conditions can be useful
(see .node.status.conditions), the ability to deconflict is
important.
type: string
required:
- lastTransitionTime
- status
- type
type: object
type: array
count:
description: count is the total number of partitions.
type: integer
Expand Down
Loading

0 comments on commit 87f44d4

Please sign in to comment.